sillyspec 3.29.2 → 3.29.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/analyze-transcript.cjs +38 -0
- package/asset-audit-2026-09-20/README.md +42 -0
- package/asset-audit-2026-09-20/asset-audit.cjs +253 -0
- package/asset-audit-2026-09-20/extract-candidates.cjs +37 -0
- package/asset-audit-2026-09-20/platform-archive.csv +294 -0
- package/asset-audit-2026-09-20/platform-fr.csv +12 -0
- package/asset-audit-2026-09-20/platform-gotchas.csv +6 -0
- package/asset-audit-2026-09-20/platform-knownissues.csv +23 -0
- package/asset-audit-2026-09-20/platform-modules.csv +222 -0
- package/asset-audit-2026-09-20/platform-quicklog.csv +1076 -0
- package/asset-audit-2026-09-20/platform-troubleshooting-candidates.csv +88 -0
- package/asset-audit-2026-09-20/platform-troubleshooting.csv +1 -0
- package/asset-audit-2026-09-20/sillyspec-archive.csv +108 -0
- package/asset-audit-2026-09-20/sillyspec-fr.csv +51 -0
- package/asset-audit-2026-09-20/sillyspec-gotchas.csv +4 -0
- package/asset-audit-2026-09-20/sillyspec-knownissues.csv +34 -0
- package/asset-audit-2026-09-20/sillyspec-modules.csv +30 -0
- package/asset-audit-2026-09-20/sillyspec-quicklog.csv +460 -0
- package/asset-audit-2026-09-20/sillyspec-troubleshooting.csv +69 -0
- package/asset-audit-2026-09-20/summary.json +241 -0
- package/package.json +1 -1
- package/src/ceremony-config.js +64 -0
- package/src/ceremony-tier.js +66 -13
- package/src/config-schema.js +16 -3
- package/src/cross-repo-reconcile.js +232 -46
- package/src/fr-index.js +80 -2
- package/src/index.js +2 -2
- package/src/review-tier.js +5 -2
- package/src/run/bg-sync.js +231 -0
- package/src/run/complete-handlers.js +208 -5
- package/src/run/gates.js +10 -5
- package/src/run/prompt.js +1 -1
- package/src/run/shared.js +32 -0
- package/src/run/verify-quality-scan.js +131 -3
- package/src/scope-audit.js +303 -20
- package/src/stages/brainstorm.js +6 -0
- package/src/stages/execute.js +1 -0
- package/src/stages/plan-postcheck.js +66 -0
- package/src/stages/plan.js +1 -0
- package/src/stages/quick.js +2 -0
- package/src/sync.js +12 -0
- package/src/verify-postcheck.js +92 -8
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"file","seq","title"
|
|
2
|
+
"docs/sillyspec/troubleshooting.md","1","1. Stage Review marker runId 格式(review- 前缀,CLI 自动生成)"
|
|
3
|
+
"docs/sillyspec/troubleshooting.md","2","2. docHash 漂移(design 改一字就要重算 sha256 + 续审)"
|
|
4
|
+
"docs/sillyspec/troubleshooting.md","3","3. 子代理撞主模型 5h 限额(429 中断)"
|
|
5
|
+
"docs/sillyspec/troubleshooting.md","4","4. requiresWait 两段式(--wait/--continue + AskUserQuestion)"
|
|
6
|
+
"docs/sillyspec/troubleshooting.md","5","5. _module-map.yaml schema_version=1 警告刷屏(已止血,根因待修)"
|
|
7
|
+
"docs/sillyspec/troubleshooting.md","6","6. QUICKLOG 轮转归档(提交时带上)"
|
|
8
|
+
"docs/sillyspec/troubleshooting.md","7","7. home 下长出平行 .sillyspec(读路径建库 + 向上解析无守卫,已根治)"
|
|
9
|
+
"docs/sillyspec/troubleshooting.md","8","8. `run quick --help` 误开会话(--help 被静默吞,已修)"
|
|
10
|
+
"docs/sillyspec/troubleshooting.md","9","9. quick --done 审计把并行会话的删除算成本会话(双重误判,2026-08-16 实证)"
|
|
11
|
+
"docs/sillyspec/troubleshooting.md","10","10. 并发状态分裂三坑(execute run 目录静默缺失 / apply --merge baseline 冲突 / 活文档引用漂移,2026-08-16 闭环)"
|
|
12
|
+
"docs/sillyspec/troubleshooting.md","11","11. archive module-impact 检查失败打印裸 [object Object](2026-08-19 实证)"
|
|
13
|
+
"docs/sillyspec/troubleshooting.md","12","12. plan 生成 module-impact 章节名与 archive-impact 契约不同源(2026-08-19 实证)"
|
|
14
|
+
"docs/sillyspec/troubleshooting.md","13","13. 工具驾驭三坑:review.json 手工回填 / --answer 提示滞后 / base_ts 冲突再现(2026-08-19 闭环)"
|
|
15
|
+
"docs/sillyspec/troubleshooting.md","14","14. quick 末步四字段模板展示滞后(2026-08-20 已修)"
|
|
16
|
+
"docs/sillyspec/troubleshooting.md","15","15. 三坑:install 白名单拒 monorepo 链式 / doctor --fix 误删活跃分支 / verify-postcheck CRLF(2026-08-20 闭环)"
|
|
17
|
+
"docs/sillyspec/troubleshooting.md","16","16. 四坑:execute 步骤表漂移 / doctor align 绕过 review 门 / modules 引号值转义 / taskcard 反引号(2026-08-20 闭环)"
|
|
18
|
+
"docs/sillyspec/troubleshooting.md","17","17. 三坑:ruff format × CRLF stash 死循环 / docHash 手工联动 / task review 草稿漏 task(2026-08-21 闭环)"
|
|
19
|
+
"docs/sillyspec/troubleshooting.md","18","18. quick 会话的文件路径规则提示误导纯代码 quick(2026-08-21 已修)"
|
|
20
|
+
"docs/sillyspec/troubleshooting.md","19","19. 三坑:建议命令缺 --change / baseline 裹挟跨变更 spec 文档 / 草稿归属漏未提交改动(2026-08-21 闭环)"
|
|
21
|
+
"docs/sillyspec/troubleshooting.md","20","20. 手动归档绕行 → 自愈/幽灵清理只翻 status,平台渲染成「进度丢失」(2026-08-21 闭环)"
|
|
22
|
+
"docs/sillyspec/troubleshooting.md","21","21. 三坑:apply 后提交误扫 / 他者半归档残留无提示 / review 引用分支只能手动保留(2026-08-21 闭环)"
|
|
23
|
+
"docs/sillyspec/troubleshooting.md","22","22. 四坑:provision 假 installed / 验证 task 零 diff 误杀 / Wave 漏识别 / taskcard 逐卡裁决(2026-08-21 闭环)"
|
|
24
|
+
"docs/sillyspec/troubleshooting.md","23","23. 四坑:parity 扫描噪音 / module 0 命中未提交改动 / junction 假成功第②层 / 模板元数据头滞后(2026-08-21 闭环)"
|
|
25
|
+
"docs/sillyspec/troubleshooting.md","24","24. 三坑:归档尾声 sync 噪音 / 孤儿 worktree 物理目录 / progress show 停留旧阶段(2026-08-21 闭环)"
|
|
26
|
+
"docs/sillyspec/troubleshooting.md","25","25. 三坑:未落仓虚警 / 归档变更 worktree 误供给 / verify 服务进程泄漏(2026-08-21 闭环)"
|
|
27
|
+
"docs/sillyspec/troubleshooting.md","26","26. 坑 22-① 复发:monorepo 子包假 installed(2026-08-22 闭环)"
|
|
28
|
+
"docs/sillyspec/troubleshooting.md","27","27. 四坑(全程总结批):junction 丢失强装依赖 / apply ENOBUFS / 字面证据误拦 / 跨变更冲突无预警(2026-08-22 闭环)"
|
|
29
|
+
"docs/sillyspec/troubleshooting.md","28","28. 两坑:module 匹配对 monorepo 布局失灵 / dev server 端口竞争误判(2026-08-22 闭环)"
|
|
30
|
+
"docs/sillyspec/troubleshooting.md","29","29. 三坑:head 真实 commit 契约后知 / changedFiles 注记后缀误判不相交 / 文档债拖到 verify 才拦(2026-08-22 闭环)"
|
|
31
|
+
"docs/sillyspec/troubleshooting.md","30","30. 两坑:--file-notes 非末步静默丢 / --files 追加不解锁危险拦截(2026-08-22 闭环)"
|
|
32
|
+
"docs/sillyspec/troubleshooting.md","31","31. 两坑:关联变更遗留误拦 / tasks.md 追加行落「提案书(Proposal)」占位(2026-08-22 闭环)"
|
|
33
|
+
"docs/sillyspec/troubleshooting.md","32","32. 三坑:TaskCard body 章节返工 / design 组合单元格对账过严 / 并发宽严不一致无说明(2026-08-22 闭环)"
|
|
34
|
+
"docs/sillyspec/troubleshooting.md","33","33. 三坑:探针5基线失配全量误报 / 子代理未 commit 纯新增文件 apply 炸 / pull 部署噪声落冲突(2026-08-23 闭环)"
|
|
35
|
+
"docs/sillyspec/troubleshooting.md","34","34. 五坑:状态机矛盾 / autoCheck 写 worktree / 子模块漏链 / 探针5口径 / 共享主仓竞态(2026-08-23 闭环)"
|
|
36
|
+
"docs/sillyspec/troubleshooting.md","35","35. 两坑:并行会话已声明文件误拦 / 四字段模板防线后置(2026-08-23 闭环)"
|
|
37
|
+
"docs/sillyspec/troubleshooting.md","36","36. 五坑:doctor 假 re-provisioned / apply 并发互踩+整批跳过 / push 409 内容一致自愈失效(sort TypeError)/ 409 横幅刷屏 / created_at UTC(2026-08-23 闭环)"
|
|
38
|
+
"docs/sillyspec/troubleshooting.md","37","37. 四坑:--merge 冲突即 abort / 已 merge 分支误判未落地 / archive 子确认碎 / verify 对账误伤+跨会话杀进程(2026-08-23 闭环)"
|
|
39
|
+
"docs/sillyspec/troubleshooting.md","38","38. 三坑:register-repo CRLF 假成功死循环 / 幽灵目录 junction 穿透 / 派生产物旧基线覆盖(2026-08-23 闭环)"
|
|
40
|
+
"docs/sillyspec/troubleshooting.md","39","39. 三坑:多行装饰器漏扫端点误报 / 探针1 worktree 路径盲区 / baseline checkpoint 夹带不透明 + FAIL 重验成本无预告(2026-08-24 闭环)"
|
|
41
|
+
"docs/sillyspec/troubleshooting.md","40","40. 三坑:主仓在途改动 apply 三路死锁 / stash pop 静默不落地 / review 未声明的执行期偏差拦 apply(2026-08-24 闭环)"
|
|
42
|
+
"docs/sillyspec/troubleshooting.md","41","41. 两坑:同名分支冲突死锁+误导删分支 / brainstorm-auto 无模板骨架连环卡字面门(2026-08-24 闭环)"
|
|
43
|
+
"docs/sillyspec/troubleshooting.md","42","42. 多会话单工作区混战(固有风险记录,2026-08-24 用户实证归档)"
|
|
44
|
+
"docs/sillyspec/troubleshooting.md","43","43. 三坑:跨变更归属排除警告刷屏 / 并行子代理 taskcard CLI 撞 SQLite 锁 / worktree editable-install 越界(2026-08-25 闭环)"
|
|
45
|
+
"docs/sillyspec/troubleshooting.md","44","44. 一坑:Git Bash(MSYS) 路径转换污染 quick prose 参数(2026-08-27 闭环)"
|
|
46
|
+
"docs/sillyspec/troubleshooting.md","45","45. 一坑:verify 测试对账把含 failed 字样的通过行误判失败行(2026-08-28 闭环)"
|
|
47
|
+
"docs/sillyspec/troubleshooting.md","46","46. 一坑:verify 对账把 vitest 捕获块【内容行】误判失败行(2026-08-31 闭环)"
|
|
48
|
+
"docs/sillyspec/troubleshooting.md","47","47. 一坑:endpoints artifact 不含挂载前缀 → 探针 5 全量假 missing(2026-08-31 闭环)"
|
|
49
|
+
"docs/sillyspec/troubleshooting.md","48","48. 一坑:verify 对账把 pytest warnings summary 误判失败行(2026-09-02 闭环)"
|
|
50
|
+
"docs/sillyspec/troubleshooting.md","49","49. 一坑:conditionalWait 步骤 --continue 被 --answer 直接收尾,agent 备好的 --done 落到下一步假完成(2026-09-02 闭环)"
|
|
51
|
+
"docs/sillyspec/troubleshooting.md","50","50. 一坑:per-task review 的 base..head 与「主代理统一 commit」模式天然冲突(2026-09-02 闭环)"
|
|
52
|
+
"docs/sillyspec/troubleshooting.md","51","51. 一坑:spec-sync 未决冲突期间横幅连环刷屏 + 残留标记永久红标(2026-09-03 闭环)"
|
|
53
|
+
"docs/sillyspec/troubleshooting.md","52","52. 三坑:spec 树冲突无「接受服务器版本」/ quick WARNING 审计无解法指引 / 空壳会话只能手工清(2026-09-03 闭环)"
|
|
54
|
+
"docs/sillyspec/troubleshooting.md","53","53. 三坑:--done 对不存在 change 静默新建 / progress repair 对双库分裂失明 / docHash 失配忘手动刷新(2026-09-04 闭环)"
|
|
55
|
+
"docs/sillyspec/troubleshooting.md","54","54. 一坑:spec-sync 间歇打 ""This operation was aborted"" 像未知异常(2026-09-07 闭环)"
|
|
56
|
+
"docs/sillyspec/troubleshooting.md","55","55. 三坑:verify 判账 tail 盲区归因难 / 豁免匹配不剥 ANSI / known_failures 连续链解析脆弱(2026-09-07 闭环)"
|
|
57
|
+
"docs/sillyspec/troubleshooting.md","56","56. 归档转换拦截「execute → archive」:--done 直达完成不写 currentStage(2026-09-08 已修复)"
|
|
58
|
+
"docs/sillyspec/troubleshooting.md","57","57. 两坑:pre-commit stash-restore 吞常规提交(三现)/ 批量文本替换无 assert 静默流失(2026-09-10 用户实证,workaround 文档化)"
|
|
59
|
+
"docs/sillyspec/troubleshooting.md","58","59. 三坑 postmortem:跨仓 worktree 被主仓清理面误删 / 跨仓 baseline checkpoint 卷入外来文件 / 门禁沙箱环境不一致(2026-09-12 用户实证,已修复)"
|
|
60
|
+
"docs/sillyspec/troubleshooting.md","59","60. 三坑:门禁沙箱环境缺失必挂(只能 advisory)/ 中断续跑半成品无主 / 回执解析全角缺陷(2026-09-12 用户实证,已修复)"
|
|
61
|
+
"docs/sillyspec/troubleshooting.md","60","61. 两坑:门禁快照对 monorepo 依赖布局不可用(四次重试才定位路径)/ baseline checkpoint 卷入 289MB 部署 tar.gz(2026-09-12 用户实证,已修复)"
|
|
62
|
+
"docs/sillyspec/troubleshooting.md","61","62. 两坑:审计 fail-closed 误伤并行会话 spec 残留(归档移动/未跟踪脚本)/ gen:types 行尾重写假 M(2026-09-12 用户实证,已修复)"
|
|
63
|
+
"docs/sillyspec/troubleshooting.md","62","63. 四坑:review.json 神秘空壳覆写(溯源戳根治)/ pnpm 沙箱必假败(布局探测跳过)/ probe1 NEW: 前缀失配噪声 / bash 长 heredoc 截断(2026-09-12 用户实证,已修复/落档)"
|
|
64
|
+
"docs/sillyspec/troubleshooting.md","63","64. apply 与并行会话工作区互相冲掉(2026-09-14 用户实证,已修复/落档)"
|
|
65
|
+
"docs/sillyspec/troubleshooting.md","64","65. 两坑:归档后 worktree 被并行会话代劳清理(change 无所有权)/ review 放行通道放进外来文件(2026-09-14 用户实证,护栏方向已立项)"
|
|
66
|
+
"docs/sillyspec/troubleshooting.md","65","66. 五坑:execute 双真相门禁口径(worktree 感知收敛)(2026-09-15 用户实证,已修复)"
|
|
67
|
+
"docs/sillyspec/troubleshooting.md","66","67. quick/全流程 `--done` 被 spec-sync 网络尾巴拖住分钟级不返回(2026-09-20 用户实证,已修复)"
|
|
68
|
+
"docs/troubleshooting.md","67","sillyspec 命令报 `Cannot find module '.../node_modules/sillyspec/bin/sillyspec.js'`"
|
|
69
|
+
"docs/troubleshooting.md","68","给 sillyspec 写测试 / 改 CRLF 文件时 Edit 工具失配"
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
{
|
|
2
|
+
"generatedAt": "2026-09-20T12:27:35.518Z",
|
|
3
|
+
"repos": {
|
|
4
|
+
"sillyspec": {
|
|
5
|
+
"root": "C:/Users/qinyi/IdeaProjects/sillyspec",
|
|
6
|
+
"archive": {
|
|
7
|
+
"total": 107,
|
|
8
|
+
"fullSixDocs": 43,
|
|
9
|
+
"dateRange": "2026-04-08 ~ 2026-09-20",
|
|
10
|
+
"datedNamed": 95,
|
|
11
|
+
"activeChanges": [
|
|
12
|
+
"2026-09-20-quick-asset-tail"
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
"quicklog": {
|
|
16
|
+
"files": 11,
|
|
17
|
+
"entries": 459,
|
|
18
|
+
"status": {
|
|
19
|
+
"已完成": 436,
|
|
20
|
+
"已完成(代码并入 commit 4a5f596,与 --no-worktree 谎言修复混提;message 漏标 7 bug)": 2,
|
|
21
|
+
"已完成(经直接 git commit,非 quick --done——quick 审计 shared.js:516 对文件删除恒 blocked 无 flag 解锁,A6 必删 propose.js/propose.md 故走 quick 不通)": 2,
|
|
22
|
+
"已废弃": 1,
|
|
23
|
+
"进行中": 11,
|
|
24
|
+
"已取消": 7
|
|
25
|
+
},
|
|
26
|
+
"byMonth": {
|
|
27
|
+
"2026-06": 12,
|
|
28
|
+
"2026-07": 8,
|
|
29
|
+
"2026-08": 230,
|
|
30
|
+
"2026-09": 209
|
|
31
|
+
},
|
|
32
|
+
"firstTs": "2026-06-04 16:47:41",
|
|
33
|
+
"lastTs": "2026-09-20 18:19:21"
|
|
34
|
+
},
|
|
35
|
+
"moduleDocs": {
|
|
36
|
+
"count": 29,
|
|
37
|
+
"totalLines": 2455,
|
|
38
|
+
"byDir": {
|
|
39
|
+
".sillyspec/docs/dashboard/modules": 6,
|
|
40
|
+
".sillyspec/docs/sillyspec/modules": 23
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"troubleshooting": {
|
|
44
|
+
"files": [
|
|
45
|
+
"docs/sillyspec/troubleshooting.md",
|
|
46
|
+
"docs/troubleshooting.md"
|
|
47
|
+
],
|
|
48
|
+
"entries": 68,
|
|
49
|
+
"numberedEntries": 66
|
|
50
|
+
},
|
|
51
|
+
"knownIssues": {
|
|
52
|
+
"exists": true,
|
|
53
|
+
"entries": 33,
|
|
54
|
+
"statusTally": {},
|
|
55
|
+
"lines": 172
|
|
56
|
+
},
|
|
57
|
+
"frIndex": {
|
|
58
|
+
"entries": 50,
|
|
59
|
+
"withConfirm": 47,
|
|
60
|
+
"confirmVerified": 47
|
|
61
|
+
},
|
|
62
|
+
"gotchas": {
|
|
63
|
+
"files": 3,
|
|
64
|
+
"entries": 24,
|
|
65
|
+
"byFile": {
|
|
66
|
+
"conventions.md": 13,
|
|
67
|
+
"patterns.md": 10,
|
|
68
|
+
"uncategorized.md": 1
|
|
69
|
+
},
|
|
70
|
+
"indexRouteLines": 62
|
|
71
|
+
},
|
|
72
|
+
"tests": {
|
|
73
|
+
"testFiles": 554,
|
|
74
|
+
"testLines": 102854,
|
|
75
|
+
"regressionPinIndicator": 17,
|
|
76
|
+
"byTopLevelDir": {
|
|
77
|
+
"test": 554
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"git": {
|
|
81
|
+
"commits": 1376,
|
|
82
|
+
"head": "41cb1a61",
|
|
83
|
+
"lastCommitDate": "2026-09-20"
|
|
84
|
+
},
|
|
85
|
+
"misc": {
|
|
86
|
+
"roadmap": {
|
|
87
|
+
"exists": true,
|
|
88
|
+
"lines": 22,
|
|
89
|
+
"items": 2
|
|
90
|
+
},
|
|
91
|
+
"knowledgeIndex": {
|
|
92
|
+
"exists": true,
|
|
93
|
+
"lines": 84
|
|
94
|
+
},
|
|
95
|
+
"redlinesYaml": false
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"platform": {
|
|
99
|
+
"root": "C:/Users/qinyi/IdeaProjects/multi-agent-platform",
|
|
100
|
+
"archive": {
|
|
101
|
+
"total": 293,
|
|
102
|
+
"fullSixDocs": 16,
|
|
103
|
+
"dateRange": "2026-05-25 ~ 2026-09-20",
|
|
104
|
+
"datedNamed": 286,
|
|
105
|
+
"activeChanges": [
|
|
106
|
+
"2026-07-23-milestone-mobile",
|
|
107
|
+
"2026-09-03-agent-provider-abstraction",
|
|
108
|
+
"2026-09-03-group-chat-archive-delete",
|
|
109
|
+
"2026-09-04-conflict-resolve-entry",
|
|
110
|
+
"2026-09-07-pi-task-events",
|
|
111
|
+
"2026-09-07-session-pin-rename-scheduled-send",
|
|
112
|
+
"2026-09-08-cursor-interactive-session",
|
|
113
|
+
"2026-09-08-session-list-liveness-dot",
|
|
114
|
+
"2026-09-09-conflict-root-workspace-scoping",
|
|
115
|
+
"2026-09-09-sessions-file-browser-three-pane",
|
|
116
|
+
"2026-09-09-sessions-visual-refresh",
|
|
117
|
+
"2026-09-10-auto-resume-interrupted-turn",
|
|
118
|
+
"2026-09-10-group-agent-direct-chat",
|
|
119
|
+
"2026-09-10-review-dispatch-platform-fixes",
|
|
120
|
+
"2026-09-10-zcode-session-sqlite-read",
|
|
121
|
+
"2026-09-11-agent-log-attribution-refactor",
|
|
122
|
+
"2026-09-11-provider-adapter-registry",
|
|
123
|
+
"2026-09-11-session-provider-switch-codex-pi",
|
|
124
|
+
"2026-09-12-provider-file-tx",
|
|
125
|
+
"2026-09-12-session-live-display-fixes",
|
|
126
|
+
"2026-09-13-consensus-timeout-activity-aware",
|
|
127
|
+
"2026-09-13-session-group-ux-fixes",
|
|
128
|
+
"2026-09-14-session-ctx-compact",
|
|
129
|
+
"2026-09-14-session-export",
|
|
130
|
+
"2026-09-14-session-thinking-level",
|
|
131
|
+
"2026-09-14-workspace-drag-sort",
|
|
132
|
+
"2026-09-15-background-task-notification-delivery",
|
|
133
|
+
"2026-09-15-background-task-permission-lockout",
|
|
134
|
+
"2026-09-15-subagent-three-pane-display",
|
|
135
|
+
"2026-09-16-background-task-grace-timeout",
|
|
136
|
+
"2026-09-16-logs-cursor-tiebreaker",
|
|
137
|
+
"2026-09-16-mobile-changes-parity",
|
|
138
|
+
"2026-09-16-platform-progress-ingest-persist",
|
|
139
|
+
"2026-09-17-knowledge-precipitation",
|
|
140
|
+
"2026-09-18-single-chat-steering",
|
|
141
|
+
"2026-09-18-web-menu-management",
|
|
142
|
+
"2026-09-20-claude-autocompact-config",
|
|
143
|
+
"2026-09-20-scope-audit-cross-repo-platform",
|
|
144
|
+
"default"
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
"quicklog": {
|
|
148
|
+
"files": 25,
|
|
149
|
+
"entries": 1075,
|
|
150
|
+
"status": {
|
|
151
|
+
"已完成": 1023,
|
|
152
|
+
"进行中": 41,
|
|
153
|
+
"已完成(3 commit 本地,push 待 GitHub 网络 port 443 连不上)": 1,
|
|
154
|
+
"已完成(纯调研;曾尝试 running-skip 修复已 revert)": 1,
|
|
155
|
+
"(未标)": 1,
|
|
156
|
+
"已完成(commit 5f39f496,已 push main)": 1,
|
|
157
|
+
"已完成(commit e9866a0b,已 push main)": 1,
|
|
158
|
+
"已完成(commit 913503ad,已 push main)": 1,
|
|
159
|
+
"已暂存(git add install.sh,未 commit;本机 .cmd 已手工修可立即用)": 1,
|
|
160
|
+
"已暂存(git add 4 文件,未 commit;DB 已临时 ALTER 生效;待 build backend 持久化)": 1,
|
|
161
|
+
"已完成(⚠️ quick --done 审计拦删除无法收尾,经用户确认直接 git 提交)": 1,
|
|
162
|
+
"已完成(分支 sillyspec/2026-09-10-mcp-central-registry 提交 83932255e,待随分支 ff 合并)": 1,
|
|
163
|
+
"已取消": 1
|
|
164
|
+
},
|
|
165
|
+
"byMonth": {
|
|
166
|
+
"2026-06": 216,
|
|
167
|
+
"2026-07": 184,
|
|
168
|
+
"2026-08": 364,
|
|
169
|
+
"2026-09": 311
|
|
170
|
+
},
|
|
171
|
+
"firstTs": "2026-06-04 09:11:09",
|
|
172
|
+
"lastTs": "2026-09-20 18:30:19"
|
|
173
|
+
},
|
|
174
|
+
"moduleDocs": {
|
|
175
|
+
"count": 221,
|
|
176
|
+
"totalLines": 14615,
|
|
177
|
+
"byDir": {
|
|
178
|
+
".sillyspec/docs/backend/modules": 36,
|
|
179
|
+
".sillyspec/docs/frontend/modules": 87,
|
|
180
|
+
".sillyspec/docs/multi-agent-platform/modules": 11,
|
|
181
|
+
".sillyspec/docs/sillyhub-daemon/modules": 51,
|
|
182
|
+
".sillyspec/docs/SillyHub/modules": 36
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"troubleshooting": {
|
|
186
|
+
"files": [],
|
|
187
|
+
"entries": 0,
|
|
188
|
+
"numberedEntries": 0
|
|
189
|
+
},
|
|
190
|
+
"knownIssues": {
|
|
191
|
+
"exists": true,
|
|
192
|
+
"entries": 22,
|
|
193
|
+
"statusTally": {},
|
|
194
|
+
"lines": 163
|
|
195
|
+
},
|
|
196
|
+
"frIndex": {
|
|
197
|
+
"entries": 11,
|
|
198
|
+
"withConfirm": 11,
|
|
199
|
+
"confirmVerified": 11
|
|
200
|
+
},
|
|
201
|
+
"gotchas": {
|
|
202
|
+
"files": 5,
|
|
203
|
+
"entries": 76,
|
|
204
|
+
"byFile": {
|
|
205
|
+
"conventions.md": 11,
|
|
206
|
+
"patterns.md": 10,
|
|
207
|
+
"sillyspec-gotchas.md": 10,
|
|
208
|
+
"testing-gotchas.md": 6,
|
|
209
|
+
"uncategorized.md": 39
|
|
210
|
+
},
|
|
211
|
+
"indexRouteLines": 74
|
|
212
|
+
},
|
|
213
|
+
"tests": {
|
|
214
|
+
"testFiles": 320,
|
|
215
|
+
"testLines": 132284,
|
|
216
|
+
"regressionPinIndicator": 2,
|
|
217
|
+
"byTopLevelDir": {
|
|
218
|
+
"frontend": 80,
|
|
219
|
+
"sillyhub-daemon": 240
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
"git": {
|
|
223
|
+
"commits": 2994,
|
|
224
|
+
"head": "82a76721f",
|
|
225
|
+
"lastCommitDate": "2026-09-20"
|
|
226
|
+
},
|
|
227
|
+
"misc": {
|
|
228
|
+
"roadmap": {
|
|
229
|
+
"exists": true,
|
|
230
|
+
"lines": 241,
|
|
231
|
+
"items": 34
|
|
232
|
+
},
|
|
233
|
+
"knowledgeIndex": {
|
|
234
|
+
"exists": true,
|
|
235
|
+
"lines": 106
|
|
236
|
+
},
|
|
237
|
+
"redlinesYaml": true
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ceremony-config.js — ceremony 定价项目级配置读取器(local.yaml `ceremony:` 段 pricing 五键)
|
|
3
|
+
*
|
|
4
|
+
* 2026-09-20 ceremony 项目化定价(对话裁决:每个项目体系不一样,S0~S3 判定阈值应可配置):
|
|
5
|
+
* 引擎(ceremony-tier.js)保持纯函数零 IO——配置由本读取器读 local.yaml 注入调用方。
|
|
6
|
+
* 可配的是「起点与阈值」(default_tier / span 两阈值 / friction 起爆线 / 五级词映射部分覆写);
|
|
7
|
+
* 「只升不降」全局纪律(friction 升档、显式降档须理由)无配置出口——防项目把自己配裸奔。
|
|
8
|
+
*
|
|
9
|
+
* 语义对齐 readCeremonyLocalConfig(src/run/prompt.js,force_tier/shadow 读取器):
|
|
10
|
+
* best-effort 绝不抛、非法值 warn 后回退默认、缺段返回空对象(引擎侧 normalize 回内置值)。
|
|
11
|
+
* blast 危险面 / span 风险路径**不在本读取器**——它们是项目共享声明(_module-map.yaml 顶层
|
|
12
|
+
* blast/span_risk 段,进 git),local.yaml 是逐机配置,语义不同不混载。
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync } from 'fs';
|
|
15
|
+
import { join } from 'path';
|
|
16
|
+
import jsYaml from 'js-yaml';
|
|
17
|
+
|
|
18
|
+
import { CEREMONY_TIERS } from './ceremony-tier.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 读 local.yaml `ceremony:` 段的 pricing 五键(camelCase 归一出参,与 normalizeTierConfig 入参对齐)。
|
|
22
|
+
* @param {string} specBase - .sillyspec 目录(local.yaml 所在);空/null → 空配置
|
|
23
|
+
* @returns {{ defaultTier?: string, spanFilesThreshold?: number, spanModulesThreshold?: number, frictionThreshold?: number, riskTierMap?: object }}
|
|
24
|
+
* 仅含合法键(非法/缺失键不发——引擎侧回退内置值)
|
|
25
|
+
*/
|
|
26
|
+
export function readCeremonyPricingConfig(specBase) {
|
|
27
|
+
const out = {};
|
|
28
|
+
if (!specBase) return out;
|
|
29
|
+
let raw = null;
|
|
30
|
+
try {
|
|
31
|
+
const p = join(specBase, 'local.yaml');
|
|
32
|
+
if (!existsSync(p)) return out;
|
|
33
|
+
raw = jsYaml.load(readFileSync(p, 'utf8'));
|
|
34
|
+
} catch {
|
|
35
|
+
return out; // 坏 yaml → 空配置(引擎回内置值),不拦定价
|
|
36
|
+
}
|
|
37
|
+
const c = raw && typeof raw === 'object' && raw.ceremony && typeof raw.ceremony === 'object'
|
|
38
|
+
? raw.ceremony
|
|
39
|
+
: null;
|
|
40
|
+
if (!c) return out;
|
|
41
|
+
|
|
42
|
+
if (CEREMONY_TIERS.includes(c.default_tier)) out.defaultTier = c.default_tier;
|
|
43
|
+
else if (c.default_tier != null) console.warn(`[sillyspec] ceremony.default_tier 非法「${c.default_tier}」已忽略(可选:${CEREMONY_TIERS.join(' | ')})`);
|
|
44
|
+
|
|
45
|
+
for (const [key, outKey] of [['span_files_threshold', 'spanFilesThreshold'], ['span_modules_threshold', 'spanModulesThreshold'], ['friction_escalation_threshold', 'frictionThreshold']]) {
|
|
46
|
+
const v = c[key];
|
|
47
|
+
if (Number.isInteger(v) && v >= 1) out[outKey] = v;
|
|
48
|
+
else if (v != null) console.warn(`[sillyspec] ceremony.${key} 非法「${v}」已忽略(≥1 整数)`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (c.risk_tier_map != null) {
|
|
52
|
+
if (typeof c.risk_tier_map === 'object' && !Array.isArray(c.risk_tier_map)) {
|
|
53
|
+
const map = {};
|
|
54
|
+
for (const [level, tier] of Object.entries(c.risk_tier_map)) {
|
|
55
|
+
if (CEREMONY_TIERS.includes(tier)) map[level] = tier;
|
|
56
|
+
else console.warn(`[sillyspec] ceremony.risk_tier_map.${level} 档位非法「${tier}」已忽略(可选:${CEREMONY_TIERS.join(' | ')})`);
|
|
57
|
+
}
|
|
58
|
+
if (Object.keys(map).length > 0) out.riskTierMap = map;
|
|
59
|
+
} else {
|
|
60
|
+
console.warn('[sillyspec] ceremony.risk_tier_map 非对象已忽略');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return out;
|
|
64
|
+
}
|
package/src/ceremony-tier.js
CHANGED
|
@@ -156,7 +156,12 @@ function matchModuleForFile(posix, modulesObj) {
|
|
|
156
156
|
* friction 分量=升档后的档(未起爆为 S0,不参与封顶);reasons 逐分量留痕(含阈值与
|
|
157
157
|
* 命中明细),供消费方审计打印与双跑比对
|
|
158
158
|
*/
|
|
159
|
-
export function computeCeremonyTier({ riskDetection, blastTier, explicitRiskLevel, declaredFiles, moduleIndex, spanRiskPatterns = [], frictionCounts } = {}) {
|
|
159
|
+
export function computeCeremonyTier({ riskDetection, blastTier, explicitRiskLevel, declaredFiles, moduleIndex, spanRiskPatterns = [], frictionCounts, config } = {}) {
|
|
160
|
+
// ── 项目级配置覆写(2026-09-20 ceremony 项目化定价):引擎保持纯函数零 IO,配置由调用方
|
|
161
|
+
// 读 local.yaml ceremony: 段注入(readCeremonyPricingConfig)。可配的是「起点与阈值」:
|
|
162
|
+
// 缺省档 / span 两阈值 / friction 起爆线 / 五级词映射。「只升不降」全局纪律(friction 升档、
|
|
163
|
+
// 显式降档须理由)不开放配置——防项目把自己配裸奔。非法值逐项回退默认并在 reasons 留痕。
|
|
164
|
+
const cfg = normalizeTierConfig(config)
|
|
160
165
|
const reasons = []
|
|
161
166
|
let explicitDowngradeAccepted = false
|
|
162
167
|
|
|
@@ -167,22 +172,22 @@ export function computeCeremonyTier({ riskDetection, blastTier, explicitRiskLeve
|
|
|
167
172
|
reasons.push(`blast=${blast}(声明面直入 blastTier——resolveChangeRisk 声明危险面判级,D-008)`)
|
|
168
173
|
} else {
|
|
169
174
|
const detectedLevel = riskDetection != null && typeof riskDetection === 'object' ? riskDetection.level : undefined
|
|
170
|
-
const mappedTier =
|
|
175
|
+
const mappedTier = cfg.riskTierMap[detectedLevel]
|
|
171
176
|
if (mappedTier) {
|
|
172
177
|
blast = mappedTier
|
|
173
|
-
reasons.push(`blast=${blast}(riskDetection.level=${detectedLevel} 经
|
|
178
|
+
reasons.push(`blast=${blast}(riskDetection.level=${detectedLevel} 经 risk_tier_map 映射)`)
|
|
174
179
|
} else {
|
|
175
|
-
blast =
|
|
180
|
+
blast = cfg.defaultTier
|
|
176
181
|
const cause = detectedLevel === undefined ? 'riskDetection.level 缺失' : `riskDetection.level=${String(detectedLevel)} 未知`
|
|
177
|
-
reasons.push(`blast
|
|
182
|
+
reasons.push(`blast=${cfg.defaultTier}(保守缺省:${cause}${cfg.defaultTierSource === 'config' ? ',项目配置 default_tier' : ',brownfield 不静默降级'})`)
|
|
178
183
|
}
|
|
179
184
|
}
|
|
180
185
|
|
|
181
186
|
const explicit = normalizeExplicit(explicitRiskLevel)
|
|
182
187
|
if (explicit) {
|
|
183
|
-
const explicitTier =
|
|
188
|
+
const explicitTier = cfg.riskTierMap[explicit.level]
|
|
184
189
|
if (!explicitTier) {
|
|
185
|
-
reasons.push(`显式 risk_level 非法被忽略:${JSON.stringify(explicitRiskLevel)}(合法值:${Object.keys(
|
|
190
|
+
reasons.push(`显式 risk_level 非法被忽略:${JSON.stringify(explicitRiskLevel)}(合法值:${Object.keys(cfg.riskTierMap).join(' / ')})`)
|
|
186
191
|
} else if (tierRank(explicitTier) > tierRank(blast)) {
|
|
187
192
|
reasons.push(`blast 升档尊重显式声明 risk_level=${explicit.level} → ${explicitTier}(高于判级 ${blast})`)
|
|
188
193
|
blast = explicitTier
|
|
@@ -203,9 +208,9 @@ export function computeCeremonyTier({ riskDetection, blastTier, explicitRiskLeve
|
|
|
203
208
|
.map((f) => String(f).replace(/\\/g, '/'))
|
|
204
209
|
.filter(Boolean)
|
|
205
210
|
let span = 'S0'
|
|
206
|
-
if (files.length >=
|
|
211
|
+
if (files.length >= cfg.spanFilesThreshold) {
|
|
207
212
|
span = 'S2'
|
|
208
|
-
reasons.push(`span=S2(声明文件 ${files.length} ≥ 阈值 ${
|
|
213
|
+
reasons.push(`span=S2(声明文件 ${files.length} ≥ 阈值 ${cfg.spanFilesThreshold}${cfg.spanFilesSource === 'config' ? '(项目配置)' : ''})`)
|
|
209
214
|
}
|
|
210
215
|
|
|
211
216
|
const modulesObj = resolveModulesObject(moduleIndex)
|
|
@@ -215,9 +220,9 @@ export function computeCeremonyTier({ riskDetection, blastTier, explicitRiskLeve
|
|
|
215
220
|
const id = matchModuleForFile(f, modulesObj)
|
|
216
221
|
if (id != null) hitModules.add(id)
|
|
217
222
|
}
|
|
218
|
-
if (hitModules.size >=
|
|
223
|
+
if (hitModules.size >= cfg.spanModulesThreshold) {
|
|
219
224
|
span = 'S2'
|
|
220
|
-
reasons.push(`span=S2(跨模块 ${hitModules.size} ≥ 阈值 ${
|
|
225
|
+
reasons.push(`span=S2(跨模块 ${hitModules.size} ≥ 阈值 ${cfg.spanModulesThreshold}${cfg.spanModulesSource === 'config' ? '(项目配置)' : ''}:${[...hitModules].join('、')})`)
|
|
221
226
|
}
|
|
222
227
|
} // moduleIndex 缺失/空 → 跨模块检查跳过,span 其余两维照常
|
|
223
228
|
|
|
@@ -240,15 +245,63 @@ export function computeCeremonyTier({ riskDetection, blastTier, explicitRiskLeve
|
|
|
240
245
|
// ── friction 轴:ledger 两键合计达到阈值 → 在 blast/span 结果上 +1 档封顶 S3(只升不降)──
|
|
241
246
|
const total = frictionTotal(frictionCounts)
|
|
242
247
|
let friction = 'S0'
|
|
243
|
-
if (total >=
|
|
248
|
+
if (total >= cfg.frictionThreshold) {
|
|
244
249
|
const base = maxTier(blast, span)
|
|
245
250
|
friction = CEREMONY_TIERS[Math.min(tierRank(base) + 1, CEREMONY_TIERS.length - 1)]
|
|
246
|
-
reasons.push(`friction 升档(gate_rollback+review_rejected 合计 ${total} ≥ 阈值 ${
|
|
251
|
+
reasons.push(`friction 升档(gate_rollback+review_rejected 合计 ${total} ≥ 阈值 ${cfg.frictionThreshold}${cfg.frictionSource === 'config' ? '(项目配置)' : ''},${base} → ${friction},封顶 S3)`)
|
|
247
252
|
}
|
|
248
253
|
|
|
249
254
|
return { tier: maxTier(maxTier(blast, span), friction), components: { blast, span, friction }, reasons, explicitDowngradeAccepted }
|
|
250
255
|
}
|
|
251
256
|
|
|
257
|
+
/**
|
|
258
|
+
* 项目级定价配置归一(computeCeremonyTier 内部消费,纯函数):非法值逐项回退默认。
|
|
259
|
+
* 入参形态即 local.yaml `ceremony:` 段的 pricing 五键(由 readCeremonyPricingConfig 读取注入,
|
|
260
|
+
* 引擎自身不读文件):
|
|
261
|
+
* default_tier('S0'~'S3')/ span_files_threshold(≥1 整数)/ span_modules_threshold(≥1 整数)
|
|
262
|
+
* / friction_escalation_threshold(≥1 整数)/ risk_tier_map(五级词→档位映射的**部分覆写**,
|
|
263
|
+
* 与内置表浅合并——只覆写声明的词,未声明词保持内置值)。
|
|
264
|
+
* 「只升不降」纪律不在此面(friction 升档/显式降档复核为全局语义,无配置出口)。
|
|
265
|
+
*/
|
|
266
|
+
function normalizeTierConfig(config) {
|
|
267
|
+
const c = config != null && typeof config === 'object' && !Array.isArray(config) ? config : {}
|
|
268
|
+
const out = {
|
|
269
|
+
defaultTier: 'S2',
|
|
270
|
+
defaultTierSource: 'builtin',
|
|
271
|
+
spanFilesThreshold: SPAN_FILES_THRESHOLD,
|
|
272
|
+
spanFilesSource: 'builtin',
|
|
273
|
+
spanModulesThreshold: SPAN_MODULES_THRESHOLD,
|
|
274
|
+
spanModulesSource: 'builtin',
|
|
275
|
+
frictionThreshold: FRICTION_ESCALATION_THRESHOLD,
|
|
276
|
+
frictionSource: 'builtin',
|
|
277
|
+
riskTierMap: { ...RISK_TO_TIER },
|
|
278
|
+
}
|
|
279
|
+
if (CEREMONY_TIERS.includes(c.defaultTier)) {
|
|
280
|
+
out.defaultTier = c.defaultTier
|
|
281
|
+
out.defaultTierSource = 'config'
|
|
282
|
+
}
|
|
283
|
+
if (Number.isInteger(c.spanFilesThreshold) && c.spanFilesThreshold >= 1) {
|
|
284
|
+
out.spanFilesThreshold = c.spanFilesThreshold
|
|
285
|
+
out.spanFilesSource = 'config'
|
|
286
|
+
}
|
|
287
|
+
if (Number.isInteger(c.spanModulesThreshold) && c.spanModulesThreshold >= 1) {
|
|
288
|
+
out.spanModulesThreshold = c.spanModulesThreshold
|
|
289
|
+
out.spanModulesSource = 'config'
|
|
290
|
+
}
|
|
291
|
+
if (Number.isInteger(c.frictionThreshold) && c.frictionThreshold >= 1) {
|
|
292
|
+
out.frictionThreshold = c.frictionThreshold
|
|
293
|
+
out.frictionSource = 'config'
|
|
294
|
+
}
|
|
295
|
+
if (c.riskTierMap != null && typeof c.riskTierMap === 'object' && !Array.isArray(c.riskTierMap)) {
|
|
296
|
+
for (const [level, tier] of Object.entries(c.riskTierMap)) {
|
|
297
|
+
if (Object.prototype.hasOwnProperty.call(RISK_TO_TIER, level) && CEREMONY_TIERS.includes(tier)) {
|
|
298
|
+
out.riskTierMap[level] = tier
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return out
|
|
303
|
+
}
|
|
304
|
+
|
|
252
305
|
/**
|
|
253
306
|
* friction 升档(阶段门检查点用,D-008):两键合计达到阈值 → min(S3, 当前档+1);只升不降
|
|
254
307
|
* ——未达阈 / 已在顶 / 当前档非法时原样返回不发明新档。escalated=档位实际上移(S3 再超阈
|
package/src/config-schema.js
CHANGED
|
@@ -118,7 +118,7 @@ export const LOCAL_YAML_SCHEMA = {
|
|
|
118
118
|
title: '测试策略',
|
|
119
119
|
note: 'verify 阶段 CLI 对账的收窄策略(D-005@v2:skip 接线兑现 + evidence-auto 新增,full/module 语义不变)。',
|
|
120
120
|
keys: [
|
|
121
|
-
{ path: 'test_strategy', type: 'enum', values: ['full', 'module', 'skip', 'evidence-auto'], optional: true, status: 'live', readers: ['extractTestStrategy (src/verify-postcheck.js)', 'resolveTestStrategy (src/verify-postcheck.js)'], desc: 'full=全量 commands.test;module=按 git diff 命中 modules 子集收窄(需配 modules);skip=真跳过测试(不回退全量,verify 输出显式标注留审计痕迹,R-07);evidence-auto=按变更目录 module-impact.md 影响类型推荐检查组合(行为→module 聚焦测试、文档/prompt→docs-check、门禁契约→gate;缺失/不可解析降级 module
|
|
121
|
+
{ path: 'test_strategy', type: 'enum', values: ['full', 'module', 'skip', 'evidence-auto'], optional: true, status: 'live', readers: ['extractTestStrategy (src/verify-postcheck.js)', 'resolveTestStrategy (src/verify-postcheck.js)'], desc: 'full=全量 commands.test;module=按 git diff 命中 modules 子集收窄(需配 modules);skip=真跳过测试(不回退全量,verify 输出显式标注留审计痕迹,R-07);evidence-auto=按变更目录 module-impact.md 影响类型推荐检查组合(行为→module 聚焦测试、文档/prompt→docs-check、门禁契约→gate;缺失/不可解析降级 module 并注记)。缺省:配了 modules: 块 → module(v3.29.3 起缺省收窄,ql-20260920-010);未配 modules → 全量。', example: 'full' },
|
|
122
122
|
],
|
|
123
123
|
},
|
|
124
124
|
{
|
|
@@ -229,9 +229,14 @@ export const LOCAL_YAML_SCHEMA = {
|
|
|
229
229
|
{
|
|
230
230
|
id: 'ceremony',
|
|
231
231
|
title: '评审仪式档位(ceremony tier)',
|
|
232
|
-
note: '仪式档位(S0~S3)由 CLI 按 blast/span/friction 三轴风险客观定价(blast 轴输入=项目声明危险面 _module-map.yaml 顶层 blast 段,2026-09-19-ceremony-pricing-five-cuts;span 轴路径模式输入=项目声明 _module-map.yaml 顶层 span_risk 段,2026-09-19-span-risk-pattern-migration,无声明项目该维关闭不回退内置表);完成门声明追赶重定价——无摩擦迁移随声明面可升可降、有摩擦迁移地板不退,force_tier
|
|
232
|
+
note: '仪式档位(S0~S3)由 CLI 按 blast/span/friction 三轴风险客观定价(blast 轴输入=项目声明危险面 _module-map.yaml 顶层 blast 段,2026-09-19-ceremony-pricing-five-cuts;span 轴路径模式输入=项目声明 _module-map.yaml 顶层 span_risk 段,2026-09-19-span-risk-pattern-migration,无声明项目该维关闭不回退内置表);完成门声明追赶重定价——无摩擦迁移随声明面可升可降、有摩擦迁移地板不退,force_tier 仍只升不降;本段是逃生阀/影子期开关/逐机升档面 + 项目化定价阈值(2026-09-20:每个项目体系不一样,起点与阈值可配)。读键按「存在则读、不存在用缺省」容错(定价键读取走 readCeremonyPricingConfig,开关面走 readCeremonyLocalConfig)。',
|
|
233
233
|
keys: [
|
|
234
234
|
{ path: 'ceremony.blast_surfaces', type: 'json', optional: true, status: 'live', readers: ['loadBlastDeclarations (src/blast-surface.js — local 逐机升档,与 map 声明逐文件取 max)'], desc: 'blast 危险面逐机覆盖:[{ prefixes: [...], tier: S0~S3 }]——主声明在 _module-map.yaml 顶层 blast 段(进 git、可挂 evidence 位);本键只升不降(与 map 命中逐文件取 max,压低共享声明无效)、不承载 evidence(证据语义属共享 map,D-009)。非法条目静默跳过。', example: '[{ prefixes: [src/my-daemon/], tier: S3 }]' },
|
|
235
|
+
{ path: 'ceremony.default_tier', type: 'enum', values: ['S0', 'S1', 'S2', 'S3'], optional: true, status: 'live', readers: ['readCeremonyPricingConfig (src/ceremony-config.js → computeCeremonyTier blast 轴保守缺省——review-tier/verify-postcheck 双跑两侧同源注入)'], desc: '项目化定价·缺省档(default_tier):blast 轴无 risk 输入时的保守起点(内置 S2)。小工具仓可降 S1、强合规仓可升 S3——每个项目按自己的体系定。只改起点,不影响「只升不降」纪律。', example: 'ceremony: { default_tier: S1 }' },
|
|
236
|
+
{ path: 'ceremony.span_files_threshold', type: 'integer', optional: true, status: 'live', readers: ['readCeremonyPricingConfig (src/ceremony-config.js → computeCeremonyTier span 轴文件数阈值)'], desc: '项目化定价·span 文件阈值(span_files_threshold):声明文件数 ≥N → 至少 S2(内置 8)。小仓 3 个文件就算摊子大就配 3。≥1 整数。', example: 'ceremony: { span_files_threshold: 3 }' },
|
|
237
|
+
{ path: 'ceremony.span_modules_threshold', type: 'integer', optional: true, status: 'live', readers: ['readCeremonyPricingConfig (src/ceremony-config.js → computeCeremonyTier span 轴跨模块阈值)'], desc: '项目化定价·span 跨模块阈值(span_modules_threshold):跨模块数 ≥N → 至少 S2(内置 3)。≥1 整数。', example: 'ceremony: { span_modules_threshold: 2 }' },
|
|
238
|
+
{ path: 'ceremony.friction_escalation_threshold', type: 'integer', optional: true, status: 'live', readers: ['readCeremonyPricingConfig (src/ceremony-config.js → computeCeremonyTier friction 轴起爆线)'], desc: '项目化定价·friction 起爆线(friction_escalation_threshold):gate_rollback+review_rejected 合计 ≥N → 升一档封顶 S3(内置 2,两振出局)。强合规仓配 1 = 一次拦拒即升档。≥1 整数。', example: 'ceremony: { friction_escalation_threshold: 1 }' },
|
|
239
|
+
{ path: 'ceremony.risk_tier_map', type: 'json', optional: true, status: 'live', readers: ['readCeremonyPricingConfig (src/ceremony-config.js → computeCeremonyTier 五级词映射部分覆写)'], desc: '项目化定价·五级词→档位映射覆写(部分覆写:只覆写声明的词,未声明词保持内置 doc-only→S0 / unit-sufficient→S1 / contract-required→S2 / integration-critical→S3 / deployment-critical→S3)。例:{ unit-sufficient: S2 } = 该仓单测级变更也走独立评审。非法词/档位 warn 后忽略。', example: 'ceremony: { risk_tier_map: { unit-sufficient: S2 } }' },
|
|
235
240
|
{ path: 'ceremony.force_tier', type: 'enum', values: ['S0', 'S1', 'S2', 'S3'], optional: true, status: 'live', readers: ['readCeremonyLocalConfig (src/run/prompt.js — {REVIEW_TIER} 注入档位菜单/强制轻仪审计痕)', '影子派发前置校验 (src/review-dispatch.js — task-06 影子期框架接线)'], desc: '档位逃生阀:强制仪式档 S0~S3,绕过客观定价(过渡期「就是不信这套」用)。prompt 注入面只升不降——强制档低于客观定价档时不降档(防 prompt 面与 gate 侧判定分裂);非法值 warn 后忽略。', example: 'S3' },
|
|
236
241
|
{ path: 'ceremony.shadow', type: 'boolean', optional: true, status: 'live', readers: ['readCeremonyLocalConfig (src/run/prompt.js — S0/S1 轻档注入影子期注记)', 'runReviewDispatch 影子前置校验 (src/review-dispatch.js — task-06 影子期框架接线)'], desc: '影子期开关,默认 true(on):S0/S1 轻档明面轻仪、后台静默派发重仪式只记账不阻断(影子派发框架随 task-06 落地);置 off = 轻仪转正(转正判据由 doctor 影子对照维度公示,CLI 只出判据不出手)。', example: 'true' },
|
|
237
242
|
],
|
|
@@ -446,11 +451,19 @@ docs-check:
|
|
|
446
451
|
# change-ownership:
|
|
447
452
|
# heartbeat_minutes: 15 # 所有者活跃心跳窗口(分钟)
|
|
448
453
|
|
|
449
|
-
# ── 评审仪式档位(ceremony tier:S0~S3 由 CLI 按 blast/span/friction
|
|
454
|
+
# ── 评审仪式档位(ceremony tier:S0~S3 由 CLI 按 blast/span/friction 三轴风险客观定价)──
|
|
450
455
|
# blast 轴输入=项目声明危险面(_module-map.yaml 顶层 blast 段);完成门声明追赶重定价(无摩擦随声明、有摩擦地板不退)。
|
|
456
|
+
# 项目化定价(每个项目体系不一样,起点与阈值可配——只升不降纪律不开放配置):
|
|
457
|
+
# default_tier 缺省档 / span_files_threshold 文件阈值(内置8) / span_modules_threshold 跨模块阈值(内置3)
|
|
458
|
+
# / friction_escalation_threshold 起爆线(内置2) / risk_tier_map 五级词映射部分覆写。
|
|
451
459
|
# force_tier 强制档位绕过客观定价(过渡逃生阀,prompt 注入面只升不降);shadow 影子期默认 on——
|
|
452
460
|
# S0/S1 轻档明面轻仪、后台静默派发重仪式对照只记账不阻断;置 off = 轻仪转正(转正判据见 doctor 影子对照)。
|
|
453
461
|
# ceremony:
|
|
462
|
+
# default_tier: S1 # 缺省档(内置 S2;小仓 S1 / 强合规 S3)
|
|
463
|
+
# span_files_threshold: 3 # 文件数阈值(内置 8)
|
|
464
|
+
# span_modules_threshold: 2 # 跨模块阈值(内置 3)
|
|
465
|
+
# friction_escalation_threshold: 1 # 起爆线(内置 2,两振出局;强合规 1)
|
|
466
|
+
# risk_tier_map: { unit-sufficient: S2 } # 五级词部分覆写(未声明词保持内置)
|
|
454
467
|
# force_tier: S3 # 强制全重仪式(逃生阀;S0 | S1 | S2 | S3)
|
|
455
468
|
# shadow: true # 影子期开关(默认 true)
|
|
456
469
|
# blast_surfaces: # blast 逐机升档(只升不降、不承载 evidence;主声明在 _module-map.yaml blast 段)
|