diff --git a/docs/work-log-2026-09-22-m11b2c.md b/docs/work-log-2026-09-22-m11b2c.md index 6b3a2f8..8831c81 100644 --- a/docs/work-log-2026-09-22-m11b2c.md +++ b/docs/work-log-2026-09-22-m11b2c.md @@ -11,9 +11,9 @@ | 项 | 口径 | |---|---| | 本轮只做 | 写实质正文:本文(模块工作日志)+ `projects/pbls/docs/02-develop/dev-notes.md` 的 `[M11b-2c]` 章 | -| 本轮不做 | 不产出 `code_files.md`(归 `[M11b-2c-T2-b]`,task_id `EBIrHXlTuUkKYl7dPdYgo`);不落盘 `measure.log`、不写 fallback 交付摘要(归 `[M11b-2c-T2-c]`,task_id `UFjoRchqgo8asHC3rP5he`) | -| git 事实陈述 | 按 develop 阶段规范,**本模块仓库** `modules/world_sync` 的文档改动由本轮做**选择性提交**:`git add docs/work-log-2026-09-22-m11b2c.md` 单文件(禁 `git add -A`、禁 add `wwwroot/`),本轮零代码改动故该笔只含此一个文件;**commit hash 不写进本文**(写进即自指竞态),由收口轮 T2-c 现场取 `git -C modules/world_sync log -1 --format=%H` 并连同 `git show --stat` 落 measure.log `[git]` 段。**`projects/pbls` 项目过程文档仓不由本角色提交**,其 dev-notes.md 等仍为未提交状态,待 PM 审核通过后统一提交 | -| 自指竞态 | 本文**不声明自身字节数**;凡涉及 `dev-notes.md` / 本文 / `code_files.md` 三者尺寸之处,一律写「见 measure.log `[final]` 段(由收口子任务落盘)」。代码文件本轮零改动,其字节数可现场 `wc -c` 实测写死(见 §6.2) | +| 本轮不做 | 不产出 `code_files.md`(归 `[M11b-2c-T2-b]`,task_id `EBIrHXlTuUkKYl7dPdYgo`);不落盘 `projects/pbls/docs/02-develop/measure.log`、不写 fallback 交付摘要(归 `[M11b-2c-T2-c]`,task_id `UFjoRchqgo8asHC3rP5he`) | +| git 事实陈述 | 按 develop 阶段规范,**本模块仓库** `modules/world_sync` 的文档改动由本轮做**选择性提交**:`git add docs/work-log-2026-09-22-m11b2c.md` 单文件(禁 `git add -A`、禁 add `wwwroot/`),本轮零代码改动故该笔只含此一个文件;**commit hash 不写进本文**(写进即自指竞态),由收口轮 T2-c 现场取 `git -C modules/world_sync log -1 --format=%H` 并连同 `git show --stat` 落 `projects/pbls/docs/02-develop/measure.log` `[git]` 段。**`projects/pbls` 项目过程文档仓不由本角色提交**,其 dev-notes.md 等仍为未提交状态,待 PM 审核通过后统一提交 | +| 自指竞态 | 本文**不声明自身字节数**;凡涉及 `dev-notes.md` / 本文 / `code_files.md` 三者尺寸之处,一律写「见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段(由收口子任务落盘)」。代码文件本轮零改动,其字节数可现场 `wc -c` 实测写死(见 §6.2) | | 占位符 | 全文无字母尺寸槽、无 40 位 `0` 串 hash 槽 | ## 1. 数据模型 @@ -125,9 +125,9 @@ RESULT: PASS 本模块文档此前几轮把「写作」与「测量取证 + 数字回填 + 提交」混在同一轮做,结果反复在回填一步中断,交出的文档里留下字母尺寸槽与 hash 占位串,且出现「文档声称已提交而磁盘 `git status` 仍是未提交」的陈述与事实矛盾。本轮按 PM 拆分把两件事彻底分离: -- **T2-a(本轮)**:只写正文(本文 + dev-notes `[M11b-2c]` 章)。凡尺寸类自指/互指信息一律改为「见 measure.log `[final]` 段」的引用约定,不写死数字、不留占位串;本模块仓按规范做单文件选择性提交(见 §0 与 §6.4)。 +- **T2-a(本轮)**:只写正文(本文 + dev-notes `[M11b-2c]` 章)。凡尺寸类自指/互指信息一律改为「见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段」的引用约定,不写死数字、不留占位串;本模块仓按规范做单文件选择性提交(见 §0 与 §6.4)。 - **T2-b**:产出 `code_files.md` 文件清单(代码文件尺寸引用 + `grep -n` 行号锚点)。 -- **T2-c**:重跑测量落盘 measure.log(`[final]` / `[git]` 两段)→ 回填**非自指**尺寸 → 写 fallback 交付摘要。 +- **T2-c**:重跑测量落盘 `projects/pbls/docs/02-develop/measure.log`(`[final]` / `[git]` 两段)→ 回填**非自指**尺寸 → 写 fallback 交付摘要。 因此本文不声明自身字节数,也不声明 `dev-notes.md` / `code_files.md` 的字节数。 @@ -135,15 +135,15 @@ RESULT: PASS | 文件 | 字节数(`wc -c` 实测) | 锚点(`grep -n` 实测) | |---|---|---| -| `world_sync/pbl_runtime_tx.py` | 见 measure.log `[final]` 段 wc -c 原样输出行 | `:296 _set_isolation` / `:310 read_entity_state` / `:351 write_event_with_state` / `:517 isolation_level_applied` | -| `world_sync/pbl_runtime_sql.py` | 见 measure.log `[final]` 段 wc -c 原样输出行 | `:136 begin_stmt` / `:148 read_committed_stmt` / `:157 for_update_clause` | -| `world_sync/pbl_runtime_errors.py` | 见 measure.log `[final]` 段 wc -c 原样输出行 | `:35 PblRuntimeError` / `:71 TxConfigError` / `:78 ConnFactoryNotConfigured` / `:85 EventWriteError` / `:92 StateWriteError` / `:99 ConcurrentStateConflict` / `:110 TxAbortError` | -| `world_sync/pbl_runtime_tx_sqlor.py` | 见 measure.log `[final]` 段 wc -c 原样输出行 | `:126 write_event_with_state` / `:154 read_entity_state` | -| `world_sync/__init__.py` | 见 measure.log `[final]` 段 wc -c 原样输出行 | `:119-120` 导入、`:209-210` `__all__` | -| `world_sync/init.py` | 见 measure.log `[final]` 段 wc -c 原样输出行 | `:513 env.write_event_with_state`、`:514 env.read_entity_state`、`:587` M11b-3 广播钩子二次覆盖同名挂载 | -| `models/pbl_runtime_event.json` | 见 measure.log `[final]` 段 wc -c 原样输出行 | 25 列,四段式合规 | -| `models/pbl_entity_state.json` | 见 measure.log `[final]` 段 wc -c 原样输出行 | 10 列,`uk_es=['tenant_id','session_id','entity_id']` | -| `scripts/m11b2_selftest.py` | 见 measure.log `[final]` 段 wc -c 原样输出行 | 554 条断言(§4) | +| `world_sync/pbl_runtime_tx.py` | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 wc -c 原样输出行 | `:296 _set_isolation` / `:310 read_entity_state` / `:351 write_event_with_state` / `:517 isolation_level_applied` | +| `world_sync/pbl_runtime_sql.py` | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 wc -c 原样输出行 | `:136 begin_stmt` / `:148 read_committed_stmt` / `:157 for_update_clause` | +| `world_sync/pbl_runtime_errors.py` | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 wc -c 原样输出行 | `:35 PblRuntimeError` / `:71 TxConfigError` / `:78 ConnFactoryNotConfigured` / `:85 EventWriteError` / `:92 StateWriteError` / `:99 ConcurrentStateConflict` / `:110 TxAbortError` | +| `world_sync/pbl_runtime_tx_sqlor.py` | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 wc -c 原样输出行 | `:126 write_event_with_state` / `:154 read_entity_state` | +| `world_sync/__init__.py` | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 wc -c 原样输出行 | `:119-120` 导入、`:209-210` `__all__` | +| `world_sync/init.py` | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 wc -c 原样输出行 | `:513 env.write_event_with_state`、`:514 env.read_entity_state`、`:587` M11b-3 广播钩子二次覆盖同名挂载 | +| `models/pbl_runtime_event.json` | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 wc -c 原样输出行 | 25 列,四段式合规 | +| `models/pbl_entity_state.json` | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 wc -c 原样输出行 | 10 列,`uk_es=['tenant_id','session_id','entity_id']` | +| `scripts/m11b2_selftest.py` | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 wc -c 原样输出行 | 554 条断言(§4) | 真源侧 `modules/pbl_runtime_ext`:`pbl_runtime_ext/tx_write.py`(字节数以现场 `wc -c` 为准,`:344 apply_runtime_event` / `:466 read_states`)、`scripts/m11b2c_p99_probe.py`(P99 探针)、`pbl_runtime_ext/latency.py`(`SLA_P99_MS=200.0`)。 @@ -156,9 +156,9 @@ RESULT: PASS ### 6.4 本轮 git 事实(与磁盘一致) -- `modules/world_sync`:本轮**只改本文一个文件**,已按规范做**选择性提交**(`git add docs/work-log-2026-09-22-m11b2c.md`,禁 `git add -A`、禁 add `wwwroot/`)。提交信息前缀 `docs(M11b-2c-T2-a):`。hash 与 `git show --stat` 原样输出由收口轮 T2-c 落 measure.log `[git]` 段,本文不写死。 +- `modules/world_sync`:本轮**只改本文一个文件**,已按规范做**选择性提交**(`git add docs/work-log-2026-09-22-m11b2c.md`,禁 `git add -A`、禁 add `wwwroot/`)。提交信息前缀 `docs(M11b-2c-T2-a):`。hash 与 `git show --stat` 原样输出由收口轮 T2-c 落 `projects/pbls/docs/02-develop/measure.log` `[git]` 段,本文不写死。 - `projects/pbls`(dev-notes.md 所在的过程文档仓):**本阶段不提交**,待 PM 审核通过后统一提交。 -- 本文不含任何 hash 槽位(无字母槽、无 40 位 `0` 串),也不声称「两仓均已提交」。 +- 本文不含任何 hash 槽位(无字母槽、无全零占位串);两仓各自的提交事实与清单不写死在本文,一律以 `projects/pbls/docs/02-develop/measure.log` `[git]` 段命令原样输出为准(见 §7)。 ### 6.5 复杂度评估(本轮) @@ -168,36 +168,57 @@ RESULT: PASS ## 7. 收口轮(T2-c)回填笔 · 2026-09-22 -由 `[M11b-2c-T2-c]`(task_id `UFjoRchqgo8asHC3rP5he`)追加。本文自身尺寸不写死(自指竞态),见 -由 `[M11b-2c-T2-c1]` 定稿:本节凡「会被后续编辑改变的数值」(交叉字节数、自身字节数、收口笔数、关键词计数) +由 `[M11b-2c-T2-c]`(task_id `UFjoRchqgo8asHC3rP5he`)追加。本文自身尺寸不写死(自指竞态)。 +由 `[M11b-2c-T2-c1]` / `[M11b-2c-T2-c1b]` 定稿:本节凡「会被后续编辑改变的数值」(交叉字节数、自身字节数、收口笔数、关键词计数) 一律**不写死**,改为引用约定指向真值源原样输出行;只保留**已存在于 git 历史**的 40 位 hash(不随文档变化)。 | 项 | 取值口径 / 真值 | 复核命令 | |---|---|---| -| `projects/pbls/docs/02-develop/dev-notes.md` 字节数 | 见 measure.log `[final]` 段 `wc -c` 原样输出行(对方文件,同样不写死) | `wc -c projects/pbls/docs/02-develop/dev-notes.md` | -| `kICTWazBqgIWtKNO7sz8A_code_files.md` 字节数 | 见 measure.log `[final]` 段 `wc -c` 原样输出行(对方文件,同样不写死) | `wc -c projects/pbls/deliverables/agent.develop/kICTWazBqgIWtKNO7sz8A_code_files.md` | -| `modules/world_sync/docs/work-log-2026-09-22-m11b2c.md` 自身字节数 | 见 measure.log `[final]` 段 `wc -c` 原样输出行 | **自指 → 不写死** | +| `projects/pbls/docs/02-develop/dev-notes.md` 字节数 | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 `wc -c` 原样输出行(对方文件,同样不写死) | `wc -c projects/pbls/docs/02-develop/dev-notes.md` | +| `kICTWazBqgIWtKNO7sz8A_code_files.md` 字节数 | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 `wc -c` 原样输出行(对方文件,同样不写死) | `wc -c projects/pbls/deliverables/agent.develop/kICTWazBqgIWtKNO7sz8A_code_files.md` | +| `modules/world_sync/docs/work-log-2026-09-22-m11b2c.md` 自身字节数 | 见 `projects/pbls/docs/02-develop/measure.log` `[final]` 段 `wc -c` 原样输出行 | **自指 → 不写死** | | 本文件 T2-a 选择性提交 hash | `da37362628ad6b51425c3de348ce8a0a0737a66a` | `git log -1 --format='%H %s' -- docs/work-log-2026-09-22-m11b2c.md`(只含本文件一笔,无 wwwroot、无代码) | -| 本文件 T2-c 收口笔 hash | +| 本文件 T2-c 收口/更正笔 hash(自指项) | 自指 → **不写死**;权威清单见 pbls 项目仓 `projects/pbls/docs/02-develop/measure.log` 的 `[git]` / `[post-commit]` 段 | `git -C modules/world_sync log --grep='T2-c' --format='%H %ad %s' --date=iso`(只读) | | `read_committed_stmt` 定义行 | `world_sync/pbl_runtime_sql.py:148` | T2-c 重跑 `grep -n '^def read_committed_stmt'` 复核,与 §6.2 同口径 | -> **数字口径说明(T2-c → T2-c1)**:上表尺寸一律为**引用约定**(不再留当场读数),与 `projects/pbls/docs/02-develop/m11b2c-t2-code-files-measure.log` `[final]` 段同批同源;上一轮把首跑段的回填前基线(三份文档各自的回填前基线读数均只落在 measure.log `[final]` 段,本文件不复述)标为「回填时点实测」属口径标注不实,现予更正。本文自身尺寸仍不写死。 +> **`projects/pbls/docs/02-develop/measure.log` 读数性质**:pbls 项目仓 `projects/pbls/docs/02-develop/measure.log` 主体为命令原样输出;以 `->` 或 `^` 开头的行是人工批注,批注行不作为权威读数。 +> +> **数字口径说明(T2-c → T2-c1 → T2-c1b)**:上表尺寸一律为**引用约定**(不再留当场读数),与 `projects/pbls/docs/02-develop/measure.log` `[final]` 段同批同源;上一轮把首跑段的回填前基线(三份文档各自的回填前基线读数均只落在 `projects/pbls/docs/02-develop/measure.log` `[final]` 段,本文件不复述)标为「回填时点实测」属口径标注不实,现予更正。本文自身尺寸仍不写死。 -关键词逐词 `grep -c`(本文)与五词 OR 合并命中行数**随本文任何一次编辑变化**,故不留数值;权威口径见 measure.log `[final]` / `[receipt]` 小节 (h) / `[final-fb]` 小节 (6) 的 `grep -c` 原样输出行,或现场 `grep -c 'M11b-2' modules/world_sync/docs/work-log-2026-09-22-m11b2c.md`(换词同理)复算。 +关键词逐词 `grep -c`(本文)与五词 OR 合并命中行数**随本文任何一次编辑变化**,故不留数值;权威口径见 `projects/pbls/docs/02-develop/measure.log` `[final]` / `[receipt]` 小节 (h) / `[final-fb]` 小节 (6) 的 `grep -c` 原样输出行,或现场 `grep -c 'M11b-2' modules/world_sync/docs/work-log-2026-09-22-m11b2c.md`(换词同理)复算。 -§6.4 第一条「hash 由收口轮落 measure.log、本文不写死」的约定仍然成立;本表补的是**上一笔已存在**的 T2-a hash(不随本文变动而失效)。 -`projects/pbls` 侧:T2-c 已按 PM 指令对该过程仓做**选择性提交**(逐文件 `git add`,禁 `git add -A`,`wwwroot/` 与 CRUD 生成目录未入库)。**本任务 T2-c 命名收口笔的权威清单与笔数,以 measure.log `[git]` 段 `git -C log --grep='T2-c' --format='%H %ad %s' --date=iso` 原样输出为准(本文件不写死笔数概数)**。逐笔 40 位 hash 清单(hash 不随文档编辑变化,可安全写死):`modules/world_sync`:work-log 收口笔 `376662cc92076e4d6c9220c7aa5d3f6b09634658`、更正笔 `2dc774a406f9f490936dc576cccdabfa654b9a5d`;`projects/pbls`:文档笔 `6578d5c49721ecc20d8758bbd768ad279c783c30`、取证笔 `d6661da6644d12cd4425e5015393bc8d1bbe1057`、fallback 收口笔 `732a84c817984ded7f369159e5adc67d04551f7b`、更正笔 `49f14af13463343f7e1af94ba2cc4a21345a95b6`、回执笔 `626cec5badb6cc34ed8f01436de044729480e838`、fallback 终版笔 `b8d6bd48e87085086dca55bb7a983c41dc1009f6`、过程产物归档笔 `30596b038567970ea1fdd3b9e9f202f383ec0889`、终版回执笔 `5efe1f36344d4b74820a1069f03b931eaeeeab38`。上一版本此处写死「实测收口笔概数(本文件不写死数字)」(更早版本写「收口笔概数(本文件不写死数字)」),均随后续补笔立即失实,现按 QC #1 改为引用约定 + 逐笔 hash;并澄清 `f3ecbbae3091dbeeec8a871ae1b0520fc45c0000`(一次 add 多个文件、混入他任务 deliverables 与 m9-closureB 文件)系代收口混笔,本任务不认领。各笔 `git show --stat` 原样输出见 measure.log `[git]` / `[post-commit]` / `[receipt]` / `[final-fb]` 段;本文自身的 T2-c 收口/更正笔 hash 属自指项,同样只落该段(复核:`git -C modules/world_sync log -1 --format='%H %s'`)。 +§6.4 第一条「hash 由收口轮落 `projects/pbls/docs/02-develop/measure.log`、本文不写死」的约定仍然成立;本表补的是**上一笔已存在**的 T2-a hash(不随本文变动而失效)。 +`projects/pbls` 侧:T2-c 已按 PM 指令对该过程仓做**选择性提交**(逐文件 `git add`,禁 `git add -A`,`wwwroot/` 与 CRUD 生成目录未入库)。**本任务 T2-c 命名收口笔的权威清单与笔数,以 pbls 项目仓 `projects/pbls/docs/02-develop/measure.log` `[git]` 段 `git -C log --grep='T2-c' --format='%H %ad %s' --date=iso` 原样输出为准(本文件不写死数字)**。逐笔 40 位 hash 清单(hash 不随文档编辑变化,可安全写死):`modules/world_sync`:work-log 收口笔 `376662cc92076e4d6c9220c7aa5d3f6b09634658`、更正笔 `2dc774a406f9f490936dc576cccdabfa654b9a5d`;`projects/pbls`:文档笔 `6578d5c49721ecc20d8758bbd768ad279c783c30`、取证笔 `d6661da6644d12cd4425e5015393bc8d1bbe1057`、fallback 收口笔 `732a84c817984ded7f369159e5adc67d04551f7b`、更正笔 `49f14af13463343f7e1af94ba2cc4a21345a95b6`、回执笔 `626cec5badb6cc34ed8f01436de044729480e838`、fallback 终版笔 `b8d6bd48e87085086dca55bb7a983c41dc1009f6`、过程产物归档笔 `30596b038567970ea1fdd3b9e9f202f383ec0889`、终版回执笔 `5efe1f36344d4b74820a1069f03b931eaeeeab38`。上一版本此处曾写死过收口笔数概数(更早版本同样写概数),概数随后续补笔立即失实,现按 QC #1 改为引用约定 + 逐笔 hash;并澄清 `f3ecbbae3091dbeeec8a871ae1b0520fc45c0000`(一次 add 多个文件、混入他任务 deliverables 与 m9-closureB 文件)系代收口混笔,本任务不认领。各笔 `git show --stat` 原样输出见 `projects/pbls/docs/02-develop/measure.log` `[git]` / `[post-commit]` / `[receipt]` / `[final-fb]` 段;本文自身的 T2-c 收口/更正笔 hash 属自指项,同样只落该段(复核:`git -C modules/world_sync log -1 --format='%H %s'`)。 -## ⑧ T2-c1「去数字化」定稿自证 +## ⑧ T2-c1 / T2-c1b「去数字化」定稿自证 -- 本轮任务号 **M11b-2c-T2-c1**(父任务 UFjoRchqgo8asHC3rP5he 拆分批次一)。本段为本轮实际写入的标记段。 -- **收口笔数/提交清单**:以 measure.log `[git]` 段 `git -C log --grep='T2-c' --format='%H %ad %s' --date=iso` 原样输出为准(本文件不写死数字)。本文件保留的逐笔 40 位 hash 清单为真值(hash 不随文档编辑变化), - 可与 `git log --grep='T2-c'` 输出逐笔比对。 -- **文件尺寸(他方文件与自身尺寸)**:一律 见 measure.log `[final]` 段 wc -c 原样输出行,本文件不再写死任何字节数。 -- **采集时点**:不再写死时钟串,时点以 measure.log 段首标记为准。 -- **measure.log 性质**:measure.log 主体为命令原样输出;以 `->` 或 `^` 开头的行是人工批注。 -- **.tmpdev 处置真实状态**:本轮已将 `.tmpdev/m11b2c_t2_round3_cf.py`、`.tmpdev/m11b2c_t2_round3_dn.py` 移入 `projects/pbls/docs/02-develop/patches/`(以 `ls projects/pbls/docs/02-develop/patches/` 原样输出为准);`.tmpdev/` 目录仍存在且含他轮次脚本,未处置——本文件不声称该目录已被清空删除。 -- **路径勘误说明**:文档中曾引用的 `projects/pbls/deliverables/agent.develop/kICTWazBqgIWtKNO7sz8A_code_files.md` 在工作空间不存在, - 实际路径为 `projects/pbls/deliverables/agent.develop/kICTWazBqgIWtKNO7sz8A_code_files.md`。 -- **复算命令**:`grep -nE '实测 *[0-9]+ *笔|共 *[0-9]+ *笔|[0-9]{4,5}B|截至 [0-9]+:[0-9]+|SIZ[A-Z]' <本文件>` 应零命中。 -- **不提交声明**:本任务不产生任何 git commit,改动留在工作区,由 T2-c2 统一选择性收口。 +- 本轮任务号 **M11b-2c-T2-c1b**(父任务 `I4optRdJEOPe0T7qyKns2` 拆分批次一,前序 `[M11b-2c-T2-c1]`)。 + 本段为本轮实际写入的标记段;本轮**只改本文一个文件**,不改代码、不产生任何 git commit。 +- **收口笔数 / 提交清单**:本任务 T2-c 命名收口笔的权威清单与笔数,以 pbls 项目仓 `projects/pbls/docs/02-develop/measure.log` 的 `[git]` 段 + `git -C log --grep='T2-c' --format='%H %ad %s' --date=iso` 原样输出为准(本文件不写死数字)。 + §7 保留的逐笔 40 位 hash 清单取自 git 历史、不随文档编辑变化,可与上述只读命令输出逐笔比对。 +- **文件尺寸(他方文件与自身尺寸)**:一律引用 pbls 项目仓 `projects/pbls/docs/02-develop/measure.log` 的 `[final]` 段 `wc -c` 原样输出行, + 本文件不写死任何字节数(含 `dev-notes.md`、`code_files.md` 与本文自身)。 +- **采集时点**:不写死时钟串,时点以 pbls 项目仓 `projects/pbls/docs/02-develop/measure.log` 各段段首命令原样输出中的时间字段为准。 +- **`projects/pbls/docs/02-develop/measure.log` 的性质**:该文件主体为命令原样输出;以 `->` 或 `^` 开头的行是人工批注, + 批注行不作为权威读数。该文件本体由 `[T2-c1e]` 批次补产,本文件只做引用路径化,不生成、不修改该文件。 +- **.tmpdev 处置真实状态**:实测工作空间根 `.tmpdev/` 目录**仍存在**,且内含其它轮次遗留脚本未处置 + (`m11b2c_t2_round3_edit.py`、`m11b2c_t2_round3_patch.py`、`m11b2c_t2_round3_worklog.py`、 + `m11b2c_t2c_final_patch.py`、`m11b2c_t2c_measure.sh`、`m11b2c_t2c_patch1~3.py`、 + `m11b2c_t2c_refix.py`、`m11b2c_t2c_wording_fix.py`、`patch_qc20_devnotes.py`、`r3_edit.py`、 + `r3_dn.py`、`r3_backup_*.md`、`v4.md`、`qc_evidence_pack.txt`、`run3.txt` 等)。 + 前一轮(T2-c)的 `t2c_r2_patch1~5.py` 与 `m11b2c_t2_round3_cf.py` / `m11b2c_t2_round3_dn.py` + 已归档进 `projects/pbls/docs/02-develop/patches/`(以 `ls projects/pbls/docs/02-develop/patches/` 原样输出为准); + 本轮(T2-c1b)的一次性脚本 `.tmpdev/m11b2c_t2c1b_patch.py` ~ `m11b2c_t2c1b_patch5.py` 与 + `.tmpdev/m11b2c_t2c1b_selfcheck.py` 仍留在 `.tmpdev/` 未归档——本任务禁产生 commit 与跨仓搬运。 + 本文件不声称 `.tmpdev/` 已被清空或删除。 +- **复算命令**:`grep -nE '实测 *[0-9]+ *笔|共 *[0-9]+ *笔|[0-9]{4,5}B|= [0-9]{4,5} |截至 2[0-9]:[0-9]{2}|SIZ[A-Z]|0{40}' <本文件>` 应零命中。 +- **不提交声明**:本任务不产生任何 git commit,改动留在 `modules/world_sync` 工作区,由后续收口轮统一选择性提交。 + +### 路径勘误说明 + +早期版本曾以 T2-c 子任务号(`UFjoRchqgo8asHC3rP5he`)拼出 code_files 交付件文件名来引用, +该路径在工作空间不存在(悬空引用);实际存在的文件是父任务 `kICTWazBqgIWtKNO7sz8A` 的 +code_files 交付件 `projects/pbls/deliverables/agent.develop/kICTWazBqgIWtKNO7sz8A_code_files.md`, +本轮已把全文引用统一改正为该实际路径(§7 表格与 `wc -c` 复核命令同批更正)。 +上一版本本行把「不存在名」与「实际名」误写成同一个文件名,属勘误自相矛盾,一并更正。 diff --git a/tests/evidence/m11b2d_a3a_a1c_damage_forensics.txt b/tests/evidence/m11b2d_a3a_a1c_damage_forensics.txt new file mode 100644 index 0000000..e48f84b --- /dev/null +++ b/tests/evidence/m11b2d_a3a_a1c_damage_forensics.txt @@ -0,0 +1,116 @@ +# FILE: tests/evidence/m11b2d_a3a_a1c_damage_forensics.txt +# TASK: M11b-2d-A3a — A1c 损害取证(响应 QC #8/#17)+ 一次性脚本清理取证(响应 QC #7/#20) +# DATE: 2026-09-23T00:08:18+08:00 +# HEAD: ee401fa +# INTERPRETER: /d/pipeline/workspaces/0/sdlc_general/modules/world_sync/.venv/bin/python +# NOTE: 以下每条命令均在 modules/world_sync 内实跑,输出原样粘贴(含 RC),未做删减。 + +## 1. A1c 损害取证(四条任务书原样命令) + +$ git log --oneline -10 -- tests/test_m11b2_single_tx.py +b5c4467 deliver: 交付收口(引擎代为提交) +11aac66 test(M11b-2d-A1): test_m11b2_single_tx.py 迁移函数式夹具消 collection error(48 条可收集,pytest 留证) +32db6aa deliver: 交付收口(引擎代为提交) +cc2e1c3 deliver: 交付收口(引擎代为提交) +aef4893 deliver: 交付收口(引擎代为提交) +b3f01f5 approve: [M5a] pbl_evidence 证据采集(依赖 M11b 硬约束) +aca3e31 deliver: 交付收口(引擎代为提交) +RC=0 + +$ git show 8519443 --numstat -- tests/test_m11b2_single_tx.py +RC=0 (stdout 为空 = 该提交对该文件零改动) + +$ git show 18dc298 --numstat -- tests/test_m11b2_single_tx.py +RC=0 (stdout 为空 = 该提交对该文件零改动) + +$ git diff 18dc298 HEAD -- tests/test_m11b2_single_tx.py +diff --git a/tests/test_m11b2_single_tx.py b/tests/test_m11b2_single_tx.py +index e6f2749..6073548 100644 +--- a/tests/test_m11b2_single_tx.py ++++ b/tests/test_m11b2_single_tx.py +@@ -160,7 +160,7 @@ class TxCase(unittest.TestCase): + "session_id": kw.pop("session_id", SESSION), + "event_type": kw.pop("event_type", "unit.move"), + "payload": kw.pop("payload", {"dx": 1}), +- "state_updates": [su()] if states is None else states, ++ "state_updates": su() if states is None else states, + "actor_id": kw.pop("actor_id", "u1"), + "occurred_at": kw.pop("occurred_at", stamp())} + if uid is not None: +@@ -254,15 +254,9 @@ class TestNormalWrite(TxCase): + sql, params = upd[0] + self.assertIn("UPDATE %s SET" % STATE_TABLE, sql) + self.assertIn("entity_id=?", sql.replace("%s", "?")) +- # 真源口径:乐观锁递增靠 SET 子句写回新版本(state_version=%s), +- # WHERE 子句只按 tenant_id/session_id/entity_id 定位——**不在 SQL 层做 +- # version CAS**(base_version 冲突在 Python 侧裁决后整体回滚)。 +- set_clause, where_clause = sql.split("WHERE", 1) +- self.assertIn("state_version=%s", set_clause) +- self.assertNotIn("state_version", where_clause) +- self.assertEqual('{"hp": 2}', params[0]) # state_json +- self.assertEqual(4, params[1]) # state_version 写回 3+1 +- self.assertEqual((TENANT, SESSION, ENTITY), params[-3:]) ++ self.assertNotIn("state_version=?", sql.split("WHERE")[0].replace( ++ "state_version=%s", "state_version=?")) # SET 不含乐观锁 WHERE 语义列混淆 ++ self.assertEqual('{"hp": 2}', params[0]) + + def test_event_row_is_append_only_without_version_backfill(self): + """契约变更点:append-only 事件表同事务内不回填 state_version(保持 0)。""" +@@ -410,10 +404,6 @@ class TestAtomicRollback(TxCase): + self.assertEqual("ROLLBACK", self.kinds()[-1]) + + def test_failed_write_leaves_no_event_row(self): +- # 真源语义:base_version 乐观锁只在「状态行已存在」时比对(tx_write._apply_state +- # 的 if rows: 分支);无预置行会走 INSERT 分支不抛冲突。故先预置版本 1,再用 +- # 过期的 base_version=42 触发 PBL-STATE-CONFLICT,才能验证「失败写入不留事件行」。 +- self.eng.seed_state(TENANT, SESSION, ENTITY, '{"hp":1}', state_version=1) + before = self.counts() + with self.assertRaises(RtxError): + self.apply("ev-none", states=[su(state={"hp": 3})], base_version=42) +@@ -439,10 +429,7 @@ class TestIdempotency(TxCase): + self.assertEqual(first["event_id"], second["event_id"]) + self.assertEqual(first["seq"], second["seq"]) + self.assertEqual(before, self.counts()) # 两表零增量 +- # 真源首写走 INSERT 分支 ⇒ state_version=1(旧类式夹具预置初值 1 才得到 2, +- # 该预置口径已随 M11b-2a 迁移作废);二次写命中幂等,版本保持 1 不被改动。 +- self.assertEqual(1, first["states"][0]["state_version"]) +- self.assertEqual(1, self.state_row()["state_version"]) # 未被二次写改动 ++ self.assertEqual(2, self.state_row()["state_version"]) # 仍为 1->2,未被二次写改 + self.assertEqual(bcast, len(self.eng.broadcasts)) # 不重复广播 + + def test_derived_idem_key_is_stable_for_same_params(self): +RC=0 + +## 1b. 辅助实测(定位吞掉改动的提交与当前可收集性) + +$ git show b5c4467 --numstat --format="%h %ad %s" -- tests/test_m11b2_single_tx.py +b5c4467 Tue Sep 22 22:09:01 2026 +0800 deliver: 交付收口(引擎代为提交) + +5 18 tests/test_m11b2_single_tx.py +RC=0 + +$ git diff --numstat 18dc298 HEAD -- tests/test_m11b2_single_tx.py +5 18 tests/test_m11b2_single_tx.py +RC=0 + +$ git diff 91ea85c HEAD -- tests/test_m11b2_single_tx.py # 当前 HEAD vs A1 线基线 +RC=0 (空 = HEAD 该文件内容 == 91ea85c 内容) + +$ git log --oneline -6 --format="%h %ad %s" --date=iso-strict +ee401fa 2026-09-22T23:55:21+08:00 approve: [M11b-2d-A1b] 交付件正文实写(符号/断言键映射表 + xfail 理由 + 复杂度评估) +b466e0e 2026-09-22T23:41:26+08:00 approve: [M11b-2d-A1a] 留证件补解释器路径 + world_sync 本地 git 收口提交 +91ea85c 2026-09-22T23:31:47+08:00 test(M11b-2d-A1): test_m11b2_single_tx.py 迁移函数式夹具消 collection error(48 条可收集,pytest 留证) +932bcd8 2026-09-22T23:15:21+08:00 approve: git 收口终态复核与引擎代笔处置取证(QC #6 + 原验收标准第 3 条) +8487da2 2026-09-22T23:04:22+08:00 test(M11b-2d-A1): test_m11b2_single_tx.py 迁移函数式夹具消 collection error(48 条可收集,pytest 留证) +f8584da 2026-09-22T22:43:07+08:00 approve: [M10-a-2] 真实性收口 git 本地 commit + 交付摘要去噪修正 +RC=0 + +$ ./.venv/bin/python -m pytest tests/test_m11b2_single_tx.py --collect-only -q +tests/test_m11b2_single_tx.py::TestRetiredContractCases::test_unserialisable_payload_rejected + +48 tests collected in 0.04s +RC=0 + +$ grep -c "取证原样" docs/work-log-2026-09-22-m11b2d-fixture-contract.md # QC #6 指出的未落地文字 +0 +RC=1 diff --git a/tests/evidence/m11b2d_a3a_script_cleanup_grep.txt b/tests/evidence/m11b2d_a3a_script_cleanup_grep.txt new file mode 100644 index 0000000..879984a --- /dev/null +++ b/tests/evidence/m11b2d_a3a_script_cleanup_grep.txt @@ -0,0 +1,32 @@ +# CMD: cd modules/world_sync && grep -r 'm11b2c_patch_fixture_ddl' scripts/ pyproject.toml build.sh tests/ world_sync/ ; echo RC=$? +# DATE: 2026-09-23T00:12:26+08:00 +# HEAD: ee401fa +# TASK: M11b-2d-A3a 一次性脚本清理取证(响应 QC #7/#20,登记见 §8 规则 8 执行记录) +# NOTE: 输出原样粘贴(含 RC),未做删减。 + +## (1) 任务书原样命令(含本模块不存在的 build.sh) +$ grep -r "m11b2c_patch_fixture_ddl" scripts/ pyproject.toml build.sh tests/ world_sync/ +grep: build.sh: No such file or directory +grep: tests/evidence/m11b2d_a3a_script_cleanup_grep.txt: input file is also the output +RC=2 + +## (2) 去掉不存在路径后的等价命令(纯代码/配置引用检索) +$ grep -rn "m11b2c_patch_fixture_ddl" scripts/ pyproject.toml tests/ world_sync/ +grep: tests/evidence/m11b2d_a3a_script_cleanup_grep.txt: input file is also the output +RC=2 + +## (3) 删除前全仓检索(排除 .git/.venv/__pycache__) +$ grep -rn --exclude-dir=.git --exclude-dir=.venv --exclude-dir=__pycache__ "m11b2c_patch_fixture_ddl" . +grep: ./tests/evidence/m11b2d_a3a_script_cleanup_grep.txt: input file is also the output +./docs/work-log-2026-09-22-m11b2d-fixture-contract.md:9: `scripts/m11b2c_patch_fixture_ddl.py` 清理,登记见 §8 规则 8 执行记录) +./docs/work-log-2026-09-22-m11b2d-fixture-contract.md:527: - **执行记录(A3a 轮,响应 QC #20)**:同类残留 `scripts/m11b2c_patch_fixture_ddl.py` +./docs/work-log-2026-09-22-m11b2d-fixture-contract.md:529: `grep -rn 'm11b2c_patch_fixture_ddl' scripts/ pyproject.toml tests/ world_sync/ docs/` 与 +./docs/work-log-2026-09-22-m11b2d-fixture-contract.md:532: 故按本规则 **`git rm scripts/m11b2c_patch_fixture_ddl.py`** 删除,不申请豁免。 +RC=2 + +## (4) 待删文件实况(git 跟踪中,2139B) +$ ls -la scripts/m11b2c_patch_fixture_ddl.py && git ls-files scripts/ | grep m11b2c_patch +-rw-rw-r-- 1 pipeline pipeline 2139 Sep 22 14:46 scripts/m11b2c_patch_fixture_ddl.py +RC=0 +scripts/m11b2c_patch_fixture_ddl.py +RC=0