feat(impact): Impact Agent MVP —— 变更点定位 + 影响调查书(追加改修场景)

- 门控:用户提供 existing_system 路径 → 进入影响调查;未提供 → 原流程不变
- CodeParser 解析 Java(@RestController/@Service/@Entity/@TableName)+ ExistingSystemExplorer 组装
- ImpactAgent 变更点定位(变更区分×既存対応 确定性比对,无 LLM)→ ImpactReport(JSON 可下载)
- 影响调查结果作为 Writer 生成概要设计书的主上下文({{impact}},无专用影响章)
- source_aggregator 解除 existing_system=None 硬编码
- 既有系统样本 sunOnly/stock-trade-system(无 LICENSE,仅测试输入,保留来源标注)
- 新造股票交易域追加改修样本 要件定義_追加改修_股票.xlsx(对齐 sunOnly 真实类名)
- 全量 351 passed / 99.27% 覆盖;门禁 PASS(16 要素:新规5/変更8/削除3/未受影响50)
This commit is contained in:
lhl
2026-08-23 17:59:08 +08:00
parent da33df92e1
commit 2e11720a2d
383 changed files with 18411 additions and 10 deletions
+56 -2
View File
@@ -1,8 +1,9 @@
from dataclasses import asdict
from genesis.data_models import (
CellComment, CellFormatting, CellValue, Confidence, ElementType,
ExcelTable, ExtractionMethod, ImageAnalysis, ParsedTemplate, Provenance,
CellComment, CellFormatting, CellValue, ChangeAnalysis, ChangeElement,
ChangeType, Confidence, ElementType, ExcelTable, ExtractionMethod,
ImageAnalysis, ImpactReport, ImpactWarning, ParsedTemplate, Provenance,
RelationType, RuleDocument, SheetType, StructuredSource,
)
@@ -75,3 +76,56 @@ def test_asdict_serializable():
prov = Provenance(file_name="f.xlsx", sheet_name="S", row=1, column="A", column_header="h")
d = asdict(CellValue(value=1, provenance=prov))
assert d["provenance"]["row"] == 1
# ---------- Impact Agent MVP 数据模型(2026-08-23 ----------
def test_changetype_members():
assert ChangeType.NEW.value == "新規"
assert ChangeType.MODIFIED.value == "変更"
assert ChangeType.DELETED.value == "削除"
assert ChangeType.UNCHANGED.value == "不变"
def test_change_element_defaults():
el = ChangeElement(element_id="F001", element_type="機能", name="止损风控", change_type=ChangeType.NEW)
assert el.existing_mapping == []
assert el.impacted_existing == []
assert el.evidence == ""
assert el.status == "ok"
def test_change_analysis_holds_lists():
ca = ChangeAnalysis(
project_type="enhancement",
new_elements=[ChangeElement("F001", "機能", "止损风控", ChangeType.NEW)],
modified_elements=[],
deleted_elements=[],
unchanged_elements=[],
warnings=[ImpactWarning(element_id="F002", issue="无法定位修改对象")],
)
assert ca.project_type == "enhancement"
assert ca.new_elements[0].element_id == "F001"
assert ca.warnings[0].issue == "无法定位修改对象"
def test_impact_report_defaults():
report = ImpactReport(metadata={"version": "v1"})
assert report.change_analysis is None
assert report.summary == {}
def test_impact_report_holds_analysis():
ca = ChangeAnalysis(project_type="enhancement", new_elements=[], modified_elements=[],
deleted_elements=[], unchanged_elements=[], warnings=[])
report = ImpactReport(metadata={"version": "v1"}, change_analysis=ca, summary={"new": 0})
assert report.change_analysis.project_type == "enhancement"
assert report.summary["new"] == 0
def test_structured_source_impact_report_default_none():
"""StructuredSource 新增 impact_report 字段,缺省 None(门控未提供时保持 None)。"""
source = StructuredSource(
tables=[], template=None, rule_docs=[], image_analyses=[], existing_system=None, comments=[],
)
assert source.impact_report is None