@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
|
@@ -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
|
|
@@ -62,3 +62,47 @@ Detailed checklist for the **specs** verification mode, loaded by the `forge-ver
|
|
|
62
62
|
### Traceability
|
|
63
63
|
- [ ] **CHECK-S38**: Build a complete traceability matrix from every REQ-XXX-NN to the spec document and section that implements it. Any REQ ID not found in at least one spec is a gap finding.
|
|
64
64
|
|
|
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
|
+
|
|
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
|
+
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@garygentry/feature-forge",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"description": "Cross-agent installer for the feature-forge skill suite — installs the canonical forge pipeline into Claude, Codex, Copilot, Cursor, Gemini, or Pi.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"title": "Feature Forge Pipeline State",
|
|
4
|
-
"description": "Tracks pipeline progress for a single feature across sessions. Lives at {specsDir}/{feature}/.pipeline-state.json",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"required": ["feature", "createdAt", "updatedAt", "currentStage", "stages", "pipelineStatus"],
|
|
7
|
-
"properties": {
|
|
8
|
-
"pipelineStatus": {
|
|
9
|
-
"type": "string",
|
|
10
|
-
"enum": ["active", "paused", "abandoned"],
|
|
11
|
-
"default": "active"
|
|
12
|
-
},
|
|
13
|
-
"feature": {
|
|
14
|
-
"type": "string",
|
|
15
|
-
"description": "Feature name (matches directory name under specsDir)"
|
|
16
|
-
},
|
|
17
|
-
"epic": {
|
|
18
|
-
"type": "string",
|
|
19
|
-
"description": "Back-pointer to the owning epic's name. Absent for standalone features. The epic-manifest.json is canonical on conflict (REQ-STATE-01)."
|
|
20
|
-
},
|
|
21
|
-
"branch": {
|
|
22
|
-
"type": "string",
|
|
23
|
-
"description": "Git branch this feature's pipeline work is intended to land on, recorded by the Branch Setup block (shared-conventions.md) at the entry stage. Absent when the project isn't a git repo or branchPerFeature is false. Downstream stages and forge-5-loop compare the current branch against this to detect drift back onto the default branch before committing."
|
|
24
|
-
},
|
|
25
|
-
"createdAt": {
|
|
26
|
-
"type": "string",
|
|
27
|
-
"format": "date-time"
|
|
28
|
-
},
|
|
29
|
-
"updatedAt": {
|
|
30
|
-
"type": "string",
|
|
31
|
-
"format": "date-time"
|
|
32
|
-
},
|
|
33
|
-
"currentStage": {
|
|
34
|
-
"type": "string",
|
|
35
|
-
"enum": ["forge-1-prd", "forge-2-tech", "forge-3-specs", "forge-4-backlog", "forge-5-loop", "forge-6-docs", "complete", "forge-verify-prd", "forge-verify-tech", "forge-verify-specs", "forge-verify-backlog", "forge-verify-impl", "forge-0-epic", "forge-verify-epic"],
|
|
36
|
-
"description": "Where the pipeline IS: the most recently started stage — its `stages[<currentStage>].status` is `in-progress` while that stage is being authored, then `complete` once its artifacts are committed. A stage skill sets this to its own id when it starts. This is deliberately NOT 'the next stage to run': the next stage is DERIVED, never stored — it is the first production stage whose `stages[].status` is not `complete` (see `next_stage()` in forge-session.py, surfaced as the navigator/doctor `nextStage`). Consumers that need 'what runs next' compute it from `stages[].status`, not from this field. `complete` is a LEGACY enum value, retained so pre-0.14 state files still validate: no writer produces it (the `state-*` verbs are the only writers, and only `state-enter` touches this field, setting it to the stage being entered). A finished pipeline therefore records the last stage it started — `forge-6-docs` — and 'the whole pipeline is done' is DERIVED too: `next_stage()` returns null (surfaced as `nextStage: null` / `complete: true`). Never test this field against `complete` to decide whether a pipeline finished. (Legacy/absent value: tools fall back to the derived next stage for display only — `build_rows` in forge-session.py.)"
|
|
37
|
-
},
|
|
38
|
-
"notes": {
|
|
39
|
-
"type": "string",
|
|
40
|
-
"description": "Free-form notes persisted between sessions (user can add context before stepping away)"
|
|
41
|
-
},
|
|
42
|
-
"epicChangeRequests": {
|
|
43
|
-
"type": "array",
|
|
44
|
-
"description": "Epic-level change requests raised by a member stage (forge-1-prd/forge-2-tech) when the epic DECOMPOSITION itself must change — distinct from the same-feature `notes` parking lot. Read by forge-0-epic edit mode (which applies them) and by forge-session stage-exit (which routes the exit on `blocksCurrent`). Absent/empty for standalone features. Additive/optional: legacy states without it validate unchanged.",
|
|
45
|
-
"items": {
|
|
46
|
-
"type": "object",
|
|
47
|
-
"required": ["kind", "target", "rationale", "blocksCurrent", "raisedBy", "raisedAt", "status"],
|
|
48
|
-
"additionalProperties": false,
|
|
49
|
-
"properties": {
|
|
50
|
-
"kind": {
|
|
51
|
-
"type": "string",
|
|
52
|
-
"enum": ["add-feature", "redep", "move-boundary", "split"],
|
|
53
|
-
"description": "The decomposition change. add-feature/redep map 1:1 onto edit-mode mutators; move-boundary/split are composite (applied guided-manual in v1)."
|
|
54
|
-
},
|
|
55
|
-
"target": {
|
|
56
|
-
"type": "string",
|
|
57
|
-
"description": "The sibling feature to add, or the feature/boundary affected."
|
|
58
|
-
},
|
|
59
|
-
"rationale": {
|
|
60
|
-
"type": "string",
|
|
61
|
-
"description": "Why the epic must change; seeds the edit-mode charter/prompt when applied."
|
|
62
|
-
},
|
|
63
|
-
"blocksCurrent": {
|
|
64
|
-
"type": "boolean",
|
|
65
|
-
"description": "true → the current feature's next stage would build on a soon-to-change decomposition (pause-now: reconcile before proceeding). false → a peer/downstream change (finish-then-edit). Drives stage-exit routing."
|
|
66
|
-
},
|
|
67
|
-
"raisedBy": {
|
|
68
|
-
"type": "string",
|
|
69
|
-
"enum": ["forge-1-prd", "forge-2-tech"],
|
|
70
|
-
"description": "The stage that detected the epic-level concern."
|
|
71
|
-
},
|
|
72
|
-
"raisedAt": { "type": "string", "format": "date-time" },
|
|
73
|
-
"status": {
|
|
74
|
-
"type": "string",
|
|
75
|
-
"enum": ["open", "applied", "dismissed"],
|
|
76
|
-
"default": "open",
|
|
77
|
-
"description": "Lifecycle: open → applied|dismissed. Only forge-0-epic edit mode flips open→applied/dismissed; recording stages only create open entries; navigator/verify only read."
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
"deferredDecisions": {
|
|
83
|
-
"type": "array",
|
|
84
|
-
"description": "Same-feature decisions deliberately postponed to a LATER stage of THIS feature — a structured alternative to burying them in the free-text `notes` string. Distinct from `notes` (unstructured scratch) and from `epicChangeRequests[]` (the epic DECOMPOSITION must change). Use this when a stage would otherwise be tempted to solicit a decision that properly belongs to a downstream stage (e.g. forge-1-prd deferring the concrete cache backend to forge-2-tech): record it here instead of asking now (see the deferred-decisions rule in `references/stage-exit-protocol.md`), and the target stage addresses it. Additive/optional: legacy states without it validate unchanged.",
|
|
85
|
-
"items": {
|
|
86
|
-
"type": "object",
|
|
87
|
-
"required": ["question", "raisedBy", "raisedAt", "status"],
|
|
88
|
-
"additionalProperties": false,
|
|
89
|
-
"properties": {
|
|
90
|
-
"question": {
|
|
91
|
-
"type": "string",
|
|
92
|
-
"description": "The decision being deferred, phrased as a concrete question for the target stage to answer."
|
|
93
|
-
},
|
|
94
|
-
"rationale": {
|
|
95
|
-
"type": "string",
|
|
96
|
-
"description": "Why it is deferred rather than decided now (e.g. depends on information the target stage produces)."
|
|
97
|
-
},
|
|
98
|
-
"targetStage": {
|
|
99
|
-
"type": "string",
|
|
100
|
-
"enum": ["forge-1-prd", "forge-2-tech", "forge-3-specs", "forge-4-backlog", "forge-5-loop", "forge-6-docs"],
|
|
101
|
-
"description": "The stage that should resolve this decision. Omit when unknown/any-later-stage."
|
|
102
|
-
},
|
|
103
|
-
"raisedBy": {
|
|
104
|
-
"type": "string",
|
|
105
|
-
"enum": ["forge-1-prd", "forge-2-tech", "forge-3-specs", "forge-4-backlog"],
|
|
106
|
-
"description": "The stage that deferred the decision."
|
|
107
|
-
},
|
|
108
|
-
"raisedAt": { "type": "string", "format": "date-time" },
|
|
109
|
-
"status": {
|
|
110
|
-
"type": "string",
|
|
111
|
-
"enum": ["open", "addressed", "dismissed"],
|
|
112
|
-
"default": "open",
|
|
113
|
-
"description": "Lifecycle: open → addressed|dismissed. The target stage flips open→addressed when it resolves the decision (or dismissed if it no longer applies); recording stages only create open entries."
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
|
-
"stages": {
|
|
119
|
-
"type": "object",
|
|
120
|
-
"properties": {
|
|
121
|
-
"forge-0-epic": { "$ref": "#/definitions/stageEntry" },
|
|
122
|
-
"forge-verify-epic": { "$ref": "#/definitions/verifyEntry" },
|
|
123
|
-
"forge-1-prd": { "$ref": "#/definitions/stageEntry" },
|
|
124
|
-
"forge-2-tech": { "$ref": "#/definitions/stageEntry" },
|
|
125
|
-
"forge-3-specs": { "$ref": "#/definitions/stageEntry" },
|
|
126
|
-
"forge-verify-specs": { "$ref": "#/definitions/verifyEntry" },
|
|
127
|
-
"forge-4-backlog": { "$ref": "#/definitions/stageEntry" },
|
|
128
|
-
"forge-verify-backlog": { "$ref": "#/definitions/verifyEntry" },
|
|
129
|
-
"forge-5-loop": { "$ref": "#/definitions/stageEntry" },
|
|
130
|
-
"forge-6-docs": { "$ref": "#/definitions/stageEntry" },
|
|
131
|
-
"forge-verify-impl": { "$ref": "#/definitions/verifyEntry" },
|
|
132
|
-
"forge-verify-prd": { "$ref": "#/definitions/verifyEntry" },
|
|
133
|
-
"forge-verify-tech": { "$ref": "#/definitions/verifyEntry" }
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
},
|
|
137
|
-
"definitions": {
|
|
138
|
-
"stageEntry": {
|
|
139
|
-
"type": "object",
|
|
140
|
-
"required": ["status"],
|
|
141
|
-
"properties": {
|
|
142
|
-
"status": {
|
|
143
|
-
"type": "string",
|
|
144
|
-
"enum": ["pending", "in-progress", "complete", "stale"]
|
|
145
|
-
},
|
|
146
|
-
"version": {
|
|
147
|
-
"type": "integer",
|
|
148
|
-
"description": "Incremented each time this stage's artifacts are revised"
|
|
149
|
-
},
|
|
150
|
-
"artifacts": {
|
|
151
|
-
"type": "array",
|
|
152
|
-
"items": { "type": "string" },
|
|
153
|
-
"description": "Relative paths to artifacts produced by this stage"
|
|
154
|
-
},
|
|
155
|
-
"startedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
156
|
-
"completedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
157
|
-
"commitHash": {
|
|
158
|
-
"type": ["string", "null"],
|
|
159
|
-
"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)."
|
|
160
|
-
},
|
|
161
|
-
"basedOnVersions": {
|
|
162
|
-
"type": "object",
|
|
163
|
-
"description": "Upstream stage versions this artifact was built against",
|
|
164
|
-
"additionalProperties": { "type": "integer" }
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
},
|
|
168
|
-
"verifyEntry": {
|
|
169
|
-
"type": "object",
|
|
170
|
-
"required": ["status"],
|
|
171
|
-
"properties": {
|
|
172
|
-
"status": {
|
|
173
|
-
"type": "string",
|
|
174
|
-
"enum": ["pending", "passed", "findings-reported", "findings-applied", "skipped"]
|
|
175
|
-
},
|
|
176
|
-
"findingsFile": {
|
|
177
|
-
"type": ["string", "null"],
|
|
178
|
-
"description": "Path to the verification findings document"
|
|
179
|
-
},
|
|
180
|
-
"findingsCount": {
|
|
181
|
-
"type": ["integer", "null"],
|
|
182
|
-
"description": "Number of findings reported"
|
|
183
|
-
},
|
|
184
|
-
"verifiedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
185
|
-
"fixedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
186
|
-
"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." },
|
|
187
|
-
"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." }
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"title": "Feature Forge Pipeline State",
|
|
4
|
-
"description": "Tracks pipeline progress for a single feature across sessions. Lives at {specsDir}/{feature}/.pipeline-state.json",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"required": ["feature", "createdAt", "updatedAt", "currentStage", "stages", "pipelineStatus"],
|
|
7
|
-
"properties": {
|
|
8
|
-
"pipelineStatus": {
|
|
9
|
-
"type": "string",
|
|
10
|
-
"enum": ["active", "paused", "abandoned"],
|
|
11
|
-
"default": "active"
|
|
12
|
-
},
|
|
13
|
-
"feature": {
|
|
14
|
-
"type": "string",
|
|
15
|
-
"description": "Feature name (matches directory name under specsDir)"
|
|
16
|
-
},
|
|
17
|
-
"epic": {
|
|
18
|
-
"type": "string",
|
|
19
|
-
"description": "Back-pointer to the owning epic's name. Absent for standalone features. The epic-manifest.json is canonical on conflict (REQ-STATE-01)."
|
|
20
|
-
},
|
|
21
|
-
"branch": {
|
|
22
|
-
"type": "string",
|
|
23
|
-
"description": "Git branch this feature's pipeline work is intended to land on, recorded by the Branch Setup block (shared-conventions.md) at the entry stage. Absent when the project isn't a git repo or branchPerFeature is false. Downstream stages and forge-5-loop compare the current branch against this to detect drift back onto the default branch before committing."
|
|
24
|
-
},
|
|
25
|
-
"createdAt": {
|
|
26
|
-
"type": "string",
|
|
27
|
-
"format": "date-time"
|
|
28
|
-
},
|
|
29
|
-
"updatedAt": {
|
|
30
|
-
"type": "string",
|
|
31
|
-
"format": "date-time"
|
|
32
|
-
},
|
|
33
|
-
"currentStage": {
|
|
34
|
-
"type": "string",
|
|
35
|
-
"enum": ["forge-1-prd", "forge-2-tech", "forge-3-specs", "forge-4-backlog", "forge-5-loop", "forge-6-docs", "complete", "forge-verify-prd", "forge-verify-tech", "forge-verify-specs", "forge-verify-backlog", "forge-verify-impl", "forge-0-epic", "forge-verify-epic"],
|
|
36
|
-
"description": "Where the pipeline IS: the most recently started stage — its `stages[<currentStage>].status` is `in-progress` while that stage is being authored, then `complete` once its artifacts are committed. A stage skill sets this to its own id when it starts. This is deliberately NOT 'the next stage to run': the next stage is DERIVED, never stored — it is the first production stage whose `stages[].status` is not `complete` (see `next_stage()` in forge-session.py, surfaced as the navigator/doctor `nextStage`). Consumers that need 'what runs next' compute it from `stages[].status`, not from this field. `complete` is a LEGACY enum value, retained so pre-0.14 state files still validate: no writer produces it (the `state-*` verbs are the only writers, and only `state-enter` touches this field, setting it to the stage being entered). A finished pipeline therefore records the last stage it started — `forge-6-docs` — and 'the whole pipeline is done' is DERIVED too: `next_stage()` returns null (surfaced as `nextStage: null` / `complete: true`). Never test this field against `complete` to decide whether a pipeline finished. (Legacy/absent value: tools fall back to the derived next stage for display only — `build_rows` in forge-session.py.)"
|
|
37
|
-
},
|
|
38
|
-
"notes": {
|
|
39
|
-
"type": "string",
|
|
40
|
-
"description": "Free-form notes persisted between sessions (user can add context before stepping away)"
|
|
41
|
-
},
|
|
42
|
-
"epicChangeRequests": {
|
|
43
|
-
"type": "array",
|
|
44
|
-
"description": "Epic-level change requests raised by a member stage (forge-1-prd/forge-2-tech) when the epic DECOMPOSITION itself must change — distinct from the same-feature `notes` parking lot. Read by forge-0-epic edit mode (which applies them) and by forge-session stage-exit (which routes the exit on `blocksCurrent`). Absent/empty for standalone features. Additive/optional: legacy states without it validate unchanged.",
|
|
45
|
-
"items": {
|
|
46
|
-
"type": "object",
|
|
47
|
-
"required": ["kind", "target", "rationale", "blocksCurrent", "raisedBy", "raisedAt", "status"],
|
|
48
|
-
"additionalProperties": false,
|
|
49
|
-
"properties": {
|
|
50
|
-
"kind": {
|
|
51
|
-
"type": "string",
|
|
52
|
-
"enum": ["add-feature", "redep", "move-boundary", "split"],
|
|
53
|
-
"description": "The decomposition change. add-feature/redep map 1:1 onto edit-mode mutators; move-boundary/split are composite (applied guided-manual in v1)."
|
|
54
|
-
},
|
|
55
|
-
"target": {
|
|
56
|
-
"type": "string",
|
|
57
|
-
"description": "The sibling feature to add, or the feature/boundary affected."
|
|
58
|
-
},
|
|
59
|
-
"rationale": {
|
|
60
|
-
"type": "string",
|
|
61
|
-
"description": "Why the epic must change; seeds the edit-mode charter/prompt when applied."
|
|
62
|
-
},
|
|
63
|
-
"blocksCurrent": {
|
|
64
|
-
"type": "boolean",
|
|
65
|
-
"description": "true → the current feature's next stage would build on a soon-to-change decomposition (pause-now: reconcile before proceeding). false → a peer/downstream change (finish-then-edit). Drives stage-exit routing."
|
|
66
|
-
},
|
|
67
|
-
"raisedBy": {
|
|
68
|
-
"type": "string",
|
|
69
|
-
"enum": ["forge-1-prd", "forge-2-tech"],
|
|
70
|
-
"description": "The stage that detected the epic-level concern."
|
|
71
|
-
},
|
|
72
|
-
"raisedAt": { "type": "string", "format": "date-time" },
|
|
73
|
-
"status": {
|
|
74
|
-
"type": "string",
|
|
75
|
-
"enum": ["open", "applied", "dismissed"],
|
|
76
|
-
"default": "open",
|
|
77
|
-
"description": "Lifecycle: open → applied|dismissed. Only forge-0-epic edit mode flips open→applied/dismissed; recording stages only create open entries; navigator/verify only read."
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
"deferredDecisions": {
|
|
83
|
-
"type": "array",
|
|
84
|
-
"description": "Same-feature decisions deliberately postponed to a LATER stage of THIS feature — a structured alternative to burying them in the free-text `notes` string. Distinct from `notes` (unstructured scratch) and from `epicChangeRequests[]` (the epic DECOMPOSITION must change). Use this when a stage would otherwise be tempted to solicit a decision that properly belongs to a downstream stage (e.g. forge-1-prd deferring the concrete cache backend to forge-2-tech): record it here instead of asking now (see the deferred-decisions rule in `references/stage-exit-protocol.md`), and the target stage addresses it. Additive/optional: legacy states without it validate unchanged.",
|
|
85
|
-
"items": {
|
|
86
|
-
"type": "object",
|
|
87
|
-
"required": ["question", "raisedBy", "raisedAt", "status"],
|
|
88
|
-
"additionalProperties": false,
|
|
89
|
-
"properties": {
|
|
90
|
-
"question": {
|
|
91
|
-
"type": "string",
|
|
92
|
-
"description": "The decision being deferred, phrased as a concrete question for the target stage to answer."
|
|
93
|
-
},
|
|
94
|
-
"rationale": {
|
|
95
|
-
"type": "string",
|
|
96
|
-
"description": "Why it is deferred rather than decided now (e.g. depends on information the target stage produces)."
|
|
97
|
-
},
|
|
98
|
-
"targetStage": {
|
|
99
|
-
"type": "string",
|
|
100
|
-
"enum": ["forge-1-prd", "forge-2-tech", "forge-3-specs", "forge-4-backlog", "forge-5-loop", "forge-6-docs"],
|
|
101
|
-
"description": "The stage that should resolve this decision. Omit when unknown/any-later-stage."
|
|
102
|
-
},
|
|
103
|
-
"raisedBy": {
|
|
104
|
-
"type": "string",
|
|
105
|
-
"enum": ["forge-1-prd", "forge-2-tech", "forge-3-specs", "forge-4-backlog"],
|
|
106
|
-
"description": "The stage that deferred the decision."
|
|
107
|
-
},
|
|
108
|
-
"raisedAt": { "type": "string", "format": "date-time" },
|
|
109
|
-
"status": {
|
|
110
|
-
"type": "string",
|
|
111
|
-
"enum": ["open", "addressed", "dismissed"],
|
|
112
|
-
"default": "open",
|
|
113
|
-
"description": "Lifecycle: open → addressed|dismissed. The target stage flips open→addressed when it resolves the decision (or dismissed if it no longer applies); recording stages only create open entries."
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
|
-
"stages": {
|
|
119
|
-
"type": "object",
|
|
120
|
-
"properties": {
|
|
121
|
-
"forge-0-epic": { "$ref": "#/definitions/stageEntry" },
|
|
122
|
-
"forge-verify-epic": { "$ref": "#/definitions/verifyEntry" },
|
|
123
|
-
"forge-1-prd": { "$ref": "#/definitions/stageEntry" },
|
|
124
|
-
"forge-2-tech": { "$ref": "#/definitions/stageEntry" },
|
|
125
|
-
"forge-3-specs": { "$ref": "#/definitions/stageEntry" },
|
|
126
|
-
"forge-verify-specs": { "$ref": "#/definitions/verifyEntry" },
|
|
127
|
-
"forge-4-backlog": { "$ref": "#/definitions/stageEntry" },
|
|
128
|
-
"forge-verify-backlog": { "$ref": "#/definitions/verifyEntry" },
|
|
129
|
-
"forge-5-loop": { "$ref": "#/definitions/stageEntry" },
|
|
130
|
-
"forge-6-docs": { "$ref": "#/definitions/stageEntry" },
|
|
131
|
-
"forge-verify-impl": { "$ref": "#/definitions/verifyEntry" },
|
|
132
|
-
"forge-verify-prd": { "$ref": "#/definitions/verifyEntry" },
|
|
133
|
-
"forge-verify-tech": { "$ref": "#/definitions/verifyEntry" }
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
},
|
|
137
|
-
"definitions": {
|
|
138
|
-
"stageEntry": {
|
|
139
|
-
"type": "object",
|
|
140
|
-
"required": ["status"],
|
|
141
|
-
"properties": {
|
|
142
|
-
"status": {
|
|
143
|
-
"type": "string",
|
|
144
|
-
"enum": ["pending", "in-progress", "complete", "stale"]
|
|
145
|
-
},
|
|
146
|
-
"version": {
|
|
147
|
-
"type": "integer",
|
|
148
|
-
"description": "Incremented each time this stage's artifacts are revised"
|
|
149
|
-
},
|
|
150
|
-
"artifacts": {
|
|
151
|
-
"type": "array",
|
|
152
|
-
"items": { "type": "string" },
|
|
153
|
-
"description": "Relative paths to artifacts produced by this stage"
|
|
154
|
-
},
|
|
155
|
-
"startedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
156
|
-
"completedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
157
|
-
"commitHash": {
|
|
158
|
-
"type": ["string", "null"],
|
|
159
|
-
"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)."
|
|
160
|
-
},
|
|
161
|
-
"basedOnVersions": {
|
|
162
|
-
"type": "object",
|
|
163
|
-
"description": "Upstream stage versions this artifact was built against",
|
|
164
|
-
"additionalProperties": { "type": "integer" }
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
},
|
|
168
|
-
"verifyEntry": {
|
|
169
|
-
"type": "object",
|
|
170
|
-
"required": ["status"],
|
|
171
|
-
"properties": {
|
|
172
|
-
"status": {
|
|
173
|
-
"type": "string",
|
|
174
|
-
"enum": ["pending", "passed", "findings-reported", "findings-applied", "skipped"]
|
|
175
|
-
},
|
|
176
|
-
"findingsFile": {
|
|
177
|
-
"type": ["string", "null"],
|
|
178
|
-
"description": "Path to the verification findings document"
|
|
179
|
-
},
|
|
180
|
-
"findingsCount": {
|
|
181
|
-
"type": ["integer", "null"],
|
|
182
|
-
"description": "Number of findings reported"
|
|
183
|
-
},
|
|
184
|
-
"verifiedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
185
|
-
"fixedAt": { "type": ["string", "null"], "format": "date-time" },
|
|
186
|
-
"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." },
|
|
187
|
-
"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." }
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|