@garygentry/feature-forge 0.3.2 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/adapters/claude/.feature-forge-bundle.json +1 -1
- package/adapters/claude/agents/forge-verifier.md +3 -1
- package/adapters/claude/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/claude/references/epic-state-schema.json +50 -0
- package/adapters/claude/references/forge-config-schema.json +20 -2
- package/adapters/claude/references/forge-decisions-schema.json +33 -0
- package/adapters/claude/references/pipeline-state-schema.json +34 -2
- package/adapters/claude/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/references/shared-conventions.md +15 -4
- package/adapters/claude/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/scripts/epic-manifest.py +82 -4
- package/adapters/claude/scripts/fix-sweep.py +1180 -0
- package/adapters/claude/scripts/forge-session.py +1151 -32
- package/adapters/claude/skills/forge/SKILL.md +5 -5
- package/adapters/claude/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/claude/skills/forge/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +5 -1
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +5 -0
- package/adapters/claude/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-1-prd/SKILL.md +3 -1
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-2-tech/SKILL.md +5 -1
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-3-specs/SKILL.md +5 -1
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +41 -3
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-5-loop/SKILL.md +36 -36
- package/adapters/claude/skills/forge-5-loop/references/agent-selection.md +16 -0
- package/adapters/claude/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +22 -4
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-6-docs/SKILL.md +29 -6
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-fix/SKILL.md +34 -0
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/claude/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-verify/SKILL.md +10 -11
- package/adapters/claude/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/claude/skills/forge-verify/references/findings-template.md +30 -0
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +15 -4
- package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +55 -11
- package/adapters/claude/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/adapters/codex/.feature-forge-bundle.json +1 -1
- package/adapters/codex/agents/forge-verifier.toml +3 -1
- package/adapters/codex/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/codex/references/epic-state-schema.json +50 -0
- package/adapters/codex/references/forge-config-schema.json +20 -2
- package/adapters/codex/references/forge-decisions-schema.json +33 -0
- package/adapters/codex/references/pipeline-state-schema.json +34 -2
- package/adapters/codex/references/process-overview.md +2 -2
- package/adapters/codex/references/ralph-loop-contract.md +6 -3
- package/adapters/codex/references/shared-conventions.md +44 -33
- package/adapters/codex/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/scripts/epic-manifest.py +82 -4
- package/adapters/codex/scripts/fix-sweep.py +1180 -0
- package/adapters/codex/scripts/forge-session.py +1151 -32
- package/adapters/codex/skills/forge/SKILL.md +8 -8
- package/adapters/codex/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/codex/skills/forge/references/process-overview.md +2 -2
- package/adapters/codex/skills/forge/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/codex/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-1-prd/SKILL.md +3 -1
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-2-tech/SKILL.md +5 -1
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-3-specs/SKILL.md +5 -1
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +41 -3
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-5-loop/SKILL.md +36 -36
- package/adapters/codex/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/codex/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/codex/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +26 -8
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-6-docs/SKILL.md +29 -6
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-fix/SKILL.md +34 -0
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-guide/SKILL.md +1 -1
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/codex/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/codex/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/codex/skills/forge-guide/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-init/SKILL.md +1 -1
- package/adapters/codex/skills/forge-verify/SKILL.md +11 -12
- package/adapters/codex/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/codex/skills/forge-verify/references/findings-template.md +32 -2
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +44 -33
- package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +64 -20
- package/adapters/codex/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/codex/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/adapters/copilot/.feature-forge-bundle.json +1 -1
- package/adapters/copilot/agents/forge-verifier.md +3 -1
- package/adapters/copilot/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/copilot/references/epic-state-schema.json +50 -0
- package/adapters/copilot/references/forge-config-schema.json +20 -2
- package/adapters/copilot/references/forge-decisions-schema.json +33 -0
- package/adapters/copilot/references/pipeline-state-schema.json +34 -2
- package/adapters/copilot/references/process-overview.md +2 -2
- package/adapters/copilot/references/ralph-loop-contract.md +6 -3
- package/adapters/copilot/references/shared-conventions.md +44 -33
- package/adapters/copilot/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/scripts/epic-manifest.py +82 -4
- package/adapters/copilot/scripts/fix-sweep.py +1180 -0
- package/adapters/copilot/scripts/forge-session.py +1151 -32
- package/adapters/copilot/skills/forge/forge.md +8 -8
- package/adapters/copilot/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/copilot/skills/forge/references/process-overview.md +2 -2
- package/adapters/copilot/skills/forge/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/copilot/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +3 -1
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +5 -1
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +5 -1
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +41 -3
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +36 -36
- package/adapters/copilot/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/copilot/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/copilot/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +26 -8
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +29 -6
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-fix/forge-fix.md +34 -0
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-guide/forge-guide.md +1 -1
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/copilot/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/copilot/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-init/forge-init.md +1 -1
- package/adapters/copilot/skills/forge-verify/forge-verify.md +11 -12
- package/adapters/copilot/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/copilot/skills/forge-verify/references/findings-template.md +32 -2
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +44 -33
- package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +64 -20
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/adapters/cursor/.feature-forge-bundle.json +1 -1
- package/adapters/cursor/agents/forge-verifier.mdc +3 -1
- package/adapters/cursor/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/cursor/references/epic-state-schema.json +50 -0
- package/adapters/cursor/references/forge-config-schema.json +20 -2
- package/adapters/cursor/references/forge-decisions-schema.json +33 -0
- package/adapters/cursor/references/pipeline-state-schema.json +34 -2
- package/adapters/cursor/references/process-overview.md +2 -2
- package/adapters/cursor/references/ralph-loop-contract.md +6 -3
- package/adapters/cursor/references/shared-conventions.md +44 -33
- package/adapters/cursor/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/scripts/epic-manifest.py +82 -4
- package/adapters/cursor/scripts/fix-sweep.py +1180 -0
- package/adapters/cursor/scripts/forge-session.py +1151 -32
- package/adapters/cursor/skills/forge/forge.mdc +8 -8
- package/adapters/cursor/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/cursor/skills/forge/references/process-overview.md +2 -2
- package/adapters/cursor/skills/forge/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/cursor/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +3 -1
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +5 -1
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +5 -1
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +41 -3
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +36 -36
- package/adapters/cursor/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/cursor/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/cursor/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +26 -8
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +29 -6
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +34 -0
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-guide/forge-guide.mdc +1 -1
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/cursor/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/cursor/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-init/forge-init.mdc +1 -1
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +11 -12
- package/adapters/cursor/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/cursor/skills/forge-verify/references/findings-template.md +32 -2
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +44 -33
- package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +64 -20
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/adapters/gemini/.feature-forge-bundle.json +1 -1
- package/adapters/gemini/agents/forge-verifier.md +3 -1
- package/adapters/gemini/gemini-extension.json +1 -1
- package/adapters/gemini/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/gemini/references/epic-state-schema.json +50 -0
- package/adapters/gemini/references/forge-config-schema.json +20 -2
- package/adapters/gemini/references/forge-decisions-schema.json +33 -0
- package/adapters/gemini/references/pipeline-state-schema.json +34 -2
- package/adapters/gemini/references/process-overview.md +2 -2
- package/adapters/gemini/references/ralph-loop-contract.md +6 -3
- package/adapters/gemini/references/shared-conventions.md +44 -33
- package/adapters/gemini/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/scripts/epic-manifest.py +82 -4
- package/adapters/gemini/scripts/fix-sweep.py +1180 -0
- package/adapters/gemini/scripts/forge-session.py +1151 -32
- package/adapters/gemini/skills/forge/forge.md +8 -8
- package/adapters/gemini/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/gemini/skills/forge/references/process-overview.md +2 -2
- package/adapters/gemini/skills/forge/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/gemini/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +3 -1
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +5 -1
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +5 -1
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +41 -3
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +36 -36
- package/adapters/gemini/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/gemini/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/gemini/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +26 -8
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +29 -6
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-fix/forge-fix.md +34 -0
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-guide/forge-guide.md +1 -1
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/gemini/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/gemini/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-init/forge-init.md +1 -1
- package/adapters/gemini/skills/forge-verify/forge-verify.md +11 -12
- package/adapters/gemini/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/gemini/skills/forge-verify/references/findings-template.md +32 -2
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +44 -33
- package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +64 -20
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/adapters/pi/.feature-forge-bundle.json +1 -1
- package/adapters/pi/agents/forge-verifier.md +3 -1
- package/adapters/pi/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/pi/references/epic-state-schema.json +50 -0
- package/adapters/pi/references/forge-config-schema.json +20 -2
- package/adapters/pi/references/forge-decisions-schema.json +33 -0
- package/adapters/pi/references/pipeline-state-schema.json +34 -2
- package/adapters/pi/references/process-overview.md +2 -2
- package/adapters/pi/references/ralph-loop-contract.md +6 -3
- package/adapters/pi/references/shared-conventions.md +33 -22
- package/adapters/pi/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/scripts/epic-manifest.py +82 -4
- package/adapters/pi/scripts/fix-sweep.py +1180 -0
- package/adapters/pi/scripts/forge-session.py +1151 -32
- package/adapters/pi/skills/forge/SKILL.md +5 -5
- package/adapters/pi/skills/forge/references/pipeline-state-schema.json +34 -2
- package/adapters/pi/skills/forge/references/process-overview.md +2 -2
- package/adapters/pi/skills/forge/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +8 -4
- package/adapters/pi/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
- package/adapters/pi/skills/forge-0-epic/references/pipeline-state-schema.json +34 -2
- package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-1-prd/SKILL.md +3 -1
- package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-2-tech/SKILL.md +5 -1
- package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-3-specs/SKILL.md +5 -1
- package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-4-backlog/SKILL.md +41 -3
- package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-5-loop/SKILL.md +36 -36
- package/adapters/pi/skills/forge-5-loop/references/agent-selection.md +16 -0
- package/adapters/pi/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/pi/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/pi/skills/forge-5-loop/references/result-reporting.md +40 -11
- package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +25 -7
- package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-6-docs/SKILL.md +29 -6
- package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-fix/SKILL.md +34 -0
- package/adapters/pi/skills/forge-fix/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +20 -2
- package/adapters/pi/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/pi/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/pi/skills/forge-guide/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-verify/SKILL.md +10 -11
- package/adapters/pi/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/pi/skills/forge-verify/references/findings-template.md +31 -1
- package/adapters/pi/skills/forge-verify/references/shared-conventions.md +33 -22
- package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +63 -19
- package/adapters/pi/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/pi/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/specs.md +43 -1
- package/dist/manifest.d.ts +1 -1
- package/dist/rauf.d.ts +3 -3
- package/dist/rauf.js +2 -2
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
|
@@ -4,7 +4,7 @@ The single source of truth for how every forge stage closes. **One** scripted co
|
|
|
4
4
|
covers all **nine** covered direct exits — the seven production stages `forge-0-epic`
|
|
5
5
|
through `forge-6-docs`, plus direct `forge-verify` and direct `forge-fix`. It replaces the
|
|
6
6
|
old ad-hoc "Next steps:" bullet lists with one fixed, correctly-ordered sequence:
|
|
7
|
-
**verify (if missing or stale) →
|
|
7
|
+
**verify (if missing or stale) → clear your session / start a fresh session → run the next command.**
|
|
8
8
|
|
|
9
9
|
Two principles this protocol encodes (do not relitigate — they are locked product
|
|
10
10
|
decisions):
|
|
@@ -18,7 +18,7 @@ decisions):
|
|
|
18
18
|
session, so the findings digest and any fix decision land where the context to act on
|
|
19
19
|
them still exists. This holds for auto-verify too: the stage skill dispatches the
|
|
20
20
|
clean-room verify (and any autoFix) at stage end, in-session, before the exit — it is
|
|
21
|
-
**not** deferred to the navigator, which runs *after* the
|
|
21
|
+
**not** deferred to the navigator, which runs *after* the session clear with none of the
|
|
22
22
|
authoring context. Clearing first throws that context away.
|
|
23
23
|
|
|
24
24
|
## How this file is used
|
|
@@ -47,8 +47,8 @@ an epic member. Only the flags below are stage-specific; pass no others.
|
|
|
47
47
|
|---|---|---|
|
|
48
48
|
| `forge-0-epic` | `forge-0-epic` | `--next-feature "{member}"` when a concrete member exists |
|
|
49
49
|
| `forge-1-prd` … `forge-4-backlog` | that stage's own id | none beyond identity/capability |
|
|
50
|
-
| `forge-5-loop` | `forge-5-loop` | `--outcome` — one of `complete`, `partial`, `blocked`, `needs-human`, `deferred` |
|
|
51
|
-
| `forge-6-docs` | `forge-6-docs` | `--outcome` — `complete` or `
|
|
50
|
+
| `forge-5-loop` | `forge-5-loop` | `--outcome` — one of `complete`, `partial`, `blocked`, `needs-human`, `deferred`, `resolved`; optional `--cause dependency-starvation` with `--outcome partial` |
|
|
51
|
+
| `forge-6-docs` | `forge-6-docs` | `--outcome` — `complete`, `blocked`, or `skipped` (deliberate docs skip, persisted via `state-skip` before the exit; routes like `complete` with honest wording) |
|
|
52
52
|
| direct `forge-verify` | `forge-verify` | `--owner direct`, `--outcome` (`passed`, `findings`, `skipped`, `failed`), and served-stage metadata |
|
|
53
53
|
| nested `forge-verify` | `forge-verify` | `--owner nested`, plus the same outcome and served-stage metadata |
|
|
54
54
|
| direct/nested `forge-fix` | `forge-fix` | the matching `--owner`, a `FixOutcome` (`no-findings`, `decisions`, `failed`, `applied`, `reverified`, `reverify-findings`, `deferred`), and served-stage metadata |
|
|
@@ -90,19 +90,19 @@ resolves before running the command, exactly as elsewhere.
|
|
|
90
90
|
**Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
|
-
R="$(bash -c 'for d in "${
|
|
93
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
94
94
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
95
|
-
python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host
|
|
95
|
+
python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host generic --verify-capability "{verify-capability}"
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
Obey the DIRECTIVES it prints, in the consumption order this protocol fixes: surface `invalidAutoVerifyKeys` and every `warnings` entry first; `runInStageVerify: true` → run the in-stage clean-room verify chain now (honoring `autoFixEligible`, and asking through the Standard Verify Gate first when you may not dispatch unsolicited); `verifyGate: "standard"` → present the Standard Verify Gate; `verifyGate: "manual-print"` → print the `verifyCommand` for the user and do **not** dispatch inline. Then, and only when `terminalOwnedBy` is `"self"`, **print the NEXT-STEPS block verbatim as your absolute last output — nothing after its sentinel line.** A `terminalOwnedBy: "outer"` payload carries `nextSteps: null`: return your structured result to the caller and print no terminal block at all.
|
|
99
99
|
<!-- END: scripted-stage-exit-stamp -->
|
|
100
100
|
|
|
101
|
-
The stamp is shown with `--host
|
|
101
|
+
The stamp is shown with `--host generic`; the adapter build substitutes `pi`/`generic` per
|
|
102
102
|
target, and §"Host and capability determination" below governs the value. The literal is
|
|
103
|
-
deliberate — `scripts/build-adapters.py` keys its host translation on the exact
|
|
104
|
-
|
|
105
|
-
that line that is not a placeholder.
|
|
103
|
+
deliberate — `scripts/build-adapters.py` keys its host translation on the exact canon
|
|
104
|
+
value of that flag, and the stamp sites are compared byte-for-byte, so it is the one token
|
|
105
|
+
in that line that is not a placeholder.
|
|
106
106
|
|
|
107
107
|
## Host and capability determination
|
|
108
108
|
|
|
@@ -110,12 +110,13 @@ Before the call, compute the two inputs independently. They are unrelated: **a h
|
|
|
110
110
|
implies a capability**, and the script takes `--verify-capability` at face value.
|
|
111
111
|
|
|
112
112
|
**`--host`** describes only the active adapter command surface — `claude`, `pi`, or
|
|
113
|
-
`generic`. It selects command syntax (
|
|
114
|
-
fresh-session wording (
|
|
113
|
+
`generic`. It selects command syntax (Claude's stage-command prefix vs Pi's `/skill:` vs
|
|
114
|
+
host-neutral) and fresh-session wording (Claude's clear command vs Pi's `/new` vs neutral
|
|
115
|
+
prose). Nothing else.
|
|
115
116
|
|
|
116
117
|
**`--verify-capability interactive`** is passed only when **both** of these hold:
|
|
117
118
|
|
|
118
|
-
- **(a)** a question mechanism equivalent to
|
|
119
|
+
- **(a)** a question mechanism equivalent to the host's question mechanism is available, **and**
|
|
119
120
|
- **(b)** a clean-room `forge-verifier` subagent can be dispatched.
|
|
120
121
|
|
|
121
122
|
If either is absent, or capability cannot be established, pass `manual`.
|
|
@@ -151,7 +152,8 @@ production successor** while verification is unresolved.
|
|
|
151
152
|
- a capable Pi session is `--host pi --verify-capability interactive`, and receives the
|
|
152
153
|
same logical gate a capable Claude session does;
|
|
153
154
|
- Pi without a dispatchable verifier is `--host pi --verify-capability manual`;
|
|
154
|
-
- a Claude session that cannot dispatch
|
|
155
|
+
- a Claude session that cannot dispatch keeps the Claude host value with
|
|
156
|
+
`--verify-capability manual`.
|
|
155
157
|
|
|
156
158
|
Interactive gate options keep their explicit labels, their recommended default, and their
|
|
157
159
|
one-line trade-off descriptions (below). The manual path prints the verify command as the
|
|
@@ -199,6 +201,44 @@ second sentinel-terminated block **inside** an outer stage's exit, breaking the
|
|
|
199
201
|
exactly-one-terminal-block rule — and the canon guard cannot catch it, because both
|
|
200
202
|
wordings legitimately appear in the same file. Judge the token, not the phrasing.
|
|
201
203
|
|
|
204
|
+
## Caller-side resumption: the declared resume point
|
|
205
|
+
|
|
206
|
+
The `owner:` token and `terminalOwnedBy` arbitrate who prints — but they specify only
|
|
207
|
+
the **callee** side: a nested skill stays quiet and returns its structured result. This
|
|
208
|
+
section is the reciprocal, caller-side half of that contract.
|
|
209
|
+
|
|
210
|
+
**On a sub-skill's return, the caller re-owns the terminal.** Every closing instruction
|
|
211
|
+
in the callee's own body — its report-and-stop posture, its "confirm the result" close,
|
|
212
|
+
its own next-steps habits — is void for this turn. The caller resumes at its **declared
|
|
213
|
+
resume point**, in the same turn, and its remaining steps run to its own terminal.
|
|
214
|
+
|
|
215
|
+
**Every Skill-tool delegation site declares, at the invocation, what happens on
|
|
216
|
+
return.** Suppression without resumption is the failure mode this section closes: the
|
|
217
|
+
callee's closing posture is the freshest instruction in context while the caller's next
|
|
218
|
+
step is the oldest, so an undeclared return silently ends the run one layer too early —
|
|
219
|
+
the caller's remaining steps (validation, state writes, commit, stage exit) dropped,
|
|
220
|
+
with no error surfaced. An implicit "let it run to its natural stopping point" is that
|
|
221
|
+
bug spelled politely, and it is banned on delegation sites. A site takes one of two
|
|
222
|
+
declared postures:
|
|
223
|
+
|
|
224
|
+
- **Delegate-and-resume** — the callee is a sub-step of the caller: the site names the
|
|
225
|
+
caller's own step that control returns to, and the caller continues there in the same
|
|
226
|
+
turn. The callee never owns the caller's terminal. The worked instance is
|
|
227
|
+
`forge-4-backlog` Step 4's **Return contract** for the `author-backlog` delegation
|
|
228
|
+
(control returns at Step 5; the sub-skill's direct-invocation posture — its approval
|
|
229
|
+
gate and its validate-and-confirm close — is explicitly disapplied on the delegated
|
|
230
|
+
path). New delegation sites follow that pattern rather than re-deriving it.
|
|
231
|
+
- **Terminal handoff** — the caller's job ends at the invocation and the invoked skill
|
|
232
|
+
owns the terminal from there on (e.g. the navigator's `autoInvokeNextStage`
|
|
233
|
+
"continue in this session" advance into the next production stage). Declaring the
|
|
234
|
+
handoff is what keeps it distinct from an accidental drop.
|
|
235
|
+
|
|
236
|
+
Scope: this contract governs **Skill-tool delegation within one session**. The
|
|
237
|
+
truncated-verifier-return guard (forge-verify's `findings-template.md`, "Truncated
|
|
238
|
+
Verifier Returns") is a different mechanism — it polices what an **Agent-dispatched
|
|
239
|
+
subagent's** return payload must contain, not where a caller resumes. A dispatch site
|
|
240
|
+
can be subject to both; satisfy each on its own terms.
|
|
241
|
+
|
|
202
242
|
## Directive consumption order
|
|
203
243
|
|
|
204
244
|
`stage-exit` emits a DIRECTIVES object and (for a direct owner) a NEXT-STEPS block. The
|
|
@@ -243,7 +283,7 @@ reformat, merge, or summarize them, and never dump the state file they were deri
|
|
|
243
283
|
|
|
244
284
|
Auto-verify is effective for this stage and verification is outstanding — verify **now,
|
|
245
285
|
in this session** (principle #2 applied to auto-verify: the digest and any fix decision
|
|
246
|
-
land here, where the authoring context still exists — not deferred to a post
|
|
286
|
+
land here, where the authoring context still exists — not deferred to a post-clear
|
|
247
287
|
navigator). The `auto-verify-pending` debt is already durable on disk at this point, so a
|
|
248
288
|
declined or deferred gate leaves recorded debt rather than a silent pass.
|
|
249
289
|
|
|
@@ -252,7 +292,7 @@ declined or deferred gate leaves recorded debt rather than a silent pass.
|
|
|
252
292
|
same path the navigator uses (`skills/forge-verify/SKILL.md`). Dispatch it
|
|
253
293
|
**synchronously and await its digest inline** — do **not** run it in the background or
|
|
254
294
|
announce it as "still running"; the digest and any fix decision must land in this
|
|
255
|
-
session. It inherits none of this session's context, so no
|
|
295
|
+
session. It inherits none of this session's context, so no session clear is needed and only
|
|
256
296
|
a compact digest returns.
|
|
257
297
|
**If you may not dispatch unsolicited**, present the consent form of the Standard
|
|
258
298
|
Verify Gate first and dispatch on the affirmative choice — see "Consent variant on a
|
|
@@ -299,7 +339,11 @@ first:
|
|
|
299
339
|
a stage's artifact commit.
|
|
300
340
|
- **Skip for now** — go straight to the NEXT-STEPS block without verifying. Record this
|
|
301
341
|
stage's verify status as `skipped` in pipeline state (via `state-verify`, never by hand)
|
|
302
|
-
**only** on an explicit skip — a skip does not go stale.
|
|
342
|
+
**only** on an explicit skip — a skip does not go stale. Exception: if the existing
|
|
343
|
+
entry records `passed` or `findings-applied` (a resolved result whose freshness has
|
|
344
|
+
merely lapsed), write **nothing** — `state-verify` refuses to demote a resolved status
|
|
345
|
+
to `skipped` (#203), and the recorded result stands on its own; the user's decline is
|
|
346
|
+
honored by simply not re-verifying.
|
|
303
347
|
|
|
304
348
|
**Advancement is allowed only after a pass, or after an explicit skip has been
|
|
305
349
|
persisted.** Choosing to stop, or losing the interaction, produces no advancing terminal
|
|
@@ -358,8 +402,8 @@ directive is informational — you do **not** re-derive the wording:
|
|
|
358
402
|
unchanged; the block appends a non-blocking reminder line ("You also flagged N epic
|
|
359
403
|
change(s) to reconcile when convenient …"). This is *finish-then-edit*.
|
|
360
404
|
|
|
361
|
-
Either way the added lines are host-neutral (no
|
|
362
|
-
sentinel; just print the NEXT-STEPS block verbatim as always.
|
|
405
|
+
Either way the added lines are host-neutral (they name no fresh-session command) and sit
|
|
406
|
+
**above** the sentinel; just print the NEXT-STEPS block verbatim as always.
|
|
363
407
|
|
|
364
408
|
### Deferred decisions — do not solicit next-stage decisions at this exit
|
|
365
409
|
|
|
@@ -376,7 +420,7 @@ a `deferredDecisions[]` entry on this feature's `.pipeline-state.json` by runnin
|
|
|
376
420
|
epic member — required, per the Pipeline State Protocol in `references/shared-conventions.md`:
|
|
377
421
|
|
|
378
422
|
```bash
|
|
379
|
-
R="$(bash -c 'for d in "${
|
|
423
|
+
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
380
424
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
381
425
|
python3 "$R/scripts/forge-session.py" state-decision \
|
|
382
426
|
--feature "{feature}" --question "<phrased for the target stage>" \
|
|
@@ -12,9 +12,12 @@ Usage:
|
|
|
12
12
|
python3 epic-manifest.py render-status <epic> [--specs-dir DIR] [--json]
|
|
13
13
|
python3 epic-manifest.py add-feature <epic> <name> --charter TEXT \
|
|
14
14
|
[--depends-on A,B] [--specs-dir DIR] [--json]
|
|
15
|
+
python3 epic-manifest.py adopt-feature <epic> <name> [--charter TEXT] \
|
|
16
|
+
[--depends-on A,B] [--specs-dir DIR] [--json]
|
|
15
17
|
python3 epic-manifest.py remove-feature <epic> <name> [--specs-dir DIR] [--json]
|
|
16
18
|
python3 epic-manifest.py reorder <epic> --order A,B,C [--specs-dir DIR] [--json]
|
|
17
19
|
python3 epic-manifest.py set-dep <epic> <name> --depends-on A,B [--specs-dir DIR] [--json]
|
|
20
|
+
python3 epic-manifest.py set-charter <epic> <name> --charter TEXT [--specs-dir DIR] [--json]
|
|
18
21
|
python3 epic-manifest.py set-status <epic> --status STATE [--specs-dir DIR] [--json]
|
|
19
22
|
|
|
20
23
|
Exit codes:
|
|
@@ -179,6 +182,12 @@ class FeatureStatus(TypedDict):
|
|
|
179
182
|
blockingEpicChangeRequests: The subset of ``openEpicChangeRequests`` with
|
|
180
183
|
``blocksCurrent == true`` (pause-now, reconcile-before-specs). Always
|
|
181
184
|
``<= openEpicChangeRequests``.
|
|
185
|
+
docsStatus: The member's recorded ``stages["forge-6-docs"].status``, or
|
|
186
|
+
None when absent/malformed. DISTINCT from the orchestration rollup
|
|
187
|
+
(which reads forge-5-loop + impl verify and deliberately ignores
|
|
188
|
+
docs): consumers gating a DOCUMENTATION decision — the epic-level
|
|
189
|
+
doc offer (#173) — read this, treating ``complete`` and ``skipped``
|
|
190
|
+
(#197's deliberate skip) both as docs-settled.
|
|
182
191
|
"""
|
|
183
192
|
|
|
184
193
|
name: str
|
|
@@ -188,6 +197,7 @@ class FeatureStatus(TypedDict):
|
|
|
188
197
|
unmetDeps: list[str]
|
|
189
198
|
openEpicChangeRequests: int
|
|
190
199
|
blockingEpicChangeRequests: int
|
|
200
|
+
docsStatus: str | None
|
|
191
201
|
|
|
192
202
|
|
|
193
203
|
class Rollup(TypedDict):
|
|
@@ -390,7 +400,8 @@ def atomic_write(path: Path, data: dict) -> None:
|
|
|
390
400
|
and fsyncs it, then ``os.replace`` swaps it into place. ``os.replace`` is
|
|
391
401
|
atomic on POSIX within a single filesystem, so an interrupted write never
|
|
392
402
|
leaves a partial or corrupt manifest (REQ-ROBUST-03). Concurrent multi-
|
|
393
|
-
session mutation is out of scope (single-writer assumed, PRD REQ-ROBUST-03
|
|
403
|
+
session mutation is out of scope (single-writer assumed, PRD REQ-ROBUST-03;
|
|
404
|
+
decision record: references/decisions/single-writer-threat-model.md, #180).
|
|
394
405
|
|
|
395
406
|
Args:
|
|
396
407
|
path: The destination manifest path (e.g. {epic}/epic-manifest.json).
|
|
@@ -1202,6 +1213,13 @@ def derive_status(feature_dir: Path) -> FeatureStatus:
|
|
|
1202
1213
|
open_count = len(open_reqs)
|
|
1203
1214
|
blocking_count = sum(1 for r in open_reqs if r.get("blocksCurrent") is True)
|
|
1204
1215
|
|
|
1216
|
+
# Docs state for the epic-level doc offer gate (#173). Read directly rather
|
|
1217
|
+
# than folded into `derived`: docs completeness is deliberately invisible to
|
|
1218
|
+
# the orchestration rollup, and conflating them is the bug this field fixes.
|
|
1219
|
+
stages = state.get("stages", {})
|
|
1220
|
+
docs = stages.get("forge-6-docs") if isinstance(stages, dict) else None
|
|
1221
|
+
docs_status = docs.get("status") if isinstance(docs, dict) else None
|
|
1222
|
+
|
|
1205
1223
|
return {
|
|
1206
1224
|
"name": name,
|
|
1207
1225
|
"stage": stage,
|
|
@@ -1210,6 +1228,7 @@ def derive_status(feature_dir: Path) -> FeatureStatus:
|
|
|
1210
1228
|
"unmetDeps": [],
|
|
1211
1229
|
"openEpicChangeRequests": open_count,
|
|
1212
1230
|
"blockingEpicChangeRequests": blocking_count,
|
|
1231
|
+
"docsStatus": docs_status if isinstance(docs_status, str) else None,
|
|
1213
1232
|
}
|
|
1214
1233
|
|
|
1215
1234
|
|
|
@@ -1232,14 +1251,16 @@ def _next_production_stage(state: dict) -> str | None:
|
|
|
1232
1251
|
The epic-side mirror of ``next_stage()`` in forge-session.py, and for the same
|
|
1233
1252
|
reason its docstring gives: "what runs next" is DERIVED from ``stages[].status``,
|
|
1234
1253
|
never read from the stored ``currentStage``. A missing, pending, in-progress or
|
|
1235
|
-
stale stage all count as "not done"
|
|
1254
|
+
stale stage all count as "not done"; ``complete`` and ``skipped`` both count as
|
|
1255
|
+
done (``skipped`` is legal only on forge-6-docs — schema ``docsStageEntry`` —
|
|
1256
|
+
so a deliberately docs-skipped member is never re-offered forge-6-docs, #197).
|
|
1236
1257
|
"""
|
|
1237
1258
|
stages = state.get("stages")
|
|
1238
1259
|
if not isinstance(stages, dict):
|
|
1239
1260
|
return _PRODUCTION_STAGES[0]
|
|
1240
1261
|
for stage in _PRODUCTION_STAGES:
|
|
1241
1262
|
entry = stages.get(stage)
|
|
1242
|
-
if not isinstance(entry, dict) or entry.get("status")
|
|
1263
|
+
if not isinstance(entry, dict) or entry.get("status") not in ("complete", "skipped"):
|
|
1243
1264
|
return stage
|
|
1244
1265
|
return None
|
|
1245
1266
|
|
|
@@ -1607,6 +1628,52 @@ def set_dep(
|
|
|
1607
1628
|
return _bump_and_write(epic_dir, specs_dir, manifest)
|
|
1608
1629
|
|
|
1609
1630
|
|
|
1631
|
+
def set_charter(
|
|
1632
|
+
epic_dir: Path, specs_dir: Path, name: str, charter: str
|
|
1633
|
+
) -> list[Finding]:
|
|
1634
|
+
"""Replace a member feature's charter text (#166).
|
|
1635
|
+
|
|
1636
|
+
The charter is the member field most likely to need revision after creation
|
|
1637
|
+
(an ADR lands, a boundary moves, a member turns out to own more than
|
|
1638
|
+
expected) — and it previously had no mutator, so edit mode had no sanctioned
|
|
1639
|
+
path to rewrite one. Same shape as ``set_dep``: an atomic, re-validated,
|
|
1640
|
+
revision-bumping replacement. EPIC.md prose is NOT touched — the agent
|
|
1641
|
+
re-syncs the mirror afterward (edit-mode Step E5), exactly as for every
|
|
1642
|
+
other mutation.
|
|
1643
|
+
|
|
1644
|
+
Args:
|
|
1645
|
+
epic_dir: The epic subtree directory.
|
|
1646
|
+
specs_dir: The configured specs directory.
|
|
1647
|
+
name: The member feature to edit.
|
|
1648
|
+
charter: The replacement charter text (argparse requires the flag; an
|
|
1649
|
+
empty string is refused below — a charter is required prose, and
|
|
1650
|
+
blanking it would only manufacture a schema-shaped hole).
|
|
1651
|
+
|
|
1652
|
+
Returns:
|
|
1653
|
+
Empty list on success; blocking findings (not-found / empty-charter, or
|
|
1654
|
+
anything re-validation raises) on refusal — manifest left unchanged.
|
|
1655
|
+
|
|
1656
|
+
Raises:
|
|
1657
|
+
UsageError: Unsafe name, corrupt/missing manifest, or write failure.
|
|
1658
|
+
"""
|
|
1659
|
+
if not charter.strip():
|
|
1660
|
+
return [{"code": "empty-charter",
|
|
1661
|
+
"message": "refusing to blank a charter: pass non-empty --charter text",
|
|
1662
|
+
"feature": name}]
|
|
1663
|
+
manifest = load_manifest(epic_dir)
|
|
1664
|
+
by_name = {
|
|
1665
|
+
f["name"]: f
|
|
1666
|
+
for f in manifest.get("features", [])
|
|
1667
|
+
if isinstance(f, dict) and isinstance(f.get("name"), str)
|
|
1668
|
+
}
|
|
1669
|
+
if name not in by_name:
|
|
1670
|
+
return [{"code": "not-found",
|
|
1671
|
+
"message": f"feature {name!r} is not a member of epic {epic_dir.name!r}",
|
|
1672
|
+
"feature": name}]
|
|
1673
|
+
by_name[name]["charter"] = charter
|
|
1674
|
+
return _bump_and_write(epic_dir, specs_dir, manifest)
|
|
1675
|
+
|
|
1676
|
+
|
|
1610
1677
|
def set_status(epic_dir: Path, specs_dir: Path, status: str) -> list[Finding]:
|
|
1611
1678
|
"""Set the epic-level lifecycle status.
|
|
1612
1679
|
|
|
@@ -1919,7 +1986,8 @@ def _dispatch(args: argparse.Namespace, specs_dir: Path) -> int:
|
|
|
1919
1986
|
return 0
|
|
1920
1987
|
|
|
1921
1988
|
# Mutators ---------------------------------------------------------------
|
|
1922
|
-
if cmd in {"add-feature", "remove-feature", "reorder", "set-dep", "set-
|
|
1989
|
+
if cmd in {"add-feature", "remove-feature", "reorder", "set-dep", "set-charter",
|
|
1990
|
+
"set-status"}:
|
|
1923
1991
|
epic_dir = contained_path(specs_dir, args.epic)
|
|
1924
1992
|
if cmd == "add-feature":
|
|
1925
1993
|
findings = add_feature(
|
|
@@ -1934,6 +2002,8 @@ def _dispatch(args: argparse.Namespace, specs_dir: Path) -> int:
|
|
|
1934
2002
|
findings = set_dep(
|
|
1935
2003
|
epic_dir, specs_dir, args.name, _split_list(args.depends_on)
|
|
1936
2004
|
)
|
|
2005
|
+
elif cmd == "set-charter":
|
|
2006
|
+
findings = set_charter(epic_dir, specs_dir, args.name, args.charter)
|
|
1937
2007
|
else: # set-status
|
|
1938
2008
|
findings = set_status(epic_dir, specs_dir, args.status)
|
|
1939
2009
|
if findings:
|
|
@@ -2028,6 +2098,14 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
2028
2098
|
add_specs_dir(p_setdep)
|
|
2029
2099
|
add_json(p_setdep)
|
|
2030
2100
|
|
|
2101
|
+
# set-charter ----------------------------------------------------------- #
|
|
2102
|
+
p_setcharter = sub.add_parser("set-charter", help="Replace a feature's charter")
|
|
2103
|
+
p_setcharter.add_argument("epic")
|
|
2104
|
+
p_setcharter.add_argument("name")
|
|
2105
|
+
p_setcharter.add_argument("--charter", required=True, help="Replacement charter text")
|
|
2106
|
+
add_specs_dir(p_setcharter)
|
|
2107
|
+
add_json(p_setcharter)
|
|
2108
|
+
|
|
2031
2109
|
# set-status ------------------------------------------------------------ #
|
|
2032
2110
|
p_setstatus = sub.add_parser("set-status", help="Set the epic lifecycle status")
|
|
2033
2111
|
p_setstatus.add_argument("epic")
|