sillyspec 3.29.4 → 3.31.0

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.
Files changed (148) hide show
  1. package/.claude/skills/sillyspec-auto/SKILL.md +1 -1
  2. package/.claude/skills/sillyspec-brainstorm/SKILL.md +2 -2
  3. package/.claude/skills/sillyspec-commit/SKILL.md +1 -1
  4. package/.claude/skills/sillyspec-flow/SKILL.md +57 -0
  5. package/.claude/skills/sillyspec-quick/SKILL.md +7 -105
  6. package/AGENTS.md +38 -20
  7. package/SKILL.md +9 -3
  8. package/assets/command-cards/flow.md +32 -0
  9. package/assets/command-cards/run-archive.md +26 -0
  10. package/assets/command-cards/run-brainstorm.md +33 -0
  11. package/assets/command-cards/run-execute.md +29 -0
  12. package/assets/command-cards/run-plan.md +27 -0
  13. package/assets/command-cards/run-quick.md +17 -0
  14. package/assets/command-cards/run-verify.md +29 -0
  15. package/assets/command-cards/status.md +27 -0
  16. package/package.json +2 -1
  17. package/packages/dashboard/server/executor.js +2 -1
  18. package/packages/dashboard/server/parser.js +7 -7
  19. package/r7-test-env/README-R7-TEST.md +93 -0
  20. package/r7-test-env/demo-project/lib/calc.js +6 -0
  21. package/r7-test-env/demo-project/package.json +1 -0
  22. package/r7-test-env/demo-project/test.js +10 -0
  23. package/r7-test-env/prompt-R7-SMOKE.md +41 -0
  24. package/r7-test-env/sillyspec-r7.cmd +3 -0
  25. package/round4/account.mjs +98 -0
  26. package/round4/b1-analyze-task08.mjs +40 -0
  27. package/round4/b1-b1-target-validation.md +32 -0
  28. package/round4/b3a-prompt-audit-result.md +66 -0
  29. package/round4/b3a-prompt-audit.mjs +89 -0
  30. package/round4/brief-autocompact.md +34 -0
  31. package/round4/brief-session-replay.md +50 -0
  32. package/round4/deep-read-synthesis.md +38 -0
  33. package/round4/extract-full.mjs +38 -0
  34. package/round4/extract-timeline.mjs +43 -0
  35. package/round4/find-sessions.mjs +13 -0
  36. package/round4/full-r4-l.md +4707 -0
  37. package/round4/full-r4-o-l.md +4300 -0
  38. package/round4/full-r4-os.md +1681 -0
  39. package/round4/full-r4-sf.md +4255 -0
  40. package/round4/full-r4-sq.md +1734 -0
  41. package/round4/gate-audit-relay-receipt.md +30 -0
  42. package/round4/gate-value-audit.md +52 -0
  43. package/round4/optimization-plan.md +165 -0
  44. package/round4/prereg.md +67 -0
  45. package/round4/prompt-R4-L.md +63 -0
  46. package/round4/prompt-R4-O-L.md +59 -0
  47. package/round4/prompt-R4-O-S.md +56 -0
  48. package/round4/prompt-R4-S-F.md +60 -0
  49. package/round4/prompt-R4-S-Q.md +66 -0
  50. package/round4/r4-final-report.html +347 -0
  51. package/round4/r4-os-timeline.txt +297 -0
  52. package/round4/r4-sf-timeline.txt +738 -0
  53. package/round4/r4-sq-timeline.txt +322 -0
  54. package/round4/r4l-timeline.txt +793 -0
  55. package/round4/r4ol-timeline.txt +729 -0
  56. package/round4/r4sf-timeline.txt +852 -0
  57. package/round4/r5-scenario-matrix.md +46 -0
  58. package/round4/result-S.md +171 -0
  59. package/round4/result-final.md +46 -0
  60. package/round4/result-quality.md +63 -0
  61. package/src/change-list.js +9 -0
  62. package/src/classify-change.js +6 -0
  63. package/src/command-cards.js +74 -0
  64. package/src/commit-guard.js +2 -0
  65. package/src/config-schema.js +64 -12
  66. package/src/contract-matrix.js +26 -5
  67. package/src/db.js +35 -4
  68. package/src/decision-distill.js +9 -3
  69. package/src/diagnostic-codes.js +2 -1
  70. package/src/docs-check.js +1 -1
  71. package/src/doctor-diagnostics.js +44 -2
  72. package/src/flow-draft.js +748 -0
  73. package/src/flow-parity.js +236 -0
  74. package/src/flow-review.js +184 -0
  75. package/src/flow.js +1492 -0
  76. package/src/foreign-declared.js +17 -1
  77. package/src/fr-index.js +396 -22
  78. package/src/fs-atomic.js +5 -1
  79. package/src/git-helper.js +2 -2
  80. package/src/greenfield-bootstrap.js +98 -0
  81. package/src/handoff.js +120 -7
  82. package/src/hunk-attribution.js +191 -0
  83. package/src/index.js +602 -21
  84. package/src/init.js +25 -8
  85. package/src/knowledge-classify.js +47 -1
  86. package/src/knowledge-digest.js +162 -0
  87. package/src/knowledge-quicklog.js +246 -0
  88. package/src/machine-draft.js +128 -0
  89. package/src/machine-interface.js +194 -7
  90. package/src/mcp-server.js +1 -0
  91. package/src/module-impact.js +51 -22
  92. package/src/module-resolve.js +3 -1
  93. package/src/preview-progress.js +160 -0
  94. package/src/progress/change-registry.js +11 -3
  95. package/src/progress/shared.js +3 -2
  96. package/src/progress.js +56 -13
  97. package/src/quicklog.js +44 -6
  98. package/src/redomain.js +147 -0
  99. package/src/review-material-pack.js +204 -1
  100. package/src/run/archive-distill.js +4 -2
  101. package/src/run/bg-sync.js +67 -0
  102. package/src/run/command.js +127 -10
  103. package/src/run/complete-handlers.js +363 -73
  104. package/src/run/complete.js +356 -74
  105. package/src/run/gate-snapshot-ledger.js +213 -0
  106. package/src/run/gate-snapshot.js +260 -38
  107. package/src/run/gates.js +482 -268
  108. package/src/run/green-cache.js +123 -0
  109. package/src/run/junction-rm.js +70 -0
  110. package/src/run/next.js +14 -0
  111. package/src/run/prompt.js +185 -55
  112. package/src/run/quick-audit.js +213 -14
  113. package/src/run/shared.js +123 -4
  114. package/src/run/stage.js +182 -216
  115. package/src/run/test-ledger.js +264 -0
  116. package/src/run/verify-quality-scan.js +84 -7
  117. package/src/scope-audit.js +6 -1
  118. package/src/sentinel-assertions.js +114 -0
  119. package/src/setup.js +3 -3
  120. package/src/spec-sync.js +41 -1
  121. package/src/stage-contract.js +26 -8
  122. package/src/stage-review-checklist.js +2 -0
  123. package/src/stage-review.js +7 -2
  124. package/src/stage-templates.js +157 -0
  125. package/src/stages/archive.js +2 -0
  126. package/src/stages/brainstorm.js +24 -106
  127. package/src/stages/execute.js +222 -85
  128. package/src/stages/knowledge.js +74 -1
  129. package/src/stages/plan-postcheck.js +385 -20
  130. package/src/stages/plan.js +23 -1
  131. package/src/stages/quick.js +10 -2
  132. package/src/stages/verify.js +4 -2
  133. package/src/sync.js +81 -23
  134. package/src/task-done.js +181 -0
  135. package/src/task-review.js +8 -55
  136. package/src/taskcard-frontmatter.js +57 -0
  137. package/src/test-bindings.js +549 -0
  138. package/src/timeline.js +218 -0
  139. package/src/ui-visual.js +175 -0
  140. package/src/verify-draft.js +214 -0
  141. package/src/verify-postcheck.js +919 -159
  142. package/src/verify-probes.js +103 -25
  143. package/src/watcher.js +1031 -0
  144. package/src/worktree-apply.js +44 -4
  145. package/src/worktree-deps.js +22 -8
  146. package/src/worktree-policy.js +42 -0
  147. package/src/worktree.js +102 -15
  148. package/templates/agents-instruction.md +37 -18
@@ -0,0 +1,66 @@
1
+ 【R4 对照实验·受试会话 R4-S-Q:autocompact 小任务·sillyspec quick 通道】
2
+
3
+ 你是独立执行会话。请在指定工作树里,用 sillyspec(npm 全局 3.29.4)走 **quick 流程**完成下述变更,走完到 `--done` 落账。
4
+
5
+ ## 工作树与身份(第 0 步必做,进 transcript 作证)
6
+
7
+ ```
8
+ cd C:\Users\qinyi\IdeaProjects\multi-agent-platform\.sillyspec\.runtime\worktrees\2026-09-20-r4-autocompact-quick
9
+ export SILLYSPEC_SESSION_ID=r4-small-quick
10
+ sillyspec --version # 必须输出 3.29.4,不符立即停止并报告
11
+ ```
12
+
13
+ 流程:`sillyspec run quick`(启动必带 `--input` 标题;实验钉死 quick 通道——虽然此任务也可走全流程,但本跑测的就是轻通道,勿改道)。
14
+
15
+ ## 防作弊铁律(违反即实验作废,比任务本身更重要)
16
+
17
+ 1. **禁止从 git 对象库捞未来提交**:本任务此前已被实现过(main 上 2026-09-19 之后的提交)。不得 `git log --all`、不得看 main / 任何其他分支、不得 cherry-pick / checkout / diff 其他分支的提交。只在本工作树分支(sillyspec/2026-09-20-r4-autocompact-quick,基于 50736b6ef)上工作。
18
+ 2. **禁止读平台主仓工作区**(`C:\Users\qinyi\IdeaProjects\multi-agent-platform` 本体)与任何兄弟目录(*-openspec* / .sillyspec/.runtime/worktrees/ 下非本目录——特别是 2026-09-20-r4-autocompact-full 与 2026-09-20-r4-session-replay)。
19
+ 3. **禁止改 sillyspec 工具本身**(~\IdeaProjects\sillyspec 源码仓、npm 全局安装、node_modules 里的 sillyspec)。
20
+ 4. 只在本工作树分支提交,**不 push**。
21
+ 5. 工具流程正常注入的知识/文档可用(本基线时点它们不含本任务答案)。
22
+
23
+ ## 任务简报(verbatim)
24
+
25
+ # 提案书(Proposal)— claude 引擎 autocompact 配置(provider 级)
26
+
27
+ ## 动机
28
+
29
+ claude 引擎长会话在 ~160K tokens 触发引擎自动压缩(默认 believed limit 200K × ~80% 设计点),生产会话(6e213eb3,113 轮)频繁被压。平台无干预手段,用户希望按 provider 配置压缩行为(更晚压缩/关闭/预计算)。
30
+
31
+ ## 关键问题
32
+
33
+ 1. 平台管道已有 `settings_config → lease 透传 → claude-settings 白名单 → settings.json` 机制(attribution 等键先例),但白名单不含任何 autocompact 键——配置写了也不生效。
34
+ 2. 前端 provider 表单无 autocompact 入口,用户只能手改数据库 JSON。
35
+ 3. window 配置超过模型实际窗口会撞硬限报错而非压缩——需要风险提示承载(用户自担的配置面)。
36
+
37
+ ## 变更范围
38
+
39
+ - daemon:claude-settings.ts 白名单加三键(值守护:window 正整数/两开关布尔)。
40
+ - 前端:llm-provider-form claude 分支「引擎自动压缩」区(三键 + 风险提示)。
41
+ - 文档:daemon.md 增量段。
42
+
43
+ ## 不在范围内(显式清单)
44
+
45
+ - profile 级配置(D-001 否决)
46
+ - pi/codex 引擎压缩配置
47
+ - 阈值比例可配(SDK 无可写项)
48
+
49
+ ## 成功标准(可验证)
50
+
51
+ - settings_config 配 `{"autoCompactWindow": 230000}` 的 claude provider 会话,daemon spawn 后 `$CLAUDE_CONFIG_DIR/settings.json` 含该键(单测断言)
52
+ - 三键值守护:window=0/负数/非整数、开关非布尔 → 不写入(单测)
53
+ - 前端表单 claude 分支渲染三键控件并正确提交进 settings_config;非 claude 不渲染(组件测试)
54
+ - 既有 attribution/env 白名单行为零回归(既有用例全绿)
55
+
56
+ ## quick 收尾要求(本跑的机制观测点,务必照做)
57
+
58
+ - `--done` 用四参数结构化落盘:`--req/--cause/--solution/--result`。
59
+ - `--done` 时带 `--linked-changes 2026-09-20-r4-linked-parent`(工作树 `.sillyspec/changes/` 下已放置该关联变更目录,模拟「quick 修补关联既有正式变更」场景;资产尾会对其做提炼/lite 归档,属正常预期行为,不要手动动它)。
60
+ - 触及文件的注记走 `--file-notes`。
61
+
62
+ ## 终态自查(完成后在报告里给出)
63
+
64
+ - quick 终态输出(QUICKLOG 条目)
65
+ - 是否观察到关联变更被提炼/轻归档的控制台输出(原文摘录)
66
+ - 大致起止时间
@@ -0,0 +1,347 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>sillyspec × OpenSpec 对撞结果</title>
7
+ <style>
8
+ :root {
9
+ --ink:#1a2233; --sub:#64708a; --line:#e4e8ef; --card:#fff;
10
+ --green:#16a34a; --green-bg:#f0fdf4; --green-bd:#bbe7c9;
11
+ --red:#dc2626; --red-bg:#fef2f2; --red-bd:#f5c2c2;
12
+ --amber:#d97706; --amber-bg:#fffbeb; --amber-bd:#f3ddad;
13
+ --blue:#2563eb; --blue-bg:#eff6ff;
14
+ --mono:"Cascadia Code",Consolas,monospace;
15
+ }
16
+ *{box-sizing:border-box;margin:0;padding:0}
17
+ body{font-family:"Microsoft YaHei UI","PingFang SC","Segoe UI",sans-serif;background:#f2f4f7;color:var(--ink);font-size:15px;line-height:1.6;padding:26px 18px 70px}
18
+ .wrap{max-width:1000px;margin:0 auto}
19
+ header{background:linear-gradient(135deg,#0f172a,#1e3a5f);color:#fff;border-radius:14px;padding:26px 30px;margin-bottom:16px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px}
20
+ header h1{font-size:22px}
21
+ header p{color:#aebbd2;font-size:13px;margin-top:4px}
22
+ header .tags{font-size:12px;color:#8ea3c4;text-align:right}
23
+ /* 结论条 */
24
+ .verdict{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin-bottom:16px}
25
+ .chip{border-radius:10px;padding:12px 14px;font-size:13.5px;font-weight:600;border:1px solid;text-align:center}
26
+ .chip small{display:block;font-weight:400;font-size:11.5px;color:var(--sub);margin-top:2px}
27
+ .chip.g{background:var(--green-bg);border-color:var(--green-bd);color:#14532d}
28
+ .chip.r{background:var(--red-bg);border-color:var(--red-bd);color:#7f1d1d}
29
+ .chip.a{background:var(--amber-bg);border-color:var(--amber-bd);color:#78350f}
30
+ section{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:20px 24px;margin-bottom:16px}
31
+ h2{font-size:17px;margin-bottom:14px;display:flex;align-items:center;gap:8px}
32
+ h2 .n{background:var(--ink);color:#fff;border-radius:7px;font-size:12px;padding:1px 8px}
33
+ h2.win{color:#14532d} h2.gap{color:#7f1d1d}
34
+ /* 数字对比 */
35
+ .duel{display:grid;grid-template-columns:1fr 1fr;gap:12px}
36
+ .duel .col{border:1px solid var(--line);border-radius:10px;overflow:hidden}
37
+ .duel .col .hd{padding:8px;text-align:center;font-weight:700;font-size:14px;color:#fff}
38
+ .col.silly .hd{background:#1d4ed8} .col.open .hd{background:#b45309}
39
+ .duel .row{display:flex;justify-content:space-between;padding:8px 14px;border-top:1px solid var(--line);font-size:13.5px}
40
+ .duel .row b{font-family:var(--mono);font-size:15px}
41
+ .duel .row.hl b{color:var(--blue)} .col.open .row.hl b{color:var(--amber)}
42
+ .duel .foot{padding:6px 14px 10px;font-size:11.5px;color:var(--sub);border-top:1px dashed var(--line)}
43
+ .cols2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
44
+ @media(max-width:720px){.duel,.cols2{grid-template-columns:1fr}}
45
+ /* 亮点/差距卡 */
46
+ .cards{display:grid;grid-template-columns:1fr 1fr;gap:12px}
47
+ @media(max-width:720px){.cards{grid-template-columns:1fr}}
48
+ .card{border-radius:10px;padding:14px 16px;border:1px solid}
49
+ .card h3{font-size:15px;margin-bottom:6px}
50
+ .card p{font-size:13px;color:#3a465c}
51
+ .card .big{font-size:26px;font-weight:800;font-family:var(--mono);line-height:1.2;margin-bottom:4px}
52
+ .card.win{background:linear-gradient(180deg,#f4fdf6,#fff);border-color:var(--green-bd)}
53
+ .card.win h3{color:#14532d} .card.win .big{color:var(--green)}
54
+ .card.gap{background:linear-gradient(180deg,#fef5f5,#fff);border-color:var(--red-bd)}
55
+ .card.gap h3{color:#7f1d1d} .card.gap .big{color:var(--red)}
56
+ code{font-family:var(--mono);background:#eef1f6;border-radius:4px;padding:0 5px;font-size:12px;color:#b3244a}
57
+ /* 错键对比 */
58
+ .vs{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:10px}
59
+ .vs .box{border-radius:10px;padding:12px 14px;font-size:13px;border:1px solid var(--line)}
60
+ .vs .box b{display:block;font-size:13.5px;margin-bottom:4px}
61
+ .vs .ok{background:var(--green-bg);border-color:var(--green-bd)} .vs .bad{background:var(--red-bg);border-color:var(--red-bd)}
62
+ /* 条形图 */
63
+ .bar-row{margin:12px 0}
64
+ .bar-row .lbl{font-size:12.5px;font-weight:600;display:flex;justify-content:space-between;margin-bottom:3px}
65
+ .bar-row .lbl span:last-child{color:var(--sub);font-family:var(--mono)}
66
+ .bar{display:flex;height:26px;border-radius:6px;overflow:hidden;color:#fff;font-size:10.5px;font-family:var(--mono)}
67
+ .seg{display:flex;align-items:center;justify-content:center;min-width:0;white-space:nowrap;overflow:hidden}
68
+ .s1{background:#3b82f6}.s2{background:#8b5cf6}.s3{background:#f59e0b}.s4{background:#ef4444}.s5{background:#0ea5e9}.s6{background:#10b981}
69
+ .legend{display:flex;flex-wrap:wrap;gap:8px 16px;font-size:11.5px;color:var(--sub);margin:4px 0 8px}
70
+ .legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:4px;vertical-align:-1px}
71
+ .note{font-size:12px;color:var(--sub);margin-top:6px}
72
+ .tok{font-size:11.5px;color:var(--sub);font-family:var(--mono);margin:2px 0 3px}
73
+ .tok b{color:var(--ink);font-weight:600}
74
+ .sample{border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:#fafbfd}
75
+ .sample .cap{font-size:12.5px;font-weight:700;margin-bottom:2px}
76
+ .sample .cap small{font-weight:400;color:var(--sub)}
77
+ .sample pre{font-family:var(--mono);font-size:11.5px;line-height:1.6;color:#333d52;white-space:pre-wrap;word-break:break-all;margin-top:6px}
78
+ .sample pre em{color:#b3244a;font-style:normal}
79
+ .tbl{width:100%;border-collapse:collapse;font-size:13px;margin:10px 0 4px}
80
+ .tbl th,.tbl td{border:1px solid var(--line);padding:7px 12px;text-align:left}
81
+ .tbl th.cat{background:#f0f3f8;width:88px;font-size:12.5px}
82
+ .tbl th.a{background:#1d4ed8;color:#fff} .tbl th.b{background:#b45309;color:#fff}
83
+ .tbl td.a{background:#f8faff;width:41%} .tbl td.b{background:#fffdf5;width:41%}
84
+ .tbl .y{color:var(--green);font-weight:700} .tbl .n{color:#b6bfce} .tbl .w{color:var(--red);font-weight:700}
85
+ .side-hd{padding:6px;text-align:center;font-weight:700;font-size:13px;color:#fff;border-radius:8px}
86
+ .side-hd.a{background:#1d4ed8} .side-hd.b{background:#b45309}
87
+ .stack{display:flex;flex-direction:column;gap:10px;margin-top:10px}
88
+ .one{background:var(--blue-bg);border:1px solid #c3d7fb;border-radius:10px;padding:14px 18px;font-size:15px;font-weight:600;text-align:center}
89
+ .small{font-size:11.5px;color:var(--sub)}
90
+ footer{text-align:center;color:var(--sub);font-size:11.5px;margin-top:22px}
91
+ </style>
92
+ </head>
93
+ <body>
94
+ <div class="wrap">
95
+
96
+ <header>
97
+ <div>
98
+ <h1>sillyspec × OpenSpec 对撞结果</h1>
99
+ <p>同任务 · 同基线 · 全新会话 · 同机同模型 —— 受控对照</p>
100
+ </div>
101
+ <div class="tags">2026-09-20/21<br>大任务 + 小任务 · 5 会话<br>db 硬账 + 全量记录深读</div>
102
+ </header>
103
+
104
+ <!-- 一页结论 -->
105
+ <div class="verdict">
106
+ <div class="chip g">小任务成本真持平<small>tokens 8.97 vs 9.33M · 账单当量 ~1.0×</small></div>
107
+ <div class="chip g">全场唯一硬缺陷在对方<small>错键生产 no-op,测试全绿掩护</small></div>
108
+ <div class="chip g">交付厚度 2.4×<small>2,909 vs 1,193 行测试</small></div>
109
+ <div class="chip r">墙钟慢 1.3× / 2×<small>差距全在非模型时间</small></div>
110
+ <div class="chip r">子代理扇出贵<small>43% tokens / 68% 请求</small></div>
111
+ <div class="chip a">定位:用等待换防线<small>砍仪式=砍防线</small></div>
112
+ </div>
113
+
114
+ <!-- ① 数据 -->
115
+ <section>
116
+ <h2><span class="n">1</span>核心数据对比</h2>
117
+ <div class="cols2">
118
+ <div>
119
+ <p style="font-size:13px;color:var(--sub);margin-bottom:6px"><b style="color:var(--ink)">小任务</b> —— 给 Claude 的自动压缩加三个界面开关<span class="small">(autocompact 三键 · sillyspec 走 quick 轻通道)</span></p>
120
+ <div class="duel">
121
+ <div class="col silly"><div class="hd">sillyspec</div>
122
+ <div class="row hl"><span>墙钟</span><b>28min*</b></div>
123
+ <div class="row"><span>tokens 新入/缓存/输出</span><b>0.2M / 8.7M / 0.05M</b></div>
124
+ <div class="row"><span>请求</span><b>87</b></div>
125
+ <div class="row"><span>代码量</span><b>+516 行</b></div>
126
+ <div class="row"><span>新增测试</span><b>22</b></div>
127
+ </div>
128
+ <div class="col open"><div class="hd">OpenSpec</div>
129
+ <div class="row hl"><span>墙钟</span><b>21.5min</b></div>
130
+ <div class="row"><span>tokens 新入/缓存/输出</span><b>0.1M / 9.2M / 0.05M</b></div>
131
+ <div class="row"><span>请求</span><b>85</b></div>
132
+ <div class="row"><span>代码量</span><b>+539 行</b></div>
133
+ <div class="row"><span>新增测试</span><b>15</b></div>
134
+ </div>
135
+ </div>
136
+ </div>
137
+ <div>
138
+ <p style="font-size:13px;color:var(--sub);margin-bottom:6px"><b style="color:var(--ink)">大任务</b> —— 把 AI 干活的日志变成可回放的聊天记录<span class="small">(会话回放 · 跨三端 · sillyspec 走全流程)</span></p>
139
+ <div class="duel">
140
+ <div class="col silly"><div class="hd">sillyspec</div>
141
+ <div class="row hl"><span>墙钟</span><b>156min*</b></div>
142
+ <div class="row"><span>tokens 新入/缓存/输出</span><b>2.4M / 96.1M / 0.64M</b></div>
143
+ <div class="row"><span>请求</span><b>767</b></div>
144
+ <div class="row"><span>代码(源码+测试)</span><b>7.2K 行</b></div>
145
+ <div class="row"><span>流程文档</span><b>10.9K 行<span style="font-size:11px;color:var(--sub)">(84% CLI 生成)</span></b></div>
146
+ <div class="row"><span>子代理 / 测试行</span><b>19 / 2,909</b></div>
147
+ </div>
148
+ <div class="col open"><div class="hd">OpenSpec</div>
149
+ <div class="row hl"><span>墙钟</span><b>80min</b></div>
150
+ <div class="row"><span>tokens 新入/缓存/输出</span><b>0.3M / 51.6M / 0.14M</b></div>
151
+ <div class="row"><span>请求</span><b>251</b></div>
152
+ <div class="row"><span>代码(源码+测试)</span><b>3.3K 行</b></div>
153
+ <div class="row"><span>流程文档</span><b>0.6K 行<span style="font-size:11px;color:var(--sub)">(全 agent 写)</span></b></div>
154
+ <div class="row"><span>子代理 / 测试行</span><b>0 / 1,193</b></div>
155
+ </div>
156
+ </div>
157
+ </div>
158
+ </div>
159
+ <p class="small">* sillyspec 墙钟为稳态口径(门禁单轮);tokens / 请求 / 代码量两侧均实测。模型时间两侧同量级(13.3 vs 13.1min)——<b>差距不在模型,在流程</b>。<b>tokens 三分(新输入 / 缓存读 / 输出)</b>:大任务 2.4/96.1/0.64M vs 0.3/51.6/0.14M。按计价折算(新入 1× / 缓存 ~0.1× / 输出 3–5×):<b>大任务账单当量比 ≈ 2.4×(区间 2.1–2.8×),略高于面值 1.9×</b>——两侧命中率都 97%+,缓存救不了比值,且输出差恰好落在最贵计价档。差额构成:<b>缓存体量差 55% + 冷启动新输入 26%(扇出签名,子代理新鲜上下文首读打不中缓存)+ 输出差 19%</b>;输出 4.6× 中 77%(0.49M)是子代理代码/测试产出(交付厚度),主会话编排输出仅 0.14M。小任务账单当量 ~1.0×(三段 0.2/8.7/0.05 vs 0.1/9.2/0.05,真持平)。<br>大任务构成拆解:手写源码 4.3K vs 2.1K(功能对齐,我们组件更厚)· 测试 2.9K vs 1.2K · 流程文档 10.9K vs 0.6K——但其中 <b>84%(8.8K)是 CLI 机械生成的 diff 快照(scope-audit.patch,零 token)</b>,agent 实写文档仅 ~1.75K vs 0.6K(2.9×,与代码 2× 同量级);写作窗口 token 4.2M vs 1.5M,<b>只占大任务 token 差的 ~6%</b>——token 差主因是执行段子代理扇出,不是写文档;小任务两侧基本持平。</p>
160
+ <p class="small"><b>任务画像</b>:小任务=照既有先例加三键的局部修补(简单,轻通道的适用对象);大任务=三端五层契约对齐(daemon→RPC→backend→生成类型→前端),<b>难度在广度与一致性、不在单点深度</b>——每条字段映射都是一次「错键型」失败的机会,防线价值随接缝数放大。</p>
161
+ </section>
162
+
163
+ <!-- ② 亮点 -->
164
+ <section>
165
+ <h2 class="win"><span class="n">2</span>我们的亮点</h2>
166
+ <div class="cards">
167
+ <div class="card win">
168
+ <div class="big">1 vs 0</div>
169
+ <h3>全场唯一硬缺陷,出现在对方侧</h3>
170
+ <p>对方把第三键写错(<code>autoCompactPreCompute</code>):<b>27/27 测试全绿 → 干净归档 → 错键进规格库</b> → 预计算开关生产 no-op。我们的 agent 联网核验官方文档后落码,多花 2.5 分钟拦下静默缺陷。</p>
171
+ </div>
172
+ <div class="card win">
173
+ <div class="big">同一个错误</div>
174
+ <h3>两边 agent 都猜了错键名——差别只在验证步</h3>
175
+ <p>深读记录实证:我们的 agent <b>最初猜的也是那个错名</b>,但先搜官方文档、拿到真名才写码。<b>错误生成是确定性的,拦截是结构性的</b>——这是流程属性,不是运气。</p>
176
+ </div>
177
+ <div class="card win">
178
+ <div class="big">写码之前</div>
179
+ <h3>独立设计审查拦下架构级错误(B1)</h3>
180
+ <p>初版设计与 registry 源码契约矛盾,审查员独立核对源码后首轮打回、强制改设计。<b>零代码浪费</b>。对方流程无任何独立审查环节。</p>
181
+ </div>
182
+ <div class="card win">
183
+ <div class="big">4 道防线</div>
184
+ <h3>缺陷类覆盖:结构化 vs 全靠自觉</h3>
185
+ <p>域事实核验 · 设计-源码一致性 · 声明-实测对账 · 资产正典校验,四类各有机制;对方四类全押 agent 自觉。历史数据:测试门两个月 <b>12 次真拦「声称完成但测试挂」</b>。</p>
186
+ </div>
187
+ <div class="card win">
188
+ <div class="big">可检索资产</div>
189
+ <h3>做完即沉淀</h3>
190
+ <p>4 条决策 + 7 条 FR 索引 + ROADMAP + 模块文档 + 归档 15 件——<b>下次变更直接复用</b>。对方的规格库同样留资产,但本轮把错键典藏成了「正典」。</p>
191
+ </div>
192
+ <div class="card win">
193
+ <div class="big">真并发</div>
194
+ <h3>机制不是纸面</h3>
195
+ <p>Wave 内 4 个子代理同窗并行(时间戳实证);审查请求钳 3/3 阶段达标(11/6/6 ≤ 12/10/15);进度库 / 边界审计 / 防作弊全程有效,<b>双方 agent 零违反</b>。</p>
196
+ </div>
197
+ </div>
198
+ <div class="callout" style="background:var(--blue-bg);border:1px solid #c3d7fb;border-radius:10px;padding:12px 16px;margin-top:12px;font-size:13px">
199
+ <b style="display:block;margin-bottom:4px">测试逻辑对比:两边测试都是 agent 写的,差在依据链与强制面</b>
200
+ 🅰 <b>测试=契约的执行形态</b>:requirements 的 GWT 场景直接翻译成断言(如「230000 成功标准场景」用例)· 任务卡写死 verify 命令 · 存量测试当契约(改契约必须显式);五层执行:子代理自跑 → 主代理复跑 → <b>QA 独立复跑全量</b> → <b>verify 门禁机器实测</b> → 相邻面回归。<br>
201
+ 🅱 <b>测试=agent 自觉</b>:specs 与测试无强制映射(validate 只查格式),写多少凭理解、跑不跑无人拦——全绿可能是<b>自指测试</b>(断言自己写的实现,错键照样 27/27)。<br>
202
+ <span class="small">诚实边界:测试防「实现与声明不符」,不防「声明与事实不符」——若我们写错键名,13 个用例同样全绿。拦错键的是<b>联网核验</b>不是测试:测试管一致性,核验管事实性。</span>
203
+ </div>
204
+ </section>
205
+
206
+ <!-- ③ 产物与资产 -->
207
+ <section>
208
+ <h2 class="win"><span class="n">3</span>执行完成后,你拿到什么(产物与项目资产)</h2>
209
+ <table class="tbl">
210
+ <tr><th class="cat">资产</th><th class="a">🅰 sillyspec</th><th class="b">🅱 OpenSpec</th></tr>
211
+ <tr><td class="cat">决策知识</td><td class="a"><span class="y">✓</span> 决策 <b>4 条</b>(含理由 / 故障面 / 退役判据)</td><td class="b"><span class="n">—</span></td></tr>
212
+ <tr><td class="cat">特性索引</td><td class="a"><span class="y">✓</span> FR <b>7 条</b>(承接链可回溯)</td><td class="b"><span class="n">—</span></td></tr>
213
+ <tr><td class="cat">行为规格</td><td class="a"><span class="y">✓ 替代形态</span> FR 索引 + 模块卡(GWT 场景体,台账式承接链)</td><td class="b"><span class="y">✓</span> 活规格 <b>3 capability · 215 行</b> WHEN/SHALL</td></tr>
214
+ <tr><td class="cat">路线 / 文档</td><td class="a"><span class="y">✓</span> ROADMAP 里程碑 + 模块文档 ×2</td><td class="b"><span class="n">—</span></td></tr>
215
+ <tr><td class="cat">变更账目</td><td class="a"><span class="y">✓</span> 四字段账目 + <b>sha256</b> 范围快照</td><td class="b">git 提交历史</td></tr>
216
+ <tr><td class="cat">过程留痕</td><td class="a"><span class="y">✓</span> 归档 <b>15 件</b> + verify 双证 + 审查 verdict</td><td class="b">归档变更夹</td></tr>
217
+ <tr><td class="cat">下次消费</td><td class="a"><span class="y">✓</span> 自动注入下一次变更的上下文</td><td class="b">靠 agent 主动读</td></tr>
218
+ <tr><td class="cat">正确性</td><td class="a"><span class="y">✓</span> 来源经实证核验</td><td class="b"><span class="w">⚠</span> 本轮错键写入 5 条 requirement</td></tr>
219
+ </table>
220
+ <p class="small">形态差异:OpenSpec 活规格=<b>改写式正典</b>(后续变更直接改文本,像 API 文档好读,但改错即正典错);sillyspec FR 索引=<b>台账式承接链</b>(追加+取代,演进史可见,当前态靠 active 过滤)。</p>
221
+ <h3 style="font-size:14px;margin:14px 0 0">实物抽样(两条任务的真实产物原文摘录)</h3>
222
+ <div class="vs" style="margin-top:0">
223
+ <div class="stack">
224
+ <div class="side-hd a">🅰 sillyspec 实物</div>
225
+ <div class="sample"><div class="cap">📐 决策库条目 <small>· 大任务 D-001,归档自动提炼</small></div>
226
+ <pre>## D-001@v1 回放形态=前端适配器复用 TurnTimeline 真组件(方案 A)
227
+ 状态:implemented | 变更:2026-09-20-r4-session-replay | 最近确认:66636108c
228
+ 理由:任务书点名「适配器 → TurnTimeline 真组件复用」,用户已定案
229
+ 故障面:适配器与 TurnTimeline 契约耦合;靠既有测试族守护
230
+ 退役判据:多 harness 形态差异大到 SessionTurnView 表达不下 → 复议方案 B</pre></div>
231
+ <div class="sample"><div class="cap">🔢 FR 索引条目 <small>· 大任务 FR-host-fs-handler-002(GWT 行为场景)</small></div>
232
+ <pre>## FR-host-fs-handler-002 轮次与 token 可见
233
+ 状态:active | 最近确认:66636108c(归档时 HEAD)
234
+ 场景:Given 数据源含 usage/turn_id(zcode/claude-code)——
235
+ Then 每轮轮尾显示输入/输出 token 徽标,头部显示会话累计;
236
+ 无 token 数据源(cursor-agent/老 daemon)→ 显示「未知」
237
+ 全文回链:changes/archive/…/requirements.md#FR-02(承接链可翻旧账)</pre></div>
238
+ <div class="sample"><div class="cap">📒 quick 结构化账目 <small>· 小任务 ql-20260920-007-ec47</small></div>
239
+ <pre>## ql-20260920-007-ec47 | claude 引擎 autocompact 三键 provider 级配置
240
+ 状态:已完成 | 文件:8 行括注
241
+ 需求:三键 provider 级配置(白名单透传 + 前端表单 + 文档)
242
+ 根因:settings_config→白名单→settings.json 链路不含 autocompact 键,
243
+ 配置写了也不生效;用户只能手改数据库 JSON
244
+ 方案:TOP_LEVEL_KEYS 加三键 + AUTO_COMPACT_VALIDATORS 值守护…
245
+ 结果:门禁实测 test 545.5s + lint 双 PASS;定向 31/31 + 相邻 93/93
246
+ + 范围快照 ql-*.patch(sha256 锚定,可回放当时 diff)</pre></div>
247
+ </div>
248
+ <div class="stack">
249
+ <div class="side-hd b">🅱 OpenSpec 实物</div>
250
+ <div class="sample"><div class="cap">📘 活规格条目(正面)<small>· 大任务 agent-log-parsers</small></div>
251
+ <pre>openspec/specs/agent-log-parsers/spec.md
252
+ ### Requirement: 归一化消息携带轮次与用量元数据
253
+ 每条消息 SHALL 携带 turn_id / usage(五项)/ model / duration_ms /
254
+ sender,全部可缺省,缺失按「未知」呈现,不影响既有九字段
255
+ #### Scenario: 数据源无用量时元字段为 null
256
+ WHEN 数据源不含 token(如 cursor-agent transcript)
257
+ THEN 全部段 usage=null,RPC totalUsage=null</pre></div>
258
+ <div class="sample"><div class="cap">🚫 活规格条目(反例)<small>· 小任务 spec.md 原文,4 处错键</small></div>
259
+ <pre>openspec/specs/claude-autocompact-config/spec.md
260
+ - `autoCompactPreCompute`:布尔(压缩摘要预计算开关) ← <em>键名错误</em>
261
+ - WHEN 配 {"autoCompactPreCompute": true}
262
+ THEN settings.json 含该键 ← <em>正确键:precomputeCompactionEnabled</em>
263
+ 5 条 requirement 把错键记为系统行为契约——
264
+ 后续变更将信任并传播它(错误被典藏为「正典」)</pre></div>
265
+ </div>
266
+ </div>
267
+ <div class="one" style="margin-top:12px">都真资产:<b>sillyspec 沉淀「为什么 + 下次注意什么」并自动注入</b> · OpenSpec 沉淀「系统该怎么表现」 · 行为规格两边都有(台账式 vs 正典式)——但<b>资产带错,复利变负</b>(见右侧实物 ⚠)</div>
268
+ </section>
269
+
270
+ <!-- ④ 差距 -->
271
+ <section>
272
+ <h2 class="gap"><span class="n">4</span>目前的差距(不回避)</h2>
273
+ <div class="cards">
274
+ <div class="card gap">
275
+ <div class="big">1.3× / 2×</div>
276
+ <h3>墙钟落后(小 / 大任务)</h3>
277
+ <p>28 vs 21.5min;156 vs 80min。模型算力同量级,<b>差距全部在非模型时间</b>——门禁 + 编排等待,见下节拆解。</p>
278
+ </div>
279
+ <div class="card gap">
280
+ <div class="big">43% / 68%</div>
281
+ <h3>子代理扇出的成本倍增</h3>
282
+ <p>19 个子代理各自重建上下文,吃掉 42.3M tokens(43%)+ 522 请求(68%)。但这笔钱同时是<b>上下文保险</b>:每个子代理新鲜窗口(峰值 219K、用完即释),实现体量不进主会话——对方单会话上下文线性涨,爆了靠 auto-compact 硬扛(压缩丢细节)。<br><b>诚实注</b>:我们的主会话峰值 377K 反高于对方 317K——编排侧自己也会胖,超大任务需派发瘦身。</p>
283
+ </div>
284
+ <div class="card gap">
285
+ <div class="big">~60%</div>
286
+ <h3>大任务时间在等待</h3>
287
+ <p>子代理执行 / 门禁运行 / 审查回收占六成墙钟,主代理生成不足三分之一。<b>慢=编排深度</b>,但对外表现就是慢。</p>
288
+ </div>
289
+ <div class="card gap">
290
+ <div class="big">40% 假拦</div>
291
+ <h3>门禁噪声真实存在(历史)</h3>
292
+ <p>两个月 106 次门禁失败中:真拦 12、超时 36、环境 6。治理方向已定:<b>按触碰模块收敛范围</b>(文件级会漏真拦,有实证)+ 超时帽。</p>
293
+ </div>
294
+ </div>
295
+ <div class="one" style="margin-top:12px">差距定性:等待与假拦是<b>优化项</b>;审查与扇出是<b>防线的价格</b>——砍掉它=砍掉第 2 节的亮点。当前策略:保防线,砍等待。</div>
296
+ <div class="callout" style="background:var(--blue-bg);border:1px solid #c3d7fb;border-radius:10px;padding:12px 16px;margin-top:10px;font-size:13px">
297
+ <b style="display:block;margin-bottom:4px">扇出优化路线(砍冗余读取,不砍隔离与独立审查)</b>
298
+ ① 读取范围约束——allowed_paths 兼作读范围 + symbol-impact 符号锚点注入(直打 task-08 型 8.6M over-reading)<br>
299
+ ② 调研消化物共享——探索摘要落盘,实现子代理读两页 digest 替代重读源码(调研段 9.4M → ~5M)<br>
300
+ ③ batch 激进化——R4-S-F 实证 5 任务 2 batch 仅 6M:文件正交即并批,摊平 design/plan 重复重建<br>
301
+ ④ 派发材料包扩展——复用审查侧 assembleStageReviewMaterials 有界组装基建<br>
302
+ ⑤ 子代理模型分级——实现跑便宜档、审查保持旗舰(砍账单不砍 token)<br>
303
+ <span class="small">预期 ①+②+③ 把子代理段 42M → 20-25M,大任务 99M → ~78M(差距 1.9×→~1.5×);剩余差额=上下文保险 + 独立审查的价格。</span>
304
+ </div>
305
+ </section>
306
+
307
+ <!-- ④ 时间去哪了 -->
308
+ <section>
309
+ <h2><span class="n">5</span>时间去哪了(时间戳级分解)</h2>
310
+ <div class="legend">
311
+ <span><i class="s1"></i>探索</span><span><i class="s2"></i>实现+定向测试</span><span><i class="s3"></i>编排/子代理</span><span><i class="s4"></i>门禁</span><span><i class="s5"></i>独立审查</span><span><i class="s6"></i>收尾</span>
312
+ </div>
313
+ <div class="bar-row"><div class="lbl"><span>小任务 · OpenSpec</span><span>21.5min</span></div>
314
+ <div class="tok">⚡ 探索 <b>2.0M</b> · 四件套 <b>1.3M</b> · 实现 <b>4.9M</b> · 归档 <b>1.0M</b></div>
315
+ <div class="bar" style="width:77%"><div class="seg s1" style="width:28%">探索 6</div><div class="seg s2" style="width:14%">四件套 3</div><div class="seg s3" style="width:38%">实现 8</div><div class="seg s6" style="width:20%">归档 4.5</div></div></div>
316
+ <div class="bar-row"><div class="lbl"><span>小任务 · sillyspec quick</span><span>28min</span></div>
317
+ <div class="tok">⚡ 引导+核验 <b>2.1M</b> · 实现 <b>4.4M</b> · 门禁期 <b>1.3M</b> · 收尾 <b>1.2M</b></div>
318
+ <div class="bar"><div class="seg s1" style="width:22%">核验 6</div><div class="seg s2" style="width:32%">实现 9</div><div class="seg s4" style="width:36%">门禁 10</div><div class="seg s6" style="width:10%">收尾 3</div></div></div>
319
+ <p class="note">小任务差 6.5min ≈ <b>一轮门禁 + 域事实核验</b>——正是两道防线的价格。<b>quick 无四件套=轻通道设计</b>:无落盘设计决策的小修补不写流程文档,代之以 CLI 合成的四字段账目(近零写作成本,含在收尾段);对方无论任务多小都写四件套(3min / 1.3M)。(组内同尺度,条长∝墙钟;⚡为各阶段实测 tokens)</p>
320
+ <div class="bar-row"><div class="lbl"><span>大任务 · OpenSpec</span><span>80min</span></div>
321
+ <div class="tok">⚡ 探查 <b>5.6M</b> · 四件套 <b>1.5M</b> · 单会话实现 <b>42.6M</b> · 归档 <b>2.2M</b></div>
322
+ <div class="bar" style="width:51%"><div class="seg s1" style="width:24%">探查 19</div><div class="seg s2" style="width:4%">3</div><div class="seg s3" style="width:68%">单会话实现+回归 55</div><div class="seg s6" style="width:4%">3</div></div></div>
323
+ <div class="bar-row"><div class="lbl"><span>大任务 · sillyspec</span><span>156min</span></div>
324
+ <div class="tok">⚡ 调研 <b>10.6M</b> · 四件套 <b>4.2M</b> · 审查 <b>7.8M</b> · 六波执行(含子代理)<b>56.6M</b> · verify+收尾 <b>19.9M</b></div>
325
+ <div class="bar"><div class="seg s1" style="width:13%">调研 20</div><div class="seg s2" style="width:13%">四件套 20</div><div class="seg s5" style="width:11%">审查 17</div><div class="seg s3" style="width:46%">六波执行 73</div><div class="seg s4" style="width:11%">门禁 17</div><div class="seg s6" style="width:13%">收尾 20</div></div></div>
326
+ <p class="note">大任务差 76min = 审查 17 + 门禁 17(<b>质量溢价</b>)+ 编排开销 ~42(<b>扇出成本,优化候选</b>)。(组内同尺度,条长∝墙钟;⚡为各阶段实测 tokens——sillyspec 执行段 56.6M 里约 42M 是 19 个子代理的上下文重建,见差距卡 43%)</p>
327
+ </section>
328
+
329
+ <!-- ⑤ 一句话 -->
330
+ <section>
331
+ <h2><span class="n">6</span>一句话总结与选型</h2>
332
+ <div class="vs">
333
+ <div class="box ok"><b>🅰 sillyspec = 机器侧验证</b>声称完成必须过实测对账;四类缺陷有结构化防线。代价:等待与仪式。</div>
334
+ <div class="box bad"><b>🅱 OpenSpec = 模型侧自觉</b>快、轻、零等待;防线全靠 agent 自觉——格式校验不校验事实。</div>
335
+ </div>
336
+ <ul style="margin-top:12px;font-size:14px">
337
+ <li><b>小任务 → sillyspec quick</b>:28min、token 持平略优、一次过 + 资产落盘</li>
338
+ <li><b>大任务 → 按缺陷成本选</b>:生产平台(错一次贵)选全流程;原型快跑选轻流程</li>
339
+ <li><b>互相借鉴</b>:轻流程补「外部契约事实来源强制」;重流程做门禁模块粒度收敛</li>
340
+ </ul>
341
+ </section>
342
+
343
+ <p class="small" style="text-align:center">口径:sillyspec 墙钟为稳态(门禁单轮),OpenSpec 实测;tokens/请求均实测硬账 · n=1 对撞,墙钟按量级解读 · 底稿 sillyspec 仓 round4/</p>
344
+ <footer>2026-09-21</footer>
345
+ </div>
346
+ </body>
347
+ </html>