feat(investigation): preserve cumulative reference graphs

Accumulate investigation paths and preserve failed attempts across rounds. Keep graph annotations separate from execution state, synchronize the API contract, and consolidate documentation.
This commit is contained in:
2026-11-11 19:10:41 +08:00
parent e47c61c121
commit b853b61a0b
38 changed files with 2445 additions and 147 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
"contracts": {
"server": {
"file": "server-v1.openapi.json",
"sha256": "426b8d9170f253aa7132e9376031a7da8c04ac6f6e693948890d6f343420af1b"
"sha256": "7ed3f6485909c3ef7fac8d2083d6931765e4d197e690c3b9914b905a8aa743b2"
}
}
}
+230 -9
View File
@@ -530,7 +530,7 @@
"progress": {
"anyOf": [
{
"$ref": "#/components/schemas/InvestigationProgress"
"$ref": "#/components/schemas/InvestigationProgressInput"
},
{
"type": "null"
@@ -3540,6 +3540,21 @@
"InvestigationDiagram": {
"additionalProperties": false,
"properties": {
"edges": {
"anyOf": [
{
"items": {
"$ref": "#/components/schemas/InvestigationGraphEdge"
},
"maxItems": 200,
"type": "array"
},
{
"type": "null"
}
],
"title": "Edges"
},
"mermaid": {
"maxLength": 20000,
"minLength": 1,
@@ -3554,6 +3569,19 @@
"title": "Node Refs",
"type": "array"
},
"source_mermaid": {
"anyOf": [
{
"maxLength": 20000,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Source Mermaid"
},
"title": {
"minLength": 1,
"title": "Title",
@@ -3578,6 +3606,19 @@
"title": "Action Refs",
"type": "array"
},
"detail": {
"anyOf": [
{
"maxLength": 2000,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Detail"
},
"evidence_refs": {
"items": {
"minLength": 1,
@@ -3608,14 +3649,11 @@
"anyOf": [
{
"enum": [
"pending",
"running",
"completed",
"waiting",
"waiting_human",
"reference",
"recorded",
"needs_input",
"failed",
"skipped",
"cancelled"
"not_taken"
],
"type": "string"
},
@@ -3623,7 +3661,7 @@
"type": "null"
}
],
"description": "Evidence-confirmed node state; waiting means prerequisites/external/system result, waiting_human requires manual authorization/approval/feedback. Unknown stays omitted/null; host controls colors.",
"description": "A saved process-reference annotation, not live execution state. recorded means a finding exists, not that a task or field action completed.",
"title": "Status"
}
},
@@ -3634,6 +3672,153 @@
"title": "InvestigationDiagramNodeRef",
"type": "object"
},
"InvestigationGraphEdge": {
"additionalProperties": false,
"properties": {
"label": {
"anyOf": [
{
"maxLength": 200,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Label"
},
"source": {
"pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,79}$",
"title": "Source",
"type": "string"
},
"target": {
"pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,79}$",
"title": "Target",
"type": "string"
}
},
"required": [
"source",
"target"
],
"title": "InvestigationGraphEdge",
"type": "object"
},
"InvestigationGraphNodeUpdate": {
"additionalProperties": false,
"properties": {
"action_refs": {
"items": {
"format": "uuid",
"type": "string"
},
"title": "Action Refs",
"type": "array"
},
"detail": {
"anyOf": [
{
"maxLength": 2000,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Detail"
},
"evidence_refs": {
"items": {
"minLength": 1,
"type": "string"
},
"title": "Evidence Refs",
"type": "array"
},
"label": {
"minLength": 1,
"title": "Label",
"type": "string"
},
"map_targets": {
"items": {
"$ref": "#/components/schemas/InvestigationMapTarget"
},
"maxItems": 100,
"title": "Map Targets",
"type": "array"
},
"node_id": {
"pattern": "^[A-Za-z_][A-Za-z0-9_-]{0,79}$",
"title": "Node Id",
"type": "string"
},
"status": {
"anyOf": [
{
"enum": [
"reference",
"recorded",
"needs_input",
"failed",
"not_taken"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional reference annotation: reference, recorded finding, needs_input, failed attempt, or not_taken. No live node/task binding or per-step synchronization is required.",
"title": "Status"
}
},
"required": [
"node_id",
"label"
],
"title": "InvestigationGraphNodeUpdate",
"type": "object"
},
"InvestigationGraphUpdate": {
"additionalProperties": false,
"properties": {
"edges": {
"items": {
"$ref": "#/components/schemas/InvestigationGraphEdge"
},
"maxItems": 200,
"title": "Edges",
"type": "array"
},
"nodes": {
"items": {
"$ref": "#/components/schemas/InvestigationGraphNodeUpdate"
},
"maxItems": 100,
"title": "Nodes",
"type": "array"
},
"title": {
"anyOf": [
{
"maxLength": 200,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Title"
}
},
"title": "InvestigationGraphUpdate",
"type": "object"
},
"InvestigationMapTarget": {
"additionalProperties": false,
"properties": {
@@ -3691,6 +3876,42 @@
"title": "InvestigationProgress",
"type": "object"
},
"InvestigationProgressInput": {
"additionalProperties": false,
"properties": {
"diagram": {
"anyOf": [
{
"$ref": "#/components/schemas/InvestigationDiagram"
},
{
"type": "null"
}
]
},
"graph_update": {
"anyOf": [
{
"$ref": "#/components/schemas/InvestigationGraphUpdate"
},
{
"type": "null"
}
]
},
"summary": {
"maxLength": 20000,
"minLength": 1,
"title": "Summary",
"type": "string"
}
},
"required": [
"summary"
],
"title": "InvestigationProgressInput",
"type": "object"
},
"InvestigationProgressSnapshot": {
"additionalProperties": false,
"properties": {