@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
|
@@ -12,7 +12,7 @@ reading the manifest, EPIC.md, completed members' specs, and (for E10) sibling m
|
|
|
12
12
|
committed tests.
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
R="$(bash -c 'for d in "${FEATURE_FORGE_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
15
|
+
R="$(bash -c '[ -z "${FEATURE_FORGE_ROOT:-}" ] || [ -x "$FEATURE_FORGE_ROOT/scripts/forge-root.sh" ] || { echo "feature-forge: FEATURE_FORGE_ROOT=$FEATURE_FORGE_ROOT has no scripts/forge-root.sh" >&2; exit 2; }; for d in "${FEATURE_FORGE_ROOT:-}" "${CLAUDE_PLUGIN_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
|
|
16
16
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
17
17
|
python3 "$R/scripts/epic-manifest.py" validate "{epic}" --specs-dir "{specsDir}" --json
|
|
18
18
|
```
|
|
@@ -50,7 +50,7 @@ python3 "$R/scripts/epic-manifest.py" validate "{epic}" --specs-dir "{specsDir}"
|
|
|
50
50
|
exits interpose reconcile-first on it, and specs written now would build on a soon-invalid
|
|
51
51
|
premise), a **non-blocking** request → `improvement` (a peer/downstream change to reconcile
|
|
52
52
|
when convenient). Name the request's `kind`, `target`,
|
|
53
|
-
and `rationale`, and point at
|
|
53
|
+
and `rationale`, and point at `forge-0-epic {epic}` to reconcile. **Report, do
|
|
54
54
|
not repair** (same posture as CHECK-E07). Which members have open requests comes from the
|
|
55
55
|
same `render-status --json` counts the navigator uses (`features[].openEpicChangeRequests` /
|
|
56
56
|
`.blockingEpicChangeRequests`); the per-request `kind`/`target`/`rationale` detail is read
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Verifier Patterns — Index
|
|
2
|
+
|
|
3
|
+
Shipped, reviewed verification heuristics for the forge verifier — general craft that
|
|
4
|
+
transfers to any project the pipeline runs in. This is the **versioned, reviewed** layer;
|
|
5
|
+
it is distinct from the verifier's per-project `memory:` store, which accumulates
|
|
6
|
+
repo-specific observations locally. Read this index on start and open the patterns a given
|
|
7
|
+
mode makes relevant.
|
|
8
|
+
|
|
9
|
+
## Claim-checking
|
|
10
|
+
|
|
11
|
+
- [Spec Literals Are Filesystem Claims](pattern_spec_literals_are_claims.md) — every id, path, constant and signature a spec writes down is an assertion about the repo; verify them mechanically, they survive multiple rounds otherwise
|
|
12
|
+
- ["X does not exist" claims](pattern_absence_claims.md) — the one finding shape whose fix DELETES correct content; search the identifier, not the prose word
|
|
13
|
+
- ["Extend the existing X" / "X does NOT do Y"](pattern_extend_the_existing.md) — the two tech-spec claim shapes that are wrong often enough to check every time; open the function, not the comment
|
|
14
|
+
- [Test-Count Units](pattern_test_count_units.md) — a spec's "N tests" means pytest-COLLECTED, not `def` count; `--collect-only -q` before filing any size-claim error
|
|
15
|
+
- [Enum/Count Vocabulary Ripple](pattern_enum_vocabulary_ripple.md) — "one new enum value, rest derives" always under-lists surfaces; grep the OLD value across the whole tree, not the spec's file list
|
|
16
|
+
|
|
17
|
+
## Guard / mutation verification
|
|
18
|
+
|
|
19
|
+
- [Proximity-Window Drift Guards](pattern_proximity_window_guards.md) — never trust a "token near call site" guard on baseline-green; delete each token line one at a time and report every miss
|
|
20
|
+
- [Guard Substitutions: Measure Detection](pattern_guard_substitution_detection.md) — "structural beats tuned" is a maintainability claim; run the own-mandate mutation census and replay the deleted constant's recorded incident
|
|
21
|
+
- [Self-Referential Mutation Controls](pattern_self_referential_control.md) — a control whose mutation span comes from the function under test stays green under the very degradation it bounds; execute every "must FAIL when X degrades" checkbox
|
|
22
|
+
- [Vacuous Self-Reading Tests](pattern_vacuous_self_reading_tests.md) — `read(Path(__file__))` + positive substring is vacuous; demand the failing assertion's LINE NUMBER, mutate one property at a time
|
|
23
|
+
- [Scratch-Root Probes](pattern_scratch_root_probes.md) — symlinked `tests/` resolves back to the real repo and reads false GREEN; real-copy what you mutate, check `df`, always add an effectiveness control
|
|
24
|
+
|
|
25
|
+
## Re-verifying an applied fix
|
|
26
|
+
|
|
27
|
+
- [Post-Fix Re-Verify Shapes](pattern_postfix_reverify.md) — fixes introduce new defects; `ls` any claimed deletion (a gitignored file leaves `git status` clean and the fix believes it worked)
|
|
28
|
+
- [Judging Deliberate Deviations](pattern_deviation_judgment.md) — reproduce the fix pass's stated justification first, then attack the deviation on its own terms; prescribed fixes are sometimes worse
|
|
29
|
+
- [Mechanical Rewrite Damage](pattern_mechanical_rewrite_damage.md) — a bulk-edit fix pass measures itself with its own regex; re-derive with a looser pattern, scan for column-0 punctuation, word-diff every hunk
|
|
30
|
+
- [Carve-Out Sibling Semantics](pattern_carveout_sibling_semantics.md) — when a fix carves ONE form out of a blanket claim, re-probe every sibling that shares the property
|
|
31
|
+
|
|
32
|
+
## Count / arity drift
|
|
33
|
+
|
|
34
|
+
- [Stale Counts After a Split](pattern_stale_counts_after_split.md) — splitting a construct N ways leaves "two/three/both" scattered in banners and docstrings; grep the number words after any arity change
|
|
35
|
+
- [Sibling Docstring Sweep](pattern_sibling_docstring_sweep.md) — a mirrored guard updates exactly one of N docstrings; grep the *superseded* rationale the amended one disclaims
|
package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-absence-claims
|
|
3
|
+
description: "\"X does not exist\" is the highest-cost finding shape a verifier can get wrong — it induces a fix that DELETES correct content; prove absence with identifier-aware search, never a prose-word grep"
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Before filing any finding whose claim is **"the named thing does not exist"**, prove the
|
|
9
|
+
absence with a search that matches the way the thing would actually be spelled in code —
|
|
10
|
+
not the way the spec spells it in prose.
|
|
11
|
+
|
|
12
|
+
**Why:** a false-positive absence claim is uniquely expensive. Every other bad finding
|
|
13
|
+
adds noise; this one induces a fix that *removes* correct content, and the loss is
|
|
14
|
+
invisible afterwards. The classic miss: a spec quotes a test "the 'exactly the five'
|
|
15
|
+
test", the verifier greps the standalone word `five`, finds nothing, and declares the
|
|
16
|
+
test absent — but the word lived inside a snake_case identifier
|
|
17
|
+
(`test_accepts_exactly_the_five_outcomes`), which a word-boundary grep never sees. The
|
|
18
|
+
fix pass believes the finding and deletes the correct sentence.
|
|
19
|
+
|
|
20
|
+
**How to apply:**
|
|
21
|
+
|
|
22
|
+
- Grep the token **unanchored and case-folded**, then again split on `_`/`-`/camel
|
|
23
|
+
boundaries: `grep -rin 'five' tests/` before concluding, not `grep -n '\bfive\b'`.
|
|
24
|
+
Prose words routinely live inside identifiers.
|
|
25
|
+
- Prefer searching for the **structure** over the phrase: for "a test that enumerates the
|
|
26
|
+
outcomes", grep the symbol the test must consume (the enum/constant name) and read every
|
|
27
|
+
hit. That usually finds it in one call.
|
|
28
|
+
- A spec phrase in quotes ("exactly the five") is usually a *paraphrase of an identifier*,
|
|
29
|
+
not a literal string in the file. Convert it to snake_case and search that too.
|
|
30
|
+
- If you still cannot find it, say **"I could not locate it; confirm before deleting"**
|
|
31
|
+
and file at `improvement`, never a confident `inconsistency`/`error` whose fix is a
|
|
32
|
+
deletion. Absence findings should carry the search you ran, so the fixer can re-run it.
|
|
33
|
+
|
|
34
|
+
**Re-verify corollary:** when a prior round's finding said "does not exist" and the fix
|
|
35
|
+
removed prose, re-run the absence search yourself first. That is the single highest-yield
|
|
36
|
+
check on a re-verify — see [[pattern-postfix-reverify]].
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-carveout-sibling-semantics
|
|
3
|
+
description: When a fix carves ONE enumerated form out of a blanket claim for a semantic property, every sibling form sharing that property must be re-checked
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When a fix pass carves ONE member out of an enumerated "these forms all do X" list because
|
|
9
|
+
that member actually does something else, EVERY other member of the list is a suspect for
|
|
10
|
+
the same defect.
|
|
11
|
+
|
|
12
|
+
**Why:** a blanket claim ("each of these binding forms was probed and confirmed to leave
|
|
13
|
+
the roster displaced") gets sharpened by carving out the one member that unbinds instead —
|
|
14
|
+
but sibling forms sharing the same semantics stay wrongly inside the set. A concrete
|
|
15
|
+
Python example: a set of "these all displace the module-scope roster" left in both
|
|
16
|
+
`except … as NAME` (Python 3 / PEP 3110 implicitly `del`s the exception target at end of
|
|
17
|
+
block → NameError on a later read — `del`'s exact twin) and a comprehension target (Python
|
|
18
|
+
3 comprehensions have their own scope; the loop variable does NOT leak to module scope → the
|
|
19
|
+
roster is left INTACT, never displaced). The sharpened blanket was still false for two of
|
|
20
|
+
the listed forms.
|
|
21
|
+
|
|
22
|
+
**How to apply:** the moment a fix carves out member M for property P, run the SAME probe
|
|
23
|
+
over every remaining member. For roster/binding decoys specifically: `except…as` unbinds
|
|
24
|
+
like `del`; list/set/dict-comprehension targets don't leak in py3 (probe with a subsequent
|
|
25
|
+
module-scope READ, not just a namespace `.get`, which masks unbound-vs-None); `import…as`
|
|
26
|
+
binds a module/non-iterable unless a `from … import x as` names the right type. Also
|
|
27
|
+
cross-check the fix's acceptance matrix: if it re-probed only K of N listed forms, the
|
|
28
|
+
un-probed forms are exactly where the residue hides.
|
|
29
|
+
|
|
30
|
+
When a carve-out is applied as an explicit **partition** of the forms by their semantics
|
|
31
|
+
(displaced decoys / scope-local no-leak / unbinds-or-non-iterable), that partition is the
|
|
32
|
+
confirmed-correct shape — if a future round touches it, preserve the partition rather than
|
|
33
|
+
re-collapsing to a blanket. Related: [[pattern-sibling-docstring-sweep]],
|
|
34
|
+
[[pattern-postfix-reverify]].
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-deviation-judgment
|
|
3
|
+
description: How to judge a fix pass's deliberate deviation from a prescribed fix — reproduce its stated justification first, then attack the deviation on its own terms
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When a fix pass records a deliberate deviation from a finding's prescribed fix, judge it
|
|
9
|
+
on the merits, not on conformance — and in this order.
|
|
10
|
+
|
|
11
|
+
**Why:** a prescribed fix is sometimes actively worse than what shipped (a prescribed
|
|
12
|
+
merged clause that does not catch its own stated mutation). A verifier that graded
|
|
13
|
+
deviations as non-compliance would force a regression. Conversely, blanket trust misses
|
|
14
|
+
that the *unchanged* half of the same guard still carries the defect.
|
|
15
|
+
|
|
16
|
+
**How to apply:**
|
|
17
|
+
|
|
18
|
+
1. **Reproduce the stated justification with your own instrument.** If a justification
|
|
19
|
+
does not reproduce, the deviation is a finding regardless of how reasonable it sounds.
|
|
20
|
+
2. **Ask what the finding's argument actually rested on**, not what its code snippet said.
|
|
21
|
+
If the finding argued from an internal inconsistency and the applied half closed exactly
|
|
22
|
+
that inconsistency, the withheld half was cost without benefit.
|
|
23
|
+
3. **Then attack the deviation on its own terms.** For an added guard fragment, the
|
|
24
|
+
discriminating questions are: does it occur only inside the scoped region? does the
|
|
25
|
+
*natural* misreading delete it? is the attack that beats it one that beats every
|
|
26
|
+
fragment equally (then it does not distinguish)? A contrived double-negation defeats
|
|
27
|
+
any substring guard and proves nothing.
|
|
28
|
+
4. Report a per-deviation **verdict** section, separate from findings, so a reader can see
|
|
29
|
+
the deviation was adjudicated rather than silently accepted.
|
|
30
|
+
|
|
31
|
+
**A deviation that NARROWS the finding's cited scope is often the finding being
|
|
32
|
+
corrected.** When a finding quotes a WARNING naming decorators "in §3.2, §6.2 and §7.2"
|
|
33
|
+
and the fix names only two of the three, grep the document: the finding may have inherited
|
|
34
|
+
a mis-citation from the very WARNING it was retiring. **Never grade a narrowing against the
|
|
35
|
+
finding's section list; grade it against the artifact.** Count the construct the list
|
|
36
|
+
claims to enumerate.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-enum-vocabulary-ripple
|
|
3
|
+
description: A spec adding one value to a shared enum (or one item to a counted set) always under-lists the ripple surfaces; enumerate them from the repo, never from the spec's file list
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When a tech-spec says "one new enum value, the rest derives automatically", treat the
|
|
9
|
+
module-structure file list as a *hypothesis* and re-derive the ripple set yourself. A
|
|
10
|
+
single enum addition routinely touches far more than the definition site and one test:
|
|
11
|
+
|
|
12
|
+
- the `Literal`/type declaration **and** any lookup tables keyed on it;
|
|
13
|
+
- **contract/reference docs** that carry a table of the enum's domain — routinely omitted
|
|
14
|
+
from spec file lists;
|
|
15
|
+
- the owning skill's **body**, which often carries a *duplicate copy* of the domain. Where
|
|
16
|
+
a test derives the domain from canon and asserts each value's literal appears in the
|
|
17
|
+
skill's exit surface, "pointer-only body edits" is provably false for any enum addition;
|
|
18
|
+
- **mirrored copies in the tests** (a second dict of the same enum, plus derivations off
|
|
19
|
+
it);
|
|
20
|
+
- shipped **docs** (a rendered table of the domain).
|
|
21
|
+
|
|
22
|
+
Same shape for **counts**, not just enums: a new checklist entry must update *every* count
|
|
23
|
+
string that names the total (a dispatch-table count AND a totals-line count are two
|
|
24
|
+
literals), plus any test that asserts those literals.
|
|
25
|
+
|
|
26
|
+
Two surfaces spec file-lists reliably miss:
|
|
27
|
+
|
|
28
|
+
- **A new helper script a skill invokes at runtime must be registered wherever the adapter
|
|
29
|
+
build enumerates runtime helpers** — otherwise a generated bundle ships a skill calling a
|
|
30
|
+
script that isn't there, and a test that hard-pins the helper count goes red for whoever
|
|
31
|
+
implements it.
|
|
32
|
+
- **A new check section in a large mode's checklist needs a home in the parallel fan-out
|
|
33
|
+
dimension groups.** A spec that says "numeric totals only" leaves the new checks owned by
|
|
34
|
+
no dimension, so a fan-out dispatch silently never executes them.
|
|
35
|
+
|
|
36
|
+
**Why:** specs repeatedly list only the definition site and one test file, leaving the
|
|
37
|
+
verification suite red for whoever implements it.
|
|
38
|
+
|
|
39
|
+
**How to apply:** in tech mode, for every "new value / new check / new probe", grep the
|
|
40
|
+
*old* value across the source, reference, test, eval, and doc trees (excluding generated
|
|
41
|
+
mirrors) and diff the hit list against the spec's module-structure section. Every unlisted
|
|
42
|
+
hit is a `gap`. Where a test asserts **exact list equality** of a set (e.g. the probes a
|
|
43
|
+
dispatcher fans out to), that is another pinned surface the addition must update.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-extend-the-existing
|
|
3
|
+
description: "…the existing X is extended" and "X does NOT do Y" are the two tech-spec claim shapes that are wrong often enough to check every time; open the function, not the comment
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Two claim shapes in tech-specs that are wrong often enough to check every time:
|
|
9
|
+
|
|
10
|
+
1. **"the existing <check/step> is extended (one-line pointer)"** — verify the check
|
|
11
|
+
actually exists *on the side the spec proposes to edit*. A recurring miss: a spec claims
|
|
12
|
+
a skill has "an existing pre-flight dirty-tree check", when what exists is another
|
|
13
|
+
process's own launch refusal, merely *narrated* by the skill. The skill cannot rewrite a
|
|
14
|
+
message another process emits, so the requirement needs a NEW step and real body lines —
|
|
15
|
+
not a pointer. Grep the skill's own step list (`### N. …`) before accepting the claim.
|
|
16
|
+
|
|
17
|
+
2. **"<existing command> does NOT do Y"** — a negative capability claim used to justify
|
|
18
|
+
building a replacement. Open the implementation. A negative claim ("the subcommand does
|
|
19
|
+
NOT clear the flag", used to justify a whole new subcommand + version floor) is exactly
|
|
20
|
+
the kind nobody re-checks — and the function may already do Y in *both* its branches and
|
|
21
|
+
say so in its header comment.
|
|
22
|
+
|
|
23
|
+
**Why:** both shapes shrink the apparent cost of a change, so they slip past review — and
|
|
24
|
+
both land in the *decision* rationale, not just prose, so they are `error`-severity, not
|
|
25
|
+
cosmetic.
|
|
26
|
+
|
|
27
|
+
**How to apply:** for shape 1, list the skill's actual steps; for shape 2, read the
|
|
28
|
+
function body AND the sibling "all items" branch (the single-item branch alone is not the
|
|
29
|
+
contract). Cross-check against any "prefer existing surfaces" list in the PRD — an
|
|
30
|
+
unevaluated named surface is part of the same finding. Related:
|
|
31
|
+
[[pattern-spec-literals-are-claims]].
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-guard-substitution-detection
|
|
3
|
+
description: When a spec replaces a tuned-window guard with a "structural" one, measure DETECTION power by mutation — maintainability arguments hide strict losses
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When a spec replaces a guard mechanism (proximity window, line offsets, tuned constants)
|
|
9
|
+
with a "structural" or "principled" alternative, the spec will argue the substitution on
|
|
10
|
+
**maintainability** ("nothing to tune", "moves with the text"). That argument is usually
|
|
11
|
+
true and completely beside the point. **Measure detection power separately, by mutation.**
|
|
12
|
+
|
|
13
|
+
**Why:** a heading-bounded block scan that replaces a lookbehind/lookahead window can have
|
|
14
|
+
an identical baseline (all tests pass on both) and still go blind at most sites — a
|
|
15
|
+
neighbour's mandate in the same section keeps the region green. Worse, the constant being
|
|
16
|
+
deleted often carried a docstring recording the *exact* historical incident that narrowed
|
|
17
|
+
it; the substitution reopens that precise hole, and the spec never mentions it.
|
|
18
|
+
|
|
19
|
+
**How to apply:**
|
|
20
|
+
|
|
21
|
+
1. Baseline-green is not evidence. Both mechanisms passing today says nothing.
|
|
22
|
+
2. Run the **own-mandate mutation census**: for each protected site, strip the token that
|
|
23
|
+
belongs to *that site* (use the old mechanism's window as the definition of "belongs"),
|
|
24
|
+
then ask whether the new mechanism still passes. Report `N blind / M`.
|
|
25
|
+
3. **Read the deleted constant's docstring for recorded incidents.** A tuned constant that
|
|
26
|
+
was narrowed is a bug report. Replay it against the replacement.
|
|
27
|
+
4. Check whether the spec also deletes the test that *bounds* the old mechanism's width.
|
|
28
|
+
Removing the machinery legitimately removes its tuning tests — but if nothing replaces
|
|
29
|
+
the *protection* those tests conferred, that is a gap regardless of the requirement
|
|
30
|
+
authorizing the deletion.
|
|
31
|
+
5. A widened region is a **silent** failure: guards do not fail when they stop
|
|
32
|
+
discriminating. This is why it must be probed, never reviewed.
|
|
33
|
+
|
|
34
|
+
Related: [[pattern-proximity-window-guards]], [[pattern-spec-literals-are-claims]].
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-mechanical-rewrite-damage
|
|
3
|
+
description: When a fix pass reports "N mechanical edits", re-derive the count with a wider regex and scan the touched text tokens for column-0 punctuation and collapsed whitespace — the strip script's own pattern is never the audit
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
A fix pass that reports a bulk mechanical edit ("192 parentheticals removed, 0 remaining")
|
|
9
|
+
is reporting **its own script's** measurement. Two failure modes recur, and neither is
|
|
10
|
+
visible to a linter, the test suite, or a drift check, because the damage lands inside
|
|
11
|
+
docstrings and comments where the language does not care.
|
|
12
|
+
|
|
13
|
+
**Why:** a line-by-line strip regex eats the wrong whitespace and produces column-0
|
|
14
|
+
docstring corruptions (a bare `.`, `, never by the successor table:`) or word merges
|
|
15
|
+
(`from .config.json` → `from.config.json`), while the "0 remaining" is measured with the
|
|
16
|
+
finding's own grep — which required a literal space and never saw the surviving backticked
|
|
17
|
+
variants. All of it then propagates verbatim into every generated mirror, and the full
|
|
18
|
+
gate stays green.
|
|
19
|
+
|
|
20
|
+
**How to apply:** for any bulk-rewrite step, do three things before believing the count.
|
|
21
|
+
|
|
22
|
+
1. **Re-run the detection regex in a *looser* form than the fix used** — vary quoting,
|
|
23
|
+
backticks, and separators — and diff the counts against the base commit, not against
|
|
24
|
+
zero.
|
|
25
|
+
2. **Tokenize the edited files** (`tokenize` for STRING/COMMENT) and grep those lines for
|
|
26
|
+
`^\s*[.,;:]`, collapsed `\w\.\w`, empty parens, and orphan section signs.
|
|
27
|
+
3. **Do a whitespace-normalized *word-level* `difflib` diff** of old vs new and read every
|
|
28
|
+
non-equal opcode. That is what proves "delete the parenthetical, keep the sentence" was
|
|
29
|
+
honored, and it is also the cheapest way to prove a re-wrap (reclaiming lines against a
|
|
30
|
+
line cap) dropped nothing. Trust the word diff, not the fix note.
|
package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-postfix-reverify
|
|
3
|
+
description: Re-verifying an applied fix pass — the defect shapes fixes reliably introduce, plus what to check when a fix REMOVES scope instead of adding it
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When re-verifying a feature whose findings were just fixed, the findings are rarely "the
|
|
9
|
+
fix didn't happen" — they are new defects the fix introduced.
|
|
10
|
+
|
|
11
|
+
**Why:** the fixer works document-by-document from a fix plan and has no cross-document
|
|
12
|
+
budget left to re-check the claims its new prose makes. A round that opens with 6 findings
|
|
13
|
+
routinely closes with 10, most of them fix-induced.
|
|
14
|
+
|
|
15
|
+
**Recurring fix-induced shapes:**
|
|
16
|
+
|
|
17
|
+
1. *Field-comment fixes invent wrong value domains.* A comment describing the right field
|
|
18
|
+
with the wrong **enum values** survives review — cross-check every documented value
|
|
19
|
+
against the source `Literal`, the argparse `choices`, and any JSON example.
|
|
20
|
+
2. *New "Public API / Internal Surface" sections drift from their own citations.* They
|
|
21
|
+
abbreviate a flag list and drop a value, or cite a section for a rule that section does
|
|
22
|
+
not state. Re-read every `§N` such a section cites.
|
|
23
|
+
3. *A "new design" fix is the highest-yield target* — and the right outcome is often to
|
|
24
|
+
delete it. See [[pattern-proximity-window-guards]].
|
|
25
|
+
|
|
26
|
+
**When the fix REMOVES scope (a section deleted, a mechanism withdrawn):**
|
|
27
|
+
|
|
28
|
+
- The excision itself is usually clean and cheap to prove: grep the removed identifiers
|
|
29
|
+
word-boundary, then script-verify every `<file> §N` citation against actual headings.
|
|
30
|
+
- The real defect is in the **replacement requirement**. A withdrawn mechanism gets
|
|
31
|
+
replaced by a one-line requirement, wired into the owning docs — then forgotten in the
|
|
32
|
+
testing spec. A traceability check that only asserts an ID appears in *some* file cannot
|
|
33
|
+
catch this. Diff the requirement families in the testing spec's own coverage table
|
|
34
|
+
against the source, and check whether the acceptance criterion is scoped to "every
|
|
35
|
+
requirement in this document's table".
|
|
36
|
+
|
|
37
|
+
**Self-narrated round history is unverifiable-by-tooling and drifts.** A fix pass that
|
|
38
|
+
adds an "implementation warning" summarizing what prior rounds found writes that history
|
|
39
|
+
from memory, not from the reports, and the *count* is usually wrong even when the
|
|
40
|
+
operative instruction is right. Diff any such claim against the actual locations of every
|
|
41
|
+
prior report. Caps at `inconsistency`.
|
|
42
|
+
|
|
43
|
+
**A "deleted the file" claim verified by `git status` is worthless when the file is
|
|
44
|
+
gitignored.** A gitignored artifact leaves the tree clean before and after, so the fixer
|
|
45
|
+
believes a deletion that never happened. For any finding whose remedy is a deletion, `ls`
|
|
46
|
+
the literal path — never infer it from a clean tree or the absence of a `D ` line.
|
|
47
|
+
`git status --porcelain --ignored <dir>` surfaces the class in one call.
|
|
48
|
+
|
|
49
|
+
**A retraction orphans the prose that announced the thing being retracted.** Whenever a
|
|
50
|
+
fix pass *removes* something a prior pass *added*, grep the removed token across `*.md`
|
|
51
|
+
and re-read every hit — the announcement almost always outlives the thing. Grep the
|
|
52
|
+
literal token, not the finding's phrasing, and grep the specific file directly rather than
|
|
53
|
+
trusting one repo-wide `grep -r … | head`, which can silently truncate the hit.
|
|
54
|
+
|
|
55
|
+
**A fix that widens a §3 decision leaves the §1 overview summary behind.** The overview's
|
|
56
|
+
"key decisions" sentence and the file table are written once at authoring time and are
|
|
57
|
+
never in the fix plan's file list. After confirming each fix in its subsection, re-read §1
|
|
58
|
+
and §2 and diff them against the new body — cheap, and the single most reliable
|
|
59
|
+
fix-induced finding in tech mode. Caps at `inconsistency`.
|
|
60
|
+
|
|
61
|
+
**Check each fixed section against the decision text, not just the finding.** Where fixes
|
|
62
|
+
overshoot is *scope beyond the recorded decision* — a fixed section gains a clause nothing
|
|
63
|
+
in the data model or tests backs.
|
|
64
|
+
|
|
65
|
+
**A suggested fix can prescribe a claim its own remedy doesn't earn.** When a suggested
|
|
66
|
+
fix pairs *N concrete items* with a *summary claim over M*, count N against M yourself
|
|
67
|
+
before marking resolved — a faithfully-applied fix can land a false exhaustiveness
|
|
68
|
+
sentence with the verifier's own authority behind it. Treat the summary sentence, not the
|
|
69
|
+
missing item, as the finding.
|
|
70
|
+
|
|
71
|
+
**A clean re-verify is possible and worth naming as the bar.** The fix passes that come
|
|
72
|
+
back clean share one tell: they **re-measured** every literal they wrote (line counts,
|
|
73
|
+
word counts, pinned tuple lengths reproduce exactly under the checker's own algorithm) and
|
|
74
|
+
they **executed** their own claims before editing (reproduced the defective control
|
|
75
|
+
against live canon, then re-ran the replacement) instead of copying the finding's number.
|
|
76
|
+
When a fix log reads like that, the re-verify's job is to re-run the same executions
|
|
77
|
+
independently, not to hunt. Expect single-artifact modes (prd, tech) to run cleaner than
|
|
78
|
+
specs/impl, where cross-document budget exhaustion drives the fix-induced defects — spend
|
|
79
|
+
those rounds on filesystem-claim re-measurement instead.
|
|
80
|
+
|
|
81
|
+
Related: [[pattern-absence-claims]], [[pattern-spec-literals-are-claims]],
|
|
82
|
+
[[pattern-mechanical-rewrite-damage]].
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-proximity-window-guards
|
|
3
|
+
description: Verifying an "instruction X appears near call site Y" drift guard requires adversarially deleting each X one at a time — a generous window silently borrows a neighbour's X
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When re-verifying a drift guard that asserts *proximity* (e.g. "token T appears within N
|
|
9
|
+
lines of every call site"), never accept "baseline green + non-vacuity floor" as evidence
|
|
10
|
+
that the guard bites.
|
|
11
|
+
|
|
12
|
+
**Why:** a proximity window wider than the real maximum distance lets one call site's
|
|
13
|
+
mandate be satisfied by an *unrelated neighbouring block's* mandate. The guard then stays
|
|
14
|
+
green through exactly the deletion it exists to catch. A window of 20 against a real max
|
|
15
|
+
distance of 10 means deleting one site's mandate leaves the guard green, covered by a
|
|
16
|
+
neighbour's mandate 17 lines up.
|
|
17
|
+
|
|
18
|
+
**How to apply:** run this adversarial sweep yourself, in memory, over a copy — for every
|
|
19
|
+
line containing the asserted token, delete just that line and re-evaluate the guard.
|
|
20
|
+
Report every deletion the guard fails to catch. Then compute the observed max distance and
|
|
21
|
+
compare it to the configured window; recommend tightening to `max_observed + small
|
|
22
|
+
margin`. Also check whether the guard protects the *normative sentence* stating the rule,
|
|
23
|
+
not only its mechanical instances — those are separate assertions.
|
|
24
|
+
|
|
25
|
+
The same technique applies to regex-extracted constant-parity guards: mutate the source
|
|
26
|
+
text in memory and confirm each mutation goes RED rather than parsing to an equal value.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-scratch-root-probes
|
|
3
|
+
description: How to build mutation-probe scratch roots without dirtying the tree or reading false GREENs from symlink resolution
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
A mutation probe needs a scratch root. Two traps, both of which produce false readings.
|
|
9
|
+
|
|
10
|
+
**Trap 1 — a symlinked `tests/` silently defeats the probe.** Test bootstraps commonly set
|
|
11
|
+
`REPO_ROOT = Path(__file__).resolve().parent.parent`, and `resolve()` follows a symlink
|
|
12
|
+
back to the *real* repository. So a scratch root whose `tests/` are symlinks runs the
|
|
13
|
+
**unmutated** code under test and reports GREEN. The same mutation with real-file copies
|
|
14
|
+
reads a genuine failure.
|
|
15
|
+
|
|
16
|
+
- Mutating something under `tests/` only → a symlinked root is fine, but the mutated module
|
|
17
|
+
itself must be a **real file** (its own `Path(__file__).resolve()` must land in the root).
|
|
18
|
+
- Mutating anything under the source tree → both `tests/` and the source dir must be real
|
|
19
|
+
copies (`shutil.copytree`).
|
|
20
|
+
|
|
21
|
+
**Trap 2 — disk.** A large repo can fill the root mid-probe, which reads exactly like a
|
|
22
|
+
real regression (a burst of "could not create numbered dir" plus an `Errno 28`). Check
|
|
23
|
+
`df -h /` for headroom before gating. Never `copytree` the whole repo; symlink the large
|
|
24
|
+
read-only trees and copy only what you mutate.
|
|
25
|
+
|
|
26
|
+
**Why:** when most verification rounds turn on a measurement being wrong rather than the
|
|
27
|
+
code being wrong, a probe that silently measures the wrong file is worse than no probe.
|
|
28
|
+
|
|
29
|
+
**How to apply:** always run probes with `PYTHONDONTWRITEBYTECODE=1`, `-p no:cacheprovider`,
|
|
30
|
+
and `__pycache__` purged between runs (same-size constant edits within one second reuse
|
|
31
|
+
stale bytecode). Always include an *effectiveness* control — e.g. a hand-kept roster with
|
|
32
|
+
the same entries in **reversed** order — so "the guard caught it" is distinguishable from
|
|
33
|
+
"the mutation was a no-op". See [[pattern-vacuous-self-reading-tests]] and
|
|
34
|
+
[[pattern-proximity-window-guards]].
|
|
35
|
+
|
|
36
|
+
**Baselines.** `git archive` is unusable when `.gitattributes` marks `tests/` / `specs/` /
|
|
37
|
+
`eval/` `export-ignore` — an archive baseline collects zero tests. `git worktree` writes
|
|
38
|
+
under `.git/worktrees` and needs a mutating `worktree remove`, which a read-only pass may
|
|
39
|
+
not run. Restore the changed files from `git show <base>:<path>` into a real-file root
|
|
40
|
+
instead.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-self-referential-control
|
|
3
|
+
description: A mutation control that sizes its mutation from the function under test cannot detect that function degrading — execute the control, don't read it
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When a spec replaces a deleted bound with a "mutation control", check what the control's
|
|
9
|
+
**mutation span** is computed from. If it is derived from the same function whose widening
|
|
10
|
+
the control exists to catch, the span widens in lockstep and the control stays green under
|
|
11
|
+
exactly the degradation it documents.
|
|
12
|
+
|
|
13
|
+
**Why:** a control that takes its strike span from a `bounds` helper degrades with that
|
|
14
|
+
helper — degrading the helper to heading-only makes the control delete the *neighbour's*
|
|
15
|
+
mandate too, so the probe still reports and the control still passes. The spec's own
|
|
16
|
+
acceptance criterion is the tell: a verification checkbox of the form "this control FAILS
|
|
17
|
+
when X is degraded" is directly executable — run it.
|
|
18
|
+
|
|
19
|
+
**How to apply:** for every specified control, (1) implement the specified functions against
|
|
20
|
+
live inputs, (2) run the control under the *degraded* variant the spec names, not only the
|
|
21
|
+
adopted one, (3) if it passes under degradation, the control is self-referential. Then
|
|
22
|
+
construct and **empirically verify the replacement** before proposing it, so the fix is
|
|
23
|
+
trustworthy. In the same pass, re-derive detection / false-failure censuses too — "N false
|
|
24
|
+
failures under the naive variant" often does not reproduce once the adopted bound is
|
|
25
|
+
block-based rather than line-based. Related: [[pattern-proximity-window-guards]],
|
|
26
|
+
[[pattern-vacuous-self-reading-tests]], [[pattern-guard-substitution-detection]].
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-sibling-docstring-sweep
|
|
3
|
+
description: When a fix mirrors one guard into N places, exactly one of the N docstrings gets updated — grep for the superseded rationale, not the new one
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When a fix pass mirrors a rule into several implementations, it reliably amends **one**
|
|
9
|
+
docstring and leaves the siblings stating the superseded rationale. The function the
|
|
10
|
+
finding was filed against is not always the one whose docstring got fixed — a mirrored
|
|
11
|
+
guard can land in three functions with only the *unnamed* one amended, leaving the target
|
|
12
|
+
function still asserting the opposite in two separate sentences.
|
|
13
|
+
|
|
14
|
+
**Why:** the amended docstring *names* the old rationale in order to disclaim it, which
|
|
15
|
+
makes it the perfect grep needle for finding the unamended ones. Behaviour is correct
|
|
16
|
+
either way, so no test can see the drift; a reader of the stale docstring draws exactly the
|
|
17
|
+
false inference the fix existed to kill.
|
|
18
|
+
|
|
19
|
+
**How to apply:** after any "mirror the guard into N places" fix —
|
|
20
|
+
|
|
21
|
+
1. Grep for the *superseded* rationale (the phrase the one amended docstring disclaims),
|
|
22
|
+
not for the new rule. The updated site will not match; the stale ones will.
|
|
23
|
+
2. Read the N docstrings **side by side** and check none states a rule another contradicts.
|
|
24
|
+
3. The same shape hits number words after an arity change — see
|
|
25
|
+
[[pattern-stale-counts-after-split]] — and false specifics in "measured twice"-style
|
|
26
|
+
claims, where the conclusion is true but the named instrument is wrong on most of the
|
|
27
|
+
surfaces it claims to cover. Verify *which* fragment matched *per surface*, not just that
|
|
28
|
+
the aggregate claim holds.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-spec-literals-are-claims
|
|
3
|
+
description: Every module id, file path, constant and signature written into a spec is a checkable claim about the repo — verify them mechanically, they survive multiple verify rounds otherwise
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Treat every literal a spec writes down as an assertion about the current repository and
|
|
9
|
+
check it against the filesystem, not against the spec's own prose.
|
|
10
|
+
|
|
11
|
+
**Why:** specs quote "exact existing signatures" and author code constants (allow-lists,
|
|
12
|
+
fixture inventories, helper additions) inline. These read as authoritative and reviewers
|
|
13
|
+
pattern-match them as correct, so a phantom id or a dropped member survives round after
|
|
14
|
+
round untouched. The failure is silent: nothing executes a spec's prose.
|
|
15
|
+
|
|
16
|
+
**How to apply** (cheap, mechanical, do it every round):
|
|
17
|
+
|
|
18
|
+
- Module/skill ids in a spec constant → list the real directory and diff the sets both
|
|
19
|
+
directions. Missing-from-spec and absent-from-repo are different bugs; report both.
|
|
20
|
+
- Quoted "exact current signature" blocks → `grep -n -A12 'def <name>' <file>` for each.
|
|
21
|
+
When these are usually accurate in a repo, a mismatch is high-signal.
|
|
22
|
+
- Cited file paths (fixtures, tests, references, data) → loop them through `[ -e "$p" ]`.
|
|
23
|
+
Fast, and it catches placeholder paths a fix pass left behind.
|
|
24
|
+
- Cross-document `<file> §N` citations → script it: build a heading index per file, regex
|
|
25
|
+
the citations, report misses. Never eyeball, especially after a section was deleted or
|
|
26
|
+
renumbered.
|
|
27
|
+
- Requirement-id tokens in a coverage table → diff the families against the source doc.
|
|
28
|
+
Range citations (`REQ-EXIT-01..07`) and pseudo-rows are where phantom and dropped IDs
|
|
29
|
+
hide.
|
|
30
|
+
- Prose claims about existing behavior ("the field is a single string", "the file is 302
|
|
31
|
+
lines") → verify. When they are usually correct, the occasional wrong one gets waved
|
|
32
|
+
through — which is exactly why to check.
|
|
33
|
+
- **A spec's *correction* of an upstream figure is itself an unverified claim — re-derive
|
|
34
|
+
it, do not credit it.** A supersession arrives framed as research ("exhaustive search
|
|
35
|
+
found N"), and that framing buys it a pass. Re-derive each superseding number from the
|
|
36
|
+
files; the correct ones cost seconds and a wrong one is blocking.
|
|
37
|
+
- **Cited *line ranges* into another file drift as a set, not as a number.** "Amend the
|
|
38
|
+
bullets (lines 43–48)" plus an enumeration of three constructs is two claims; the range
|
|
39
|
+
is usually copied verbatim from the finding that proposed it, so a wrong range
|
|
40
|
+
propagates report → spec → implementer. `grep -n` the first token of each named
|
|
41
|
+
construct and confirm the span contains all of them.
|
|
42
|
+
- **Line-count claims: know what the checker counts.** A body-size gate that measures
|
|
43
|
+
lines *after* frontmatter disagrees with a raw `wc -l` by the frontmatter block. When a
|
|
44
|
+
spec's size claim and a passing gate disagree, go read the checker's measurement
|
|
45
|
+
function before believing either.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-stale-counts-after-split
|
|
3
|
+
description: Splitting a construct N ways leaves the old number words ("two", "three", "both") scattered through banners, docstrings and prose — grep the number words after any arity change
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When a construct is split — one function into three, two checks into five, "both callers"
|
|
9
|
+
into "all three" — the code is updated and the **number words describing it are not**. They
|
|
10
|
+
survive in module banners, docstrings, comment headers, error messages, and prose that
|
|
11
|
+
narrates the old shape. Nothing fails: the count is not executable, so no test observes it,
|
|
12
|
+
and the reader is told the wrong arity by a file that otherwise looks authoritative.
|
|
13
|
+
|
|
14
|
+
**Why it survives review:** a diff shows the new Nth item being *added* and gives no signal
|
|
15
|
+
about the sentences elsewhere that quantified the old set. The reviewer checks the new
|
|
16
|
+
member is correct — which it is. The stale count sits in a file the diff never touches.
|
|
17
|
+
|
|
18
|
+
**How to apply.** After any arity change:
|
|
19
|
+
|
|
20
|
+
1. **Grep the number words, not the identifiers:**
|
|
21
|
+
`\b(one|two|three|four|five|both|either|neither)\b` across the changed construct's own
|
|
22
|
+
file *and* every file that cites it. `both` and `neither` are the highest-yield needles
|
|
23
|
+
— they are only correct at exactly two and break silently at three.
|
|
24
|
+
2. **Include the prose surfaces a code grep misses:** module docstrings, comment
|
|
25
|
+
annotations, assertion messages, reference markdown, skill bodies, and changelog entries
|
|
26
|
+
that described the old shape.
|
|
27
|
+
3. **Re-read the sentence, do not pattern-match it.** "The two callers" may have become
|
|
28
|
+
"the two callers and the initializer", which is grammatical, cites three things, and
|
|
29
|
+
still says two.
|
|
30
|
+
4. A count in an **error message** is worse than one in a docstring: it is read at the
|
|
31
|
+
moment someone is already confused, and it is quoted into issues.
|
|
32
|
+
|
|
33
|
+
**Sibling shapes:** [[pattern-sibling-docstring-sweep]] (mirroring a rule into N places
|
|
34
|
+
amends exactly one docstring) and [[pattern-test-count-units]] (a "N tests" claim means
|
|
35
|
+
pytest-collected, not `def` count). All three are the same failure: a number that
|
|
36
|
+
describes code, written in prose, with nothing to keep the two in step.
|
package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-test-count-units
|
|
3
|
+
description: A spec's "N tests" claim means pytest-COLLECTED tests, not def count — always --collect-only before calling it wrong
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When an artifact claims a test-file size ("43 tests, 651 lines", "67 mutation
|
|
9
|
+
controls"), resolve the unit with `pytest <file> --collect-only -q` before filing an
|
|
10
|
+
accuracy finding. Parameterization makes `grep -c "def test_"` wildly lower than the
|
|
11
|
+
collected count — a single `@pytest.mark.parametrize` function can collect dozens.
|
|
12
|
+
|
|
13
|
+
**Why:** grep count and collected count are different units, and a spec that is exactly
|
|
14
|
+
right in the collected unit looks wrong under a naive `def` grep. Filing that is a pure
|
|
15
|
+
false positive, and it burns a fix round on churn the artifact never needed.
|
|
16
|
+
|
|
17
|
+
**How to apply:** If a spec states a baseline in one unit and a *target* in the other
|
|
18
|
+
("43 tests" → "at most 5 tests"), that unit ambiguity is itself the finding — file it as
|
|
19
|
+
an `improvement` asking for the counting unit to be named, not as a factual `error`.
|
|
20
|
+
See [[pattern-spec-literals-are-claims]].
|