@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.
- package/CHANGELOG.md +8 -0
- package/bin/cli.ts +7 -2
- package/dist/bin/cli.js +7 -2
- package/dist/bin/cli.js.map +1 -1
- package/dist/os/adr/adr.module.d.ts.map +1 -1
- package/dist/os/adr/adr.module.js +2 -0
- package/dist/os/adr/adr.module.js.map +1 -1
- package/dist/os/audit/audit.module.d.ts.map +1 -1
- package/dist/os/audit/audit.module.js +2 -0
- package/dist/os/audit/audit.module.js.map +1 -1
- package/dist/os/compass/compass.module.d.ts.map +1 -1
- package/dist/os/compass/compass.module.js +47 -15
- package/dist/os/compass/compass.module.js.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.d.ts +2 -0
- package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.js +40 -10
- package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-docs-validate.d.ts +13 -0
- package/dist/os/compass/handlers/compass-docs-validate.d.ts.map +1 -0
- package/dist/os/compass/handlers/compass-docs-validate.js +328 -0
- package/dist/os/compass/handlers/compass-docs-validate.js.map +1 -0
- package/dist/os/compass/handlers/summary-record.d.ts +11 -2
- package/dist/os/compass/handlers/summary-record.d.ts.map +1 -1
- package/dist/os/compass/handlers/summary-record.js +95 -15
- package/dist/os/compass/handlers/summary-record.js.map +1 -1
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +124 -73
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/os/core/handlers/file-size-lint.d.ts.map +1 -1
- package/dist/os/core/handlers/file-size-lint.js +2 -0
- package/dist/os/core/handlers/file-size-lint.js.map +1 -1
- package/dist/os/exploration/exploration.module.d.ts.map +1 -1
- package/dist/os/exploration/exploration.module.js +3 -0
- package/dist/os/exploration/exploration.module.js.map +1 -1
- package/dist/os/naming/naming-convention.d.ts.map +1 -1
- package/dist/os/naming/naming-convention.js +11 -1
- package/dist/os/naming/naming-convention.js.map +1 -1
- package/dist/os/naming/naming.module.d.ts.map +1 -1
- package/dist/os/naming/naming.module.js +9 -2
- package/dist/os/naming/naming.module.js.map +1 -1
- package/dist/os/notes/notes.module.d.ts.map +1 -1
- package/dist/os/notes/notes.module.js +17 -6
- package/dist/os/notes/notes.module.js.map +1 -1
- package/dist/os/plan/plan.module.d.ts.map +1 -1
- package/dist/os/plan/plan.module.js +2 -0
- package/dist/os/plan/plan.module.js.map +1 -1
- package/dist/os/plugin/plugin.module.d.ts.map +1 -1
- package/dist/os/plugin/plugin.module.js +9 -2
- package/dist/os/plugin/plugin.module.js.map +1 -1
- package/dist/os/program/program.module.d.ts.map +1 -1
- package/dist/os/program/program.module.js +19 -4
- package/dist/os/program/program.module.js.map +1 -1
- package/dist/os/queue/handlers/queue-validate.d.ts.map +1 -1
- package/dist/os/queue/handlers/queue-validate.js +154 -7
- package/dist/os/queue/handlers/queue-validate.js.map +1 -1
- package/dist/os/queue/manifest.d.ts +17 -1
- package/dist/os/queue/manifest.d.ts.map +1 -1
- package/dist/os/queue/manifest.js +127 -6
- package/dist/os/queue/manifest.js.map +1 -1
- package/dist/os/queue/queue.module.d.ts.map +1 -1
- package/dist/os/queue/queue.module.js +32 -4
- package/dist/os/queue/queue.module.js.map +1 -1
- package/dist/os/queue/types.d.ts +100 -1
- package/dist/os/queue/types.d.ts.map +1 -1
- package/dist/os/queue/types.js +44 -0
- package/dist/os/queue/types.js.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.js +30 -8
- package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
- package/dist/os/rfc/rfc.module.d.ts.map +1 -1
- package/dist/os/rfc/rfc.module.js +25 -6
- package/dist/os/rfc/rfc.module.js.map +1 -1
- package/dist/os/rfc/types.d.ts +12 -2
- package/dist/os/rfc/types.d.ts.map +1 -1
- package/dist/os/rfc/types.js +2 -2
- package/dist/os/rfc/types.js.map +1 -1
- package/dist/os/rfc/verification-evidence.d.ts +21 -0
- package/dist/os/rfc/verification-evidence.d.ts.map +1 -1
- package/dist/os/rfc/verification-evidence.js +134 -23
- package/dist/os/rfc/verification-evidence.js.map +1 -1
- package/dist/os/rfc/verification-refresh.d.ts.map +1 -1
- package/dist/os/rfc/verification-refresh.js +66 -37
- package/dist/os/rfc/verification-refresh.js.map +1 -1
- package/dist/os/session/handlers/save.d.ts.map +1 -1
- package/dist/os/session/handlers/save.js +42 -5
- package/dist/os/session/handlers/save.js.map +1 -1
- package/dist/os/session/session.module.d.ts.map +1 -1
- package/dist/os/session/session.module.js +5 -0
- package/dist/os/session/session.module.js.map +1 -1
- package/dist/os/spec/live-spec-merge.d.ts.map +1 -1
- package/dist/os/spec/live-spec-merge.js +55 -134
- package/dist/os/spec/live-spec-merge.js.map +1 -1
- package/dist/os/spec/live-spec-rebuild.d.ts +32 -0
- package/dist/os/spec/live-spec-rebuild.d.ts.map +1 -0
- package/dist/os/spec/live-spec-rebuild.js +272 -0
- package/dist/os/spec/live-spec-rebuild.js.map +1 -0
- package/dist/os/spec/live-spec-shared.d.ts +62 -0
- package/dist/os/spec/live-spec-shared.d.ts.map +1 -0
- package/dist/os/spec/live-spec-shared.js +315 -0
- package/dist/os/spec/live-spec-shared.js.map +1 -0
- package/dist/os/spec/live-spec-types.d.ts +17 -1
- package/dist/os/spec/live-spec-types.d.ts.map +1 -1
- package/dist/os/spec/live-spec-types.js +3 -0
- package/dist/os/spec/live-spec-types.js.map +1 -1
- package/dist/os/spec/live-spec-validate.d.ts.map +1 -1
- package/dist/os/spec/live-spec-validate.js +105 -2
- package/dist/os/spec/live-spec-validate.js.map +1 -1
- package/dist/os/spec/spec-materialize.d.ts +2 -0
- package/dist/os/spec/spec-materialize.d.ts.map +1 -1
- package/dist/os/spec/spec-materialize.js +45 -5
- package/dist/os/spec/spec-materialize.js.map +1 -1
- package/dist/os/spec/spec-schema.d.ts +19 -0
- package/dist/os/spec/spec-schema.d.ts.map +1 -1
- package/dist/os/spec/spec-schema.js +30 -0
- package/dist/os/spec/spec-schema.js.map +1 -1
- package/dist/os/spec/spec-status.d.ts +4 -0
- package/dist/os/spec/spec-status.d.ts.map +1 -1
- package/dist/os/spec/spec-status.js +19 -1
- package/dist/os/spec/spec-status.js.map +1 -1
- package/dist/os/spec/spec-validate.d.ts.map +1 -1
- package/dist/os/spec/spec-validate.js +55 -8
- package/dist/os/spec/spec-validate.js.map +1 -1
- package/dist/os/spec/spec.module.d.ts.map +1 -1
- package/dist/os/spec/spec.module.js +84 -8
- package/dist/os/spec/spec.module.js.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.d.ts.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js +10 -4
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js.map +1 -1
- package/dist/os/werkstatt/werkstatt.module.d.ts.map +1 -1
- package/dist/os/werkstatt/werkstatt.module.js +13 -4
- package/dist/os/werkstatt/werkstatt.module.js.map +1 -1
- package/dist/os/workflow/workflow.module.d.ts.map +1 -1
- package/dist/os/workflow/workflow.module.js +13 -5
- package/dist/os/workflow/workflow.module.js.map +1 -1
- package/dist/src/cli-flags.d.ts.map +1 -1
- package/dist/src/cli-flags.js +25 -5
- package/dist/src/cli-flags.js.map +1 -1
- package/dist/src/config/forge-config.d.ts +3 -0
- package/dist/src/config/forge-config.d.ts.map +1 -1
- package/dist/src/config/forge-config.js +2 -0
- package/dist/src/config/forge-config.js.map +1 -1
- package/dist/src/onboarding/doctor.d.ts.map +1 -1
- package/dist/src/onboarding/doctor.js +2 -3
- package/dist/src/onboarding/doctor.js.map +1 -1
- package/dist/src/onboarding/init.d.ts.map +1 -1
- package/dist/src/onboarding/init.js +8 -3
- package/dist/src/onboarding/init.js.map +1 -1
- package/dist/src/pipeline-status.d.ts +14 -1
- package/dist/src/pipeline-status.d.ts.map +1 -1
- package/dist/src/pipeline-status.js +28 -8
- package/dist/src/pipeline-status.js.map +1 -1
- package/dist/src/types.d.ts +7 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/generated-marker.d.ts +8 -0
- package/dist/src/utils/generated-marker.d.ts.map +1 -1
- package/dist/src/utils/generated-marker.js +25 -0
- package/dist/src/utils/generated-marker.js.map +1 -1
- package/dist/src/validators/skill-validate.d.ts.map +1 -1
- package/dist/src/validators/skill-validate.js +2 -4
- package/dist/src/validators/skill-validate.js.map +1 -1
- package/os/adr/adr.module.ts +2 -0
- package/os/audit/audit.module.ts +2 -0
- package/os/compass/compass.module.ts +49 -15
- package/os/compass/handlers/compass-audit-handler.ts +51 -10
- package/os/compass/handlers/compass-docs-validate.ts +361 -0
- package/os/compass/handlers/summary-record.ts +106 -15
- package/os/compass/handlers/tests/compass-audit-record.test.ts +2 -1
- package/os/compass/handlers/tests/compass-audit-validate.test.ts +92 -3
- package/os/compass/handlers/tests/compass-docs-validate.test.ts +203 -0
- package/os/compass/handlers/tests/compass-ledger-scope.test.ts +2 -1
- package/os/compass/handlers/tests/compass-policy.test.ts +7 -1
- package/os/compass/handlers/tests/summary-record.test.ts +127 -0
- package/os/core/core.module.ts +147 -75
- package/os/core/docs-archive.test.ts +136 -0
- package/os/core/handlers/file-size-lint.ts +2 -0
- package/os/exploration/exploration.module.ts +3 -0
- package/os/naming/naming-convention.ts +11 -1
- package/os/naming/naming.module.ts +9 -2
- package/os/notes/notes.module.ts +17 -6
- package/os/plan/plan-0000-template.md +150 -0
- package/os/plan/plan.module.ts +2 -0
- package/os/plugin/plugin.module.ts +9 -2
- package/os/program/program.module.ts +19 -4
- package/os/queue/decision-ledger.test.ts +163 -0
- package/os/queue/handlers/queue-validate.ts +190 -8
- package/os/queue/manifest.ts +201 -7
- package/os/queue/queue-validate.test.ts +303 -0
- package/os/queue/queue.module.ts +32 -4
- package/os/queue/types.ts +56 -1
- package/os/rfc/handlers/implement-stamp.ts +37 -8
- package/os/rfc/rfc-read-only-no-side-effects.test.ts +1 -0
- package/os/rfc/rfc.module.ts +27 -6
- package/os/rfc/types.ts +18 -3
- package/os/rfc/verification-emit.test.ts +305 -0
- package/os/rfc/verification-evidence.ts +149 -24
- package/os/rfc/verification-refresh.test.ts +222 -1
- package/os/rfc/verification-refresh.ts +74 -38
- package/os/session/handlers/save.ts +37 -5
- package/os/session/session.module.ts +5 -0
- package/os/spec/live-spec-idempotency.pbt.test.ts +222 -0
- package/os/spec/live-spec-list-show-validate.test.ts +10 -6
- package/os/spec/live-spec-merge.test.ts +187 -7
- package/os/spec/live-spec-merge.ts +71 -155
- package/os/spec/live-spec-rebuild.test.ts +317 -0
- package/os/spec/live-spec-rebuild.ts +356 -0
- package/os/spec/live-spec-shared.ts +378 -0
- package/os/spec/live-spec-types.ts +21 -1
- package/os/spec/live-spec-validate.test.ts +317 -0
- package/os/spec/live-spec-validate.ts +106 -2
- package/os/spec/spec-materialize.test.ts +192 -0
- package/os/spec/spec-materialize.ts +48 -4
- package/os/spec/spec-schema.ts +49 -0
- package/os/spec/spec-status.ts +24 -0
- package/os/spec/spec-validate.test.ts +66 -0
- package/os/spec/spec-validate.ts +62 -8
- package/os/spec/spec.module.ts +85 -8
- package/os/werkstatt/handlers/werkstatt-operation-validate.ts +10 -4
- package/os/werkstatt/werkstatt.module.ts +13 -4
- package/os/workflow/workflow.module.ts +13 -5
- package/package.json +1 -1
- package/skills/_shared/fo-pipeline-conventions.md +126 -1
- package/skills/fo/fo-doc-audit/SKILL.md +4 -4
- package/skills/fo/fo-explore/SKILL.md +2 -1
- package/skills/fo/fo-fix/SKILL.md +11 -3
- package/skills/fo/fo-handoff/SKILL.md +4 -6
- package/skills/fo/fo-idea-create-rfc/SKILL.md +2 -1
- package/skills/fo/fo-idea-enhance/SKILL.md +23 -4
- package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +86 -22
- package/skills/fo/fo-idea-implement/SKILL.md +53 -10
- package/skills/fo/fo-idea-plan/SKILL.md +28 -6
- package/skills/fo/fo-review/SKILL.md +69 -8
- package/skills/fo/fo-session-retro/SKILL.md +3 -2
- package/skills/fo/fo-step-commit/SKILL.md +2 -0
- package/skills/shared/grilling/SKILL.md +12 -0
- package/skills/shared/writing-great-skills/GLOSSARY.md +2 -0
- package/skills/shared/writing-great-skills/SKILL.md +2 -1
- package/src/cli-flags.ts +23 -5
- package/src/config/forge-config.ts +4 -0
- package/src/onboarding/doctor.ts +2 -3
- package/src/onboarding/init.ts +8 -3
- package/src/pipeline-status.ts +32 -8
- package/src/tests/cli-flags.test.ts +20 -0
- package/src/tests/cli-output.test.ts +13 -7
- package/src/tests/fixtures/agents-generate-business-before.txt +7 -7
- package/src/tests/implement-stamp.test.ts +38 -0
- package/src/tests/session-handlers.test.ts +33 -0
- package/src/types.ts +13 -1
- package/src/utils/generated-marker.ts +28 -0
- package/src/validators/skill-validate.ts +2 -4
- package/skills/fo/fo-idea-implement/ADR-FLOW.md +0 -179
- 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"
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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: ["
|
|
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
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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;
|
package/src/onboarding/doctor.ts
CHANGED
|
@@ -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
|
-
<
|
|
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
|
|
package/src/onboarding/init.ts
CHANGED
|
@@ -461,9 +461,9 @@ export function runInit(
|
|
|
461
461
|
}
|
|
462
462
|
}
|
|
463
463
|
|
|
464
|
-
// 5. Copy neutral RFC and
|
|
465
|
-
// Templates are copied from the forge package so new projects
|
|
466
|
-
//
|
|
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);
|
package/src/pipeline-status.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"
|
|
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"
|
|
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"
|
|
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
|
-
| "
|
|
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"
|
|
132
|
-
| "
|
|
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"
|
|
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.
|