@garygentry/feature-forge 0.3.1 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/adapters/claude/.feature-forge-bundle.json +1 -1
- package/adapters/claude/agents/forge-verifier.md +3 -1
- package/adapters/claude/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/claude/references/epic-manifest-schema.json +6 -1
- package/adapters/claude/references/epic-state-schema.json +50 -0
- package/adapters/claude/references/forge-config-schema.json +19 -1
- package/adapters/claude/references/forge-decisions-schema.json +33 -0
- package/adapters/claude/references/pipeline-state-schema.json +38 -4
- package/adapters/claude/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/references/shared-conventions.md +77 -3
- package/adapters/claude/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/scripts/epic-manifest.py +495 -91
- package/adapters/claude/scripts/fix-sweep.py +1180 -0
- package/adapters/claude/scripts/forge-bootstrap.py +57 -5
- package/adapters/claude/scripts/forge-session.py +4241 -146
- package/adapters/claude/scripts/validate-traceability.py +86 -5
- package/adapters/claude/skills/forge/SKILL.md +10 -9
- package/adapters/claude/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/claude/skills/forge/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-0-epic/SKILL.md +7 -2
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +29 -25
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +5 -0
- package/adapters/claude/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-1-prd/SKILL.md +17 -4
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-2-tech/SKILL.md +18 -4
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-3-specs/SKILL.md +9 -3
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +56 -5
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-5-loop/SKILL.md +67 -69
- package/adapters/claude/skills/forge-5-loop/references/agent-selection.md +16 -0
- package/adapters/claude/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +101 -33
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +26 -6
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-6-docs/SKILL.md +75 -8
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/claude/skills/forge-fix/SKILL.md +119 -33
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +391 -143
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +19 -1
- package/adapters/claude/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-verify/SKILL.md +82 -51
- package/adapters/claude/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/claude/skills/forge-verify/references/findings-template.md +69 -49
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +77 -3
- package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/epic.md +4 -3
- package/adapters/claude/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/claude/skills/forge-verify/references/verification-checklists/specs.md +45 -1
- package/adapters/codex/.feature-forge-bundle.json +1 -1
- package/adapters/codex/agents/forge-verifier.toml +3 -1
- package/adapters/codex/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/codex/references/epic-manifest-schema.json +6 -1
- package/adapters/codex/references/epic-state-schema.json +50 -0
- package/adapters/codex/references/forge-config-schema.json +19 -1
- package/adapters/codex/references/forge-decisions-schema.json +33 -0
- package/adapters/codex/references/pipeline-state-schema.json +38 -4
- package/adapters/codex/references/process-overview.md +2 -2
- package/adapters/codex/references/ralph-loop-contract.md +6 -3
- package/adapters/codex/references/shared-conventions.md +102 -28
- package/adapters/codex/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/scripts/epic-manifest.py +495 -91
- package/adapters/codex/scripts/fix-sweep.py +1180 -0
- package/adapters/codex/scripts/forge-bootstrap.py +57 -5
- package/adapters/codex/scripts/forge-session.py +4241 -146
- package/adapters/codex/scripts/validate-traceability.py +86 -5
- package/adapters/codex/skills/forge/SKILL.md +13 -12
- package/adapters/codex/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/codex/skills/forge/references/process-overview.md +2 -2
- package/adapters/codex/skills/forge/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-0-epic/SKILL.md +7 -2
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +37 -33
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/codex/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-1-prd/SKILL.md +17 -4
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-2-tech/SKILL.md +18 -4
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-3-specs/SKILL.md +9 -3
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +56 -5
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-5-loop/SKILL.md +67 -69
- package/adapters/codex/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/codex/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/codex/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +101 -33
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +30 -10
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-6-docs/SKILL.md +75 -8
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/codex/skills/forge-fix/SKILL.md +118 -32
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +395 -147
- package/adapters/codex/skills/forge-guide/SKILL.md +1 -1
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +19 -1
- package/adapters/codex/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/codex/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/codex/skills/forge-guide/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-init/SKILL.md +1 -1
- package/adapters/codex/skills/forge-verify/SKILL.md +82 -51
- package/adapters/codex/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/codex/skills/forge-verify/references/findings-template.md +70 -50
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +102 -28
- package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +5 -4
- package/adapters/codex/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/codex/skills/forge-verify/references/verification-checklists/specs.md +45 -1
- package/adapters/copilot/.feature-forge-bundle.json +1 -1
- package/adapters/copilot/agents/forge-verifier.md +3 -1
- package/adapters/copilot/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/copilot/references/epic-manifest-schema.json +6 -1
- package/adapters/copilot/references/epic-state-schema.json +50 -0
- package/adapters/copilot/references/forge-config-schema.json +19 -1
- package/adapters/copilot/references/forge-decisions-schema.json +33 -0
- package/adapters/copilot/references/pipeline-state-schema.json +38 -4
- package/adapters/copilot/references/process-overview.md +2 -2
- package/adapters/copilot/references/ralph-loop-contract.md +6 -3
- package/adapters/copilot/references/shared-conventions.md +102 -28
- package/adapters/copilot/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/scripts/epic-manifest.py +495 -91
- package/adapters/copilot/scripts/fix-sweep.py +1180 -0
- package/adapters/copilot/scripts/forge-bootstrap.py +57 -5
- package/adapters/copilot/scripts/forge-session.py +4241 -146
- package/adapters/copilot/scripts/validate-traceability.py +86 -5
- package/adapters/copilot/skills/forge/forge.md +13 -12
- package/adapters/copilot/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/copilot/skills/forge/references/process-overview.md +2 -2
- package/adapters/copilot/skills/forge/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +7 -2
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +37 -33
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/copilot/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +17 -4
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +18 -4
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +9 -3
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +56 -5
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +67 -69
- package/adapters/copilot/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/copilot/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/copilot/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +101 -33
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +30 -10
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +75 -8
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/copilot/skills/forge-fix/forge-fix.md +118 -32
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +395 -147
- package/adapters/copilot/skills/forge-guide/forge-guide.md +1 -1
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +19 -1
- package/adapters/copilot/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/copilot/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-init/forge-init.md +1 -1
- package/adapters/copilot/skills/forge-verify/forge-verify.md +82 -51
- package/adapters/copilot/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/copilot/skills/forge-verify/references/findings-template.md +70 -50
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +102 -28
- package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +5 -4
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/specs.md +45 -1
- package/adapters/cursor/.feature-forge-bundle.json +1 -1
- package/adapters/cursor/agents/forge-verifier.mdc +3 -1
- package/adapters/cursor/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/cursor/references/epic-manifest-schema.json +6 -1
- package/adapters/cursor/references/epic-state-schema.json +50 -0
- package/adapters/cursor/references/forge-config-schema.json +19 -1
- package/adapters/cursor/references/forge-decisions-schema.json +33 -0
- package/adapters/cursor/references/pipeline-state-schema.json +38 -4
- package/adapters/cursor/references/process-overview.md +2 -2
- package/adapters/cursor/references/ralph-loop-contract.md +6 -3
- package/adapters/cursor/references/shared-conventions.md +102 -28
- package/adapters/cursor/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/scripts/epic-manifest.py +495 -91
- package/adapters/cursor/scripts/fix-sweep.py +1180 -0
- package/adapters/cursor/scripts/forge-bootstrap.py +57 -5
- package/adapters/cursor/scripts/forge-session.py +4241 -146
- package/adapters/cursor/scripts/validate-traceability.py +86 -5
- package/adapters/cursor/skills/forge/forge.mdc +13 -12
- package/adapters/cursor/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/cursor/skills/forge/references/process-overview.md +2 -2
- package/adapters/cursor/skills/forge/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +7 -2
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +37 -33
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/cursor/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +17 -4
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +18 -4
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +9 -3
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +56 -5
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +67 -69
- package/adapters/cursor/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/cursor/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/cursor/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +101 -33
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +30 -10
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +75 -8
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +118 -32
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +395 -147
- package/adapters/cursor/skills/forge-guide/forge-guide.mdc +1 -1
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +19 -1
- package/adapters/cursor/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/cursor/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-init/forge-init.mdc +1 -1
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +82 -51
- package/adapters/cursor/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/cursor/skills/forge-verify/references/findings-template.md +70 -50
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +102 -28
- package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +5 -4
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/specs.md +45 -1
- package/adapters/gemini/.feature-forge-bundle.json +1 -1
- package/adapters/gemini/agents/forge-verifier.md +3 -1
- package/adapters/gemini/gemini-extension.json +1 -1
- package/adapters/gemini/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/gemini/references/epic-manifest-schema.json +6 -1
- package/adapters/gemini/references/epic-state-schema.json +50 -0
- package/adapters/gemini/references/forge-config-schema.json +19 -1
- package/adapters/gemini/references/forge-decisions-schema.json +33 -0
- package/adapters/gemini/references/pipeline-state-schema.json +38 -4
- package/adapters/gemini/references/process-overview.md +2 -2
- package/adapters/gemini/references/ralph-loop-contract.md +6 -3
- package/adapters/gemini/references/shared-conventions.md +102 -28
- package/adapters/gemini/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/scripts/epic-manifest.py +495 -91
- package/adapters/gemini/scripts/fix-sweep.py +1180 -0
- package/adapters/gemini/scripts/forge-bootstrap.py +57 -5
- package/adapters/gemini/scripts/forge-session.py +4241 -146
- package/adapters/gemini/scripts/validate-traceability.py +86 -5
- package/adapters/gemini/skills/forge/forge.md +13 -12
- package/adapters/gemini/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/gemini/skills/forge/references/process-overview.md +2 -2
- package/adapters/gemini/skills/forge/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +7 -2
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +37 -33
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/gemini/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +17 -4
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +18 -4
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +9 -3
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +56 -5
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +67 -69
- package/adapters/gemini/skills/forge-5-loop/references/agent-selection.md +17 -1
- package/adapters/gemini/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/gemini/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +101 -33
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +30 -10
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +75 -8
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/gemini/skills/forge-fix/forge-fix.md +118 -32
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +395 -147
- package/adapters/gemini/skills/forge-guide/forge-guide.md +1 -1
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +19 -1
- package/adapters/gemini/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/gemini/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-init/forge-init.md +1 -1
- package/adapters/gemini/skills/forge-verify/forge-verify.md +82 -51
- package/adapters/gemini/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/gemini/skills/forge-verify/references/findings-template.md +70 -50
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +102 -28
- package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +5 -4
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/specs.md +45 -1
- package/adapters/pi/.feature-forge-bundle.json +1 -1
- package/adapters/pi/agents/forge-verifier.md +3 -1
- package/adapters/pi/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/pi/references/epic-manifest-schema.json +6 -1
- package/adapters/pi/references/epic-state-schema.json +50 -0
- package/adapters/pi/references/forge-config-schema.json +19 -1
- package/adapters/pi/references/forge-decisions-schema.json +33 -0
- package/adapters/pi/references/pipeline-state-schema.json +38 -4
- package/adapters/pi/references/process-overview.md +2 -2
- package/adapters/pi/references/ralph-loop-contract.md +6 -3
- package/adapters/pi/references/shared-conventions.md +91 -17
- package/adapters/pi/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/scripts/epic-manifest.py +495 -91
- package/adapters/pi/scripts/fix-sweep.py +1180 -0
- package/adapters/pi/scripts/forge-bootstrap.py +57 -5
- package/adapters/pi/scripts/forge-session.py +4241 -146
- package/adapters/pi/scripts/validate-traceability.py +86 -5
- package/adapters/pi/skills/forge/SKILL.md +10 -9
- package/adapters/pi/skills/forge/references/pipeline-state-schema.json +38 -4
- package/adapters/pi/skills/forge/references/process-overview.md +2 -2
- package/adapters/pi/skills/forge/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-0-epic/SKILL.md +7 -2
- package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +31 -27
- package/adapters/pi/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
- package/adapters/pi/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
- package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-1-prd/SKILL.md +17 -4
- package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-2-tech/SKILL.md +18 -4
- package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-3-specs/SKILL.md +9 -3
- package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-3-specs/references/spec-archetypes.md +9 -0
- package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-4-backlog/SKILL.md +56 -5
- package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-5-loop/SKILL.md +67 -69
- package/adapters/pi/skills/forge-5-loop/references/agent-selection.md +16 -0
- package/adapters/pi/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
- package/adapters/pi/skills/forge-5-loop/references/recovery-procedure.md +349 -0
- package/adapters/pi/skills/forge-5-loop/references/result-reporting.md +101 -33
- package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +29 -9
- package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-6-docs/SKILL.md +75 -8
- package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
- package/adapters/pi/skills/forge-fix/SKILL.md +118 -32
- package/adapters/pi/skills/forge-fix/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +395 -147
- package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +19 -1
- package/adapters/pi/skills/forge-guide/references/process-overview.md +2 -2
- package/adapters/pi/skills/forge-guide/references/ralph-loop-contract.md +6 -3
- package/adapters/pi/skills/forge-guide/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-verify/SKILL.md +81 -50
- package/adapters/pi/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
- package/adapters/pi/skills/forge-verify/references/findings-template.md +69 -49
- package/adapters/pi/skills/forge-verify/references/shared-conventions.md +91 -17
- package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +516 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +5 -4
- package/adapters/pi/skills/forge-verify/references/verification-checklists/impl.md +85 -0
- package/adapters/pi/skills/forge-verify/references/verification-checklists/specs.md +45 -1
- package/package.json +1 -1
- package/adapters/claude/skills/forge-verify/references/pipeline-state-schema.json +0 -191
- package/adapters/codex/skills/forge-verify/references/pipeline-state-schema.json +0 -191
- package/adapters/copilot/skills/forge-verify/references/pipeline-state-schema.json +0 -191
- package/adapters/cursor/skills/forge-verify/references/pipeline-state-schema.json +0 -191
- package/adapters/gemini/skills/forge-verify/references/pipeline-state-schema.json +0 -191
- package/adapters/pi/skills/forge-verify/references/pipeline-state-schema.json +0 -191
|
@@ -29,7 +29,7 @@ Pick based on how many checks the mode carries (see the per-mode totals in Step
|
|
|
29
29
|
- **Small modes (prd 15, tech 17): single verifier.** Use the host's subagent mechanism once with
|
|
30
30
|
`the forge-verifier custom agent`, passing the feature name and mode. It runs all
|
|
31
31
|
checks and returns findings.
|
|
32
|
-
- **Large modes (specs
|
|
32
|
+
- **Large modes (specs 39, backlog 29, impl 25): parallel dimensioned fan-out.**
|
|
33
33
|
Split the mode's checklist into **dimension groups** and dispatch **one
|
|
34
34
|
`forge-verifier` per group, in parallel — a single message with multiple subagent
|
|
35
35
|
calls** (the `superpowers:dispatching-parallel-agents` pattern). Each instance owns a
|
|
@@ -37,14 +37,14 @@ Pick based on how many checks the mode carries (see the per-mode totals in Step
|
|
|
37
37
|
run concurrently. Suggested groups (map to the category clusters in that mode's own
|
|
38
38
|
checklist file):
|
|
39
39
|
- **specs** (`references/verification-checklists/specs.md`): (1) types/contracts,
|
|
40
|
-
(2) architecture/layout, (3) cross-reference &
|
|
41
|
-
|
|
40
|
+
(2) architecture/layout, (3) cross-reference & traceability (owns CHECK-S39),
|
|
41
|
+
(4) testing strategy, (5) integration.
|
|
42
42
|
- **backlog** (`references/verification-checklists/backlog.md`): (1) item scoping &
|
|
43
43
|
acceptance criteria, (2) dependency/ordering sanity,
|
|
44
|
-
(3) spec coverage & traceability, (4) schema/enum correctness.
|
|
45
|
-
- **impl** (`references/verification-checklists/impl.md`): (1) requirement coverage vs specs
|
|
46
|
-
(3) testing, (4) code-quality/conventions,
|
|
47
|
-
the smoke command and the non-test-caller heuristic).
|
|
44
|
+
(3) spec coverage & traceability (owns CHECK-B29), (4) schema/enum correctness.
|
|
45
|
+
- **impl** (`references/verification-checklists/impl.md`): (1) requirement coverage vs specs (owns CHECK-I24/I25),
|
|
46
|
+
(2) integration correctness, (3) testing, (4) code-quality/conventions,
|
|
47
|
+
(5) runnability (owns CHECK-I21/I22 — the smoke command and the non-test-caller heuristic).
|
|
48
48
|
|
|
49
49
|
In each parallel instance's prompt, pass: the feature, the mode, the **dimension
|
|
50
50
|
label**, the **exact CHECK-IDs it owns**, and a note that **it is one of several
|
|
@@ -55,8 +55,7 @@ Pick based on how many checks the mode carries (see the per-mode totals in Step
|
|
|
55
55
|
|
|
56
56
|
### Synthesize (parent session)
|
|
57
57
|
|
|
58
|
-
The verifier(s) are read-only — they return findings as their response
|
|
59
|
-
parent) assemble and write the single document to
|
|
58
|
+
The verifier(s) are read-only — they return findings as their response. **Gate every return first** through "Truncated Verifier Returns" in `references/findings-template.md`: a return without the report structure is a dropped digest (issue #183) — resume the agent via `SendMessage` (or re-dispatch), and never synthesize, write a document, or record a verify result from a truncated return. Then **you** (the parent) assemble and write the single document to
|
|
60
59
|
`{resolvedFeatureDir}/.verification/VERIFY-{mode}-{YYYY-MM-DD}.md`. When you fanned out:
|
|
61
60
|
1. Concatenate all instances' findings and **renumber `V-NNN` IDs uniquely** across the
|
|
62
61
|
merged set.
|
|
@@ -87,7 +86,7 @@ without subagents), fall back to running verification inline in the current sess
|
|
|
87
86
|
When the navigator auto-invokes this skill (its `autoVerify` path), it passes a
|
|
88
87
|
**require-clean** signal (e.g. args include `--require-clean`, or the invocation is
|
|
89
88
|
described as auto-verify). In this mode the clean-room guarantee is load-bearing: the
|
|
90
|
-
whole reason auto-verify is safe to run without a
|
|
89
|
+
whole reason auto-verify is safe to run without a session clear is that the `forge-verifier`
|
|
91
90
|
subagent inherits none of the dispatching session's context. Running inline would break
|
|
92
91
|
that — it would consume the dispatching session's context and invalidate the no-clear
|
|
93
92
|
justification.
|
|
@@ -99,7 +98,7 @@ any work:
|
|
|
99
98
|
> `CLEAN_ROOM_UNAVAILABLE: forge-verifier subagent not dispatchable — verify not run.`
|
|
100
99
|
|
|
101
100
|
Do not analyze artifacts, do not write a findings document, and do not touch pipeline
|
|
102
|
-
state. The navigator detects this sentinel and degrades to its manual verify gate (Tier
|
|
101
|
+
state. This is an **operational failure, not a user skip** — close through Step 7 with `--outcome failed`; as a nested owner that call writes no state and prints no terminal block, so the sentinel is your structured result. The navigator detects this sentinel and degrades to its manual verify gate (Tier
|
|
103
102
|
2/3), so verify state stays outstanding and the stage is never marked verified on false
|
|
104
103
|
assurance. **Manual / interactive invocation** (the normal `/feature-forge:forge-verify`
|
|
105
104
|
path, no require-clean signal) keeps the inline fallback above unchanged.
|
|
@@ -110,6 +109,8 @@ Read and follow `references/shared-conventions.md` for feature name validation,
|
|
|
110
109
|
|
|
111
110
|
Resolve the feature directory via the **Feature Directory Resolution** block in `references/shared-conventions.md` (so a standalone feature resolves to its flat `{specsDir}/{feature}/` path exactly as today, and an epic member resolves to its nested `{specsDir}/{epic}/{feature}/` path). Use the resulting `{resolvedFeatureDir}` everywhere this skill reads or writes a per-feature artifact or state file — the `{specsDir}/{feature}/…` forms below are shorthand for the resolved path, not a literal flat layout. This does not apply to **epic mode**, whose paths are epic-scoped (`{specsDir}/{epic}/…`) by design.
|
|
112
111
|
|
|
112
|
+
Determine branch ownership **at entry**, from the literal `owner: nested` / `owner: direct` token in the dispatching prompt (absent the token you are `direct`), and preserve that value unchanged through any re-verify — see Step 7, which passes it through as `--owner`.
|
|
113
|
+
|
|
113
114
|
**Turn structure reminder:** Output analysis/context as text, then route ALL questions through the host's question mechanism. Never embed questions in text output — the user will not be prompted and the session will stall.
|
|
114
115
|
|
|
115
116
|
## Step 1: Read Configuration and Determine Mode
|
|
@@ -118,7 +119,9 @@ Read `{resolvedFeatureDir}/.pipeline-state.json` to understand current pipeline
|
|
|
118
119
|
|
|
119
120
|
### Mode Selection
|
|
120
121
|
|
|
121
|
-
|
|
122
|
+
An explicit `--served-stage <production-stage>` argument on this invocation is authoritative — it is what the scripted exit and forge-fix pass when they route back here (the fix rejoin fences `/feature-forge:forge-verify {feature} --served-stage {stage}`). Map it to the mode directly (`forge-0-epic`→epic, `forge-1-prd`→prd, `forge-2-tech`→tech, `forge-3-specs`→specs, `forge-4-backlog`→backlog, `forge-5-loop`→impl) and skip auto-detection.
|
|
123
|
+
|
|
124
|
+
Otherwise, if a stage is specified as a second argument (e.g., `/feature-forge:forge-verify auth specs`), use that mode. Otherwise, auto-detect based on pipeline state:
|
|
122
125
|
|
|
123
126
|
- **epic mode**: Explicit via `/feature-forge:forge-verify {epic} epic`, or auto-detected when the named argument resolves to an **epic directory** — i.e. `{specsDir}/{name}/epic-manifest.json` exists (an epic root holds `epic-manifest.json` but no `.pipeline-state.json` of its own). When the argument is an epic, prefer epic mode over feature-mode resolution.
|
|
124
127
|
- **prd mode**: If `forge-1-prd` is complete but `forge-verify-prd` is not `passed` or `findings-applied`
|
|
@@ -127,7 +130,7 @@ If a stage is specified as a second argument (e.g., `/feature-forge:forge-verify
|
|
|
127
130
|
- **backlog mode**: If `forge-4-backlog` is complete but `forge-verify-backlog` is not `passed` or `findings-applied`
|
|
128
131
|
- **impl mode**: If user explicitly requests or if implementation code exists for this feature
|
|
129
132
|
|
|
130
|
-
If ambiguous, use the host's question mechanism to ask which stage to verify.
|
|
133
|
+
If ambiguous, use the host's question mechanism to ask which stage to verify — **before any write**. Serialize the resolved mode as `--verify-mode` at Step 7: that mode, never conversational context and never `currentStage`, determines the served production stage.
|
|
131
134
|
|
|
132
135
|
## Step 2: Load All Relevant Artifacts
|
|
133
136
|
|
|
@@ -162,9 +165,9 @@ Load into context ALL artifacts for this feature based on mode:
|
|
|
162
165
|
|
|
163
166
|
## Step 3: Run Verification Checklists
|
|
164
167
|
|
|
165
|
-
Read `references/verification-checklists/{mode}.md` for the detailed checklist for the mode being verified — one of `references/verification-checklists/prd.md`, `references/verification-checklists/tech.md`, `references/verification-checklists/specs.md`, `references/verification-checklists/backlog.md`, `references/verification-checklists/impl.md`, `references/verification-checklists/epic.md`. Read only that mode's file. Execute every check. Do not skip checks because things "look fine." The orchestrator-only **Findings Document Template (Step 4)**, worked **Example Findings (Step 4)**, and **Epic Mode State Write Detail (Step 6)** sections live in `references/findings-template.md`, read later by the parent role at Steps 4/6.
|
|
168
|
+
Read `references/verification-checklists/{mode}.md` for the detailed checklist for the mode being verified — one of `references/verification-checklists/prd.md`, `references/verification-checklists/tech.md`, `references/verification-checklists/specs.md`, `references/verification-checklists/backlog.md`, `references/verification-checklists/impl.md`, `references/verification-checklists/epic.md`. Read only that mode's file. Execute every check. Do not skip checks because things "look fine." **Exception — a re-verify is scoped, not a fresh sweep:** when the served stage's verify entry is `findings-applied`, follow "Re-verify scope and convergence" in `references/stage-exit-protocol.md` — confirm the prior report's findings against their acceptance evidence and examine the fix's own delta; only an unresolved prior finding or a new blocking defect the fix itself introduced may block, every other observation is advisory, and a finding with a recorded decision is never re-filed. The orchestrator-only **Findings Document Template (Step 4)**, worked **Example Findings (Step 4)**, and **Epic Mode State Write Detail (Step 6)** sections live in `references/findings-template.md`, read later by the parent role at Steps 4/6.
|
|
166
169
|
|
|
167
|
-
Each check in that mode checklist has a unique ID (CHECK-P01, CHECK-T01, CHECK-S01, CHECK-B01, etc.). As you execute each check, record its ID and result (pass/fail/not-applicable). After completing all checks, report the total: "Executed N of M checks. Results: X pass, Y fail, Z not-applicable." If your count is significantly below the expected total for the mode (prd: 15 checks, tech: 17 checks, specs:
|
|
170
|
+
Each check in that mode checklist has a unique ID (CHECK-P01, CHECK-T01, CHECK-S01, CHECK-B01, etc.). As you execute each check, record its ID and result (pass/fail/not-applicable). After completing all checks, report the total: "Executed N of M checks. Results: X pass, Y fail, Z not-applicable." If your count is significantly below the expected total for the mode (prd: 15 checks, tech: 17 checks, specs: 39 checks, backlog: 29 checks, impl: 25 checks, epic: 10 checks), you likely skipped checks — go back and complete them.
|
|
168
171
|
|
|
169
172
|
**Epic mode dispatch.** Epic mode is a small (10-check) checklist, so per the single-vs-parallel rule above, dispatch a **single `forge-verifier`** via the host's subagent mechanism, passing the epic name and `mode=epic`. The verifier runs CHECK-E01..E10 from the `## Epic Mode Checklist` in `references/verification-checklists/epic.md` (E01/E02/E03/E08 are delegated to `epic-manifest.py validate`/`check-name`; E04–E07, E09, and E10 are verifier judgment) and returns its findings.
|
|
170
173
|
|
|
@@ -175,7 +178,13 @@ GOOD finding: "PRD.md REQ-ERR-04 requires rate limit retry behavior, but spec 03
|
|
|
175
178
|
|
|
176
179
|
Every finding must include:
|
|
177
180
|
1. A unique ID (V-001, V-002, etc.)
|
|
178
|
-
2. Severity: `gap` (missing requirement coverage), `inconsistency` (contradictory specs), `improvement` (not wrong but could be better), `error` (factually incorrect)
|
|
181
|
+
2. Severity: `gap` (missing requirement coverage), `inconsistency` (contradictory specs), `improvement` (not wrong but could be better), `error` (factually incorrect **with a behavioral, CLI-output, or decision-bearing consequence**)
|
|
182
|
+
|
|
183
|
+
**Severity floor (anti-churn).** An inaccuracy confined to comments, docstrings, or test narration — prose no runtime path executes and no decision consumes — caps at `inconsistency`, never `error`. It is worth recording, but a wrong sentence beside correct code does not block a stage the way wrong behavior does. **Routing consequence:** `error` and `gap` are the two **blocking** severities; `inconsistency` and `improvement` are **advisory**. A report with at least one blocking finding records `findings-reported` and routes to forge-fix. A report whose findings are all advisory records `passed` **with the report still attached** (Step 6) and the pipeline advances — an advisory-only report never fences a fix round. A **meta-guard** (a test protecting other tests or prose) is judged against its declared protection set: guard-incompleteness against a declared non-goal is never a finding (`references/stage-exit-protocol.md` § Re-verify scope).
|
|
184
|
+
|
|
185
|
+
**A checklist item with no PRD position behind it is a PRD gap, not a design to invent.** Several checks are deliberately conditional — `CHECK-S27` ("Concurrent access scenarios are addressed **if relevant**") is the clearest, and the same shape appears for performance, observability, and security checks that defer to the PRD. When such a check fires and the PRD takes **no position** on the concern, the finding is that the *requirements* are silent. Report it as an `improvement` (or a `gap` against the PRD, in `prd` mode) whose suggested fix is to **record the position** — including "out of scope, single writer assumed", which is a complete answer. Do **not** specify a mechanism to satisfy the check: a verifier that answers an open requirements question by designing a protocol converts a one-sentence PRD amendment into a foundational change that no requirement asked for, at the stage where it is least visible. Precedent both ways: `epic-orchestration` V-008 raised `CHECK-S27` against a PRD that *had* scoped concurrency out and correctly cost one sentence at `improvement`; `stage-exit-coverage` V-006 raised the same check against a silent PRD, was filed as a `gap`, and induced a full locking protocol that was later removed. For **forge state writes** specifically, the standing owner decision is recorded in `references/decisions/single-writer-threat-model.md` (issue #180): single writer assumed, detection-not-locking — answer `CHECK-S27` by citing it (or the per-feature requirement restating it), never by designing a mechanism.
|
|
186
|
+
|
|
187
|
+
Relatedly, **do not let `improvement` fall out of use.** A report containing only `gap`/`error`/`inconsistency` usually means observations that should have been `improvement` were promoted into must-fix findings. If a finding would not block implementation, it is an `improvement` — say so.
|
|
179
188
|
3. Exact location (file + section)
|
|
180
189
|
4. What's wrong
|
|
181
190
|
5. Suggested fix (specific enough that a fresh agent can apply it)
|
|
@@ -184,9 +193,9 @@ Every finding must include:
|
|
|
184
193
|
|
|
185
194
|
## Step 4: Write Findings Document
|
|
186
195
|
|
|
187
|
-
Ensure the `.verification/` subdirectory exists, then write findings to `{resolvedFeatureDir}/.verification/VERIFY-{mode}-{YYYY-MM-DD}.md`.
|
|
196
|
+
Ensure the `.verification/` subdirectory exists, then write findings to `{resolvedFeatureDir}/.verification/VERIFY-{mode}-{YYYY-MM-DD}.md`. **Never overwrite an existing report:** if that name already exists (an earlier round the same day), write `VERIFY-{mode}-{YYYY-MM-DD}-round{N}.md` with the smallest `N ≥ 2` not yet on disk — each round's report and Fix Progress is an audit record later rounds and the round ledger (`references/stage-exit-protocol.md` § Escalation) read.
|
|
188
197
|
|
|
189
|
-
**For epic mode**, the target is `{specsDir}/{epic}/.verification/VERIFY-epic-{YYYY-MM-DD}.md` (the same format, with `{mode}=epic`).
|
|
198
|
+
**For epic mode**, the target is `{specsDir}/{epic}/.verification/VERIFY-epic-{YYYY-MM-DD}.md` (the same format and the same no-overwrite round rule, with `{mode}=epic`).
|
|
190
199
|
|
|
191
200
|
The full findings-document template (report header, `V-NNN` finding shape, and the
|
|
192
201
|
Fix Execution Plan layout) and the worked **Example Findings** (gap / inconsistency /
|
|
@@ -209,51 +218,73 @@ When building the Fix Execution Plan:
|
|
|
209
218
|
**If not in plan mode:** Output the following as text:
|
|
210
219
|
"Findings and fix plan written to `{findings-file}`."
|
|
211
220
|
|
|
212
|
-
|
|
221
|
+
**Advisory-only reports skip the question.** When the report contains no blocking finding (`error`/`gap`), there is nothing to route to forge-fix: do not present the fix options below — state that the report is advisory-only, record `passed` with the report attached (Step 6), and continue; the advisories stay discoverable in the findings document for whoever next touches the artifact. Otherwise (at least one blocking finding), use the host's question mechanism to ask how to proceed — **unless this report closes the SECOND consecutive `reverify-findings` for this served stage** (count the round-discriminated reports in `.verification/`), in which case follow "Escalation (the round ledger)" in `references/stage-exit-protocol.md` instead: present the digest and recommend explicit acceptance of the residual findings, never another fix pass. Otherwise follow the **Decision Support** protocol in `references/shared-conventions.md`: recommend a path based on the findings and give each option a one-line trade-off. Let the severity and volume of findings drive the recommendation — e.g. recommend (b) **Apply fixes now** when findings are clear-cut and mechanical; recommend (a) **Review first** when findings involve design judgment or you flagged low-confidence items; recommend (c) **plan-mode workflow** when the fixes are large or interdependent enough to warrant a reviewed plan. Present:
|
|
213
222
|
- **(a) Review the findings first** — read `{findings-file}` and decide per-finding; safest, but you act on nothing until you return.
|
|
214
|
-
- **(b) Run `/feature-forge:forge-fix {feature}` now** — applies the fix plan immediately; fastest, best when findings are unambiguous.
|
|
223
|
+
- **(b) Run `/feature-forge:forge-fix {feature} --served-stage {servedStage}` now** — applies the fix plan immediately; fastest, best when findings are unambiguous.
|
|
215
224
|
- **(c) Enter plan mode and re-run `/feature-forge:forge-verify {feature}`** — produces a reviewable plan before any edits; best for large or risky fix sets.
|
|
216
225
|
|
|
217
226
|
Do NOT embed this question in your text output.
|
|
218
227
|
|
|
219
|
-
## Step 6:
|
|
228
|
+
## Step 6: Record the Result Through `state-verify`
|
|
220
229
|
|
|
221
|
-
|
|
230
|
+
Never hand-author a verify entry. Every `stages.forge-verify-*` transition is written by the `state-verify` verb described in the **Pipeline State Protocol** in `references/shared-conventions.md`, which owns its full flag surface, its status matrix, and the exit-2 failure protocol. Write `findings-reported` when the report lists at least one **blocking** finding (`error`/`gap`); write `passed` when it lists none — including an **advisory-only** report (`inconsistency`/`improvement` findings only), which records `passed` with the report still attached: pass `--findings-file` and `--findings-count` alongside `--status passed` so the advisories remain discoverable without blocking the stage. (One exception routes blocking findings to `passed`: residual findings the user explicitly accepted at the round-ledger escalation — recorded first as a `state-decision`, then `passed` with the report attached, per "Escalation" in `references/stage-exit-protocol.md`.) Never write `findings-applied` here — that belongs to the fix pass. `--stage` names the **served production stage** (Step 1's mode, mapped through the served-stage mapping in Step 7), `--findings-file` is the report path **relative to** the feature directory (the Step 4 filename, round discriminator included), and `--verified-stage-version` is that production stage entry's current `version`, so a later revision of the artifact makes this verification read stale and re-fires. Add `--epic "{epic}"` when the feature is an epic member — required, per the Pipeline State Protocol; omitting it for a member is an error and must never fall back to a same-named flat feature.
|
|
222
231
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
232
|
+
```bash
|
|
233
|
+
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')"
|
|
234
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
235
|
+
python3 "$R/scripts/forge-session.py" state-verify \
|
|
236
|
+
--feature "{feature}" --stage "{servedStage}" --status "{passed|findings-reported}" \
|
|
237
|
+
--findings-file "{relative findings path}" --findings-count {n} \
|
|
238
|
+
--verified-stage-version {version} --specs-dir "{specsDir}"
|
|
239
|
+
```
|
|
230
240
|
|
|
231
|
-
|
|
232
|
-
- Set the relevant verify entry status to `findings-reported` (or `passed` when there
|
|
233
|
-
are zero findings)
|
|
234
|
-
- Record `findingsFile`, `findingsCount`, `verifiedAt`
|
|
235
|
-
- Record `verifiedStageVersion` = the current `version` of the production stage entry
|
|
236
|
-
this verify covers (e.g. verifying `tech` → `stages["forge-2-tech"].version`). This
|
|
237
|
-
feeds the navigator's freshness ledger: a later revision to that artifact bumps its
|
|
238
|
-
`version`, so the recorded value no longer matches and auto-verify re-fires. Omitting
|
|
239
|
-
this leaves the verify looking stale (safe: the navigator re-verifies rather than
|
|
240
|
-
skips).
|
|
241
|
+
**Two-commit provenance — never `--amend`.** The write above records `commitHash: null`. Commit 1 records the findings document and the state together (Git Commit Protocol, `references/shared-conventions.md`). Then record the provenance of that commit in Commit 2, passing the **full 40-character** hash of Commit 1 — an abbreviation is refused rather than expanded, and this call touches nothing but `commitHash`. Add `--epic "{epic}"` when the feature is an epic member — required, per the Pipeline State Protocol.
|
|
241
242
|
|
|
242
|
-
|
|
243
|
+
```bash
|
|
244
|
+
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')"
|
|
245
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
246
|
+
python3 "$R/scripts/forge-session.py" state-verify \
|
|
247
|
+
--feature "{feature}" --stage "{servedStage}" \
|
|
248
|
+
--commit-hash "$(git rev-parse HEAD)" --specs-dir "{specsDir}"
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
On exit 2 **nothing was recorded**: surface the `Error:` line verbatim together with the named feature (and epic), do not claim the result was persisted, and close the stage with `--outcome failed` in Step 7 — the verify entry is unchanged, so no success block may be printed.
|
|
243
252
|
|
|
244
253
|
### Epic mode state (`.epic-state.json`)
|
|
245
254
|
|
|
246
|
-
Epic mode is **epic-scoped**, not per-feature:
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
`
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
(
|
|
255
|
-
|
|
256
|
-
|
|
255
|
+
Epic mode is **epic-scoped**, not per-feature: `--stage forge-0-epic` writes `{specsDir}/{epic}/.epic-state.json` and **never** any member's `.pipeline-state.json`. It is the one exception to the member rule — `--feature` names the **epic**, and `--epic` must be absent or exactly equal to it — and its `--verified-stage-version` is the epic manifest's `revision`, never a member's stage version. The exact call and the minimal written shape live in `references/findings-template.md` under the **Epic Mode State Write Detail (Step 6)** section. Follow it verbatim.
|
|
256
|
+
|
|
257
|
+
## Step 7: Close the Stage
|
|
258
|
+
|
|
259
|
+
**Ownership.** Read branch ownership from the literal `owner: nested` / `owner: direct` token in the prompt that dispatched you. **Absent the token you are `direct`** — a user-typed `/feature-forge:forge-verify` is the only path that carries no dispatcher. Never infer ownership from how the invocation happened to be phrased; judge the token, not the wording. Pass the resolved value straight through as `--owner`, and preserve it through any re-verify. As a **nested** owner you return your structured result (mode, served stage, outcome, findings file, findings count) to the caller and print **no terminal block at all** — the outer authoring stage is the sole terminal owner. As a **direct** owner you print the script's NEXT-STEPS block verbatim as your absolute final output, with nothing after its sentinel line. `references/stage-exit-protocol.md` § "Branch ownership: the `owner:` token" owns this rule.
|
|
260
|
+
|
|
261
|
+
**Served stage.** Pass `--verify-mode` carrying Step 1's explicit or auto-detected mode (`epic`, `prd`, `tech`, `specs`, `backlog`, `impl`); the script maps it to the served production stage. When the caller already owns a stage and states it, additionally pass that value as `--served-stage` — if the two disagree the script fails closed rather than guessing. Derive the served stage **only** from that mode argument or from authoritative pipeline state: conversational context and `currentStage` are never valid inference sources.
|
|
262
|
+
|
|
263
|
+
**Capability.** Pass `--verify-capability interactive` only when **both** a question mechanism equivalent to the host's question mechanism is available **and** a clean-room `forge-verifier` may actually be dispatched right now. Clause (b) tests **permitted dispatch, not a listed tool**: a session that may dispatch only when the user asked, but does have a question mechanism, is `interactive` — the gate's affirmative choice supplies the request. Reserve `manual` for **no** question mechanism **and** **no** permitted dispatch. An auto-verify directive under a no-unsolicited-dispatch bar is presented through the gate and dispatched on the affirmative choice — never skipped, and never resolved by advancing to the production successor.
|
|
264
|
+
|
|
265
|
+
**Outcome.** Invoke the exit **exactly once**, with the `--outcome` this run's result maps to:
|
|
266
|
+
|
|
267
|
+
| This run's result | `--outcome` |
|
|
268
|
+
|---|---|
|
|
269
|
+
| Zero findings — the artifacts are clean | `passed` |
|
|
270
|
+
| Advisory-only report (no `error`/`gap`) — recorded `passed` with the report attached | `passed` |
|
|
271
|
+
| A report with at least one blocking finding (`error`/`gap`) was written | `findings` |
|
|
272
|
+
| The user explicitly chose to defer pipeline action **and** that skip was persisted via `state-verify --status skipped` | `skipped` |
|
|
273
|
+
| A dispatch, a check, or a state write failed and needs intervention | `failed` |
|
|
274
|
+
|
|
275
|
+
Merely **presenting** blocking findings is `findings`, not `skipped` — all three Step 5 options are `findings`, including (a) "review the findings first", which defers *your* next action rather than the pipeline's. `skipped` is available only for an explicit user deferral of **pipeline action** whose skip has already been persisted. A `CLEAN_ROOM_UNAVAILABLE` sentinel or a non-answer from an advertised dispatch is an operational failure, not a user skip: it is `failed`. A state-write failure is `failed`, and no success block may be printed after one.
|
|
276
|
+
|
|
277
|
+
Add `--epic "{epic}"` when the feature is an epic member, and `--served-stage "{servedStage}"` when the caller supplied one. Pass no other flags.
|
|
278
|
+
|
|
279
|
+
**Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
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')"
|
|
283
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
284
|
+
python3 "$R/scripts/forge-session.py" stage-exit --feature "{feature}" --stage forge-verify --owner "{owner}" --outcome "{VerifyOutcome}" --verify-mode "{mode}" --specs-dir "{specsDir}" --host generic --verify-capability "{verify-capability}"
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
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.
|
|
257
288
|
|
|
258
289
|
## Gotchas
|
|
259
290
|
|
package/adapters/copilot/skills/forge-verify/references/decisions/single-writer-threat-model.md
ADDED
|
@@ -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.
|
|
@@ -2,11 +2,45 @@
|
|
|
2
2
|
|
|
3
3
|
Loaded by the **parent orchestrator** role of `forge-verify` at Step 4 (write the findings document) and Step 6 (epic-mode state write). The `forge-verifier` leaf subagent MUST NOT load this file — it holds only orchestrator-facing material (see `SKILL.md` → "Which role are you?").
|
|
4
4
|
|
|
5
|
+
## Truncated Verifier Returns (Synthesize gate)
|
|
6
|
+
|
|
7
|
+
The host's subagent mechanism hands the parent **only the verifier's final message**. A verifier that
|
|
8
|
+
ends its run on a status line instead of the report returns *that line* as the entire
|
|
9
|
+
result — the digest it built exists in its transcript but never reaches you. Observed
|
|
10
|
+
in the wild (issue #183): two ~130k-token, 40+-tool-call runs each returned a single
|
|
11
|
+
plausible-sounding opening sentence ("I'll start by loading the pipeline state…") while
|
|
12
|
+
the recovered digest contained two BLOCKER findings. The failure is quiet precisely
|
|
13
|
+
because the returned line reads like progress, not like an error.
|
|
14
|
+
|
|
15
|
+
**Gate every verifier return before using it.** A return is a **non-answer** when it
|
|
16
|
+
lacks the report structure — no `# Verification Report:` header, no `## Findings`
|
|
17
|
+
section, no `Checks Executed:` line (for a skeptic dispatch: no per-finding
|
|
18
|
+
CONFIRMED/REFUTED verdicts). Length is the tell: a real report is rarely under ~20
|
|
19
|
+
lines; a one-or-two-sentence return from a run that did real work is a dropped digest,
|
|
20
|
+
not a clean result.
|
|
21
|
+
|
|
22
|
+
On a non-answer:
|
|
23
|
+
|
|
24
|
+
1. **Resume, don't re-run.** `SendMessage` to the returned agent id: *"Your run ended
|
|
25
|
+
without returning the report. Return your FINAL report now, from the work you
|
|
26
|
+
already did, in the Output Format — your final message is the only thing I
|
|
27
|
+
receive."* The agent replays from its transcript and typically returns the full
|
|
28
|
+
digest with zero further tool calls.
|
|
29
|
+
2. **Re-dispatch** the same prompt only if the resume also fails or the id is gone.
|
|
30
|
+
3. **Never** synthesize findings from a truncated return, write a findings document
|
|
31
|
+
around it, record a verify result (`state-verify`) from it, or present it to the
|
|
32
|
+
user as the verification outcome. A gate decision made on a dropped digest is the
|
|
33
|
+
#183 failure mode: BLOCKER findings silently converted into a pass.
|
|
34
|
+
|
|
5
35
|
## Findings Document Template (Step 4)
|
|
6
36
|
|
|
7
37
|
Write findings to `{specsDir}/{feature}/.verification/VERIFY-{mode}-{YYYY-MM-DD}.md`
|
|
8
38
|
(for epic mode, `{specsDir}/{epic}/.verification/VERIFY-epic-{YYYY-MM-DD}.md` — same
|
|
9
39
|
format, with `{mode}=epic`). Ensure the `.verification/` subdirectory exists first.
|
|
40
|
+
**Never overwrite an existing report:** if the name already exists (an earlier round
|
|
41
|
+
the same day), write `VERIFY-{mode}-{YYYY-MM-DD}-round{N}.md` with the smallest
|
|
42
|
+
`N ≥ 2` not yet on disk — each round's report and Fix Progress is an audit record the
|
|
43
|
+
round ledger reads (`references/stage-exit-protocol.md` § Escalation).
|
|
10
44
|
|
|
11
45
|
```markdown
|
|
12
46
|
# Verification Report: {feature} ({mode})
|
|
@@ -20,6 +54,7 @@ Artifacts Reviewed: {list of files}
|
|
|
20
54
|
- Inconsistencies: {N}
|
|
21
55
|
- Improvements: {N}
|
|
22
56
|
- Errors: {N}
|
|
57
|
+
- Blocking (errors + gaps): {N} — {"report records findings-reported" | "0: advisory-only, report records passed with this file attached"}
|
|
23
58
|
|
|
24
59
|
## Findings
|
|
25
60
|
|
|
@@ -72,7 +107,7 @@ Here are complete example findings showing the expected quality:
|
|
|
72
107
|
- **Severity:** inconsistency
|
|
73
108
|
- **Location:** 00-core-definitions.md section 2.3 vs 03-session-management.md section 1.1
|
|
74
109
|
- **Issue:** 00-core-definitions.md defines `SESSION_DURATION_MS = 7 * 24 * 60 * 60 * 1000` (7 days), but 03-session-management.md section 1.1 states "sessions expire after 30 days." These contradict each other.
|
|
75
|
-
- **Suggested fix:** Align both documents to the PRD requirement. PRD.md REQ-SEC-03 says "sessions should have a reasonable expiry" without specifying a duration — use
|
|
110
|
+
- **Suggested fix:** Align both documents to the PRD requirement. PRD.md REQ-SEC-03 says "sessions should have a reasonable expiry" without specifying a duration — use the host's question mechanism to ask the user which value is intended, then update both documents.
|
|
76
111
|
- **References:** PRD.md REQ-SEC-03, 00-core-definitions.md section 2.3, 03-session-management.md section 1.1
|
|
77
112
|
```
|
|
78
113
|
|
|
@@ -95,63 +130,48 @@ state file `{specsDir}/{epic}/.epic-state.json` — **never** into any member's
|
|
|
95
130
|
violate REQ-STATE-02; per-feature status is always derived live from each member's
|
|
96
131
|
`.pipeline-state.json`).
|
|
97
132
|
|
|
98
|
-
Set `stages.forge-verify-epic.status` to `findings-reported`
|
|
99
|
-
|
|
100
|
-
|
|
133
|
+
Set `stages.forge-verify-epic.status` to `findings-reported` when the report lists at
|
|
134
|
+
least one **blocking** finding (`error`/`gap`), else `passed` — for an advisory-only
|
|
135
|
+
report pass `--findings-file`/`--findings-count` alongside `--status passed`, exactly
|
|
136
|
+
as in feature mode (the severity floor in `skills/forge-verify/SKILL.md`) — recording
|
|
137
|
+
`findingsFile`, `findingsCount`, and `verifiedAt`.
|
|
138
|
+
|
|
139
|
+
**Write it with `state-verify`, never by hand.** `--stage forge-0-epic` is the sanctioned
|
|
140
|
+
epic writer: it creates the file lazily, mutates only `stages.forge-verify-epic` plus the
|
|
141
|
+
top-level `updatedAt`, writes atomically, and leaves any prior file intact on failure.
|
|
142
|
+
This is the one `state-*` call site where the member `--epic` rule does **not** apply:
|
|
143
|
+
`--feature` names the **epic**, and `--epic` must be absent or exactly equal to it. Its
|
|
144
|
+
`--verified-stage-version` is the **epic manifest's `revision`** — never a member's stage
|
|
145
|
+
version — which is what keeps the result reading fresh rather than stale.
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
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')"
|
|
149
|
+
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
150
|
+
python3 "$R/scripts/forge-session.py" state-verify \
|
|
151
|
+
--feature "{epic}" --stage forge-0-epic \
|
|
152
|
+
--status "{passed|findings-reported}" \
|
|
153
|
+
--findings-file "{relative findings path}" --findings-count {n} \
|
|
154
|
+
--verified-stage-version {manifest revision} --specs-dir "{specsDir}"
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
On exit 2 nothing was recorded: surface the `Error:` line verbatim, name the epic, and do
|
|
158
|
+
not claim the verification was persisted. The minimal shape this writes:
|
|
101
159
|
|
|
102
160
|
```jsonc
|
|
103
161
|
{
|
|
104
|
-
"epic": "auth-overhaul",
|
|
162
|
+
"epic": "auth-overhaul", // matches the manifest `epic`
|
|
163
|
+
"updatedAt": "2026-06-12T00:00:00Z", // refreshed on every successful write
|
|
105
164
|
"stages": {
|
|
106
165
|
"forge-verify-epic": {
|
|
107
|
-
"status": "findings-reported", // "findings-reported" | "passed" | "findings-applied"
|
|
166
|
+
"status": "findings-reported", // "findings-reported" | "passed" | "findings-applied" | "skipped" | "auto-verify-pending"
|
|
108
167
|
"findingsFile": ".verification/VERIFY-epic-2026-06-12.md",
|
|
109
168
|
"findingsCount": 3,
|
|
110
|
-
"verifiedAt": "2026-06-12T00:00:00Z"
|
|
169
|
+
"verifiedAt": "2026-06-12T00:00:00Z",
|
|
170
|
+
"verifiedStageVersion": 3, // the epic manifest revision this covers
|
|
171
|
+
"commitHash": null // filled by the Commit 2 provenance call
|
|
172
|
+
// "scheduledAt" / "scheduledStageVersion" appear only while an
|
|
173
|
+
// auto-verify-pending schedule is outstanding; a terminal result removes them
|
|
111
174
|
}
|
|
112
175
|
}
|
|
113
176
|
}
|
|
114
177
|
```
|
|
115
|
-
|
|
116
|
-
**Write mechanism.** `epic-manifest.py` exposes no subcommand that writes this file, so
|
|
117
|
-
the skill writes it **directly**, using an atomic temp-file + `os.replace()` pattern
|
|
118
|
-
(mirroring `02-manifest-helper-cli.md §3.3`): serialize the merged state to a sibling
|
|
119
|
-
temp file in `{specsDir}/{epic}/`, flush, then `os.replace()` it into place. Create the
|
|
120
|
-
file **lazily on first write** (a missing file is simply created; an existing file is
|
|
121
|
-
read, its `stages.forge-verify-epic` entry merged/replaced, and rewritten). On any I/O
|
|
122
|
-
failure, **report the error and leave any prior `.epic-state.json` intact** (never a
|
|
123
|
-
partial write). For example:
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
python3 - "$SPECS_DIR/$EPIC" <<'PY'
|
|
127
|
-
import json, os, sys, tempfile
|
|
128
|
-
from pathlib import Path
|
|
129
|
-
epic_dir = Path(sys.argv[1])
|
|
130
|
-
path = epic_dir / ".epic-state.json"
|
|
131
|
-
state = {}
|
|
132
|
-
if path.exists():
|
|
133
|
-
state = json.loads(path.read_text())
|
|
134
|
-
state.setdefault("epic", epic_dir.name)
|
|
135
|
-
state.setdefault("stages", {})
|
|
136
|
-
state["stages"]["forge-verify-epic"] = {
|
|
137
|
-
"status": "findings-reported", # or "passed" when findingsCount == 0
|
|
138
|
-
"findingsFile": ".verification/VERIFY-epic-2026-06-12.md",
|
|
139
|
-
"findingsCount": 3,
|
|
140
|
-
"verifiedAt": "2026-06-12T00:00:00Z",
|
|
141
|
-
}
|
|
142
|
-
fd, tmp = tempfile.mkstemp(dir=str(epic_dir), prefix=".epic-state.", suffix=".tmp")
|
|
143
|
-
try:
|
|
144
|
-
with os.fdopen(fd, "w") as f:
|
|
145
|
-
json.dump(state, f, indent=2)
|
|
146
|
-
f.flush()
|
|
147
|
-
os.fsync(f.fileno())
|
|
148
|
-
os.replace(tmp, path)
|
|
149
|
-
except OSError as e:
|
|
150
|
-
try:
|
|
151
|
-
os.unlink(tmp)
|
|
152
|
-
except OSError:
|
|
153
|
-
pass
|
|
154
|
-
print(f"failed to write .epic-state.json: {e}", file=sys.stderr)
|
|
155
|
-
raise
|
|
156
|
-
PY
|
|
157
|
-
```
|