Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LutgzyJqNhPpZy1nFsJtN3
5.4 KiB
修复单:完整数据版补齐(三)独立年度方法参考(issue #93,第 1 次打回,2026-10-23)
- 被验提交:
c644881a3(分支codex/full-data-parity-3-20261022) - 原任务书:
TASK-full-data-parity-3-20261022.md - 执行方:Grok。同一分支继续,开工前
git merge origin/staging(不 rebase)。BUG 编号开工时核对最大号 +1。
验收结论(Claude,Linux,PyJHora 4.8.7 已装,不屏蔽)
做对了的:PyJHora 只在子进程 worker 里导入,三张虚构盘生成后父进程 sys.modules 里没有 jhora;S1~S3 开关保持「未装」时的老结果;没碰冻结打分文件;中英各有「来源:PyJHora / Source: PyJHora」;英文汉字 0;输入是当地时间与正确年份(D6 默认)。
| 项 | 结果 |
|---|---|
| 生成时长(Linux,0 / 1 / 9 号盘,排盘 + 资料包 + 先英文后中文,PyJHora 真跑) | 22.0 / 19.8 / 19.7 秒 |
| worker 峰值内存(0.5 秒采样) | 约 60 MB |
| 本章内容(9 号盘中文) | 3 年 × 4 张表,717 行;「未获得结果」6 处 |
| 前端全量、类型检查、构建 | 与 staging 一致 |
| 全量 pytest | 比 staging 基线多 5 条;2 条单独重跑通过(本机负载),3 条单独跑仍失败,见下 |
P1 · 结果指纹:别把本章排除在外(必修)
jyotish_engine._bind_result_without_annual_method_reference 在绑定前把 pyjhora_annual_method_reference 摘掉、绑定后再放回。结果是:交付出去的资料包里有这一章,result_hash 却没算它;任何人按 hash_bound_result 重算都对不上——tests/test_report_reference_perf.py::test_fast_hash_matches_the_legacy_algorithm_on_a_real_packet 因此失败(BUG-693 / 694 的出处绑定就是靠「重算能对上」)。calculation_profile_contract.py 的 D2 也写明只有三类可以排除,本单没有授权加第四类。
修法:删掉 _bind_result_without_annual_method_reference,恢复原来的 bind_result_to_profile(delivered, profile);本章照常算进指纹。原任务书「切掉本章后与 T1 完成时的输出逐字节相同」那条对照,比较前把报告引用号 / 结果指纹那一行按正则抹成同一个占位符,再逐字节比较(引用号本来就该随结果变);在 PROGRESS 写明抹掉的是哪一行。
验收:上面那条测试通过;tests/test_calculation_profile_contract.py 全过;「切掉本章逐字节相同」的对照仍通过(抹掉引用号行之后)。
P2 · 源码文本合同测试没跟着改(必修,P1 修完多半自动消失)
tests/test_calculation_profile_contract.py::test_professional_reference_packet_rebinds_sanitized_delivery 在 build_professional_report_reference_packet 源码里找 bind_result_to_profile(delivered, profile),被包进新函数后找不到(ValueError: substring not found)。按 P1 恢复原调用即可;若仍要改这个函数,按 AGENTS §7.8 同轮改测试并写三栏。
P3 · 自己的新测试和自己写的部署说明打架(必修,小)
tests/test_pyjhora_annual_method_reference.py::test_deploy_does_not_set_year_lord_pyjhora_reference 扫 deploy/ 下所有文件不得出现 JYOTISH_YEAR_LORD_PYJHORA_REFERENCE,而本单在 deploy/README.md 写了「Do not set JYOTISH_YEAR_LORD_PYJHORA_REFERENCE」。二选一:README 改成不点名(例如「不要打开年主的 PyJHora 对照开关」),或测试只扫 compose / env / workflow 这类配置文件、跳过 *.md。推荐前者。
顺手(小,不阻塞)
build_professional_report_reference_packet对标准版和 JSON 输出也会起一次 PyJHora 子进程(本章只在完整数据版渲染)。线上目前只请求完整数据版,影响不大;顺手改成只在edition == full_data时调用(放在professional_report_reference._assemble_professional_report_reference判定版本之后),并加一条测试:标准版不启动 worker。- 进度里写「超时放宽到 120 秒」。Linux 上整份约 20 秒,120 秒只是上限,保留可以;但请在 PROGRESS 写明:前端总等待是 180 秒,worker 超时 + 其余生成时间不得超过它。
交回前必跑
tests/test_pyjhora_annual_method_reference.py、tests/test_calculation_profile_contract.py、tests/test_report_reference_perf.py与原任务书第 7 节列出的文件。- 200 张英文扫描(屏蔽 PyJHora)。
- 全量 pytest、快速门、前端由 Claude 复验。
第 2 轮(2026-10-24,产品选 B:交回 Grok)
被验提交 c899e3650:P1~P3 与「标准版不启动 worker」都已改对,快速门通过。还差两条测试:给 build_professional_report_reference_packet 加了 include_annual_method_reference 参数后,有 4 个测试的替身函数补了 **_kwargs,漏了下面 2 个,单独跑都报 TypeError: ... got an unexpected keyword argument 'include_annual_method_reference':
tests/test_reader_appendix_language.py::test_public_boundary_only_leaves_internal_renderer_and_json_unchangedtests/test_report_density_facts.py::test_full_golden_shared_markdown_is_byte_identical_and_reader_copy_is_clean
修法与那 4 处相同:替身(lambda)加上 **_kwargs,不改业务代码、不改断言。交回前 grep -rn "build_professional_report_reference_packet" tests/ 把其余替身也过一遍,并跑这两条加上上面列出的文件。