fix(report): make density facts readable and printable
Independent Staging Quality Gate / validate (push) Failing after 11m4s
Independent Staging Quality Gate / publish (push) Skipped

Unify reader cleanup rules, lock writer table guards, and register the exact fictional timestamp collision. Preserve existing ordinary-report safety contracts and source-data gaps.

Validation: report Node 165/165, final safety 29/29, Python 101/101, Chrome 28/28; both PDFs retain all 130 rows. Full Node 3704 tests with the same 91 baseline failures. Privacy test: 62 passed, 1 failed due to 17 protected-file READ_ERRORs; not a green gate. Build, DB, manual checklist and controlled-login gaps remain documented. User explicitly authorized staging push with these gaps disclosed.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
jesse-ux
2026-09-23 15:26:25 +08:00
co-authored by Claude Code
parent 0d37bec15a
commit a12f2c0d26
27 changed files with 1220 additions and 210 deletions
+112
View File
@@ -13296,6 +13296,86 @@
- 复发自:无
- 修复版本:本分支,尚未部署
## BUG-1003 | 对外原始附录带出工程状态词与第三方页码
- 状态:investigating(原实现已合入 staging,本轮清洗一致性修复待验证,未确认部署)
- 首次发现:2026-09-22
- 最近更新:2026-09-23
- 影响面:`/api/professional_report_reference` 的对外 Markdown、报告独立原始附录下载;内部审计与 CLI 不变。
- 用户现象:附录出现内部函数名、工程状态词、第三方引擎名与产品页码。
- 触发条件:原始引擎导出作为读者附录返回,而非普通正文投影。
- 根因:内部审计与读者副本未分开;BUG-999 的普通正文 allowlist 不覆盖附录。初版 Python / TS 两份规则又因 Unicode 单词边界不同漏掉 Python 第三方页码。
- 修复:`bbd96d3b` 增加读者副本清洗;本轮 F4 将 Python / TS 规则收敛为 scripts 下共享 JSON,正则采用相同 ASCII 边界,保留行数、原始字段、英文散文与图盘围栏,不以整行删除代替翻译。
- 验证:本轮主会话报告定向 165/165、Python 定向 101/101 通过,含完整虚构 golden 两端逐字一致、页码归零及行/表/数字/图盘字节保留。前轮相差 36 行的问题已有回归覆盖;完整门和部署仍未通过,详见 PROGRESS。
- 防复发:保留 `test_reader_appendix_language.py` 与前端原始附录清洗 / golden 回归;F4 必须覆盖同一真实引擎虚构 fixture 两侧逐字一致及页码归零。普通正文投影与安全边界不变。
- 相关记录:BUG-999、BUG-1004;`TASK-report-density-fix-20260923.md` F4
- 复发自:BUG-999 同现象族的未覆盖通道,不是撤销普通正文限制。
- 修复版本:原实现 `bbd96d3b`;本轮工作树修复待验证,未确认部署。
## BUG-1004 | 读者没有独立完整原始附录入口
- 状态:investigating(入口已实现,受控浏览器与部署待验)
- 首次发现:2026-09-22
- 最近更新:2026-09-23
- 影响面:报告下载动作、`POST /api/reports/[reportId]/raw-appendix`、新长报告计算快照。
- 用户现象:普通下载只提供净化正文,完整计算表不能作为独立附录取得。
- 触发条件:用户需要核对原始表格,但只有 BUG-999 建立的普通正文下载通道。
- 根因:缺独立附录产物与入口;不能把完整表格塞回普通正文投影作为补救。
- 修复:`bbd96d3b` 新增独立附录路由和下载动作,普通 Markdown 仍走原投影。新计算通过既有 section RPC 持久 snapshot,重试从快照恢复结构化数据;快照行从章节列表及错误聚合排除。旧 Markdown-only 缓存不回填。
- 验证:前轮验收入口与快照读写静态核对通过;`personal-report-density-retry.test.ts` 已含中断、并发、损坏绑定、旧缓存等用例。测试存在不等于本轮通过;登录态下载与重试真人证据仍缺,见 PROGRESS。
- 防复发:`personal-report-raw-appendix.test.ts`、`personal-report-density-retry.test.ts` 与 `report-public-projection.test.ts` 分别守住独立附录、快照恢复和普通下载不变;不能让 snapshot 成为 writer 章节,不能借附录授权放宽 XSS / 危险 URL 合同。
- 相关记录:BUG-999、BUG-1003、BUG-1005
- 复发自:无;为经产品授权新增的独立通道,普通下载限制仍有效。
- 修复版本:`bbd96d3b` 已合入 staging;未确认部署。
## BUG-1005 | 个人报告没有可承载引擎事实表的结构化层
- 状态:investigating(事实层已实现,可读性与打印补修待验)
- 首次发现:2026-09-22
- 最近更新:2026-09-23
- 影响面:报告契约、服务端装配、报告页事实表与 writer 边界。
- 用户现象:引擎已有大运、力量、功能吉凶等表,但报告只有叙述与图盘;初版补表后又把路径清单显示给读者,见 BUG-1009。
- 触发条件:生成包含上述已计算层的个人报告。
- 根因:原报告没有 `factTables`;初版未规定用户列结构,writer 拒绝表格与打印闭合也缺回归覆盖。
- 修复:`bbd96d3b` 增加 8 组服务端事实层,不给 writer 可写字段;保留证据状态。F1 补真正列结构,F5 补 writer 提示与拒绝测试,F6 补全折叠时打印。Sade Sati 只展示源中已有框架,三轮日期计算范围外。
- 验证:本轮报告定向 165/165、Python 定向 101/101 通过;writer 去拦截变异使 4 个拒绝用例全部变红,正常对照仍绿。Chrome 153 隔离真实组件 28/28,全部折叠与混合状态 PDF 各 5 页、各 130/130 行完整,打印后恢复;不是受控登录 E2E。完整构建受 Windows symlink EPERM 阻塞,尚未提交或部署。
- 防复发:`report-fact-tables.test.ts` 真实 golden 与逐行来源回查不可削弱;writer 的 Markdown / HTML 表格或 `factTables` 输出必须 fail closed;打印测试必须从全折叠状态开始并核对打印后恢复。
- 相关记录:BUG-1009、BUG-153、BUG-999;修复单 F1/F5/F6
- 复发自:BUG-153 的打印合同遗漏新增事实表 disclosure;旧静态合同不能证明关闭的 details 进入 PDF。
- 修复版本:原实现 `bbd96d3b`;本轮补修待验证,未确认部署。
## BUG-1006 | 报告契约分盘种类上限不足
- 状态:investigating(16 种契约已实现,本轮构建与真机待验)
- 首次发现:2026-09-22
- 最近更新:2026-09-23
- 影响面:`CHART_IDS`、长报告分盘装配、报告页布局。
- 用户现象:引擎可提供更多分盘,但报告契约只接受 9 种,无法交付约定的 16 张。
- 触发条件:新生成完整个人报告并查看分盘。
- 根因:契约枚举和服务端交付层未承载完整目标分盘集合。
- 修复:`bbd96d3b` 将枚举扩为任务书指定 16 种,装配真实宫位与星体,沿用 BUG-616 grid/card 和 BUG-617 memoized 文章树;旧 v1 枚举兼容保留。
- 验证:前轮验收记录 `/` Static、gzip +0.007%,golden 覆盖 16 盘完整宫位;本轮未重跑,不作为修复版通过。16 张盘不重叠、滚动不重建及旧报告读取待受控浏览器复核。
- 防复发:`report-fact-tables.test.ts` 检查图盘完整性;`personal-report-markdown-view.test.tsx` 中 grid、禁止 float / 负 margin 与文章无滚动态合同仍在,不得只检查是否存在 SVG。
- 相关记录:BUG-616、BUG-617、BUG-1005
- 复发自:无;分盘扩容须持续遵守旧布局与性能防线。
- 修复版本:`bbd96d3b` 已合入 staging;未确认部署。
## BUG-1007 | 辅助大运族缺少读者可理解的适用性说明
- 状态:investigating(新生成路径已实现,回归与真人待验)
- 首次发现:2026-09-22
- 最近更新:2026-09-23
- 影响面:新报告原始附录的辅助时间轴适用性说明。
- 用户现象:辅助大运只剩状态词,不能看出是否适用、缺什么,以及只能交叉核对的边界。
- 触发条件:读取辅助大运族数据,包括引擎已算出但仍限制可断言程度的层。
- 根因:对外附录缺读者语言说明,未把引擎适用性和使用边界一同交付。
- 修复:`bbd96d3b` 对 16 个大运族提供逐族说明,读取引擎 `applicable` 而不自行放宽;标明第二时间轴、不单独生成应期。新快照保存说明,旧 Markdown-only 缓存不补算、不回填。
- 验证:前轮验收记录 16 族各有白话说明、模块不自行判定;本轮清洗变化后的回归与受控下载待验。
- 防复发:真实 golden 的附录 / durable retry 回归须保住适用性与限制;普通正文投影不能接纳这些替代时间轴成为断言,旧缓存缺证据必须如实降级。
- 相关记录:BUG-1003、BUG-1004、BUG-999
- 复发自:无;不把展示授权当作证据等级升级。
- 修复版本:`bbd96d3b` 已合入 staging;未确认部署。
## BUG-1008 | 任务书写入真实个人出生资料并推到 staging
- 状态:mitigated(staging 历史已重写,不再含该资料;旧提交在 Gitea 上仍可按 SHA 匿名访问,待服务器垃圾回收)
@@ -13313,3 +13393,35 @@
- 相关记录:BUG-999
- 复发自:无(与 2026-09-20 的本仓个人案例清除属同一类资料)
- 修复版本:`abf28321`(HEAD 清除);历史重写见上
## BUG-1009 | 普通报告事实表显示引擎字段路径而不是可读列
- 状态:investigating(F1 修复执行中,待定向与独立验收)
- 首次发现:2026-09-23
- 最近更新:2026-09-23
- 影响面:`assembleReportFactTables`、事实表渲染、普通报告可见单元格。
- 用户现象:8 组表为“原始字段 / 数值或状态”两列键值清单;出现 snake_case、数组下标、内部时间字段,主运年数还可能被出生时剩余量替代。
- 触发条件:查看原报告密度实现新增的普通报告事实表。
- 根因:原任务书只要求可追溯,未明确用户列结构;实现把来源路径直接当行名。普通正文的 BUG-999 投影不覆盖这块新增结构化渲染。
- 修复:F1 按修复单逐组改成主运 / 分运 / 小运、SAV / BAV、六分量、功能吉凶、行星状态、特殊点、阶段框架、年度与 Saham 表。来源保留在不可见 `sourcePath`,数字不补算,主运年数与出生剩余量分开。
- 验证:前轮 948 个叶子行的缺陷证据不再作为新表行数合同。本轮真实 golden 的 8 组、11 张实际表、130 行、545 单元格在 Chrome 完整渲染;可见 snake_case、数组下标、超两位小数均为零;Node 回归核对来源路径、原始数值与缺值不补算。首段主运直接取 full_years 显示 18.00,余额 0.72 仅说明;年度源无行星位置,保留空表,不冒用本命数据。构建与登录 E2E 缺口见 PROGRESS,尚未部署。
- 防复发:使用真实引擎虚构 golden,同时测试可见内容与来源追溯;不能只通过“值来自引擎”就宣称面向读者可读,不能削弱 BUG-999 普通正文安全合同。
- 相关记录:BUG-1005、BUG-999;`TASK-report-density-fix-20260923.md` F1
- 复发自:BUG-999 同现象族的新增表格通道,旧正文测试未覆盖。
- 修复版本:缺陷引入 `bbd96d3b`;修复在 `codex/report-density-fix-20260923` 工作树实施,待验证,未确认部署。
## BUG-1010 | 新虚构 fixture 的隐私扫描数值碰撞未登记
- 状态:investigating(F2 按精确数值碰撞机制处理,待本轮验证)
- 首次发现:2026-09-23
- 最近更新:2026-09-23
- 影响面:`tests/test_repo_privacy_markers.py` 与 `frontend/tests/fixtures/report-density-fictional-reader.json`。
- 用户现象:无用户界面现象;质量门隐私扫描命中虚构引擎时间戳的数值片段,阻断发货。
- 触发条件:新增真实引擎虚构 golden 后运行仓库隐私门。
- 根因:时间戳数值与私有标记发生碰撞,但新 fixture 未登记到既有已审阅数值碰撞机制;不是 fixture 包含真实个人资料。任务书真实泄漏另见 BUG-1008,不得混称误报。
- 修复:F2 只登记已审阅的单处数值碰撞,说明来自虚构输入的引擎时间戳;不更改私有标记、扫描规则,也不豁免整份 fixture 或目录。
- 验证:前轮独立重跑已复现该虚构时间戳,本轮没有重跑引擎。主会话转述 F2:精确登记及反例 62 passed / 1 deselected;完整专项用 audit hook 尊重 `pending_packets` 禁读,62 pass / 1 fail(17 个保护文件 READ_ERROR),其余 4,647 文件无命中。完整隐私门未绿,不能标 resolved;不复制碰撞数值或私有 marker。
- 防复发:新增 golden 必须保留虚构来源声明并跑隐私扫描;数值碰撞逐处核实、精确登记,真实泄漏必须分别清除,不能靠扩大 allowlist 隐藏。
- 相关记录:BUG-1008、BUG-1009;`TASK-report-density-fix-20260923.md` F2
- 复发自:无;既有扫描正确触发,缺的是已核实碰撞的精确登记。
- 修复版本:缺陷引入 `bbd96d3b`;F2 工作树修复待验证,未确认部署。
@@ -0,0 +1,132 @@
# PROGRESS-report-density-20260922 · 报告密度实现与验收修复
## 当前状态(2026-09-23)
**代码补修与可执行的独立验证已完成;用户在获知下列缺口后明确要求 push 到 staging。** 本次按授权提交并尝试快进推送,不代表整体验收通过或部署成功。F3 清单写入被拒,完整隐私门、全量门槛、构建与数据库缺口仍保留,Gitea 门禁和部署结果须另外核实。原实现已进入 staging;本轮按 [修复单](TASK-report-density-fix-20260923.md) 执行 F1~F6。原任务书:[TASK-report-density-20260922.md](TASK-report-density-20260922.md)。
| 项 | 已核实事实 |
| --- | --- |
| 原实现 | 脱敏历史 `bbd96d3b`,已进入 staging;原验收未通过 |
| 本轮基线 | 主会话已 fetch 并创建 worktree;本工作树 HEAD 核实为 `0d37bec15a456329880b45810c63812d29162f29` |
| 工作树 / 分支 | `.worktrees/report-density-fix-20260923` / `codex/report-density-fix-20260923` |
| 当前交付 | 用户明确要求 push 到 staging;主会话提交本轮指定文件并快进推送,远端 SHA 与门禁结果另行核实;不使用 stash、不强推 |
| 部署 | 原修复单记录门禁 run 2854 失败、health 停在 `1bc6a954`;本轮未重新查询,不能当作当前线上核验 |
| Bug 编号 | 开工核对最大已记编号 BUG-1008;按既有预留补 BUG-1003~1007 与 BUG-1009/1010,不改 BUG-1008 |
## 实现事实与分工
| 范围 | 基线已有实现 / 本轮工作 | 当前结论 |
| --- | --- | --- |
| BUG-1003 / F4 | Python / TS 共用一份 JSON 清洗规则 | 本轮完整虚构 golden 逐字一致,页码归零 |
| BUG-1004 | 独立 `raw-appendix` 入口;普通正文仍走原投影;新计算有持久 snapshot | 定向回归通过;受控浏览器下载待验证 |
| BUG-1005 / BUG-1009 / F1 | 8 组可读领域表、可选子表、隐藏来源路径 | 单测与 Chrome 隔离组件验证通过;年度行星源缺失如实留空 |
| BUG-1006 | 16 种分盘契约与装配已有;复用 grid / memoized Markdown | golden 与布局合同通过;Static、gzip、真机布局待验 |
| BUG-1007 | 新计算的辅助大运适用性说明已有;不提升证据等级 | 本轮定向回归通过;旧 Markdown-only 缓存仍不回填 |
| BUG-1010 / F2 | 虚构时间戳碰撞按精确 span 登记 | 反扩大豁免用例通过;完整隐私门因保护文件 READ_ERROR 未绿 |
| F3 | 补 Bug 历史、本进度、索引与真实状态,更正旧缺口 | 已有文档补齐;新建真人清单被工具拒绝,文件不存在,F3 尚未完全满足 |
| F5 | writer 补提示及真实校验路径拒表回归 | 主会话回归通过;代理去 guard 变异证据已收到 |
| F6 | beforeprint 展开、afterprint 恢复、打印解除裁切 | 单测与 Chrome 原生 PDF 通过;真人打印对话框与登录 E2E 未验证 |
F1/F2/F4/F5 各代理只改自己的代码范围,F3 仅改授权文档,F6 和最终验收由主会话负责。P3 可选项没有完成证据前不记为已修。
## 已有防复发措施核对
开始记录前已按报告模块、原始附录接口、字段泄漏、打印、折叠、快照与相关 BUG 编号检索 Bug 历史,并读完 BUG-153、616、617、999、1008。本轮只读核对结果如下,不等于执行测试通过。
| 历史记录 | 仍在的措施 | 此次未被拦住的边界 |
| --- | --- | --- |
| BUG-999 | `report-public-projection.test.ts` 保留旧缓存再投影、普通下载、HTML / 危险 URL / 图盘围栏合同 | 新增事实表是独立结构化可见层,旧正文投影测试不检查表格单元格 |
| BUG-616 | `personal-report-markdown-view.test.tsx` 保留 grid/card 结构及禁止 float / 负 margin | 源码或静态 DOM 不能代替 16 张盘真实布局 |
| BUG-617 | 同文件保留文章无滚动态、`renderMarkdown` 在 `useMemo` 内的合同 | 滚动无整树重建仍需浏览器核对 |
| BUG-153 | 既有打印入口与报告样式合同保留 | 新增默认关闭的事实表 disclosure 未被旧打印范围完整覆盖,F6 补齐 |
| BUG-1008 | 状态与历史清除记录原样保留 | 服务器垃圾回收不属于本轮;不访问旧泄漏历史、不同步镜像 |
## 结构化重试与范围边界
- 基线 `personal-report-longform-snapshot.ts` 已通过既有 `ensure_personal_report_section` / `complete_personal_report_section` RPC 写入服务端快照;不新增表或迁移。
- `generatePersonalReportLongform` 先持久完整快照,再写 Markdown 缓存与最终文档。重试从快照恢复 `factTables`、`charts` 与适用性说明;检查用户 / 请求 / 报告绑定和 Markdown 哈希;损坏快照失败闭合,不冒充旧缓存。
- `personal-report-density-retry.test.ts` 已含 snapshot-only、appendix-only、final-ready、legacy、corrupt、mismatch、pending-with-markdown、late-pending、late-ready、parallel-ready 用例。这里确认的是测试存在,不是本轮测试成绩。
- 因此旧 BLOCKED 中“结构化层的持久重试尚未实现”已过时。**真正保留的范围边界**是没有结构化快照的历史 Markdown-only 缓存不回填、不重算;不得承诺旧报告自动获得 8 组事实表、16 张结构化分盘或新适用性说明。
- Sade Sati 源数据只有三阶段框架与当前状态,没有三轮起止日期;新增日期计算在本修复单范围外,不靠渲染层推算。
## 既有 API 断言变更(三栏说明)
证据取自脱敏历史 `git diff f77a1b5a bbd96d3b -- frontend/tests/personal-report-api.test.ts`,未读取旧泄漏提交或私有输入。目标用例为 `failed report reads aggregate existing section error codes without importing generation`。
| 原值 | 新值 | 原因 |
| --- | --- | --- |
| `assert.match(createRoute, /select\("request_id, status, last_error_code"\)/)` | `assert.match(createRoute, /select\("request_id, section_id, status, last_error_code"\)/)` | 列表聚合必须读取 `section_id`,识别并排除服务端计算快照;保留请求、状态、错误码三列,不删既有检查目的 |
| 无专门的快照行过滤断言 | 新增 `assert.match(createRoute, /row\.section_id === LONGFORM_SNAPSHOT_SECTION_ID\) continue/)` | 快照不是 writer 章节,不得计入章节进度或错误聚合;这是新增约束,不是放宽断言 |
### 本轮 F1 既有断言调整
五个既有 Node 测试名称全部保留;F4/F5/F6 没有修改既有断言。
| 原值 | 新值 | 原因 |
| --- | --- | --- |
| 每个顶层表必须有行 | 顶层或子表有真实行 | 年度源没有行星位置,但有年度 Saham 子表;不得伪造顶层行 |
| `cells[1]` 等于来源路径的标量 | 每行来源可回查;逐列比较 packet 原值及两位格式 | 一行改为领域对象,原始数值不改变 |
| 六分量 42 个叶子行 | 7 个行星行,六分量与引擎合计逐列核对 | 从路径清单变为矩阵,不自行求和 |
| 八分力 108 个叶子行 | SAV 12 行、BAV 8 行 × 12 星座 | 不再列内部索引或重复总分 |
| 年度混含 `advanced_systems.sahams` | 年度位置 0 行,年度 Saham 36 行,来源 `annual_tajika_pack.sahams.data` | 本命数据不能冒充年度位置;真实缺值保留 |
| Sade Sati 6 个叶子行 | 3 个阶段行,当前状态移到说明 | 隐藏内部字段,日期缺口保留 |
新增断言包括完整主运年数与余额分离、删除 full_years 后不得补算、blocked 不升级、旧快照兼容、子表列数/来源/重复 id 拒绝。Python 新增子表合同兼容回归。共享规则打包测试修正 CWD 隔离,不改业务或断言。
## 验证账本
### 前轮独立验收(引用,不是本轮重跑)
来源为 [修复单的验收结论](TASK-report-density-fix-20260923.md#验收结论)。以下用于追踪前轮基线,不将前轮通过移植为修复版通过。
| 检查 | 前轮记载 |
| --- | --- |
| Node 22 全量前端 | 基线 3,698 条 / 26 失败;原实现 3,730 条 / 26 失败;失败名单逐条一致 |
| tsc / lint | 0 错 / 0 error |
| Python 定向 | 88 passed,含 API server 增长合同 |
| 构建 | `/` Static;首屏 gzip 623,288 → 623,329 B(+0.007%) |
| Python 快速门 | 隐私门新增失败;不是通过 |
### 本轮修复验证(主会话独立复验,2026-09-23)
| 检查 | 状态 / 待补证据 |
| --- | --- |
| F1 可见格、来源回查、主运年数 | 报告整批 Node 定向 165/165;最终 facts/打印/普通投影/布局安全复验 29/29。完整年数直接取 full_years;缺年度位置留空。没有修改普通投影实现 |
| F2 隐私扫描 | F2 执行报告:精确登记及反例 62 passed / 1 deselected;完整专项使用 audit hook 禁读 `pending_packets`,62 pass / 1 fail(17 个保护文件 READ_ERROR),其余 4,647 文件无命中。**完整门未绿**;本轮未重跑引擎,独立复现依据来自修复单已有验收 |
| F4 双语言一致性与页码归零 | 主会话 Node/Python 定向通过,完整真实引擎虚构 fixture 两端逐字一致、页码归零;普通投影安全复验通过 |
| F5 writer 拒绝与变异 | 主会话独立回归包含 Markdown、HTML、顶层及嵌套 factTables 拒绝与正常文字。执行代理隔离去 guard 的变异:4 个负例全红,2 个正常对照仍绿;未在共享产品文件上变异 |
| F6 打印行为 | 4 条单测通过;Chrome 153 实际组件隔离页 28/28,通过原生 printToPDF 验证打印前展开与打印后恢复。两份 A4 PDF 各 5 页、各 130/130 行完整;不是登录 E2E,也未真人操作取消对话框 |
| tsc / lint | 最终集成 tsc 0 错,lint 0 error / 119 warning;本轮新增 warning 已清理,不顺修旧 warning |
| 全量前端 | Node 22 / Windows 基线 3,686 tests / 3,595 pass / 91 fail;修复版已执行,名称及失败原因比对另列。部分文件组受 symlink 失败影响;不能拿前轮 Linux 3,730 当本轮达标证据 |
| build / Static / gzip | 本轮 webpack 编译和构建内 TypeScript 通过;收集 /api/consult、/api/birth-time-guide 配置时因 SKILL.md symlink EPERM 退出 1。完整构建未通过,Static 与 gzip 未验证,不沿用前轮结果 |
| 数据库 | 两项实际执行均在 Docker 地址池耗尽处停止,未到 SQL;不能记数据库通过,未清其他会话网络 |
| Python 定向 / quick | 主会话最终 101/101 通过。首次定向 98 通过/2 失败为新增打包测试依赖 CWD,修正 monkeypatch.chdir 后复验。F1 代理额外启动一次 quick,GBK UnicodeEncodeError 退出 1;已禁止重跑。public/commercial 未运行,完整门不能记绿 |
| 受控登录态浏览器 | 环境缺口;拟建 `docs/testing/report-density-20260922.md` 被工具拒绝,文件尚未生成,不能视为清单齐备 |
| staging 推送 / 门禁 / health | 未执行;不预写 SHA、门禁绿或部署成功 |
### 同机全量 Node 名称与失败原因对比
| 指标 | 基线 | 修复版 |
| --- | ---: | ---: |
| tests | 3,686 | 3,704 |
| pass | 3,595 | 3,613 |
| fail | 91 | 91 |
| 消失的既有测试名称 | — | 0 |
| 新增测试名称 | — | 18(全部通过) |
| 新增失败 | — | 0 |
只读核对两份本轮日志,包含缩进嵌套 TAP 名称多重集合;91 个既有失败的完整诊断逐项一致。仅归一工作树前缀、临时随机目录、Docker 项目 PID/时间、时长和临时 alias 路径段,不删除断言值、错误码、栈行或 Skill 哈希。4 个只报 test failed 的文件组另查前置 stderr,两侧同为 Skill alias EPERM。**3,704 仍低于修复单要求的 3,730;只能证明本机无名称丢失和新增失败,不能宣布完整门达标。**
本轮 `pre_work_check` 远端 verified;focused 仍有一条既有 workbuddy 镜像路径断言失败,不记预检全绿。
### 打印证据与执行边界
证据在本轮忽略目录 `scratch/browser-f1-f6-20260923-acceptance/`:`browser-evidence.json`、`pdf-evidence.json`、`facts-default-collapsed.pdf`、`facts-mixed-state.pdf`。真实组件与完整产品 CSS,独立新建 Chrome profile,没有账号或 Cookie。8 组、11 张实际网格、130 行、545 单元格;两份 PDF 全行核对、无页面外裁切、无可见工程键/下标/超精度。非阻断排版细节:SAV 标题留在第 1 页末尾,表从第 2 页继续;未缺内容。隔离页不等于登录后完整报告或真人打印对话框验收。
F1 子代理额外运行 quick 时没有继承禁读 audit hook,输出有保护目录路径的清单枚举;其在 `validate_bphs_invariants.py` GBK 编码错误处停止,没有 pytest/隐私扫描启动证据。**无法保证此前子进程未读取保护目录,不能宣称这次全程禁读已获证实。** 主会话收到报告即禁止重跑,代理确认没有启动 UTF-8 重跑。不得为补门禁读取这些文件、修改隐私规则或静默跳过后记通过。
F3 新建真人清单时收到工具拒绝:子代理不得写 report 文件。未重试、未换工具绕过,已通知主会话;授权要求与工具边界由产品处理。拟验收项目为:新报告及刷新恢复、16 盘桌面 / 移动布局、8 组逐表与来源核对、独立附录及普通下载与修复前逐字比较、全部表折叠时按钮和 Ctrl+P 打印 / 保存 PDF、实际页数、打印完成 / 取消后恢复原开合状态、混合开合恢复,以及旧报告兼容 / 旧缓存不回填。当前无执行证据,不能勾选通过。
F3 文档自检已执行:限定授权文档的 `git diff --check` 通过;脚本比较确认 BUG-1008 段落与 HEAD 原样一致、BUG-1003~1010 各出现一次、BLOCKED / CHANGELOG 不再含过时的“未提交、推送”说法、PROGRESS 存在、真人清单确实仍缺。未读取 `pending_packets`,未运行完整隐私扫描、未改代码、未提交或推送。
上述自检不能替代代码、浏览器或部署验收;真人清单文件缺失意味着 F3 验收尚未完全满足。阻塞项统一见根目录 [BLOCKED.md](../../BLOCKED.md)。
+2 -2
View File
@@ -169,8 +169,8 @@
| 任务书 | 进度 | 主题 | 状态 | 落点 |
| --- | --- | --- | --- | --- |
| `TASK-report-density-20260922.md` | `PROGRESS-report-density-20260922.md` | **报告信息密度与原始附录(BUG-1003~1007)**:与源头仓 PL9 全量报告同资料实测:对照 847,632 字符 / 8,044 表格行,我方 309,357 / 1,478。缺口不在引擎——20 张分盘全表、KP 四表、Ashtakavarga 四类、Shadbala 六分量、Avastha、Sahams、年度都已算得出,但 `personal-report-contract.ts` 的 `REPORT_SECTION_KINDS` **没有表格类型**、`CHART_IDS` 只有 9 种,这些表在产品页报告里没有落脚字段。另测出对外原始附录泄漏 925 种 / 3,797 处工程标识符(`parameter_sensitive` 697、`cmd_full_reading` 68、`PyJHora`/`JHora` 35、`PL9` 页码 59),对照物同项为 0。**产品 2026-09-22 三点拍板**:层 1 按 8 组表 + 分盘扩到 16 张;层 2 原始附录直接给 C 端且先全显示;B 类大运族要显示。**决策记录已写明推翻 BUG-999 的两条红线**(专业参考不得作普通下载 fallback;`parameter_sensitive`/「参数敏感」命中整行剔除)——**仅限附录通道**,普通正文投影不动。硬红线:表格层服务端装配、writer 不得写表;对照物的替代大运族日期与 Shadbala 分量在源头仍未闭环(506 行 date mismatch、`production_tuning_allowed=false`),不得照搬升级。让步顺序与串行依赖(任务 3 → 任务 4 同改契约)见任务书 | **验收未通过**(2026-09-23):任务 1/2/4/5 通过;任务 3 事实表在普通报告里显示 447 个引擎键路径(P1);隐私门新增失败(任务书自身写入真实出生资料 BUG-1008 已清 HEAD,fixture 数值碰撞待登记);BUG-1003~1007、PROGRESS、testing 清单缺失。Node 22 前端 0 新增失败、`/` Static、gzip +0.007% | 实现 `bbd96d3b`(原 `f968cb21`,09-23 为清除 BUG-1008 重写历史;已在 staging,未部署);修复单 `TASK-report-density-fix-20260923.md` |
| `TASK-report-density-fix-20260923.md` | — | **报告密度验收修复单(BUG-1009/1010 + 补写 1003~1007)**:F1 事实表改成真正的表(逐组规定列,普通报告可见格 0 个引擎键 / 0 个下标 / 最多 2 位小数,`sourcePath` 保留供回查;主运年数不得填出生剩余年数);F2 按既有机制登记 fixture 的数值碰撞(已独立重跑确认是虚构输入);F3 补 Bug 历史 / PROGRESS / 真人清单并更正「未提交推送」;F4 两份清洗规则只留一份(Python 版漏第三方页码);F5 writer 写表拦截补测试与提示;F6 事实表可打印。硬红线:不得弱化隐私扫描、不得强推或重写 staging(历史清除由产品负责人决定);Sade Sati 三轮日期是原任务书错误、不在本单 | **待领取** | — |
| `TASK-report-density-20260922.md` | `PROGRESS-report-density-20260922.md` | **报告信息密度与原始附录(BUG-1003~1007)**:与源头仓 PL9 全量报告同资料实测:对照 847,632 字符 / 8,044 表格行,我方 309,357 / 1,478。缺口不在引擎——20 张分盘全表、KP 四表、Ashtakavarga 四类、Shadbala 六分量、Avastha、Sahams、年度都已算得出,但 `personal-report-contract.ts` 的 `REPORT_SECTION_KINDS` **没有表格类型**、`CHART_IDS` 只有 9 种,这些表在产品页报告里没有落脚字段。另测出对外原始附录泄漏 925 种 / 3,797 处工程标识符(`parameter_sensitive` 697、`cmd_full_reading` 68、`PyJHora`/`JHora` 35、`PL9` 页码 59),对照物同项为 0。**产品 2026-09-22 三点拍板**:层 1 按 8 组表 + 分盘扩到 16 张;层 2 原始附录直接给 C 端且先全显示;B 类大运族要显示。**决策记录已写明推翻 BUG-999 的两条红线**(专业参考不得作普通下载 fallback;`parameter_sensitive`/「参数敏感」命中整行剔除)——**仅限附录通道**,普通正文投影不动。硬红线:表格层服务端装配、writer 不得写表;对照物的替代大运族日期与 Shadbala 分量在源头仍未闭环(506 行 date mismatch、`production_tuning_allowed=false`),不得照搬升级。让步顺序与串行依赖(任务 3 → 任务 4 同改契约)见任务书 | **验收未通过**(2026-09-23):任务 1/2/4/5 通过;任务 3 事实表在普通报告里显示 447 个引擎键路径(P1);隐私门新增失败(任务书自身写入真实出生资料 BUG-1008 已清 HEAD,fixture 数值碰撞待登记);当时 BUG-1003~1007、PROGRESS、testing 清单缺失;F3 现已补前两项,testing 新建受工具边界阻塞仍缺。Node 22 前端 0 新增失败、`/` Static、gzip +0.007% | 实现 `bbd96d3b`(原 `f968cb21`,09-23 为清除 BUG-1008 重写历史;已在 staging,未部署);修复单 `TASK-report-density-fix-20260923.md` |
| `TASK-report-density-fix-20260923.md` | `PROGRESS-report-density-20260922.md` | **报告密度验收修复单(BUG-1009/1010 + 补写 1003~1007)**:F1 事实表改成真正的表(逐组规定列,普通报告可见格 0 个引擎键 / 0 个下标 / 最多 2 位小数,`sourcePath` 保留供回查;主运年数不得填出生剩余年数);F2 按既有机制登记 fixture 的数值碰撞(已独立重跑确认是虚构输入);F3 补 Bug 历史 / PROGRESS / 真人清单并更正「未提交推送」;F4 两份清洗规则只留一份(Python 版漏第三方页码);F5 writer 写表拦截补测试与提示;F6 事实表可打印。硬红线:不得弱化隐私扫描、不得强推或重写 staging(历史清除由产品负责人决定);Sade Sati 三轮日期是原任务书错误、不在本单 | **执行中**:F1/F2/F4/F5 分工实施,F6 与独立验收由主会话负责;F3 已补 Bug / 进度 / API 断言三栏,真人清单新建被工具拒绝,文件仍缺。隐私专项因禁读保护文件尚未全绿;未写浏览器或部署通过 | `codex/report-density-fix-20260923`,基线 `0d37bec15`;BUG-1008 原样保留 |
| `TASK-report-sectioned-generation-20260830.md` | `PROGRESS-report-sectioned-20260830.md` | 分章节生成 | 已合入 | 见 PROGRESS |
| `TASK-report-skill-parity-20260901.md` | `PROGRESS-report-skill-parity-20260901.md` | 内容对齐 skill 解读深度 | 已验收 | `90bad10d`、`ef1bd6df` |
| `TASK-report-blocked-repairs-20260902.md` | `PROGRESS-report-blocked-repairs-20260902.md` | 全主题 blocked 修复 | 已验收 | `7faf8555` |
@@ -6,6 +6,12 @@
- 开发分支:`codex/report-density-20260922`,worktree `.worktrees/report-density-20260922`
- 对照物:用户在本机提供的一份对照报告 Markdown(不入仓,路径与文件名含个人信息,不在此记录),由**源头 skill 仓** `/workspace/yinduzhanxing` 的 `scripts/pl9_bilingual_batch_export.py` → `jyotish_engine.py` 生成。它对标商业软件 Parashara's Light 9 的 204 页报告。
## 执行状态(2026-09-23)
原实现 `bbd96d3b` 已提交并进入 staging,但原验收未通过;当前从 `0d37bec15` 在独立工作树执行 [验收修复单](TASK-report-density-fix-20260923.md)。实施与验证见 [进度记录](PROGRESS-report-density-20260922.md)。F3 新建真人清单被工具拒绝、文件仍缺,不能记为文档齐备;无受控浏览器或本轮部署通过结论。
范围更正:任务 3 的 Sade Sati 源数据只有阶段框架和当前状态,没有三轮起止日期;原“已逐项确认存在”的日期部分有误,新增日期计算按修复单明确列为范围外。下文保留原事故与规格历史,不作为该能力已完成的证据。
## 事故实证
### 一、对照物与我方同一组出生资料实测
@@ -7,7 +7,13 @@
- 修复分支:`codex/report-density-fix-20260923`,从 `origin/staging` 起
- 验收基线:`f77a1b5a`(实现的父提交)
## 验收结论
## 执行状态(2026-09-23)
- **执行中**:已 fetch 并从 `0d37bec15` 创建独立工作树 `.worktrees/report-density-fix-20260923`,分支 `codex/report-density-fix-20260923`。下方验收结论是对原实现 `bbd96d3b` 的历史验收,不是本轮修复通过。
- F1/F2/F4/F5 分工实施;F6 与独立验收由主会话负责。F3 补 Bug 历史、进度、索引和 API 既有断言三栏;**真人清单新建被工具拒绝,文件仍不存在,F3 尚未全部完成**。不换工具绕过。
- 实际结果与缺口见 `docs/tasks/PROGRESS-report-density-20260922.md`、`BLOCKED.md`。没有受控登录 / Chrome 证据,不预写测试成功或部署;BUG-1008 不改。
## 验收结论(原实现)
| 项 | 结论 | 证据 |
|---|---|---|