@garygentry/feature-forge 0.3.6 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/adapters/GENERATION-REPORT.md +20 -0
- package/adapters/claude/.claude-plugin/plugin.json +16 -0
- package/adapters/claude/.feature-forge-bundle.json +1 -1
- package/adapters/claude/agents/forge-verifier.md +16 -5
- package/adapters/claude/references/forge-config-schema.json +3 -3
- package/adapters/claude/references/portable-root.md +20 -16
- package/adapters/claude/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/references/process-overview.md +1 -1
- package/adapters/claude/references/select-outcome.md +138 -0
- package/adapters/claude/references/shared-conventions.md +175 -22
- package/adapters/claude/references/skill-frontmatter.schema.json +3 -1
- package/adapters/claude/references/stack-resolution.md +1 -1
- package/adapters/claude/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/claude/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/claude/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/claude/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/claude/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/claude/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/claude/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/claude/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/claude/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/claude/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/claude/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/claude/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/claude/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/claude/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/claude/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/claude/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/claude/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/claude/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/claude/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/claude/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/claude/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/claude/references/verify-state.md +98 -0
- package/adapters/claude/scripts/forge-bootstrap.py +23 -2
- package/adapters/claude/scripts/forge-root.sh +104 -21
- package/adapters/claude/scripts/forge-session.py +620 -6973
- package/adapters/claude/scripts/forge_session/__init__.py +11 -0
- package/adapters/claude/scripts/forge_session/_common.py +1566 -0
- package/adapters/claude/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/claude/scripts/forge_session/cli.py +1067 -0
- package/adapters/claude/scripts/forge_session/decisions.py +355 -0
- package/adapters/claude/scripts/forge_session/discover.py +472 -0
- package/adapters/claude/scripts/forge_session/doctor.py +2144 -0
- package/adapters/claude/scripts/forge_session/exit.py +1081 -0
- package/adapters/claude/scripts/forge_session/outcomes.py +574 -0
- package/adapters/claude/scripts/forge_session/routes.py +1162 -0
- package/adapters/claude/scripts/forge_session/state.py +1479 -0
- package/adapters/claude/scripts/forge_session/topology.py +443 -0
- package/adapters/claude/skills/forge/SKILL.md +7 -7
- package/adapters/claude/skills/forge/references/process-overview.md +1 -1
- package/adapters/claude/skills/forge/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-0-epic/SKILL.md +7 -7
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +9 -5
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
- package/adapters/claude/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-1-prd/SKILL.md +7 -7
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-2-tech/SKILL.md +7 -7
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-3-specs/SKILL.md +5 -5
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +16 -8
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/claude/skills/forge-5-loop/SKILL.md +36 -41
- package/adapters/claude/skills/forge-5-loop/references/agent-selection.md +4 -0
- package/adapters/claude/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/skills/forge-5-loop/references/recovery-procedure.md +10 -0
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +15 -5
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/claude/skills/forge-6-docs/SKILL.md +21 -14
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/claude/skills/forge-bootstrap/SKILL.md +19 -10
- package/adapters/claude/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/claude/skills/forge-fix/SKILL.md +15 -18
- package/adapters/claude/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-guide/SKILL.md +87 -1
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +3 -3
- package/adapters/claude/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/skills/forge-guide/references/process-overview.md +1 -1
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/claude/skills/forge-init/SKILL.md +58 -7
- package/adapters/claude/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/claude/skills/forge-verify/SKILL.md +20 -23
- package/adapters/claude/skills/forge-verify/references/findings-template.md +2 -2
- package/adapters/claude/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/codex/.feature-forge-bundle.json +1 -1
- package/adapters/codex/agents/forge-researcher.toml +1 -1
- package/adapters/codex/agents/forge-verifier.toml +17 -6
- package/adapters/codex/references/forge-config-schema.json +5 -5
- package/adapters/codex/references/portable-root.md +20 -16
- package/adapters/codex/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/references/process-overview.md +10 -10
- package/adapters/codex/references/select-outcome.md +138 -0
- package/adapters/codex/references/shared-conventions.md +188 -35
- package/adapters/codex/references/skill-frontmatter.schema.json +3 -1
- package/adapters/codex/references/stack-resolution.md +1 -1
- package/adapters/codex/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/codex/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/codex/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/codex/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/codex/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/codex/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/codex/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/codex/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/codex/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/codex/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/codex/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/codex/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/codex/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/codex/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/codex/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/codex/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/codex/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/codex/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/codex/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/codex/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/codex/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/codex/references/verify-state.md +98 -0
- package/adapters/codex/scripts/forge-bootstrap.py +23 -2
- package/adapters/codex/scripts/forge-root.sh +104 -21
- package/adapters/codex/scripts/forge-session.py +620 -6973
- package/adapters/codex/scripts/forge_session/__init__.py +11 -0
- package/adapters/codex/scripts/forge_session/_common.py +1566 -0
- package/adapters/codex/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/codex/scripts/forge_session/cli.py +1067 -0
- package/adapters/codex/scripts/forge_session/decisions.py +355 -0
- package/adapters/codex/scripts/forge_session/discover.py +472 -0
- package/adapters/codex/scripts/forge_session/doctor.py +2144 -0
- package/adapters/codex/scripts/forge_session/exit.py +1081 -0
- package/adapters/codex/scripts/forge_session/outcomes.py +574 -0
- package/adapters/codex/scripts/forge_session/routes.py +1162 -0
- package/adapters/codex/scripts/forge_session/state.py +1479 -0
- package/adapters/codex/scripts/forge_session/topology.py +443 -0
- package/adapters/codex/skills/forge/SKILL.md +40 -40
- package/adapters/codex/skills/forge/references/process-overview.md +10 -10
- package/adapters/codex/skills/forge/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-0-epic/SKILL.md +15 -15
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/codex/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-1-prd/SKILL.md +15 -15
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-2-tech/SKILL.md +15 -15
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-3-specs/SKILL.md +10 -10
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +19 -11
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/codex/skills/forge-5-loop/SKILL.md +48 -53
- package/adapters/codex/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/codex/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +18 -8
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/codex/skills/forge-6-docs/SKILL.md +27 -20
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/codex/skills/forge-bootstrap/SKILL.md +23 -15
- package/adapters/codex/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/codex/skills/forge-fix/SKILL.md +27 -30
- package/adapters/codex/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-guide/SKILL.md +84 -7
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +5 -5
- package/adapters/codex/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/codex/skills/forge-guide/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/codex/skills/forge-init/SKILL.md +62 -12
- package/adapters/codex/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/codex/skills/forge-verify/SKILL.md +27 -30
- package/adapters/codex/skills/forge-verify/references/findings-template.md +2 -2
- package/adapters/codex/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/copilot/.feature-forge-bundle.json +1 -1
- package/adapters/copilot/agents/forge-researcher.md +1 -1
- package/adapters/copilot/agents/forge-verifier.md +17 -6
- package/adapters/copilot/references/forge-config-schema.json +5 -5
- package/adapters/copilot/references/portable-root.md +20 -16
- package/adapters/copilot/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/references/process-overview.md +10 -10
- package/adapters/copilot/references/select-outcome.md +138 -0
- package/adapters/copilot/references/shared-conventions.md +188 -35
- package/adapters/copilot/references/skill-frontmatter.schema.json +3 -1
- package/adapters/copilot/references/stack-resolution.md +1 -1
- package/adapters/copilot/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/copilot/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/copilot/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/copilot/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/copilot/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/copilot/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/copilot/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/copilot/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/copilot/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/copilot/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/copilot/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/copilot/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/copilot/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/copilot/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/copilot/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/copilot/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/copilot/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/copilot/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/copilot/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/copilot/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/copilot/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/copilot/references/verify-state.md +98 -0
- package/adapters/copilot/scripts/forge-bootstrap.py +23 -2
- package/adapters/copilot/scripts/forge-root.sh +104 -21
- package/adapters/copilot/scripts/forge-session.py +620 -6973
- package/adapters/copilot/scripts/forge_session/__init__.py +11 -0
- package/adapters/copilot/scripts/forge_session/_common.py +1566 -0
- package/adapters/copilot/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/copilot/scripts/forge_session/cli.py +1067 -0
- package/adapters/copilot/scripts/forge_session/decisions.py +355 -0
- package/adapters/copilot/scripts/forge_session/discover.py +472 -0
- package/adapters/copilot/scripts/forge_session/doctor.py +2144 -0
- package/adapters/copilot/scripts/forge_session/exit.py +1081 -0
- package/adapters/copilot/scripts/forge_session/outcomes.py +574 -0
- package/adapters/copilot/scripts/forge_session/routes.py +1162 -0
- package/adapters/copilot/scripts/forge_session/state.py +1479 -0
- package/adapters/copilot/scripts/forge_session/topology.py +443 -0
- package/adapters/copilot/skills/forge/forge.md +40 -40
- package/adapters/copilot/skills/forge/references/process-overview.md +10 -10
- package/adapters/copilot/skills/forge/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +15 -15
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/copilot/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +15 -15
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +15 -15
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +10 -10
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +19 -11
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +48 -53
- package/adapters/copilot/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/copilot/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +18 -8
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +27 -20
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/copilot/skills/forge-bootstrap/forge-bootstrap.md +23 -15
- package/adapters/copilot/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/copilot/skills/forge-fix/forge-fix.md +27 -30
- package/adapters/copilot/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-guide/forge-guide.md +84 -7
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +5 -5
- package/adapters/copilot/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/copilot/skills/forge-init/forge-init.md +62 -12
- package/adapters/copilot/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/copilot/skills/forge-verify/forge-verify.md +27 -30
- package/adapters/copilot/skills/forge-verify/references/findings-template.md +2 -2
- package/adapters/copilot/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/cursor/.feature-forge-bundle.json +1 -1
- package/adapters/cursor/agents/forge-researcher.mdc +1 -1
- package/adapters/cursor/agents/forge-verifier.mdc +17 -6
- package/adapters/cursor/references/forge-config-schema.json +5 -5
- package/adapters/cursor/references/portable-root.md +20 -16
- package/adapters/cursor/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/references/process-overview.md +10 -10
- package/adapters/cursor/references/select-outcome.md +138 -0
- package/adapters/cursor/references/shared-conventions.md +188 -35
- package/adapters/cursor/references/skill-frontmatter.schema.json +3 -1
- package/adapters/cursor/references/stack-resolution.md +1 -1
- package/adapters/cursor/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/cursor/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/cursor/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/cursor/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/cursor/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/cursor/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/cursor/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/cursor/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/cursor/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/cursor/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/cursor/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/cursor/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/cursor/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/cursor/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/cursor/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/cursor/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/cursor/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/cursor/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/cursor/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/cursor/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/cursor/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/cursor/references/verify-state.md +98 -0
- package/adapters/cursor/scripts/forge-bootstrap.py +23 -2
- package/adapters/cursor/scripts/forge-root.sh +104 -21
- package/adapters/cursor/scripts/forge-session.py +620 -6973
- package/adapters/cursor/scripts/forge_session/__init__.py +11 -0
- package/adapters/cursor/scripts/forge_session/_common.py +1566 -0
- package/adapters/cursor/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/cursor/scripts/forge_session/cli.py +1067 -0
- package/adapters/cursor/scripts/forge_session/decisions.py +355 -0
- package/adapters/cursor/scripts/forge_session/discover.py +472 -0
- package/adapters/cursor/scripts/forge_session/doctor.py +2144 -0
- package/adapters/cursor/scripts/forge_session/exit.py +1081 -0
- package/adapters/cursor/scripts/forge_session/outcomes.py +574 -0
- package/adapters/cursor/scripts/forge_session/routes.py +1162 -0
- package/adapters/cursor/scripts/forge_session/state.py +1479 -0
- package/adapters/cursor/scripts/forge_session/topology.py +443 -0
- package/adapters/cursor/skills/forge/forge.mdc +40 -40
- package/adapters/cursor/skills/forge/references/process-overview.md +10 -10
- package/adapters/cursor/skills/forge/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +15 -15
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/cursor/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +15 -15
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +15 -15
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +10 -10
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +19 -11
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +48 -53
- package/adapters/cursor/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/cursor/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +18 -8
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +27 -20
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/cursor/skills/forge-bootstrap/forge-bootstrap.mdc +23 -15
- package/adapters/cursor/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +27 -30
- package/adapters/cursor/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-guide/forge-guide.mdc +84 -7
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +5 -5
- package/adapters/cursor/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/cursor/skills/forge-init/forge-init.mdc +62 -12
- package/adapters/cursor/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +27 -30
- package/adapters/cursor/skills/forge-verify/references/findings-template.md +2 -2
- package/adapters/cursor/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/gemini/.feature-forge-bundle.json +1 -1
- package/adapters/gemini/agents/forge-researcher.md +1 -1
- package/adapters/gemini/agents/forge-verifier.md +17 -6
- package/adapters/gemini/gemini-extension.json +13 -13
- package/adapters/gemini/references/forge-config-schema.json +5 -5
- package/adapters/gemini/references/portable-root.md +20 -16
- package/adapters/gemini/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/references/process-overview.md +10 -10
- package/adapters/gemini/references/select-outcome.md +138 -0
- package/adapters/gemini/references/shared-conventions.md +188 -35
- package/adapters/gemini/references/skill-frontmatter.schema.json +3 -1
- package/adapters/gemini/references/stack-resolution.md +1 -1
- package/adapters/gemini/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/gemini/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/gemini/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/gemini/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/gemini/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/gemini/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/gemini/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/gemini/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/gemini/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/gemini/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/gemini/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/gemini/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/gemini/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/gemini/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/gemini/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/gemini/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/gemini/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/gemini/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/gemini/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/gemini/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/gemini/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/gemini/references/verify-state.md +98 -0
- package/adapters/gemini/scripts/forge-bootstrap.py +23 -2
- package/adapters/gemini/scripts/forge-root.sh +104 -21
- package/adapters/gemini/scripts/forge-session.py +620 -6973
- package/adapters/gemini/scripts/forge_session/__init__.py +11 -0
- package/adapters/gemini/scripts/forge_session/_common.py +1566 -0
- package/adapters/gemini/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/gemini/scripts/forge_session/cli.py +1067 -0
- package/adapters/gemini/scripts/forge_session/decisions.py +355 -0
- package/adapters/gemini/scripts/forge_session/discover.py +472 -0
- package/adapters/gemini/scripts/forge_session/doctor.py +2144 -0
- package/adapters/gemini/scripts/forge_session/exit.py +1081 -0
- package/adapters/gemini/scripts/forge_session/outcomes.py +574 -0
- package/adapters/gemini/scripts/forge_session/routes.py +1162 -0
- package/adapters/gemini/scripts/forge_session/state.py +1479 -0
- package/adapters/gemini/scripts/forge_session/topology.py +443 -0
- package/adapters/gemini/skills/forge/forge.md +40 -40
- package/adapters/gemini/skills/forge/references/process-overview.md +10 -10
- package/adapters/gemini/skills/forge/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +15 -15
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/gemini/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +15 -15
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +15 -15
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +10 -10
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +19 -11
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +48 -53
- package/adapters/gemini/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/gemini/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +18 -8
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +27 -20
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/gemini/skills/forge-bootstrap/forge-bootstrap.md +23 -15
- package/adapters/gemini/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/gemini/skills/forge-fix/forge-fix.md +27 -30
- package/adapters/gemini/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-guide/forge-guide.md +84 -7
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +5 -5
- package/adapters/gemini/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/gemini/skills/forge-init/forge-init.md +62 -12
- package/adapters/gemini/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/gemini/skills/forge-verify/forge-verify.md +27 -30
- package/adapters/gemini/skills/forge-verify/references/findings-template.md +2 -2
- package/adapters/gemini/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/pi/.feature-forge-bundle.json +1 -1
- package/adapters/pi/agents/forge-verifier.md +16 -5
- package/adapters/pi/extensions/forge-invocation-args/README.md +106 -0
- package/adapters/pi/extensions/forge-invocation-args/index.ts +31 -0
- package/adapters/pi/extensions/forge-invocation-args/wiring.ts +172 -0
- package/adapters/pi/package.json +1 -0
- package/adapters/pi/references/forge-config-schema.json +3 -3
- package/adapters/pi/references/portable-root.md +20 -16
- package/adapters/pi/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/references/select-outcome.md +138 -0
- package/adapters/pi/references/shared-conventions.md +175 -22
- package/adapters/pi/references/skill-frontmatter.schema.json +3 -1
- package/adapters/pi/references/stack-resolution.md +1 -1
- package/adapters/pi/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/pi/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/pi/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/pi/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/pi/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/pi/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/pi/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/pi/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/pi/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/pi/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/pi/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/pi/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/pi/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/pi/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/pi/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/pi/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/pi/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/pi/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/pi/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/pi/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/pi/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/pi/references/verify-state.md +98 -0
- package/adapters/pi/scripts/forge-bootstrap.py +23 -2
- package/adapters/pi/scripts/forge-root.sh +104 -21
- package/adapters/pi/scripts/forge-session.py +620 -6973
- package/adapters/pi/scripts/forge_session/__init__.py +11 -0
- package/adapters/pi/scripts/forge_session/_common.py +1566 -0
- package/adapters/pi/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/pi/scripts/forge_session/cli.py +1067 -0
- package/adapters/pi/scripts/forge_session/decisions.py +355 -0
- package/adapters/pi/scripts/forge_session/discover.py +472 -0
- package/adapters/pi/scripts/forge_session/doctor.py +2144 -0
- package/adapters/pi/scripts/forge_session/exit.py +1081 -0
- package/adapters/pi/scripts/forge_session/outcomes.py +574 -0
- package/adapters/pi/scripts/forge_session/routes.py +1162 -0
- package/adapters/pi/scripts/forge_session/state.py +1479 -0
- package/adapters/pi/scripts/forge_session/topology.py +443 -0
- package/adapters/pi/skills/forge/SKILL.md +9 -8
- package/adapters/pi/skills/forge/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-0-epic/SKILL.md +9 -8
- package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +9 -5
- package/adapters/pi/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
- package/adapters/pi/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-1-prd/SKILL.md +9 -8
- package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-2-tech/SKILL.md +8 -7
- package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-3-specs/SKILL.md +7 -6
- package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-4-backlog/SKILL.md +18 -9
- package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/pi/skills/forge-5-loop/SKILL.md +38 -42
- package/adapters/pi/skills/forge-5-loop/references/agent-selection.md +4 -0
- package/adapters/pi/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/skills/forge-5-loop/references/recovery-procedure.md +10 -0
- package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +15 -5
- package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/pi/skills/forge-6-docs/SKILL.md +23 -15
- package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/pi/skills/forge-bootstrap/SKILL.md +20 -11
- package/adapters/pi/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/pi/skills/forge-fix/SKILL.md +17 -19
- package/adapters/pi/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/pi/skills/forge-fix/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-guide/SKILL.md +79 -1
- package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +3 -3
- package/adapters/pi/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/skills/forge-guide/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/pi/skills/forge-init/SKILL.md +59 -8
- package/adapters/pi/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/pi/skills/forge-verify/SKILL.md +17 -19
- package/adapters/pi/skills/forge-verify/references/findings-template.md +1 -1
- package/adapters/pi/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/pi/skills/forge-verify/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/dist/manifest.d.ts +1 -1
- package/dist/rauf.d.ts +3 -3
- package/dist/rauf.js +2 -2
- package/dist/source.d.ts +5 -2
- package/dist/source.js +5 -2
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
"""Deterministic verify/fix outcome + upstream-verification-state selection.
|
|
2
|
+
|
|
3
|
+
The ``select-outcome`` and ``verify-state`` verbs (#265 P3.1/P3.2, shipped by
|
|
4
|
+
#276/#277) live here, carved out of the ``forge-session.py`` monolith (#279 P4.1).
|
|
5
|
+
Both replace model judgment over conversational state with a derivation from the
|
|
6
|
+
authoritative on-disk record — the served stage's ``forge-verify-*`` entry and, for
|
|
7
|
+
``select-outcome``, the latest ``.verification/VERIFY-*.md`` report and its
|
|
8
|
+
``## Fix Progress`` sweep dispositions. Their flags, the outcome/case enums, exit
|
|
9
|
+
codes, and JSON shapes are FROZEN; the parity tests in ``tests/test_select_outcome.py``
|
|
10
|
+
and ``tests/test_verify_state.py`` pin the enums to ``references/select-outcome.md``
|
|
11
|
+
and ``references/verify-state.md``.
|
|
12
|
+
|
|
13
|
+
This is a pure move: shared readers and tables come from ``_common`` (never from the
|
|
14
|
+
shim, which would be circular); the shim re-exports every symbol below so the
|
|
15
|
+
path-loaded test oracle resolves it unchanged.
|
|
16
|
+
|
|
17
|
+
3.10 baseline, Google-style docstrings, stdlib only — matching the conventions of
|
|
18
|
+
the monolith it was carved out of.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import re
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from typing import Final, NamedTuple
|
|
26
|
+
|
|
27
|
+
from forge_session._common import (
|
|
28
|
+
KNOWN_VERIFY_STATUSES,
|
|
29
|
+
PIPELINE_STATE_FILENAME,
|
|
30
|
+
VERIFY_STATE_MESSAGES,
|
|
31
|
+
VERIFY_TOKEN_BY_STAGE,
|
|
32
|
+
UsageError,
|
|
33
|
+
_EXIT_VERIFY_TOKEN,
|
|
34
|
+
_read_state,
|
|
35
|
+
_resolve_feature_dir,
|
|
36
|
+
_scheduled_stage_version,
|
|
37
|
+
_stage_version,
|
|
38
|
+
_VERIFY_RESOLVED,
|
|
39
|
+
_verify_entry,
|
|
40
|
+
_warn_auto_verify_debt_metadata,
|
|
41
|
+
_warn_unknown_verify_status,
|
|
42
|
+
auto_pending_message,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _classify_verify_entry(entry: dict, verify_key: str, current: int | None) -> str:
|
|
47
|
+
"""Label one ``forge-verify-*`` entry against the artifact revision it serves.
|
|
48
|
+
|
|
49
|
+
The revision-agnostic half of ``_verify_state_for``, factored out because an
|
|
50
|
+
EPIC-scoped exit compares against the epic manifest's ``revision`` held in
|
|
51
|
+
``.epic-state.json``, not against a member production-stage ``version``
|
|
52
|
+
(REQ-SEC-01). Both callers must apply identical rules, so there is
|
|
53
|
+
one implementation rather than two that can drift.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
entry: The verify entry (``{}`` when absent).
|
|
57
|
+
verify_key: The ``forge-verify-*`` key, named in the metadata diagnostic.
|
|
58
|
+
current: The artifact's current revision, or None when it is unknown.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
One of fresh / stale / failing / auto-pending / never / skipped.
|
|
62
|
+
"""
|
|
63
|
+
status = entry.get("status")
|
|
64
|
+
if status is not None and not isinstance(status, str):
|
|
65
|
+
# Same guard as `verify_state`: an unhashable status from a torn or
|
|
66
|
+
# hand-edited entry must classify, not raise at the frozenset
|
|
67
|
+
# membership below — this label is read while closing a stage.
|
|
68
|
+
return "never"
|
|
69
|
+
if status == "skipped":
|
|
70
|
+
return "skipped"
|
|
71
|
+
if status == "findings-reported":
|
|
72
|
+
return "failing"
|
|
73
|
+
if status == "auto-verify-pending":
|
|
74
|
+
# Ahead of the generic unresolved branch, exactly as in verify_state.
|
|
75
|
+
if _scheduled_stage_version(entry) is None:
|
|
76
|
+
_warn_auto_verify_debt_metadata(verify_key)
|
|
77
|
+
return "auto-pending"
|
|
78
|
+
if status not in _VERIFY_RESOLVED:
|
|
79
|
+
return "never"
|
|
80
|
+
if status == "findings-applied":
|
|
81
|
+
# §4.2 step 4: applying fixes CLEARS freshness; only a later `passed` restores
|
|
82
|
+
# it. The writer omits `verifiedStageVersion` on this status, but REQ-DEBT-06
|
|
83
|
+
# requires loading legacy state without migration, so a pre-writer entry can
|
|
84
|
+
# still carry the key — and would otherwise read `fresh` here. Mirrors the
|
|
85
|
+
# identical guard in `verify_state` (§5.1).
|
|
86
|
+
return "stale"
|
|
87
|
+
verified_version = entry.get("verifiedStageVersion")
|
|
88
|
+
if (
|
|
89
|
+
isinstance(verified_version, int)
|
|
90
|
+
and current is not None
|
|
91
|
+
and verified_version == current
|
|
92
|
+
):
|
|
93
|
+
return "fresh"
|
|
94
|
+
return "stale"
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _verify_state_for(state: dict, stage: str) -> str:
|
|
98
|
+
"""Classify THIS stage's verify freshness (stage-scoped ``verify_state``).
|
|
99
|
+
|
|
100
|
+
Same labels as ``verify_state`` — fresh / stale / failing / auto-pending /
|
|
101
|
+
never / skipped / none — but for the given stage rather than the
|
|
102
|
+
most-recently completed one, because stage-exit runs inside the stage that
|
|
103
|
+
just closed. ``auto-pending`` is classified identically here so stage-exit
|
|
104
|
+
routing and the navigator ledger never disagree about owed debt (REQ-DEBT-05).
|
|
105
|
+
"""
|
|
106
|
+
token = _EXIT_VERIFY_TOKEN.get(stage)
|
|
107
|
+
if token is None:
|
|
108
|
+
return "none"
|
|
109
|
+
return _classify_verify_entry(
|
|
110
|
+
_verify_entry(state, f"forge-verify-{token}"),
|
|
111
|
+
f"forge-verify-{token}",
|
|
112
|
+
_stage_version(state, stage),
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
# --------------------------------------------------------------------------- #
|
|
117
|
+
# select-outcome — deterministic exit-outcome selection (forge-verify/forge-fix)
|
|
118
|
+
# --------------------------------------------------------------------------- #
|
|
119
|
+
#
|
|
120
|
+
# forge-verify and forge-fix each close a run by choosing ONE `stage-exit
|
|
121
|
+
# --outcome` value. That selection used to be model judgment over conversational
|
|
122
|
+
# state; this verb derives it from the authoritative on-disk record instead — the
|
|
123
|
+
# served stage's `forge-verify-*` entry (written mechanically by `state-verify`),
|
|
124
|
+
# the latest `.verification/VERIFY-*.md` report, and its `## Fix Progress` sweep
|
|
125
|
+
# dispositions — the same "never eyeball the graph" move `rank-features` makes for
|
|
126
|
+
# `verifyGate`. The full contract is `references/select-outcome.md`.
|
|
127
|
+
#
|
|
128
|
+
# The outcome vocabularies are NOT re-listed here: they are `VerifyOutcome` and
|
|
129
|
+
# `FixOutcome` (via EXIT_OUTCOMES), and `test_select_outcome.py`'s parity guard
|
|
130
|
+
# pins those aliases to the forge-verify/forge-fix skill-body outcome tables.
|
|
131
|
+
#
|
|
132
|
+
# Three outcomes cannot be read off disk, because the fact that distinguishes each
|
|
133
|
+
# is runtime-only: an operational failure leaves NO state write (so disk shows the
|
|
134
|
+
# prior state), and an explicit user deferral is byte-identical on disk to a
|
|
135
|
+
# nested/manual `applied`. The caller asserts those with a signal flag
|
|
136
|
+
# (`--op-failure`, `--user-deferred`, `--decisions-open`); every other outcome is
|
|
137
|
+
# pure disk derivation.
|
|
138
|
+
|
|
139
|
+
#: `VERIFY-{mode}-{YYYY-MM-DD}.md`, or `-round{N}.md` for a same-day re-run (N>=2).
|
|
140
|
+
#: The un-suffixed base file is round 1. Naming is owned by
|
|
141
|
+
#: `skills/forge-verify/references/findings-template.md` § Findings Document Template.
|
|
142
|
+
_VERIFY_REPORT_RE: Final = re.compile(
|
|
143
|
+
r"^VERIFY-(?P<mode>[a-z]+)-(?P<date>\d{4}-\d{2}-\d{2})"
|
|
144
|
+
r"(?:-round(?P<round>\d+))?\.md$"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
#: A `- **Severity:** {value}` line under `## Findings`. Blocking = error + gap.
|
|
148
|
+
_SEVERITY_LINE_RE: Final = re.compile(
|
|
149
|
+
r"^-\s*\*\*Severity:\*\*\s*([A-Za-z-]+)", re.MULTILINE
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class _VerifyReport(NamedTuple):
|
|
154
|
+
"""One findings report on disk, ordered by (date, round)."""
|
|
155
|
+
|
|
156
|
+
path: Path
|
|
157
|
+
date: str
|
|
158
|
+
round: int
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class _ReportFacts(NamedTuple):
|
|
162
|
+
"""The machine-readable facts a findings report carries.
|
|
163
|
+
|
|
164
|
+
Blocking-finding tallies come from the `## Findings` severities (ground truth),
|
|
165
|
+
never from the human-written `## Summary` line. The fix-side fields read the
|
|
166
|
+
`## Fix Progress` section the fix pass appends — its `[APPLIED]` steps and the
|
|
167
|
+
sweep dispositions (`FIXED`/`JUSTIFIED`/`FALSE-POSITIVE`).
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
total: int
|
|
171
|
+
errors: int
|
|
172
|
+
gaps: int
|
|
173
|
+
blocking: int
|
|
174
|
+
has_fix_progress: bool
|
|
175
|
+
applied_steps: int
|
|
176
|
+
fixed: int
|
|
177
|
+
justified: int
|
|
178
|
+
false_positive: int
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def _read_report_text(path: Path) -> str:
|
|
182
|
+
"""Read a findings report as UTF-8, downgrading an unreadable file to ``""``."""
|
|
183
|
+
try:
|
|
184
|
+
return path.read_text(encoding="utf-8")
|
|
185
|
+
except OSError:
|
|
186
|
+
return ""
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _verify_reports(feature_dir: Path, mode: str) -> list[_VerifyReport]:
|
|
190
|
+
"""Every ``VERIFY-{mode}-*.md`` report in ``.verification/``, oldest first.
|
|
191
|
+
|
|
192
|
+
The last element is therefore the newest round of the newest day — the report a
|
|
193
|
+
consumer means by "the latest". A tie on date breaks by round.
|
|
194
|
+
"""
|
|
195
|
+
vdir = feature_dir / ".verification"
|
|
196
|
+
if not vdir.is_dir():
|
|
197
|
+
return []
|
|
198
|
+
reports: list[_VerifyReport] = []
|
|
199
|
+
for entry in vdir.iterdir():
|
|
200
|
+
if not entry.is_file():
|
|
201
|
+
continue
|
|
202
|
+
match = _VERIFY_REPORT_RE.match(entry.name)
|
|
203
|
+
if match is None or match.group("mode") != mode:
|
|
204
|
+
continue
|
|
205
|
+
rnd = int(match.group("round")) if match.group("round") else 1
|
|
206
|
+
reports.append(_VerifyReport(entry, match.group("date"), rnd))
|
|
207
|
+
# (date, round) is the ordering key; the filename tiebreaks so the sort is total
|
|
208
|
+
# even for the pathological `…-round1.md` alias of the un-suffixed base file.
|
|
209
|
+
reports.sort(key=lambda r: (r.date, r.round, r.path.name))
|
|
210
|
+
return reports
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _section_body(text: str, title: str) -> str:
|
|
214
|
+
"""Return the body of the ``## {title}`` section, up to the next ``## `` heading.
|
|
215
|
+
|
|
216
|
+
Level-3 (``### ``) finding subsections stay inside their level-2 section, so a
|
|
217
|
+
``## Findings`` body keeps every ``### V-NNN`` block. Returns ``""`` when the
|
|
218
|
+
heading is absent.
|
|
219
|
+
"""
|
|
220
|
+
body: list[str] = []
|
|
221
|
+
capturing = False
|
|
222
|
+
for line in text.splitlines():
|
|
223
|
+
if line.startswith("## "):
|
|
224
|
+
if capturing:
|
|
225
|
+
break
|
|
226
|
+
capturing = line[3:].strip().lower() == title.lower()
|
|
227
|
+
continue
|
|
228
|
+
if capturing:
|
|
229
|
+
body.append(line)
|
|
230
|
+
return "\n".join(body)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def _parse_report_facts(text: str) -> _ReportFacts:
|
|
234
|
+
"""Extract the blocking tallies and fix-progress dispositions from a report."""
|
|
235
|
+
findings = _section_body(text, "Findings")
|
|
236
|
+
errors = gaps = inconsistencies = improvements = other = 0
|
|
237
|
+
for match in _SEVERITY_LINE_RE.finditer(findings):
|
|
238
|
+
sev = match.group(1).strip().lower()
|
|
239
|
+
if sev == "error":
|
|
240
|
+
errors += 1
|
|
241
|
+
elif sev == "gap":
|
|
242
|
+
gaps += 1
|
|
243
|
+
elif sev == "inconsistency":
|
|
244
|
+
inconsistencies += 1
|
|
245
|
+
elif sev == "improvement":
|
|
246
|
+
improvements += 1
|
|
247
|
+
else:
|
|
248
|
+
other += 1
|
|
249
|
+
total = errors + gaps + inconsistencies + improvements + other
|
|
250
|
+
|
|
251
|
+
has_fp = re.search(r"^##\s+Fix Progress\s*$", text, re.MULTILINE) is not None
|
|
252
|
+
fp_body = _section_body(text, "Fix Progress")
|
|
253
|
+
applied = len(re.findall(r"\[APPLIED\]", fp_body))
|
|
254
|
+
fixed = len(re.findall(r"→\s*FIXED", fp_body))
|
|
255
|
+
justified = len(re.findall(r"→\s*JUSTIFIED", fp_body))
|
|
256
|
+
false_positive = len(re.findall(r"→\s*FALSE-POSITIVE", fp_body))
|
|
257
|
+
return _ReportFacts(
|
|
258
|
+
total=total,
|
|
259
|
+
errors=errors,
|
|
260
|
+
gaps=gaps,
|
|
261
|
+
blocking=errors + gaps,
|
|
262
|
+
has_fix_progress=has_fp,
|
|
263
|
+
applied_steps=applied,
|
|
264
|
+
fixed=fixed,
|
|
265
|
+
justified=justified,
|
|
266
|
+
false_positive=false_positive,
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def _verify_outcome(
|
|
271
|
+
status: str | None, facts: _ReportFacts | None, *, op_failure: bool
|
|
272
|
+
) -> tuple[str, str]:
|
|
273
|
+
"""Map the disk record + the one verify signal to a ``VerifyOutcome``."""
|
|
274
|
+
if op_failure:
|
|
275
|
+
return "failed", (
|
|
276
|
+
"caller asserted an operational failure (a dispatch, a check, or the "
|
|
277
|
+
"state write failed); no verification result was persisted"
|
|
278
|
+
)
|
|
279
|
+
if status == "skipped":
|
|
280
|
+
return "skipped", (
|
|
281
|
+
"the served stage's verification was explicitly deferred and persisted "
|
|
282
|
+
"(state-verify --status skipped)"
|
|
283
|
+
)
|
|
284
|
+
if status == "findings-reported":
|
|
285
|
+
if facts is None:
|
|
286
|
+
return "findings", (
|
|
287
|
+
"the verify entry records findings-reported, but its report file is "
|
|
288
|
+
"absent or unreadable on disk"
|
|
289
|
+
)
|
|
290
|
+
return "findings", (
|
|
291
|
+
f"the recorded verification wrote a report with {facts.blocking} blocking "
|
|
292
|
+
"finding(s) (error/gap)"
|
|
293
|
+
)
|
|
294
|
+
if status == "passed":
|
|
295
|
+
return "passed", (
|
|
296
|
+
"the recorded verification is passed (a clean report, an advisory-only "
|
|
297
|
+
"report, or accepted residual findings)"
|
|
298
|
+
)
|
|
299
|
+
raise UsageError(
|
|
300
|
+
"forge-verify has recorded no terminal result for served stage "
|
|
301
|
+
f"({status or 'no verify entry'}); run state-verify first, or pass "
|
|
302
|
+
"--op-failure if the run failed before it could record one"
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def _fix_outcome(
|
|
307
|
+
status: str | None,
|
|
308
|
+
*,
|
|
309
|
+
has_reports: bool,
|
|
310
|
+
fix_applied: bool,
|
|
311
|
+
op_failure: bool,
|
|
312
|
+
user_deferred: bool,
|
|
313
|
+
decisions_open: bool,
|
|
314
|
+
) -> tuple[str, str]:
|
|
315
|
+
"""Map the disk record + the three fix signals to a ``FixOutcome``."""
|
|
316
|
+
if op_failure:
|
|
317
|
+
return "failed", (
|
|
318
|
+
"caller asserted an operational failure (a fix step, a validation, a "
|
|
319
|
+
"commit, or a state write failed); nothing advanced"
|
|
320
|
+
)
|
|
321
|
+
if user_deferred:
|
|
322
|
+
return "deferred", (
|
|
323
|
+
"caller asserted the user explicitly deferred the fix pass or the "
|
|
324
|
+
"mandatory re-verify; the served stage's verification stays outstanding"
|
|
325
|
+
)
|
|
326
|
+
if decisions_open:
|
|
327
|
+
return "decisions", (
|
|
328
|
+
"caller asserted unresolved user decisions block the remaining fixes; "
|
|
329
|
+
"no advancement"
|
|
330
|
+
)
|
|
331
|
+
if not has_reports:
|
|
332
|
+
return "no-findings", (
|
|
333
|
+
"no VERIFY findings document exists for the served stage — nothing to fix"
|
|
334
|
+
)
|
|
335
|
+
if status == "findings-applied":
|
|
336
|
+
return "applied", (
|
|
337
|
+
"fixes are recorded (findings-applied) and no passing re-verify has yet "
|
|
338
|
+
"cleared them; a re-verify is still owed"
|
|
339
|
+
)
|
|
340
|
+
if status == "passed":
|
|
341
|
+
# A forge-fix pass reaches a `passed` served stage only by re-verifying it:
|
|
342
|
+
# Step 1.5 resolves the served stage to an UNRESOLVED verify entry
|
|
343
|
+
# (findings-reported, findings-applied, or a pending debt), never an already
|
|
344
|
+
# resolved `passed`, so a `passed` entry at a fix exit is the mandatory
|
|
345
|
+
# re-verify's own passing result. `fix_applied` is deliberately not consulted —
|
|
346
|
+
# it reads every round on disk and so cannot tell this pass's fixes from an
|
|
347
|
+
# earlier cycle's, and the reason must not claim "this pass" of either.
|
|
348
|
+
return "reverified", (
|
|
349
|
+
"the served stage's verification is passing — the mandatory re-verify "
|
|
350
|
+
"recorded a passing result and cleared the applied fixes"
|
|
351
|
+
)
|
|
352
|
+
if status == "findings-reported":
|
|
353
|
+
if fix_applied:
|
|
354
|
+
return "reverify-findings", (
|
|
355
|
+
"fixes were applied and a re-verify reopened blocking findings for "
|
|
356
|
+
"the served stage"
|
|
357
|
+
)
|
|
358
|
+
raise UsageError(
|
|
359
|
+
"forge-fix ended with the served stage still findings-reported and no "
|
|
360
|
+
"fixes recorded; pass --decisions-open, --user-deferred, or --op-failure "
|
|
361
|
+
"to name the runtime reason, or run forge-fix to apply the plan"
|
|
362
|
+
)
|
|
363
|
+
if not fix_applied:
|
|
364
|
+
return "no-findings", (
|
|
365
|
+
"no unresolved findings are owed for the served stage "
|
|
366
|
+
f"(verify entry: {status or 'absent'})"
|
|
367
|
+
)
|
|
368
|
+
raise UsageError(
|
|
369
|
+
"forge-fix reached an inconsistent state — fixes are recorded on disk but the "
|
|
370
|
+
f"served stage's verify entry is {status or 'absent'}; re-run state-verify to "
|
|
371
|
+
"record the result before selecting an outcome"
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def select_outcome(
|
|
376
|
+
feature: str,
|
|
377
|
+
served_stage: str,
|
|
378
|
+
skill: str,
|
|
379
|
+
specs_dir: Path,
|
|
380
|
+
epic: str | None,
|
|
381
|
+
*,
|
|
382
|
+
op_failure: bool,
|
|
383
|
+
user_deferred: bool,
|
|
384
|
+
decisions_open: bool,
|
|
385
|
+
) -> dict:
|
|
386
|
+
"""Derive the deterministic ``stage-exit --outcome`` for a verify/fix run.
|
|
387
|
+
|
|
388
|
+
Returns ``{"outcome", "reason", "evidence": [...]}``. Raises ``UsageError`` (the
|
|
389
|
+
fail-closed exit-2 path) rather than guessing when the disk record cannot name a
|
|
390
|
+
terminal outcome and no runtime signal was supplied.
|
|
391
|
+
"""
|
|
392
|
+
if served_stage not in VERIFY_TOKEN_BY_STAGE:
|
|
393
|
+
raise UsageError(
|
|
394
|
+
f"--served-stage {served_stage!r} carries no verify entry; select-outcome "
|
|
395
|
+
f"serves {', '.join(VERIFY_TOKEN_BY_STAGE)} (forge-0-epic and forge-6-docs "
|
|
396
|
+
"are out of scope)"
|
|
397
|
+
)
|
|
398
|
+
if skill == "verify" and (user_deferred or decisions_open):
|
|
399
|
+
raise UsageError(
|
|
400
|
+
"--user-deferred and --decisions-open are forge-fix signals; forge-verify's "
|
|
401
|
+
"only runtime signal is --op-failure"
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
token = VERIFY_TOKEN_BY_STAGE[served_stage]
|
|
405
|
+
verify_key = f"forge-verify-{token}"
|
|
406
|
+
feature_dir = _resolve_feature_dir(specs_dir, feature, epic)
|
|
407
|
+
state = _read_state(feature_dir / PIPELINE_STATE_FILENAME)
|
|
408
|
+
entry = _verify_entry(state, verify_key)
|
|
409
|
+
raw_status = entry.get("status")
|
|
410
|
+
status = raw_status if isinstance(raw_status, str) else None
|
|
411
|
+
|
|
412
|
+
reports = _verify_reports(feature_dir, token)
|
|
413
|
+
# verify consumes only the latest report; fix additionally needs the any-fix-applied
|
|
414
|
+
# flag and the sweep tallies, which require parsing every round.
|
|
415
|
+
if skill == "fix":
|
|
416
|
+
facts = [_parse_report_facts(_read_report_text(r.path)) for r in reports]
|
|
417
|
+
else:
|
|
418
|
+
facts = (
|
|
419
|
+
[_parse_report_facts(_read_report_text(reports[-1].path))] if reports else []
|
|
420
|
+
)
|
|
421
|
+
latest_facts = facts[-1] if facts else None
|
|
422
|
+
fix_applied = any(f.applied_steps >= 1 for f in facts)
|
|
423
|
+
|
|
424
|
+
evidence: list[str] = [f"{verify_key} status = {status or 'absent'}"]
|
|
425
|
+
if reports and latest_facts is not None:
|
|
426
|
+
latest = reports[-1]
|
|
427
|
+
rel = latest.path.relative_to(feature_dir).as_posix()
|
|
428
|
+
evidence.append(
|
|
429
|
+
f"latest report {rel} (round {latest.round}): {latest_facts.blocking} "
|
|
430
|
+
f"blocking = {latest_facts.errors} error + {latest_facts.gaps} gap, "
|
|
431
|
+
f"{latest_facts.total} total finding(s)"
|
|
432
|
+
)
|
|
433
|
+
evidence.append(f"round reports on disk: {len(reports)}")
|
|
434
|
+
if skill == "fix" and fix_applied:
|
|
435
|
+
fixed = sum(f.fixed for f in facts)
|
|
436
|
+
justified = sum(f.justified for f in facts)
|
|
437
|
+
false_positive = sum(f.false_positive for f in facts)
|
|
438
|
+
applied = sum(f.applied_steps for f in facts)
|
|
439
|
+
evidence.append(
|
|
440
|
+
f"fix progress: {applied} step(s) applied; sweep {fixed} fixed / "
|
|
441
|
+
f"{justified} justified / {false_positive} false-positive"
|
|
442
|
+
)
|
|
443
|
+
else:
|
|
444
|
+
evidence.append("no VERIFY report on disk for this mode")
|
|
445
|
+
|
|
446
|
+
if skill == "verify":
|
|
447
|
+
outcome, reason = _verify_outcome(status, latest_facts, op_failure=op_failure)
|
|
448
|
+
else:
|
|
449
|
+
outcome, reason = _fix_outcome(
|
|
450
|
+
status,
|
|
451
|
+
has_reports=bool(reports),
|
|
452
|
+
fix_applied=fix_applied,
|
|
453
|
+
op_failure=op_failure,
|
|
454
|
+
user_deferred=user_deferred,
|
|
455
|
+
decisions_open=decisions_open,
|
|
456
|
+
)
|
|
457
|
+
return {"outcome": outcome, "reason": reason, "evidence": evidence}
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
# --------------------------------------------------------------------------- #
|
|
461
|
+
# verify-state — deterministic upstream-verification classification
|
|
462
|
+
# --------------------------------------------------------------------------- #
|
|
463
|
+
#
|
|
464
|
+
# forge-4-backlog, forge-5-loop and forge-6-docs each open by reading a served
|
|
465
|
+
# stage's `stages.forge-verify-*` entry and answering one question — "has the
|
|
466
|
+
# upstream artifact been verified, and what do I say if not?" — with a different
|
|
467
|
+
# hand-rolled branch set (2, 4 and 5 cases). This verb derives that answer from the
|
|
468
|
+
# authoritative on-disk entry instead: one `VerifyStateCase`, one message table
|
|
469
|
+
# (`VERIFY_STATE_MESSAGES`), the same "never eyeball the graph" move `select-outcome`
|
|
470
|
+
# makes for the exit outcome. The full contract is `references/verify-state.md`;
|
|
471
|
+
# `test_verify_state.py` pins the enum to the three skill bodies.
|
|
472
|
+
#
|
|
473
|
+
# It reads raw entry status per served stage — exactly as the three gates do today —
|
|
474
|
+
# and does NOT apply the version-aware freshness `verify_state()` computes for the
|
|
475
|
+
# navigator's most-recent-stage gate: a `passed` entry is `passed` regardless of the
|
|
476
|
+
# stage version, because that is what the gates read. Reusing `verify_state()` would
|
|
477
|
+
# inject a re-verify-on-revision the gates do not have, so it would not be additive.
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
def verify_state_for_stage(
|
|
481
|
+
feature: str,
|
|
482
|
+
for_stage: str,
|
|
483
|
+
specs_dir: Path,
|
|
484
|
+
epic: str | None,
|
|
485
|
+
) -> dict:
|
|
486
|
+
"""Classify one served stage's ``forge-verify-*`` entry into a ``VerifyStateCase``.
|
|
487
|
+
|
|
488
|
+
Returns ``{case, verified, stale, message, nextCommand}``. ``verified`` is true
|
|
489
|
+
only for ``passed``; ``stale`` only for ``findings-applied`` (resolved once, but a
|
|
490
|
+
re-verify is still owed). ``nextCommand`` is the forge-verify retry for every case
|
|
491
|
+
that is not already ``passed`` (which needs no action → ``None``). Never raises for
|
|
492
|
+
a missing or torn state file — an absent or unreadable entry classifies ``never``,
|
|
493
|
+
the same fail-safe the three gates take.
|
|
494
|
+
"""
|
|
495
|
+
token = VERIFY_TOKEN_BY_STAGE[for_stage]
|
|
496
|
+
verify_key = f"forge-verify-{token}"
|
|
497
|
+
command = f"/skill:forge-verify {feature} {token}"
|
|
498
|
+
feature_dir = _resolve_feature_dir(specs_dir, feature, epic)
|
|
499
|
+
state = _read_state(feature_dir / PIPELINE_STATE_FILENAME)
|
|
500
|
+
entry = _verify_entry(state, verify_key)
|
|
501
|
+
raw_status = entry.get("status")
|
|
502
|
+
status = raw_status if isinstance(raw_status, str) else None
|
|
503
|
+
|
|
504
|
+
# Classification mirrors verify_state()'s status ordering (an explicit skip and
|
|
505
|
+
# recorded auto-verify debt ahead of the generic bucket, so neither falls through
|
|
506
|
+
# to `never`), but keys on the raw per-stage status the three gates read — no
|
|
507
|
+
# version-aware freshness.
|
|
508
|
+
if status == "skipped":
|
|
509
|
+
case = "skipped"
|
|
510
|
+
elif status == "auto-verify-pending":
|
|
511
|
+
# Owed-but-unrun debt with unusable scheduling metadata still stays owed; it
|
|
512
|
+
# warns once (REQ-DEBT-02), exactly as verify_state() does.
|
|
513
|
+
if _scheduled_stage_version(entry) is None:
|
|
514
|
+
_warn_auto_verify_debt_metadata(verify_key)
|
|
515
|
+
case = "auto-verify-pending"
|
|
516
|
+
elif status == "findings-reported":
|
|
517
|
+
case = "findings-reported"
|
|
518
|
+
elif status == "findings-applied":
|
|
519
|
+
case = "findings-applied"
|
|
520
|
+
elif status == "passed":
|
|
521
|
+
case = "passed"
|
|
522
|
+
else:
|
|
523
|
+
# A present status that is torn (non-str) or outside the known vocabulary is
|
|
524
|
+
# flagged once (#148) then treated as `never` — the same answer an absent
|
|
525
|
+
# entry gets. A known `pending` (or absent) is quiet, as in verify_state().
|
|
526
|
+
if raw_status is not None and (
|
|
527
|
+
not isinstance(raw_status, str) or raw_status not in KNOWN_VERIFY_STATUSES
|
|
528
|
+
):
|
|
529
|
+
_warn_unknown_verify_status(verify_key, raw_status)
|
|
530
|
+
case = "never"
|
|
531
|
+
|
|
532
|
+
if case == "auto-verify-pending":
|
|
533
|
+
# The `message` is the gates' base owed-debt sentence (+ the version-advance
|
|
534
|
+
# clause when the schedule predates the artifact). The extra "metadata is
|
|
535
|
+
# missing/malformed" detail (AUTO_VERIFY_DEBT_METADATA_DIAGNOSTIC) is a
|
|
536
|
+
# navigator-only warnings entry the three gates do NOT carry, so it stays out
|
|
537
|
+
# of the message and is surfaced once on stderr by the warn above — exactly as
|
|
538
|
+
# verify_state() does. Enriching the message would diverge from the gates this
|
|
539
|
+
# verb unifies.
|
|
540
|
+
message = auto_pending_message(
|
|
541
|
+
feature,
|
|
542
|
+
for_stage,
|
|
543
|
+
command,
|
|
544
|
+
_scheduled_stage_version(entry),
|
|
545
|
+
_stage_version(state, for_stage),
|
|
546
|
+
)
|
|
547
|
+
else:
|
|
548
|
+
message = VERIFY_STATE_MESSAGES[case].format(
|
|
549
|
+
subject=feature, stage=for_stage, command=command
|
|
550
|
+
)
|
|
551
|
+
|
|
552
|
+
return {
|
|
553
|
+
"case": case,
|
|
554
|
+
"verified": case == "passed",
|
|
555
|
+
"stale": case == "findings-applied",
|
|
556
|
+
"message": message,
|
|
557
|
+
"nextCommand": None if case == "passed" else command,
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
__all__ = [
|
|
562
|
+
"_VerifyReport",
|
|
563
|
+
"_ReportFacts",
|
|
564
|
+
"_classify_verify_entry",
|
|
565
|
+
"_verify_state_for",
|
|
566
|
+
"_read_report_text",
|
|
567
|
+
"_verify_reports",
|
|
568
|
+
"_section_body",
|
|
569
|
+
"_parse_report_facts",
|
|
570
|
+
"_verify_outcome",
|
|
571
|
+
"_fix_outcome",
|
|
572
|
+
"select_outcome",
|
|
573
|
+
"verify_state_for_stage",
|
|
574
|
+
]
|