@garygentry/feature-forge 0.3.1 → 0.3.4
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/agents/forge-verifier.md +3 -1
- package/adapters/claude/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/claude/references/epic-manifest-schema.json +6 -1
- package/adapters/claude/references/epic-state-schema.json +50 -0
- package/adapters/claude/references/forge-config-schema.json +19 -1
- package/adapters/claude/references/forge-decisions-schema.json +33 -0
- package/adapters/claude/references/pipeline-state-schema.json +38 -4
- package/adapters/claude/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/references/shared-conventions.md +77 -3
- package/adapters/claude/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/scripts/epic-manifest.py +495 -91
- package/adapters/claude/scripts/fix-sweep.py +1180 -0
- package/adapters/claude/scripts/forge-bootstrap.py +57 -5
- package/adapters/claude/scripts/forge-session.py +4241 -146
- package/adapters/claude/scripts/validate-traceability.py +86 -5
- package/adapters/claude/skills/forge/SKILL.md +10 -9
- package/adapters/claude/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/claude/skills/forge/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-0-epic/SKILL.md +7 -2
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +29 -25
- 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 +38 -4
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-1-prd/SKILL.md +17 -4
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-2-tech/SKILL.md +18 -4
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-3-specs/SKILL.md +9 -3
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +77 -3
- 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 +391 -143
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +56 -5
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-5-loop/SKILL.md +67 -69
- 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 +101 -33
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +26 -6
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-6-docs/SKILL.md +75 -8
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/claude/skills/forge-fix/SKILL.md +119 -33
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +19 -1
- package/adapters/claude/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-verify/SKILL.md +82 -51
- 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 +69 -49
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/epic.md +4 -3
- package/adapters/claude/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/specs.md +45 -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-manifest-schema.json +6 -1
- package/adapters/codex/references/epic-state-schema.json +50 -0
- package/adapters/codex/references/forge-config-schema.json +19 -1
- package/adapters/codex/references/forge-decisions-schema.json +33 -0
- package/adapters/codex/references/pipeline-state-schema.json +38 -4
- 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 +102 -28
- package/adapters/codex/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/scripts/epic-manifest.py +495 -91
- package/adapters/codex/scripts/fix-sweep.py +1180 -0
- package/adapters/codex/scripts/forge-bootstrap.py +57 -5
- package/adapters/codex/scripts/forge-session.py +4241 -146
- package/adapters/codex/scripts/validate-traceability.py +86 -5
- package/adapters/codex/skills/forge/SKILL.md +13 -12
- package/adapters/codex/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/codex/skills/forge/references/process-overview.md +2 -2
- package/adapters/codex/skills/forge/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-0-epic/SKILL.md +7 -2
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +37 -33
- 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 +38 -4
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-1-prd/SKILL.md +17 -4
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-2-tech/SKILL.md +18 -4
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-3-specs/SKILL.md +9 -3
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +102 -28
- 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 +395 -147
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +56 -5
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-5-loop/SKILL.md +67 -69
- 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 +101 -33
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +30 -10
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-6-docs/SKILL.md +75 -8
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/codex/skills/forge-fix/SKILL.md +118 -32
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-guide/SKILL.md +1 -1
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +19 -1
- 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 +102 -28
- package/adapters/codex/skills/forge-init/SKILL.md +1 -1
- package/adapters/codex/skills/forge-verify/SKILL.md +82 -51
- 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 +70 -50
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +5 -4
- package/adapters/codex/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/specs.md +45 -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-manifest-schema.json +6 -1
- package/adapters/copilot/references/epic-state-schema.json +50 -0
- package/adapters/copilot/references/forge-config-schema.json +19 -1
- package/adapters/copilot/references/forge-decisions-schema.json +33 -0
- package/adapters/copilot/references/pipeline-state-schema.json +38 -4
- 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 +102 -28
- package/adapters/copilot/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/scripts/epic-manifest.py +495 -91
- package/adapters/copilot/scripts/fix-sweep.py +1180 -0
- package/adapters/copilot/scripts/forge-bootstrap.py +57 -5
- package/adapters/copilot/scripts/forge-session.py +4241 -146
- package/adapters/copilot/scripts/validate-traceability.py +86 -5
- package/adapters/copilot/skills/forge/forge.md +13 -12
- package/adapters/copilot/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/copilot/skills/forge/references/process-overview.md +2 -2
- package/adapters/copilot/skills/forge/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +7 -2
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +37 -33
- 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 +38 -4
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +17 -4
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +18 -4
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +9 -3
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +102 -28
- 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 +395 -147
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +56 -5
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +67 -69
- 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 +101 -33
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +30 -10
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +75 -8
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/copilot/skills/forge-fix/forge-fix.md +118 -32
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-guide/forge-guide.md +1 -1
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +19 -1
- 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 +102 -28
- package/adapters/copilot/skills/forge-init/forge-init.md +1 -1
- package/adapters/copilot/skills/forge-verify/forge-verify.md +82 -51
- 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 +70 -50
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +5 -4
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/specs.md +45 -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-manifest-schema.json +6 -1
- package/adapters/cursor/references/epic-state-schema.json +50 -0
- package/adapters/cursor/references/forge-config-schema.json +19 -1
- package/adapters/cursor/references/forge-decisions-schema.json +33 -0
- package/adapters/cursor/references/pipeline-state-schema.json +38 -4
- 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 +102 -28
- package/adapters/cursor/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/scripts/epic-manifest.py +495 -91
- package/adapters/cursor/scripts/fix-sweep.py +1180 -0
- package/adapters/cursor/scripts/forge-bootstrap.py +57 -5
- package/adapters/cursor/scripts/forge-session.py +4241 -146
- package/adapters/cursor/scripts/validate-traceability.py +86 -5
- package/adapters/cursor/skills/forge/forge.mdc +13 -12
- package/adapters/cursor/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/cursor/skills/forge/references/process-overview.md +2 -2
- package/adapters/cursor/skills/forge/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +7 -2
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +37 -33
- 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 +38 -4
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +17 -4
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +18 -4
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +9 -3
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +102 -28
- 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 +395 -147
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +56 -5
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +67 -69
- 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 +101 -33
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +30 -10
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +75 -8
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +118 -32
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-guide/forge-guide.mdc +1 -1
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +19 -1
- 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 +102 -28
- package/adapters/cursor/skills/forge-init/forge-init.mdc +1 -1
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +82 -51
- 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 +70 -50
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +5 -4
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/specs.md +45 -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-manifest-schema.json +6 -1
- package/adapters/gemini/references/epic-state-schema.json +50 -0
- package/adapters/gemini/references/forge-config-schema.json +19 -1
- package/adapters/gemini/references/forge-decisions-schema.json +33 -0
- package/adapters/gemini/references/pipeline-state-schema.json +38 -4
- 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 +102 -28
- package/adapters/gemini/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/scripts/epic-manifest.py +495 -91
- package/adapters/gemini/scripts/fix-sweep.py +1180 -0
- package/adapters/gemini/scripts/forge-bootstrap.py +57 -5
- package/adapters/gemini/scripts/forge-session.py +4241 -146
- package/adapters/gemini/scripts/validate-traceability.py +86 -5
- package/adapters/gemini/skills/forge/forge.md +13 -12
- package/adapters/gemini/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/gemini/skills/forge/references/process-overview.md +2 -2
- package/adapters/gemini/skills/forge/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +7 -2
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +37 -33
- 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 +38 -4
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +17 -4
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +18 -4
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +9 -3
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +102 -28
- 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 +395 -147
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +56 -5
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +67 -69
- 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 +101 -33
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +30 -10
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +75 -8
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/gemini/skills/forge-fix/forge-fix.md +118 -32
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-guide/forge-guide.md +1 -1
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +19 -1
- 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 +102 -28
- package/adapters/gemini/skills/forge-init/forge-init.md +1 -1
- package/adapters/gemini/skills/forge-verify/forge-verify.md +82 -51
- 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 +70 -50
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +5 -4
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/specs.md +45 -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-manifest-schema.json +6 -1
- package/adapters/pi/references/epic-state-schema.json +50 -0
- package/adapters/pi/references/forge-config-schema.json +19 -1
- package/adapters/pi/references/forge-decisions-schema.json +33 -0
- package/adapters/pi/references/pipeline-state-schema.json +38 -4
- 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 +91 -17
- package/adapters/pi/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/scripts/epic-manifest.py +495 -91
- package/adapters/pi/scripts/fix-sweep.py +1180 -0
- package/adapters/pi/scripts/forge-bootstrap.py +57 -5
- package/adapters/pi/scripts/forge-session.py +4241 -146
- package/adapters/pi/scripts/validate-traceability.py +86 -5
- package/adapters/pi/skills/forge/SKILL.md +10 -9
- package/adapters/pi/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/pi/skills/forge/references/process-overview.md +2 -2
- package/adapters/pi/skills/forge/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-0-epic/SKILL.md +7 -2
- package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +31 -27
- 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 +38 -4
- package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-1-prd/SKILL.md +17 -4
- package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-2-tech/SKILL.md +18 -4
- package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-3-specs/SKILL.md +9 -3
- package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +91 -17
- 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 +395 -147
- package/adapters/pi/skills/forge-4-backlog/SKILL.md +56 -5
- package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-5-loop/SKILL.md +67 -69
- 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 +101 -33
- package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +29 -9
- package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-6-docs/SKILL.md +75 -8
- package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/pi/skills/forge-fix/SKILL.md +118 -32
- package/adapters/pi/skills/forge-fix/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +19 -1
- 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 +91 -17
- package/adapters/pi/skills/forge-verify/SKILL.md +81 -50
- 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 +69 -49
- package/adapters/pi/skills/forge-verify/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +5 -4
- package/adapters/pi/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/specs.md +45 -1
- 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
|
@@ -45,6 +45,8 @@ python3 "$R/scripts/forge-session.py" effective-config --config ./forge.config.j
|
|
|
45
45
|
|
|
46
46
|
**Prerequisite check:** Read `{resolvedFeatureDir}/.pipeline-state.json`. If not in force mode, stages `forge-1-prd`, `forge-2-tech`, and `forge-3-specs` must all be `complete`. If not, STOP and tell the user which prerequisites are missing.
|
|
47
47
|
|
|
48
|
+
**Carried-over note check.** If that state's top-level `notes` is a non-empty string, surface it verbatim before proceeding and treat it as input to this stage — it was persisted for exactly this cross-session handoff (often at the previous stage's exit), and it can carry backlog-shaping constraints (e.g. "no item may create file X"). It never overrides the specs or config; raise any conflict instead of silently following either side.
|
|
49
|
+
|
|
48
50
|
After the prerequisite check, invoke the **Stage-Entry Guard** block in `references/shared-conventions.md` with `{stage}` = `forge-4-backlog` — it detects an interrupted or complete `backlog.json`, runs the resume/restart or new-version gate, and stamps entry before Step 2 loads the specs. (The backlog is a single artifact, so "resume" means: reuse the existing `backlog.json` if the previous run wrote it, rather than re-authoring from scratch.)
|
|
49
51
|
|
|
50
52
|
Then invoke the **Epic-Member Base Guard** block in `references/shared-conventions.md` (this stage does not run Epic Context Injection, so invoke it explicitly here). It self-gates to a no-op for standalone features; for a nested epic member on a branch that lacks the epic manifest it stops with a home-branch pointer (Issue #125).
|
|
@@ -92,6 +94,8 @@ After presenting the plan as text, use `AskUserQuestion` following the **Decisio
|
|
|
92
94
|
|
|
93
95
|
`author-backlog` owns all item-quality rules (granularity hard limits, self-contained descriptions, acceptance criteria, `agentDelegation`, the correct `type`/`status` enums, `dependsOn`, `specReferences`, the schema source). Do not re-encode them here — follow whatever it produces.
|
|
94
96
|
|
|
97
|
+
**Return contract.** This is the **delegate-and-resume** posture of "Caller-side resumption: the declared resume point" in `references/stage-exit-protocol.md`. `author-backlog` is a sub-skill of this stage, not its terminal: when it returns, control returns to **this skill, at Step 5** — forge-4 still owns the stage and its terminal output. Two of the sub-skill's own instructions do not apply on this delegated path (it also serves direct user invocation, and those instructions are its direct-invocation posture): its wait-for-user-approval-before-writing gate is already satisfied by Step 3's approved plan — do not re-ask; and its closing "run `rauf backlog validate` … and confirm the validated result" posture is subsumed by Step 5, which owns validation (see Step 5's ownership note). Do not adopt the sub-skill's report-and-stop terminal — it is the freshest instruction in context after the return, but it belongs to the sub-skill: continue to Step 5 in the same turn; Steps 6 and 7 still run, and the stage closes only at Step 7's exit.
|
|
98
|
+
|
|
95
99
|
> **If the rauf plugin / `author-backlog` skill is not available:** fall back to
|
|
96
100
|
> authoring inline using the schema source rule (prefer the project's installed
|
|
97
101
|
> `{stateDir}/backlog.schema.json`, else the published `$id`
|
|
@@ -108,6 +112,8 @@ After presenting the plan as text, use `AskUserQuestion` following the **Decisio
|
|
|
108
112
|
|
|
109
113
|
## Step 5: Validate via the loop runner
|
|
110
114
|
|
|
115
|
+
**Validation ownership.** This step is authoritative for validation, whether or not `author-backlog` already ran its own `rauf backlog validate`: this stage carries the degradation rules for a missing/old/not-set-up runner (below) that the sub-skill does not, and this step's result is what Step 6 reports. A validate the sub-skill already ran cleanly makes this a cheap idempotent re-run, never a reason to skip it — and the sub-skill's validate never discharges this step.
|
|
116
|
+
|
|
111
117
|
Validate the generated backlog by running the runner's **validate command**
|
|
112
118
|
(`loopRunner.validateCommand`), rendered with `{resolvedBacklogDir}` and `{specsDir}`
|
|
113
119
|
substituted — the rauf default:
|
|
@@ -132,11 +138,43 @@ Interpret the result:
|
|
|
132
138
|
> (`validate` reports the project marker missing), likewise warn and continue
|
|
133
139
|
> — validation will run cleanly once `rauf install .` has been done.
|
|
134
140
|
|
|
141
|
+
## Step 5b: Topology Report (advisory)
|
|
142
|
+
|
|
143
|
+
After validation (or a recorded skip), report the backlog's dependency topology. Pipe the runner's **list command** (`loopRunner.listCommand`, rendered with `{resolvedBacklogDir}` — the rauf default shown below) into the topology verb. It is a pure function over the runner's item array and never takes a `backlog.json` path:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
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')"
|
|
147
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
148
|
+
rauf backlog list . --backlog {resolvedBacklogDir} --json | python3 "$R/scripts/forge-session.py" backlog-topology --items-stdin --json
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
ALWAYS print the metrics, citing the runner counts from the payload:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
Topology: {itemCount} items, {rootCount} roots, max chain depth {maxChainDepth}.
|
|
155
|
+
Per-root fan-out (gated subtree size): {id}→{gatedCount}, … (largest first).
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Only when the payload's `warnings` array is non-empty, also render this block, including only the bullet(s) for warnings that actually fired:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
⚠️ Fragile topology (advisory — does not block authoring):
|
|
162
|
+
- single-root-fanout: root {id} gates {gatedCount}/{itemCount} items (≥50%).
|
|
163
|
+
- chain-depth: max chain depth {maxChainDepth} is ≥50% of {itemCount} items.
|
|
164
|
+
A single defect in a high-fan-out root or a long chain can strand most of the backlog
|
|
165
|
+
(the loop-recovery incident: 3 roots gating 81%, 13-deep chain). Consider splitting the
|
|
166
|
+
gating root's subtree or flattening the chain — this is a heads-up, not a gate.
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
This step is **guidance only — it never fails authoring**. If the topology command itself errors, note the error and continue to Step 6 (advisory).
|
|
170
|
+
|
|
135
171
|
## Step 6: Review with User
|
|
136
172
|
|
|
137
173
|
Present a summary: total items N, dependency-chain depth, estimated loop iterations (`ceil(pendingItems * loopIterationMultiplier)`). Note whether validation passed or was skipped (runner not yet available).
|
|
138
174
|
|
|
139
|
-
|
|
175
|
+
This is a **non-blocking review (invitation)** — per the **Stage Review Gate** in `references/shared-conventions.md`: sibling stages block here; this stage deliberately does not, and the invitation obliges you to continue, not stop.
|
|
176
|
+
|
|
177
|
+
State that the backlog is ready and invite adjustments before committing — a statement, not a forced gate: "Backlog is ready. Tell me if you want any items split, merged, or reordered; otherwise I'll record state and commit." **Proceed to Step 7 in this same turn** unless the user asks for changes — emitting the invitation and stopping strands the stage before Step 7 runs.
|
|
140
178
|
|
|
141
179
|
## Step 7: Update Pipeline State and Commit
|
|
142
180
|
|
|
@@ -145,9 +183,9 @@ Before writing state or running the stage exit, invoke the **Stage-Completion Re
|
|
|
145
183
|
Pipeline state is written by the `state-*` verbs — see the Pipeline State Protocol in `references/shared-conventions.md`. Follow the Git Commit Protocol in `references/shared-conventions.md`.
|
|
146
184
|
|
|
147
185
|
1. Record completion by running `state-complete` (below) with `--version`, `--artifact backlog.json`, and `--based-on forge-1-prd=<current version> --based-on forge-2-tech=<current version> --based-on forge-3-specs=<current version>`. It sets `status: "complete"`, `completedAt`, the version and `basedOnVersions`, and applies the downstream staleness cascade deterministically, so no downstream status is set by hand.
|
|
148
|
-
2. **Offer a note — don't force one.** As a statement (not a blocking question), let the user know they can jot anything worth preserving across sessions and you'll store it in the `notes` field. If they volunteer something, store it; otherwise proceed.
|
|
186
|
+
2. **Offer a note — don't force one.** As a statement (not a blocking question), let the user know they can jot anything worth preserving across sessions and you'll store it in the `notes` field. If they volunteer something, store it via `state-note` — it **overwrites** the single `notes` string (latest note wins), so fold any still-relevant existing note into the one combined string; otherwise proceed. The next stage's Step 1 reads and surfaces this note.
|
|
149
187
|
3. If `gitCommitAfterStage` is true, follow the Git Commit Protocol: stage files, attempt commit (marking `stages.forge-4-backlog.status` `complete` with `commitHash: null` in that commit), then record the artifact-commit hash via the protocol's two-commit follow-up (never `--amend`) only on success. If commit fails, leave status as `in-progress`.
|
|
150
|
-
4. If verification was available but the user chose to skip it,
|
|
188
|
+
4. If verification was available but the user chose to skip it, persist that skip through `state-verify` using the fence below — never by hand. The choice to proceed unverified is durable state owned by the scripted writer.
|
|
151
189
|
5. **Close with the Stage Exit Protocol** (single-sourced in `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Lead with the item count ("Backlog complete with {N} items."), then:
|
|
152
190
|
|
|
153
191
|
The `state-complete` call for item 1 — and the `state-note` call only when the user volunteered a note in item 2 — with the portable plugin-root prelude. Add `--epic "{epic}"` to each call when this feature is an epic member — required, per the Pipeline State Protocol in `references/shared-conventions.md`:
|
|
@@ -164,15 +202,28 @@ python3 "$R/scripts/forge-session.py" state-note \
|
|
|
164
202
|
--feature "{feature}" --note "<what the user volunteered>" --specs-dir "{specsDir}"
|
|
165
203
|
```
|
|
166
204
|
|
|
205
|
+
The `state-verify` call for item 4 — **only** when verification was available and the user explicitly chose to skip it. A verifier that could not be dispatched is not a skip, so do not run this on an unavailable-tool path. And only over an entry that is absent or unresolved: if `stages.forge-verify-backlog` already records `passed` or `findings-applied`, do **not** run the call — those statuses are resolved, the verb refuses to demote them to `skipped` (#203), and the existing result stands with nothing written. Add `--epic "{epic}"` when this feature is an epic member — required, per the Pipeline State Protocol in `references/shared-conventions.md`:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
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')"
|
|
209
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
210
|
+
python3 "$R/scripts/forge-session.py" state-verify \
|
|
211
|
+
--feature "{feature}" --stage forge-4-backlog --status skipped --specs-dir "{specsDir}"
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
If that verb exits 2, surface its plain `Error:` line verbatim and stop — the skip is not persisted, so the exit below would route on state that does not exist on disk.
|
|
215
|
+
|
|
216
|
+
**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 `AskUserQuestion` 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.
|
|
217
|
+
|
|
167
218
|
**Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
|
|
168
219
|
|
|
169
220
|
```bash
|
|
170
221
|
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')"
|
|
171
222
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
172
|
-
python3 "$R/scripts/forge-session.py" stage-exit --feature "{feature}" --stage forge-4-backlog --specs-dir "{specsDir}" --host claude
|
|
223
|
+
python3 "$R/scripts/forge-session.py" stage-exit --feature "{feature}" --stage forge-4-backlog --specs-dir "{specsDir}" --host claude --verify-capability "{verify-capability}"
|
|
173
224
|
```
|
|
174
225
|
|
|
175
|
-
Obey the DIRECTIVES it prints, in order
|
|
226
|
+
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.
|
|
176
227
|
|
|
177
228
|
## Gotchas
|
|
178
229
|
|
|
@@ -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.
|
|
@@ -130,7 +141,7 @@ 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
147
|
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')"
|
|
@@ -191,6 +202,44 @@ 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
|
|
|
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.
|
|
206
|
+
|
|
207
|
+
### `state-verify` — verification results and provenance
|
|
208
|
+
|
|
209
|
+
`state-verify` writes exactly one `stages.forge-verify-{token}` entry — the verification result for the production stage named by `--stage` — plus the top-level `updatedAt`, and nothing else. `--stage` takes the **served production stage** (`forge-0-epic` through `forge-5-loop`; `forge-6-docs` has no verification token and is rejected). Add `--epic "{epic}"` when the feature is an epic member — required, per the member rule above. Result mode passes `--status` (`auto-verify-pending`, `passed`, `findings-reported`, `findings-applied`, or `skipped`) with whatever `--findings-file`, `--findings-count`, and `--verified-stage-version` that status requires; contradictory metadata is refused before any write. `passed` may additionally carry `--findings-file` + `--findings-count` together for an **advisory-only** report (`inconsistency`/`improvement` findings only, per forge-verify's severity floor) — the stage resolves without a fix round and the report stays attached:
|
|
210
|
+
|
|
211
|
+
**`auto-verify-pending` is not a skill-facing status.** It is written by `stage-exit`'s scheduling boundary, which records the debt automatically when auto-verify is effective for a stage. The value is accepted on this CLI so the entry stays inspectable and repairable, not so a skill can hand-schedule verification: no skill body and no reference passes it, and none should. Every other status in the list is the recorded *result* of a verification that ran (or was explicitly skipped); this one records that one was *owed*.
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
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')"
|
|
215
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
216
|
+
python3 "$R/scripts/forge-session.py" state-verify \
|
|
217
|
+
--feature "{feature}" --stage "{served-production-stage}" --status "<status>" \
|
|
218
|
+
--specs-dir "{specsDir}"
|
|
219
|
+
```
|
|
220
|
+
|
|
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:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
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')"
|
|
225
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
226
|
+
python3 "$R/scripts/forge-session.py" state-verify \
|
|
227
|
+
--feature "{feature}" --stage "{served-production-stage}" \
|
|
228
|
+
--commit-hash "$(git rev-parse HEAD)" --specs-dir "{specsDir}"
|
|
229
|
+
```
|
|
230
|
+
|
|
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:
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
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')"
|
|
235
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
236
|
+
python3 "$R/scripts/forge-session.py" state-verify \
|
|
237
|
+
--feature "{epic}" --stage forge-0-epic --status "<status>" \
|
|
238
|
+
--specs-dir "{specsDir}"
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
On exit 2 the verification result is **not** recorded: surface the `Error:` line verbatim, name the feature (and epic), and do not claim the verification was persisted or advance past it.
|
|
242
|
+
|
|
194
243
|
### Staleness Detection (Read-Time)
|
|
195
244
|
|
|
196
245
|
When loading upstream artifacts as prerequisites, check `basedOnVersions` in the pipeline state for this stage. If any upstream stage's current version is newer than the version recorded in `basedOnVersions`, warn the user before proceeding:
|
|
@@ -199,6 +248,31 @@ When loading upstream artifacts as prerequisites, check `basedOnVersions` in the
|
|
|
199
248
|
|
|
200
249
|
Frame the choice with its cost: re-running re-derives this stage from the current upstream (safest, but discards any hand-edits to this stage's artifacts); proceeding stale is faster but risks baking outdated assumptions into everything downstream. Recommend re-running unless the user knows the upstream change doesn't affect this stage.
|
|
201
250
|
|
|
251
|
+
## Immediate Downstream Note (Parking Lot)
|
|
252
|
+
|
|
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.
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
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')"
|
|
257
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
258
|
+
python3 "$R/scripts/forge-session.py" state-note \
|
|
259
|
+
--feature "{feature}" --note "<concise downstream concern>" \
|
|
260
|
+
--specs-dir "{specsDir}"
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
`state-note` **overwrites** the single top-level `notes` string — it does not append. To preserve an earlier note, read the current `notes` value out of the feature's `.pipeline-state.json` first and pass one combined concise string in a single `--note`; never edit or round-trip the JSON by hand. This interview-time call is separate from the optional completion note offered at stage closure and must not be deferred until then — a session that ends before closure would otherwise lose the concern entirely.
|
|
264
|
+
|
|
265
|
+
On `UsageError`/exit 2, surface the `Error:` line verbatim together with the named feature (and epic) and the recovery instruction, and **stop claiming the concern was recorded** — it was not. Epic *decomposition* changes are not notes: they go through `state-ecr` into `epicChangeRequests`, never into `notes`.
|
|
266
|
+
|
|
267
|
+
## Verify Capability
|
|
268
|
+
|
|
269
|
+
Skills that close a stage pass `--verify-capability interactive|manual` to `stage-exit`. The full determination rule, the Standard Verify Gate, and the recovery path live in `references/stage-exit-protocol.md`; the two facts that are most often gotten wrong:
|
|
270
|
+
|
|
271
|
+
- **Dispatch capability is *permitted* dispatch, not a listed tool.** The question is "**may I dispatch `forge-verifier` right now**", not "is a subagent-dispatch tool in my tool surface". A session can carry a standing host instruction against dispatching subagents unless the user asked; such instructions are injected by the harness, sit outside this project's control, and outrank skill prose. Classify on permission, up front.
|
|
272
|
+
- **A consent requirement is `interactive`, not `manual`.** When dispatch is barred only *unless the user asked* and a question mechanism is available, pass `interactive`: the gate's own affirmative choice supplies the missing user request. Pass `manual` only when there is **no** question mechanism **and** **no** permitted dispatch.
|
|
273
|
+
|
|
274
|
+
A bar on unsolicited dispatch 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`: reuse the Standard Verify Gate block for consent with **choice 2 omitted** (auto-verify is already effective, so "enable auto-verify going forward" is a no-op), 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.
|
|
275
|
+
|
|
202
276
|
## Branch Setup
|
|
203
277
|
|
|
204
278
|
Invoke this block at the **very start** of a pipeline entry point — `forge-1-prd` (standalone feature) and `forge-0-epic` (epic) — **before** any directory resolution or interview, so the rest of the run lands on the intended branch. `{label}` is the feature name (forge-1-prd) or epic name (forge-0-epic); `{scope}` is `feature` or `epic` correspondingly.
|
|
@@ -332,7 +406,7 @@ Invoke this block **at the head of any post-entry step that writes a stage artif
|
|
|
332
406
|
|
|
333
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.
|
|
334
408
|
|
|
335
|
-
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 `/feature-forge:forge {feature}` to see true state.
|
|
336
410
|
|
|
337
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).
|
|
338
412
|
|