@garygentry/feature-forge 0.3.4 → 0.3.6
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/README.md +1 -1
- package/adapters/claude/.feature-forge-bundle.json +1 -1
- package/adapters/claude/references/forge-config-schema.json +4 -4
- package/adapters/claude/references/ralph-loop-contract.md +12 -8
- package/adapters/claude/references/shared-conventions.md +1 -1
- package/adapters/claude/scripts/forge-session.py +57 -32
- package/adapters/claude/skills/forge/references/shared-conventions.md +1 -1
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +1 -1
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +1 -1
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +1 -1
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +1 -1
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +1 -1
- package/adapters/claude/skills/forge-5-loop/SKILL.md +3 -3
- package/adapters/claude/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +2 -2
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +1 -1
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +1 -1
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +1 -1
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +4 -4
- package/adapters/claude/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +1 -1
- package/adapters/claude/skills/forge-verify/SKILL.md +5 -3
- package/adapters/claude/skills/forge-verify/references/findings-template.md +6 -6
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +1 -1
- package/adapters/codex/.feature-forge-bundle.json +1 -1
- package/adapters/codex/references/forge-config-schema.json +4 -4
- package/adapters/codex/references/ralph-loop-contract.md +12 -8
- package/adapters/codex/references/shared-conventions.md +1 -1
- package/adapters/codex/scripts/forge-session.py +57 -32
- package/adapters/codex/skills/forge/references/shared-conventions.md +1 -1
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +1 -1
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +1 -1
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +1 -1
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +1 -1
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +1 -1
- package/adapters/codex/skills/forge-5-loop/SKILL.md +3 -3
- package/adapters/codex/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +2 -2
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +1 -1
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +1 -1
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +1 -1
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +4 -4
- package/adapters/codex/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/codex/skills/forge-guide/references/shared-conventions.md +1 -1
- package/adapters/codex/skills/forge-verify/SKILL.md +5 -3
- package/adapters/codex/skills/forge-verify/references/findings-template.md +6 -6
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +1 -1
- package/adapters/copilot/.feature-forge-bundle.json +1 -1
- package/adapters/copilot/references/forge-config-schema.json +4 -4
- package/adapters/copilot/references/ralph-loop-contract.md +12 -8
- package/adapters/copilot/references/shared-conventions.md +1 -1
- package/adapters/copilot/scripts/forge-session.py +57 -32
- package/adapters/copilot/skills/forge/references/shared-conventions.md +1 -1
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +1 -1
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +1 -1
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +1 -1
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +1 -1
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +1 -1
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +3 -3
- package/adapters/copilot/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +2 -2
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +1 -1
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +1 -1
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +1 -1
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +4 -4
- package/adapters/copilot/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +1 -1
- package/adapters/copilot/skills/forge-verify/forge-verify.md +5 -3
- package/adapters/copilot/skills/forge-verify/references/findings-template.md +6 -6
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +1 -1
- package/adapters/cursor/.feature-forge-bundle.json +1 -1
- package/adapters/cursor/references/forge-config-schema.json +4 -4
- package/adapters/cursor/references/ralph-loop-contract.md +12 -8
- package/adapters/cursor/references/shared-conventions.md +1 -1
- package/adapters/cursor/scripts/forge-session.py +57 -32
- package/adapters/cursor/skills/forge/references/shared-conventions.md +1 -1
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +1 -1
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +1 -1
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +1 -1
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +1 -1
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +1 -1
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +3 -3
- package/adapters/cursor/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +2 -2
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +1 -1
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +1 -1
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +1 -1
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +4 -4
- package/adapters/cursor/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +1 -1
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +5 -3
- package/adapters/cursor/skills/forge-verify/references/findings-template.md +6 -6
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +1 -1
- package/adapters/gemini/.feature-forge-bundle.json +1 -1
- package/adapters/gemini/gemini-extension.json +1 -1
- package/adapters/gemini/references/forge-config-schema.json +4 -4
- package/adapters/gemini/references/ralph-loop-contract.md +12 -8
- package/adapters/gemini/references/shared-conventions.md +1 -1
- package/adapters/gemini/scripts/forge-session.py +57 -32
- package/adapters/gemini/skills/forge/references/shared-conventions.md +1 -1
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +1 -1
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +1 -1
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +1 -1
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +1 -1
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +1 -1
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +3 -3
- package/adapters/gemini/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +2 -2
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +1 -1
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +1 -1
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +1 -1
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +4 -4
- package/adapters/gemini/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +1 -1
- package/adapters/gemini/skills/forge-verify/forge-verify.md +5 -3
- package/adapters/gemini/skills/forge-verify/references/findings-template.md +6 -6
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +1 -1
- package/adapters/pi/.feature-forge-bundle.json +1 -1
- package/adapters/pi/extensions/forge-loop-supervisor/events.ts +90 -0
- package/adapters/pi/extensions/forge-loop-supervisor/index.ts +114 -0
- package/adapters/pi/extensions/forge-loop-supervisor/registry.ts +137 -0
- package/adapters/pi/extensions/forge-loop-supervisor/supervisor.ts +185 -0
- package/adapters/pi/extensions/forge-loop-supervisor/tailer.ts +137 -0
- package/adapters/pi/extensions/forge-loop-supervisor/types.ts +87 -0
- package/adapters/pi/extensions/forge-loop-supervisor/wiring.ts +423 -0
- package/adapters/pi/package.json +2 -1
- package/adapters/pi/references/forge-config-schema.json +4 -4
- package/adapters/pi/references/ralph-loop-contract.md +12 -8
- package/adapters/pi/references/shared-conventions.md +1 -1
- package/adapters/pi/scripts/forge-session.py +57 -32
- package/adapters/pi/skills/forge/SKILL.md +4 -1
- package/adapters/pi/skills/forge/references/shared-conventions.md +1 -1
- package/adapters/pi/skills/forge-0-epic/SKILL.md +4 -1
- package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +1 -1
- package/adapters/pi/skills/forge-1-prd/SKILL.md +4 -1
- package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +1 -1
- package/adapters/pi/skills/forge-2-tech/SKILL.md +4 -1
- package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +1 -1
- package/adapters/pi/skills/forge-3-specs/SKILL.md +4 -1
- package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +1 -1
- package/adapters/pi/skills/forge-4-backlog/SKILL.md +4 -1
- package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +1 -1
- package/adapters/pi/skills/forge-5-loop/SKILL.md +14 -8
- package/adapters/pi/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
- package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +8 -5
- package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +1 -1
- package/adapters/pi/skills/forge-6-docs/SKILL.md +4 -1
- package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +1 -1
- package/adapters/pi/skills/forge-bootstrap/SKILL.md +4 -1
- package/adapters/pi/skills/forge-fix/SKILL.md +4 -1
- package/adapters/pi/skills/forge-fix/references/shared-conventions.md +1 -1
- package/adapters/pi/skills/forge-guide/SKILL.md +4 -1
- package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +4 -4
- package/adapters/pi/skills/forge-guide/references/ralph-loop-contract.md +12 -8
- package/adapters/pi/skills/forge-guide/references/shared-conventions.md +1 -1
- package/adapters/pi/skills/forge-init/SKILL.md +4 -1
- package/adapters/pi/skills/forge-verify/SKILL.md +9 -4
- package/adapters/pi/skills/forge-verify/references/findings-template.md +6 -6
- package/adapters/pi/skills/forge-verify/references/shared-conventions.md +1 -1
- package/dist/manifest.d.ts +1 -1
- package/dist/rauf.d.ts +3 -3
- package/dist/rauf.js +2 -2
- package/dist/types.d.ts +1 -1
- package/package.json +8 -2
|
@@ -235,8 +235,8 @@
|
|
|
235
235
|
},
|
|
236
236
|
"installHint": {
|
|
237
237
|
"type": "string",
|
|
238
|
-
"default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.
|
|
239
|
-
"description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.
|
|
238
|
+
"default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.15.0 default). Or install/upgrade just the rauf CLI: `npx @garygentry/rauf@0.15.0 --version`, or `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
|
|
239
|
+
"description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.15.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
|
|
240
240
|
},
|
|
241
241
|
"schemaVersion": {
|
|
242
242
|
"type": "string",
|
|
@@ -245,8 +245,8 @@
|
|
|
245
245
|
},
|
|
246
246
|
"minRunnerVersion": {
|
|
247
247
|
"type": "string",
|
|
248
|
-
"default": "0.
|
|
249
|
-
"description": "Minimum runner version (semver). 0.
|
|
248
|
+
"default": "0.14.0",
|
|
249
|
+
"description": "Minimum runner version (semver). 0.14.0 is the CAPABILITY FLOOR the shipped stage actually depends on — it is the version needed for full post-run needs-human recovery: rauf 0.14's `backlog answer` injects a recorded answer into the next iteration (RECOVERY_MIN_RUNNER_VERSION in forge-session.py). Below it, recovery silently degrades to `backlog unblock` (answer not injected) and large Codex prompts retain the pre-0.14 argv-size (E2BIG) failure mode. Earlier surfaces are subsumed: 0.6.0 first shipped the coding-agent selection surface (--agent flag, `agents` availability probe, preset registry consumed by agentArgument/agentsProbeCommand); 0.5.0 added unified exit codes, `loop run --detached`, the explicit `review` signal, and versioned events.ndjson. Flooring at 0.14.0 guarantees a successful gate implies the recovery + agent surfaces both exist. The floor is distinct from the installer's `RAUF_PIN` (installHint) — the pin may sit ahead of the floor when a newer rauf ships nothing this floor's dependents need; it only rises when rauf ships a surface a shipped stage actually depends on. forge-5 enforces the floor via versionCommand before any loop side-effects."
|
|
250
250
|
}
|
|
251
251
|
}
|
|
252
252
|
}
|
|
@@ -156,11 +156,13 @@ to today. Degradation is **silent, not an error**, keeping alternate (non-rauf)
|
|
|
156
156
|
runners first-class. The gate condition is owned by
|
|
157
157
|
`02-config-schema-and-gating.md`.
|
|
158
158
|
|
|
159
|
-
Independently, the **version gate** floors at the runner version
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
159
|
+
Independently, the **version gate** floors at the runner version the stage
|
|
160
|
+
depends on. For rauf that is **0.14.0** (`loopRunner.minRunnerVersion`): the
|
|
161
|
+
version the package pins and the floor for full needs-human recovery (0.14's
|
|
162
|
+
`backlog answer`). The agent surface — the `--agent` flag, the `agents` probe,
|
|
163
|
+
and the preset agent registry — has been present since rauf 0.6.0 and is
|
|
164
|
+
subsumed by the higher floor, so a successful gate guarantees both the recovery
|
|
165
|
+
and agent surfaces exist before any run. See `## Version gating` and
|
|
164
166
|
`05-runner-discovery-version-gate.md`.
|
|
165
167
|
|
|
166
168
|
**This document — the `## Agent selection` section, the `## Per-stage agent
|
|
@@ -210,9 +212,11 @@ belongs to execution only. If you find yourself adding `--agent` near a
|
|
|
210
212
|
|
|
211
213
|
feature-forge requires a runner exposing `backlog validate` + backlog
|
|
212
214
|
`schemaVersion`, and the unified exit-code/status contract it reads. The floor is
|
|
213
|
-
now the **
|
|
214
|
-
|
|
215
|
-
|
|
215
|
+
now the **capability floor** the stage actually depends on: the version the
|
|
216
|
+
package pins and the floor for full needs-human recovery (0.14's `backlog
|
|
217
|
+
answer`). It subsumes the older agent-surface floor (the `--agent` flag, the
|
|
218
|
+
`agents` probe, and the preset agent registry, present since 0.6.0). For rauf
|
|
219
|
+
that is **0.14.0** (`loopRunner.minRunnerVersion`).
|
|
216
220
|
`forge-5-loop` runs `{bin} version --json`, semver-compares the reported version
|
|
217
221
|
against `minRunnerVersion`, and on a missing-or-too-old runner stops with
|
|
218
222
|
`loopRunner.installHint` (the CLI install/upgrade command) — **before** invoking
|
|
@@ -206,7 +206,7 @@ If a `state-*` verb exits 2, surface the plain `Error:` line from stderr verbati
|
|
|
206
206
|
|
|
207
207
|
### `state-verify` — verification results and provenance
|
|
208
208
|
|
|
209
|
-
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may
|
|
209
|
+
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may carry `--findings-file` + `--findings-count` for a clean report (count `0`), an **advisory-only** report (`inconsistency`/`improvement` findings only), or accepted residual findings. The stage resolves without a fix round and the report stays attached, making a completed verification round directly resumable if provenance recording is interrupted. A bare `passed` remains accepted for backward compatibility:
|
|
210
210
|
|
|
211
211
|
**`auto-verify-pending` is not a skill-facing status.** It is written by `stage-exit`'s scheduling boundary, which records the debt automatically when auto-verify is effective for a stage. The value is accepted on this CLI so the entry stays inspectable and repairable, not so a skill can hand-schedule verification: no skill body and no reference passes it, and none should. Every other status in the list is the recorded *result* of a verification that ran (or was explicitly skipped); this one records that one was *owed*.
|
|
212
212
|
|
|
@@ -461,8 +461,12 @@ TOPOLOGY_DEPTH_WARN_RATIO: Final[float] = 0.5
|
|
|
461
461
|
#: The forge-side capability threshold for the runner's `backlog answer` apply
|
|
462
462
|
#: surface: at or above this rauf version the recovery procedure applies answers
|
|
463
463
|
#: via `rauf backlog answer`; below it, it degrades to `rauf backlog unblock`.
|
|
464
|
-
#: It never hard-fails recovery
|
|
465
|
-
#: (the install floor in
|
|
464
|
+
#: It never hard-fails recovery. As of the 0.14.0 floor bump it now COINCIDES with
|
|
465
|
+
#: ``loopRunner.minRunnerVersion`` (the install floor in
|
|
466
|
+
#: references/forge-config-schema.json, also 0.14.0) — the launch gate was raised so
|
|
467
|
+
#: it no longer green-lights a runner too old to inject a recovered answer — but the
|
|
468
|
+
#: two remain conceptually distinct: this one selects the recovery apply surface and
|
|
469
|
+
#: only degrades, while the install floor hard-stops the launch.
|
|
466
470
|
RECOVERY_MIN_RUNNER_VERSION: Final[str] = "0.14.0"
|
|
467
471
|
#: The fixed final line of the NEXT-STEPS block. The stamp instructs the skill
|
|
468
472
|
#: to print the block verbatim as its absolute last output — nothing after this.
|
|
@@ -4232,12 +4236,33 @@ def stage_exit(
|
|
|
4232
4236
|
# hands off the same way the epic's own exit does. Identical to the previous
|
|
4233
4237
|
# behavior for every production exit, where `route_stage is stage`.
|
|
4234
4238
|
if route_stage == "forge-0-epic" and next_feature is None:
|
|
4235
|
-
#
|
|
4236
|
-
#
|
|
4237
|
-
#
|
|
4238
|
-
#
|
|
4239
|
-
|
|
4240
|
-
|
|
4239
|
+
# A branch exit (verify/fix) that served forge-0-epic cannot carry
|
|
4240
|
+
# --next-feature (the CLI rejects it for non-epic stages), so the member
|
|
4241
|
+
# must be resolved HERE from live epic state. Creation-mode exits pass
|
|
4242
|
+
# --next-feature and skip this block entirely (#230).
|
|
4243
|
+
try:
|
|
4244
|
+
status = _render_status(specs_dir, feature)
|
|
4245
|
+
actionable = status["actionable"]
|
|
4246
|
+
if actionable:
|
|
4247
|
+
resolved_member = actionable[0]
|
|
4248
|
+
ms, mr = _epic_member_state(specs_dir, feature, resolved_member)
|
|
4249
|
+
if mr is not None:
|
|
4250
|
+
next_stage_id = "forge-1-prd"
|
|
4251
|
+
next_command = f"/skill:forge-1-prd {resolved_member}"
|
|
4252
|
+
else:
|
|
4253
|
+
member_next = next_stage(ms)
|
|
4254
|
+
if member_next is None:
|
|
4255
|
+
next_stage_id = None
|
|
4256
|
+
next_command = f"/skill:forge-0-epic {feature}"
|
|
4257
|
+
else:
|
|
4258
|
+
next_stage_id = member_next
|
|
4259
|
+
next_command = f"/skill:{member_next} {resolved_member}"
|
|
4260
|
+
else:
|
|
4261
|
+
next_stage_id = None
|
|
4262
|
+
next_command = f"/skill:forge-0-epic {feature}"
|
|
4263
|
+
except UsageError:
|
|
4264
|
+
next_stage_id = None
|
|
4265
|
+
next_command = f"/skill:forge-0-epic {feature}"
|
|
4241
4266
|
else:
|
|
4242
4267
|
next_arg = next_feature or feature
|
|
4243
4268
|
next_command = (
|
|
@@ -5673,8 +5698,9 @@ def _verify_result_entry(
|
|
|
5673
5698
|
the one status that carries prior state forward — the report metadata — and it
|
|
5674
5699
|
deliberately writes no ``verifiedStageVersion``: fixes landed, nothing
|
|
5675
5700
|
re-verified them, so freshness stays unresolved until a later ``passed``.
|
|
5676
|
-
``passed`` may record NEW attached-report metadata of its own (
|
|
5677
|
-
advisory-only
|
|
5701
|
+
``passed`` may record NEW attached-report metadata of its own (a clean report,
|
|
5702
|
+
an advisory-only report, or the escalation-acceptance rules in
|
|
5703
|
+
``cmd_state_verify``).
|
|
5678
5704
|
|
|
5679
5705
|
Args:
|
|
5680
5706
|
status: The validated result status.
|
|
@@ -5698,11 +5724,11 @@ def _verify_result_entry(
|
|
|
5698
5724
|
if status == "passed":
|
|
5699
5725
|
entry: dict = {"status": status}
|
|
5700
5726
|
if findings_file is not None:
|
|
5701
|
-
# An attached report
|
|
5702
|
-
# explicitly accepted at the escalation gate
|
|
5703
|
-
# so it never routes to forge-fix
|
|
5704
|
-
#
|
|
5705
|
-
#
|
|
5727
|
+
# An attached clean/advisory report, or residual findings the user
|
|
5728
|
+
# explicitly accepted at the escalation gate, resolves as `passed`
|
|
5729
|
+
# so it never routes to forge-fix while the audit artifact stays
|
|
5730
|
+
# attached. A bare zero count records no report keys, preserving the
|
|
5731
|
+
# legacy plain "verified clean" shape.
|
|
5706
5732
|
entry["findingsFile"] = findings_file
|
|
5707
5733
|
entry["findingsCount"] = findings_count
|
|
5708
5734
|
entry["verifiedAt"] = now
|
|
@@ -5758,15 +5784,19 @@ def cmd_state_verify(
|
|
|
5758
5784
|
write, so a contradictory call never lands a partial entry:
|
|
5759
5785
|
|
|
5760
5786
|
- `passed` — REQUIRES `verified_stage_version`. MAY carry an attached
|
|
5761
|
-
report (`findings_file` + `findings_count` together, count >=
|
|
5762
|
-
|
|
5763
|
-
|
|
5764
|
-
|
|
5765
|
-
`
|
|
5766
|
-
|
|
5767
|
-
|
|
5768
|
-
|
|
5769
|
-
|
|
5787
|
+
report (`findings_file` + `findings_count` together, count >= 0) in
|
|
5788
|
+
three protocol cases: a CLEAN zero-finding round report (a fix
|
|
5789
|
+
pass's re-verify — valid audit evidence that lets the stage advance
|
|
5790
|
+
instead of stranding at `findings-applied`, #237), an ADVISORY-ONLY
|
|
5791
|
+
report (no blocking `error`/`gap` findings, count >= 1), and
|
|
5792
|
+
residual findings the user explicitly ACCEPTED at the round-ledger
|
|
5793
|
+
escalation (recorded first as a `state-decision`; see "Escalation"
|
|
5794
|
+
in stage-exit-protocol.md). In every case the stage resolves
|
|
5795
|
+
without routing to forge-fix and the report stays attached. Half a
|
|
5796
|
+
pairing is refused: a file without a count, or a positive count
|
|
5797
|
+
without a file. A bare `passed` (neither flag) is also accepted and
|
|
5798
|
+
records the report-free clean shape. Unaccepted blocking findings
|
|
5799
|
+
belong to `findings-reported`.
|
|
5770
5800
|
- `findings-reported` — REQUIRES all three of `verified_stage_version`,
|
|
5771
5801
|
`findings_file`, and a non-negative `findings_count`.
|
|
5772
5802
|
- `findings-applied` — REFUSES `verified_stage_version`. Applying fixes
|
|
@@ -5893,8 +5923,9 @@ def cmd_state_verify(
|
|
|
5893
5923
|
elif status == "passed":
|
|
5894
5924
|
if findings_file is not None and findings_count is None:
|
|
5895
5925
|
raise UsageError(
|
|
5896
|
-
"--status passed with
|
|
5897
|
-
"
|
|
5926
|
+
"--status passed with --findings-file requires --findings-count N "
|
|
5927
|
+
"(zero for a clean report, or the number of advisory/residual "
|
|
5928
|
+
"findings it lists)"
|
|
5898
5929
|
)
|
|
5899
5930
|
if findings_count is not None:
|
|
5900
5931
|
if findings_count < 0:
|
|
@@ -5908,12 +5939,6 @@ def cmd_state_verify(
|
|
|
5908
5939
|
f"report to read is unrecoverable. Blocking findings belong to "
|
|
5909
5940
|
f"--status findings-reported instead."
|
|
5910
5941
|
)
|
|
5911
|
-
if findings_count == 0 and findings_file is not None:
|
|
5912
|
-
raise UsageError(
|
|
5913
|
-
"--status passed with --findings-file requires --findings-count "
|
|
5914
|
-
">= 1: an attached report claiming zero findings is "
|
|
5915
|
-
"self-contradictory — omit both for a clean pass"
|
|
5916
|
-
)
|
|
5917
5942
|
if verified_stage_version is None:
|
|
5918
5943
|
raise UsageError(
|
|
5919
5944
|
"--status passed requires --verified-stage-version <current version>"
|
|
@@ -247,4 +247,7 @@ This Pi bundle preserves Claude's `AskUserQuestion` references because it ships
|
|
|
247
247
|
- **User input:** use `AskUserQuestion` for genuine user decisions. It supports multiple questions, option descriptions, recommended ordering, multi-select, previews, and free-form Other/custom answers.
|
|
248
248
|
- **Skill dispatch:** Pi uses `/skill:<name>` commands. If you cannot invoke a skill directly, print the exact `/skill:<name> ...` command for the user to run.
|
|
249
249
|
- **Subagents:** this bundle declares its custom agents (`forge-researcher`, `forge-spec-writer`, `forge-verifier`) as package agents. If a `subagent` tool is registered, dispatch one with `{ agent: "forge-verifier", task: "..." }`, or fan several out concurrently with `{ tasks: [{ agent: "forge-spec-writer", task: "..." }, ...] }`. If no `subagent` tool is available, run that step inline yourself.
|
|
250
|
-
- **Background / monitoring:**
|
|
250
|
+
- **Background / monitoring (forge-5-loop):** Pi has no built-in background bash, persistent monitor, or push-notification, so do **not** run the loop runner in the foreground and do **not** try to arm one. This bundle registers a **forge-loop-supervisor** extension that IS the "background-execution mechanism" and "monitoring mechanism" Steps 3b–3f refer to. Concretely:
|
|
251
|
+
- **Launch (Step 3b):** call **`forge_loop_launch`** with the backlog dir (and `review` / `agent` / `iterations` as resolved from config). It starts the loop **detached** — it runs in rauf's server and outlives this session — and returns immediately; you do not build or redirect a command yourself.
|
|
252
|
+
- **Supervise (Steps 3d–3f):** the extension then watches the runner's `events.ndjson` for you. It reports each completed item as one quiet line and **wakes this session automatically** on needs-human, blocked, stuck, review-failed, error, and completion — so do **not** arm a monitor, set a continuous tail, send a notification, poll, or foreground-sleep, and do not treat any manual stop as the terminal signal. When completion wakes you, go straight to Step 4 and read the authoritative counts with the status/list command. Use **`forge_loop_status`** to check progress on demand.
|
|
253
|
+
- **Stop / session end:** **`forge_loop_stop`** deliberately stops the runner; use it only when the user wants the loop to actually stop. Ending the Pi session does **not** stop the loop (it is detached), and the next session **reattaches automatically** without re-reporting what you already saw.
|
|
@@ -206,7 +206,7 @@ If a `state-*` verb exits 2, surface the plain `Error:` line from stderr verbati
|
|
|
206
206
|
|
|
207
207
|
### `state-verify` — verification results and provenance
|
|
208
208
|
|
|
209
|
-
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may
|
|
209
|
+
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may carry `--findings-file` + `--findings-count` for a clean report (count `0`), an **advisory-only** report (`inconsistency`/`improvement` findings only), or accepted residual findings. The stage resolves without a fix round and the report stays attached, making a completed verification round directly resumable if provenance recording is interrupted. A bare `passed` remains accepted for backward compatibility:
|
|
210
210
|
|
|
211
211
|
**`auto-verify-pending` is not a skill-facing status.** It is written by `stage-exit`'s scheduling boundary, which records the debt automatically when auto-verify is effective for a stage. The value is accepted on this CLI so the entry stays inspectable and repairable, not so a skill can hand-schedule verification: no skill body and no reference passes it, and none should. Every other status in the list is the recorded *result* of a verification that ran (or was explicitly skipped); this one records that one was *owed*.
|
|
212
212
|
|
|
@@ -310,4 +310,7 @@ This Pi bundle preserves Claude's `AskUserQuestion` references because it ships
|
|
|
310
310
|
- **User input:** use `AskUserQuestion` for genuine user decisions. It supports multiple questions, option descriptions, recommended ordering, multi-select, previews, and free-form Other/custom answers.
|
|
311
311
|
- **Skill dispatch:** Pi uses `/skill:<name>` commands. If you cannot invoke a skill directly, print the exact `/skill:<name> ...` command for the user to run.
|
|
312
312
|
- **Subagents:** this bundle declares its custom agents (`forge-researcher`, `forge-spec-writer`, `forge-verifier`) as package agents. If a `subagent` tool is registered, dispatch one with `{ agent: "forge-verifier", task: "..." }`, or fan several out concurrently with `{ tasks: [{ agent: "forge-spec-writer", task: "..." }, ...] }`. If no `subagent` tool is available, run that step inline yourself.
|
|
313
|
-
- **Background / monitoring:**
|
|
313
|
+
- **Background / monitoring (forge-5-loop):** Pi has no built-in background bash, persistent monitor, or push-notification, so do **not** run the loop runner in the foreground and do **not** try to arm one. This bundle registers a **forge-loop-supervisor** extension that IS the "background-execution mechanism" and "monitoring mechanism" Steps 3b–3f refer to. Concretely:
|
|
314
|
+
- **Launch (Step 3b):** call **`forge_loop_launch`** with the backlog dir (and `review` / `agent` / `iterations` as resolved from config). It starts the loop **detached** — it runs in rauf's server and outlives this session — and returns immediately; you do not build or redirect a command yourself.
|
|
315
|
+
- **Supervise (Steps 3d–3f):** the extension then watches the runner's `events.ndjson` for you. It reports each completed item as one quiet line and **wakes this session automatically** on needs-human, blocked, stuck, review-failed, error, and completion — so do **not** arm a monitor, set a continuous tail, send a notification, poll, or foreground-sleep, and do not treat any manual stop as the terminal signal. When completion wakes you, go straight to Step 4 and read the authoritative counts with the status/list command. Use **`forge_loop_status`** to check progress on demand.
|
|
316
|
+
- **Stop / session end:** **`forge_loop_stop`** deliberately stops the runner; use it only when the user wants the loop to actually stop. Ending the Pi session does **not** stop the loop (it is detached), and the next session **reattaches automatically** without re-reporting what you already saw.
|
|
@@ -206,7 +206,7 @@ If a `state-*` verb exits 2, surface the plain `Error:` line from stderr verbati
|
|
|
206
206
|
|
|
207
207
|
### `state-verify` — verification results and provenance
|
|
208
208
|
|
|
209
|
-
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may
|
|
209
|
+
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may carry `--findings-file` + `--findings-count` for a clean report (count `0`), an **advisory-only** report (`inconsistency`/`improvement` findings only), or accepted residual findings. The stage resolves without a fix round and the report stays attached, making a completed verification round directly resumable if provenance recording is interrupted. A bare `passed` remains accepted for backward compatibility:
|
|
210
210
|
|
|
211
211
|
**`auto-verify-pending` is not a skill-facing status.** It is written by `stage-exit`'s scheduling boundary, which records the debt automatically when auto-verify is effective for a stage. The value is accepted on this CLI so the entry stays inspectable and repairable, not so a skill can hand-schedule verification: no skill body and no reference passes it, and none should. Every other status in the list is the recorded *result* of a verification that ran (or was explicitly skipped); this one records that one was *owed*.
|
|
212
212
|
|
|
@@ -191,4 +191,7 @@ This Pi bundle preserves Claude's `AskUserQuestion` references because it ships
|
|
|
191
191
|
- **User input:** use `AskUserQuestion` for genuine user decisions. It supports multiple questions, option descriptions, recommended ordering, multi-select, previews, and free-form Other/custom answers.
|
|
192
192
|
- **Skill dispatch:** Pi uses `/skill:<name>` commands. If you cannot invoke a skill directly, print the exact `/skill:<name> ...` command for the user to run.
|
|
193
193
|
- **Subagents:** this bundle declares its custom agents (`forge-researcher`, `forge-spec-writer`, `forge-verifier`) as package agents. If a `subagent` tool is registered, dispatch one with `{ agent: "forge-verifier", task: "..." }`, or fan several out concurrently with `{ tasks: [{ agent: "forge-spec-writer", task: "..." }, ...] }`. If no `subagent` tool is available, run that step inline yourself.
|
|
194
|
-
- **Background / monitoring:**
|
|
194
|
+
- **Background / monitoring (forge-5-loop):** Pi has no built-in background bash, persistent monitor, or push-notification, so do **not** run the loop runner in the foreground and do **not** try to arm one. This bundle registers a **forge-loop-supervisor** extension that IS the "background-execution mechanism" and "monitoring mechanism" Steps 3b–3f refer to. Concretely:
|
|
195
|
+
- **Launch (Step 3b):** call **`forge_loop_launch`** with the backlog dir (and `review` / `agent` / `iterations` as resolved from config). It starts the loop **detached** — it runs in rauf's server and outlives this session — and returns immediately; you do not build or redirect a command yourself.
|
|
196
|
+
- **Supervise (Steps 3d–3f):** the extension then watches the runner's `events.ndjson` for you. It reports each completed item as one quiet line and **wakes this session automatically** on needs-human, blocked, stuck, review-failed, error, and completion — so do **not** arm a monitor, set a continuous tail, send a notification, poll, or foreground-sleep, and do not treat any manual stop as the terminal signal. When completion wakes you, go straight to Step 4 and read the authoritative counts with the status/list command. Use **`forge_loop_status`** to check progress on demand.
|
|
197
|
+
- **Stop / session end:** **`forge_loop_stop`** deliberately stops the runner; use it only when the user wants the loop to actually stop. Ending the Pi session does **not** stop the loop (it is detached), and the next session **reattaches automatically** without re-reporting what you already saw.
|
|
@@ -206,7 +206,7 @@ If a `state-*` verb exits 2, surface the plain `Error:` line from stderr verbati
|
|
|
206
206
|
|
|
207
207
|
### `state-verify` — verification results and provenance
|
|
208
208
|
|
|
209
|
-
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may
|
|
209
|
+
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may carry `--findings-file` + `--findings-count` for a clean report (count `0`), an **advisory-only** report (`inconsistency`/`improvement` findings only), or accepted residual findings. The stage resolves without a fix round and the report stays attached, making a completed verification round directly resumable if provenance recording is interrupted. A bare `passed` remains accepted for backward compatibility:
|
|
210
210
|
|
|
211
211
|
**`auto-verify-pending` is not a skill-facing status.** It is written by `stage-exit`'s scheduling boundary, which records the debt automatically when auto-verify is effective for a stage. The value is accepted on this CLI so the entry stays inspectable and repairable, not so a skill can hand-schedule verification: no skill body and no reference passes it, and none should. Every other status in the list is the recorded *result* of a verification that ran (or was explicitly skipped); this one records that one was *owed*.
|
|
212
212
|
|
|
@@ -254,4 +254,7 @@ This Pi bundle preserves Claude's `AskUserQuestion` references because it ships
|
|
|
254
254
|
- **User input:** use `AskUserQuestion` for genuine user decisions. It supports multiple questions, option descriptions, recommended ordering, multi-select, previews, and free-form Other/custom answers.
|
|
255
255
|
- **Skill dispatch:** Pi uses `/skill:<name>` commands. If you cannot invoke a skill directly, print the exact `/skill:<name> ...` command for the user to run.
|
|
256
256
|
- **Subagents:** this bundle declares its custom agents (`forge-researcher`, `forge-spec-writer`, `forge-verifier`) as package agents. If a `subagent` tool is registered, dispatch one with `{ agent: "forge-verifier", task: "..." }`, or fan several out concurrently with `{ tasks: [{ agent: "forge-spec-writer", task: "..." }, ...] }`. If no `subagent` tool is available, run that step inline yourself.
|
|
257
|
-
- **Background / monitoring:**
|
|
257
|
+
- **Background / monitoring (forge-5-loop):** Pi has no built-in background bash, persistent monitor, or push-notification, so do **not** run the loop runner in the foreground and do **not** try to arm one. This bundle registers a **forge-loop-supervisor** extension that IS the "background-execution mechanism" and "monitoring mechanism" Steps 3b–3f refer to. Concretely:
|
|
258
|
+
- **Launch (Step 3b):** call **`forge_loop_launch`** with the backlog dir (and `review` / `agent` / `iterations` as resolved from config). It starts the loop **detached** — it runs in rauf's server and outlives this session — and returns immediately; you do not build or redirect a command yourself.
|
|
259
|
+
- **Supervise (Steps 3d–3f):** the extension then watches the runner's `events.ndjson` for you. It reports each completed item as one quiet line and **wakes this session automatically** on needs-human, blocked, stuck, review-failed, error, and completion — so do **not** arm a monitor, set a continuous tail, send a notification, poll, or foreground-sleep, and do not treat any manual stop as the terminal signal. When completion wakes you, go straight to Step 4 and read the authoritative counts with the status/list command. Use **`forge_loop_status`** to check progress on demand.
|
|
260
|
+
- **Stop / session end:** **`forge_loop_stop`** deliberately stops the runner; use it only when the user wants the loop to actually stop. Ending the Pi session does **not** stop the loop (it is detached), and the next session **reattaches automatically** without re-reporting what you already saw.
|
|
@@ -206,7 +206,7 @@ If a `state-*` verb exits 2, surface the plain `Error:` line from stderr verbati
|
|
|
206
206
|
|
|
207
207
|
### `state-verify` — verification results and provenance
|
|
208
208
|
|
|
209
|
-
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may
|
|
209
|
+
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may carry `--findings-file` + `--findings-count` for a clean report (count `0`), an **advisory-only** report (`inconsistency`/`improvement` findings only), or accepted residual findings. The stage resolves without a fix round and the report stays attached, making a completed verification round directly resumable if provenance recording is interrupted. A bare `passed` remains accepted for backward compatibility:
|
|
210
210
|
|
|
211
211
|
**`auto-verify-pending` is not a skill-facing status.** It is written by `stage-exit`'s scheduling boundary, which records the debt automatically when auto-verify is effective for a stage. The value is accepted on this CLI so the entry stays inspectable and repairable, not so a skill can hand-schedule verification: no skill body and no reference passes it, and none should. Every other status in the list is the recorded *result* of a verification that ran (or was explicitly skipped); this one records that one was *owed*.
|
|
212
212
|
|
|
@@ -198,4 +198,7 @@ This Pi bundle preserves Claude's `AskUserQuestion` references because it ships
|
|
|
198
198
|
- **User input:** use `AskUserQuestion` for genuine user decisions. It supports multiple questions, option descriptions, recommended ordering, multi-select, previews, and free-form Other/custom answers.
|
|
199
199
|
- **Skill dispatch:** Pi uses `/skill:<name>` commands. If you cannot invoke a skill directly, print the exact `/skill:<name> ...` command for the user to run.
|
|
200
200
|
- **Subagents:** this bundle declares its custom agents (`forge-researcher`, `forge-spec-writer`, `forge-verifier`) as package agents. If a `subagent` tool is registered, dispatch one with `{ agent: "forge-verifier", task: "..." }`, or fan several out concurrently with `{ tasks: [{ agent: "forge-spec-writer", task: "..." }, ...] }`. If no `subagent` tool is available, run that step inline yourself.
|
|
201
|
-
- **Background / monitoring:**
|
|
201
|
+
- **Background / monitoring (forge-5-loop):** Pi has no built-in background bash, persistent monitor, or push-notification, so do **not** run the loop runner in the foreground and do **not** try to arm one. This bundle registers a **forge-loop-supervisor** extension that IS the "background-execution mechanism" and "monitoring mechanism" Steps 3b–3f refer to. Concretely:
|
|
202
|
+
- **Launch (Step 3b):** call **`forge_loop_launch`** with the backlog dir (and `review` / `agent` / `iterations` as resolved from config). It starts the loop **detached** — it runs in rauf's server and outlives this session — and returns immediately; you do not build or redirect a command yourself.
|
|
203
|
+
- **Supervise (Steps 3d–3f):** the extension then watches the runner's `events.ndjson` for you. It reports each completed item as one quiet line and **wakes this session automatically** on needs-human, blocked, stuck, review-failed, error, and completion — so do **not** arm a monitor, set a continuous tail, send a notification, poll, or foreground-sleep, and do not treat any manual stop as the terminal signal. When completion wakes you, go straight to Step 4 and read the authoritative counts with the status/list command. Use **`forge_loop_status`** to check progress on demand.
|
|
204
|
+
- **Stop / session end:** **`forge_loop_stop`** deliberately stops the runner; use it only when the user wants the loop to actually stop. Ending the Pi session does **not** stop the loop (it is detached), and the next session **reattaches automatically** without re-reporting what you already saw.
|
|
@@ -206,7 +206,7 @@ If a `state-*` verb exits 2, surface the plain `Error:` line from stderr verbati
|
|
|
206
206
|
|
|
207
207
|
### `state-verify` — verification results and provenance
|
|
208
208
|
|
|
209
|
-
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may
|
|
209
|
+
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may carry `--findings-file` + `--findings-count` for a clean report (count `0`), an **advisory-only** report (`inconsistency`/`improvement` findings only), or accepted residual findings. The stage resolves without a fix round and the report stays attached, making a completed verification round directly resumable if provenance recording is interrupted. A bare `passed` remains accepted for backward compatibility:
|
|
210
210
|
|
|
211
211
|
**`auto-verify-pending` is not a skill-facing status.** It is written by `stage-exit`'s scheduling boundary, which records the debt automatically when auto-verify is effective for a stage. The value is accepted on this CLI so the entry stays inspectable and repairable, not so a skill can hand-schedule verification: no skill body and no reference passes it, and none should. Every other status in the list is the recorded *result* of a verification that ran (or was explicitly skipped); this one records that one was *owed*.
|
|
212
212
|
|
|
@@ -239,4 +239,7 @@ This Pi bundle preserves Claude's `AskUserQuestion` references because it ships
|
|
|
239
239
|
- **User input:** use `AskUserQuestion` for genuine user decisions. It supports multiple questions, option descriptions, recommended ordering, multi-select, previews, and free-form Other/custom answers.
|
|
240
240
|
- **Skill dispatch:** Pi uses `/skill:<name>` commands. If you cannot invoke a skill directly, print the exact `/skill:<name> ...` command for the user to run.
|
|
241
241
|
- **Subagents:** this bundle declares its custom agents (`forge-researcher`, `forge-spec-writer`, `forge-verifier`) as package agents. If a `subagent` tool is registered, dispatch one with `{ agent: "forge-verifier", task: "..." }`, or fan several out concurrently with `{ tasks: [{ agent: "forge-spec-writer", task: "..." }, ...] }`. If no `subagent` tool is available, run that step inline yourself.
|
|
242
|
-
- **Background / monitoring:**
|
|
242
|
+
- **Background / monitoring (forge-5-loop):** Pi has no built-in background bash, persistent monitor, or push-notification, so do **not** run the loop runner in the foreground and do **not** try to arm one. This bundle registers a **forge-loop-supervisor** extension that IS the "background-execution mechanism" and "monitoring mechanism" Steps 3b–3f refer to. Concretely:
|
|
243
|
+
- **Launch (Step 3b):** call **`forge_loop_launch`** with the backlog dir (and `review` / `agent` / `iterations` as resolved from config). It starts the loop **detached** — it runs in rauf's server and outlives this session — and returns immediately; you do not build or redirect a command yourself.
|
|
244
|
+
- **Supervise (Steps 3d–3f):** the extension then watches the runner's `events.ndjson` for you. It reports each completed item as one quiet line and **wakes this session automatically** on needs-human, blocked, stuck, review-failed, error, and completion — so do **not** arm a monitor, set a continuous tail, send a notification, poll, or foreground-sleep, and do not treat any manual stop as the terminal signal. When completion wakes you, go straight to Step 4 and read the authoritative counts with the status/list command. Use **`forge_loop_status`** to check progress on demand.
|
|
245
|
+
- **Stop / session end:** **`forge_loop_stop`** deliberately stops the runner; use it only when the user wants the loop to actually stop. Ending the Pi session does **not** stop the loop (it is detached), and the next session **reattaches automatically** without re-reporting what you already saw.
|
|
@@ -206,7 +206,7 @@ If a `state-*` verb exits 2, surface the plain `Error:` line from stderr verbati
|
|
|
206
206
|
|
|
207
207
|
### `state-verify` — verification results and provenance
|
|
208
208
|
|
|
209
|
-
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may
|
|
209
|
+
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may carry `--findings-file` + `--findings-count` for a clean report (count `0`), an **advisory-only** report (`inconsistency`/`improvement` findings only), or accepted residual findings. The stage resolves without a fix round and the report stays attached, making a completed verification round directly resumable if provenance recording is interrupted. A bare `passed` remains accepted for backward compatibility:
|
|
210
210
|
|
|
211
211
|
**`auto-verify-pending` is not a skill-facing status.** It is written by `stage-exit`'s scheduling boundary, which records the debt automatically when auto-verify is effective for a stage. The value is accepted on this CLI so the entry stays inspectable and repairable, not so a skill can hand-schedule verification: no skill body and no reference passes it, and none should. Every other status in the list is the recorded *result* of a verification that ran (or was explicitly skipped); this one records that one was *owed*.
|
|
212
212
|
|
|
@@ -83,8 +83,8 @@ This gate runs **before** the runner version/setup gates (1c/1d) so a blocked fe
|
|
|
83
83
|
Enforce `loopRunner.minRunnerVersion` **before** doing anything else with the runner. This is what turns "the runner is missing or too old" into a clear, actionable stop instead of a cryptic mid-run failure.
|
|
84
84
|
|
|
85
85
|
1. Run the **version command** (`loopRunner.versionCommand`, default `rauf version --json`) via Bash.
|
|
86
|
-
2. Parse `{ "version": "<semver>" }` from stdout. Do NOT use plain `rauf version` (its human output is `rauf v0.
|
|
87
|
-
3. **Semver-compare** (NOT string-compare) the reported version against `loopRunner.minRunnerVersion` (default `0.
|
|
86
|
+
2. Parse `{ "version": "<semver>" }` from stdout. Do NOT use plain `rauf version` (its human output is `rauf v0.14.0` with a `v` prefix) — always the `--json` form.
|
|
87
|
+
3. **Semver-compare** (NOT string-compare) the reported version against `loopRunner.minRunnerVersion` (default `0.14.0`), numerically by major, then minor, then patch.
|
|
88
88
|
|
|
89
89
|
**Any of the following is a HARD GATE FAILURE — do NOT proceed to run the loop.** STOP, show `loopRunner.installHint`, and include the raw command output for diagnosis:
|
|
90
90
|
|
|
@@ -92,7 +92,7 @@ Enforce `loopRunner.minRunnerVersion` **before** doing anything else with the ru
|
|
|
92
92
|
- Its stdout is not valid JSON, has no `version` field, or `version` is not a valid semver string.
|
|
93
93
|
- The reported version is **< `minRunnerVersion`**.
|
|
94
94
|
|
|
95
|
-
For the version-too-old case, phrase it concretely, e.g.: "Your rauf is {reported}, but feature-forge needs ≥ {minRunnerVersion} — 0.
|
|
95
|
+
For the version-too-old case, phrase it concretely, e.g.: "Your rauf is {reported}, but feature-forge needs ≥ {minRunnerVersion} — 0.14.0 is the version the package pins and the floor for full needs-human recovery. {installHint}". When the gate fails because the output couldn't be parsed, say so and show what the command printed before the `installHint`.
|
|
96
96
|
|
|
97
97
|
> `installHint` points at the runner **CLI** install/upgrade — distinct from
|
|
98
98
|
> `setupHint` (1d), which installs the runner's per-project artifacts.
|
|
@@ -198,6 +198,9 @@ Then commit this state write before launching (mandatory). The runner refuses to
|
|
|
198
198
|
|
|
199
199
|
### 3b. Launch Background Process
|
|
200
200
|
|
|
201
|
+
> **On Pi, do not perform Steps 3b–3f by hand.** Pi has no background or monitor surface; this bundle's `forge-loop-supervisor` extension IS the "background-execution mechanism" and "monitoring mechanism" these steps name. Call **`forge_loop_launch`** with the backlog dir (plus `review` / `agent` / `iterations` from config) — it launches the loop **detached** and supervises `events.ndjson` for you, reporting each completed item and waking this session on needs-human / blocked / stuck / review-failed / error / completion. **Read the rest of Steps 3b–3f, and the launch/monitor detail in `references/runner-contract.md`, as a description of what that tool does — not as commands to run.** Use `forge_loop_status` to check progress and `forge_loop_stop` only to deliberately stop the runner; full detail is in "Host execution notes (Pi)" at the end of this skill.
|
|
202
|
+
|
|
203
|
+
|
|
201
204
|
Launch the loop **backgrounded** (the host's background-execution mechanism) so it survives session end and does not block the session. For a runner that **persists its own structured event file** (the default — rauf writes `{stateDir}/events.ndjson` natively and rotates it per run), launch the **plain `runCommand`** with **no stdout redirect** and supervise the runner's **native** `events.ndjson` directly; do **not** redirect `--ndjson` into `{stateDir}` (it is redundant and collides with the runner's own writer — see `references/runner-contract.md`). Only a stdout-only runner (no native event file) uses `eventStreamCommand`, redirected to a file **outside** `{stateDir}`. The background task's exit notification is the single authoritative terminal signal (Step 4). For the exact launch commands (incl. the `mkdir -p` state-dir guard and the root→`IS_SANDBOX` sandbox guard) and the self-persisting vs. stdout-only detail, read `references/runner-contract.md`.
|
|
202
205
|
|
|
203
206
|
### 3c. Inform User
|
|
@@ -207,16 +210,16 @@ Follow the **Inform-user output template (Step 3c)** section of `references/runn
|
|
|
207
210
|
### 3d. Arm a Monitor on the event stream, and react to events
|
|
208
211
|
|
|
209
212
|
Arm the **host's monitoring mechanism** on the structured event stream (the NDJSON file, or the
|
|
210
|
-
human log as fallback) with
|
|
213
|
+
human log as fallback) with **a continuous watch**, a coverage-complete filter
|
|
211
214
|
matching every terminal and exception state (silence is not success), and react to
|
|
212
215
|
each event as it arrives. The exact Monitor commands, the filter event list, and the
|
|
213
216
|
full per-event reaction rules (`needs_human` / `loop_error` surfaced immediately with
|
|
214
|
-
|
|
217
|
+
an automatic session wake, `item_completed` coalesced into milestones, `llm_stuck_warning`
|
|
215
218
|
as a hang warning) are in `references/runner-contract.md` — follow them verbatim.
|
|
216
219
|
|
|
217
220
|
### 3f. Reach completion
|
|
218
221
|
|
|
219
|
-
Step 4 is reached when the backgrounded process exits (its completion notification is authoritative); the `loop_completed` / `loop_error` / `loop_cancelled` event is the live heads-up that it's imminent. Stop the Monitor (it ends on its own when `tail` sees the process-ended log, or via
|
|
222
|
+
Step 4 is reached when the backgrounded process exits (its completion notification is authoritative); the `loop_completed` / `loop_error` / `loop_cancelled` event is the live heads-up that it's imminent. Stop the Monitor (it ends on its own when `tail` sees the process-ended log, or via the supervisor's own teardown) and proceed to Step 4. Do NOT foreground-sleep or poll — the harness drives both the Monitor events and the completion notification.
|
|
220
223
|
|
|
221
224
|
## Step 4: Check Results
|
|
222
225
|
|
|
@@ -296,7 +299,7 @@ Add `--epic "{epic}"` when this feature is an epic member — required, per the
|
|
|
296
299
|
- `{backlogDir}` is a **directory path**, not a file path. Pass `specs/auth`, not `specs/auth/backlog.json`.
|
|
297
300
|
- rauf resolves `RAUF.md` with fallback (`{backlogDir}/.rauf/RAUF.md` first, then the project's `.rauf/RAUF.md`). State files (state.json, {loopRunner.logFile}, etc.) land at `{backlogDir}/{loopRunner.stateDir}/`, isolated per backlog dir, so concurrent features don't collide.
|
|
298
301
|
- If the session disconnects mid-loop, the runner process continues independently — check results later with the status / list commands. A stale lock from a previous run may need `--force` to clear.
|
|
299
|
-
- Never run the run command in the foreground (without the host's background-execution mechanism) — it blocks and will hit the Bash tool timeout for any non-trivial backlog. "Don't block the foreground" is NOT "stay silent": supervise via the host's monitoring mechanism (3d) —
|
|
302
|
+
- Never run the run command in the foreground (without the host's background-execution mechanism) — it blocks and will hit the Bash tool timeout for any non-trivial backlog. "Don't block the foreground" is NOT "stay silent": supervise via the host's monitoring mechanism (3d) — a continuous watch, the **structured** surface (`events.ndjson`), never raw `RAUF_*` tokens (they false-match in agent prose). A `needs_human`/`blocked`/`review` signal does **not** pause the loop — the runner sets the item aside and keeps going; surface it live but don't tell the user the loop is waiting. See `references/runner-contract.md` for the full monitoring rules.
|
|
300
303
|
- The version gate (1c) uses the `--json` form on purpose; never parse `rauf version`'s human output.
|
|
301
304
|
- **Implementation artifacts must not cite specs.** The loop should **read** specs and `backlog.json` freely — they are the source of truth, and the backlog rightly cites specs for provenance. But artifacts the loop **writes into the target repo** (source code, generated `SKILL.md`/agent files, configs, code comments) must be **self-contained**: no references to feature-forge spec files (no `See specs/{feature}/NN-*.md`, no "source spec" provenance notes) — specs are pre-implementation inputs that may be archived or deleted once the feature ships. This applies only to shipped implementation output, never to the backlog or spec documents, which keep citing specs.
|
|
302
305
|
|
|
@@ -309,4 +312,7 @@ This Pi bundle preserves Claude's `AskUserQuestion` references because it ships
|
|
|
309
312
|
- **User input:** use `AskUserQuestion` for genuine user decisions. It supports multiple questions, option descriptions, recommended ordering, multi-select, previews, and free-form Other/custom answers.
|
|
310
313
|
- **Skill dispatch:** Pi uses `/skill:<name>` commands. If you cannot invoke a skill directly, print the exact `/skill:<name> ...` command for the user to run.
|
|
311
314
|
- **Subagents:** this bundle declares its custom agents (`forge-researcher`, `forge-spec-writer`, `forge-verifier`) as package agents. If a `subagent` tool is registered, dispatch one with `{ agent: "forge-verifier", task: "..." }`, or fan several out concurrently with `{ tasks: [{ agent: "forge-spec-writer", task: "..." }, ...] }`. If no `subagent` tool is available, run that step inline yourself.
|
|
312
|
-
- **Background / monitoring:**
|
|
315
|
+
- **Background / monitoring (forge-5-loop):** Pi has no built-in background bash, persistent monitor, or push-notification, so do **not** run the loop runner in the foreground and do **not** try to arm one. This bundle registers a **forge-loop-supervisor** extension that IS the "background-execution mechanism" and "monitoring mechanism" Steps 3b–3f refer to. Concretely:
|
|
316
|
+
- **Launch (Step 3b):** call **`forge_loop_launch`** with the backlog dir (and `review` / `agent` / `iterations` as resolved from config). It starts the loop **detached** — it runs in rauf's server and outlives this session — and returns immediately; you do not build or redirect a command yourself.
|
|
317
|
+
- **Supervise (Steps 3d–3f):** the extension then watches the runner's `events.ndjson` for you. It reports each completed item as one quiet line and **wakes this session automatically** on needs-human, blocked, stuck, review-failed, error, and completion — so do **not** arm a monitor, set a continuous tail, send a notification, poll, or foreground-sleep, and do not treat any manual stop as the terminal signal. When completion wakes you, go straight to Step 4 and read the authoritative counts with the status/list command. Use **`forge_loop_status`** to check progress on demand.
|
|
318
|
+
- **Stop / session end:** **`forge_loop_stop`** deliberately stops the runner; use it only when the user wants the loop to actually stop. Ending the Pi session does **not** stop the loop (it is detached), and the next session **reattaches automatically** without re-reporting what you already saw.
|
|
@@ -156,11 +156,13 @@ to today. Degradation is **silent, not an error**, keeping alternate (non-rauf)
|
|
|
156
156
|
runners first-class. The gate condition is owned by
|
|
157
157
|
`02-config-schema-and-gating.md`.
|
|
158
158
|
|
|
159
|
-
Independently, the **version gate** floors at the runner version
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
159
|
+
Independently, the **version gate** floors at the runner version the stage
|
|
160
|
+
depends on. For rauf that is **0.14.0** (`loopRunner.minRunnerVersion`): the
|
|
161
|
+
version the package pins and the floor for full needs-human recovery (0.14's
|
|
162
|
+
`backlog answer`). The agent surface — the `--agent` flag, the `agents` probe,
|
|
163
|
+
and the preset agent registry — has been present since rauf 0.6.0 and is
|
|
164
|
+
subsumed by the higher floor, so a successful gate guarantees both the recovery
|
|
165
|
+
and agent surfaces exist before any run. See `## Version gating` and
|
|
164
166
|
`05-runner-discovery-version-gate.md`.
|
|
165
167
|
|
|
166
168
|
**This document — the `## Agent selection` section, the `## Per-stage agent
|
|
@@ -210,9 +212,11 @@ belongs to execution only. If you find yourself adding `--agent` near a
|
|
|
210
212
|
|
|
211
213
|
feature-forge requires a runner exposing `backlog validate` + backlog
|
|
212
214
|
`schemaVersion`, and the unified exit-code/status contract it reads. The floor is
|
|
213
|
-
now the **
|
|
214
|
-
|
|
215
|
-
|
|
215
|
+
now the **capability floor** the stage actually depends on: the version the
|
|
216
|
+
package pins and the floor for full needs-human recovery (0.14's `backlog
|
|
217
|
+
answer`). It subsumes the older agent-surface floor (the `--agent` flag, the
|
|
218
|
+
`agents` probe, and the preset agent registry, present since 0.6.0). For rauf
|
|
219
|
+
that is **0.14.0** (`loopRunner.minRunnerVersion`).
|
|
216
220
|
`forge-5-loop` runs `{bin} version --json`, semver-compares the reported version
|
|
217
221
|
against `minRunnerVersion`, and on a missing-or-too-old runner stops with
|
|
218
222
|
`loopRunner.installHint` (the CLI install/upgrade command) — **before** invoking
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# forge-5-loop — Loop-Runner Contract (launch, supervision, model precedence)
|
|
2
2
|
|
|
3
|
+
> **On Pi, do not perform Steps 3b–3f by hand.** Pi has no background or monitor surface; this bundle's `forge-loop-supervisor` extension IS the "background-execution mechanism" and "monitoring mechanism" these steps name. Call **`forge_loop_launch`** with the backlog dir (plus `review` / `agent` / `iterations` from config) — it launches the loop **detached** and supervises `events.ndjson` for you, reporting each completed item and waking this session on needs-human / blocked / stuck / review-failed / error / completion. **Read the rest of Steps 3b–3f, and the launch/monitor detail in `references/runner-contract.md`, as a description of what that tool does — not as commands to run.** Use `forge_loop_status` to check progress and `forge_loop_stop` only to deliberately stop the runner; full detail is in "Host execution notes (Pi)" at the end of this skill.
|
|
4
|
+
|
|
5
|
+
|
|
3
6
|
This file holds the detailed loop-runner contract relocated out of
|
|
4
7
|
`forge-5-loop/SKILL.md`: the event-stream vs. log-fallback **launch** detail
|
|
5
8
|
(Steps 3b/3d/3e), the structured-surface **monitoring** caveats, and the **model
|
|
@@ -70,8 +73,8 @@ Notes:
|
|
|
70
73
|
separate open-ended option for that.
|
|
71
74
|
- **Option 3 is conditional.** Include it only when the Step 2a tally has `blocked
|
|
72
75
|
> 0`; otherwise present options 1 and 2 only.
|
|
73
|
-
- **Version floor.** rauf's explicit `review` signal ships in 0.5.0, below the
|
|
74
|
-
`minRunnerVersion` floor (0.
|
|
76
|
+
- **Version floor.** rauf's explicit `review` signal ships in 0.5.0, well below the
|
|
77
|
+
`minRunnerVersion` floor (0.14.0) enforced at gate 1c — so `--review` is always
|
|
75
78
|
available once the loop is cleared to launch. No extra version check is needed.
|
|
76
79
|
- **Non-rauf runners.** When `loopRunner.name != "rauf"`, add **no** Run-mode
|
|
77
80
|
question — present the bare rendered command and let the user adjust via "Other",
|
|
@@ -143,7 +146,7 @@ backlog size).
|
|
|
143
146
|
## Arm a Monitor on the event stream (Step 3d)
|
|
144
147
|
|
|
145
148
|
Arm the **host's monitoring mechanism** on the structured event stream so events flow back into
|
|
146
|
-
this session as they happen. Use
|
|
149
|
+
this session as they happen. Use **a continuous watch** — runs can exceed the host's monitoring mechanism's
|
|
147
150
|
maximum `timeout_ms` (1 hour), and a bounded timeout would silently stop watching a
|
|
148
151
|
still-running loop.
|
|
149
152
|
|
|
@@ -189,7 +192,7 @@ high and the noise low:
|
|
|
189
192
|
rather than echoing every line. For an exact breakdown, run the one-shot
|
|
190
193
|
`{rendered statusJsonCommand}` and report `done/total` from `backlogSummary`.
|
|
191
194
|
- **`needs_human`** (or `signal_parsed` with `signal: "needs_human"`) → **surface
|
|
192
|
-
immediately** and send a
|
|
195
|
+
immediately** and send a **an automatic session wake** (an hours-long run means the user has
|
|
193
196
|
likely stepped away). **Important — the loop is NOT paused:** the runner has set that
|
|
194
197
|
item aside and kept working other items. So report *what* needs a human and *which*
|
|
195
198
|
item, then either (a) collect the user's answer via `AskUserQuestion` and **record it via
|
|
@@ -204,7 +207,7 @@ high and the noise low:
|
|
|
204
207
|
No action is needed now: Step 4c's recovery pass offers the unblock after the run
|
|
205
208
|
ends — a blocked-only run (no `needs_human` event) still enters it.
|
|
206
209
|
- **`loop_error`** → a real failure (this is also what a circuit-breaker halt — too many
|
|
207
|
-
consecutive infra failures — emits). Surface now and
|
|
210
|
+
consecutive infra failures — emits). Surface now and an automatic session wake. Offer
|
|
208
211
|
inspection / `--force` / re-run as appropriate.
|
|
209
212
|
- **Stall detection** → rauf emits an **`llm_stuck_warning`** event when an iteration
|
|
210
213
|
stops making progress; the filter above includes it, so surface it live (a hang
|
|
@@ -206,7 +206,7 @@ If a `state-*` verb exits 2, surface the plain `Error:` line from stderr verbati
|
|
|
206
206
|
|
|
207
207
|
### `state-verify` — verification results and provenance
|
|
208
208
|
|
|
209
|
-
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may
|
|
209
|
+
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may carry `--findings-file` + `--findings-count` for a clean report (count `0`), an **advisory-only** report (`inconsistency`/`improvement` findings only), or accepted residual findings. The stage resolves without a fix round and the report stays attached, making a completed verification round directly resumable if provenance recording is interrupted. A bare `passed` remains accepted for backward compatibility:
|
|
210
210
|
|
|
211
211
|
**`auto-verify-pending` is not a skill-facing status.** It is written by `stage-exit`'s scheduling boundary, which records the debt automatically when auto-verify is effective for a stage. The value is accepted on this CLI so the entry stays inspectable and repairable, not so a skill can hand-schedule verification: no skill body and no reference passes it, and none should. Every other status in the list is the recorded *result* of a verification that ran (or was explicitly skipped); this one records that one was *owed*.
|
|
212
212
|
|