feat(investigations): refine report authoring and replay flushing
Generic Container CI/CD / test-build-publish (push) Successful in 4m31s
Server CI/CD v2 / build-test-publish-and-deploy (push) Successful in 4m31s

This commit is contained in:
2026-11-14 23:00:15 +08:00
parent 2e4f6cb93b
commit b45c5c6f46
27 changed files with 1125 additions and 94 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
"contracts": {
"server": {
"file": "server-v1.openapi.json",
"sha256": "aeff2c644006bf7eddd6cfe1c8aa0bad7f38c4632a456b5d3be1bb8201efc0db"
"sha256": "c31e9b4c71216951d1525acf1bcb8aeba4158b6cdc6b0b9dc01be02f9b6e6af3"
}
}
}
+253 -2
View File
@@ -3537,6 +3537,81 @@
"title": "InvestigationDataGap",
"type": "object"
},
"InvestigationDataGapInput": {
"additionalProperties": false,
"description": "New gap descriptions use business prose; references remain opaque.",
"properties": {
"blocking": {
"title": "Blocking",
"type": "boolean"
},
"evidence_refs": {
"items": {
"minLength": 1,
"type": "string"
},
"minItems": 1,
"title": "Evidence Refs",
"type": "array"
},
"gap_id": {
"minLength": 1,
"title": "Gap Id",
"type": "string"
},
"impact": {
"description": "资料缺项对当前判断的实际影响",
"maxLength": 4000,
"minLength": 1,
"title": "Impact",
"type": "string"
},
"missing_data": {
"description": "缺失的业务资料,不写执行字段",
"maxLength": 4000,
"minLength": 1,
"title": "Missing Data",
"type": "string"
},
"node_id": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Node Id"
},
"required_data": {
"description": "需要补充的具体业务资料",
"maxLength": 4000,
"minLength": 1,
"title": "Required Data",
"type": "string"
},
"scope": {
"description": "缺口涉及的对象、地点与当地时间范围",
"maxLength": 4000,
"minLength": 1,
"title": "Scope",
"type": "string"
}
},
"required": [
"gap_id",
"missing_data",
"scope",
"impact",
"required_data",
"evidence_refs",
"blocking"
],
"title": "InvestigationDataGapInput",
"type": "object"
},
"InvestigationDiagram": {
"additionalProperties": false,
"properties": {
@@ -3907,7 +3982,8 @@
]
},
"summary": {
"maxLength": 20000,
"description": "用简短中文说明本轮新增发现、当前依赖和下一步;不复制报告、执行字段、版本号或证据编号",
"maxLength": 300,
"minLength": 1,
"title": "Summary",
"type": "string"
@@ -4110,18 +4186,22 @@
"description": "Write model: every new report explicitly declares its business result.",
"properties": {
"conclusion_boundary": {
"description": "只写影响判断的证据范围、不确定性和适用限制,不复述结论、执行步骤或参数",
"maxLength": 240,
"minLength": 1,
"title": "Conclusion Boundary",
"type": "string"
},
"current_conclusion": {
"description": "先写当前业务判断,再写关键依据与下一步,建议 150 字以内;完整数值和对象比较使用 ui_blocks.Table",
"maxLength": 300,
"minLength": 1,
"title": "Current Conclusion",
"type": "string"
},
"data_gaps": {
"items": {
"$ref": "#/components/schemas/InvestigationDataGap"
"$ref": "#/components/schemas/InvestigationDataGapInput"
},
"title": "Data Gaps",
"type": "array"
@@ -4154,6 +4234,7 @@
},
"pending_items": {
"items": {
"maxLength": 160,
"minLength": 1,
"type": "string"
},
@@ -4162,6 +4243,7 @@
},
"recommendations": {
"items": {
"maxLength": 160,
"minLength": 1,
"type": "string"
},
@@ -4196,6 +4278,7 @@
"stop_reason": {
"anyOf": [
{
"maxLength": 160,
"minLength": 1,
"type": "string"
},
@@ -4206,6 +4289,8 @@
"title": "Stop Reason"
},
"title": {
"description": "简短中文业务标题,写明对象和当前结果,不含执行轮次、流程版本或原始时间戳",
"maxLength": 80,
"minLength": 1,
"title": "Title",
"type": "string"
@@ -10159,6 +10244,30 @@
],
"title": "Command"
},
"narration": {
"anyOf": [
{
"$ref": "#/components/schemas/TaskPresentationNarrationInput"
},
{
"type": "null"
}
]
},
"purpose": {
"anyOf": [
{
"maxLength": 160,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"description": "一句中文说明本步为何查看这些对象,建议 60 字以内;不堆砌编号、执行参数或复述当前发现",
"title": "Purpose"
},
"request_id": {
"format": "uuid",
"title": "Request Id",
@@ -10237,11 +10346,34 @@
"title": "Execution Generation",
"type": "integer"
},
"narration": {
"anyOf": [
{
"$ref": "#/components/schemas/TaskPresentationNarration"
},
{
"type": "null"
}
]
},
"occurred_at": {
"format": "date-time",
"title": "Occurred At",
"type": "string"
},
"purpose": {
"anyOf": [
{
"maxLength": 160,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Purpose"
},
"run_id": {
"format": "uuid",
"title": "Run Id",
@@ -10299,6 +10431,125 @@
"title": "TaskPresentationHistoryPage",
"type": "object"
},
"TaskPresentationNarration": {
"additionalProperties": false,
"properties": {
"evidence_refs": {
"items": {
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"title": "Evidence Refs",
"type": "array"
},
"next_step": {
"anyOf": [
{
"maxLength": 120,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Next Step"
},
"stage": {
"enum": [
"anomaly_detection",
"evidence_verification",
"asset_localization",
"event_impact",
"source_control",
"isolation_plan",
"flushing_plan",
"field_feedback",
"clearance_verification",
"recovery_verification"
],
"title": "Stage",
"type": "string"
},
"summary": {
"maxLength": 160,
"minLength": 1,
"title": "Summary",
"type": "string"
}
},
"required": [
"stage",
"summary",
"evidence_refs"
],
"title": "TaskPresentationNarration",
"type": "object"
},
"TaskPresentationNarrationInput": {
"additionalProperties": false,
"description": "New live findings use business prose; saved narration remains readable.",
"properties": {
"evidence_refs": {
"items": {
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"maxItems": 100,
"minItems": 1,
"title": "Evidence Refs",
"type": "array"
},
"next_step": {
"anyOf": [
{
"description": "实际下一步或等待条件,建议 60 字以内;无后续时省略,不把展示当作现场执行",
"maxLength": 120,
"minLength": 1,
"type": "string"
},
{
"type": "null"
}
],
"title": "Next Step"
},
"stage": {
"enum": [
"anomaly_detection",
"evidence_verification",
"asset_localization",
"event_impact",
"source_control",
"isolation_plan",
"flushing_plan",
"field_feedback",
"clearance_verification",
"recovery_verification"
],
"title": "Stage",
"type": "string"
},
"summary": {
"description": "本步已取得的关键发现,建议 80 字以内;区分观测、模型候选和现场反馈,不复述动作或核查目的",
"maxLength": 160,
"minLength": 1,
"title": "Summary",
"type": "string"
}
},
"required": [
"stage",
"summary",
"evidence_refs"
],
"title": "TaskPresentationNarrationInput",
"type": "object"
},
"TaskQuestion": {
"additionalProperties": false,
"properties": {