@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
|
@@ -90,7 +90,7 @@ resolves before running the command, exactly as elsewhere.
|
|
|
90
90
|
**Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
|
-
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')"
|
|
93
|
+
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')"
|
|
94
94
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
95
95
|
python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host generic --verify-capability "{verify-capability}"
|
|
96
96
|
```
|
|
@@ -116,10 +116,15 @@ prose). Nothing else.
|
|
|
116
116
|
|
|
117
117
|
**`--verify-capability interactive`** is passed only when **both** of these hold:
|
|
118
118
|
|
|
119
|
-
- **(a)** a question mechanism equivalent to
|
|
119
|
+
- **(a)** a question mechanism equivalent to host's question mechanism is available, **and**
|
|
120
120
|
- **(b)** a clean-room `forge-verifier` subagent can be dispatched.
|
|
121
121
|
|
|
122
|
-
If either is absent, or capability cannot be established, pass `manual`.
|
|
122
|
+
If either is absent, or capability cannot be established, pass `manual`. **(a) is rung 1 or
|
|
123
|
+
rung 2** of the Interaction Capability Ladder (`references/shared-conventions.md`); at
|
|
124
|
+
rung 3, (a) is false by definition, so `--verify-capability manual` follows without
|
|
125
|
+
further deliberation — the ladder's "verify-capability determination" class states this
|
|
126
|
+
rung-3 default once
|
|
127
|
+
so it is never re-derived per stage.
|
|
123
128
|
|
|
124
129
|
**(b) tests PERMISSION, not tool presence.** The question is not "is a subagent-dispatch
|
|
125
130
|
tool listed in my tool surface" but "**may I dispatch `forge-verifier` right now**". A
|
|
@@ -192,7 +197,7 @@ The dispatching caller states ownership in its invocation prompt using a literal
|
|
|
192
197
|
terminal block.
|
|
193
198
|
|
|
194
199
|
**Absent the token, the skill treats itself as `direct`.** A user-typed
|
|
195
|
-
|
|
200
|
+
`forge-verify` or `forge-fix` is the only path that carries
|
|
196
201
|
no dispatcher, so "no token" and "no dispatcher" are the same condition. The skill passes
|
|
197
202
|
the resolved value straight through as `--owner direct|nested`.
|
|
198
203
|
|
|
@@ -391,7 +396,7 @@ features. The script has already folded the routing into the NEXT-STEPS block, s
|
|
|
391
396
|
directive is informational — you do **not** re-derive the wording:
|
|
392
397
|
|
|
393
398
|
- `required: true` (at least one `blocksCurrent: true` request) — the reconcile command
|
|
394
|
-
(
|
|
399
|
+
(`forge-0-epic {epic}`) is promoted ahead of the ordinary production
|
|
395
400
|
successor, and that successor is demoted to a follow-up line ("After reconciling,
|
|
396
401
|
continue the pipeline with …"). This is *reconcile-before-specs*: proceeding would author
|
|
397
402
|
artifacts against a decomposition that is about to change. It is strongest when exiting
|
|
@@ -420,7 +425,7 @@ a `deferredDecisions[]` entry on this feature's `.pipeline-state.json` by runnin
|
|
|
420
425
|
epic member — required, per the Pipeline State Protocol in `references/shared-conventions.md`:
|
|
421
426
|
|
|
422
427
|
```bash
|
|
423
|
-
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')"
|
|
428
|
+
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')"
|
|
424
429
|
[ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
|
|
425
430
|
python3 "$R/scripts/forge-session.py" state-decision \
|
|
426
431
|
--feature "{feature}" --question "<phrased for the target stage>" \
|
|
@@ -440,7 +445,17 @@ sentinel `─ forge: end of stage ─`, as the **final line** of `nextSteps`. Pr
|
|
|
440
445
|
**verbatim as your absolute last output**. Nothing follows the sentinel — no summary, no
|
|
441
446
|
sign-off, no warning, no command result, no acceptance text, no caveat. The block already
|
|
442
447
|
carries the fresh-session recommendation (host-aware wording via `--host`) and the exact
|
|
443
|
-
next command,
|
|
448
|
+
next command — or, at the one terminal state below, the statement that there is none — so
|
|
449
|
+
trailing prose can only push the user's next action out of view.
|
|
450
|
+
|
|
451
|
+
**A finished epic ends the pipeline, and its block fences nothing.** When
|
|
452
|
+
`primaryCommand` is `null` (`nextCommand` and `nextStage` are `null` too), the epic is
|
|
453
|
+
complete — every member done, or the manifest set to `status: "complete"` — and there is no
|
|
454
|
+
next command at all. Print the block exactly as you would any other; do **not** substitute a
|
|
455
|
+
command, promote `nextCommand`, or append your own "you could now run…" list. The block's own
|
|
456
|
+
prose already names the optional follow-ons (start a new feature, re-open the dashboard to
|
|
457
|
+
inspect state) as inline offers rather than instructions. Re-fencing the epic dashboard here
|
|
458
|
+
is the specific defect this state exists to prevent: running it lands back on this same exit.
|
|
444
459
|
|
|
445
460
|
**A nested payload** (`terminalOwnedBy: "outer"`) carries `nextSteps: null` and
|
|
446
461
|
`sentinel: null`. It prints **no terminal block at all** — not even an empty one. Return
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Agent Instructions
|
|
2
|
+
|
|
3
|
+
## Tooling feedback (feature-forge / rauf)
|
|
4
|
+
|
|
5
|
+
This project is driven by the feature-forge pipeline and the rauf loop. Help improve those tools by capturing friction as you hit it — papercuts included, not just outright bugs.
|
|
6
|
+
|
|
7
|
+
- **When to flag:** any forge/rauf command, skill, agent, or prompt that is confusing, buggy, missing a capability, forces a workaround, or produces a surprising result.
|
|
8
|
+
- **Where to file** — route by which tool the friction is with:
|
|
9
|
+
- feature-forge (pipeline stages, forge skills/agents): https://github.com/garygentry/feature-forge/issues
|
|
10
|
+
- rauf (the autonomous loop runner, `rauf` CLI): https://github.com/garygentry/rauf/issues
|
|
11
|
+
- **How:** capture it while fresh — *what you ran / what you expected / what actually happened / a fix idea* — then propose a titled issue and file it with `gh issue create` **on the human's go-ahead, not silently.**
|
|
12
|
+
- **In an autonomous rauf iteration:** do **not** open issues mid-loop. Note the friction in `progress.md` for the human to triage later.
|
|
13
|
+
|
|
14
|
+
This file was generated by feature-forge. Edit or remove it to suit your project.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Claude Instructions
|
|
2
|
+
|
|
3
|
+
## Tooling feedback (feature-forge / rauf)
|
|
4
|
+
|
|
5
|
+
I'm driving this project with the feature-forge pipeline and the rauf loop, and I want to keep improving them. When you hit friction with either tool, help me capture it — papercuts included, not just outright bugs.
|
|
6
|
+
|
|
7
|
+
- **When to flag:** any forge/rauf command, skill, agent, or prompt that is confusing, buggy, missing a capability, forces a workaround, or produces a surprising result.
|
|
8
|
+
- **Where to file** — route by which tool the friction is with:
|
|
9
|
+
- feature-forge (pipeline stages, `forge-*` skills, forge skills/agents): https://github.com/garygentry/feature-forge/issues
|
|
10
|
+
- rauf (the autonomous loop runner, `rauf` CLI): https://github.com/garygentry/rauf/issues
|
|
11
|
+
- **How:** capture it while fresh — *what you ran / what you expected / what actually happened / a fix idea* — then propose a titled issue and file it with `gh issue create` **once I give the go-ahead, not silently.**
|
|
12
|
+
- **In an autonomous rauf iteration:** don't open issues mid-loop. Note the friction in `progress.md` for me to triage later.
|
|
13
|
+
|
|
14
|
+
This file was generated by feature-forge. Edit or remove it to suit your project.
|
|
@@ -26,7 +26,9 @@ Friction with the feature-forge pipeline or the rauf loop — anything confusing
|
|
|
26
26
|
missing? Capture it while fresh and file it (feature-forge →
|
|
27
27
|
https://github.com/garygentry/feature-forge/issues, rauf →
|
|
28
28
|
https://github.com/garygentry/rauf/issues). See the project-root `AGENTS.md` "Tooling
|
|
29
|
-
feedback" section for the full flow
|
|
29
|
+
feedback" section for the full flow (written by forge-init or forge-bootstrap). If it is
|
|
30
|
+
absent, run the feature-forge `forge-init` skill however this host invokes skills, or copy the
|
|
31
|
+
section from another forge project. In an autonomous rauf iteration, note it in
|
|
30
32
|
`progress.md` instead of opening an issue mid-loop.
|
|
31
33
|
|
|
32
34
|
This file was generated by feature-forge. Edit or remove it to suit your project.
|
|
@@ -25,7 +25,8 @@ Friction with the feature-forge pipeline or the rauf loop — anything confusing
|
|
|
25
25
|
missing? Help me capture it while fresh and file it (feature-forge →
|
|
26
26
|
https://github.com/garygentry/feature-forge/issues, rauf →
|
|
27
27
|
https://github.com/garygentry/rauf/issues). See the project-root `CLAUDE.md` "Tooling
|
|
28
|
-
feedback" section for the full flow
|
|
28
|
+
feedback" section for the full flow (written by forge-init or forge-bootstrap; if absent,
|
|
29
|
+
run `forge-init`). In an autonomous rauf iteration, note it in
|
|
29
30
|
`progress.md` instead of opening an issue mid-loop.
|
|
30
31
|
|
|
31
32
|
This file was generated by feature-forge. Edit or remove it to suit your project.
|
|
@@ -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
|
|
@@ -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.
|
|
@@ -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.
|