@garygentry/feature-forge 0.3.1 → 0.3.2
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/adapters/claude/.feature-forge-bundle.json +1 -1
- package/adapters/claude/references/epic-manifest-schema.json +6 -1
- package/adapters/claude/references/forge-config-schema.json +1 -1
- package/adapters/claude/references/pipeline-state-schema.json +4 -2
- package/adapters/claude/references/shared-conventions.md +63 -0
- package/adapters/claude/references/stage-exit-protocol.md +344 -140
- package/adapters/claude/scripts/epic-manifest.py +413 -87
- package/adapters/claude/scripts/forge-bootstrap.py +57 -5
- package/adapters/claude/scripts/forge-session.py +3136 -139
- package/adapters/claude/scripts/validate-traceability.py +86 -5
- package/adapters/claude/skills/forge/SKILL.md +7 -6
- package/adapters/claude/skills/forge/references/pipeline-state-schema.json +4 -2
- package/adapters/claude/skills/forge/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge/references/stage-exit-protocol.md +344 -140
- package/adapters/claude/skills/forge-0-epic/SKILL.md +7 -2
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +24 -24
- package/adapters/claude/skills/forge-0-epic/references/pipeline-state-schema.json +4 -2
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +344 -140
- package/adapters/claude/skills/forge-1-prd/SKILL.md +14 -3
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +344 -140
- package/adapters/claude/skills/forge-2-tech/SKILL.md +13 -3
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +344 -140
- package/adapters/claude/skills/forge-3-specs/SKILL.md +4 -2
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +344 -140
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +16 -3
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +344 -140
- package/adapters/claude/skills/forge-5-loop/SKILL.md +40 -42
- package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +70 -31
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +4 -2
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +344 -140
- package/adapters/claude/skills/forge-6-docs/SKILL.md +48 -4
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
- package/adapters/claude/skills/forge-fix/SKILL.md +85 -33
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +344 -140
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +1 -1
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge-verify/SKILL.md +73 -41
- package/adapters/claude/skills/forge-verify/references/findings-template.md +39 -49
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +63 -0
- package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +472 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/epic.md +4 -3
- package/adapters/claude/skills/forge-verify/references/verification-checklists/specs.md +2 -0
- package/adapters/codex/.feature-forge-bundle.json +1 -1
- package/adapters/codex/references/epic-manifest-schema.json +6 -1
- package/adapters/codex/references/forge-config-schema.json +1 -1
- package/adapters/codex/references/pipeline-state-schema.json +4 -2
- package/adapters/codex/references/shared-conventions.md +63 -0
- package/adapters/codex/references/stage-exit-protocol.md +344 -140
- package/adapters/codex/scripts/epic-manifest.py +413 -87
- package/adapters/codex/scripts/forge-bootstrap.py +57 -5
- package/adapters/codex/scripts/forge-session.py +3136 -139
- package/adapters/codex/scripts/validate-traceability.py +86 -5
- package/adapters/codex/skills/forge/SKILL.md +7 -6
- package/adapters/codex/skills/forge/references/pipeline-state-schema.json +4 -2
- package/adapters/codex/skills/forge/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge/references/stage-exit-protocol.md +344 -140
- package/adapters/codex/skills/forge-0-epic/SKILL.md +7 -2
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +24 -24
- package/adapters/codex/skills/forge-0-epic/references/pipeline-state-schema.json +4 -2
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +344 -140
- package/adapters/codex/skills/forge-1-prd/SKILL.md +14 -3
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +344 -140
- package/adapters/codex/skills/forge-2-tech/SKILL.md +13 -3
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +344 -140
- package/adapters/codex/skills/forge-3-specs/SKILL.md +4 -2
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +344 -140
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +16 -3
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +344 -140
- package/adapters/codex/skills/forge-5-loop/SKILL.md +40 -42
- package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +70 -31
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +4 -2
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +344 -140
- package/adapters/codex/skills/forge-6-docs/SKILL.md +48 -4
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
- package/adapters/codex/skills/forge-fix/SKILL.md +84 -32
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +344 -140
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +1 -1
- package/adapters/codex/skills/forge-guide/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge-verify/SKILL.md +72 -40
- package/adapters/codex/skills/forge-verify/references/findings-template.md +39 -49
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +63 -0
- package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +472 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +4 -3
- package/adapters/codex/skills/forge-verify/references/verification-checklists/specs.md +2 -0
- package/adapters/copilot/.feature-forge-bundle.json +1 -1
- package/adapters/copilot/references/epic-manifest-schema.json +6 -1
- package/adapters/copilot/references/forge-config-schema.json +1 -1
- package/adapters/copilot/references/pipeline-state-schema.json +4 -2
- package/adapters/copilot/references/shared-conventions.md +63 -0
- package/adapters/copilot/references/stage-exit-protocol.md +344 -140
- package/adapters/copilot/scripts/epic-manifest.py +413 -87
- package/adapters/copilot/scripts/forge-bootstrap.py +57 -5
- package/adapters/copilot/scripts/forge-session.py +3136 -139
- package/adapters/copilot/scripts/validate-traceability.py +86 -5
- package/adapters/copilot/skills/forge/forge.md +7 -6
- package/adapters/copilot/skills/forge/references/pipeline-state-schema.json +4 -2
- package/adapters/copilot/skills/forge/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +344 -140
- package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +7 -2
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +24 -24
- package/adapters/copilot/skills/forge-0-epic/references/pipeline-state-schema.json +4 -2
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +344 -140
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +14 -3
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +344 -140
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +13 -3
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +344 -140
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +4 -2
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +344 -140
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +16 -3
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +344 -140
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +40 -42
- package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +70 -31
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +4 -2
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +344 -140
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +48 -4
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
- package/adapters/copilot/skills/forge-fix/forge-fix.md +84 -32
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +344 -140
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +1 -1
- package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge-verify/forge-verify.md +72 -40
- package/adapters/copilot/skills/forge-verify/references/findings-template.md +39 -49
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +63 -0
- package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +472 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +4 -3
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/specs.md +2 -0
- package/adapters/cursor/.feature-forge-bundle.json +1 -1
- package/adapters/cursor/references/epic-manifest-schema.json +6 -1
- package/adapters/cursor/references/forge-config-schema.json +1 -1
- package/adapters/cursor/references/pipeline-state-schema.json +4 -2
- package/adapters/cursor/references/shared-conventions.md +63 -0
- package/adapters/cursor/references/stage-exit-protocol.md +344 -140
- package/adapters/cursor/scripts/epic-manifest.py +413 -87
- package/adapters/cursor/scripts/forge-bootstrap.py +57 -5
- package/adapters/cursor/scripts/forge-session.py +3136 -139
- package/adapters/cursor/scripts/validate-traceability.py +86 -5
- package/adapters/cursor/skills/forge/forge.mdc +7 -6
- package/adapters/cursor/skills/forge/references/pipeline-state-schema.json +4 -2
- package/adapters/cursor/skills/forge/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +344 -140
- package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +7 -2
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +24 -24
- package/adapters/cursor/skills/forge-0-epic/references/pipeline-state-schema.json +4 -2
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +344 -140
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +14 -3
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +344 -140
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +13 -3
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +344 -140
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +4 -2
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +344 -140
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +16 -3
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +344 -140
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +40 -42
- package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +70 -31
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +4 -2
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +344 -140
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +48 -4
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +84 -32
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +344 -140
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +1 -1
- package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +72 -40
- package/adapters/cursor/skills/forge-verify/references/findings-template.md +39 -49
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +63 -0
- package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +472 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +4 -3
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/specs.md +2 -0
- package/adapters/gemini/.feature-forge-bundle.json +1 -1
- package/adapters/gemini/gemini-extension.json +1 -1
- package/adapters/gemini/references/epic-manifest-schema.json +6 -1
- package/adapters/gemini/references/forge-config-schema.json +1 -1
- package/adapters/gemini/references/pipeline-state-schema.json +4 -2
- package/adapters/gemini/references/shared-conventions.md +63 -0
- package/adapters/gemini/references/stage-exit-protocol.md +344 -140
- package/adapters/gemini/scripts/epic-manifest.py +413 -87
- package/adapters/gemini/scripts/forge-bootstrap.py +57 -5
- package/adapters/gemini/scripts/forge-session.py +3136 -139
- package/adapters/gemini/scripts/validate-traceability.py +86 -5
- package/adapters/gemini/skills/forge/forge.md +7 -6
- package/adapters/gemini/skills/forge/references/pipeline-state-schema.json +4 -2
- package/adapters/gemini/skills/forge/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +344 -140
- package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +7 -2
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +24 -24
- package/adapters/gemini/skills/forge-0-epic/references/pipeline-state-schema.json +4 -2
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +344 -140
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +14 -3
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +344 -140
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +13 -3
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +344 -140
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +4 -2
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +344 -140
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +16 -3
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +344 -140
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +40 -42
- package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +70 -31
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +4 -2
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +344 -140
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +48 -4
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
- package/adapters/gemini/skills/forge-fix/forge-fix.md +84 -32
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +344 -140
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +1 -1
- package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge-verify/forge-verify.md +72 -40
- package/adapters/gemini/skills/forge-verify/references/findings-template.md +39 -49
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +63 -0
- package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +472 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +4 -3
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/specs.md +2 -0
- package/adapters/pi/.feature-forge-bundle.json +1 -1
- package/adapters/pi/references/epic-manifest-schema.json +6 -1
- package/adapters/pi/references/forge-config-schema.json +1 -1
- package/adapters/pi/references/pipeline-state-schema.json +4 -2
- package/adapters/pi/references/shared-conventions.md +63 -0
- package/adapters/pi/references/stage-exit-protocol.md +344 -140
- package/adapters/pi/scripts/epic-manifest.py +413 -87
- package/adapters/pi/scripts/forge-bootstrap.py +57 -5
- package/adapters/pi/scripts/forge-session.py +3136 -139
- package/adapters/pi/scripts/validate-traceability.py +86 -5
- package/adapters/pi/skills/forge/SKILL.md +7 -6
- package/adapters/pi/skills/forge/references/pipeline-state-schema.json +4 -2
- package/adapters/pi/skills/forge/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge/references/stage-exit-protocol.md +344 -140
- package/adapters/pi/skills/forge-0-epic/SKILL.md +7 -2
- package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +24 -24
- package/adapters/pi/skills/forge-0-epic/references/pipeline-state-schema.json +4 -2
- package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +344 -140
- package/adapters/pi/skills/forge-1-prd/SKILL.md +14 -3
- package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +344 -140
- package/adapters/pi/skills/forge-2-tech/SKILL.md +13 -3
- package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +344 -140
- package/adapters/pi/skills/forge-3-specs/SKILL.md +4 -2
- package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +344 -140
- package/adapters/pi/skills/forge-4-backlog/SKILL.md +16 -3
- package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +344 -140
- package/adapters/pi/skills/forge-5-loop/SKILL.md +40 -42
- package/adapters/pi/skills/forge-5-loop/references/result-reporting.md +70 -31
- package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +4 -2
- package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +344 -140
- package/adapters/pi/skills/forge-6-docs/SKILL.md +48 -4
- package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
- package/adapters/pi/skills/forge-fix/SKILL.md +84 -32
- package/adapters/pi/skills/forge-fix/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +344 -140
- package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +1 -1
- package/adapters/pi/skills/forge-guide/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge-verify/SKILL.md +72 -40
- package/adapters/pi/skills/forge-verify/references/findings-template.md +39 -49
- package/adapters/pi/skills/forge-verify/references/shared-conventions.md +63 -0
- package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +472 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +4 -3
- package/adapters/pi/skills/forge-verify/references/verification-checklists/specs.md +2 -0
- package/package.json +1 -1
- package/adapters/claude/skills/forge-verify/references/pipeline-state-schema.json +0 -191
- package/adapters/codex/skills/forge-verify/references/pipeline-state-schema.json +0 -191
- package/adapters/copilot/skills/forge-verify/references/pipeline-state-schema.json +0 -191
- package/adapters/cursor/skills/forge-verify/references/pipeline-state-schema.json +0 -191
- package/adapters/gemini/skills/forge-verify/references/pipeline-state-schema.json +0 -191
- package/adapters/pi/skills/forge-verify/references/pipeline-state-schema.json +0 -191
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# Stage Exit Protocol
|
|
2
2
|
|
|
3
|
-
The single source of truth for how every forge
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
The single source of truth for how every forge stage closes. **One** scripted contract
|
|
4
|
+
covers all **nine** covered direct exits — the seven production stages `forge-0-epic`
|
|
5
|
+
through `forge-6-docs`, plus direct `forge-verify` and direct `forge-fix`. It replaces the
|
|
6
|
+
old ad-hoc "Next steps:" bullet lists with one fixed, correctly-ordered sequence:
|
|
7
|
+
**verify (if missing or stale) → `/clear` → run the next command.**
|
|
6
8
|
|
|
7
9
|
Two principles this protocol encodes (do not relitigate — they are locked product
|
|
8
10
|
decisions):
|
|
@@ -21,37 +23,68 @@ decisions):
|
|
|
21
23
|
|
|
22
24
|
## How this file is used
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
lives in the script, deterministically; only genuinely interactive work (clean-room
|
|
31
|
-
subagent dispatch,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
The loop (`forge-5-loop`) keeps its bespoke exits: it stamps the **standard block**
|
|
35
|
-
(step-6 epic-member handoff) and the **warm variant** (all-done closing) below,
|
|
36
|
-
verbatim. `forge-6-docs` is **terminal** — it stamps no exit block.
|
|
26
|
+
Every covered exit closes with the **Scripted Stage Exit**: the single stamped block
|
|
27
|
+
below, which runs `forge-session.py stage-exit`, obeys the DIRECTIVES it prints per the
|
|
28
|
+
**directive contract** in this file, and — only when this call owns the terminal block —
|
|
29
|
+
prints the script-emitted NEXT-STEPS block verbatim as the absolute last output. All the
|
|
30
|
+
conditional logic the old prose blocks asked the model to compute (effective auto-verify,
|
|
31
|
+
freshness collapse, gate selection, host wording, branch rejoin, loop and docs routing)
|
|
32
|
+
now lives in the script, deterministically; only genuinely interactive work (clean-room
|
|
33
|
+
subagent dispatch, question-tool gates) remains prose — specified once here, not per
|
|
34
|
+
stage.
|
|
37
35
|
|
|
38
36
|
A drift-guard test (`tests/test_stage_exit_protocol.py`) asserts each stamp site still
|
|
39
|
-
contains
|
|
37
|
+
contains the canonical block, so an edit here must be mirrored into every stamp site (and
|
|
40
38
|
vice-versa).
|
|
41
39
|
|
|
42
|
-
|
|
40
|
+
### The nine covered exits and their stage-specific flags
|
|
41
|
+
|
|
42
|
+
Every caller passes the same identity and capability flags — `--feature`, `--stage`,
|
|
43
|
+
`--specs-dir`, `--host`, `--verify-capability`, plus `--epic "{epic}"` when the feature is
|
|
44
|
+
an epic member. Only the flags below are stage-specific; pass no others.
|
|
45
|
+
|
|
46
|
+
| Caller | `--stage` | Stage-specific typed flags |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| `forge-0-epic` | `forge-0-epic` | `--next-feature "{member}"` when a concrete member exists |
|
|
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 `blocked` |
|
|
52
|
+
| direct `forge-verify` | `forge-verify` | `--owner direct`, `--outcome` (`passed`, `findings`, `skipped`, `failed`), and served-stage metadata |
|
|
53
|
+
| nested `forge-verify` | `forge-verify` | `--owner nested`, plus the same outcome and served-stage metadata |
|
|
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 |
|
|
55
|
+
|
|
56
|
+
"Served-stage metadata" means `--served-stage` (the production stage this diversion
|
|
57
|
+
served) and/or `--verify-mode` (`epic`, `prd`, `tech`, `specs`, `backlog`, `impl`), which
|
|
58
|
+
maps to a served stage when unambiguous. If both are supplied they must agree; if neither
|
|
59
|
+
is, the script exits 2 rather than guessing. Conversational context and `currentStage` are
|
|
60
|
+
never valid inference sources.
|
|
61
|
+
|
|
62
|
+
An invalid or missing enum, a conflicting served-stage mapping, or an unresolvable
|
|
63
|
+
identity is surfaced as the script's `Error:` line on stderr with exit 2. The skill
|
|
64
|
+
surfaces that line and **stops without inventing next steps** — there is no payload and no
|
|
65
|
+
sentinel to print.
|
|
66
|
+
|
|
67
|
+
An exit 2 from `stage-exit` itself is **not** a no-write guarantee: the
|
|
68
|
+
`auto-verify-pending` debt marker is persisted at the scheduling boundary *before* the
|
|
69
|
+
payload is built, deliberately, so an interrupted exit still leaves the verification
|
|
70
|
+
obligation durable on disk. Do not retry on the assumption that nothing landed — the
|
|
71
|
+
marker is idempotent and the re-run will read it. (The narrower "nothing was recorded"
|
|
72
|
+
guarantee belongs to `state-verify`, whose validation all precedes its single atomic
|
|
73
|
+
write.)
|
|
74
|
+
|
|
75
|
+
### Stamp sites
|
|
43
76
|
|
|
44
77
|
| Stamp site | Block |
|
|
45
78
|
|---|---|
|
|
46
|
-
| `forge-0-epic` … `forge-
|
|
47
|
-
| `forge-5-loop` (step-6 epic-member handoff) | standard |
|
|
48
|
-
| `forge-5-loop` (all-done closing → docs) | warm |
|
|
79
|
+
| all nine covered exits (`forge-0-epic` … `forge-6-docs`, direct `forge-verify`, direct `forge-fix`) | the canonical scripted stage-exit stamp |
|
|
49
80
|
|
|
50
|
-
The scripted stamp fills one build-time slot, `{stage-exit-args}` — the per-stage
|
|
51
|
-
|
|
52
|
-
`--feature "{epic}" --stage forge-0-epic --next-feature
|
|
53
|
-
|
|
54
|
-
|
|
81
|
+
The scripted stamp fills one build-time slot, `{stage-exit-args}` — the per-stage argument
|
|
82
|
+
list from the table above (e.g. `--feature "{feature}" --stage forge-2-tech`; the epic
|
|
83
|
+
stage passes `--feature "{epic}" --stage forge-0-epic --next-feature
|
|
84
|
+
"{first-actionable-feature}"`; the loop passes `--feature "{feature}" --stage forge-5-loop
|
|
85
|
+
--outcome "{LoopOutcome}"`). `{feature}` / `{epic}` / `{specsDir}` /
|
|
86
|
+
`{first-actionable-feature}` / `{verify-capability}` remain runtime placeholders the skill
|
|
87
|
+
resolves before running the command, exactly as elsewhere.
|
|
55
88
|
|
|
56
89
|
<!-- BEGIN: scripted-stage-exit-stamp -->
|
|
57
90
|
**Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
|
|
@@ -59,72 +92,205 @@ placeholders the skill resolves before running the command, exactly as elsewhere
|
|
|
59
92
|
```bash
|
|
60
93
|
R="$(bash -c 'for d in "${CLAUDE_PLUGIN_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')"
|
|
61
94
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
62
|
-
python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host claude
|
|
95
|
+
python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host claude --verify-capability "{verify-capability}"
|
|
63
96
|
```
|
|
64
97
|
|
|
65
|
-
Obey the DIRECTIVES it prints, in order
|
|
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.
|
|
66
99
|
<!-- END: scripted-stage-exit-stamp -->
|
|
67
100
|
|
|
68
|
-
|
|
101
|
+
The stamp is shown with `--host claude`; the adapter build substitutes `pi`/`generic` per
|
|
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 string
|
|
104
|
+
`--host claude`, and the stamp sites are compared byte-for-byte, so it is the one token in
|
|
105
|
+
that line that is not a placeholder.
|
|
106
|
+
|
|
107
|
+
## Host and capability determination
|
|
108
|
+
|
|
109
|
+
Before the call, compute the two inputs independently. They are unrelated: **a host never
|
|
110
|
+
implies a capability**, and the script takes `--verify-capability` at face value.
|
|
111
|
+
|
|
112
|
+
**`--host`** describes only the active adapter command surface — `claude`, `pi`, or
|
|
113
|
+
`generic`. It selects command syntax (`/feature-forge:` vs `/skill:` vs host-neutral) and
|
|
114
|
+
fresh-session wording (`/clear` vs `/new` vs neutral prose). Nothing else.
|
|
115
|
+
|
|
116
|
+
**`--verify-capability interactive`** is passed only when **both** of these hold:
|
|
117
|
+
|
|
118
|
+
- **(a)** a question mechanism equivalent to `AskUserQuestion` is available, **and**
|
|
119
|
+
- **(b)** a clean-room `forge-verifier` subagent can be dispatched.
|
|
120
|
+
|
|
121
|
+
If either is absent, or capability cannot be established, pass `manual`.
|
|
122
|
+
|
|
123
|
+
**(b) tests PERMISSION, not tool presence.** The question is not "is a subagent-dispatch
|
|
124
|
+
tool listed in my tool surface" but "**may I dispatch `forge-verifier` right now**". A
|
|
125
|
+
session can carry a standing host instruction against dispatching subagents unless the
|
|
126
|
+
user asked. Such instructions are injected by the harness, sit outside both the user's
|
|
127
|
+
config and this project's control, can be enabled or disabled per session, and **outrank
|
|
128
|
+
this prose**. A model that reads (b) as mere tool presence self-reports `interactive`,
|
|
129
|
+
attempts the dispatch, declines its own attempt, and lands in the recovery path below
|
|
130
|
+
instead of the correct path. Read (b) as permission and classify up front.
|
|
131
|
+
|
|
132
|
+
**A consent requirement is `interactive`, not `manual`.** When dispatch is barred only
|
|
133
|
+
*unless the user asked*, and a question mechanism **is** available, pass `interactive`. The
|
|
134
|
+
Standard Verify Gate's own prompt supplies the missing user request: the user selecting
|
|
135
|
+
"Verify {stageNoun} now" **is** the request, so the dispatch that follows that choice is
|
|
136
|
+
solicited and permitted. Degrading this case to `manual` prints a copy-paste command and
|
|
137
|
+
throws away the in-context digest for no reason. Pass `manual` only when there is **no**
|
|
138
|
+
question mechanism **and** **no** permitted dispatch — genuine incapability, never a
|
|
139
|
+
consent step.
|
|
140
|
+
|
|
141
|
+
**A dispatch bar routes an auto-verify directive through the gate; it never resolves it.**
|
|
142
|
+
When `runInStageVerify: true` arrives and you may not dispatch unsolicited, that directive
|
|
143
|
+
is **presented through the Standard Verify Gate** in its consent form — see "Consent
|
|
144
|
+
variant on a `none` gate" below — and the clean-room `forge-verifier` is **dispatched on
|
|
145
|
+
the affirmative choice**, never merely printed for the user to run later. Such a bar is
|
|
146
|
+
**never grounds to skip verification**, and it is never resolved by **advancing to the
|
|
147
|
+
production successor** while verification is unresolved.
|
|
148
|
+
|
|
149
|
+
**Do not use `host == claude` as a capability proxy.** It is not one in either direction:
|
|
150
|
+
|
|
151
|
+
- a capable Pi session is `--host pi --verify-capability interactive`, and receives the
|
|
152
|
+
same logical gate a capable Claude session does;
|
|
153
|
+
- Pi without a dispatchable verifier is `--host pi --verify-capability manual`;
|
|
154
|
+
- a Claude session that cannot dispatch is `--host claude --verify-capability manual`.
|
|
155
|
+
|
|
156
|
+
Interactive gate options keep their explicit labels, their recommended default, and their
|
|
157
|
+
one-line trade-off descriptions (below). The manual path prints the verify command as the
|
|
158
|
+
sole fenced primary action and mentions production advancement only as unfenced post-pass
|
|
159
|
+
guidance.
|
|
160
|
+
|
|
161
|
+
### Clean-room unavailable, or a non-answer
|
|
162
|
+
|
|
163
|
+
If a dispatch advertised as available later returns
|
|
164
|
+
`CLEAN_ROOM_UNAVAILABLE: forge-verifier subagent not dispatchable — verify not run.`, or
|
|
165
|
+
returns a non-answer (a placeholder, a "still running" note, or a delegation message
|
|
166
|
+
instead of a findings block), then **verification failed / did not run**:
|
|
167
|
+
|
|
168
|
+
- do **not** run the verification inline, and do **not** silently accept the non-answer as
|
|
169
|
+
a pass;
|
|
170
|
+
- leave the verification debt **unresolved**, so the navigator catch-up fires later;
|
|
171
|
+
- obtain a **fresh** `stage-exit` payload with `--verify-capability manual` and use that
|
|
172
|
+
verify-first output.
|
|
173
|
+
|
|
174
|
+
**Never reuse an earlier payload that promotes production advancement.** The earlier
|
|
175
|
+
payload was computed under a capability claim that has just been disproved; re-printing it
|
|
176
|
+
advances the pipeline past verification that never happened.
|
|
177
|
+
|
|
178
|
+
## Branch ownership: the `owner:` token
|
|
179
|
+
|
|
180
|
+
`forge-verify` and `forge-fix` are dispatched through a Skill/Agent invocation, not a CLI,
|
|
181
|
+
so no `--owner` flag arrives on its own — and ownership is **never** inferred from how the
|
|
182
|
+
invocation happened to be phrased.
|
|
183
|
+
|
|
184
|
+
The dispatching caller states ownership in its invocation prompt using a literal token:
|
|
185
|
+
|
|
186
|
+
- **`owner: nested`** — used by in-stage auto-verify chains, the navigator's catch-up
|
|
187
|
+
chain, and a nested re-verify. The branch skill returns its structured result to the
|
|
188
|
+
outer caller and prints no terminal block.
|
|
189
|
+
- **`owner: direct`** — used when the dispatcher intends the branch skill to own the
|
|
190
|
+
terminal block.
|
|
191
|
+
|
|
192
|
+
**Absent the token, the skill treats itself as `direct`.** A user-typed
|
|
193
|
+
`/feature-forge:forge-verify` or `/feature-forge:forge-fix` is the only path that carries
|
|
194
|
+
no dispatcher, so "no token" and "no dispatcher" are the same condition. The skill passes
|
|
195
|
+
the resolved value straight through as `--owner direct|nested`.
|
|
196
|
+
|
|
197
|
+
Getting this wrong is not cosmetic. A nested verify that self-reports `direct` emits a
|
|
198
|
+
second sentinel-terminated block **inside** an outer stage's exit, breaking the
|
|
199
|
+
exactly-one-terminal-block rule — and the canon guard cannot catch it, because both
|
|
200
|
+
wordings legitimately appear in the same file. Judge the token, not the phrasing.
|
|
201
|
+
|
|
202
|
+
## Directive consumption order
|
|
203
|
+
|
|
204
|
+
`stage-exit` emits a DIRECTIVES object and (for a direct owner) a NEXT-STEPS block. The
|
|
205
|
+
skill executes the directives **in this order**; the script has already computed every
|
|
206
|
+
conditional, so a directive is an instruction, not a question to re-derive.
|
|
207
|
+
|
|
208
|
+
1. **Surface `invalidAutoVerifyKeys` and `warnings` first**, before any terminal output.
|
|
209
|
+
`warnings` is a **list**, not a single string, rendered in the fixed order the script
|
|
210
|
+
emits (epic-member state fallback, then debt-metadata, then revision mismatch); more
|
|
211
|
+
than one entry can appear on a single call, so print every entry rather than the first.
|
|
212
|
+
An empty list means checked-and-clean, which is not the same as the key being absent.
|
|
213
|
+
2. **`runInStageVerify: true`** → execute the nested verify → fix → re-verify chain
|
|
214
|
+
synchronously (see below). This is the **one** directive that asks for an *unsolicited*
|
|
215
|
+
dispatch — auto-verify is authorized by config, not by a live user request — so it is
|
|
216
|
+
exactly where a standing no-unsolicited-dispatch instruction bites. When dispatch
|
|
217
|
+
requires consent and a question mechanism is available, do **not** dispatch silently,
|
|
218
|
+
do **not** treat the bar as a reason to skip verification, and do **not** advance:
|
|
219
|
+
present the Standard Verify Gate first (in its consent form) and dispatch on the
|
|
220
|
+
affirmative choice, then continue the chain unchanged.
|
|
221
|
+
3. **`verifyGate == "standard"`** → present the Standard Verify Gate. A pass, a findings
|
|
222
|
+
result, or an explicit skip must be **persisted** and the routing recomputed before any
|
|
223
|
+
block is printed. A "stop here" choice emits no advancing block.
|
|
224
|
+
4. **`verifyGate == "manual-print"`** → do **not** dispatch inline; print `verifyCommand`
|
|
225
|
+
for the user and use the script's verify-first block as-is.
|
|
226
|
+
5. **Print `nextSteps` byte-for-byte, and only when `terminalOwnedBy == "self"`.**
|
|
69
227
|
|
|
70
|
-
|
|
71
|
-
directives **in this order**; the script has already computed every conditional, so a
|
|
72
|
-
directive is an instruction, not a question to re-derive.
|
|
228
|
+
## Directive contract
|
|
73
229
|
|
|
74
230
|
### `invalidAutoVerifyKeys` (non-empty)
|
|
75
231
|
|
|
76
|
-
|
|
77
|
-
|
|
232
|
+
Each key names a `forge.config.json` `autoVerifyStages` entry that matches no
|
|
233
|
+
verify-capable stage — a config typo. The script already prints one warning line per key,
|
|
234
|
+
in sorted order; surface them and continue. They never fail the exit.
|
|
235
|
+
|
|
236
|
+
### `warnings` (a list)
|
|
237
|
+
|
|
238
|
+
Non-fatal advisories, each naming both the affected feature/stage/key **and** the recovery
|
|
239
|
+
action. Print every entry, in the emitted order, above the terminal block. Do not
|
|
240
|
+
reformat, merge, or summarize them, and never dump the state file they were derived from.
|
|
78
241
|
|
|
79
242
|
### `runInStageVerify: true` — in-stage auto-verify {stageNoun}
|
|
80
243
|
|
|
81
244
|
Auto-verify is effective for this stage and verification is outstanding — verify **now,
|
|
82
245
|
in this session** (principle #2 applied to auto-verify: the digest and any fix decision
|
|
83
246
|
land here, where the authoring context still exists — not deferred to a post-`/clear`
|
|
84
|
-
navigator)
|
|
247
|
+
navigator). The `auto-verify-pending` debt is already durable on disk at this point, so a
|
|
248
|
+
declined or deferred gate leaves recorded debt rather than a silent pass.
|
|
85
249
|
|
|
86
250
|
1. **Clean-room verify (require-clean).** Dispatch the clean-room `forge-verifier`
|
|
87
|
-
subagent from this session in require-clean mode
|
|
88
|
-
(`skills/forge-verify/SKILL.md`). Dispatch it
|
|
89
|
-
inline** — do **not** run it in the background or
|
|
90
|
-
the digest and any fix decision must land in this
|
|
91
|
-
session's context, so no `/clear` is needed and only
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
`verifyCommand
|
|
251
|
+
subagent from this session in require-clean mode with the `owner: nested` token — the
|
|
252
|
+
same path the navigator uses (`skills/forge-verify/SKILL.md`). Dispatch it
|
|
253
|
+
**synchronously and await its digest inline** — do **not** run it in the background or
|
|
254
|
+
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 `/clear` is needed and only
|
|
256
|
+
a compact digest returns.
|
|
257
|
+
**If you may not dispatch unsolicited**, present the consent form of the Standard
|
|
258
|
+
Verify Gate first and dispatch on the affirmative choice — see "Consent variant on a
|
|
259
|
+
`none` gate" below. **Clean-room unavailable or a non-answer returned**: follow
|
|
260
|
+
"Clean-room unavailable, or a non-answer" above — leave verify pending, print the
|
|
261
|
+
`verifyCommand`, and continue to the NEXT-STEPS block.
|
|
98
262
|
2. **Verify passed / no findings** → the fresh verify state is recorded by the
|
|
99
263
|
clean-room run; continue to the NEXT-STEPS block.
|
|
100
264
|
3. **Verify found findings** →
|
|
101
265
|
- **`autoFixEligible: true` AND the findings document has zero unresolved decision
|
|
102
|
-
points** → chain `feature-forge:forge-fix` in-session
|
|
103
|
-
step tracking), then run a **mandatory re-verify** in
|
|
104
|
-
to the NEXT-STEPS block only if the re-verify passes. On
|
|
105
|
-
forge-fix early stop, or a red re-verify, fall through to the
|
|
106
|
-
never a silent partial mutation. (`autoFixEligible` already folds
|
|
107
|
-
`autoFix` flag and the clean-tree precondition; a dirty tree or
|
|
266
|
+
points** → chain `feature-forge:forge-fix` in-session with the `owner: nested` token
|
|
267
|
+
(it owns its own commit + step tracking), then run a **mandatory re-verify** in
|
|
268
|
+
require-clean mode. Continue to the NEXT-STEPS block only if the re-verify passes. On
|
|
269
|
+
any precondition miss, a forge-fix early stop, or a red re-verify, fall through to the
|
|
270
|
+
digest gate below — never a silent partial mutation. (`autoFixEligible` already folds
|
|
271
|
+
in the config `autoFix` flag and the clean-tree precondition; a dirty tree or
|
|
108
272
|
`gitCommitAfterStage: false` arrives here as `false`.)
|
|
109
273
|
- **`autoFixEligible: false`, or unresolved decision points** → surface a **compact
|
|
110
|
-
findings digest** as text, then present the gate
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
274
|
+
findings digest** as text, then present the gate: **Run `forge-fix` now**
|
|
275
|
+
*(recommended — you are in-context and the digest is right here)* / **Clear + advance
|
|
276
|
+
anyway** (leave the findings for later) / **Stop here**. Do **not** hard-stop and do
|
|
277
|
+
**not** silently walk past. Act on the choice, then continue to the NEXT-STEPS block.
|
|
278
|
+
|
|
279
|
+
Every nested call in this chain prints no terminal block of its own. This stage is the
|
|
280
|
+
sole terminal owner, and it prints exactly one block after the chain settles.
|
|
115
281
|
|
|
116
282
|
### `verifyGate: "standard"` — the Standard Verify Gate
|
|
117
283
|
|
|
118
284
|
Auto-verify is off for this stage and verification is outstanding (`verifyState` is
|
|
119
|
-
`never`, `stale`, or `
|
|
120
|
-
|
|
121
|
-
question mechanism **
|
|
122
|
-
|
|
123
|
-
below:
|
|
285
|
+
`never`, `stale`, `failing`, or `auto-pending`), and the caller declared
|
|
286
|
+
`--verify-capability interactive`. Verify **now, before clearing**, using the host's
|
|
287
|
+
question mechanism with exactly these **three** labeled choices — the recommended default
|
|
288
|
+
first:
|
|
124
289
|
|
|
125
290
|
- **Verify {stageNoun} now** *(recommended)* — dispatch the clean-room `forge-verifier`
|
|
126
|
-
subagent from this session in require-clean mode
|
|
127
|
-
decision keeps its context. One-time — it does **not**
|
|
291
|
+
subagent from this session in require-clean mode with the `owner: nested` token; the
|
|
292
|
+
digest returns here so any fix decision keeps its context. One-time — it does **not**
|
|
293
|
+
change config.
|
|
128
294
|
- **Verify now + enable auto-verify going forward** — verify now **and** patch
|
|
129
295
|
`"autoVerify": true` into `forge.config.json` in place (preserve formatting and every
|
|
130
296
|
other key) so future stages verify automatically, no prompt. This complements the
|
|
@@ -132,24 +298,45 @@ below:
|
|
|
132
298
|
`notes`: a user-facing edit the user commits on their own cadence, never folded into
|
|
133
299
|
a stage's artifact commit.
|
|
134
300
|
- **Skip for now** — go straight to the NEXT-STEPS block without verifying. Record this
|
|
135
|
-
stage's verify status as `
|
|
136
|
-
|
|
301
|
+
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.
|
|
137
303
|
|
|
138
|
-
|
|
139
|
-
|
|
304
|
+
**Advancement is allowed only after a pass, or after an explicit skip has been
|
|
305
|
+
persisted.** Choosing to stop, or losing the interaction, produces no advancing terminal
|
|
306
|
+
block. If verify runs and finds findings, handle them exactly as in the in-stage flow
|
|
307
|
+
above (digest + gate; `autoFixEligible` applies unchanged).
|
|
308
|
+
|
|
309
|
+
#### Consent variant on a `none` gate
|
|
310
|
+
|
|
311
|
+
When `runInStageVerify: true` and you may not dispatch unsolicited, the emitted
|
|
312
|
+
`verifyGate` **stays `none`** — changing it to `standard` would alter directive values for
|
|
313
|
+
the existing stages 0–4. Reuse this same gate block for consent, with **choice 2 omitted**:
|
|
314
|
+
auto-verify is already effective on this path, so "enable auto-verify going forward" is a
|
|
315
|
+
no-op, and offering a label with no trade-off behind it is not an accessible choice. The
|
|
316
|
+
consent form is therefore exactly **two** choices:
|
|
317
|
+
|
|
318
|
+
1. **Verify {stageNoun} now** *(recommended)* — dispatch the clean-room verifier now; this
|
|
319
|
+
choice **is** the user request that authorizes the dispatch.
|
|
320
|
+
2. **Skip for now** — persisted as an explicit `skipped` before any advancing block.
|
|
321
|
+
|
|
322
|
+
This is the **only** case in which the rendered gate and the emitted `verifyGate` value
|
|
323
|
+
differ, and it exists because the gate here supplies *consent* rather than selecting
|
|
324
|
+
*policy*.
|
|
140
325
|
|
|
141
326
|
### `verifyGate: "manual-print"`
|
|
142
327
|
|
|
143
|
-
Verification is outstanding
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
328
|
+
Verification is outstanding and the caller declared `--verify-capability manual`. Do
|
|
329
|
+
**not** run verify inline — print the `verifyCommand` for the user to run (mirroring
|
|
330
|
+
`autoInvokeNextStage`), offer the auto-verify enable as plain text only if a config write
|
|
331
|
+
is possible, and continue to the NEXT-STEPS block. Verify state stays outstanding, so the
|
|
332
|
+
navigator catch-up can fire later. The script has already made the verify command the sole
|
|
333
|
+
fenced primary action and demoted production advancement to unfenced prose.
|
|
148
334
|
|
|
149
335
|
### `verifyGate: "none"`
|
|
150
336
|
|
|
151
|
-
Verification is already resolved (fresh or explicitly skipped)
|
|
152
|
-
above covers it. Say so in one line and
|
|
337
|
+
Verification is already resolved (fresh or explicitly skipped), the stage carries no
|
|
338
|
+
verification token at all, or the in-stage run above covers it. Say so in one line and
|
|
339
|
+
continue to the NEXT-STEPS block.
|
|
153
340
|
|
|
154
341
|
### `epicReconcile` (epic backflow — present only when there are open requests)
|
|
155
342
|
|
|
@@ -159,13 +346,14 @@ Emitted only when the exiting member carries `open` `epicChangeRequests` (record
|
|
|
159
346
|
features. The script has already folded the routing into the NEXT-STEPS block, so this
|
|
160
347
|
directive is informational — you do **not** re-derive the wording:
|
|
161
348
|
|
|
162
|
-
- `required: true` (at least one `blocksCurrent: true` request) — the
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
349
|
+
- `required: true` (at least one `blocksCurrent: true` request) — the reconcile command
|
|
350
|
+
(`/feature-forge:forge-0-epic {epic}`) is promoted ahead of the ordinary production
|
|
351
|
+
successor, and that successor is demoted to a follow-up line ("After reconciling,
|
|
352
|
+
continue the pipeline with …"). This is *reconcile-before-specs*: proceeding would author
|
|
353
|
+
artifacts against a decomposition that is about to change. It is strongest when exiting
|
|
354
|
+
`forge-2-tech` (next is `forge-3-specs`, the point of no cheap return). When
|
|
355
|
+
verification is also outstanding, verification stays primary and the reconcile becomes
|
|
356
|
+
the **first** deferred action, ahead of the ordinary successor.
|
|
169
357
|
- `reminder: true` (only `blocksCurrent: false` requests) — normal next-stage routing is
|
|
170
358
|
unchanged; the block appends a non-blocking reminder line ("You also flagged N epic
|
|
171
359
|
change(s) to reconcile when convenient …"). This is *finish-then-edit*.
|
|
@@ -201,68 +389,84 @@ question forward for the owning stage to resolve (it flips `status` to `addresse
|
|
|
201
389
|
does). Prefer a `deferredDecisions[]` entry over stuffing the same thing into the free-text
|
|
202
390
|
`notes` string. This is a recording affordance, not a gate: never block the exit on it.
|
|
203
391
|
|
|
204
|
-
### The NEXT-STEPS block
|
|
205
|
-
|
|
206
|
-
Print the script's NEXT-STEPS block **verbatim as your absolute last output**. Nothing
|
|
207
|
-
follows its final sentinel line (`─ forge: end of stage ─`) — no caveats, no summary,
|
|
208
|
-
no sign-off. The block already carries the `/clear` recommendation (host-aware wording
|
|
209
|
-
via `--host`) and the exact next command, so trailing prose can only push the user's
|
|
210
|
-
next action out of view.
|
|
392
|
+
### The NEXT-STEPS block, and the sentinel-last rule
|
|
211
393
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
actually outstanding, so at a boundary where verify already ran (or was explicitly
|
|
219
|
-
skipped, or auto-verify is on) it silently collapses to just the `/clear` →
|
|
220
|
-
next-command steps.
|
|
221
|
-
|
|
222
|
-
Slots: `{stage}` (a lowercase noun phrase), `{verify-command}`, `{next-command}`.
|
|
223
|
-
|
|
224
|
-
<!-- BEGIN: standard-exit-block -->
|
|
225
|
-
**This stage is done — walk the user through the Stage Exit Protocol** before moving on. The order is fixed, and step 2 is something only the user can do:
|
|
226
|
-
|
|
227
|
-
1. **Verify {stage} first — if it isn't already verified.** If verify already ran in this session — via the in-stage auto-verify on the authoring stages, or the interactive impl-verify offered above on the loop — or is already fresh on record, or the stage was explicitly skipped, say so and go straight to step 2. Only when `autoVerify` is off for this stage **and** verify is **missing or stale** do you present the **Standard Verify Gate**: verify **now, before clearing**, using `AskUserQuestion` with exactly these three options — but only when the host has a question mechanism **and** the clean-room path is available (the `Agent` tool plus a dispatchable `forge-verifier` subagent):
|
|
228
|
-
- **Verify {stage} now** *(recommended)* — dispatch the clean-room `forge-verifier` subagent from this session in require-clean mode; the digest returns here so any fix decision keeps its context. One-time — it does **not** change config.
|
|
229
|
-
- **Verify now + enable auto-verify going forward** — verify now **and** patch `"autoVerify": true` into `forge.config.json` in place (preserve formatting and every other key) so future stages verify automatically, no prompt. This complements the `forge-init` opt-in. **Do not auto-commit this config change** — treat it like `notes`: a user-facing edit the user commits on their own cadence, never folded into a stage's artifact commit.
|
|
230
|
-
- **Skip for now** — go straight to `/clear` and the next command without verifying. Record this stage's verify status as `"skipped"` in pipeline state (mirroring the existing skip handling) **only** on an explicit skip — a skip does not go stale.
|
|
394
|
+
**A direct payload** (`terminalOwnedBy: "self"`) carries exactly **one** occurrence of the
|
|
395
|
+
sentinel `─ forge: end of stage ─`, as the **final line** of `nextSteps`. Print that block
|
|
396
|
+
**verbatim as your absolute last output**. Nothing follows the sentinel — no summary, no
|
|
397
|
+
sign-off, no warning, no command result, no acceptance text, no caveat. The block already
|
|
398
|
+
carries the fresh-session recommendation (host-aware wording via `--host`) and the exact
|
|
399
|
+
next command, so trailing prose can only push the user's next action out of view.
|
|
231
400
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
```
|
|
237
|
-
{next-command}
|
|
238
|
-
```
|
|
239
|
-
<!-- END: standard-exit-block -->
|
|
401
|
+
**A nested payload** (`terminalOwnedBy: "outer"`) carries `nextSteps: null` and
|
|
402
|
+
`sentinel: null`. It prints **no terminal block at all** — not even an empty one. Return
|
|
403
|
+
your structured result to the outer caller; that caller re-runs `stage-exit` after the
|
|
404
|
+
nested state transitions so its single final block reflects the terminal result.
|
|
240
405
|
|
|
241
406
|
---
|
|
242
407
|
|
|
243
|
-
##
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
408
|
+
## Re-verify scope and convergence
|
|
409
|
+
|
|
410
|
+
A **re-verify** is any verification run whose served stage's verify entry is
|
|
411
|
+
`findings-applied` — a fix pass preceded it, and its job is to CONFIRM that pass, not to
|
|
412
|
+
re-open the artifact. These rules bind the dispatched `forge-verifier`, the skill that
|
|
413
|
+
synthesizes its digest (`skills/forge-verify/SKILL.md`), and the fix pass that requests
|
|
414
|
+
the re-verify (`skills/forge-fix/SKILL.md` Step 6):
|
|
415
|
+
|
|
416
|
+
- **Scope.** Confirm each finding of the prior report against that finding's own
|
|
417
|
+
acceptance evidence, and examine the fix's delta (the changed lines and what they
|
|
418
|
+
directly touch) for new blocking defects. A re-verify is NOT a fresh full-checklist
|
|
419
|
+
sweep: the full sweep already ran when the report was minted, and re-sweeping mints
|
|
420
|
+
arbitrary new findings against text the fix just wrote — the divergence loop this
|
|
421
|
+
section exists to prevent.
|
|
422
|
+
- **Convergence.** Only an unresolved finding from the prior report, or a new
|
|
423
|
+
**blocking** finding (`error` with behavioral, CLI-output, or decision-bearing
|
|
424
|
+
consequence, or `gap`) introduced by the fix delta itself, may make a re-verify close
|
|
425
|
+
as `reverify-findings`. Every other new observation — advisory-severity anywhere, or
|
|
426
|
+
anything outside the fix delta — is recorded in the report at most and never flips
|
|
427
|
+
the outcome.
|
|
428
|
+
- **Decision immunity.** A finding whose subject carries a recorded decision — a
|
|
429
|
+
`state-decision` entry, a recorded-decision comment in the artifact, or a declared
|
|
430
|
+
non-goal — is never filed, in a re-verify or a fresh sweep. Cite the decision
|
|
431
|
+
instead. Re-filing a decided question costs a round and reverses nothing.
|
|
432
|
+
In particular, a **meta-guard** (a test protecting other tests or prose) is judged
|
|
433
|
+
against its DECLARED protection set: guard-incompleteness against a declared
|
|
434
|
+
non-goal is never a finding — the space of what a guard does not cover is
|
|
435
|
+
unbounded, and enumerating it one round at a time is an arms race, not
|
|
436
|
+
verification (authoring norm: the testing-strategy archetype in
|
|
437
|
+
`skills/forge-3-specs/references/spec-archetypes.md`).
|
|
438
|
+
- **Escalation (the round ledger).** Rounds are counted from the served stage's
|
|
439
|
+
findings documents (`VERIFY-{mode}-{date}.md`, then `-round{N}` — the filename rule
|
|
440
|
+
in `skills/forge-verify/SKILL.md` Step 4), so the ledger is reconstructable from the
|
|
441
|
+
`.verification/` directory alone. On the SECOND consecutive `reverify-findings`
|
|
442
|
+
close for the same served stage, the loop has stopped converging: do NOT recommend
|
|
443
|
+
another fix pass. Present the compact findings digest and ask for explicit
|
|
444
|
+
disposition with exactly these options —
|
|
445
|
+
**Accept the residual findings and advance** *(recommended)*: record the acceptance
|
|
446
|
+
as a `state-decision` naming each accepted finding, then write the stage's verify
|
|
447
|
+
result as `passed` with the report attached (`--findings-file`/`--findings-count`);
|
|
448
|
+
the accepted findings become recorded decisions that decision immunity keeps from
|
|
449
|
+
ever being re-filed. **Run another fix pass**: available, never recommended at this
|
|
450
|
+
point. **Stop here**. The user may still choose to fix — the protocol just stops
|
|
451
|
+
steering into the loop it cannot show is converging. Under `manual` capability
|
|
452
|
+
(no question mechanism), print the digest and the three dispositions as text
|
|
453
|
+
BEFORE the terminal block — the user answers on their own cadence; the terminal
|
|
454
|
+
block still closes the stage mechanically.
|
|
257
455
|
|
|
258
|
-
|
|
259
|
-
**The loop is complete — this is the one boundary where clearing before the next stage is optional.**
|
|
260
|
-
|
|
261
|
-
1. **Verify is already offered above.** Impl-verify is offered interactively right after this report (Step 5b for a standalone feature, Step 6.1 for an epic member) — run it there rather than as a second gate. It runs clean-room, so it needs no fresh session.
|
|
262
|
-
2. **Clearing is optional here — warm is fine.** `forge-6-docs` benefits from the still-warm context of what the loop actually did, so continuing in this same session is the easy default. A cold start also works — every artifact is on disk — but there is no need to force it.
|
|
263
|
-
3. **Then run the next command** — in this warm session, or a fresh one if you prefer:
|
|
456
|
+
---
|
|
264
457
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
458
|
+
## Retired blocks
|
|
459
|
+
|
|
460
|
+
The two bespoke terminal blocks this protocol used to carry — the **standard block** and
|
|
461
|
+
the **warm-acceptable variant**, the latter stamped only at the
|
|
462
|
+
`forge-5-loop → forge-6-docs` boundary — are **gone**. They were the last hand-written
|
|
463
|
+
advancing contract, and their final two stamp sites (`skills/forge-5-loop/SKILL.md`'s
|
|
464
|
+
step-6 epic handoff and `skills/forge-5-loop/references/result-reporting.md`'s all-done
|
|
465
|
+
report) now stamp the canonical scripted stamp instead.
|
|
466
|
+
|
|
467
|
+
Nothing may reintroduce them. A hand-written "walk the user through the Stage Exit
|
|
468
|
+
Protocol" block, a warm "clearing is optional" block, or any other bespoke next-command
|
|
469
|
+
list on a covered surface is a routing fork: the script already decides freshness, gate
|
|
470
|
+
form, host wording, and the next command from live state, and a second block can only
|
|
471
|
+
disagree with it. The canonical scripted stamp above is the **only** advancing contract
|
|
472
|
+
for all nine covered exits.
|
|
@@ -165,15 +165,17 @@ python3 "$R/scripts/forge-session.py" state-note \
|
|
|
165
165
|
--feature "{feature}" --note "<what the user volunteered>" --specs-dir "{specsDir}"
|
|
166
166
|
```
|
|
167
167
|
|
|
168
|
+
**Determine `--verify-capability` before running the exit** (full rule: `references/stage-exit-protocol.md`; summary: **Verify Capability** in `references/shared-conventions.md`). Pass `interactive` only when a question mechanism equivalent to the host's question mechanism is available **and** a clean-room `forge-verifier` may be dispatched; otherwise pass `manual`. Dispatch capability means **permitted** dispatch, not a listed tool — the test is "may I dispatch `forge-verifier` right now", not "is a dispatch tool in my tool surface". A session that bars *unsolicited* dispatch while offering a question mechanism is therefore **`interactive`, not `manual`**: the gate's affirmative choice is the user request that authorizes the dispatch. Such a bar is never grounds to skip verification, and never grounds to fence the production successor while verification is unresolved — on the `runInStageVerify: true` path the emitted `verifyGate` stays `none`, so reuse the Standard Verify Gate block for consent with **choice 2 omitted**, leaving exactly two choices: *Verify now* (recommended) and *Skip for now*. The clean-room `forge-verifier` is **dispatched on the affirmative choice**, never merely printed for the user to run later; *Skip for now* is persisted as an explicit `skipped` before any advancing block. Add `--epic "{epic}"` to the call below when this feature is an epic member.
|
|
169
|
+
|
|
168
170
|
**Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
|
|
169
171
|
|
|
170
172
|
```bash
|
|
171
173
|
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
174
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
173
|
-
python3 "$R/scripts/forge-session.py" stage-exit --feature "{feature}" --stage forge-3-specs --specs-dir "{specsDir}" --host generic
|
|
175
|
+
python3 "$R/scripts/forge-session.py" stage-exit --feature "{feature}" --stage forge-3-specs --specs-dir "{specsDir}" --host generic --verify-capability "{verify-capability}"
|
|
174
176
|
```
|
|
175
177
|
|
|
176
|
-
Obey the DIRECTIVES it prints, in order
|
|
178
|
+
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.
|
|
177
179
|
|
|
178
180
|
## Gotchas
|
|
179
181
|
|