|
|
@@ -8,20 +8,20 @@
|
|
|
|
|
|
每项自带修法口径(来源:父任务 prd F8-F11 + 评审核实):
|
|
|
|
|
|
-- [ ] **F8 YAML 序列化器 key 零转义**:`storage/serializers/yaml-dialect.js:18-36` value 侧转义完备但 key 原样输出;AI 可控 updates 键含 `\n`/`:` 可注入 front matter 结构。修法:key 走同等 needsQuoting/转义(优先),或 key 白名单。攻击样例进测试。
|
|
|
-- [ ] **F9 契约互斥锁无陈旧回收**:`staging/contract-invalidation.js:29-67` 进程被 kill 后锁文件永久残留,堵死全部写路径且报错不给位置/删除指引。修法:锁文件带 pid/startedAt,陈旧判定(pid 不存活或超时阈值)自动回收 + 报错文案给锁路径与人话指引。注意与 07-23 整改遗留「锁自愈」债务条目对表(`archive/2026-07/07-23-v7-global-review-remediation/research/后置债务清单.md`),若已有方案沿用其口径。
|
|
|
-- [ ] **F10 git index.lock 陈旧阈值仅 3 秒**:`state-machine/git-health.js:5`,杀软/索引器锁盘超 3 秒被误删 → 双 git 进程并发写损坏窗口。修法:阈值提到分钟级(建议 ≥60s)+ 尽可能加持锁进程存活判断;改动须过既有 git 健康检查异常样本库测试。
|
|
|
-- [ ] **F11 books.jsonl 读侧无形状校验**(**待作者裁决定级**,见 Notes):`session/index.js` 逐行 JSON.parse 不校验;`runtime/locate.js:50` 消费 `目录` 字段,写坏后 `git clean -fd`/`reset --hard`/递归 `fs.rm` 可作用于工作目录外。修法:读侧复用 `persist-book` 同款校验(书名/目录非空字符串、目录为安全相对段——可复用 P0 的 `isSafeFileStem`),坏行走既有 corrupt 计数 + 自愈回写通道。
|
|
|
-- [ ] **F12 v7 路由 #135 同构核查**(核查项,可能零改动收口):v6 的 explicit_genre_fallback 会继承首条细分流派(issue #135,master 线 PR #136 已修)。v7 路由是独立实现(`references/路由.csv` + `knowledge-pack` 固定路由,spec 决策「固定路由只归一书级名称,不选择创意答案」)。核查:书级建档只给大类题材时,知识包/契约是否会隐式继承某条子流派的调性/桥段默认值。产出:核查记录留档 research/(有问题→修复进本批,无问题→写明证据收口)。
|
|
|
+- [x] **F8 YAML 序列化器 key 零转义**:`storage/serializers/yaml-dialect.js:18-36` value 侧转义完备但 key 原样输出;AI 可控 updates 键含 `\n`/`:` 可注入 front matter 结构。修法:key 走同等 needsQuoting/转义(优先),或 key 白名单。攻击样例进测试。✅ 实施口径=白名单 throw 人话(决策 62 拒绝不改写,与嵌套检测同款姿势;覆盖 `\n`/`:`/`#`/首尾空白/引号引导/空/控制字符八类,报错指认字段名)
|
|
|
+- [x] **F9 契约互斥锁无陈旧回收**:`staging/contract-invalidation.js:29-67` 进程被 kill 后锁文件永久残留,堵死全部写路径且报错不给位置/删除指引。修法:锁文件带 pid/startedAt,陈旧判定(pid 不存活或超时阈值)自动回收 + 报错文案给锁路径与人话指引。✅ 实施按后置债务清单口径=**序0 确认流非静默回收**(pid 探测优先/EPERM 保守/30 分钟 mtime 兜底;`persistRepair` 新增 `action:'delete'` 且删除面白名单钳死只放行该锁路径;EEXIST 文案补锁路径+序 0 指引)
|
|
|
+- [x] **F10 git index.lock 陈旧阈值仅 3 秒**:`state-machine/git-health.js:5`,杀软/索引器锁盘超 3 秒被误删 → 双 git 进程并发写损坏窗口。修法:阈值提到分钟级(建议 ≥60s)+ 尽可能加持锁进程存活判断;改动须过既有 git 健康检查异常样本库测试。✅ 60s + 删除前二次 stat(git 锁不含 pid 不可判活锁,勘察修正已收窄)
|
|
|
+- [x] **F11 books.jsonl 读侧无形状校验**(**待作者裁决定级**,见 Notes):✅ 作者默认 claude 建议=留本批执行完毕——写读双侧:`registerBook` 与 `readBooksRegistry` 共用 `isValidBookEntry`(目录=`isSafeFileStem` 复用 P0 单源);形状非法行计入 corrupt 走自愈回写;写侧 8 类非法目录拒绝(含 `../../x`、`/abs`、`C:\x`、保留名)
|
|
|
+- [x] **F12 v7 路由 #135 同构核查**(核查项,可能零改动收口):✅ **零改动收口**——`research/route-isomorphism-check.md`:v7 无 fallback/默认选择机制(resolveLabel 未命中返 null 进未命中清单显式列名;别名归一走声明表非继承);实测三场景(大类/别名/显式流派对照)均无隐式携带。
|
|
|
|
|
|
## Acceptance Criteria
|
|
|
|
|
|
-- [ ] F8:注入样例(key 含 `\n`/`:`/引号)序列化后可安全 round-trip 或被拒绝;现有 front matter 全量 round-trip 测试绿。
|
|
|
-- [ ] F9:kill -9 模拟(或直接放置陈旧锁文件)后下一次写路径操作自动回收并继续;活锁(pid 存活)仍拒绝且文案含锁路径。
|
|
|
-- [ ] F10:阈值常量更新 + 存活判断测试;异常样本库全绿。
|
|
|
-- [ ] F11(若裁决执行):坏 `目录` 字段的行被拒/自愈,`locate` 不再消费越界目录;模拟坏行时定位失败给人话而非作用于仓外。
|
|
|
-- [ ] F12:核查记录含复现命令与结论。
|
|
|
-- [ ] 全量测试绿 + drift 绿;spec 回填(各项对应决策/规范条目)。
|
|
|
+- [x] F8:注入样例(key 含 `\n`/`:`/引号)序列化后被拒绝;现有 front matter 全量 round-trip 测试绿。(43/43 绿)
|
|
|
+- [x] F9:放置陈旧锁文件(pid 死/超龄)后序0 提议清理、作者确认经 persist-repair delete 清除;活锁(pid 存活)仍拒绝且文案含锁路径。(contract-lock 5 + router 2 + persist 3 绿)
|
|
|
+- [x] F10:阈值常量更新 + 5s 新鲜锁不误删 / 90s 超龄才删测试;异常样本库全绿。(git-health 7 绿)
|
|
|
+- [x] F11(裁决=执行):坏 `目录` 字段的行被拒/自愈,`locate` 不再消费越界目录;模拟坏行时定位失败给人话而非作用于仓外。(session 20 绿)
|
|
|
+- [x] F12:核查记录含复现命令与结论。(`research/route-isomorphism-check.md`,三无携带证据链)
|
|
|
+- [x] 全量测试绿 + drift 绿;spec 回填(各项对应决策/规范条目)。(733/733 全绿、drift 绿、story-repo 0.21 决策 64)
|
|
|
|
|
|
## Non-Goals
|
|
|
|