@garygentry/feature-forge 0.3.2 → 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-state-schema.json +50 -0
- package/adapters/claude/references/forge-config-schema.json +18 -0
- 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 +1124 -26
- 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 +18 -0
- 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 +18 -0
- 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 +1124 -26
- 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 +18 -0
- 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 +18 -0
- 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 +1124 -26
- 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 +18 -0
- 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 +18 -0
- 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 +1124 -26
- 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 +18 -0
- 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 +18 -0
- 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 +1124 -26
- 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 +18 -0
- 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 +18 -0
- 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 +1124 -26
- 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 +18 -0
- 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/package.json +1 -1
|
@@ -33,6 +33,35 @@ Detailed checklist for the **backlog** verification mode, loaded by the `forge-v
|
|
|
33
33
|
- [ ] **CHECK-B18**: Items that depend on types/interfaces reference the item that creates them
|
|
34
34
|
- [ ] **CHECK-B19**: Priority ordering is consistent with dependency ordering (dependencies should have equal or higher priority)
|
|
35
35
|
|
|
36
|
+
### Dependency Topology
|
|
37
|
+
- [ ] **CHECK-B28**: **Fragile dependency topology — a single root gates a large fraction of the
|
|
38
|
+
backlog, or the chain is deep** (#194). *Advisory heuristic — severity `improvement`, **never**
|
|
39
|
+
`error`/`gap`, and it **never blocks**. **not-applicable** when no trigger fires or the graph is
|
|
40
|
+
trivial (0–1 items, or no dependsOn edges at all).* A backlog where one root item gates most of
|
|
41
|
+
the tree, or whose critical chain is deep relative to its size, has a single point of near-total
|
|
42
|
+
failure: one defect in that root (or anywhere on the long chain) strands the dependent subtree —
|
|
43
|
+
the loop-recovery incident was 3 roots gating 81% of 16 items down a 13-deep chain, and it passed
|
|
44
|
+
both authoring and verification without comment. Verify by computing, never by eyeballing:
|
|
45
|
+
1. **Compute the topology.** Feed the runner's item array to the scripted metric:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
rauf backlog list . --backlog {resolvedBacklogDir} --json | python3 "$R/scripts/forge-session.py" backlog-topology --items-stdin --json
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Read `itemCount`, `rootCount`, `roots[].gatedCount`, `maxChainDepth`, and `warnings`. If
|
|
52
|
+
`itemCount <= 1` or there are no `dependsOn` edges, this check is **not-applicable**.
|
|
53
|
+
2. **Read the warnings, do not re-derive them.** The metric applies the fixed thresholds
|
|
54
|
+
(`single-root-fanout` when any root gates ≥50% of items; `chain-depth` when `maxChainDepth`
|
|
55
|
+
≥50% of item count). If `warnings` is empty, record **pass** (topology computed, no fragile
|
|
56
|
+
shape). Do not invent a different threshold — the constants are canonical
|
|
57
|
+
(`forge-session.py`).
|
|
58
|
+
3. **Report each fired warning as one `improvement` finding.** For `single-root-fanout`, name the
|
|
59
|
+
root and its `gatedCount`/`itemCount` ("root 1 gates 13/16 items") and suggest splitting that
|
|
60
|
+
root's subtree or introducing an intermediate. For `chain-depth`, name
|
|
61
|
+
`maxChainDepth`/`itemCount` and suggest flattening. **Report, do not repair** — this is a
|
|
62
|
+
heads-up to the author, never a blocking gate. Cite the metric output the claim was derived
|
|
63
|
+
from.
|
|
64
|
+
|
|
36
65
|
### Completeness
|
|
37
66
|
- [ ] **CHECK-B20**: There is an item for the initial package scaffold
|
|
38
67
|
- [ ] **CHECK-B21**: There is an item for shared types and error hierarchy
|
|
@@ -95,3 +124,47 @@ Detailed checklist for the **backlog** verification mode, loaded by the `forge-v
|
|
|
95
124
|
> provenance. Any item asserting a human-gated lifecycle state must trace — via `dependsOn` — to the
|
|
96
125
|
> item that legitimately produces it, or assert the state through a dev-build / fixture path instead.
|
|
97
126
|
|
|
127
|
+
### Work-Order Cardinality
|
|
128
|
+
|
|
129
|
+
> **When this fires:** only when the backlog, or an artifact the backlog derives from,
|
|
130
|
+
> **declares an enumerated per-item work list that claims to cover a set**. A backlog
|
|
131
|
+
> with no such list yields **not-applicable** — absence of a declared list is never a
|
|
132
|
+
> hard fail. The defect this catches is not a wrong item; it is a **missing** one, and
|
|
133
|
+
> a missing entry is invisible to every reader who checks the entries that are present.
|
|
134
|
+
|
|
135
|
+
- [ ] **CHECK-B29**: **A declared per-item work list covers the whole set it claims — name what is missing** (#170).
|
|
136
|
+
*Heuristic with a mechanical method — **not-applicable** when no enumerated per-item work
|
|
137
|
+
list is declared anywhere in the backlog or the artifacts it derives from; absence is
|
|
138
|
+
**never a hard fail**. A true omission is a `gap` (blocking): an unreviewed member is
|
|
139
|
+
missing coverage.* When the backlog — or an artifact it derives from, such as a
|
|
140
|
+
hand-authored work order, a per-item review sheet, a "one entry per item" table in a
|
|
141
|
+
plan the backlog cites, or a stated total in a summary line — declares an enumerated
|
|
142
|
+
list **claiming coverage of a set**, the list's cardinality must be **re-derived from
|
|
143
|
+
the actual member set** and never trusted from the list's own header, its numbering, or
|
|
144
|
+
a stated total. In the incident behind this check a hand-authored work order enumerated
|
|
145
|
+
**15 of 16** artifacts; it passed authoring and a full review, and the dropped
|
|
146
|
+
sixteenth would have been published unreviewed. Verify by re-deriving, never by
|
|
147
|
+
eyeballing:
|
|
148
|
+
1. **Find the declared lists.** Scan the backlog and the artifacts it cites for an
|
|
149
|
+
enumerated list that claims coverage of a nameable set — one entry per backlog item,
|
|
150
|
+
per spec document, per requirement id, per generated artifact, per file to touch. The
|
|
151
|
+
coverage claim reads as "one per …", "all …", "every …", "each …", or as a stated
|
|
152
|
+
total ("16 artifacts", "covers the full set"). If **no** such list exists, this check
|
|
153
|
+
is **not-applicable** — record it and move on.
|
|
154
|
+
2. **Re-derive the member set from its own source of record.** Build the actual set
|
|
155
|
+
independently of the list: backlog items from `backlog.json`, spec documents from the
|
|
156
|
+
spec directory listing, requirement ids from the PRD, artifacts from the paths the
|
|
157
|
+
items name. Count what you built; do not adopt any count the list asserts about
|
|
158
|
+
itself.
|
|
159
|
+
3. **Difference both directions and name every discrepancy.** Report each member of the
|
|
160
|
+
re-derived set that has **no** entry in the declared list **by name** — the item id,
|
|
161
|
+
file path, or requirement id — never as a count delta ("one short", "off by one"),
|
|
162
|
+
which hands the reader back exactly the derivation this check just performed. Report
|
|
163
|
+
the reverse direction too: a list entry naming something absent from the re-derived
|
|
164
|
+
set is a stale entry.
|
|
165
|
+
4. **Severity, and what to report.** A named omission is a `gap`. A stale entry, or a
|
|
166
|
+
stated total that disagrees with a list whose membership is nevertheless complete, is
|
|
167
|
+
an `inconsistency`. Every finding names the list, the source of record the set was
|
|
168
|
+
re-derived from, and each missing or stale member by name. **Report, do not repair** —
|
|
169
|
+
authoring the missing entry belongs to the fix pass.
|
|
170
|
+
|
|
@@ -46,3 +46,88 @@ Detailed checklist for the **impl** verification mode, loaded by the `forge-veri
|
|
|
46
46
|
- [ ] **CHECK-I22**: **Runtime-required bootstrap has a non-test caller.** Every exported bootstrap / `init*` / singleton-populator the specs mark as **required for runtime** must have ≥1 **non-test** call site on a runtime path — an entrypoint such as `main` / `instrumentation` / a route / a layout / a worker, NOT only test files. Statically grep for each such symbol's references (use the stack profile `references/stacks/{stack}.md` **Runtime Entrypoints & Bootstrap-Wiring Sites** list for what counts as a runtime entrypoint in this language). A symbol that is exported and covered by tests but referenced **only** from test files is a `gap` — the #121 walking-skeleton (bootstrap wired to nothing). Degrades naturally: a feature whose specs mark no bootstrap symbol as runtime-required is `not-applicable`. Weaker than `CHECK-I21` (it proves a call site exists, not that the boot succeeds), so it complements rather than replaces the smoke.
|
|
47
47
|
- [ ] **CHECK-I23**: **Heavy bootstrap wired into a universal startup entry — recommend lazy init** (#149). *Advisory heuristic — a `gap`/`improvement` at most, **never** a hard fail.* When a runtime-required `init`/bootstrap/singleton-populator is wired into a **framework bootstrap entry that runs on every startup** (a Next.js `instrumentation.ts`, an app-server preload/`register` hook, a global setup module) **and** that init pulls in a **large server-only import graph** (DB clients, ORMs, queue/background workers, telemetry exporters, the whole service layer), recommend moving to **lazy initialization at the entry that already loads that graph** — the first route / handler / worker that needs it — rather than eager wiring at the universal entry. Eager wiring drags the heavy graph into every cold start, and in dev into every module re-evaluation (the watch-loop cost `CHECK-I21` also targets). **Detect statically:** from the stack profile's **Runtime Entrypoints & Bootstrap-Wiring Sites** list, identify this stack's universal bootstrap entries; grep those files for imports of the feature's runtime-required bootstrap symbols (`CHECK-I22`) and for the server-only heavy-import markers the profile names. A match → an `improvement`/`gap` finding naming the entry, the heavy graph it pulls, and the lazier call site to move initialization to. Degrades to `not-applicable` when the stack has no universal bootstrap entry, when no heavy init is wired there, or when the profile lists no bootstrap-wiring sites — **report, do not repair.**
|
|
48
48
|
|
|
49
|
+
### Work-Order Cardinality
|
|
50
|
+
|
|
51
|
+
> **When this fires:** only when the implementation ships or cites an **enumerated work
|
|
52
|
+
> order, coverage list, or inventory that claims to cover a set of artifacts** — a
|
|
53
|
+
> per-file work order, a "files changed" table, a per-artifact review checklist, an
|
|
54
|
+
> inventory table in a spec this implementation realizes, or a registry constant in code
|
|
55
|
+
> that claims to list every member of a class. No such list yields **not-applicable**;
|
|
56
|
+
> absence is never a hard fail.
|
|
57
|
+
|
|
58
|
+
- [ ] **CHECK-I24**: **A declared work order or coverage list covers the whole artifact set it claims — name what is missing** (#170).
|
|
59
|
+
*Heuristic with a mechanical method — **not-applicable** when the implementation declares
|
|
60
|
+
no enumerated work order, coverage list, or registry claiming full coverage; absence is
|
|
61
|
+
**never a hard fail**. A true omission is a `gap` (blocking): an unreviewed artifact is
|
|
62
|
+
missing coverage.* Any declared work order or coverage list must be checked against the
|
|
63
|
+
**actual artifact set it claims to cover**, with omissions named. The incident behind
|
|
64
|
+
this check is a hand-authored work order that enumerated **15 of 16** artifacts: the
|
|
65
|
+
sixteenth was never reviewed and would have shipped, because every reviewer worked the
|
|
66
|
+
list that was in front of them. Verify by re-deriving, never by reading the list back to
|
|
67
|
+
itself:
|
|
68
|
+
1. **Find the declared lists.** Look for enumerated lists claiming coverage of a set:
|
|
69
|
+
a work order or handoff enumerating files to change, a "files changed" or "artifacts
|
|
70
|
+
touched" table, a per-artifact review or sign-off checklist, an inventory table in an
|
|
71
|
+
implementation spec, and **registry-shaped constants in code** — a tuple, array, or
|
|
72
|
+
map documented as holding every helper, every adapter target, every generated file.
|
|
73
|
+
If no such list exists, this check is **not-applicable**.
|
|
74
|
+
2. **Re-derive the covered set from its source of record.** Enumerate the actual set
|
|
75
|
+
independently: the directory listing for a per-file list, the spec's own file
|
|
76
|
+
inventory for an implementation work order, the on-disk members for a registry
|
|
77
|
+
constant, the test suite's own collected set for a coverage table. A registry claiming
|
|
78
|
+
to hold "every script the skills invoke" is re-derived by finding the invocations, not
|
|
79
|
+
by reading the tuple.
|
|
80
|
+
3. **Difference both directions and name every discrepancy.** Every member of the
|
|
81
|
+
re-derived set with no entry in the declared list is reported **by name** — path,
|
|
82
|
+
symbol, or artifact id — never as a count delta. A list entry pointing at something
|
|
83
|
+
that does not exist is a stale entry, reported the same way.
|
|
84
|
+
4. **Severity, and what to report.** A named omission is a `gap`; a stale entry, or a
|
|
85
|
+
stated total that disagrees with an otherwise complete list, is an `inconsistency`.
|
|
86
|
+
Name the list, the source of record used for the re-derivation, and each missing or
|
|
87
|
+
stale member. This check is deliberately narrower than `CHECK-I01` (which asks whether
|
|
88
|
+
each file the architecture spec lists exists): here the *list itself* is the suspect,
|
|
89
|
+
not the artifacts it names. **Report, do not repair.**
|
|
90
|
+
|
|
91
|
+
### Internal Consistency
|
|
92
|
+
|
|
93
|
+
> **When this fires:** on any artifact that states the same quantity, scope claim, or
|
|
94
|
+
> status **in more than one place** — front matter vs body, a summary block vs the prose
|
|
95
|
+
> below it, a table vs the narrative that explains it, a docstring vs the code it
|
|
96
|
+
> documents. This is deliberately **intra-artifact**: contradictions *between* artifacts
|
|
97
|
+
> are already the subject of the spec-compliance checks above. An artifact that states
|
|
98
|
+
> each quantity exactly once yields **not-applicable** — it degrades naturally, with
|
|
99
|
+
> nothing to compare.
|
|
100
|
+
|
|
101
|
+
- [ ] **CHECK-I25**: **One artifact, one answer — a quantity or claim restated inconsistently inside a single artifact** (#170).
|
|
102
|
+
*Verifier judgment — read and compare; no extractor runs (deliberately, this milestone).
|
|
103
|
+
**not-applicable** when nothing is restated. Severity defaults to `inconsistency`
|
|
104
|
+
(advisory) and escalates to `error` only when the contradiction is decision-bearing, per
|
|
105
|
+
the severity conventions in the verify skill.* An artifact can be internally false while
|
|
106
|
+
every cross-artifact check passes: in the incident behind this check, one artifact
|
|
107
|
+
asserted a claim held **universally**, while its own body — two sections below — stated
|
|
108
|
+
the correct **4-of-7** breakdown. The false summary survived a full review, propagated
|
|
109
|
+
into generated output, and would have shipped. Verify by comparing the artifact against
|
|
110
|
+
itself:
|
|
111
|
+
1. **Collect the restatements.** Read the artifact end to end and note every place it
|
|
112
|
+
states: a **count or total** ("16 files", "N of M", "all four"), a **scope claim**
|
|
113
|
+
("every", "all", "none", "only", "universal", "always", "never"), a **status claim**
|
|
114
|
+
("complete", "pending", "removed", "supported"), or a **named identifier or version**
|
|
115
|
+
it repeats. Note each statement with its location. Anything stated exactly once is not
|
|
116
|
+
in scope for this check.
|
|
117
|
+
2. **Compare statements about the same subject.** Group the notes by what they describe,
|
|
118
|
+
then compare within each group. Two disagreeing numbers is the obvious hit; the
|
|
119
|
+
costlier one is a **scope word contradicted by the artifact's own detail** — a
|
|
120
|
+
universal claim sitting above a partial breakdown, an "all supported" above a table
|
|
121
|
+
with a gap, a "removed" beside a surviving reference.
|
|
122
|
+
3. **Decide which statement the artifact's own evidence supports.** Prefer the
|
|
123
|
+
**enumerated detail** — the table, the list, the breakdown, the code — over the
|
|
124
|
+
summary that restates it: the summary is the derived form and is usually the one that
|
|
125
|
+
drifted. Say in the finding which statement the evidence supports and why, so the fix
|
|
126
|
+
is unambiguous.
|
|
127
|
+
4. **Set severity deliberately.** Default to `inconsistency` (advisory). Escalate to
|
|
128
|
+
`error` only when the contradiction is **decision-bearing** — a reader acting on the
|
|
129
|
+
wrong statement takes a materially different action, or the wrong statement is copied
|
|
130
|
+
into generated output, a published artifact, or a gate. An inaccuracy confined to a
|
|
131
|
+
comment, a docstring, or test narration stays at `inconsistency` under the severity
|
|
132
|
+
floor. Quote both locations verbatim in the finding. **Report, do not repair.**
|
|
133
|
+
|
|
@@ -45,7 +45,7 @@ Detailed checklist for the **specs** verification mode, loaded by the `forge-ver
|
|
|
45
45
|
- [ ] **CHECK-S26**: Import paths match actual package export maps
|
|
46
46
|
|
|
47
47
|
### Edge Cases and Non-Functional
|
|
48
|
-
- [ ] **CHECK-S27**: Concurrent access scenarios are addressed if relevant
|
|
48
|
+
- [ ] **CHECK-S27**: Concurrent access scenarios are addressed if relevant (a PRD position of "out of scope — single writer assumed" is a complete answer; for forge state writes the standing decision is `references/decisions/single-writer-threat-model.md` — cite it, do not design a mechanism)
|
|
49
49
|
- [ ] **CHECK-S28**: Empty/null/undefined inputs are handled
|
|
50
50
|
- [ ] **CHECK-S29**: Performance-sensitive paths are identified
|
|
51
51
|
- [ ] **CHECK-S30**: Security considerations from PRD are reflected in implementation
|
|
@@ -64,3 +64,45 @@ Detailed checklist for the **specs** verification mode, loaded by the `forge-ver
|
|
|
64
64
|
|
|
65
65
|
> **A quoted foreign requirement id is not an orphan.** A suite may legitimately mention a `REQ-` id it does not own — most often when a spec quotes an antecedent feature's test docstrings verbatim. Such ids may be declared, one per line, in `{resolvedFeatureDir}/.traceability-allowlist` (blank lines and `#` comments ignored), or passed as a repeatable `--allow-orphan REQ-ID` to `scripts/validate-traceability.py`. Allowed ids are reported as `ALLOWED FOREIGN REFERENCES` (`allowed_orphans` under `--json`) rather than silently dropped, and an entry matching nothing is reported as `STALE ALLOWLIST ENTRIES` (`unused_allowlist_entries`), which is advisory and does not fail the check. Before filing an orphaned reference as a finding, check whether it is already declared there — a declared id is a recorded decision, not a defect.
|
|
66
66
|
|
|
67
|
+
### Internal Consistency
|
|
68
|
+
|
|
69
|
+
> **When this fires:** on any single spec document that states the same quantity, scope
|
|
70
|
+
> claim, or status **in more than one place** — a Requirement Coverage table vs the
|
|
71
|
+
> sections it points at, a summary or overview paragraph vs the detail below it, a
|
|
72
|
+
> Dependencies list vs the cross-references in the body, a stated count of documents or
|
|
73
|
+
> types vs the list actually enumerated. It is **intra-document**: a contradiction
|
|
74
|
+
> *between* two spec documents is already covered by the tech-spec-consistency and
|
|
75
|
+
> cross-reference checks above. A document that states each quantity exactly once yields
|
|
76
|
+
> **not-applicable**.
|
|
77
|
+
|
|
78
|
+
- [ ] **CHECK-S39**: **One document, one answer — a quantity or claim restated inconsistently inside a single spec** (#170).
|
|
79
|
+
*Verifier judgment — read and compare; no extractor runs (deliberately, this milestone).
|
|
80
|
+
**not-applicable** when nothing is restated. Severity defaults to `inconsistency`
|
|
81
|
+
(advisory) and escalates to `error` only when the contradiction is decision-bearing, per
|
|
82
|
+
the severity conventions in the verify skill.* A spec document can contradict itself
|
|
83
|
+
while every cross-document check passes: in the incident behind this check, one artifact
|
|
84
|
+
asserted a claim held **universally**, while its own body — two sections below — stated
|
|
85
|
+
the correct **4-of-7** breakdown. The summary was the part downstream artifacts copied.
|
|
86
|
+
Verify by comparing the document against itself:
|
|
87
|
+
1. **Collect the restatements.** Note every place the document states a **count or
|
|
88
|
+
total** ("five documents", "N of M", "all three subcommands"), a **scope claim**
|
|
89
|
+
("every", "all", "none", "only", "universal", "always", "never"), a **status claim**
|
|
90
|
+
("out of scope", "deferred", "removed", "required"), or a **repeated identifier**
|
|
91
|
+
(a type name, a file path, a requirement id, a constant's value). Record each with its
|
|
92
|
+
location. Anything stated exactly once is not in scope for this check.
|
|
93
|
+
2. **Compare statements about the same subject.** Group by subject and compare within
|
|
94
|
+
each group. Watch specifically for: a Requirement Coverage table row pointing at a
|
|
95
|
+
section that no longer makes that claim; a count in an overview that disagrees with
|
|
96
|
+
the list enumerated below it; a scope word ("all", "universal", "never") that the
|
|
97
|
+
document's own breakdown contradicts; a constant given one value in a type definition
|
|
98
|
+
and another in prose.
|
|
99
|
+
3. **Decide which statement the document's own evidence supports.** Prefer the
|
|
100
|
+
**enumerated detail** — the table, the type definition, the numbered list — over the
|
|
101
|
+
summary that restates it. Name in the finding which statement the evidence supports,
|
|
102
|
+
so the fix does not have to re-derive it.
|
|
103
|
+
4. **Set severity deliberately.** Default to `inconsistency` (advisory). Escalate to
|
|
104
|
+
`error` only when the contradiction is **decision-bearing**: an implementer building
|
|
105
|
+
from the wrong statement writes different code, or the wrong statement is what a
|
|
106
|
+
downstream artifact or generated output copies. Quote both locations verbatim.
|
|
107
|
+
**Report, do not repair.**
|
|
108
|
+
|
|
@@ -11,6 +11,8 @@ You are the "second set of eyes." You receive artifacts (PRDs, tech specs, imple
|
|
|
11
11
|
|
|
12
12
|
You have READ-ONLY access. You cannot and should not modify any files. Your output is returned as your response — the parent agent handles writing the findings document to disk.
|
|
13
13
|
|
|
14
|
+
**Your last message is the only thing the parent receives.** The host's subagent mechanism returns your final response and nothing else — no transcript, no intermediate messages, no tool results. If your run ends on a status or transition line ("Let me read the dispatch handler table."), *that line* is the entire verification result the parent gets, and the digest you spent the whole run building is silently dropped (issue #183). Your final response must therefore BE the complete report — the full Output Format block below, starting at `# Verification Report:` — never a summary of it, never an opening line, never "the report follows." Before ending, check your last message: if it is not the complete report, emit the complete report.
|
|
15
|
+
|
|
14
16
|
**You ARE the verifier — you never dispatch one.** You have no Agent/host's subagent mechanism. Your pre-loaded `forge-verify` skill contains a "Subagent Delegation (parent orchestrator only)" section describing how a *parent* dispatches a `forge-verifier` — that guidance is for the parent, not for you. Ignore it: do not attempt to delegate, spawn a subagent, or return a "verification is running / will surface shortly" placeholder. Execute the verification checks yourself and return the findings block. Delegating from here is a self-referential loop that produces no work and no findings artifact.
|
|
15
17
|
|
|
16
18
|
## How You Work
|
|
@@ -53,7 +55,7 @@ At the end of each verification pass, update your memory with any new patterns y
|
|
|
53
55
|
|
|
54
56
|
## Output Format
|
|
55
57
|
|
|
56
|
-
Return your findings as your final response using exactly this markdown structure. The parent agent will write it to `.verification/VERIFY-{mode}-{date}.md`:
|
|
58
|
+
Return your findings as your final response using exactly this markdown structure — the final response IS the report (emit the entire block, not a description of it). The parent agent will write it to `.verification/VERIFY-{mode}-{date}.md`:
|
|
57
59
|
|
|
58
60
|
```markdown
|
|
59
61
|
# Verification Report: {feature} ({mode})
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Decision: single-writer state model — detection welcome, locking out of scope
|
|
2
|
+
|
|
3
|
+
**Decided:** 2026-08-08 · **Issue:** [#180](https://github.com/garygentry/feature-forge/issues/180) · **Owner:** repository owner
|
|
4
|
+
|
|
5
|
+
## The decision
|
|
6
|
+
|
|
7
|
+
Concurrent multi-session mutation of forge state is **out of scope**. Every forge state
|
|
8
|
+
writer — `forge-session.py` (`.pipeline-state.json`) and `epic-manifest.py`
|
|
9
|
+
(`epic-manifest.json`, `.epic-state.json`) — assumes a **single writer**. Atomicity
|
|
10
|
+
(sibling temp file → flush/fsync → `os.replace`) protects against an *interrupted* write;
|
|
11
|
+
it is not, and is not intended to be, mutual exclusion between simultaneous writers.
|
|
12
|
+
|
|
13
|
+
The standing posture is **detection, not locking**:
|
|
14
|
+
|
|
15
|
+
- **No locking mechanism will be added on the authority of a verification finding or a
|
|
16
|
+
single feature's spec.** If concurrent multi-session use ever becomes a supported
|
|
17
|
+
workflow, that is a product decision needing its own PRD — and a state lock alone would
|
|
18
|
+
be false comfort, because git operations, the two-commit provenance protocol, and
|
|
19
|
+
adapter regeneration are equally unsynchronized.
|
|
20
|
+
- **Cheap, opportunistic detection is welcome if someone proposes it** — e.g. an
|
|
21
|
+
epic-root writer re-reading and failing loudly on an unexpected `revision` before
|
|
22
|
+
`os.replace`. It is an explicitly optional hardening, not a requirement, and nothing is
|
|
23
|
+
scheduled.
|
|
24
|
+
|
|
25
|
+
## Accepted residual risk
|
|
26
|
+
|
|
27
|
+
Everything in-session is sequential, and member `.pipeline-state.json` files are
|
|
28
|
+
disjoint. The one real exposure: two sessions working **different members of one epic**
|
|
29
|
+
share two epic-root files, `epic-manifest.json` and `.epic-state.json`. A lost
|
|
30
|
+
read-modify-write increment of the manifest's `revision` can leave it unchanged after a
|
|
31
|
+
semantic mutation landed, and the freshness comparison then classifies a **stale epic
|
|
32
|
+
verification as `fresh`** — a correctness consequence, not just a lost edit.
|
|
33
|
+
|
|
34
|
+
This is **accepted and documented**, not mitigated. Anyone who hits it has this document
|
|
35
|
+
to cite; do not run two concurrent sessions against members of the same epic.
|
|
36
|
+
|
|
37
|
+
## What this means for verification (CHECK-S27)
|
|
38
|
+
|
|
39
|
+
When `CHECK-S27` ("Concurrent access scenarios are addressed if relevant") fires against
|
|
40
|
+
forge state writes, the answer is a **citation, not a design**: cite this document (or
|
|
41
|
+
the per-feature requirement restating it, e.g. `stage-exit-coverage` `REQ-REL-04`,
|
|
42
|
+
`epic-orchestration` `REQ-ROBUST-03`). A PRD silent on concurrency gets a one-sentence
|
|
43
|
+
position recorded; a verifier must never answer the silence by specifying a mechanism.
|
|
44
|
+
|
|
45
|
+
## Provenance
|
|
46
|
+
|
|
47
|
+
Both precedents ran the same check; the only variable was whether the PRD had a position:
|
|
48
|
+
|
|
49
|
+
- `stage-exit-coverage` V-006 raised CHECK-S27 against a silent PRD, was filed as a
|
|
50
|
+
`gap`, and induced a ~140-line portable lock protocol answering no requirement. It was
|
|
51
|
+
removed (`302c93f`), and the PRD now records the position as `REQ-REL-04`.
|
|
52
|
+
- `epic-orchestration` V-008 raised the same check against a PRD that had scoped
|
|
53
|
+
concurrency out (`REQ-ROBUST-03`), was filed as an `improvement`, and cost one sentence.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Feature Forge Epic Verification State",
|
|
4
|
+
"description": "Epic-scoped verification state for a single epic. Lives at {specsDir}/{epic}/.epic-state.json. Written only by forge-session.py's `state-verify` verb for epic targets (`--stage forge-0-epic`, resolved through `_load_epic_state_for_write`) — never by hand. Deliberately NOT a member `.pipeline-state.json` variant: epic verification is epic-scoped, artifact freshness is judged against the epic manifest's `revision` (never a member production-stage `version`), and there is no fallback between the two state files in either direction (REQ-SEC-01).",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["epic", "updatedAt", "stages"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"epic": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "Epic name (matches the directory name under specsDir). epic-manifest.json's own `epic` value is canonical on conflict — the writer refuses a mismatched identity rather than resolving it."
|
|
11
|
+
},
|
|
12
|
+
"updatedAt": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"format": "date-time"
|
|
15
|
+
},
|
|
16
|
+
"stages": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"properties": {
|
|
19
|
+
"forge-verify-epic": { "$ref": "#/definitions/verifyEntry" }
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"definitions": {
|
|
24
|
+
"verifyEntry": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"required": ["status"],
|
|
27
|
+
"description": "MIRROR of pipeline-state-schema.json#/definitions/verifyEntry (minus this description) — the repo's stdlib schema validator (tests/_state_schema.py) resolves same-file `#/definitions/*` refs only, so the definition is duplicated rather than cross-file-referenced, and tests/test_epic_state_schema_conformance.py pins the two definitions equal so they cannot drift. Edit them together.",
|
|
28
|
+
"properties": {
|
|
29
|
+
"status": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"enum": ["pending", "auto-verify-pending", "passed", "findings-reported", "findings-applied", "skipped"]
|
|
32
|
+
},
|
|
33
|
+
"findingsFile": {
|
|
34
|
+
"type": ["string", "null"],
|
|
35
|
+
"description": "Path to the verification findings document"
|
|
36
|
+
},
|
|
37
|
+
"findingsCount": {
|
|
38
|
+
"type": ["integer", "null"],
|
|
39
|
+
"description": "Number of findings reported"
|
|
40
|
+
},
|
|
41
|
+
"verifiedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
42
|
+
"fixedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
43
|
+
"commitHash": { "type": ["string", "null"], "description": "Git commit SHA of the verify/fix artifact commit. Recorded via the two-commit Git Commit Protocol (shared-conventions.md) so it points at the artifact commit, never an orphaned amend." },
|
|
44
|
+
"verifiedStageVersion": { "type": ["integer", "null"], "description": "The production stage's `version` at the moment this verify was resolved. The navigator's freshness ledger compares it to the stage's current `version`: equal means the verify is fresh; a mismatch (artifact revised since) or an absent field (legacy state) means stale, so auto-verify re-fires. Recorded by forge-verify/forge-fix when writing a passed/findings-applied status." },
|
|
45
|
+
"scheduledAt": { "type": ["string", "null"], "format": "date-time", "description": "UTC ISO-8601 timestamp at which unattended in-stage verification was scheduled for this entry. Written alongside the `auto-verify-pending` status and DELETED (not nulled) by any terminal result, so an absent field means 'not scheduled'." },
|
|
46
|
+
"scheduledStageVersion": { "type": ["integer", "null"], "minimum": 1, "description": "The artifact revision current when verification was scheduled — the production stage's `version` for a feature, the epic manifest's `revision` for an epic. Makes rescheduling idempotent (an identical revision does not rewrite the entry) and lets a read tell debt owed on the current artifact from debt stranded on an older one. Deleted by any terminal result." }
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -67,6 +67,12 @@
|
|
|
67
67
|
"default": true,
|
|
68
68
|
"description": "When true (default), the /feature-forge:forge navigator auto-invokes the next pipeline stage via the Skill tool after the user confirms it, instead of only printing the command to copy. Set false to keep the old copy-paste behavior (the navigator suggests the command but never launches it). Ignored on non-Claude hosts, which always fall back to printing the command."
|
|
69
69
|
},
|
|
70
|
+
"docsStage": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"enum": ["prompt", "skip"],
|
|
73
|
+
"default": "prompt",
|
|
74
|
+
"description": "How forge-6-docs' Documentation Decision Gate behaves at stage entry. \"prompt\" (default) asks generate-vs-skip once per run; \"skip\" records the stage as deliberately skipped with no prompt — the skill runs the state-skip verb and closes the pipeline honestly (stage-exit --outcome skipped), so docs are never implied-mandatory for teams that document differently. The gate's refuse-to-erase guard still applies: docs that already exist are never silently reclassified, whatever this is set to. Read directly by forge-6-docs (not part of loopRunner resolution); an unrecognized or absent value behaves as \"prompt\"."
|
|
75
|
+
},
|
|
70
76
|
"autoVerify": {
|
|
71
77
|
"type": "boolean",
|
|
72
78
|
"default": false,
|
|
@@ -195,6 +201,18 @@
|
|
|
195
201
|
"default": "",
|
|
196
202
|
"description": "Project-default coding agent id, so a project can fix its agent once without specifying it every run. Empty string ⇒ no project default (the runner's own default — claude-cli for rauf — applies, behaving exactly as today). Overridden by the per-run agent selector (run > project precedence, resolved inside forge before the single --agent is emitted). Ignored when agentArgument is absent."
|
|
197
203
|
},
|
|
204
|
+
"agentMode": {
|
|
205
|
+
"type": "string",
|
|
206
|
+
"enum": ["prompt", "auto"],
|
|
207
|
+
"default": "prompt",
|
|
208
|
+
"description": "Gates forge-5's Step 2d agent AskUserQuestion. \"prompt\" (default) presents the agent question — byte-identical to today. \"auto\" suppresses ONLY the interactive pick: the agent resolves from defaultAgent (or the runner default when unset), and the availability probe, the verdict classification (UNKNOWN hard-reject before side-effects / UNAVAILABLE proceed-or-choose / probe-failure handling), and the Claude-alias model guard ALL still run; the resolved 'Agent: {id} (source: …)' confirmation line still shows, so the choice is never hidden. Meaningless when agentArgument is absent/empty — that capability gate already removes the entire agent surface, and this field adds no second gate. An unrecognized value behaves as \"prompt\"."
|
|
209
|
+
},
|
|
210
|
+
"reviewMode": {
|
|
211
|
+
"type": "string",
|
|
212
|
+
"enum": ["prompt", "always", "never"],
|
|
213
|
+
"default": "prompt",
|
|
214
|
+
"description": "Gates forge-5's Step 2d Run-mode AskUserQuestion (rauf only — ignored when name != \"rauf\", where no Run-mode question exists). \"prompt\" (default) surfaces the question with the review pass pre-selected — byte-identical to today. \"always\" skips the question and appends --review unconditionally; the rendered command in the confirmation still shows --review, so the choice is never hidden. \"never\" skips the question and launches the bare rendered command. Under \"always\"/\"never\", a NARROWER situational retry-blocked question still surfaces when — and only when — the backlog has blocked items (the --review decision itself is fixed by the mode and never re-asked); with no blocked items the launch is prompt-free. An unrecognized value behaves as \"prompt\"."
|
|
215
|
+
},
|
|
198
216
|
"preconditionFile": {
|
|
199
217
|
"type": "string",
|
|
200
218
|
"default": ".rauf.json",
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "forge-decisions",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"additionalProperties": false,
|
|
6
|
+
"required": ["schemaVersion", "feature", "createdAt", "updatedAt", "decisions"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"schemaVersion": { "type": "string", "enum": ["1"] },
|
|
9
|
+
"feature": { "type": "string" },
|
|
10
|
+
"createdAt": { "type": "string" },
|
|
11
|
+
"updatedAt": { "type": "string" },
|
|
12
|
+
"decisions": { "type": "array", "items": { "$ref": "#/definitions/decision" } }
|
|
13
|
+
},
|
|
14
|
+
"definitions": {
|
|
15
|
+
"decision": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"additionalProperties": false,
|
|
18
|
+
"required": ["itemId", "question", "answer", "deferred", "decidedAt",
|
|
19
|
+
"recordedBy", "appliedAt", "appliedBy"],
|
|
20
|
+
"properties": {
|
|
21
|
+
"itemId": { "type": "string" },
|
|
22
|
+
"question": { "type": "string" },
|
|
23
|
+
"answer": { "type": ["string", "null"] },
|
|
24
|
+
"deferred": { "type": "boolean" },
|
|
25
|
+
"clusterId": { "type": "string" },
|
|
26
|
+
"decidedAt": { "type": "string" },
|
|
27
|
+
"recordedBy": { "type": "string" },
|
|
28
|
+
"appliedAt": { "type": ["string", "null"] },
|
|
29
|
+
"appliedBy": { "type": ["string", "null"] }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"notes": {
|
|
39
39
|
"type": "string",
|
|
40
|
-
"description": "Free-form notes persisted between sessions (user can add context before stepping away)"
|
|
40
|
+
"description": "Free-form notes persisted between sessions (user can add context before stepping away). A single string with latest-note-wins semantics: `state-note` (its only sanctioned writer) OVERWRITES the previous value — an author folds any still-relevant earlier note into the one combined string. Read by the navigator dashboard AND by each downstream stage's Step 1 carried-over note check (forge-2-tech through forge-5-loop), which surfaces it as stage input; it never overrides artifacts or config."
|
|
41
41
|
},
|
|
42
42
|
"epicChangeRequests": {
|
|
43
43
|
"type": "array",
|
|
@@ -127,7 +127,7 @@
|
|
|
127
127
|
"forge-4-backlog": { "$ref": "#/definitions/stageEntry" },
|
|
128
128
|
"forge-verify-backlog": { "$ref": "#/definitions/verifyEntry" },
|
|
129
129
|
"forge-5-loop": { "$ref": "#/definitions/stageEntry" },
|
|
130
|
-
"forge-6-docs": { "$ref": "#/definitions/
|
|
130
|
+
"forge-6-docs": { "$ref": "#/definitions/docsStageEntry" },
|
|
131
131
|
"forge-verify-impl": { "$ref": "#/definitions/verifyEntry" },
|
|
132
132
|
"forge-verify-prd": { "$ref": "#/definitions/verifyEntry" },
|
|
133
133
|
"forge-verify-tech": { "$ref": "#/definitions/verifyEntry" }
|
|
@@ -165,6 +165,38 @@
|
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
167
|
},
|
|
168
|
+
"docsStageEntry": {
|
|
169
|
+
"type": "object",
|
|
170
|
+
"required": ["status"],
|
|
171
|
+
"description": "The forge-6-docs stage entry: identical to stageEntry except that `skipped` is a legal status and `skippedAt` records when the deliberate skip was written (by the `state-skip` verb, never by hand). `skipped` is a terminal, done-for-selection status — the pipeline ends without the stage claiming artifacts it never produced (#197). Deliberately scoped to the docs stage: a skipped PRD or specs stage is not a representable state, so the shared stageEntry enum does NOT carry `skipped`.",
|
|
172
|
+
"properties": {
|
|
173
|
+
"status": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"enum": ["pending", "in-progress", "complete", "stale", "skipped"]
|
|
176
|
+
},
|
|
177
|
+
"version": {
|
|
178
|
+
"type": "integer",
|
|
179
|
+
"description": "Incremented each time this stage's artifacts are revised"
|
|
180
|
+
},
|
|
181
|
+
"artifacts": {
|
|
182
|
+
"type": "array",
|
|
183
|
+
"items": { "type": "string" },
|
|
184
|
+
"description": "Relative paths to artifacts produced by this stage"
|
|
185
|
+
},
|
|
186
|
+
"startedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
187
|
+
"completedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
188
|
+
"skippedAt": { "type": ["string", "null"], "format": "date-time", "description": "UTC ISO-8601 timestamp of the deliberate skip (status: skipped). Written by `state-skip`; absent on every other status." },
|
|
189
|
+
"commitHash": {
|
|
190
|
+
"type": ["string", "null"],
|
|
191
|
+
"description": "Git commit SHA of this stage's artifact commit (Commit 1 of the two-commit Git Commit Protocol in shared-conventions.md). Written by a small follow-up commit so it points at the artifact commit itself, never at an orphaned amend or the hash-recording commit. null until recorded (or when there was no new artifact commit)."
|
|
192
|
+
},
|
|
193
|
+
"basedOnVersions": {
|
|
194
|
+
"type": "object",
|
|
195
|
+
"description": "Upstream stage versions this artifact was built against",
|
|
196
|
+
"additionalProperties": { "type": "integer" }
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
},
|
|
168
200
|
"verifyEntry": {
|
|
169
201
|
"type": "object",
|
|
170
202
|
"required": ["status"],
|
|
@@ -37,7 +37,7 @@ The pipeline compiles a fuzzy feature idea into a machine-executable `backlog.js
|
|
|
37
37
|
**Method:** Clean-context analysis producing actionable findings with an ordered fix plan.
|
|
38
38
|
|
|
39
39
|
**Manual or automatic.** By default the navigator offers verification after each stage. Because
|
|
40
|
-
it runs in a fresh, read-only subagent (clean-room by construction, never needs a
|
|
40
|
+
it runs in a fresh, read-only subagent (clean-room by construction, never needs a session clear), it is
|
|
41
41
|
safe to automate: set `autoVerify: true` (or per-stage via `autoVerifyStages`) in
|
|
42
42
|
`forge.config.json` and the navigator runs `forge-verify` automatically once a stage completes,
|
|
43
43
|
returning only a compact digest to the session. The freshness ledger (verify entries record the
|
|
@@ -118,7 +118,7 @@ they track the current model tier automatically.
|
|
|
118
118
|
|
|
119
119
|
### forge-verifier
|
|
120
120
|
- **Purpose:** Read-only verification of pipeline artifacts
|
|
121
|
-
- **Used by:** `forge-verify` skill (delegation via
|
|
121
|
+
- **Used by:** `forge-verify` skill (delegation via host's subagent mechanism)
|
|
122
122
|
- **Tools:** Read, Glob, Grep, Bash (read-only operations only)
|
|
123
123
|
- **Model:** Opus (judgement-heavy gap/inconsistency analysis)
|
|
124
124
|
- **Memory:** Project-scoped persistent memory — accumulates knowledge about recurring issues and project-specific patterns across sessions
|
|
@@ -58,9 +58,12 @@ defined authoritatively in rauf's
|
|
|
58
58
|
> item aside and **keeps working other runnable items to completion** (rauf:
|
|
59
59
|
> `runner.ts` needs_human handler). So a supervising session can surface those
|
|
60
60
|
> events live (visibility) and cancel early, but it cannot inject an answer and
|
|
61
|
-
> resume the set-aside item mid-run — resolution is
|
|
62
|
-
>
|
|
63
|
-
>
|
|
61
|
+
> resume the set-aside item mid-run — resolution is the **Post-Run Recovery
|
|
62
|
+
> Procedure** (`skills/forge-5-loop/references/recovery-procedure.md`): record the
|
|
63
|
+
> answer via `decision-record` at the moment of collection, then drive recovery
|
|
64
|
+
> from the record after the run ends. A first-class pause/resume-with-answer
|
|
65
|
+
> capability is a desirable runner enhancement (see
|
|
66
|
+
> `plans/rauf-enhancement-recommendations.md`).
|
|
64
67
|
|
|
65
68
|
## rauf is the default and reference implementation
|
|
66
69
|
|