sillyspec 3.20.2 → 3.20.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.
Files changed (133) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +21 -21
  2. package/.claude/skills/sillyspec-auto/SKILL.md +83 -83
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +44 -44
  4. package/.claude/skills/sillyspec-commit/SKILL.md +106 -106
  5. package/.claude/skills/sillyspec-continue/SKILL.md +45 -45
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +31 -31
  7. package/.claude/skills/sillyspec-execute/SKILL.md +30 -30
  8. package/.claude/skills/sillyspec-explore/SKILL.md +109 -109
  9. package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
  10. package/.claude/skills/sillyspec-plan/SKILL.md +21 -21
  11. package/.claude/skills/sillyspec-propose/SKILL.md +21 -21
  12. package/.claude/skills/sillyspec-quick/SKILL.md +21 -21
  13. package/.claude/skills/sillyspec-resume/SKILL.md +68 -68
  14. package/.claude/skills/sillyspec-scan/SKILL.md +21 -21
  15. package/.claude/skills/sillyspec-state/SKILL.md +54 -54
  16. package/.claude/skills/sillyspec-status/SKILL.md +21 -21
  17. package/.claude/skills/sillyspec-verify/SKILL.md +21 -21
  18. package/.claude/skills/sillyspec-workspace/SKILL.md +157 -157
  19. package/.husky/pre-push +13 -13
  20. package/CLAUDE.md +18 -18
  21. package/README.md +198 -188
  22. package/SKILL.md +90 -91
  23. package/bin/sillyspec.js +2 -2
  24. package/docs/brainstorm-plan-contract.md +64 -64
  25. package/docs/plan-execute-contract.md +123 -123
  26. package/docs/platform-scan-protocol.md +298 -298
  27. package/docs/revision-mode.md +115 -115
  28. package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +99 -99
  29. package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +218 -218
  30. package/docs/sillyspec/file-lifecycle/stage-artifacts.md +167 -167
  31. package/docs/sillyspec/file-lifecycle/storage-and-state.md +148 -148
  32. package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +211 -193
  33. package/docs/sillyspec/file-lifecycle.md +125 -125
  34. package/docs/workflow-contract-regression.md +106 -106
  35. package/docs/worktree-isolation.md +252 -252
  36. package/package.json +40 -40
  37. package/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -7446
  38. package/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -1
  39. package/packages/dashboard/dist/index.html +16 -16
  40. package/packages/dashboard/index.html +15 -15
  41. package/packages/dashboard/package-lock.json +2384 -2384
  42. package/packages/dashboard/package.json +25 -25
  43. package/packages/dashboard/server/executor.js +86 -86
  44. package/packages/dashboard/server/index.js +588 -588
  45. package/packages/dashboard/server/parser.js +526 -526
  46. package/packages/dashboard/server/watcher.js +344 -344
  47. package/packages/dashboard/src/App.vue +558 -558
  48. package/packages/dashboard/src/components/ActionBar.vue +93 -93
  49. package/packages/dashboard/src/components/CommandPalette.vue +96 -96
  50. package/packages/dashboard/src/components/DetailPanel.vue +137 -137
  51. package/packages/dashboard/src/components/LogStream.vue +65 -65
  52. package/packages/dashboard/src/components/PipelineStage.vue +95 -95
  53. package/packages/dashboard/src/components/PipelineView.vue +156 -156
  54. package/packages/dashboard/src/components/ProjectList.vue +210 -210
  55. package/packages/dashboard/src/components/StageBadge.vue +67 -67
  56. package/packages/dashboard/src/components/StepCard.vue +94 -94
  57. package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -48
  58. package/packages/dashboard/src/components/detail/GitDetail.vue +61 -61
  59. package/packages/dashboard/src/components/detail/TechDetail.vue +43 -43
  60. package/packages/dashboard/src/composables/useDashboard.js +170 -170
  61. package/packages/dashboard/src/composables/useKeyboard.js +119 -119
  62. package/packages/dashboard/src/composables/useWebSocket.js +129 -129
  63. package/packages/dashboard/src/main.js +8 -8
  64. package/packages/dashboard/src/style.css +132 -132
  65. package/packages/dashboard/vite.config.js +18 -18
  66. package/src/brainstorm-postcheck.js +158 -158
  67. package/src/change-list.js +52 -52
  68. package/src/change-risk-profile.js +352 -352
  69. package/src/classify-change.js +73 -73
  70. package/src/constants.js +70 -70
  71. package/src/contract-matrix.js +278 -278
  72. package/src/db.js +201 -201
  73. package/src/endpoint-extractor.js +315 -315
  74. package/src/hooks/claude-pre-tool-use.cjs +125 -125
  75. package/src/hooks/worktree-guard.js +653 -653
  76. package/src/index.js +922 -900
  77. package/src/init.js +431 -431
  78. package/src/knowledge-match.js +130 -130
  79. package/src/migrate.js +117 -117
  80. package/src/modules.js +482 -482
  81. package/src/progress.js +1734 -1734
  82. package/src/run.js +3465 -3358
  83. package/src/scan-postcheck.js +387 -383
  84. package/src/setup.js +398 -398
  85. package/src/stage-contract.js +700 -700
  86. package/src/stages/archive.js +160 -160
  87. package/src/stages/brainstorm-auto.js +229 -229
  88. package/src/stages/brainstorm.js +645 -645
  89. package/src/stages/doctor.js +365 -365
  90. package/src/stages/execute.js +625 -625
  91. package/src/stages/explore.js +34 -34
  92. package/src/stages/index.js +29 -29
  93. package/src/stages/knowledge.js +498 -498
  94. package/src/stages/plan-postcheck.js +511 -513
  95. package/src/stages/plan.js +582 -582
  96. package/src/stages/propose.js +174 -174
  97. package/src/stages/quick.js +82 -82
  98. package/src/stages/scan.js +558 -558
  99. package/src/stages/status.js +65 -65
  100. package/src/stages/verify.js +322 -322
  101. package/src/sync.js +497 -497
  102. package/src/task-review.js +346 -346
  103. package/src/workflow.js +785 -785
  104. package/src/worktree-apply.js +549 -549
  105. package/src/worktree-deps.js +185 -0
  106. package/src/worktree.js +982 -932
  107. package/templates/workflows/archive-impact.yaml +79 -79
  108. package/templates/workflows/scan-docs.yaml +132 -132
  109. package/test/brainstorm-plan-contract.test.mjs +273 -273
  110. package/test/check-syntax.mjs +26 -26
  111. package/test/contract-artifacts.test.mjs +323 -323
  112. package/test/decision-supersede.test.mjs +277 -277
  113. package/test/knowledge-match.test.mjs +231 -231
  114. package/test/plan-execute-contract.test.mjs +330 -330
  115. package/test/plan-optimization.test.mjs +572 -572
  116. package/test/platform-artifacts.test.mjs +166 -166
  117. package/test/platform-failure-samples.test.mjs +199 -199
  118. package/test/platform-recovery-chain.test.mjs +167 -167
  119. package/test/platform-recovery.test.mjs +136 -136
  120. package/test/platform-scan-p0.test.mjs +168 -168
  121. package/test/revision-v1.test.mjs +1145 -1145
  122. package/test/run-scan-project-parse.test.mjs +200 -200
  123. package/test/run-tests.mjs +48 -48
  124. package/test/scan-knowledge.test.mjs +175 -175
  125. package/test/scan-paths.test.mjs +68 -68
  126. package/test/scan-postcheck.test.mjs +197 -197
  127. package/test/spec-dir.test.mjs +206 -206
  128. package/test/stage-contract.test.mjs +299 -299
  129. package/test/stage-definitions.test.mjs +39 -39
  130. package/test/wait-gates.test.mjs +496 -496
  131. package/test/worktree-deps-provision.test.mjs +148 -0
  132. package/test/worktree-guard.test.mjs +71 -71
  133. package/test/worktree-native-overlay.test.mjs +188 -188
@@ -1,298 +1,298 @@
1
- # 平台 Scan 产物协议
2
-
3
- SillySpec 平台执行模式的核心设计:**SillySpec 写产物,SillyHub 读产物**。平台不看 stdout,只靠文件系统判断 scan 成功、失败原因和证据文件位置。
4
-
5
- ## 状态枚举(src/constants.js)
6
-
7
- 所有平台产物共享同一套枚举值,SillyHub 直接使用常量,不猜字符串。
8
-
9
- ### SCAN_STATUS
10
-
11
- | 值 | 说明 |
12
- ---|---|
13
- | `pending` | scan 未开始 |
14
- | `in_progress` | scan 进行中 |
15
- | `success` | scan 成功,所有检查通过 |
16
- | `completed_with_warnings` | scan 成功但有警告 |
17
- | `failed_post_check` | scan 失败,post-check 不通过 |
18
-
19
- ### POINTER_STATUS
20
-
21
- | 值 | 说明 |
22
- ---|---|
23
- | `active` | 指针活跃,任务进行中 |
24
- | `scan_completed` | scan 已完成 |
25
- | `stale` | 指针过时(完成超过 24h,建议清理) |
26
- | `corrupted` | 指针损坏(缺少必要字段) |
27
-
28
- ### CHECK_SEVERITY
29
-
30
- | 值 | 说明 |
31
- ---|---|
32
- | `failed` | 严重:阻止成功 |
33
- | `warning` | 警告:不阻止成功 |
34
- | `passed` | 通过 |
35
-
36
- ## 目录结构
37
-
38
- ```
39
- <spec_root>/
40
- ├── manifest.json # 扫描元数据 + 产物索引
41
- ├── docs/<project>/scan/ # 项目文档
42
- │ ├── ARCHITECTURE.md
43
- │ ├── CONVENTIONS.md
44
- │ ├── PROJECT.md
45
- │ ├── STACK.md
46
- │ ├── STRUCTURE.md
47
- │ └── ... (7 份必需文档)
48
- ├── projects/*.yaml # 子项目注册
49
- ├── changes/<change-name>/ # 变更目录
50
- └── .runtime/
51
- ├── postcheck-result.json # post-check 结构化结果
52
- └── platform-scan.json # 平台参数持久化(主文件)
53
-
54
- <runtime_root>/
55
- └── scan-runs/<scan_run_id>/
56
- └── workflow-runs/
57
- └── <timestamp>-<workflow>-<project>-<status>.json # workflow 检查结果
58
-
59
- <source_root>/
60
- ├── .sillyspec-platform.json # 平台参数恢复指针(轻量,不在 .sillyspec 内)
61
- └── (源码,禁止 .sillyspec/ 污染)
62
- ```
63
-
64
- ## manifest.json
65
-
66
- scan 完成后写入 `<spec_root>/manifest.json`,是 SillyHub 判断 scan 结果的入口文件。
67
-
68
- ### 结构
69
-
70
- ```json
71
- {
72
- "workspace_id": "ws-xxx",
73
- "scan_run_id": "scan-2026-06-14-test-001",
74
- "source_root": "/path/to/source",
75
- "spec_root": "/path/to/spec",
76
- "runtime_root": "/path/to/runtime",
77
- "source_commit": "abc123...",
78
- "source_commit_error": null,
79
- "generated_at": "2026-06-14T01:50:00.000Z",
80
- "schema_version": 1,
81
- "postcheck_result_path": "<spec_root>/.runtime/postcheck-result.json",
82
- "workflow_runs_dir": "<runtime_root>/scan-runs/<scan_run_id>/workflow-runs",
83
- "platform_pointer_path": "<source_root>/.sillyspec-platform.json",
84
- "platform_pointer_status": "active",
85
- "scan_post_check": {
86
- "status": "success | completed_with_warnings | failed_post_check",
87
- "checks": [...]
88
- }
89
- }
90
- ```
91
-
92
- ### 字段说明
93
-
94
- | 字段 | 类型 | 说明 |
95
- |---|---|---|
96
- | `workspace_id` | string \| null | SillyHub workspace 标识 |
97
- | `scan_run_id` | string \| null | 本次 scan 唯一标识 |
98
- | `source_root` | string | 源码目录绝对路径 |
99
- | `spec_root` | string \| null | 规范目录(specDir) |
100
- | `runtime_root` | string \| null | 运行时产物目录 |
101
- | `source_commit` | string \| null | 源码 HEAD commit hash |
102
- | `source_commit_error` | string \| undefined | commit 获取失败原因 |
103
- | `generated_at` | string (ISO 8601) | manifest 生成时间 |
104
- | `schema_version` | number | 产物协议版本,当前为 1 |
105
- | `postcheck_result_path` | string \| null | post-check 结构化结果路径 |
106
- | `workflow_runs_dir` | string \| null | workflow 检查结果目录 |
107
- | `platform_pointer_path` | string | 平台指针文件路径 |
108
- | `platform_pointer_status` | string | 初始 `active`,由指针文件独立更新 |
109
- | `scan_post_check` | object \| undefined | post-check 结果(写入后追加) |
110
-
111
- ### 判断 scan 结果
112
-
113
- SillyHub 消费 manifest 的方式:
114
-
115
- 1. 读取 `<spec_root>/manifest.json`
116
- 2. 检查 `scan_post_check.status`:
117
- - `success` → scan 成功
118
- - `completed_with_warnings` → scan 成功但有警告
119
- - `failed_post_check` → scan 失败
120
- 3. 如果失败,读 `scan_post_check.checks` 获取具体失败项
121
- 4. 读 `postcheck_result_path` 获取完整结构化结果
122
- 5. 读 `workflow_runs_dir` 获取 workflow 检查证据
123
-
124
- ## .sillyspec-platform.json
125
-
126
- 跨 `--done` 生命周期的轻量指针文件,存储在 `<source_root>/.sillyspec-platform.json`(不在 `.sillyspec/` 内,不污染源码结构)。
127
-
128
- ### 生命周期
129
-
130
- | 阶段 | 行为 |
131
- |---|---|
132
- | **创建** | `run scan --spec-root` 时,写入 cwd 根目录 |
133
- | **读取** | 每次 `run`/`--done`/`--skip` 时,优先从 pointer 恢复平台参数 |
134
- | **更新** | 每次 `run` 时刷新 `savedAt` |
135
- | **完成标记** | scan post-check 后追加 `status=scan_completed` + `completedAt` + `scanStatus` |
136
- | **异常检测** | pointer 存在但缺 `specRoot` 时报错退出 |
137
- | **清理** | 无自动清理。`sillyspec platform pointer` 查看状态,`sillyspec platform pointer --cleanup` 手动清理 |
138
-
139
- ### CLI 检查命令
140
-
141
- ```bash
142
- # 查看指针状态
143
- sillyspec platform pointer
144
-
145
- # 清理过时/损坏指针
146
- sillyspec platform pointer --cleanup
147
- ```
148
-
149
- 输出示例:
150
- ```
151
- 📄 指针文件: /path/to/source/.sillyspec-platform.json
152
- specRoot: /path/to/spec
153
- runtimeRoot: /path/to/runtime
154
- workspaceId: ws-xxx
155
- scanRunId: scan-2026-06-14-test-001
156
- savedAt: 2026-06-14T01:50:00.000Z
157
- 状态: stale ⚠️
158
- completedAt: 2026-06-12T01:00:00.000Z
159
- scanStatus: success
160
- ⚠️ 指针已过时(完成超过 24h),可以安全删除。
161
- ```
162
-
163
- 状态判定逻辑:
164
- - 缺少 `specRoot` → `corrupted`
165
- - `status=scan_completed` 且 `completedAt` 超过 24h → `stale`
166
- - `status=scan_completed` 且未超时 → `scan_completed` ✅
167
- - 无 `status` 字段 → `active` 🔄
168
-
169
- ### 结构
170
-
171
- ```json
172
- {
173
- "specRoot": "/path/to/spec",
174
- "runtimeRoot": "/path/to/runtime",
175
- "workspaceId": "ws-xxx",
176
- "scanRunId": "scan-2026-06-14-test-001",
177
- "savedAt": "2026-06-14T01:50:00.000Z"
178
- }
179
- ```
180
-
181
- scan 完成后追加:
182
-
183
- ```json
184
- {
185
- "status": "scan_completed",
186
- "completedAt": "2026-06-14T01:52:00.000Z",
187
- "scanStatus": "success"
188
- }
189
- ```
190
-
191
- ## postcheck-result.json
192
-
193
- 写入 `<spec_root>/.runtime/postcheck-result.json`(平台模式)或 `<cwd>/.sillyspec/.runtime/postcheck-result.json`(本地模式)。
194
-
195
- ### 结构
196
-
197
- ```json
198
- {
199
- "workspace_id": "ws-xxx",
200
- "scan_run_id": "scan-2026-06-14-test-001",
201
- "status": "success | completed_with_warnings | failed_post_check",
202
- "source_root": "/path/to/source",
203
- "spec_root": "/path/to/spec",
204
- "runtime_root": "/path/to/runtime",
205
- "checks": [
206
- {
207
- "name": "source_root_docs_leak",
208
- "severity": "failed | warning",
209
- "detail": "..."
210
- }
211
- ],
212
- "source_root_leak": true,
213
- "docs_missing": ["ARCHITECTURE.md"],
214
- "profile": {
215
- "mode": "quick | standard | deep",
216
- "file_count": 10,
217
- "source_bytes": 102400,
218
- "project_count": 1,
219
- "reason": "..."
220
- }
221
- }
222
- ```
223
-
224
- ### check 类型
225
-
226
- | check name | severity | 说明 |
227
- |---|---|---|
228
- | `source_root_docs_leak` | failed | docs 文档泄漏到 source_root |
229
- | `source_root_leak` | failed | projects/workflows/knowledge/manifest/local 泄漏到 source_root |
230
- | `all_docs_missing` | failed | 7 份必需文档全部缺失 |
231
- | `partial_docs_missing` | failed | 部分文档缺失 |
232
- | `docs_missing_header` | warning | 文档缺少 frontmatter |
233
- | `local_config_invalid` | warning | local.yaml 中命令不存在 |
234
- | `tool_use_error` | warning | AI 执行工具调用错误 |
235
- | `api_error` | warning | API 错误(529/429/超时) |
236
-
237
- ## workflow-runs
238
-
239
- 写入 `<runtime_root>/scan-runs/<scan_run_id>/workflow-runs/`(平台模式)或 `<cwd>/.sillyspec/.runtime/workflow-runs/`(本地模式)。
240
-
241
- 每个文件命名:`<timestamp>-<workflow>-<project>-<status>.json`
242
-
243
- ### 结构
244
-
245
- ```json
246
- {
247
- "run_id": "20260614015000-scan-docs-test-project-pass",
248
- "created_at": "2026-06-14T01:50:00.000Z",
249
- "source": "run.js",
250
- "stage": "scan",
251
- "step": "深度扫描",
252
- "workflow": "scan-docs",
253
- "project": "test-project",
254
- "status": "pass | fail",
255
- "spec_version": 1,
256
- "roles": [...],
257
- "workflow_checks": [...],
258
- "failures": [...],
259
- "retry_prompts": [...]
260
- }
261
- ```
262
-
263
- ## source_root 零污染
264
-
265
- 平台模式的核心约束:source_root 下不产生 `.sillyspec/` 目录。
266
-
267
- post-check 会检查以下路径是否存在泄漏:
268
- - `<source_root>/.sillyspec/docs/` — 文档泄漏
269
- - `<source_root>/.sillyspec/projects/` — 项目注册泄漏
270
- - `<source_root>/.sillyspec/workflows/` — 工作流泄漏
271
- - `<source_root>/.sillyspec/knowledge/` — 术语泄漏
272
- - `<source_root>/.sillyspec/manifest.json` — manifest 泄漏
273
- - `<source_root>/.sillyspec/local.yaml` — 配置泄漏
274
-
275
- ## 产物消费优先级
276
-
277
- SillyHub 判断 scan 结果的推荐顺序:
278
-
279
- 1. `manifest.json` → `scan_post_check.overall_status` → 快速判断成功/失败
280
- 2. `postcheck-result.json` → 完整检查明细 + failure_categories
281
- 3. `workflow-runs/*.json` → workflow 检查证据
282
- 4. `docs/<project>/scan/*.md` → 实际文档内容
283
-
284
- ### failure_categories
285
-
286
- `postcheck-result.json` 中的 `failure_categories` 提供分类视图:
287
-
288
- | 类别 | 包含的 check |
289
- ---|---|
290
- | `path_pollution` | source_root_leak, source_root_docs_leak |
291
- | `missing_outputs` | all_docs_missing, partial_docs_missing, missing_docs |
292
- | `bad_references` | local_config_invalid |
293
- | `quality_warnings` | tool_use_error, api_error_529, rate_limit_exhausted, fallback_or_skip |
294
- | `violations` | manifest_write_failed, project_list_parse_failed + 所有 path_pollution |
295
-
296
- SillyHub 可以按类别快速定位问题域,而不需要遍历所有 checks。
297
-
298
- 不需要解析 stdout。
1
+ # 平台 Scan 产物协议
2
+
3
+ SillySpec 平台执行模式的核心设计:**SillySpec 写产物,SillyHub 读产物**。平台不看 stdout,只靠文件系统判断 scan 成功、失败原因和证据文件位置。
4
+
5
+ ## 状态枚举(src/constants.js)
6
+
7
+ 所有平台产物共享同一套枚举值,SillyHub 直接使用常量,不猜字符串。
8
+
9
+ ### SCAN_STATUS
10
+
11
+ | 值 | 说明 |
12
+ ---|---|
13
+ | `pending` | scan 未开始 |
14
+ | `in_progress` | scan 进行中 |
15
+ | `success` | scan 成功,所有检查通过 |
16
+ | `completed_with_warnings` | scan 成功但有警告 |
17
+ | `failed_post_check` | scan 失败,post-check 不通过 |
18
+
19
+ ### POINTER_STATUS
20
+
21
+ | 值 | 说明 |
22
+ ---|---|
23
+ | `active` | 指针活跃,任务进行中 |
24
+ | `scan_completed` | scan 已完成 |
25
+ | `stale` | 指针过时(完成超过 24h,建议清理) |
26
+ | `corrupted` | 指针损坏(缺少必要字段) |
27
+
28
+ ### CHECK_SEVERITY
29
+
30
+ | 值 | 说明 |
31
+ ---|---|
32
+ | `failed` | 严重:阻止成功 |
33
+ | `warning` | 警告:不阻止成功 |
34
+ | `passed` | 通过 |
35
+
36
+ ## 目录结构
37
+
38
+ ```
39
+ <spec_root>/
40
+ ├── manifest.json # 扫描元数据 + 产物索引
41
+ ├── docs/<project>/scan/ # 项目文档
42
+ │ ├── ARCHITECTURE.md
43
+ │ ├── CONVENTIONS.md
44
+ │ ├── PROJECT.md
45
+ │ ├── STACK.md
46
+ │ ├── STRUCTURE.md
47
+ │ └── ... (7 份必需文档)
48
+ ├── projects/*.yaml # 子项目注册
49
+ ├── changes/<change-name>/ # 变更目录
50
+ └── .runtime/
51
+ ├── postcheck-result.json # post-check 结构化结果
52
+ └── platform-scan.json # 平台参数持久化(主文件)
53
+
54
+ <runtime_root>/
55
+ └── scan-runs/<scan_run_id>/
56
+ └── workflow-runs/
57
+ └── <timestamp>-<workflow>-<project>-<status>.json # workflow 检查结果
58
+
59
+ <source_root>/
60
+ ├── .sillyspec-platform.json # 平台参数恢复指针(轻量,不在 .sillyspec 内)
61
+ └── (源码,禁止 .sillyspec/ 污染)
62
+ ```
63
+
64
+ ## manifest.json
65
+
66
+ scan 完成后写入 `<spec_root>/manifest.json`,是 SillyHub 判断 scan 结果的入口文件。
67
+
68
+ ### 结构
69
+
70
+ ```json
71
+ {
72
+ "workspace_id": "ws-xxx",
73
+ "scan_run_id": "scan-2026-06-14-test-001",
74
+ "source_root": "/path/to/source",
75
+ "spec_root": "/path/to/spec",
76
+ "runtime_root": "/path/to/runtime",
77
+ "source_commit": "abc123...",
78
+ "source_commit_error": null,
79
+ "generated_at": "2026-06-14T01:50:00.000Z",
80
+ "schema_version": 1,
81
+ "postcheck_result_path": "<spec_root>/.runtime/postcheck-result.json",
82
+ "workflow_runs_dir": "<runtime_root>/scan-runs/<scan_run_id>/workflow-runs",
83
+ "platform_pointer_path": "<source_root>/.sillyspec-platform.json",
84
+ "platform_pointer_status": "active",
85
+ "scan_post_check": {
86
+ "status": "success | completed_with_warnings | failed_post_check",
87
+ "checks": [...]
88
+ }
89
+ }
90
+ ```
91
+
92
+ ### 字段说明
93
+
94
+ | 字段 | 类型 | 说明 |
95
+ |---|---|---|
96
+ | `workspace_id` | string \| null | SillyHub workspace 标识 |
97
+ | `scan_run_id` | string \| null | 本次 scan 唯一标识 |
98
+ | `source_root` | string | 源码目录绝对路径 |
99
+ | `spec_root` | string \| null | 规范目录(specDir) |
100
+ | `runtime_root` | string \| null | 运行时产物目录 |
101
+ | `source_commit` | string \| null | 源码 HEAD commit hash |
102
+ | `source_commit_error` | string \| undefined | commit 获取失败原因 |
103
+ | `generated_at` | string (ISO 8601) | manifest 生成时间 |
104
+ | `schema_version` | number | 产物协议版本,当前为 1 |
105
+ | `postcheck_result_path` | string \| null | post-check 结构化结果路径 |
106
+ | `workflow_runs_dir` | string \| null | workflow 检查结果目录 |
107
+ | `platform_pointer_path` | string | 平台指针文件路径 |
108
+ | `platform_pointer_status` | string | 初始 `active`,由指针文件独立更新 |
109
+ | `scan_post_check` | object \| undefined | post-check 结果(写入后追加) |
110
+
111
+ ### 判断 scan 结果
112
+
113
+ SillyHub 消费 manifest 的方式:
114
+
115
+ 1. 读取 `<spec_root>/manifest.json`
116
+ 2. 检查 `scan_post_check.status`:
117
+ - `success` → scan 成功
118
+ - `completed_with_warnings` → scan 成功但有警告
119
+ - `failed_post_check` → scan 失败
120
+ 3. 如果失败,读 `scan_post_check.checks` 获取具体失败项
121
+ 4. 读 `postcheck_result_path` 获取完整结构化结果
122
+ 5. 读 `workflow_runs_dir` 获取 workflow 检查证据
123
+
124
+ ## .sillyspec-platform.json
125
+
126
+ 跨 `--done` 生命周期的轻量指针文件,存储在 `<source_root>/.sillyspec-platform.json`(不在 `.sillyspec/` 内,不污染源码结构)。
127
+
128
+ ### 生命周期
129
+
130
+ | 阶段 | 行为 |
131
+ |---|---|
132
+ | **创建** | `run scan --spec-root` 时,写入 cwd 根目录 |
133
+ | **读取** | 每次 `run`/`--done`/`--skip` 时,优先从 pointer 恢复平台参数 |
134
+ | **更新** | 每次 `run` 时刷新 `savedAt` |
135
+ | **完成标记** | scan post-check 后追加 `status=scan_completed` + `completedAt` + `scanStatus` |
136
+ | **异常检测** | pointer 存在但缺 `specRoot` 时报错退出 |
137
+ | **清理** | 无自动清理。`sillyspec platform pointer` 查看状态,`sillyspec platform pointer --cleanup` 手动清理 |
138
+
139
+ ### CLI 检查命令
140
+
141
+ ```bash
142
+ # 查看指针状态
143
+ sillyspec platform pointer
144
+
145
+ # 清理过时/损坏指针
146
+ sillyspec platform pointer --cleanup
147
+ ```
148
+
149
+ 输出示例:
150
+ ```
151
+ 📄 指针文件: /path/to/source/.sillyspec-platform.json
152
+ specRoot: /path/to/spec
153
+ runtimeRoot: /path/to/runtime
154
+ workspaceId: ws-xxx
155
+ scanRunId: scan-2026-06-14-test-001
156
+ savedAt: 2026-06-14T01:50:00.000Z
157
+ 状态: stale ⚠️
158
+ completedAt: 2026-06-12T01:00:00.000Z
159
+ scanStatus: success
160
+ ⚠️ 指针已过时(完成超过 24h),可以安全删除。
161
+ ```
162
+
163
+ 状态判定逻辑:
164
+ - 缺少 `specRoot` → `corrupted`
165
+ - `status=scan_completed` 且 `completedAt` 超过 24h → `stale`
166
+ - `status=scan_completed` 且未超时 → `scan_completed` ✅
167
+ - 无 `status` 字段 → `active` 🔄
168
+
169
+ ### 结构
170
+
171
+ ```json
172
+ {
173
+ "specRoot": "/path/to/spec",
174
+ "runtimeRoot": "/path/to/runtime",
175
+ "workspaceId": "ws-xxx",
176
+ "scanRunId": "scan-2026-06-14-test-001",
177
+ "savedAt": "2026-06-14T01:50:00.000Z"
178
+ }
179
+ ```
180
+
181
+ scan 完成后追加:
182
+
183
+ ```json
184
+ {
185
+ "status": "scan_completed",
186
+ "completedAt": "2026-06-14T01:52:00.000Z",
187
+ "scanStatus": "success"
188
+ }
189
+ ```
190
+
191
+ ## postcheck-result.json
192
+
193
+ 写入 `<spec_root>/.runtime/postcheck-result.json`(平台模式)或 `<cwd>/.sillyspec/.runtime/postcheck-result.json`(本地模式)。
194
+
195
+ ### 结构
196
+
197
+ ```json
198
+ {
199
+ "workspace_id": "ws-xxx",
200
+ "scan_run_id": "scan-2026-06-14-test-001",
201
+ "status": "success | completed_with_warnings | failed_post_check",
202
+ "source_root": "/path/to/source",
203
+ "spec_root": "/path/to/spec",
204
+ "runtime_root": "/path/to/runtime",
205
+ "checks": [
206
+ {
207
+ "name": "source_root_docs_leak",
208
+ "severity": "failed | warning",
209
+ "detail": "..."
210
+ }
211
+ ],
212
+ "source_root_leak": true,
213
+ "docs_missing": ["ARCHITECTURE.md"],
214
+ "profile": {
215
+ "mode": "quick | standard | deep",
216
+ "file_count": 10,
217
+ "source_bytes": 102400,
218
+ "project_count": 1,
219
+ "reason": "..."
220
+ }
221
+ }
222
+ ```
223
+
224
+ ### check 类型
225
+
226
+ | check name | severity | 说明 |
227
+ |---|---|---|
228
+ | `source_root_docs_leak` | failed | docs 文档泄漏到 source_root |
229
+ | `source_root_leak` | failed | projects/workflows/knowledge/manifest/local 泄漏到 source_root |
230
+ | `all_docs_missing` | failed | 7 份必需文档全部缺失 |
231
+ | `partial_docs_missing` | failed | 部分文档缺失 |
232
+ | `docs_missing_header` | warning | 文档缺少 frontmatter |
233
+ | `local_config_invalid` | warning | local.yaml 中命令不存在 |
234
+ | `tool_use_error` | warning | AI 执行工具调用错误 |
235
+ | `api_error` | warning | API 错误(529/429/超时) |
236
+
237
+ ## workflow-runs
238
+
239
+ 写入 `<runtime_root>/scan-runs/<scan_run_id>/workflow-runs/`(平台模式)或 `<cwd>/.sillyspec/.runtime/workflow-runs/`(本地模式)。
240
+
241
+ 每个文件命名:`<timestamp>-<workflow>-<project>-<status>.json`
242
+
243
+ ### 结构
244
+
245
+ ```json
246
+ {
247
+ "run_id": "20260614015000-scan-docs-test-project-pass",
248
+ "created_at": "2026-06-14T01:50:00.000Z",
249
+ "source": "run.js",
250
+ "stage": "scan",
251
+ "step": "深度扫描",
252
+ "workflow": "scan-docs",
253
+ "project": "test-project",
254
+ "status": "pass | fail",
255
+ "spec_version": 1,
256
+ "roles": [...],
257
+ "workflow_checks": [...],
258
+ "failures": [...],
259
+ "retry_prompts": [...]
260
+ }
261
+ ```
262
+
263
+ ## source_root 零污染
264
+
265
+ 平台模式的核心约束:source_root 下不产生 `.sillyspec/` 目录。
266
+
267
+ post-check 会检查以下路径是否存在泄漏:
268
+ - `<source_root>/.sillyspec/docs/` — 文档泄漏
269
+ - `<source_root>/.sillyspec/projects/` — 项目注册泄漏
270
+ - `<source_root>/.sillyspec/workflows/` — 工作流泄漏
271
+ - `<source_root>/.sillyspec/knowledge/` — 术语泄漏
272
+ - `<source_root>/.sillyspec/manifest.json` — manifest 泄漏
273
+ - `<source_root>/.sillyspec/local.yaml` — 配置泄漏
274
+
275
+ ## 产物消费优先级
276
+
277
+ SillyHub 判断 scan 结果的推荐顺序:
278
+
279
+ 1. `manifest.json` → `scan_post_check.overall_status` → 快速判断成功/失败
280
+ 2. `postcheck-result.json` → 完整检查明细 + failure_categories
281
+ 3. `workflow-runs/*.json` → workflow 检查证据
282
+ 4. `docs/<project>/scan/*.md` → 实际文档内容
283
+
284
+ ### failure_categories
285
+
286
+ `postcheck-result.json` 中的 `failure_categories` 提供分类视图:
287
+
288
+ | 类别 | 包含的 check |
289
+ ---|---|
290
+ | `path_pollution` | source_root_leak, source_root_docs_leak |
291
+ | `missing_outputs` | all_docs_missing, partial_docs_missing, missing_docs |
292
+ | `bad_references` | local_config_invalid |
293
+ | `quality_warnings` | tool_use_error, api_error_529, rate_limit_exhausted, fallback_or_skip |
294
+ | `violations` | manifest_write_failed, project_list_parse_failed + 所有 path_pollution |
295
+
296
+ SillyHub 可以按类别快速定位问题域,而不需要遍历所有 checks。
297
+
298
+ 不需要解析 stdout。