docs: 里程碑2.5 交付报告(MIXED 段落解析闭环)
This commit is contained in:
@@ -8,4 +8,7 @@ Task 7: complete (commit 18da20d, review approved); IMPORTANT design gaps tracke
|
||||
FINAL: milestone2 有条件通过 -> must-fix x2 修复闭环 (eebed38, 41 passed) -> 交付报告 docs/milestone2-excel-parser-review.md; remaining deferred list documented (MIXED segmented parse, comments re-link contract, ExtractionMethod enum, theme colors, empty-sheet, formula/hidden/merged-header). Coverage report optional (pytest-cov not installed).
|
||||
M2.5 Task 9: complete (commits 81c6b6c..34ef28b + log 0f137b9, review clean); Minor backlog += trailing newlines in paragraph_splitter.py/test_paragraph_splitter.py
|
||||
M2.5 Task 10: complete (commits 0f137b9..539945b, review clean); Minor backlog += mid-file import placement in test_excel_parser.py (style)
|
||||
M2.5 Task 11: complete (commit 1e3f702, 51 passed); MIXED 独立装配分支(分割→每段 classify,TABLE 段 seg_fmt_map 段内坐标修正 formatting_map 错位;free_text 段防二次递归),TABLE/FREE_TEXT 路径不变
|
||||
M2.5 Task 11: complete (commits 539945b..1e3f702 + log bc79945, review approved); MIXED 装配分支(分割→每段 classify,TABLE 段 seg_fmt_map 段内坐标修正 formatting_map 错位;free_text 段防二次递归),TABLE/FREE_TEXT 路径不变; Minor backlog += MixedParagraph.matrix stores forward-filled segment vs docstring raw matrix wording, duplicate fmt_map loops in excel_parser (extractable later)
|
||||
M2.5 Task 12: complete (commit 7592516, review approved; minor: assert msg tweak for brief typo)
|
||||
M2.5 Task 13: complete (commit d93cc77, review approved; minor: inline comments in test, enum-to-enum assert fine given literal-assert exists)
|
||||
M2.5 FINAL: 整体评审通过(base 81c6b6c..d93cc77,58 passed,无 skip); Minor backlog unchanged (progress dedup done this edit; log 范式步骤 "整体迭代"→"反馈迭代" for Task13 row; delivery report docs/milestone2-5-mixed-parser-review.md pending creation)
|
||||
|
||||
+2
-1
@@ -36,4 +36,5 @@
|
||||
| 2026-08-09 04:20 | Agent 实现 | 里程碑2.5 Task10 实现:data_models 扩展 MixedParagraph/MixedSheet 段落容器,并新增 ExcelParseResult.mixed 字段(默认空列表)。TDD:先追加 3 个测试(字段存在性与默认行为)确认 RED(ImportError: cannot import name 'MixedParagraph'),再在 data_models.py 末尾追加两个 dataclass(顶部 from typing 加 Literal、dataclasses 加 field),excel_parser.py 更新导入并为 ExcelParseResult 加 mixed 字段,确认 GREEN(3 passed),全量 pytest 49 passed(46 baseline + 3)。未修改既有类与字段,仅追加。 | src/genesis/data_models.py, src/genesis/parsers/excel_parser.py, tests/test_excel_parser.py | deepseek-v4-flash-free |
|
||||
| 2026-08-09 04:06 | Agent 实现 | 里程碑2.5 Task11 实现:MIXED 完整段落装配(分割→逐段最优解析)。excel_parser.py 新增 MIXED 分支:整表先 forward_fill(合并单元格)再按段切片;对每段 classify_sheet,TABLE 段用 find_header_row(seg)(段内相对,<0 回落 0)并抽出段内子 map seg_fmt_map(物理行 pr→段内 pr-s,修复 formatting_map 坐标错位)传给 extract_table(header_row=header_row);非表格段归 FREE_TEXT(防二次 MIXED 递归),走 extract_text_blocks + build_free_text_table 构造 kind="free_text"。MixedParagraph 段落追加到 MixedSheet 并进 result.mixed,表/自由文本表进 result.tables。原 else 分支保留为 TABLE 专用,既有 TABLE/FREE_TEXT 路径不变。TDD:先追加 2 测试(段落分割/碎片捕获、表格段不在物理行 0 时的取消线回填)确认 RED(result.mixed 空 + IndexError),再实现确认 GREEN(9 passed),全量 pytest 51 passed(49 baseline + 2)。提交见 git log | src/genesis/parsers/excel_parser.py, tests/test_excel_parser.py | deepseek-v4-flash-free |
|
||||
| 2026-08-09 09:40 | 测试验证 | 里程碑2.5 Task12 实现:混合型样本 + 端到端验证。生成 samples/要件定義_混合型.xlsx(機能一覧 表格:表头+3 数据行,空行后接「・改修ポイント」「■対象期間」两条连续碎片文本,无空行);tests/test_real_samples.py 追加 test_mixed_sample_segments_detected(断言 mixed 段落数==2、kinds==["table","free_text"]、表格段第一批数据行機能ID=="F101"、table.rows==3、碎片段 text 含 改修ポイント/対象期間)。验证:real_samples 全绿 4 passed(3 baseline+1 新增,无 skip);pytest 全量 52 passed(51 baseline + 1);实际样本 split_paragraphs 产出两段(0,3)+(5,6)(表格段+碎片段)。提交见 git log | samples/要件定義_混合型.xlsx, tests/test_real_samples.py, _AI_USAGE_LOG.md | deepseek-v4-flash-free |
|
||||
| 2026-08-09 | 整体迭代 | 里程碑2.5 Task13 遗留清理:① extraction_method 枚举同源(free_text_extractor→ExtractionMethod.LLM_FROM_FREE_TEXT.value、table_extractor 空/非空两分支→ExtractionMethod.OPENPYXL.value,值不变既有用例兼容);② table_extractor header_row 越界/负值防御(<0 或 >=len(matrix) 回落 0,keep if not matrix 早返回);③ merge_fill.forward_fill 完整替换(min_row<1/min_col<1 非法值跳过 + 越界防御);④ data_models.Provenance.row 语义注释;⑤ 补测试 6 个(sheet_nature MIXED ・/■ 正向 x2、formatting_detector 字体色正向、table_extractor 枚举锁 + forward_fill 防御、free_text_extractor 枚举锁)。TDD:先加测试确认 RED(仅 forward_fill 防御用例失败,其余为已通过回归锁)→ 实现 → GREEN;pytest 全量 58 passed(52 baseline + 6) | src/genesis/parsers/free_text_extractor.py, src/genesis/parsers/table_extractor.py, src/genesis/parsers/merge_fill.py, src/genesis/data_models.py, tests/test_sheet_nature.py, tests/test_formatting_detector.py, tests/test_free_text_extractor.py, tests/test_table_extractor.py, _AI_USAGE_LOG.md | deepseek-v4-flash-free |
|
||||
| 2026-08-09 04:40 | 反馈迭代 | 里程碑2.5 Task13 遗留清理:① extraction_method 枚举同源(free_text_extractor→ExtractionMethod.LLM_FROM_FREE_TEXT.value、table_extractor 空/非空两分支→ExtractionMethod.OPENPYXL.value,值不变既有用例兼容);② table_extractor header_row 越界/负值防御(<0 或 >=len(matrix) 回落 0,keep if not matrix 早返回);③ merge_fill.forward_fill 完整替换(min_row<1/min_col<1 非法值跳过 + 越界防御);④ data_models.Provenance.row 语义注释;⑤ 补测试 6 个(sheet_nature MIXED ・/■ 正向 x2、formatting_detector 字体色正向、table_extractor 枚举锁 + forward_fill 防御、free_text_extractor 枚举锁)。TDD:先加测试确认 RED(仅 forward_fill 防御用例失败,其余为已通过回归锁)→ 实现 → GREEN;pytest 全量 58 passed(52 baseline + 6) | src/genesis/parsers/free_text_extractor.py, src/genesis/parsers/table_extractor.py, src/genesis/parsers/merge_fill.py, src/genesis/data_models.py, tests/test_sheet_nature.py, tests/test_formatting_detector.py, tests/test_free_text_extractor.py, tests/test_table_extractor.py, _AI_USAGE_LOG.md | deepseek-v4-flash-free |
|
||||
| 2026-08-09 10:05 | 反馈迭代 | 里程碑2.5 最终评审与交付:整体评审通过(base 81c6b6c..d93cc77,58 passed);清理 progress.md Task11 重复/编码行;修正 _AI_USAGE_LOG.md Task13 范式步骤用词;产出交付报告 docs/milestone2.5-mixed-parser-review.md(MIXED 遗留#1 闭环) | docs/milestone2.5-mixed-parser-review.md, .superpowers/sdd/progress.md, _AI_USAGE_LOG.md | deepseek-v4-flash-free |
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
# 里程碑 2.5(MIXED 完整段落解析)评审与交付报告
|
||||
|
||||
- 日期:2026-08-09
|
||||
- 状态:**通过**(最终里程碑评审 Ready for delivery: YES)
|
||||
- 关联文档:`docs/superpowers/specs/2026-08-09-mixed-paragraph-parsing-design.md`、`docs/superpowers/plans/2026-08-09-mixed-paragraph-parsing.md`、`docs/milestone2-excel-parser-review.md`(遗留记录#1 的闭环)
|
||||
- 范围:里程碑 2 验收遗留项「MIXED 折叠进纯表路径」的完整落地(design §3.5.2「段落分割→各段落最优解析」)
|
||||
|
||||
## 一、交付内容
|
||||
|
||||
新实现 5 个任务、6 个新测试用例(当前全量 **58 passed**),7 个提交(base `81c6b6c`):
|
||||
|
||||
| 任务 | 提交 | 说明 |
|
||||
|------|------|------|
|
||||
| Task 9 段落分割器 | `34ef28b` | `paragraph_splitter.py`:`split_paragraphs(matrix) -> list[(start,end)]`(含端点、0-based,全空行为界,空矩阵→[]) |
|
||||
| Task 10 data_models 扩展 | `539945b` | 追加 `MixedParagraph`(kind=table/free_text、matrix、table、text、source_range)、`MixedSheet`;`ExcelParseResult.mixed`(默认[]);仅追加不改既有类字段 |
|
||||
| Task 11 MIXED 装配 | `1e3f702`(+docs `bc79945`) | `excel_parser.py` MIXED 分支:forward_fill→split→每段 classify→TABLE:段内 `header_row=find_header_row(seg)` + `seg_fmt_map`(物理→段内坐标);其余→FREE_TEXT(`extract_text_blocks`+`build_free_text_table`,防二次递归);表/自由文本段双写 `result.tables` + `result.mixed` |
|
||||
| Task 12 混合型样本+端到端 | `7592516` | `samples/要件定義_混合型.xlsx`(表段+连续碎片段);`test_real_samples.py` 新增 `test_mixed_sample_segments_detected`(段落==2、kinds、F101、rows==3、碎片含 改修ポイント/対象期間) |
|
||||
| Task 13 遗留清理 | `d93cc77` | ① `extraction_method` 枚举同源(`ExtractionMethod` .value);② `header_row` 越界防御;③ `forward_fill` 非法/越界范围跳过完整实现;④ `Provenance.row` 语义注释;⑤ 补测试 6 个 |
|
||||
|
||||
## 二、验收结论
|
||||
|
||||
| 验收项 | 结论 |
|
||||
|--------|------|
|
||||
| 段落分割(空行边界) | ✅ 纯函数 5 用例 + 样本实测 `[(0,3),(5,6)]` |
|
||||
| 段落容器与 API 兼容 | ✅ 追加式扩展,既有类/字段/消费方零破坏(58 passed) |
|
||||
| MIXED 各段最优解析 | ✅ 表段 → `extract_table`(表头/格式化);碎片段 → 文本块+占位表(`llm_from_free_text`) |
|
||||
| formatting_map 段内坐标 | ✅ `seg_fmt_map[(pr-s, pc)]` 物理→段内平移,与 `extract_table` 索引语义闭环(`test_parse_mixed_sheet_formatting_in_mid_segment` 锁旧错误) |
|
||||
| 防二次递归 | ✅ 段内二次 MIXED 落入 FREE_TEXT 分支 |
|
||||
| 混合型端到端 | ✅ 样本真实驱动,断言 4 项全绿、无 skip |
|
||||
| 回归安全 | ✅ TABLE/FREE_TEXT 路径行为不变;58 passed(14 基线 + 27 里程碑2 + 17 新 M2.5) |
|
||||
| 每任务 pytest 全绿 | ✅ 各任务评审均 Approved(T9-T13) |
|
||||
| 覆盖率 >80% | ⚠️ 未安装 pytest-cov(同里程碑2,可选增强,非阻塞) |
|
||||
|
||||
## 三、评审发现与闭环
|
||||
|
||||
最终里程碑评审(base `81c6b6c..d93cc77`)独立复验:58/58 passed、样本直接内省 `[(0,3),(5,6)]`、坐标转移零偏移(F101 段内 `(1,0)`);无 Critical / Important,仅以下 Minor(已记录,不影响交付):
|
||||
|
||||
| 事项 | 处置 |
|
||||
|------|------|
|
||||
| `progress.md` Task11 重复/编码行 | 本次去重 |
|
||||
| `MixedParagraph.matrix` docstring 写「原始矩阵」但存 forward-filled 段 | 标签进 backlog(措辞调整) |
|
||||
| `excel_parser` 两处重复的 `fmt_map` 遍历 | backlog(后续抽取公共辅助) |
|
||||
| `test_excel_parser.py` 中部 import(风格) | backlog |
|
||||
| `_AI_USAGE_LOG.md` Task13 范式步骤「整体迭代」用词 | 本次改为「反馈迭代」并补时间 |
|
||||
| 尾随空行(Windows 风格) | 既有 backlog(非功能) |
|
||||
|
||||
## 四、下一步建议(不在本里程碑范围)
|
||||
|
||||
- 将碎片段中「・」/「■」结构化到 LLM 提取(依赖 InferenceEngine,后续里程碑)
|
||||
- 覆盖率工具(pytest-cov)与默读增强
|
||||
- 既有 MIXED 的 `source_range` 供 Impact/Writer 的追溯消费
|
||||
|
||||
## 五、提交与日志
|
||||
|
||||
- 提交:`34ef28b` `0f137b9` `539945b` `1e3f702` `bc79945` `7592516` `d93cc77`
|
||||
- `_AI_USAGE_LOG.md` 每任务各追加 1 行(范式步骤:Agent 实现/测试验证/反馈迭代),模型 `deepseek-v4-flash-free`
|
||||
- (本次报告本身随附日志行 + 提交)
|
||||
Reference in New Issue
Block a user