@warpgogol/forge 5.3.4 → 6.2.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 (253) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/bin/cli.ts +7 -2
  3. package/dist/bin/cli.js +7 -2
  4. package/dist/bin/cli.js.map +1 -1
  5. package/dist/os/adr/adr.module.d.ts.map +1 -1
  6. package/dist/os/adr/adr.module.js +2 -0
  7. package/dist/os/adr/adr.module.js.map +1 -1
  8. package/dist/os/audit/audit.module.d.ts.map +1 -1
  9. package/dist/os/audit/audit.module.js +2 -0
  10. package/dist/os/audit/audit.module.js.map +1 -1
  11. package/dist/os/compass/compass.module.d.ts.map +1 -1
  12. package/dist/os/compass/compass.module.js +47 -15
  13. package/dist/os/compass/compass.module.js.map +1 -1
  14. package/dist/os/compass/handlers/compass-audit-handler.d.ts +2 -0
  15. package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
  16. package/dist/os/compass/handlers/compass-audit-handler.js +40 -10
  17. package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
  18. package/dist/os/compass/handlers/compass-docs-validate.d.ts +13 -0
  19. package/dist/os/compass/handlers/compass-docs-validate.d.ts.map +1 -0
  20. package/dist/os/compass/handlers/compass-docs-validate.js +328 -0
  21. package/dist/os/compass/handlers/compass-docs-validate.js.map +1 -0
  22. package/dist/os/compass/handlers/summary-record.d.ts +11 -2
  23. package/dist/os/compass/handlers/summary-record.d.ts.map +1 -1
  24. package/dist/os/compass/handlers/summary-record.js +95 -15
  25. package/dist/os/compass/handlers/summary-record.js.map +1 -1
  26. package/dist/os/core/core.module.d.ts.map +1 -1
  27. package/dist/os/core/core.module.js +124 -73
  28. package/dist/os/core/core.module.js.map +1 -1
  29. package/dist/os/core/handlers/file-size-lint.d.ts.map +1 -1
  30. package/dist/os/core/handlers/file-size-lint.js +2 -0
  31. package/dist/os/core/handlers/file-size-lint.js.map +1 -1
  32. package/dist/os/exploration/exploration.module.d.ts.map +1 -1
  33. package/dist/os/exploration/exploration.module.js +3 -0
  34. package/dist/os/exploration/exploration.module.js.map +1 -1
  35. package/dist/os/naming/naming-convention.d.ts.map +1 -1
  36. package/dist/os/naming/naming-convention.js +11 -1
  37. package/dist/os/naming/naming-convention.js.map +1 -1
  38. package/dist/os/naming/naming.module.d.ts.map +1 -1
  39. package/dist/os/naming/naming.module.js +9 -2
  40. package/dist/os/naming/naming.module.js.map +1 -1
  41. package/dist/os/notes/notes.module.d.ts.map +1 -1
  42. package/dist/os/notes/notes.module.js +17 -6
  43. package/dist/os/notes/notes.module.js.map +1 -1
  44. package/dist/os/plan/plan.module.d.ts.map +1 -1
  45. package/dist/os/plan/plan.module.js +2 -0
  46. package/dist/os/plan/plan.module.js.map +1 -1
  47. package/dist/os/plugin/plugin.module.d.ts.map +1 -1
  48. package/dist/os/plugin/plugin.module.js +9 -2
  49. package/dist/os/plugin/plugin.module.js.map +1 -1
  50. package/dist/os/program/program.module.d.ts.map +1 -1
  51. package/dist/os/program/program.module.js +19 -4
  52. package/dist/os/program/program.module.js.map +1 -1
  53. package/dist/os/queue/handlers/queue-validate.d.ts.map +1 -1
  54. package/dist/os/queue/handlers/queue-validate.js +154 -7
  55. package/dist/os/queue/handlers/queue-validate.js.map +1 -1
  56. package/dist/os/queue/manifest.d.ts +17 -1
  57. package/dist/os/queue/manifest.d.ts.map +1 -1
  58. package/dist/os/queue/manifest.js +127 -6
  59. package/dist/os/queue/manifest.js.map +1 -1
  60. package/dist/os/queue/queue.module.d.ts.map +1 -1
  61. package/dist/os/queue/queue.module.js +32 -4
  62. package/dist/os/queue/queue.module.js.map +1 -1
  63. package/dist/os/queue/types.d.ts +100 -1
  64. package/dist/os/queue/types.d.ts.map +1 -1
  65. package/dist/os/queue/types.js +44 -0
  66. package/dist/os/queue/types.js.map +1 -1
  67. package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
  68. package/dist/os/rfc/handlers/implement-stamp.js +30 -8
  69. package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
  70. package/dist/os/rfc/rfc.module.d.ts.map +1 -1
  71. package/dist/os/rfc/rfc.module.js +25 -6
  72. package/dist/os/rfc/rfc.module.js.map +1 -1
  73. package/dist/os/rfc/types.d.ts +12 -2
  74. package/dist/os/rfc/types.d.ts.map +1 -1
  75. package/dist/os/rfc/types.js +2 -2
  76. package/dist/os/rfc/types.js.map +1 -1
  77. package/dist/os/rfc/verification-evidence.d.ts +21 -0
  78. package/dist/os/rfc/verification-evidence.d.ts.map +1 -1
  79. package/dist/os/rfc/verification-evidence.js +134 -23
  80. package/dist/os/rfc/verification-evidence.js.map +1 -1
  81. package/dist/os/rfc/verification-refresh.d.ts.map +1 -1
  82. package/dist/os/rfc/verification-refresh.js +66 -37
  83. package/dist/os/rfc/verification-refresh.js.map +1 -1
  84. package/dist/os/session/handlers/save.d.ts.map +1 -1
  85. package/dist/os/session/handlers/save.js +42 -5
  86. package/dist/os/session/handlers/save.js.map +1 -1
  87. package/dist/os/session/session.module.d.ts.map +1 -1
  88. package/dist/os/session/session.module.js +5 -0
  89. package/dist/os/session/session.module.js.map +1 -1
  90. package/dist/os/spec/live-spec-merge.d.ts.map +1 -1
  91. package/dist/os/spec/live-spec-merge.js +55 -134
  92. package/dist/os/spec/live-spec-merge.js.map +1 -1
  93. package/dist/os/spec/live-spec-rebuild.d.ts +32 -0
  94. package/dist/os/spec/live-spec-rebuild.d.ts.map +1 -0
  95. package/dist/os/spec/live-spec-rebuild.js +272 -0
  96. package/dist/os/spec/live-spec-rebuild.js.map +1 -0
  97. package/dist/os/spec/live-spec-shared.d.ts +62 -0
  98. package/dist/os/spec/live-spec-shared.d.ts.map +1 -0
  99. package/dist/os/spec/live-spec-shared.js +315 -0
  100. package/dist/os/spec/live-spec-shared.js.map +1 -0
  101. package/dist/os/spec/live-spec-types.d.ts +17 -1
  102. package/dist/os/spec/live-spec-types.d.ts.map +1 -1
  103. package/dist/os/spec/live-spec-types.js +3 -0
  104. package/dist/os/spec/live-spec-types.js.map +1 -1
  105. package/dist/os/spec/live-spec-validate.d.ts.map +1 -1
  106. package/dist/os/spec/live-spec-validate.js +105 -2
  107. package/dist/os/spec/live-spec-validate.js.map +1 -1
  108. package/dist/os/spec/spec-materialize.d.ts +2 -0
  109. package/dist/os/spec/spec-materialize.d.ts.map +1 -1
  110. package/dist/os/spec/spec-materialize.js +45 -5
  111. package/dist/os/spec/spec-materialize.js.map +1 -1
  112. package/dist/os/spec/spec-schema.d.ts +19 -0
  113. package/dist/os/spec/spec-schema.d.ts.map +1 -1
  114. package/dist/os/spec/spec-schema.js +30 -0
  115. package/dist/os/spec/spec-schema.js.map +1 -1
  116. package/dist/os/spec/spec-status.d.ts +4 -0
  117. package/dist/os/spec/spec-status.d.ts.map +1 -1
  118. package/dist/os/spec/spec-status.js +19 -1
  119. package/dist/os/spec/spec-status.js.map +1 -1
  120. package/dist/os/spec/spec-validate.d.ts.map +1 -1
  121. package/dist/os/spec/spec-validate.js +55 -8
  122. package/dist/os/spec/spec-validate.js.map +1 -1
  123. package/dist/os/spec/spec.module.d.ts.map +1 -1
  124. package/dist/os/spec/spec.module.js +84 -8
  125. package/dist/os/spec/spec.module.js.map +1 -1
  126. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.d.ts.map +1 -1
  127. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js +10 -4
  128. package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js.map +1 -1
  129. package/dist/os/werkstatt/werkstatt.module.d.ts.map +1 -1
  130. package/dist/os/werkstatt/werkstatt.module.js +13 -4
  131. package/dist/os/werkstatt/werkstatt.module.js.map +1 -1
  132. package/dist/os/workflow/workflow.module.d.ts.map +1 -1
  133. package/dist/os/workflow/workflow.module.js +13 -5
  134. package/dist/os/workflow/workflow.module.js.map +1 -1
  135. package/dist/src/cli-flags.d.ts.map +1 -1
  136. package/dist/src/cli-flags.js +25 -5
  137. package/dist/src/cli-flags.js.map +1 -1
  138. package/dist/src/config/forge-config.d.ts +3 -0
  139. package/dist/src/config/forge-config.d.ts.map +1 -1
  140. package/dist/src/config/forge-config.js +2 -0
  141. package/dist/src/config/forge-config.js.map +1 -1
  142. package/dist/src/onboarding/doctor.d.ts.map +1 -1
  143. package/dist/src/onboarding/doctor.js +2 -3
  144. package/dist/src/onboarding/doctor.js.map +1 -1
  145. package/dist/src/onboarding/init.d.ts.map +1 -1
  146. package/dist/src/onboarding/init.js +8 -3
  147. package/dist/src/onboarding/init.js.map +1 -1
  148. package/dist/src/pipeline-status.d.ts +14 -1
  149. package/dist/src/pipeline-status.d.ts.map +1 -1
  150. package/dist/src/pipeline-status.js +28 -8
  151. package/dist/src/pipeline-status.js.map +1 -1
  152. package/dist/src/types.d.ts +7 -1
  153. package/dist/src/types.d.ts.map +1 -1
  154. package/dist/src/types.js +6 -0
  155. package/dist/src/types.js.map +1 -1
  156. package/dist/src/utils/generated-marker.d.ts +8 -0
  157. package/dist/src/utils/generated-marker.d.ts.map +1 -1
  158. package/dist/src/utils/generated-marker.js +25 -0
  159. package/dist/src/utils/generated-marker.js.map +1 -1
  160. package/dist/src/validators/skill-validate.d.ts.map +1 -1
  161. package/dist/src/validators/skill-validate.js +2 -4
  162. package/dist/src/validators/skill-validate.js.map +1 -1
  163. package/os/adr/adr.module.ts +2 -0
  164. package/os/audit/audit.module.ts +2 -0
  165. package/os/compass/compass.module.ts +49 -15
  166. package/os/compass/handlers/compass-audit-handler.ts +51 -10
  167. package/os/compass/handlers/compass-docs-validate.ts +361 -0
  168. package/os/compass/handlers/summary-record.ts +106 -15
  169. package/os/compass/handlers/tests/compass-audit-record.test.ts +2 -1
  170. package/os/compass/handlers/tests/compass-audit-validate.test.ts +92 -3
  171. package/os/compass/handlers/tests/compass-docs-validate.test.ts +203 -0
  172. package/os/compass/handlers/tests/compass-ledger-scope.test.ts +2 -1
  173. package/os/compass/handlers/tests/compass-policy.test.ts +7 -1
  174. package/os/compass/handlers/tests/summary-record.test.ts +127 -0
  175. package/os/core/core.module.ts +147 -75
  176. package/os/core/docs-archive.test.ts +136 -0
  177. package/os/core/handlers/file-size-lint.ts +2 -0
  178. package/os/exploration/exploration.module.ts +3 -0
  179. package/os/naming/naming-convention.ts +11 -1
  180. package/os/naming/naming.module.ts +9 -2
  181. package/os/notes/notes.module.ts +17 -6
  182. package/os/plan/plan-0000-template.md +150 -0
  183. package/os/plan/plan.module.ts +2 -0
  184. package/os/plugin/plugin.module.ts +9 -2
  185. package/os/program/program.module.ts +19 -4
  186. package/os/queue/decision-ledger.test.ts +163 -0
  187. package/os/queue/handlers/queue-validate.ts +190 -8
  188. package/os/queue/manifest.ts +201 -7
  189. package/os/queue/queue-validate.test.ts +303 -0
  190. package/os/queue/queue.module.ts +32 -4
  191. package/os/queue/types.ts +56 -1
  192. package/os/rfc/handlers/implement-stamp.ts +37 -8
  193. package/os/rfc/rfc-read-only-no-side-effects.test.ts +1 -0
  194. package/os/rfc/rfc.module.ts +27 -6
  195. package/os/rfc/types.ts +18 -3
  196. package/os/rfc/verification-emit.test.ts +305 -0
  197. package/os/rfc/verification-evidence.ts +149 -24
  198. package/os/rfc/verification-refresh.test.ts +222 -1
  199. package/os/rfc/verification-refresh.ts +74 -38
  200. package/os/session/handlers/save.ts +37 -5
  201. package/os/session/session.module.ts +5 -0
  202. package/os/spec/live-spec-idempotency.pbt.test.ts +222 -0
  203. package/os/spec/live-spec-list-show-validate.test.ts +10 -6
  204. package/os/spec/live-spec-merge.test.ts +187 -7
  205. package/os/spec/live-spec-merge.ts +71 -155
  206. package/os/spec/live-spec-rebuild.test.ts +317 -0
  207. package/os/spec/live-spec-rebuild.ts +356 -0
  208. package/os/spec/live-spec-shared.ts +378 -0
  209. package/os/spec/live-spec-types.ts +21 -1
  210. package/os/spec/live-spec-validate.test.ts +317 -0
  211. package/os/spec/live-spec-validate.ts +106 -2
  212. package/os/spec/spec-materialize.test.ts +192 -0
  213. package/os/spec/spec-materialize.ts +48 -4
  214. package/os/spec/spec-schema.ts +49 -0
  215. package/os/spec/spec-status.ts +24 -0
  216. package/os/spec/spec-validate.test.ts +66 -0
  217. package/os/spec/spec-validate.ts +62 -8
  218. package/os/spec/spec.module.ts +85 -8
  219. package/os/werkstatt/handlers/werkstatt-operation-validate.ts +10 -4
  220. package/os/werkstatt/werkstatt.module.ts +13 -4
  221. package/os/workflow/workflow.module.ts +13 -5
  222. package/package.json +1 -1
  223. package/skills/_shared/fo-pipeline-conventions.md +126 -1
  224. package/skills/fo/fo-doc-audit/SKILL.md +4 -4
  225. package/skills/fo/fo-explore/SKILL.md +2 -1
  226. package/skills/fo/fo-fix/SKILL.md +11 -3
  227. package/skills/fo/fo-handoff/SKILL.md +4 -6
  228. package/skills/fo/fo-idea-create-rfc/SKILL.md +2 -1
  229. package/skills/fo/fo-idea-enhance/SKILL.md +23 -4
  230. package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +86 -22
  231. package/skills/fo/fo-idea-implement/SKILL.md +53 -10
  232. package/skills/fo/fo-idea-plan/SKILL.md +28 -6
  233. package/skills/fo/fo-review/SKILL.md +69 -8
  234. package/skills/fo/fo-session-retro/SKILL.md +3 -2
  235. package/skills/fo/fo-step-commit/SKILL.md +2 -0
  236. package/skills/shared/grilling/SKILL.md +12 -0
  237. package/skills/shared/writing-great-skills/GLOSSARY.md +2 -0
  238. package/skills/shared/writing-great-skills/SKILL.md +2 -1
  239. package/src/cli-flags.ts +23 -5
  240. package/src/config/forge-config.ts +4 -0
  241. package/src/onboarding/doctor.ts +2 -3
  242. package/src/onboarding/init.ts +8 -3
  243. package/src/pipeline-status.ts +32 -8
  244. package/src/tests/cli-flags.test.ts +20 -0
  245. package/src/tests/cli-output.test.ts +13 -7
  246. package/src/tests/fixtures/agents-generate-business-before.txt +7 -7
  247. package/src/tests/implement-stamp.test.ts +38 -0
  248. package/src/tests/session-handlers.test.ts +33 -0
  249. package/src/types.ts +13 -1
  250. package/src/utils/generated-marker.ts +28 -0
  251. package/src/validators/skill-validate.ts +2 -4
  252. package/skills/fo/fo-idea-implement/ADR-FLOW.md +0 -179
  253. package/skills/fo/fo-review/AXES.md +0 -70
@@ -9,7 +9,7 @@ languagePolicy: ref(PREFERENCES.md)
9
9
  bindings:
10
10
  requires: [commands.validateRfc]
11
11
  optional: [paths.invariantsFile, paths.compassDocs]
12
- triggerPhrases: ["review this code diff", "check code against Forge standards", "fitness check on code changes"]
12
+ triggerPhrases: ["проверим всё ли сделали правильно", "проверь изменения", "review this session", "review this code diff", "check code against Forge standards"]
13
13
  ---
14
14
 
15
15
  <!--
@@ -20,9 +20,24 @@ triggerPhrases: ["review this code diff", "check code against Forge standards",
20
20
  </non-goals>
21
21
  </MODULE_CONTRACT>
22
22
  <CHANGE_SUMMARY>
23
+ <item>RFC-1250: soft-block arbitration appends to the queue decision ledger
24
+ (open / stage: review) under orchestrated runs.</item>
23
25
  <item>RFC-1097: sweep — SKILL.md headers + classification fixes
24
26
 
25
27
  Sweep batch 1: add Compass v2 headers to 45 SKILL.md files (purpose derived from frontmatter description). Fix non-skill-markdown exclusion to check filename not workspace-relative path (packages/AGENTS.md escaped it). Add .coverage to ignoredDirs.</item>
28
+ <item>RFC-1247: triggerPhrases vocabulary sync — mined operator phrasing applied to this skill's trigger set.</item>
29
+ <item>RFC-1250: review wave — QUEUE-07 gates un-parked opens only, ledger binding checks, fail-closed loader
30
+
31
+ REVIEW-RFC-1250-01 findings: QUEUE-07 no longer fires on parked entries
32
+ (the park is the containment — a parked queue stays resumable and the
33
+ decision window arbitrates it); loader fails open only on ENOENT —
34
+ other read errors are QUEUE-01; ledger gains queue/id-stem binding
35
+ (QUEUE-02), Q-N uniqueness (QUEUE-05), and QUEUE-08 hygiene warnings
36
+ (missing answers, foreign doc ids); next excludes QUEUE-07-blocked
37
+ items; top-level decision totals added. Orchestrator pre-flight treats
38
+ QUEUE-07 as the window agenda — structural errors still stop the batch;
39
+ maturation skips parked/deferred items; uncovered imperative ask sites
40
+ gain collect riders (ADR code-trace, NC markers, audit-verdict guard).</item>
26
41
  </CHANGE_SUMMARY>
27
42
  -->
28
43
 
@@ -41,6 +56,25 @@ This skill reviews **code** — `.ts`, `.js`, `.tsx`, `.astro`, `.css`, `.json`,
41
56
  - For **RFCs, ADRs, architecture docs, or plans**, use `/fo-idea-audit` instead.
42
57
  - For **iterative fix-then-build-then-commit**, use `/fo-fix`.
43
58
 
59
+ ## Review modes: `inline` vs `independent`
60
+
61
+ `fo-review` accepts an `independent` flag. **Default: `true` when invoked from a pipeline orchestrator (`fo-idea-i-just-want-to-see-the-result`, `fo-idea-implement`), `false` for ad-hoc in-session review.**
62
+
63
+ In `independent` mode the reviewing pass executes in a **clean agent context** — a subagent dispatch where the platform provides one — carrying only artifacts:
64
+
65
+ - the diff range or file list to review;
66
+ - the rubric paths (this skill file, `_shared/fo-pipeline-conventions.md`);
67
+ - the anchor paths (AGENTS.md files, DNA invariants file, relevant specs);
68
+ - raw evidence (command output, failing logs, mechanical floor results).
69
+
70
+ **Never pass the executor's session narrative, self-assessment, or settled conclusions** — passing them defeats the isolation the mode exists for (veil-of-ignorance contract, shared with the falsified-routes blind-spot pass). The dispatched reviewer's prompt contains artifact paths and the rubric, not the executor's story.
71
+
72
+ Where the platform exposes no subagent primitive (or policy forbids dispatch), run an `isolated-inline` pass instead: re-derive conclusions only from the artifacts, deliberately ignoring the session's accumulated narrative, and record the fallback. **Never claim `subagent` isolation that did not happen** — the persisted report's `reviewer.isolation` field records the mode actually used (`subagent` | `isolated-inline` | `inline`), so independence is auditable rather than asserted.
73
+
74
+ An executor that narrows the reviewer's inputs — passing a self-authored summary instead of artifact paths — commits a scope-narrowing violation, itself reportable as a `soft-block` on the review process.
75
+
76
+ **Report persistence is the dispatcher's duty in `independent` mode.** A clean-context reviewer may be read-only and never writes files — it returns findings and verdict. The skill run that dispatched it performs steps 6–7 itself: it assembles the report, builds the YAML frontmatter (`reviewer.isolation` records the mode actually used), and writes the file to `docs/reviews/code/`. A persisted review report without the frontmatter block is a contract violation regardless of which side produced the prose.
77
+
44
78
  ## Process
45
79
 
46
80
  ### 1. Identify the diff
@@ -99,7 +133,7 @@ Read the context the diff claims to fit into:
99
133
 
100
134
  Do not read every file in the repo — only the standards relevant to the diff.
101
135
 
102
- ### 4. Run the seven review axes
136
+ ### 4. Run the eight review axes
103
137
 
104
138
  For each axis, check every item. An item either **passes**, **fails** (specific finding with evidence), or is **not applicable** (state why). Skip N/A items silently — do not pad the report.
105
139
 
@@ -177,6 +211,15 @@ If the invariants file is absent or the optional binding is unresolvable, state
177
211
  - **Migration path**: existing apps' path to compliance is documented.
178
212
  - **Security / privacy**: if the diff touches user data, PII, or external services, it addresses GDPR/privacy and secret management. No cookies (`document.cookie`, `Set-Cookie`). Client-side persistence is `localStorage` only; server-side is `unstorage`.
179
213
 
214
+ #### Axis H — Fracture inference
215
+
216
+ Will this output collapse at the next step? Judge the diff not only for what it is, but for whether the _process that produced it_ is honest:
217
+
218
+ - **Goal-closure authenticity** — claims of completion vs. verifiable evidence. A marked-done criterion whose checkable trace is absent or hand-waved is a fracture signal.
219
+ - **Ordering-constraint compliance** — skipped preconditions: plan steps executed out of order, dependencies implemented after their dependents, gates bypassed to reach a green run.
220
+ - **Unclosed-marking truthfulness** — deferred or open items actually declared as such; nothing silently dropped from the plan, todo list, or spec.
221
+ - **State-transmission completeness** — would a fresh agent recover this work without the conversation? Checkpoints, persisted reports, and committed artifacts carry the state — not session memory.
222
+
180
223
  ### 5. Check spec compliance
181
224
 
182
225
  If an original request, spec, PRD, issue, or brief is available (from commit messages, linked issues, or session context), build a gap table:
@@ -199,7 +242,7 @@ Present the findings in this structure in `aiLanguage`. **Translate all labels,
199
242
  ```
200
243
  ## <Code Review in aiLanguage>: <diff range or file list>
201
244
 
202
- ### Verdict: <Approved | Needs revision | Rejected>
245
+ ### Verdict: <Approved | Needs revision | Rejected> (blockLevel: <pass | warning | soft-block | hard-block>)
203
246
 
204
247
  <2-3 sentence justification grounded in the most serious findings.>
205
248
 
@@ -228,6 +271,9 @@ Present the findings in this structure in `aiLanguage`. **Translate all labels,
228
271
  ### Axis G — Blind spots
229
272
  <Findings or "No issues.">
230
273
 
274
+ ### Axis H — Fracture inference
275
+ <Findings or "No issues.">
276
+
231
277
  ### Spec compliance
232
278
 
233
279
  <Gap table or "No spec available — skipped.">
@@ -239,11 +285,22 @@ Present the findings in this structure in `aiLanguage`. **Translate all labels,
239
285
  3. <Hard question.>
240
286
  ```
241
287
 
242
- **Verdict criteria:**
288
+ **Verdict criteria (blocking model):**
289
+
290
+ Every verdict carries a `blockLevel` — the blocking semantics downstream pipeline skills act on. `verdict` is retained and **derived** from it for backward compatibility (`fo-fix` consumes `verdict` unchanged):
291
+
292
+ | `blockLevel` | `verdict` | Semantics |
293
+ | --- | --- | --- |
294
+ | `pass` | `approved` | Zero findings across all axes — no fracture signals |
295
+ | `warning` | `needs-revision` | Findings recorded as tracked observations; they must be answered, and unresolved warnings at T3 escalate to `soft-block` |
296
+ | `soft-block` | `needs-revision` + `escalation: operator` | Directional deviation or process violation — suspends the item for operator arbitration (queue mode: item parked, arbitration question appended to the decision ledger as `open`/`stage: review`/`parked: true`, batch continues) |
297
+ | `hard-block` | `rejected` | Fundamental flaw — fix, then **full** re-review (not a delta on the flagged point) before the item may proceed to stamping |
298
+
299
+ - **Approved (`pass`)** — zero findings across all eight axes. Any finding, no matter how minor or cosmetic, disqualifies Approved and forces Needs revision. The rationale: downstream agents treat Approved as a stop signal and stop reading the findings — so even a trivial finding left under Approved gets silently ignored. If there is anything to fix, the verdict must say so.
300
+ - **Needs revision (`warning` | `soft-block`)** — one or more findings on any axis, regardless of severity. A one-line cosmetic rename is enough (`warning`). Escalate to `soft-block` when the deviation is directional or the review process itself was compromised (e.g. narrowed inputs). The agent must not downgrade to Approved based on severity — a finding is a finding.
301
+ - **Rejected (`hard-block`)** — fundamental flaw: the diff contradicts a DNA invariant, introduces a backward compatibility layer, or bypasses the storage policy.
243
302
 
244
- - **Approved** — zero findings across all seven axes. Any finding, no matter how minor or cosmetic, disqualifies Approved and forces Needs revision. The rationale: downstream agents treat Approved as a stop signal and stop reading the findings — so even a trivial finding left under Approved gets silently ignored. If there is anything to fix, the verdict must say so.
245
- - **Needs revision** — one or more findings on any axis, regardless of severity. A one-line cosmetic rename is enough. The agent must not downgrade to Approved based on severity — a finding is a finding.
246
- - **Rejected** — fundamental flaw: the diff contradicts a DNA invariant, introduces a backward compatibility layer, or bypasses the storage policy.
303
+ The `blockLevel` → pipeline semantics (full re-review on `hard-block`, queue parking on `soft-block`, warning escalation at T3) are declared in `_shared/fo-pipeline-conventions.md` §Review blocking semantics.
247
304
 
248
305
  ### 7. Persist the review
249
306
 
@@ -265,8 +322,12 @@ reviewId: REVIEW-CODE-<YYYY-MM-DD>-<NN>
265
322
  date: YYYY-MM-DD
266
323
  reviewer:
267
324
  skill: fo-review
325
+ isolation: <subagent | isolated-inline | inline> # the isolation mode actually used
268
326
  model: <AI model identifier>
269
- verdict: <approved | needs-revision | rejected>
327
+ blockLevel: <pass | warning | soft-block | hard-block> # blocking semantics
328
+ verdict: <approved | needs-revision | rejected> # derived from blockLevel
329
+ escalation: <none | operator> # set when blockLevel = soft-block
330
+ observations: [] # tracked warnings carried to T3
270
331
  diffRange: <fixed-point>...HEAD
271
332
  filesReviewed:
272
333
  - <file path>
@@ -9,7 +9,7 @@ languagePolicy: ref(PREFERENCES.md)
9
9
  bindings:
10
10
  requires: []
11
11
  optional: [paths.invariantsFile]
12
- triggerPhrases: ["session retrospective", "triage session discoveries", "Завершаем эту сессию", "End session", "/session-end"]
12
+ triggerPhrases: ["завершаем", "протокол завершения", "Завершаем эту сессию", "session retrospective", "End session"]
13
13
  ---
14
14
 
15
15
  <!--
@@ -23,6 +23,7 @@ triggerPhrases: ["session retrospective", "triage session discoveries", "Зав
23
23
  <item>RFC-1097: sweep — SKILL.md headers + classification fixes
24
24
 
25
25
  Sweep batch 1: add Compass v2 headers to 45 SKILL.md files (purpose derived from frontmatter description). Fix non-skill-markdown exclusion to check filename not workspace-relative path (packages/AGENTS.md escaped it). Add .coverage to ignoredDirs.</item>
26
+ <item>RFC-1247: triggerPhrases vocabulary sync — mined operator phrasing applied to this skill's trigger set.</item>
26
27
  </CHANGE_SUMMARY>
27
28
  -->
28
29
 
@@ -85,7 +86,7 @@ The agent reconstructs the current session's conversation from its context windo
85
86
  3. Reconstruct the conversation from context — include every user message and assistant response you can recall from the current session, in chronological order. This is a best-effort reconstruction: the agent's context window is the source, not an external export tool.
86
87
  4. **Redact sensitive information** — remove API keys, passwords, PII, and secret values before writing. Replace with `<redacted>`.
87
88
  5. **Truncate very long tool outputs** — if a tool call produced thousands of lines of output, summarize it as `<tool output truncated, N lines>` in the content field. Keep the tool call name and key results.
88
- 6. Write the file using `write_to_file` to `docs/sessions/.raw/<timestamp>-session.atif`.
89
+ 6. Write the file **atomically**: `write_to_file` to `docs/sessions/.raw/<timestamp>-session.atif.tmp`, then `mv` it to the same path without `.tmp` (rename is atomic). A parallel agent's `session.save` claims any `.atif` the moment it appears — this ordering guarantees it never sees a half-written transcript.
89
90
 
90
91
  ### 0c. Run session.save
91
92
 
@@ -10,6 +10,7 @@ concerns: code-mutation
10
10
  dependsOn: ['my-preferences']
11
11
  languagePolicy: ref(PREFERENCES.md)
12
12
  triggerPhrases:
13
+ - "закоммитим"
13
14
  - "commit after request"
14
15
  - "auto-commit changes"
15
16
  - "step commit"
@@ -26,6 +27,7 @@ triggerPhrases:
26
27
  <item>RFC-1097: sweep — SKILL.md headers + classification fixes
27
28
 
28
29
  Sweep batch 1: add Compass v2 headers to 45 SKILL.md files (purpose derived from frontmatter description). Fix non-skill-markdown exclusion to check filename not workspace-relative path (packages/AGENTS.md escaped it). Add .coverage to ignoredDirs.</item>
30
+ <item>RFC-1247: triggerPhrases vocabulary sync — mined operator phrasing applied to this skill's trigger set.</item>
29
31
  </CHANGE_SUMMARY>
30
32
  -->
31
33
 
@@ -22,11 +22,23 @@ knowledge:
22
22
  <item>RFC-1097: sweep — SKILL.md headers + classification fixes
23
23
 
24
24
  Sweep batch 1: add Compass v2 headers to 45 SKILL.md files (purpose derived from frontmatter description). Fix non-skill-markdown exclusion to check filename not workspace-relative path (packages/AGENTS.md escaped it). Add .coverage to ignoredDirs.</item>
25
+ <item>RFC-1250: two modes — interview (standalone, interactive) and emit
26
+ (orchestrated runs: questions land in the queue decision ledger with
27
+ recommended answers, no interview).</item>
25
28
  </CHANGE_SUMMARY>
26
29
  -->
27
30
 
28
31
  Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
29
32
 
33
+ ## Modes
34
+
35
+ Grilling runs in one of two modes — the caller selects:
36
+
37
+ - **`interview`** (default — standalone, operator-invoked runs): the interactive behavior below, one question at a time.
38
+ - **`emit`** (inside an orchestrator-driven queue run — `fo-idea-i-just-want-to-see-the-result` queue mode): never ask the operator. Generate the same questions you would have asked, climb the self-resolution ladder (`_shared/fo-pipeline-conventions.md` §Self-resolution ladder), and append each surviving question to the queue's decision ledger `docs/queues/<id>.decisions.yaml` as an `open` entry (`id: Q-N`, `doc`, `stage`, `question`, `resolutionPath`, `options` with `recommended: true` on your recommended answer, `status: open`). Branching questions are written conditionally ("if Q-3 resolves to X, then…"). The pipeline's decision window consumes the emitted entries.
39
+
40
+ Mode trigger: `emit` activates only when the invoking skill passes a queue manifest / ledger path; otherwise `interview`.
41
+
30
42
  Read `learned-principles.md` (L2) at the start of each session to improve recommended answers. Apply only entries with `status: active`; skip entries with `status: stale`, `superseded`, or `archived`. Principles with `confirmations >= 3` may be applied autonomously — but re-evaluate if context changes.
31
43
 
32
44
  Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.
@@ -58,6 +58,8 @@ A **user-invoked** skill whose job is to point at your other user-invoked skills
58
58
 
59
59
  _Avoid_: dispatcher, menu, registry, index, router procedure
60
60
 
61
+ _Applied instance_: `fo-idea-i-just-want-to-see-the-result` is the forge pipeline's router skill — the operator's single front door. Its Preconditions carry an intent-routing table that maps non-pipeline intents (review, fix, session-end, commit, mission work, exploration) to their standing skills before document-id detection; pipeline intents flow through unchanged, and the escape hatches stay directly invocable.
62
+
61
63
  ### Granularity
62
64
 
63
65
  How finely you divide skills. Finer division spends one of the two loads: more **model-invoked** skills spend **context load** (more descriptions crowding the window and competing for attention); more **user-invoked** skills spend **cognitive load** (more for the human to remember and reach for). Two cuts guide the division. By **invocation**, split off a model-invoked skill where you have a distinct **leading word** to trigger it — a trigger word you actually use in your prompts. By **sequence**, split a run of **steps** where a step's **post-completion steps** need hiding, since isolating it in its own context clears what follows. Beware the reverse: merging sequences exposes each step's post-completion steps to what follows, inviting premature completion.
@@ -19,6 +19,7 @@ languagePolicy: ref(PREFERENCES.md)
19
19
  <item>RFC-1097: sweep — SKILL.md headers + classification fixes
20
20
 
21
21
  Sweep batch 1: add Compass v2 headers to 45 SKILL.md files (purpose derived from frontmatter description). Fix non-skill-markdown exclusion to check filename not workspace-relative path (packages/AGENTS.md escaped it). Add .coverage to ignoredDirs.</item>
22
+ <item>RFC-1247: close RFC-1247 review r2 — CHANGE_SUMMARY items on six touched skills, fo-handoff in AGENTS enumeration, glossary applied-instance pointer, recorded per-skill phrase split</item>
22
23
  </CHANGE_SUMMARY>
23
24
  -->
24
25
 
@@ -37,7 +38,7 @@ Two choices, trading different costs:
37
38
 
38
39
  Pick model-invocation only when the agent must reach the skill on its own, or another skill must. If it only ever fires by hand, make it user-invoked and pay no context load.
39
40
 
40
- When user-invoked skills multiply past what you can remember, that piled-up cognitive load is cured by a **router skill**: one user-invoked skill that names the others and when to reach for each.
41
+ When user-invoked skills multiply past what you can remember, that piled-up cognitive load is cured by a **router skill**: one user-invoked skill that names the others and when to reach for each. (Applied instance: `fo-idea-i-just-want-to-see-the-result` — see GLOSSARY.md.)
41
42
 
42
43
  ## Writing the description
43
44
 
package/src/cli-flags.ts CHANGED
@@ -12,6 +12,10 @@ with `TypeError: targetId.toLowerCase is not a function`.</purpose>
12
12
  </MODULE_CONTRACT>
13
13
  <CHANGE_SUMMARY>
14
14
  <item>Standalone port of kernel argv resolution for the forge CLI (RFC-0260 lineage): strict KERNEL-FLAG-01/02/03 + KERNEL-ARG-01 diagnostics for schema-carrying commands, legacy heuristic parse (with KERNEL-ARG-01) for schema-less commands; repeated single-value string flags diagnose instead of silently promoting to an array that crashes handlers; indexOf-based inline-value split preserves values containing "=" that split("=", 2) silently truncated.</item>
15
+ <item>Session-retro 2026-10-08: string[] flags greedily consume consecutive
16
+ bare tokens until the next --flag (`--files a b` → ["a","b"]), matching the
17
+ kernel argv parser; bare positionals without a preceding string[] flag still
18
+ emit KERNEL-ARG-01.</item>
15
19
  </CHANGE_SUMMARY>
16
20
  */
17
21
 
@@ -227,11 +231,25 @@ function resolveStrict(
227
231
  continue;
228
232
  }
229
233
 
230
- const next = rawArgv[index + 1];
231
- if (typeof next === "string" && !next.startsWith("--")) {
232
- addFlagValue(flags, flagName, next);
233
- index += 1;
234
- continue;
234
+ // string[] flags consume every following bare token — mirrors the kernel's
235
+ // resolveCommandFlags: positional args are never valid (KERNEL-ARG-01),
236
+ // so `--files a b` unambiguously means the value list [a, b].
237
+ if (spec.kind === "string[]") {
238
+ let consumed = 0;
239
+ while (index + 1 < rawArgv.length && !rawArgv[index + 1]!.startsWith("--")) {
240
+ addFlagValue(flags, flagName, rawArgv[index + 1]!);
241
+ index += 1;
242
+ consumed += 1;
243
+ }
244
+ if (consumed > 0) continue;
245
+ // fall through to the missing-value diagnostic
246
+ } else {
247
+ const next = rawArgv[index + 1];
248
+ if (typeof next === "string" && !next.startsWith("--")) {
249
+ addFlagValue(flags, flagName, next);
250
+ index += 1;
251
+ continue;
252
+ }
235
253
  }
236
254
 
237
255
  diagnostics.push({
@@ -192,6 +192,8 @@ export const forgeConfigSchema = z
192
192
  packageManager: z.enum(["pnpm", "npm", "yarn", "bun", "none"]).default("pnpm"),
193
193
  // RFC-0640: optional domain field — absent means software-domain fallback
194
194
  domain: z.string().optional(),
195
+ /** RFC-1240: local consumer identity — absent means no consumer-aware spec filtering. */
196
+ consumer: z.string().optional(),
195
197
  }),
196
198
  paths: z.object({
197
199
  rfcsDir: z.string().default("docs/rfcs"),
@@ -234,6 +236,8 @@ export interface ForgeConfig {
234
236
  packageManager: "pnpm" | "npm" | "yarn" | "bun" | "none";
235
237
  /** RFC-0640: optional domain field — absent means software-domain fallback */
236
238
  domain?: string;
239
+ /** RFC-1240: local consumer identity — absent means no consumer-aware spec filtering */
240
+ consumer?: string;
237
241
  };
238
242
  paths: {
239
243
  rfcsDir: string;
@@ -8,8 +8,6 @@ Checks for forge.yaml, AGENTS.md, PREFERENCES.md, .agents/skills/, docs/rfcs/,
8
8
  </non-goals>
9
9
  </MODULE_CONTRACT>
10
10
  <CHANGE_SUMMARY>
11
- <item>RFC-0704: added independent-version-packages check — validates that paths in independentVersionPackages exist and contain package.json.</item>
12
- <item>RFC-0941: added pack-manifests advisory check — validates forge.plugin.yaml existence and schema for each declared skill pack.</item>
13
11
  <item>RFC-1097: step 6 — compass.migrate codemod run
14
12
 
15
13
  Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
@@ -18,7 +16,8 @@ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten
18
16
  Sweep batch 2: real KEY_DECISIONS on 10 files, expanded purposes (CONTRACT-02/PURPOSE-02), headers on mission/index + gen-upstreams, sanitizeItemText in summary.record (literal Compass tags corrupted history), excludedPaths for wrangler types, test-fixtures testPattern. forge+services now 0 diagnostics under --mode error.</item>
19
17
  <item>RFC-1224: preserve operator forge.yaml content on upgrade, promote adrImplementStamp binding</item>
20
18
  <item>RFC-1226: skills-unmanaged check — warn on SKILL.md-bearing dirs without .forge-managed marker</item>
21
- <history>RFC-0391, RFC-0393, RFC-0524, RFC-0539, RFC-0540, RFC-0611, RFC-0640, RFC-0660, RFC-0661, RFC-0663, RFC-0664, RFC-0675, RFC-1224</history>
19
+ <item>RFC-1249: wire werkstatt.commands.validate into packages.check + retire CMD-OUTPUT debt</item>
20
+ <history>RFC-0391, RFC-0393, RFC-0524, RFC-0539, RFC-0540, RFC-0611, RFC-0640, RFC-0660, RFC-0661, RFC-0663, RFC-0664, RFC-0675, RFC-0704, RFC-0941, RFC-1224</history>
22
21
  </CHANGE_SUMMARY>
23
22
  */
24
23
 
@@ -461,9 +461,9 @@ export function runInit(
461
461
  }
462
462
  }
463
463
 
464
- // 5. Copy neutral RFC and ADR templates into the project's docs directories.
465
- // Templates are copied from the forge package so new projects can create
466
- // RFCs and ADRs without falling back to the forge package's internal copy.
464
+ // 5. Copy neutral RFC, ADR, and plan templates into the project's docs
465
+ // directories. Templates are copied from the forge package so new projects
466
+ // can create documents without falling back to the package's internal copy.
467
467
  // Existing templates are never overwritten.
468
468
  const templatesToCopy = [
469
469
  {
@@ -476,6 +476,11 @@ export function runInit(
476
476
  destRel: `${config.paths.adrsDir}/adr-0000-template.md`,
477
477
  label: "docs/adrs/adr-0000-template.md",
478
478
  },
479
+ {
480
+ src: path.join(forgeRoot, "os", "plan", "plan-0000-template.md"),
481
+ destRel: `${config.paths.plansDir}/plan-0000-template.md`,
482
+ label: "docs/plans/plan-0000-template.md",
483
+ },
479
484
  ];
480
485
  for (const { src, destRel, label } of templatesToCopy) {
481
486
  const destPath = path.join(workspaceRoot, destRel);
@@ -19,9 +19,24 @@ os/ or kernel imports.</purpose>
19
19
  <item>RFC-1140: steps 1-4 — shared resolver, queue module, registration
20
20
 
21
21
  Extract pipeline-status derivation into packages/forge/src/pipeline-status.ts, refactor rfc.pipeline.status onto it, add os/queue module with queue.validate command, register in WORKSHOP_MODULE_MAP.forge + bin/cli.ts + package.json exports.</item>
22
+ <item>RFC-1250: decision-aware queue report — QueueItemReport gains kind +
23
+ decisions counts; `next` exclusion of parked/blocked items is computed by
24
+ the queue.validate caller (the resolver stays ledger-agnostic).</item>
22
25
  <item>RFC-1140: step 6 — cover shared resolver and queue.validate
23
26
 
24
27
  Add pipeline-status.test.ts (derivation matrix, order, next selection, ADR, skipped) and queue-validate.test.ts (schema errors, unknown/dup ids, id-filename mismatch, empty items, dependsOn warning, JSON shape). Fix queue derivation: pipelineStep is the stage after the last completed stage, not first incomplete — handles non-contiguous artifacts.</item>
28
+ <item>RFC-1250: review wave — QUEUE-07 gates un-parked opens only, ledger binding checks, fail-closed loader
29
+
30
+ REVIEW-RFC-1250-01 findings: QUEUE-07 no longer fires on parked entries
31
+ (the park is the containment — a parked queue stays resumable and the
32
+ decision window arbitrates it); loader fails open only on ENOENT —
33
+ other read errors are QUEUE-01; ledger gains queue/id-stem binding
34
+ (QUEUE-02), Q-N uniqueness (QUEUE-05), and QUEUE-08 hygiene warnings
35
+ (missing answers, foreign doc ids); next excludes QUEUE-07-blocked
36
+ items; top-level decision totals added. Orchestrator pre-flight treats
37
+ QUEUE-07 as the window agenda — structural errors still stop the batch;
38
+ maturation skips parked/deferred items; uncovered imperative ask sites
39
+ gain collect riders (ADR code-trace, NC markers, audit-verdict guard).</item>
25
40
  </CHANGE_SUMMARY>
26
41
  */
27
42
 
@@ -244,6 +259,10 @@ export interface QueueItemReport {
244
259
  status: QueueItemStatus;
245
260
  /** First incomplete pipeline stage — present only when in-progress. */
246
261
  pipelineStep?: PipelineStage;
262
+ /** Document kind — needed by queue.validate for QUEUE-07 (any non-terminal ADR is implementable). */
263
+ kind?: QueueDocumentKind;
264
+ /** Decision-ledger counts (RFC-1250) — present when the queue carries a sibling ledger. */
265
+ decisions?: { open: number; deferred: number; autoResolved: number };
247
266
  }
248
267
 
249
268
  /**
@@ -266,20 +285,20 @@ export async function deriveQueueItemStatus(
266
285
  const implementedAt = fm["implementedAt"] ? String(fm["implementedAt"]) : undefined;
267
286
 
268
287
  if (status === "implemented" || implementedAt) {
269
- return { id: doc.id, status: "implemented" };
288
+ return { id: doc.id, status: "implemented", kind: doc.kind };
270
289
  }
271
290
  if (status === "rejected" || status === "superseded") {
272
- return { id: doc.id, status: "skipped" };
291
+ return { id: doc.id, status: "skipped", kind: doc.kind };
273
292
  }
274
293
 
275
294
  // ADR pipeline is create → implement — no intermediate artifacts exist.
276
295
  if (doc.kind === "adr") {
277
- return { id: doc.id, status: "pending" };
296
+ return { id: doc.id, status: "pending", kind: doc.kind };
278
297
  }
279
298
 
280
299
  // RFC accepted means the plan step is done by definition.
281
300
  if (status === "accepted") {
282
- return { id: doc.id, status: "in-progress", pipelineStep: "implement" };
301
+ return { id: doc.id, status: "in-progress", pipelineStep: "implement", kind: doc.kind };
283
302
  }
284
303
 
285
304
  const enhancedAt = fm["enhancedAt"] ? String(fm["enhancedAt"]) : undefined;
@@ -302,13 +321,13 @@ export async function deriveQueueItemStatus(
302
321
  if (stages[i]!.done) lastDone = i;
303
322
  }
304
323
  if (lastDone === -1) {
305
- return { id: doc.id, status: "pending" };
324
+ return { id: doc.id, status: "pending", kind: doc.kind };
306
325
  }
307
326
  const nextStage = stages[lastDone + 1];
308
327
  if (!nextStage) {
309
- return { id: doc.id, status: "pending" };
328
+ return { id: doc.id, status: "pending", kind: doc.kind };
310
329
  }
311
- return { id: doc.id, status: "in-progress", pipelineStep: nextStage.stage };
330
+ return { id: doc.id, status: "in-progress", pipelineStep: nextStage.stage, kind: doc.kind };
312
331
  }
313
332
 
314
333
  export interface QueueReport {
@@ -317,7 +336,12 @@ export interface QueueReport {
317
336
  next: string | null;
318
337
  }
319
338
 
320
- /** Derive the full queue report, preserving manifest order. */
339
+ /**
340
+ * Derive the full queue report, preserving manifest order. `next` selects
341
+ * the first pending/in-progress item; callers that need ledger-aware
342
+ * exclusion (RFC-1250 parked/QUEUE-07-blocked items) re-filter the returned
343
+ * items — the resolver itself stays ledger-agnostic.
344
+ */
321
345
  export async function deriveQueueReport(
322
346
  workspaceRoot: string,
323
347
  itemIds: string[],
@@ -143,6 +143,26 @@ describe("resolveCliFlags — strict (schema-carrying) path", () => {
143
143
  expect(flags["files"]).toEqual(["a", "b"]);
144
144
  expect(errorRuleIds(diagnostics)).toEqual([]);
145
145
  });
146
+
147
+ test("string[] flag consumes consecutive bare tokens as a value list", () => {
148
+ const cmd = command({
149
+ files: { kind: "string[]", description: "Files." },
150
+ id: { kind: "string", description: "Id." },
151
+ });
152
+ const { flags, diagnostics } = resolveCliFlags(["--files", "a", "b", "c", "--id", "x"], cmd);
153
+ expect(flags["files"]).toEqual(["a", "b", "c"]);
154
+ expect(flags["id"]).toBe("x");
155
+ expect(errorRuleIds(diagnostics)).toEqual([]);
156
+ });
157
+
158
+ test("string[] flag with no value still emits KERNEL-FLAG-02", () => {
159
+ const cmd = command({
160
+ files: { kind: "string[]", description: "Files." },
161
+ json2: { kind: "boolean", description: "Switch." },
162
+ });
163
+ const { diagnostics } = resolveCliFlags(["--files", "--json2"], cmd);
164
+ expect(errorRuleIds(diagnostics)).toEqual(["KERNEL-FLAG-02"]);
165
+ });
146
166
  });
147
167
 
148
168
  describe("resolveCliFlags — legacy (schema-less) path", () => {
@@ -8,6 +8,12 @@ renderNextSteps, renderIdeRecommendation, generateHelp.</purpose>
8
8
  </MODULE_CONTRACT>
9
9
  <CHANGE_SUMMARY>
10
10
  <item>RFC-0542: initial CLI output rendering tests.</item>
11
+ <item>RFC-1231: step 1 — rename supportsAllSites to acceptsAllFlag
12
+
13
+ Mechanical sweep: the field only ever gated --all argv acceptance; fan-out
14
+ follows the parsed selector. Guard renamed assertAllSitesAllowed ->
15
+ assertAllFlagAccepted, message updated. 417 declaration sites + type
16
+ surfaces (KernelCommandMetadata, ForgeCommandMetadata) in one atomic pass.</item>
11
17
  </CHANGE_SUMMARY>
12
18
  */
13
19
 
@@ -41,7 +47,7 @@ class MockRegistry implements CommandRegistry, ForgeModuleRegistry {
41
47
  provider: "workspace" as const,
42
48
  mutatesState: c.mutatesState,
43
49
  requiresNetwork: c.requiresNetwork,
44
- supportsAllSites: c.supportsAllSites,
50
+ acceptsAllFlag: c.acceptsAllFlag,
45
51
  timeoutMs: c.timeoutMs,
46
52
  expectedDurationMs: c.expectedDurationMs,
47
53
  longRunning: c.longRunning,
@@ -112,7 +118,7 @@ describe("generateHelp", () => {
112
118
  name: "forge.init",
113
119
  description: "Deploy forge into a project.",
114
120
  scope: "workspace",
115
- supportsAllSites: false,
121
+ acceptsAllFlag: false,
116
122
  flags: {},
117
123
  cacheable: false,
118
124
  execute: async () => ({ exitCode: 0 }),
@@ -121,7 +127,7 @@ describe("generateHelp", () => {
121
127
  name: "forge.doctor",
122
128
  description: "Diagnose forge state in an existing project.",
123
129
  scope: "workspace",
124
- supportsAllSites: false,
130
+ acceptsAllFlag: false,
125
131
  flags: {},
126
132
  cacheable: false,
127
133
  execute: async () => ({ exitCode: 0 }),
@@ -138,7 +144,7 @@ describe("generateHelp", () => {
138
144
  name: "forge.doctor",
139
145
  description: "Diagnose forge state.",
140
146
  scope: "workspace",
141
- supportsAllSites: false,
147
+ acceptsAllFlag: false,
142
148
  flags: {},
143
149
  cacheable: false,
144
150
  execute: async () => ({ exitCode: 0 }),
@@ -147,7 +153,7 @@ describe("generateHelp", () => {
147
153
  name: "forge.init",
148
154
  description: "Deploy forge.",
149
155
  scope: "workspace",
150
- supportsAllSites: false,
156
+ acceptsAllFlag: false,
151
157
  flags: {},
152
158
  cacheable: false,
153
159
  execute: async () => ({ exitCode: 0 }),
@@ -167,7 +173,7 @@ describe("generateHelp", () => {
167
173
  name: "forge.init",
168
174
  description: "Deploy forge.",
169
175
  scope: "workspace",
170
- supportsAllSites: false,
176
+ acceptsAllFlag: false,
171
177
  flags: {},
172
178
  cacheable: false,
173
179
  execute: async () => ({ exitCode: 0 }),
@@ -184,7 +190,7 @@ describe("generateHelp", () => {
184
190
  name: "forge.init",
185
191
  description: "Deploy forge.",
186
192
  scope: "workspace",
187
- supportsAllSites: false,
193
+ acceptsAllFlag: false,
188
194
  flags: {},
189
195
  cacheable: false,
190
196
  execute: async () => ({ exitCode: 0 }),
@@ -110,29 +110,29 @@ When the operator expresses an intent in natural language, the agent routes to t
110
110
  | "manage Compass headers", "annotate source files with Compass", "audit Compass module contracts" | `fo-compass-annotate` |
111
111
  | "design summit", "multi-persona review", "party mode" | `fo-design-summit` |
112
112
  | "audit documentation sync", "update docs after code changes", "check AGENTS.md and README are in sync" | `fo-doc-audit` |
113
- | "explore this idea", "let me think about this", "what are the options for", "what if we" | `fo-explore` |
113
+ | "нам надо закрыть открытые вопросы", "explore this idea", "let me think about this", "what are the options for", "what if we" | `fo-explore` |
114
114
  | "extract DNA invariant", "discover architectural invariants", "formalize implicit architectural rules" | `fo-extract-dna` |
115
- | "fix issues from review", "apply review findings and fix", "iterative fix workflow for code" | `fo-fix` |
115
+ | "исправим", "примени findings", "fix all", "fix issues from review", "apply review findings and fix" | `fo-fix` |
116
116
  | "create a handoff document", "compact conversation for next agent", "prepare handoff for another agent" | `fo-handoff` |
117
117
  | "harvest portable patterns from code", "extract reusable code pattern to forge", "port this pattern to forge" | `fo-harvest` |
118
118
  | "I have an idea for a change", "analyze this idea and route it", "decompose this feature idea", "does this need an RFC", "should I write an ADR for this" | `fo-idea` |
119
119
  | "audit this RFC", "check RFC for ecosystem fit", "review RFC against DNA and forward-only rules" | `fo-idea-audit` |
120
120
  | "record this architectural decision", "create an ADR", "document a local technical decision" | `fo-idea-create-adr` |
121
- | "draft an RFC", "create a full RFC", "scaffold an RFC from template" | `fo-idea-create-rfc` |
121
+ | "подготовим RFC", "draft an RFC", "create a full RFC", "scaffold an RFC from template" | `fo-idea-create-rfc` |
122
122
  | "enhance this RFC", "fix audit findings in RFC", "improve RFC based on audit" | `fo-idea-enhance` |
123
123
  | "I just want to see the plan", "plan this feature without implementing", "run idea to plan pipeline" | `fo-idea-i-just-want-to-see-the-plan` |
124
- | "I just want to see the result", "run the full pipeline automatically", "implement this end-to-end without pauses" | `fo-idea-i-just-want-to-see-the-result` |
124
+ | "по полному пайплайну", "на результат", "реализуй RFC", "I just want to see the result", "implement this end-to-end without pauses" | `fo-idea-i-just-want-to-see-the-result` |
125
125
  | "implement this RFC", "execute the implementation plan", "realize this RFC end-to-end" | `fo-idea-implement` |
126
126
  | "plan the implementation for this RFC", "create implementation plan", "map affected artifacts and draft steps" | `fo-idea-plan` |
127
127
  | "show RFC and ADR status", "what is the status of this RFC", "list RFCs by status" | `fo-idea-status` |
128
128
  | "distill knowledge", "compact skill knowledge", "knowledge lifecycle", "promote fix patterns" | `fo-knowledge-distill` |
129
129
  | "sync memory from codex", "import external agent knowledge", "recall sessions from other tools", "sync memory from claude code" | `fo-memory-sync` |
130
130
  | "I found a bug", "file a GitHub issue for this bug", "report a bug conversationally", "interactive QA session" | `fo-qa` |
131
- | "review this code diff", "check code against Forge standards", "fitness check on code changes" | `fo-review` |
132
- | "session retrospective", "triage session discoveries", "Завершаем эту сессию", "End session", "/session-end" | `fo-session-retro` |
131
+ | "проверим всё ли сделали правильно", "проверь изменения", "review this session", "review this code diff", "check code against Forge standards" | `fo-review` |
132
+ | "завершаем", "протокол завершения", "Завершаем эту сессию", "session retrospective", "End session" | `fo-session-retro` |
133
133
  | "save this session", "enhance session transcript with annotations", "save session with quality checks" | `fo-session-save` |
134
134
  | "ingest external specification", "vendor spec package into docs", "author spec skeleton" | `fo-spec-ingest` |
135
- | "commit after request", "auto-commit changes", "step commit" | `fo-step-commit` |
135
+ | "закоммитим", "commit after request", "auto-commit changes", "step commit" | `fo-step-commit` |
136
136
  | "triage this issue", "categorize incoming bug report", "triage external pull request", "process feature request" | `fo-triage` |
137
137
 
138
138
  The agent uses judgment to calibrate routing — minor edits (typo fixes, small CSS changes) do not require skill invocation, while significant changes (new features, architectural decisions) do.