@garygentry/feature-forge 0.3.2 → 0.3.5
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/agents/forge-verifier.md +3 -1
- package/adapters/claude/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/claude/references/epic-state-schema.json +50 -0
- package/adapters/claude/references/forge-config-schema.json +20 -2
- package/adapters/claude/references/forge-decisions-schema.json +33 -0
- package/adapters/claude/references/pipeline-state-schema.json +34 -2
- package/adapters/claude/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/references/shared-conventions.md +15 -4
- package/adapters/claude/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/scripts/epic-manifest.py +82 -4
- package/adapters/claude/scripts/fix-sweep.py +1180 -0
- package/adapters/claude/scripts/forge-session.py +1151 -32
- package/adapters/claude/skills/forge/SKILL.md +5 -5
- package/adapters/claude/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/claude/skills/forge/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +5 -1
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +5 -0
- package/adapters/claude/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-1-prd/SKILL.md +3 -1
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-2-tech/SKILL.md +5 -1
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-3-specs/SKILL.md +5 -1
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +41 -3
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-5-loop/SKILL.md +36 -36
- package/adapters/claude/skills/forge-5-loop/references/agent-selection.md +16 -0
- package/adapters/claude/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +22 -4
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-6-docs/SKILL.md +29 -6
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-fix/SKILL.md +34 -0
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/claude/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-verify/SKILL.md +10 -11
- package/adapters/claude/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/claude/skills/forge-verify/references/findings-template.md +30 -0
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/adapters/codex/.feature-forge-bundle.json +1 -1
- package/adapters/codex/agents/forge-verifier.toml +3 -1
- package/adapters/codex/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/codex/references/epic-state-schema.json +50 -0
- package/adapters/codex/references/forge-config-schema.json +20 -2
- package/adapters/codex/references/forge-decisions-schema.json +33 -0
- package/adapters/codex/references/pipeline-state-schema.json +34 -2
- package/adapters/codex/references/process-overview.md +2 -2
- package/adapters/codex/references/ralph-loop-contract.md +6 -3
- package/adapters/codex/references/shared-conventions.md +44 -33
- package/adapters/codex/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/scripts/epic-manifest.py +82 -4
- package/adapters/codex/scripts/fix-sweep.py +1180 -0
- package/adapters/codex/scripts/forge-session.py +1151 -32
- package/adapters/codex/skills/forge/SKILL.md +8 -8
- package/adapters/codex/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/codex/skills/forge/references/process-overview.md +2 -2
- package/adapters/codex/skills/forge/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/codex/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-1-prd/SKILL.md +3 -1
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-2-tech/SKILL.md +5 -1
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-3-specs/SKILL.md +5 -1
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +41 -3
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-5-loop/SKILL.md +36 -36
- package/adapters/codex/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/codex/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/codex/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +26 -8
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-6-docs/SKILL.md +29 -6
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-fix/SKILL.md +34 -0
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-guide/SKILL.md +1 -1
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/codex/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/codex/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/codex/skills/forge-guide/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-init/SKILL.md +1 -1
- package/adapters/codex/skills/forge-verify/SKILL.md +11 -12
- package/adapters/codex/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/codex/skills/forge-verify/references/findings-template.md +32 -2
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/codex/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/adapters/copilot/.feature-forge-bundle.json +1 -1
- package/adapters/copilot/agents/forge-verifier.md +3 -1
- package/adapters/copilot/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/copilot/references/epic-state-schema.json +50 -0
- package/adapters/copilot/references/forge-config-schema.json +20 -2
- package/adapters/copilot/references/forge-decisions-schema.json +33 -0
- package/adapters/copilot/references/pipeline-state-schema.json +34 -2
- package/adapters/copilot/references/process-overview.md +2 -2
- package/adapters/copilot/references/ralph-loop-contract.md +6 -3
- package/adapters/copilot/references/shared-conventions.md +44 -33
- package/adapters/copilot/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/scripts/epic-manifest.py +82 -4
- package/adapters/copilot/scripts/fix-sweep.py +1180 -0
- package/adapters/copilot/scripts/forge-session.py +1151 -32
- package/adapters/copilot/skills/forge/forge.md +8 -8
- package/adapters/copilot/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/copilot/skills/forge/references/process-overview.md +2 -2
- package/adapters/copilot/skills/forge/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/copilot/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +3 -1
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +5 -1
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +5 -1
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +41 -3
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +36 -36
- package/adapters/copilot/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/copilot/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/copilot/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +26 -8
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +29 -6
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-fix/forge-fix.md +34 -0
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-guide/forge-guide.md +1 -1
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/copilot/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/copilot/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-init/forge-init.md +1 -1
- package/adapters/copilot/skills/forge-verify/forge-verify.md +11 -12
- package/adapters/copilot/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/copilot/skills/forge-verify/references/findings-template.md +32 -2
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/adapters/cursor/.feature-forge-bundle.json +1 -1
- package/adapters/cursor/agents/forge-verifier.mdc +3 -1
- package/adapters/cursor/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/cursor/references/epic-state-schema.json +50 -0
- package/adapters/cursor/references/forge-config-schema.json +20 -2
- package/adapters/cursor/references/forge-decisions-schema.json +33 -0
- package/adapters/cursor/references/pipeline-state-schema.json +34 -2
- package/adapters/cursor/references/process-overview.md +2 -2
- package/adapters/cursor/references/ralph-loop-contract.md +6 -3
- package/adapters/cursor/references/shared-conventions.md +44 -33
- package/adapters/cursor/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/scripts/epic-manifest.py +82 -4
- package/adapters/cursor/scripts/fix-sweep.py +1180 -0
- package/adapters/cursor/scripts/forge-session.py +1151 -32
- package/adapters/cursor/skills/forge/forge.mdc +8 -8
- package/adapters/cursor/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/cursor/skills/forge/references/process-overview.md +2 -2
- package/adapters/cursor/skills/forge/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/cursor/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +3 -1
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +5 -1
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +5 -1
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +41 -3
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +36 -36
- package/adapters/cursor/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/cursor/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/cursor/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +26 -8
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +29 -6
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +34 -0
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-guide/forge-guide.mdc +1 -1
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/cursor/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/cursor/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-init/forge-init.mdc +1 -1
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +11 -12
- package/adapters/cursor/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/cursor/skills/forge-verify/references/findings-template.md +32 -2
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/adapters/gemini/.feature-forge-bundle.json +1 -1
- package/adapters/gemini/agents/forge-verifier.md +3 -1
- package/adapters/gemini/gemini-extension.json +1 -1
- package/adapters/gemini/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/gemini/references/epic-state-schema.json +50 -0
- package/adapters/gemini/references/forge-config-schema.json +20 -2
- package/adapters/gemini/references/forge-decisions-schema.json +33 -0
- package/adapters/gemini/references/pipeline-state-schema.json +34 -2
- package/adapters/gemini/references/process-overview.md +2 -2
- package/adapters/gemini/references/ralph-loop-contract.md +6 -3
- package/adapters/gemini/references/shared-conventions.md +44 -33
- package/adapters/gemini/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/scripts/epic-manifest.py +82 -4
- package/adapters/gemini/scripts/fix-sweep.py +1180 -0
- package/adapters/gemini/scripts/forge-session.py +1151 -32
- package/adapters/gemini/skills/forge/forge.md +8 -8
- package/adapters/gemini/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/gemini/skills/forge/references/process-overview.md +2 -2
- package/adapters/gemini/skills/forge/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/gemini/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +3 -1
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +5 -1
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +5 -1
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +41 -3
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +36 -36
- package/adapters/gemini/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/gemini/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/gemini/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +26 -8
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +29 -6
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-fix/forge-fix.md +34 -0
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-guide/forge-guide.md +1 -1
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/gemini/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/gemini/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-init/forge-init.md +1 -1
- package/adapters/gemini/skills/forge-verify/forge-verify.md +11 -12
- package/adapters/gemini/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/gemini/skills/forge-verify/references/findings-template.md +32 -2
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/adapters/pi/.feature-forge-bundle.json +1 -1
- package/adapters/pi/agents/forge-verifier.md +3 -1
- package/adapters/pi/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/pi/references/epic-state-schema.json +50 -0
- package/adapters/pi/references/forge-config-schema.json +20 -2
- package/adapters/pi/references/forge-decisions-schema.json +33 -0
- package/adapters/pi/references/pipeline-state-schema.json +34 -2
- package/adapters/pi/references/process-overview.md +2 -2
- package/adapters/pi/references/ralph-loop-contract.md +6 -3
- package/adapters/pi/references/shared-conventions.md +33 -22
- package/adapters/pi/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/scripts/epic-manifest.py +82 -4
- package/adapters/pi/scripts/fix-sweep.py +1180 -0
- package/adapters/pi/scripts/forge-session.py +1151 -32
- package/adapters/pi/skills/forge/SKILL.md +5 -5
- package/adapters/pi/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/pi/skills/forge/references/process-overview.md +2 -2
- package/adapters/pi/skills/forge/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +8 -4
- package/adapters/pi/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
- package/adapters/pi/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-1-prd/SKILL.md +3 -1
- package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-2-tech/SKILL.md +5 -1
- package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-3-specs/SKILL.md +5 -1
- package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-4-backlog/SKILL.md +41 -3
- package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-5-loop/SKILL.md +36 -36
- package/adapters/pi/skills/forge-5-loop/references/agent-selection.md +16 -0
- package/adapters/pi/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/pi/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/pi/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +25 -7
- package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-6-docs/SKILL.md +29 -6
- package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-fix/SKILL.md +34 -0
- package/adapters/pi/skills/forge-fix/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/pi/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/pi/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/pi/skills/forge-guide/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-verify/SKILL.md +10 -11
- package/adapters/pi/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/pi/skills/forge-verify/references/findings-template.md +31 -1
- package/adapters/pi/skills/forge-verify/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/pi/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/specs.md +43 -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 +1 -1
|
@@ -36,7 +36,7 @@ I found that the codebase uses React and TanStack Router.
|
|
|
36
36
|
|
|
37
37
|
### Decision Support: Help the User Choose
|
|
38
38
|
|
|
39
|
-
When
|
|
39
|
+
When a question posed through `AskUserQuestion` carries substantive options (a real choice — not a trivial yes/no confirmation), do not just list them. The interview stages have already done codebase research and integration analysis; surfacing that synthesis at the decision moment is the whole point. For every such question:
|
|
40
40
|
|
|
41
41
|
- **Lead with a recommended option.** Place it first and label it `(recommended)` (matching the `AskUserQuestion` "(Recommended)" convention).
|
|
42
42
|
- **Put the trade-off in each option's `description`.** Say why you'd pick it and what you give up versus the alternatives — the cost, not just the benefit.
|
|
@@ -53,6 +53,17 @@ For genuinely comparable artifacts (competing module structures, two code snippe
|
|
|
53
53
|
|
|
54
54
|
The **Branch Setup** block below is the reference pattern: a strong recommendation as the first option, rationale inline, the alternative still available, never a hard-stop.
|
|
55
55
|
|
|
56
|
+
## Stage Review Gate
|
|
57
|
+
|
|
58
|
+
Every authoring stage ends its "Review with User" step in exactly one of two shapes. Which shape a stage uses is declared **here, once** — each stage's review step points at this block by title, and the shape is never re-derived from the surrounding prose or inferred from how sibling stages behave (three stages block and one does not; majority-shape inference is precisely the failure this block exists to prevent):
|
|
59
|
+
|
|
60
|
+
- **Blocking review (gate).** The stage presents the artifact and collects feedback through `AskUserQuestion`; it does **not** proceed until the user answers, iterating until they confirm. Stages: **forge-1-prd** (Step 5), **forge-2-tech** (Step 6), **forge-3-specs** (Step 6).
|
|
61
|
+
- **Non-blocking review (invitation).** The stage states the artifact is ready and invites adjustments **as a statement, not a question** — and then **proceeds to the next step in the same turn unless the user asks for changes**. The invitation obliges the agent to *continue*: emitting the invitation sentence and stopping treats the non-gate as a gate and strands the stage `in-progress` with its completion step unrun — a defect, not caution. Stage: **forge-4-backlog** (Step 6).
|
|
62
|
+
|
|
63
|
+
**Why the shapes differ.** A blocking review guards an artifact whose content was just authored from open-ended interview or synthesis — the user is the only authority on "complete", so the stage must wait. forge-4's backlog is *derived* from specs the user already approved, was planned interactively in its Step 3, and is machine-validated in its Step 5; a second hard gate would re-ask a settled question, and the loop never launches without forge-5-loop's own Step 2d confirmation anyway. The invitation is a courtesy checkpoint, not an approval gate (removed deliberately in #78's consistency sweep).
|
|
64
|
+
|
|
65
|
+
A stage that changes shape changes it **in this block first**; the per-stage pointer stays a pointer.
|
|
66
|
+
|
|
56
67
|
## Configuration Reading
|
|
57
68
|
|
|
58
69
|
Read `forge.config.json` from the project root. If it doesn't exist, use defaults.
|
|
@@ -68,10 +79,10 @@ Extract these config values (use defaults if not present):
|
|
|
68
79
|
- `branchPerFeature` (default: true)
|
|
69
80
|
- `branchPrefix` (default: `forge/`)
|
|
70
81
|
- `loopIterationMultiplier` (default: `1.5`)
|
|
71
|
-
- `autoInvokeNextStage` (default: `true` — the `/skill:forge` navigator auto-invokes the next stage via the
|
|
82
|
+
- `autoInvokeNextStage` (default: `true` — the `/skill:forge` navigator auto-invokes the next stage via the host's skill-invocation mechanism after the user confirms; `false` keeps copy-paste behavior. Navigator-only.)
|
|
72
83
|
- `contextWindowTokens` (default: `null` — context window used by the navigator's context-usage check; `null` infers from the session model and falls back to 200000. Set to the model's window, e.g. `1000000` on a 1M model. Navigator-only.)
|
|
73
84
|
- `contextWarnThreshold` (default: `0.7` — fraction of the window past which the navigator recommends a clean session. Navigator-only.)
|
|
74
|
-
- `autoVerify` (default: `false` — when `true`, `forge-verify` runs automatically after a stage completes, no prompt. **In-stage-primary:** the just-completed authoring stage runs it itself, in-session, before the exit block (honoring the verify-before-clear principle). The navigator runs it only as a **catch-up** when verify is still pending (a host that could not dispatch a clean-room subagent, or a stage run before this behavior landed). Either way it runs in a fresh clean-room subagent, so it never needs a `/
|
|
85
|
+
- `autoVerify` (default: `false` — when `true`, `forge-verify` runs automatically after a stage completes, no prompt. **In-stage-primary:** the just-completed authoring stage runs it itself, in-session, before the exit block (honoring the verify-before-clear principle). The navigator runs it only as a **catch-up** when verify is still pending (a host that could not dispatch a clean-room subagent, or a stage run before this behavior landed). Either way it runs in a fresh clean-room subagent, so it never needs a `/new` and costs only a compact digest.)
|
|
75
86
|
- `autoVerifyStages` (default: `{}` — per-stage overrides for `autoVerify`, e.g. `{"forge-1-prd": false}`. Effective value = `autoVerifyStages[stage]` if present, else `autoVerify`. Keys are constrained to the five verify-capable stages; a typo is a config error surfaced as `invalidAutoVerifyKeys`. Both the in-stage run and the navigator catch-up read this same effective value.)
|
|
76
87
|
- `autoFix` (default: `false` — when `true`, `forge-fix` is chained after an auto-verify that finds issues — by the in-stage run (primary) or the navigator catch-up — but only when auto-verify is on for that stage AND preconditions hold (zero unresolved decisions, clean tree, passing re-verify); otherwise a digest is surfaced and the gate is presented.)
|
|
77
88
|
- `loopRunner` (optional object — the loop runner to drive; **defaults to rauf** when absent, with every command templated. See `references/forge-config-schema.json` and `references/ralph-loop-contract.md`.)
|
|
@@ -81,7 +92,7 @@ Extract these config values (use defaults if not present):
|
|
|
81
92
|
Before any file I/O against a feature's artifacts, resolve its directory through the deterministic helper rather than hardcoding `{specsDir}/{feature}/`. This makes flat (`{specsDir}/{feature}/`) and nested (`{specsDir}/{epic}/{feature}/`) layouts both resolve from a bare feature name (REQ-DIR-03), with standalone features behaving exactly as today.
|
|
82
93
|
|
|
83
94
|
```bash
|
|
84
|
-
R="$(bash -c 'for d in "${
|
|
95
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
85
96
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
86
97
|
resolvedFeatureDir=$(python3 "$R/scripts/epic-manifest.py" \
|
|
87
98
|
resolve "<feature>" --specs-dir "<specsDir>")
|
|
@@ -96,7 +107,7 @@ In both failure cases, do not fall back to a guessed path.
|
|
|
96
107
|
**On `not-found`, check other branches before stopping.** With `branchPerFeature`, the feature's directory (and its `.pipeline-state.json`) may exist only on its topic branch — invisible from the default branch of a fresh clone. Before concluding the pipeline does not exist, run the read-only cross-branch discovery:
|
|
97
108
|
|
|
98
109
|
```bash
|
|
99
|
-
R="$(bash -c 'for d in "${
|
|
110
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
100
111
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
101
112
|
python3 "$R/scripts/forge-session.py" discover-feature "<feature>" --specs-dir "<specsDir>" --json
|
|
102
113
|
```
|
|
@@ -124,16 +135,16 @@ Whenever a stage creates the specs tree for the first time (the first PRD or epi
|
|
|
124
135
|
Run this after creating the feature/epic directory, before the stage's git commit:
|
|
125
136
|
|
|
126
137
|
```bash
|
|
127
|
-
R="$(bash -c 'for d in "${
|
|
138
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
128
139
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
129
140
|
mkdir -p "<specsDir>"
|
|
130
141
|
[ -f "<specsDir>/AGENTS.md" ] || cp "$R/references/templates/specs-hygiene/AGENTS.md" "<specsDir>/AGENTS.md"
|
|
131
142
|
```
|
|
132
143
|
|
|
133
|
-
If the host is Claude (the
|
|
144
|
+
If the host is Claude (the Claude-native question tool is available), also ensure the Claude-framed variant:
|
|
134
145
|
|
|
135
146
|
```bash
|
|
136
|
-
R="$(bash -c 'for d in "${
|
|
147
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
137
148
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
138
149
|
[ -f "<specsDir>/CLAUDE.md" ] || cp "$R/references/templates/specs-hygiene/CLAUDE.md" "<specsDir>/CLAUDE.md"
|
|
139
150
|
```
|
|
@@ -153,7 +164,7 @@ After resolving the feature directory, check the feature's `.pipeline-state.json
|
|
|
153
164
|
To obtain the manifest contracts and the live completion status of each dependency in one deterministic call, run `render-status` and read the per-feature `status` and the `consumes`/`exposes` arrays rather than re-deriving them:
|
|
154
165
|
|
|
155
166
|
```bash
|
|
156
|
-
R="$(bash -c 'for d in "${
|
|
167
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
157
168
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
158
169
|
python3 "$R/scripts/epic-manifest.py" \
|
|
159
170
|
render-status "<epic>" --specs-dir "<specsDir>" --json
|
|
@@ -168,7 +179,7 @@ If `render-status` fails, proceed with **only** EPIC.md + charter (a corrupt man
|
|
|
168
179
|
Defense-in-depth for the split-brain-epic failure (Issue #125). Invoke this block in the authoring stages (`forge-1-prd`..`forge-4-backlog`) once the feature has resolved — right after **Epic Context Injection** for the stages that run it (`forge-1-prd`..`forge-3-specs`), and right after **Feature Directory Resolution** for `forge-4-backlog`. It confirms that a **resolved nested epic member** actually sits on a branch that contains the epic's manifest. Without this, a member reached from a branch cut *before* the epic-manifest commit (or that otherwise lacks it) would author specs against an epic decomposition that is not present — the exact drift that produces a disjoint, split-brain member. **Skip if not a git repo or `branchPerFeature` is false.**
|
|
169
180
|
|
|
170
181
|
```bash
|
|
171
|
-
R="$(bash -c 'for d in "${
|
|
182
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
172
183
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
173
184
|
python3 "$R/scripts/forge-session.py" check-epic-base --feature "{feature}" --specs-dir "{specsDir}" --json
|
|
174
185
|
```
|
|
@@ -191,7 +202,7 @@ Pipeline state is written by the `state-*` verbs of `scripts/forge-session.py`
|
|
|
191
202
|
|
|
192
203
|
If a `state-*` verb exits 2, surface the plain `Error:` line from stderr verbatim, do **not** proceed to the next step of the surrounding protocol, and do **not** hand-author the JSON as a workaround. The stage remains resumable because the entry stamp is already on disk — re-run the verb once the cause is fixed.
|
|
193
204
|
|
|
194
|
-
**The
|
|
205
|
+
**The nine `state-*` verbs.** `state-enter` (Stage-Entry Guard), `state-artifact` (incremental artifact tracking), `state-complete` (Git Commit Protocol), `state-skip` (the deliberate forge-6-docs documentation skip — scoped to that one stage; writes `status: "skipped"` + `skippedAt`, refuses to erase a record of docs that exist, and is the only sanctioned writer of a skipped docs stage), `state-branch` (Branch Setup and Branch Reconciliation), `state-note` (the Immediate Downstream Note below, and the optional completion note at stage closure), `state-decision` (deferred decisions), `state-ecr` (epic change requests), and `state-verify` (one `forge-verify-*` verification transition — below). The `--epic` member requirement and the exit-2 failure protocol above apply to **every** one of them, `state-verify` included; no verify entry is ever hand-authored.
|
|
195
206
|
|
|
196
207
|
### `state-verify` — verification results and provenance
|
|
197
208
|
|
|
@@ -200,7 +211,7 @@ If a `state-*` verb exits 2, surface the plain `Error:` line from stderr verbati
|
|
|
200
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*.
|
|
201
212
|
|
|
202
213
|
```bash
|
|
203
|
-
R="$(bash -c 'for d in "${
|
|
214
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
204
215
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
205
216
|
python3 "$R/scripts/forge-session.py" state-verify \
|
|
206
217
|
--feature "{feature}" --stage "{served-production-stage}" --status "<status>" \
|
|
@@ -210,7 +221,7 @@ python3 "$R/scripts/forge-session.py" state-verify \
|
|
|
210
221
|
Provenance follows the same two-commit sequence as `state-complete`: the result transition above writes `commitHash: null`, Commit 1 records the findings document and the state, and a second `state-verify` call records the full 40-hex hash of Commit 1 and touches nothing else (never `--amend`; an abbreviated hash is refused rather than expanded). Add `--epic "{epic}"` for an epic member — required, per the member rule above:
|
|
211
222
|
|
|
212
223
|
```bash
|
|
213
|
-
R="$(bash -c 'for d in "${
|
|
224
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
214
225
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
215
226
|
python3 "$R/scripts/forge-session.py" state-verify \
|
|
216
227
|
--feature "{feature}" --stage "{served-production-stage}" \
|
|
@@ -220,7 +231,7 @@ python3 "$R/scripts/forge-session.py" state-verify \
|
|
|
220
231
|
Epic-scoped verification is the single exception to the member rule: with `--stage forge-0-epic`, `--feature` names the **epic** and `--epic` must be absent or exactly equal to it. That call writes `{specsDir}/{epic}/.epic-state.json` and never a member's `.pipeline-state.json`, and its freshness version is the epic manifest's `revision`, never a member's stage version:
|
|
221
232
|
|
|
222
233
|
```bash
|
|
223
|
-
R="$(bash -c 'for d in "${
|
|
234
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
224
235
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
225
236
|
python3 "$R/scripts/forge-session.py" state-verify \
|
|
226
237
|
--feature "{epic}" --stage forge-0-epic --status "<status>" \
|
|
@@ -242,7 +253,7 @@ Frame the choice with its cost: re-running re-derives this stage from the curren
|
|
|
242
253
|
When an interview raises a concern that belongs to a *later stage of this same feature*, acknowledge it and persist it **immediately, at the moment it is raised** — not at stage closure — by running `state-note` with a concise one-line statement of the concern. Add `--epic "{epic}"` when this feature is an epic member — required, per the Pipeline State Protocol above; omitting it for a member is an error and must never be allowed to fall back to a same-named flat feature.
|
|
243
254
|
|
|
244
255
|
```bash
|
|
245
|
-
R="$(bash -c 'for d in "${
|
|
256
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
246
257
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
247
258
|
python3 "$R/scripts/forge-session.py" state-note \
|
|
248
259
|
--feature "{feature}" --note "<concise downstream concern>" \
|
|
@@ -286,7 +297,7 @@ Invoke this block at the **very start** of a pipeline entry point — `forge-1-p
|
|
|
286
297
|
**Record the branch.** After this block resolves, record the resulting branch name in the feature's top-level `branch` field by running `state-branch` (create/update it when the state file is first written for this stage). Emit the call **once the feature directory exists** — i.e. after Feature Directory Resolution and the Entry Stamp, **not** at this block: Branch Setup runs at the very start of the entry point, before any directory resolution, and a brand-new standalone feature may have no directory yet. Add `--epic "{epic}"` to the call when this feature is an epic member — required, per the Pipeline State Protocol.
|
|
287
298
|
|
|
288
299
|
```bash
|
|
289
|
-
R="$(bash -c 'for d in "${
|
|
300
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
290
301
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
291
302
|
python3 "$R/scripts/forge-session.py" state-branch \
|
|
292
303
|
--feature "{feature}" --branch "<name>" --specs-dir "{specsDir}"
|
|
@@ -299,7 +310,7 @@ Downstream stages and `forge-5-loop` read it to detect drift back onto the defau
|
|
|
299
310
|
The recorded `branch` is a **self-healing hint, not gospel.** A hosted environment (Claude.ai remote, cloud agents) can impose an arbitrary session branch (e.g. `claude/<slug>`) that Branch Setup silently records; the user may then move the work to the intended topic branch, leaving the recorded field stale. Every branch-aware mechanism (the `forge-5-loop` guard, `discover-feature`) keys off that field, so a stale value actively misleads — the loop would offer to switch you *back* to the imposed branch. Invoke this block from `forge-5-loop`'s pre-flight (and any stage that acts on the recorded branch) to reconcile deterministically. Skip if not a git repo or `branchPerFeature` is false.
|
|
300
311
|
|
|
301
312
|
```bash
|
|
302
|
-
R="$(bash -c 'for d in "${
|
|
313
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
303
314
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
304
315
|
python3 "$R/scripts/forge-session.py" reconcile-branch --feature "{feature}" --specs-dir "{specsDir}" --json
|
|
305
316
|
```
|
|
@@ -312,7 +323,7 @@ Act on the emitted `action` (source of truth is where the state actually resolve
|
|
|
312
323
|
The `adopt-current` write, with the portable plugin-root prelude. Add `--epic "{epic}"` when this feature is an epic member — required, per the Pipeline State Protocol:
|
|
313
324
|
|
|
314
325
|
```bash
|
|
315
|
-
R="$(bash -c 'for d in "${
|
|
326
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
316
327
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
317
328
|
python3 "$R/scripts/forge-session.py" state-branch \
|
|
318
329
|
--feature "{feature}" --branch "{newBranch}" --specs-dir "{specsDir}"
|
|
@@ -338,7 +349,7 @@ When `gitCommitAfterStage` is true, follow this exact order to avoid state incon
|
|
|
338
349
|
The two `state-complete` calls, with the portable plugin-root prelude. Add `--epic "{epic}"` to each when this feature is an epic member — required, per the Pipeline State Protocol:
|
|
339
350
|
|
|
340
351
|
```bash
|
|
341
|
-
R="$(bash -c 'for d in "${
|
|
352
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
342
353
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
343
354
|
# Commit 1 — before `git commit`
|
|
344
355
|
python3 "$R/scripts/forge-session.py" state-complete \
|
|
@@ -368,7 +379,7 @@ Invoke this block at the **start of an authoring stage** (`forge-1-prd`..`forge-
|
|
|
368
379
|
**Entry Stamp** (fresh, restart, and re-author paths — NOT the resume path). Before authoring, record the entry stamp by running `state-enter` — one atomic write that sets `stages.{stage}.status` → `"in-progress"`, `stages.{stage}.startedAt` → current ISO-8601 UTC timestamp, top-level `currentStage` → `"{stage}"` (where the pipeline IS, per O1), and refreshes `updatedAt`. Add `--epic "{epic}"` when this feature is an epic member — required, per the Pipeline State Protocol:
|
|
369
380
|
|
|
370
381
|
```bash
|
|
371
|
-
R="$(bash -c 'for d in "${
|
|
382
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
372
383
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
373
384
|
python3 "$R/scripts/forge-session.py" state-enter \
|
|
374
385
|
--feature "{feature}" --stage "{stage}" --specs-dir "{specsDir}"
|
|
@@ -381,7 +392,7 @@ This write is **left uncommitted**: it is staged and committed as part of this s
|
|
|
381
392
|
**Incremental artifact tracking:** When a stage writes multiple files (e.g. forge-3-specs writing a suite of spec documents), run `state-artifact --feature {feature} --stage {stage} --path <file>` after writing each file — not just at stage completion. This is what makes the Interrupted inventory above precise about which files were successfully written. Add `--epic "{epic}"` when this feature is an epic member — required, per the Pipeline State Protocol.
|
|
382
393
|
|
|
383
394
|
```bash
|
|
384
|
-
R="$(bash -c 'for d in "${
|
|
395
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
385
396
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
386
397
|
python3 "$R/scripts/forge-session.py" state-artifact \
|
|
387
398
|
--feature "{feature}" --stage "{stage}" --path "<file>" --specs-dir "{specsDir}"
|
|
@@ -395,7 +406,7 @@ Invoke this block **at the head of any post-entry step that writes a stage artif
|
|
|
395
406
|
|
|
396
407
|
1. **Proceed** when `stages.{stage}.status` is `"in-progress"` (this session's Entry Stamp — you are finishing the run you started) or absent/`pending`. Run the write / exit normally.
|
|
397
408
|
|
|
398
|
-
2. **Detect-and-refuse** when ALL of these hold: `stages.{stage}.status ∈ {"complete", "stale"}` **AND** the stage's artifacts (incl. `TRACEABILITY.md` for forge-3-specs) exist on disk **AND** a `commitHash` is recorded for the stage **AND** you did **not** author this stage earlier in the current session. This is a stale/replayed continuation of an already-finished, committed stage. Do **not** overwrite the artifact or re-run the exit. Route instead to the **Stage-Entry Guard**'s *Re-authoring* path: surface the same `AskUserQuestion`
|
|
409
|
+
2. **Detect-and-refuse** when ALL of these hold: `stages.{stage}.status ∈ {"complete", "stale"}` **AND** the stage's artifacts (incl. `TRACEABILITY.md` for forge-3-specs) exist on disk **AND** a `commitHash` is recorded for the stage **AND** you did **not** author this stage earlier in the current session. This is a stale/replayed continuation of an already-finished, committed stage. Do **not** overwrite the artifact or re-run the exit. Route instead to the **Stage-Entry Guard**'s *Re-authoring* path: surface the same warning via `AskUserQuestion` ("A completed {stage} artifact already exists for '{feature}' (v{n}{, marked stale}). Continuing will create a new version. Proceed?"). Only on explicit confirmation re-enter from the Entry Stamp (the version bumps at exit); otherwise **stop** and report that the stage is already complete — cite the recorded `commitHash` and offer `/skill:forge {feature}` to see true state.
|
|
399
410
|
|
|
400
411
|
When you cannot confirm you authored the current run, treat it as a replay and refuse: a false refuse costs one confirmation click; a false proceed overwrites a committed artifact and re-churns a stage version. `--force` follows Force Mode (skip the gate, treat as a deliberate re-author).
|
|
401
412
|
|
|
@@ -4,7 +4,7 @@ The single source of truth for how every forge stage closes. **One** scripted co
|
|
|
4
4
|
covers all **nine** covered direct exits — the seven production stages `forge-0-epic`
|
|
5
5
|
through `forge-6-docs`, plus direct `forge-verify` and direct `forge-fix`. It replaces the
|
|
6
6
|
old ad-hoc "Next steps:" bullet lists with one fixed, correctly-ordered sequence:
|
|
7
|
-
**verify (if missing or stale) → `/
|
|
7
|
+
**verify (if missing or stale) → `/new` → run the next command.**
|
|
8
8
|
|
|
9
9
|
Two principles this protocol encodes (do not relitigate — they are locked product
|
|
10
10
|
decisions):
|
|
@@ -18,7 +18,7 @@ decisions):
|
|
|
18
18
|
session, so the findings digest and any fix decision land where the context to act on
|
|
19
19
|
them still exists. This holds for auto-verify too: the stage skill dispatches the
|
|
20
20
|
clean-room verify (and any autoFix) at stage end, in-session, before the exit — it is
|
|
21
|
-
**not** deferred to the navigator, which runs *after* the `/
|
|
21
|
+
**not** deferred to the navigator, which runs *after* the `/new` with none of the
|
|
22
22
|
authoring context. Clearing first throws that context away.
|
|
23
23
|
|
|
24
24
|
## How this file is used
|
|
@@ -47,8 +47,8 @@ an epic member. Only the flags below are stage-specific; pass no others.
|
|
|
47
47
|
|---|---|---|
|
|
48
48
|
| `forge-0-epic` | `forge-0-epic` | `--next-feature "{member}"` when a concrete member exists |
|
|
49
49
|
| `forge-1-prd` … `forge-4-backlog` | that stage's own id | none beyond identity/capability |
|
|
50
|
-
| `forge-5-loop` | `forge-5-loop` | `--outcome` — one of `complete`, `partial`, `blocked`, `needs-human`, `deferred` |
|
|
51
|
-
| `forge-6-docs` | `forge-6-docs` | `--outcome` — `complete` or `
|
|
50
|
+
| `forge-5-loop` | `forge-5-loop` | `--outcome` — one of `complete`, `partial`, `blocked`, `needs-human`, `deferred`, `resolved`; optional `--cause dependency-starvation` with `--outcome partial` |
|
|
51
|
+
| `forge-6-docs` | `forge-6-docs` | `--outcome` — `complete`, `blocked`, or `skipped` (deliberate docs skip, persisted via `state-skip` before the exit; routes like `complete` with honest wording) |
|
|
52
52
|
| direct `forge-verify` | `forge-verify` | `--owner direct`, `--outcome` (`passed`, `findings`, `skipped`, `failed`), and served-stage metadata |
|
|
53
53
|
| nested `forge-verify` | `forge-verify` | `--owner nested`, plus the same outcome and served-stage metadata |
|
|
54
54
|
| direct/nested `forge-fix` | `forge-fix` | the matching `--owner`, a `FixOutcome` (`no-findings`, `decisions`, `failed`, `applied`, `reverified`, `reverify-findings`, `deferred`), and served-stage metadata |
|
|
@@ -90,19 +90,19 @@ resolves before running the command, exactly as elsewhere.
|
|
|
90
90
|
**Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
|
-
R="$(bash -c 'for d in "${
|
|
93
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
94
94
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
95
|
-
python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host
|
|
95
|
+
python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host pi --verify-capability "{verify-capability}"
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
Obey the DIRECTIVES it prints, in the consumption order this protocol fixes: surface `invalidAutoVerifyKeys` and every `warnings` entry first; `runInStageVerify: true` → run the in-stage clean-room verify chain now (honoring `autoFixEligible`, and asking through the Standard Verify Gate first when you may not dispatch unsolicited); `verifyGate: "standard"` → present the Standard Verify Gate; `verifyGate: "manual-print"` → print the `verifyCommand` for the user and do **not** dispatch inline. Then, and only when `terminalOwnedBy` is `"self"`, **print the NEXT-STEPS block verbatim as your absolute last output — nothing after its sentinel line.** A `terminalOwnedBy: "outer"` payload carries `nextSteps: null`: return your structured result to the caller and print no terminal block at all.
|
|
99
99
|
<!-- END: scripted-stage-exit-stamp -->
|
|
100
100
|
|
|
101
|
-
The stamp is shown with `--host
|
|
101
|
+
The stamp is shown with `--host pi`; the adapter build substitutes `pi`/`generic` per
|
|
102
102
|
target, and §"Host and capability determination" below governs the value. The literal is
|
|
103
|
-
deliberate — `scripts/build-adapters.py` keys its host translation on the exact
|
|
104
|
-
|
|
105
|
-
that line that is not a placeholder.
|
|
103
|
+
deliberate — `scripts/build-adapters.py` keys its host translation on the exact canon
|
|
104
|
+
value of that flag, and the stamp sites are compared byte-for-byte, so it is the one token
|
|
105
|
+
in that line that is not a placeholder.
|
|
106
106
|
|
|
107
107
|
## Host and capability determination
|
|
108
108
|
|
|
@@ -110,8 +110,9 @@ Before the call, compute the two inputs independently. They are unrelated: **a h
|
|
|
110
110
|
implies a capability**, and the script takes `--verify-capability` at face value.
|
|
111
111
|
|
|
112
112
|
**`--host`** describes only the active adapter command surface — `claude`, `pi`, or
|
|
113
|
-
`generic`. It selects command syntax (
|
|
114
|
-
fresh-session wording (
|
|
113
|
+
`generic`. It selects command syntax (Claude's stage-command prefix vs Pi's `/skill:` vs
|
|
114
|
+
host-neutral) and fresh-session wording (Claude's clear command vs Pi's `/new` vs neutral
|
|
115
|
+
prose). Nothing else.
|
|
115
116
|
|
|
116
117
|
**`--verify-capability interactive`** is passed only when **both** of these hold:
|
|
117
118
|
|
|
@@ -151,7 +152,8 @@ production successor** while verification is unresolved.
|
|
|
151
152
|
- a capable Pi session is `--host pi --verify-capability interactive`, and receives the
|
|
152
153
|
same logical gate a capable Claude session does;
|
|
153
154
|
- Pi without a dispatchable verifier is `--host pi --verify-capability manual`;
|
|
154
|
-
- a Claude session that cannot dispatch
|
|
155
|
+
- a Claude session that cannot dispatch keeps the Claude host value with
|
|
156
|
+
`--verify-capability manual`.
|
|
155
157
|
|
|
156
158
|
Interactive gate options keep their explicit labels, their recommended default, and their
|
|
157
159
|
one-line trade-off descriptions (below). The manual path prints the verify command as the
|
|
@@ -199,6 +201,44 @@ second sentinel-terminated block **inside** an outer stage's exit, breaking the
|
|
|
199
201
|
exactly-one-terminal-block rule — and the canon guard cannot catch it, because both
|
|
200
202
|
wordings legitimately appear in the same file. Judge the token, not the phrasing.
|
|
201
203
|
|
|
204
|
+
## Caller-side resumption: the declared resume point
|
|
205
|
+
|
|
206
|
+
The `owner:` token and `terminalOwnedBy` arbitrate who prints — but they specify only
|
|
207
|
+
the **callee** side: a nested skill stays quiet and returns its structured result. This
|
|
208
|
+
section is the reciprocal, caller-side half of that contract.
|
|
209
|
+
|
|
210
|
+
**On a sub-skill's return, the caller re-owns the terminal.** Every closing instruction
|
|
211
|
+
in the callee's own body — its report-and-stop posture, its "confirm the result" close,
|
|
212
|
+
its own next-steps habits — is void for this turn. The caller resumes at its **declared
|
|
213
|
+
resume point**, in the same turn, and its remaining steps run to its own terminal.
|
|
214
|
+
|
|
215
|
+
**Every Skill-tool delegation site declares, at the invocation, what happens on
|
|
216
|
+
return.** Suppression without resumption is the failure mode this section closes: the
|
|
217
|
+
callee's closing posture is the freshest instruction in context while the caller's next
|
|
218
|
+
step is the oldest, so an undeclared return silently ends the run one layer too early —
|
|
219
|
+
the caller's remaining steps (validation, state writes, commit, stage exit) dropped,
|
|
220
|
+
with no error surfaced. An implicit "let it run to its natural stopping point" is that
|
|
221
|
+
bug spelled politely, and it is banned on delegation sites. A site takes one of two
|
|
222
|
+
declared postures:
|
|
223
|
+
|
|
224
|
+
- **Delegate-and-resume** — the callee is a sub-step of the caller: the site names the
|
|
225
|
+
caller's own step that control returns to, and the caller continues there in the same
|
|
226
|
+
turn. The callee never owns the caller's terminal. The worked instance is
|
|
227
|
+
`forge-4-backlog` Step 4's **Return contract** for the `author-backlog` delegation
|
|
228
|
+
(control returns at Step 5; the sub-skill's direct-invocation posture — its approval
|
|
229
|
+
gate and its validate-and-confirm close — is explicitly disapplied on the delegated
|
|
230
|
+
path). New delegation sites follow that pattern rather than re-deriving it.
|
|
231
|
+
- **Terminal handoff** — the caller's job ends at the invocation and the invoked skill
|
|
232
|
+
owns the terminal from there on (e.g. the navigator's `autoInvokeNextStage`
|
|
233
|
+
"continue in this session" advance into the next production stage). Declaring the
|
|
234
|
+
handoff is what keeps it distinct from an accidental drop.
|
|
235
|
+
|
|
236
|
+
Scope: this contract governs **Skill-tool delegation within one session**. The
|
|
237
|
+
truncated-verifier-return guard (forge-verify's `findings-template.md`, "Truncated
|
|
238
|
+
Verifier Returns") is a different mechanism — it polices what an **Agent-dispatched
|
|
239
|
+
subagent's** return payload must contain, not where a caller resumes. A dispatch site
|
|
240
|
+
can be subject to both; satisfy each on its own terms.
|
|
241
|
+
|
|
202
242
|
## Directive consumption order
|
|
203
243
|
|
|
204
244
|
`stage-exit` emits a DIRECTIVES object and (for a direct owner) a NEXT-STEPS block. The
|
|
@@ -243,7 +283,7 @@ reformat, merge, or summarize them, and never dump the state file they were deri
|
|
|
243
283
|
|
|
244
284
|
Auto-verify is effective for this stage and verification is outstanding — verify **now,
|
|
245
285
|
in this session** (principle #2 applied to auto-verify: the digest and any fix decision
|
|
246
|
-
land here, where the authoring context still exists — not deferred to a post-`/
|
|
286
|
+
land here, where the authoring context still exists — not deferred to a post-`/new`
|
|
247
287
|
navigator). The `auto-verify-pending` debt is already durable on disk at this point, so a
|
|
248
288
|
declined or deferred gate leaves recorded debt rather than a silent pass.
|
|
249
289
|
|
|
@@ -252,7 +292,7 @@ declined or deferred gate leaves recorded debt rather than a silent pass.
|
|
|
252
292
|
same path the navigator uses (`skills/forge-verify/SKILL.md`). Dispatch it
|
|
253
293
|
**synchronously and await its digest inline** — do **not** run it in the background or
|
|
254
294
|
announce it as "still running"; the digest and any fix decision must land in this
|
|
255
|
-
session. It inherits none of this session's context, so no `/
|
|
295
|
+
session. It inherits none of this session's context, so no `/new` is needed and only
|
|
256
296
|
a compact digest returns.
|
|
257
297
|
**If you may not dispatch unsolicited**, present the consent form of the Standard
|
|
258
298
|
Verify Gate first and dispatch on the affirmative choice — see "Consent variant on a
|
|
@@ -299,7 +339,11 @@ first:
|
|
|
299
339
|
a stage's artifact commit.
|
|
300
340
|
- **Skip for now** — go straight to the NEXT-STEPS block without verifying. Record this
|
|
301
341
|
stage's verify status as `skipped` in pipeline state (via `state-verify`, never by hand)
|
|
302
|
-
**only** on an explicit skip — a skip does not go stale.
|
|
342
|
+
**only** on an explicit skip — a skip does not go stale. Exception: if the existing
|
|
343
|
+
entry records `passed` or `findings-applied` (a resolved result whose freshness has
|
|
344
|
+
merely lapsed), write **nothing** — `state-verify` refuses to demote a resolved status
|
|
345
|
+
to `skipped` (#203), and the recorded result stands on its own; the user's decline is
|
|
346
|
+
honored by simply not re-verifying.
|
|
303
347
|
|
|
304
348
|
**Advancement is allowed only after a pass, or after an explicit skip has been
|
|
305
349
|
persisted.** Choosing to stop, or losing the interaction, produces no advancing terminal
|
|
@@ -358,8 +402,8 @@ directive is informational — you do **not** re-derive the wording:
|
|
|
358
402
|
unchanged; the block appends a non-blocking reminder line ("You also flagged N epic
|
|
359
403
|
change(s) to reconcile when convenient …"). This is *finish-then-edit*.
|
|
360
404
|
|
|
361
|
-
Either way the added lines are host-neutral (no
|
|
362
|
-
sentinel; just print the NEXT-STEPS block verbatim as always.
|
|
405
|
+
Either way the added lines are host-neutral (they name no fresh-session command) and sit
|
|
406
|
+
**above** the sentinel; just print the NEXT-STEPS block verbatim as always.
|
|
363
407
|
|
|
364
408
|
### Deferred decisions — do not solicit next-stage decisions at this exit
|
|
365
409
|
|
|
@@ -376,7 +420,7 @@ a `deferredDecisions[]` entry on this feature's `.pipeline-state.json` by runnin
|
|
|
376
420
|
epic member — required, per the Pipeline State Protocol in `references/shared-conventions.md`:
|
|
377
421
|
|
|
378
422
|
```bash
|
|
379
|
-
R="$(bash -c 'for d in "${
|
|
423
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
380
424
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
381
425
|
python3 "$R/scripts/forge-session.py" state-decision \
|
|
382
426
|
--feature "{feature}" --question "<phrased for the target stage>" \
|
|
@@ -33,6 +33,35 @@ Detailed checklist for the **backlog** verification mode, loaded by the `forge-v
|
|
|
33
33
|
- [ ] **CHECK-B18**: Items that depend on types/interfaces reference the item that creates them
|
|
34
34
|
- [ ] **CHECK-B19**: Priority ordering is consistent with dependency ordering (dependencies should have equal or higher priority)
|
|
35
35
|
|
|
36
|
+
### Dependency Topology
|
|
37
|
+
- [ ] **CHECK-B28**: **Fragile dependency topology — a single root gates a large fraction of the
|
|
38
|
+
backlog, or the chain is deep** (#194). *Advisory heuristic — severity `improvement`, **never**
|
|
39
|
+
`error`/`gap`, and it **never blocks**. **not-applicable** when no trigger fires or the graph is
|
|
40
|
+
trivial (0–1 items, or no dependsOn edges at all).* A backlog where one root item gates most of
|
|
41
|
+
the tree, or whose critical chain is deep relative to its size, has a single point of near-total
|
|
42
|
+
failure: one defect in that root (or anywhere on the long chain) strands the dependent subtree —
|
|
43
|
+
the loop-recovery incident was 3 roots gating 81% of 16 items down a 13-deep chain, and it passed
|
|
44
|
+
both authoring and verification without comment. Verify by computing, never by eyeballing:
|
|
45
|
+
1. **Compute the topology.** Feed the runner's item array to the scripted metric:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
rauf backlog list . --backlog {resolvedBacklogDir} --json | python3 "$R/scripts/forge-session.py" backlog-topology --items-stdin --json
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Read `itemCount`, `rootCount`, `roots[].gatedCount`, `maxChainDepth`, and `warnings`. If
|
|
52
|
+
`itemCount <= 1` or there are no `dependsOn` edges, this check is **not-applicable**.
|
|
53
|
+
2. **Read the warnings, do not re-derive them.** The metric applies the fixed thresholds
|
|
54
|
+
(`single-root-fanout` when any root gates ≥50% of items; `chain-depth` when `maxChainDepth`
|
|
55
|
+
≥50% of item count). If `warnings` is empty, record **pass** (topology computed, no fragile
|
|
56
|
+
shape). Do not invent a different threshold — the constants are canonical
|
|
57
|
+
(`forge-session.py`).
|
|
58
|
+
3. **Report each fired warning as one `improvement` finding.** For `single-root-fanout`, name the
|
|
59
|
+
root and its `gatedCount`/`itemCount` ("root 1 gates 13/16 items") and suggest splitting that
|
|
60
|
+
root's subtree or introducing an intermediate. For `chain-depth`, name
|
|
61
|
+
`maxChainDepth`/`itemCount` and suggest flattening. **Report, do not repair** — this is a
|
|
62
|
+
heads-up to the author, never a blocking gate. Cite the metric output the claim was derived
|
|
63
|
+
from.
|
|
64
|
+
|
|
36
65
|
### Completeness
|
|
37
66
|
- [ ] **CHECK-B20**: There is an item for the initial package scaffold
|
|
38
67
|
- [ ] **CHECK-B21**: There is an item for shared types and error hierarchy
|
|
@@ -95,3 +124,47 @@ Detailed checklist for the **backlog** verification mode, loaded by the `forge-v
|
|
|
95
124
|
> provenance. Any item asserting a human-gated lifecycle state must trace — via `dependsOn` — to the
|
|
96
125
|
> item that legitimately produces it, or assert the state through a dev-build / fixture path instead.
|
|
97
126
|
|
|
127
|
+
### Work-Order Cardinality
|
|
128
|
+
|
|
129
|
+
> **When this fires:** only when the backlog, or an artifact the backlog derives from,
|
|
130
|
+
> **declares an enumerated per-item work list that claims to cover a set**. A backlog
|
|
131
|
+
> with no such list yields **not-applicable** — absence of a declared list is never a
|
|
132
|
+
> hard fail. The defect this catches is not a wrong item; it is a **missing** one, and
|
|
133
|
+
> a missing entry is invisible to every reader who checks the entries that are present.
|
|
134
|
+
|
|
135
|
+
- [ ] **CHECK-B29**: **A declared per-item work list covers the whole set it claims — name what is missing** (#170).
|
|
136
|
+
*Heuristic with a mechanical method — **not-applicable** when no enumerated per-item work
|
|
137
|
+
list is declared anywhere in the backlog or the artifacts it derives from; absence is
|
|
138
|
+
**never a hard fail**. A true omission is a `gap` (blocking): an unreviewed member is
|
|
139
|
+
missing coverage.* When the backlog — or an artifact it derives from, such as a
|
|
140
|
+
hand-authored work order, a per-item review sheet, a "one entry per item" table in a
|
|
141
|
+
plan the backlog cites, or a stated total in a summary line — declares an enumerated
|
|
142
|
+
list **claiming coverage of a set**, the list's cardinality must be **re-derived from
|
|
143
|
+
the actual member set** and never trusted from the list's own header, its numbering, or
|
|
144
|
+
a stated total. In the incident behind this check a hand-authored work order enumerated
|
|
145
|
+
**15 of 16** artifacts; it passed authoring and a full review, and the dropped
|
|
146
|
+
sixteenth would have been published unreviewed. Verify by re-deriving, never by
|
|
147
|
+
eyeballing:
|
|
148
|
+
1. **Find the declared lists.** Scan the backlog and the artifacts it cites for an
|
|
149
|
+
enumerated list that claims coverage of a nameable set — one entry per backlog item,
|
|
150
|
+
per spec document, per requirement id, per generated artifact, per file to touch. The
|
|
151
|
+
coverage claim reads as "one per …", "all …", "every …", "each …", or as a stated
|
|
152
|
+
total ("16 artifacts", "covers the full set"). If **no** such list exists, this check
|
|
153
|
+
is **not-applicable** — record it and move on.
|
|
154
|
+
2. **Re-derive the member set from its own source of record.** Build the actual set
|
|
155
|
+
independently of the list: backlog items from `backlog.json`, spec documents from the
|
|
156
|
+
spec directory listing, requirement ids from the PRD, artifacts from the paths the
|
|
157
|
+
items name. Count what you built; do not adopt any count the list asserts about
|
|
158
|
+
itself.
|
|
159
|
+
3. **Difference both directions and name every discrepancy.** Report each member of the
|
|
160
|
+
re-derived set that has **no** entry in the declared list **by name** — the item id,
|
|
161
|
+
file path, or requirement id — never as a count delta ("one short", "off by one"),
|
|
162
|
+
which hands the reader back exactly the derivation this check just performed. Report
|
|
163
|
+
the reverse direction too: a list entry naming something absent from the re-derived
|
|
164
|
+
set is a stale entry.
|
|
165
|
+
4. **Severity, and what to report.** A named omission is a `gap`. A stale entry, or a
|
|
166
|
+
stated total that disagrees with a list whose membership is nevertheless complete, is
|
|
167
|
+
an `inconsistency`. Every finding names the list, the source of record the set was
|
|
168
|
+
re-derived from, and each missing or stale member by name. **Report, do not repair** —
|
|
169
|
+
authoring the missing entry belongs to the fix pass.
|
|
170
|
+
|
|
@@ -12,7 +12,7 @@ reading the manifest, EPIC.md, completed members' specs, and (for E10) sibling m
|
|
|
12
12
|
committed tests.
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
R="$(bash -c 'for d in "${
|
|
15
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
16
16
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
17
17
|
python3 "$R/scripts/epic-manifest.py" validate "{epic}" --specs-dir "{specsDir}" --json
|
|
18
18
|
```
|
|
@@ -46,3 +46,88 @@ Detailed checklist for the **impl** verification mode, loaded by the `forge-veri
|
|
|
46
46
|
- [ ] **CHECK-I22**: **Runtime-required bootstrap has a non-test caller.** Every exported bootstrap / `init*` / singleton-populator the specs mark as **required for runtime** must have ≥1 **non-test** call site on a runtime path — an entrypoint such as `main` / `instrumentation` / a route / a layout / a worker, NOT only test files. Statically grep for each such symbol's references (use the stack profile `references/stacks/{stack}.md` **Runtime Entrypoints & Bootstrap-Wiring Sites** list for what counts as a runtime entrypoint in this language). A symbol that is exported and covered by tests but referenced **only** from test files is a `gap` — the #121 walking-skeleton (bootstrap wired to nothing). Degrades naturally: a feature whose specs mark no bootstrap symbol as runtime-required is `not-applicable`. Weaker than `CHECK-I21` (it proves a call site exists, not that the boot succeeds), so it complements rather than replaces the smoke.
|
|
47
47
|
- [ ] **CHECK-I23**: **Heavy bootstrap wired into a universal startup entry — recommend lazy init** (#149). *Advisory heuristic — a `gap`/`improvement` at most, **never** a hard fail.* When a runtime-required `init`/bootstrap/singleton-populator is wired into a **framework bootstrap entry that runs on every startup** (a Next.js `instrumentation.ts`, an app-server preload/`register` hook, a global setup module) **and** that init pulls in a **large server-only import graph** (DB clients, ORMs, queue/background workers, telemetry exporters, the whole service layer), recommend moving to **lazy initialization at the entry that already loads that graph** — the first route / handler / worker that needs it — rather than eager wiring at the universal entry. Eager wiring drags the heavy graph into every cold start, and in dev into every module re-evaluation (the watch-loop cost `CHECK-I21` also targets). **Detect statically:** from the stack profile's **Runtime Entrypoints & Bootstrap-Wiring Sites** list, identify this stack's universal bootstrap entries; grep those files for imports of the feature's runtime-required bootstrap symbols (`CHECK-I22`) and for the server-only heavy-import markers the profile names. A match → an `improvement`/`gap` finding naming the entry, the heavy graph it pulls, and the lazier call site to move initialization to. Degrades to `not-applicable` when the stack has no universal bootstrap entry, when no heavy init is wired there, or when the profile lists no bootstrap-wiring sites — **report, do not repair.**
|
|
48
48
|
|
|
49
|
+
### Work-Order Cardinality
|
|
50
|
+
|
|
51
|
+
> **When this fires:** only when the implementation ships or cites an **enumerated work
|
|
52
|
+
> order, coverage list, or inventory that claims to cover a set of artifacts** — a
|
|
53
|
+
> per-file work order, a "files changed" table, a per-artifact review checklist, an
|
|
54
|
+
> inventory table in a spec this implementation realizes, or a registry constant in code
|
|
55
|
+
> that claims to list every member of a class. No such list yields **not-applicable**;
|
|
56
|
+
> absence is never a hard fail.
|
|
57
|
+
|
|
58
|
+
- [ ] **CHECK-I24**: **A declared work order or coverage list covers the whole artifact set it claims — name what is missing** (#170).
|
|
59
|
+
*Heuristic with a mechanical method — **not-applicable** when the implementation declares
|
|
60
|
+
no enumerated work order, coverage list, or registry claiming full coverage; absence is
|
|
61
|
+
**never a hard fail**. A true omission is a `gap` (blocking): an unreviewed artifact is
|
|
62
|
+
missing coverage.* Any declared work order or coverage list must be checked against the
|
|
63
|
+
**actual artifact set it claims to cover**, with omissions named. The incident behind
|
|
64
|
+
this check is a hand-authored work order that enumerated **15 of 16** artifacts: the
|
|
65
|
+
sixteenth was never reviewed and would have shipped, because every reviewer worked the
|
|
66
|
+
list that was in front of them. Verify by re-deriving, never by reading the list back to
|
|
67
|
+
itself:
|
|
68
|
+
1. **Find the declared lists.** Look for enumerated lists claiming coverage of a set:
|
|
69
|
+
a work order or handoff enumerating files to change, a "files changed" or "artifacts
|
|
70
|
+
touched" table, a per-artifact review or sign-off checklist, an inventory table in an
|
|
71
|
+
implementation spec, and **registry-shaped constants in code** — a tuple, array, or
|
|
72
|
+
map documented as holding every helper, every adapter target, every generated file.
|
|
73
|
+
If no such list exists, this check is **not-applicable**.
|
|
74
|
+
2. **Re-derive the covered set from its source of record.** Enumerate the actual set
|
|
75
|
+
independently: the directory listing for a per-file list, the spec's own file
|
|
76
|
+
inventory for an implementation work order, the on-disk members for a registry
|
|
77
|
+
constant, the test suite's own collected set for a coverage table. A registry claiming
|
|
78
|
+
to hold "every script the skills invoke" is re-derived by finding the invocations, not
|
|
79
|
+
by reading the tuple.
|
|
80
|
+
3. **Difference both directions and name every discrepancy.** Every member of the
|
|
81
|
+
re-derived set with no entry in the declared list is reported **by name** — path,
|
|
82
|
+
symbol, or artifact id — never as a count delta. A list entry pointing at something
|
|
83
|
+
that does not exist is a stale entry, reported the same way.
|
|
84
|
+
4. **Severity, and what to report.** A named omission is a `gap`; a stale entry, or a
|
|
85
|
+
stated total that disagrees with an otherwise complete list, is an `inconsistency`.
|
|
86
|
+
Name the list, the source of record used for the re-derivation, and each missing or
|
|
87
|
+
stale member. This check is deliberately narrower than `CHECK-I01` (which asks whether
|
|
88
|
+
each file the architecture spec lists exists): here the *list itself* is the suspect,
|
|
89
|
+
not the artifacts it names. **Report, do not repair.**
|
|
90
|
+
|
|
91
|
+
### Internal Consistency
|
|
92
|
+
|
|
93
|
+
> **When this fires:** on any artifact that states the same quantity, scope claim, or
|
|
94
|
+
> status **in more than one place** — front matter vs body, a summary block vs the prose
|
|
95
|
+
> below it, a table vs the narrative that explains it, a docstring vs the code it
|
|
96
|
+
> documents. This is deliberately **intra-artifact**: contradictions *between* artifacts
|
|
97
|
+
> are already the subject of the spec-compliance checks above. An artifact that states
|
|
98
|
+
> each quantity exactly once yields **not-applicable** — it degrades naturally, with
|
|
99
|
+
> nothing to compare.
|
|
100
|
+
|
|
101
|
+
- [ ] **CHECK-I25**: **One artifact, one answer — a quantity or claim restated inconsistently inside a single artifact** (#170).
|
|
102
|
+
*Verifier judgment — read and compare; no extractor runs (deliberately, this milestone).
|
|
103
|
+
**not-applicable** when nothing is restated. Severity defaults to `inconsistency`
|
|
104
|
+
(advisory) and escalates to `error` only when the contradiction is decision-bearing, per
|
|
105
|
+
the severity conventions in the verify skill.* An artifact can be internally false while
|
|
106
|
+
every cross-artifact check passes: in the incident behind this check, one artifact
|
|
107
|
+
asserted a claim held **universally**, while its own body — two sections below — stated
|
|
108
|
+
the correct **4-of-7** breakdown. The false summary survived a full review, propagated
|
|
109
|
+
into generated output, and would have shipped. Verify by comparing the artifact against
|
|
110
|
+
itself:
|
|
111
|
+
1. **Collect the restatements.** Read the artifact end to end and note every place it
|
|
112
|
+
states: a **count or total** ("16 files", "N of M", "all four"), a **scope claim**
|
|
113
|
+
("every", "all", "none", "only", "universal", "always", "never"), a **status claim**
|
|
114
|
+
("complete", "pending", "removed", "supported"), or a **named identifier or version**
|
|
115
|
+
it repeats. Note each statement with its location. Anything stated exactly once is not
|
|
116
|
+
in scope for this check.
|
|
117
|
+
2. **Compare statements about the same subject.** Group the notes by what they describe,
|
|
118
|
+
then compare within each group. Two disagreeing numbers is the obvious hit; the
|
|
119
|
+
costlier one is a **scope word contradicted by the artifact's own detail** — a
|
|
120
|
+
universal claim sitting above a partial breakdown, an "all supported" above a table
|
|
121
|
+
with a gap, a "removed" beside a surviving reference.
|
|
122
|
+
3. **Decide which statement the artifact's own evidence supports.** Prefer the
|
|
123
|
+
**enumerated detail** — the table, the list, the breakdown, the code — over the
|
|
124
|
+
summary that restates it: the summary is the derived form and is usually the one that
|
|
125
|
+
drifted. Say in the finding which statement the evidence supports and why, so the fix
|
|
126
|
+
is unambiguous.
|
|
127
|
+
4. **Set severity deliberately.** Default to `inconsistency` (advisory). Escalate to
|
|
128
|
+
`error` only when the contradiction is **decision-bearing** — a reader acting on the
|
|
129
|
+
wrong statement takes a materially different action, or the wrong statement is copied
|
|
130
|
+
into generated output, a published artifact, or a gate. An inaccuracy confined to a
|
|
131
|
+
comment, a docstring, or test narration stays at `inconsistency` under the severity
|
|
132
|
+
floor. Quote both locations verbatim in the finding. **Report, do not repair.**
|
|
133
|
+
|