@garygentry/feature-forge 0.3.6 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/adapters/GENERATION-REPORT.md +20 -0
- package/adapters/claude/.claude-plugin/plugin.json +16 -0
- package/adapters/claude/.feature-forge-bundle.json +1 -1
- package/adapters/claude/agents/forge-verifier.md +16 -5
- package/adapters/claude/references/forge-config-schema.json +3 -3
- package/adapters/claude/references/portable-root.md +20 -16
- package/adapters/claude/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/references/process-overview.md +1 -1
- package/adapters/claude/references/select-outcome.md +138 -0
- package/adapters/claude/references/shared-conventions.md +175 -22
- package/adapters/claude/references/skill-frontmatter.schema.json +3 -1
- package/adapters/claude/references/stack-resolution.md +1 -1
- package/adapters/claude/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/claude/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/claude/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/claude/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/claude/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/claude/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/claude/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/claude/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/claude/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/claude/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/claude/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/claude/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/claude/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/claude/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/claude/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/claude/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/claude/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/claude/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/claude/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/claude/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/claude/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/claude/references/verify-state.md +98 -0
- package/adapters/claude/scripts/forge-bootstrap.py +23 -2
- package/adapters/claude/scripts/forge-root.sh +104 -21
- package/adapters/claude/scripts/forge-session.py +620 -6973
- package/adapters/claude/scripts/forge_session/__init__.py +11 -0
- package/adapters/claude/scripts/forge_session/_common.py +1566 -0
- package/adapters/claude/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/claude/scripts/forge_session/cli.py +1067 -0
- package/adapters/claude/scripts/forge_session/decisions.py +355 -0
- package/adapters/claude/scripts/forge_session/discover.py +472 -0
- package/adapters/claude/scripts/forge_session/doctor.py +2144 -0
- package/adapters/claude/scripts/forge_session/exit.py +1081 -0
- package/adapters/claude/scripts/forge_session/outcomes.py +574 -0
- package/adapters/claude/scripts/forge_session/routes.py +1162 -0
- package/adapters/claude/scripts/forge_session/state.py +1479 -0
- package/adapters/claude/scripts/forge_session/topology.py +443 -0
- package/adapters/claude/skills/forge/SKILL.md +7 -7
- package/adapters/claude/skills/forge/references/process-overview.md +1 -1
- package/adapters/claude/skills/forge/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-0-epic/SKILL.md +7 -7
- package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +9 -5
- package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
- package/adapters/claude/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-1-prd/SKILL.md +7 -7
- package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-2-tech/SKILL.md +7 -7
- package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-3-specs/SKILL.md +5 -5
- package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-4-backlog/SKILL.md +16 -8
- package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/claude/skills/forge-5-loop/SKILL.md +36 -41
- package/adapters/claude/skills/forge-5-loop/references/agent-selection.md +4 -0
- package/adapters/claude/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/skills/forge-5-loop/references/recovery-procedure.md +10 -0
- package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +15 -5
- package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/claude/skills/forge-6-docs/SKILL.md +21 -14
- package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/claude/skills/forge-bootstrap/SKILL.md +19 -10
- package/adapters/claude/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/claude/skills/forge-fix/SKILL.md +15 -18
- package/adapters/claude/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/claude/skills/forge-fix/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-guide/SKILL.md +87 -1
- package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +3 -3
- package/adapters/claude/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/skills/forge-guide/references/process-overview.md +1 -1
- package/adapters/claude/skills/forge-guide/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/claude/skills/forge-init/SKILL.md +58 -7
- package/adapters/claude/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/claude/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/claude/skills/forge-verify/SKILL.md +20 -23
- package/adapters/claude/skills/forge-verify/references/findings-template.md +2 -2
- package/adapters/claude/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/claude/skills/forge-verify/references/shared-conventions.md +175 -22
- package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +19 -4
- package/adapters/claude/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/codex/.feature-forge-bundle.json +1 -1
- package/adapters/codex/agents/forge-researcher.toml +1 -1
- package/adapters/codex/agents/forge-verifier.toml +17 -6
- package/adapters/codex/references/forge-config-schema.json +5 -5
- package/adapters/codex/references/portable-root.md +20 -16
- package/adapters/codex/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/references/process-overview.md +10 -10
- package/adapters/codex/references/select-outcome.md +138 -0
- package/adapters/codex/references/shared-conventions.md +188 -35
- package/adapters/codex/references/skill-frontmatter.schema.json +3 -1
- package/adapters/codex/references/stack-resolution.md +1 -1
- package/adapters/codex/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/codex/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/codex/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/codex/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/codex/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/codex/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/codex/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/codex/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/codex/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/codex/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/codex/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/codex/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/codex/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/codex/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/codex/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/codex/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/codex/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/codex/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/codex/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/codex/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/codex/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/codex/references/verify-state.md +98 -0
- package/adapters/codex/scripts/forge-bootstrap.py +23 -2
- package/adapters/codex/scripts/forge-root.sh +104 -21
- package/adapters/codex/scripts/forge-session.py +620 -6973
- package/adapters/codex/scripts/forge_session/__init__.py +11 -0
- package/adapters/codex/scripts/forge_session/_common.py +1566 -0
- package/adapters/codex/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/codex/scripts/forge_session/cli.py +1067 -0
- package/adapters/codex/scripts/forge_session/decisions.py +355 -0
- package/adapters/codex/scripts/forge_session/discover.py +472 -0
- package/adapters/codex/scripts/forge_session/doctor.py +2144 -0
- package/adapters/codex/scripts/forge_session/exit.py +1081 -0
- package/adapters/codex/scripts/forge_session/outcomes.py +574 -0
- package/adapters/codex/scripts/forge_session/routes.py +1162 -0
- package/adapters/codex/scripts/forge_session/state.py +1479 -0
- package/adapters/codex/scripts/forge_session/topology.py +443 -0
- package/adapters/codex/skills/forge/SKILL.md +40 -40
- package/adapters/codex/skills/forge/references/process-overview.md +10 -10
- package/adapters/codex/skills/forge/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-0-epic/SKILL.md +15 -15
- package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/codex/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-1-prd/SKILL.md +15 -15
- package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-2-tech/SKILL.md +15 -15
- package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-3-specs/SKILL.md +10 -10
- package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-4-backlog/SKILL.md +19 -11
- package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/codex/skills/forge-5-loop/SKILL.md +48 -53
- package/adapters/codex/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/codex/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +18 -8
- package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/codex/skills/forge-6-docs/SKILL.md +27 -20
- package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/codex/skills/forge-bootstrap/SKILL.md +23 -15
- package/adapters/codex/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/codex/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/codex/skills/forge-fix/SKILL.md +27 -30
- package/adapters/codex/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/codex/skills/forge-fix/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-guide/SKILL.md +84 -7
- package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +5 -5
- package/adapters/codex/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/codex/skills/forge-guide/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/codex/skills/forge-init/SKILL.md +62 -12
- package/adapters/codex/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/codex/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/codex/skills/forge-verify/SKILL.md +27 -30
- package/adapters/codex/skills/forge-verify/references/findings-template.md +2 -2
- package/adapters/codex/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/codex/skills/forge-verify/references/shared-conventions.md +188 -35
- package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/copilot/.feature-forge-bundle.json +1 -1
- package/adapters/copilot/agents/forge-researcher.md +1 -1
- package/adapters/copilot/agents/forge-verifier.md +17 -6
- package/adapters/copilot/references/forge-config-schema.json +5 -5
- package/adapters/copilot/references/portable-root.md +20 -16
- package/adapters/copilot/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/references/process-overview.md +10 -10
- package/adapters/copilot/references/select-outcome.md +138 -0
- package/adapters/copilot/references/shared-conventions.md +188 -35
- package/adapters/copilot/references/skill-frontmatter.schema.json +3 -1
- package/adapters/copilot/references/stack-resolution.md +1 -1
- package/adapters/copilot/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/copilot/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/copilot/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/copilot/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/copilot/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/copilot/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/copilot/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/copilot/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/copilot/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/copilot/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/copilot/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/copilot/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/copilot/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/copilot/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/copilot/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/copilot/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/copilot/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/copilot/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/copilot/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/copilot/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/copilot/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/copilot/references/verify-state.md +98 -0
- package/adapters/copilot/scripts/forge-bootstrap.py +23 -2
- package/adapters/copilot/scripts/forge-root.sh +104 -21
- package/adapters/copilot/scripts/forge-session.py +620 -6973
- package/adapters/copilot/scripts/forge_session/__init__.py +11 -0
- package/adapters/copilot/scripts/forge_session/_common.py +1566 -0
- package/adapters/copilot/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/copilot/scripts/forge_session/cli.py +1067 -0
- package/adapters/copilot/scripts/forge_session/decisions.py +355 -0
- package/adapters/copilot/scripts/forge_session/discover.py +472 -0
- package/adapters/copilot/scripts/forge_session/doctor.py +2144 -0
- package/adapters/copilot/scripts/forge_session/exit.py +1081 -0
- package/adapters/copilot/scripts/forge_session/outcomes.py +574 -0
- package/adapters/copilot/scripts/forge_session/routes.py +1162 -0
- package/adapters/copilot/scripts/forge_session/state.py +1479 -0
- package/adapters/copilot/scripts/forge_session/topology.py +443 -0
- package/adapters/copilot/skills/forge/forge.md +40 -40
- package/adapters/copilot/skills/forge/references/process-overview.md +10 -10
- package/adapters/copilot/skills/forge/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +15 -15
- package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/copilot/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +15 -15
- package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +15 -15
- package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +10 -10
- package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +19 -11
- package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +48 -53
- package/adapters/copilot/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/copilot/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +18 -8
- package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +27 -20
- package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/copilot/skills/forge-bootstrap/forge-bootstrap.md +23 -15
- package/adapters/copilot/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/copilot/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/copilot/skills/forge-fix/forge-fix.md +27 -30
- package/adapters/copilot/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-guide/forge-guide.md +84 -7
- package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +5 -5
- package/adapters/copilot/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/copilot/skills/forge-init/forge-init.md +62 -12
- package/adapters/copilot/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/copilot/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/copilot/skills/forge-verify/forge-verify.md +27 -30
- package/adapters/copilot/skills/forge-verify/references/findings-template.md +2 -2
- package/adapters/copilot/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +188 -35
- package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/cursor/.feature-forge-bundle.json +1 -1
- package/adapters/cursor/agents/forge-researcher.mdc +1 -1
- package/adapters/cursor/agents/forge-verifier.mdc +17 -6
- package/adapters/cursor/references/forge-config-schema.json +5 -5
- package/adapters/cursor/references/portable-root.md +20 -16
- package/adapters/cursor/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/references/process-overview.md +10 -10
- package/adapters/cursor/references/select-outcome.md +138 -0
- package/adapters/cursor/references/shared-conventions.md +188 -35
- package/adapters/cursor/references/skill-frontmatter.schema.json +3 -1
- package/adapters/cursor/references/stack-resolution.md +1 -1
- package/adapters/cursor/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/cursor/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/cursor/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/cursor/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/cursor/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/cursor/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/cursor/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/cursor/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/cursor/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/cursor/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/cursor/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/cursor/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/cursor/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/cursor/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/cursor/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/cursor/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/cursor/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/cursor/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/cursor/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/cursor/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/cursor/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/cursor/references/verify-state.md +98 -0
- package/adapters/cursor/scripts/forge-bootstrap.py +23 -2
- package/adapters/cursor/scripts/forge-root.sh +104 -21
- package/adapters/cursor/scripts/forge-session.py +620 -6973
- package/adapters/cursor/scripts/forge_session/__init__.py +11 -0
- package/adapters/cursor/scripts/forge_session/_common.py +1566 -0
- package/adapters/cursor/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/cursor/scripts/forge_session/cli.py +1067 -0
- package/adapters/cursor/scripts/forge_session/decisions.py +355 -0
- package/adapters/cursor/scripts/forge_session/discover.py +472 -0
- package/adapters/cursor/scripts/forge_session/doctor.py +2144 -0
- package/adapters/cursor/scripts/forge_session/exit.py +1081 -0
- package/adapters/cursor/scripts/forge_session/outcomes.py +574 -0
- package/adapters/cursor/scripts/forge_session/routes.py +1162 -0
- package/adapters/cursor/scripts/forge_session/state.py +1479 -0
- package/adapters/cursor/scripts/forge_session/topology.py +443 -0
- package/adapters/cursor/skills/forge/forge.mdc +40 -40
- package/adapters/cursor/skills/forge/references/process-overview.md +10 -10
- package/adapters/cursor/skills/forge/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +15 -15
- package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/cursor/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +15 -15
- package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +15 -15
- package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +10 -10
- package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +19 -11
- package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +48 -53
- package/adapters/cursor/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/cursor/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +18 -8
- package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +27 -20
- package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/cursor/skills/forge-bootstrap/forge-bootstrap.mdc +23 -15
- package/adapters/cursor/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/cursor/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/cursor/skills/forge-fix/forge-fix.mdc +27 -30
- package/adapters/cursor/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-guide/forge-guide.mdc +84 -7
- package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +5 -5
- package/adapters/cursor/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/cursor/skills/forge-init/forge-init.mdc +62 -12
- package/adapters/cursor/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/cursor/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/cursor/skills/forge-verify/forge-verify.mdc +27 -30
- package/adapters/cursor/skills/forge-verify/references/findings-template.md +2 -2
- package/adapters/cursor/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +188 -35
- package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/gemini/.feature-forge-bundle.json +1 -1
- package/adapters/gemini/agents/forge-researcher.md +1 -1
- package/adapters/gemini/agents/forge-verifier.md +17 -6
- package/adapters/gemini/gemini-extension.json +13 -13
- package/adapters/gemini/references/forge-config-schema.json +5 -5
- package/adapters/gemini/references/portable-root.md +20 -16
- package/adapters/gemini/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/references/process-overview.md +10 -10
- package/adapters/gemini/references/select-outcome.md +138 -0
- package/adapters/gemini/references/shared-conventions.md +188 -35
- package/adapters/gemini/references/skill-frontmatter.schema.json +3 -1
- package/adapters/gemini/references/stack-resolution.md +1 -1
- package/adapters/gemini/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/gemini/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/gemini/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/gemini/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/gemini/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/gemini/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/gemini/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/gemini/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/gemini/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/gemini/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/gemini/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/gemini/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/gemini/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/gemini/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/gemini/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/gemini/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/gemini/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/gemini/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/gemini/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/gemini/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/gemini/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/gemini/references/verify-state.md +98 -0
- package/adapters/gemini/scripts/forge-bootstrap.py +23 -2
- package/adapters/gemini/scripts/forge-root.sh +104 -21
- package/adapters/gemini/scripts/forge-session.py +620 -6973
- package/adapters/gemini/scripts/forge_session/__init__.py +11 -0
- package/adapters/gemini/scripts/forge_session/_common.py +1566 -0
- package/adapters/gemini/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/gemini/scripts/forge_session/cli.py +1067 -0
- package/adapters/gemini/scripts/forge_session/decisions.py +355 -0
- package/adapters/gemini/scripts/forge_session/discover.py +472 -0
- package/adapters/gemini/scripts/forge_session/doctor.py +2144 -0
- package/adapters/gemini/scripts/forge_session/exit.py +1081 -0
- package/adapters/gemini/scripts/forge_session/outcomes.py +574 -0
- package/adapters/gemini/scripts/forge_session/routes.py +1162 -0
- package/adapters/gemini/scripts/forge_session/state.py +1479 -0
- package/adapters/gemini/scripts/forge_session/topology.py +443 -0
- package/adapters/gemini/skills/forge/forge.md +40 -40
- package/adapters/gemini/skills/forge/references/process-overview.md +10 -10
- package/adapters/gemini/skills/forge/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +15 -15
- package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +14 -10
- package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
- package/adapters/gemini/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +15 -15
- package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +15 -15
- package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +10 -10
- package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +19 -11
- package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +48 -53
- package/adapters/gemini/skills/forge-5-loop/references/agent-selection.md +5 -1
- package/adapters/gemini/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/skills/forge-5-loop/references/recovery-procedure.md +14 -4
- package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +18 -8
- package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +27 -20
- package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/gemini/skills/forge-bootstrap/forge-bootstrap.md +23 -15
- package/adapters/gemini/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/gemini/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
- package/adapters/gemini/skills/forge-fix/forge-fix.md +27 -30
- package/adapters/gemini/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-guide/forge-guide.md +84 -7
- package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +5 -5
- package/adapters/gemini/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/skills/forge-guide/references/process-overview.md +10 -10
- package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/gemini/skills/forge-init/forge-init.md +62 -12
- package/adapters/gemini/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/gemini/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/gemini/skills/forge-verify/forge-verify.md +27 -30
- package/adapters/gemini/skills/forge-verify/references/findings-template.md +2 -2
- package/adapters/gemini/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +188 -35
- package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +22 -7
- package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +2 -2
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/pi/.feature-forge-bundle.json +1 -1
- package/adapters/pi/agents/forge-verifier.md +16 -5
- package/adapters/pi/extensions/forge-invocation-args/README.md +106 -0
- package/adapters/pi/extensions/forge-invocation-args/index.ts +31 -0
- package/adapters/pi/extensions/forge-invocation-args/wiring.ts +172 -0
- package/adapters/pi/package.json +1 -0
- package/adapters/pi/references/forge-config-schema.json +3 -3
- package/adapters/pi/references/portable-root.md +20 -16
- package/adapters/pi/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/references/select-outcome.md +138 -0
- package/adapters/pi/references/shared-conventions.md +175 -22
- package/adapters/pi/references/skill-frontmatter.schema.json +3 -1
- package/adapters/pi/references/stack-resolution.md +1 -1
- package/adapters/pi/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/references/templates/root-hygiene/AGENTS.md +14 -0
- package/adapters/pi/references/templates/root-hygiene/CLAUDE.md +14 -0
- package/adapters/pi/references/templates/specs-hygiene/AGENTS.md +3 -1
- package/adapters/pi/references/templates/specs-hygiene/CLAUDE.md +2 -1
- package/adapters/pi/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/pi/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/pi/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/pi/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/pi/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/pi/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/pi/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/pi/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/pi/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/pi/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/pi/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/pi/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/pi/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/pi/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/pi/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/pi/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/pi/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/adapters/pi/references/verify-state.md +98 -0
- package/adapters/pi/scripts/forge-bootstrap.py +23 -2
- package/adapters/pi/scripts/forge-root.sh +104 -21
- package/adapters/pi/scripts/forge-session.py +620 -6973
- package/adapters/pi/scripts/forge_session/__init__.py +11 -0
- package/adapters/pi/scripts/forge_session/_common.py +1566 -0
- package/adapters/pi/scripts/forge_session/_doctor_util.py +218 -0
- package/adapters/pi/scripts/forge_session/cli.py +1067 -0
- package/adapters/pi/scripts/forge_session/decisions.py +355 -0
- package/adapters/pi/scripts/forge_session/discover.py +472 -0
- package/adapters/pi/scripts/forge_session/doctor.py +2144 -0
- package/adapters/pi/scripts/forge_session/exit.py +1081 -0
- package/adapters/pi/scripts/forge_session/outcomes.py +574 -0
- package/adapters/pi/scripts/forge_session/routes.py +1162 -0
- package/adapters/pi/scripts/forge_session/state.py +1479 -0
- package/adapters/pi/scripts/forge_session/topology.py +443 -0
- package/adapters/pi/skills/forge/SKILL.md +9 -8
- package/adapters/pi/skills/forge/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-0-epic/SKILL.md +9 -8
- package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +9 -5
- package/adapters/pi/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
- package/adapters/pi/skills/forge-0-epic/references/portable-root.md +20 -16
- package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-1-prd/SKILL.md +9 -8
- package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-2-tech/SKILL.md +8 -7
- package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-2-tech/references/stack-resolution.md +1 -1
- package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-3-specs/SKILL.md +7 -6
- package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-4-backlog/SKILL.md +18 -9
- package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-4-backlog/references/verify-state.md +98 -0
- package/adapters/pi/skills/forge-5-loop/SKILL.md +38 -42
- package/adapters/pi/skills/forge-5-loop/references/agent-selection.md +4 -0
- package/adapters/pi/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/skills/forge-5-loop/references/recovery-procedure.md +10 -0
- package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +15 -5
- package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-5-loop/references/verify-state.md +98 -0
- package/adapters/pi/skills/forge-6-docs/SKILL.md +23 -15
- package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-6-docs/references/verify-state.md +98 -0
- package/adapters/pi/skills/forge-bootstrap/SKILL.md +20 -11
- package/adapters/pi/skills/forge-bootstrap/references/shared-conventions.md +572 -0
- package/adapters/pi/skills/forge-fix/SKILL.md +17 -19
- package/adapters/pi/skills/forge-fix/references/select-outcome.md +138 -0
- package/adapters/pi/skills/forge-fix/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-guide/SKILL.md +79 -1
- package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +3 -3
- package/adapters/pi/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/skills/forge-guide/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-guide/references/stack-resolution.md +1 -1
- package/adapters/pi/skills/forge-init/SKILL.md +59 -8
- package/adapters/pi/skills/forge-init/references/preflight-and-self-heal.md +183 -0
- package/adapters/pi/skills/forge-init/references/shared-conventions.md +572 -0
- package/adapters/pi/skills/forge-verify/SKILL.md +17 -19
- package/adapters/pi/skills/forge-verify/references/findings-template.md +1 -1
- package/adapters/pi/skills/forge-verify/references/select-outcome.md +138 -0
- package/adapters/pi/skills/forge-verify/references/shared-conventions.md +175 -22
- package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +19 -4
- package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +1 -1
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
- package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
- package/dist/manifest.d.ts +1 -1
- package/dist/rauf.d.ts +3 -3
- package/dist/rauf.js +2 -2
- package/dist/source.d.ts +5 -2
- package/dist/source.js +5 -2
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-spec-literals-are-claims
|
|
3
|
+
description: Every module id, file path, constant and signature written into a spec is a checkable claim about the repo — verify them mechanically, they survive multiple verify rounds otherwise
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Treat every literal a spec writes down as an assertion about the current repository and
|
|
9
|
+
check it against the filesystem, not against the spec's own prose.
|
|
10
|
+
|
|
11
|
+
**Why:** specs quote "exact existing signatures" and author code constants (allow-lists,
|
|
12
|
+
fixture inventories, helper additions) inline. These read as authoritative and reviewers
|
|
13
|
+
pattern-match them as correct, so a phantom id or a dropped member survives round after
|
|
14
|
+
round untouched. The failure is silent: nothing executes a spec's prose.
|
|
15
|
+
|
|
16
|
+
**How to apply** (cheap, mechanical, do it every round):
|
|
17
|
+
|
|
18
|
+
- Module/skill ids in a spec constant → list the real directory and diff the sets both
|
|
19
|
+
directions. Missing-from-spec and absent-from-repo are different bugs; report both.
|
|
20
|
+
- Quoted "exact current signature" blocks → `grep -n -A12 'def <name>' <file>` for each.
|
|
21
|
+
When these are usually accurate in a repo, a mismatch is high-signal.
|
|
22
|
+
- Cited file paths (fixtures, tests, references, data) → loop them through `[ -e "$p" ]`.
|
|
23
|
+
Fast, and it catches placeholder paths a fix pass left behind.
|
|
24
|
+
- Cross-document `<file> §N` citations → script it: build a heading index per file, regex
|
|
25
|
+
the citations, report misses. Never eyeball, especially after a section was deleted or
|
|
26
|
+
renumbered.
|
|
27
|
+
- Requirement-id tokens in a coverage table → diff the families against the source doc.
|
|
28
|
+
Range citations (`REQ-EXIT-01..07`) and pseudo-rows are where phantom and dropped IDs
|
|
29
|
+
hide.
|
|
30
|
+
- Prose claims about existing behavior ("the field is a single string", "the file is 302
|
|
31
|
+
lines") → verify. When they are usually correct, the occasional wrong one gets waved
|
|
32
|
+
through — which is exactly why to check.
|
|
33
|
+
- **A spec's *correction* of an upstream figure is itself an unverified claim — re-derive
|
|
34
|
+
it, do not credit it.** A supersession arrives framed as research ("exhaustive search
|
|
35
|
+
found N"), and that framing buys it a pass. Re-derive each superseding number from the
|
|
36
|
+
files; the correct ones cost seconds and a wrong one is blocking.
|
|
37
|
+
- **Cited *line ranges* into another file drift as a set, not as a number.** "Amend the
|
|
38
|
+
bullets (lines 43–48)" plus an enumeration of three constructs is two claims; the range
|
|
39
|
+
is usually copied verbatim from the finding that proposed it, so a wrong range
|
|
40
|
+
propagates report → spec → implementer. `grep -n` the first token of each named
|
|
41
|
+
construct and confirm the span contains all of them.
|
|
42
|
+
- **Line-count claims: know what the checker counts.** A body-size gate that measures
|
|
43
|
+
lines *after* frontmatter disagrees with a raw `wc -l` by the frontmatter block. When a
|
|
44
|
+
spec's size claim and a passing gate disagree, go read the checker's measurement
|
|
45
|
+
function before believing either.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-stale-counts-after-split
|
|
3
|
+
description: Splitting a construct N ways leaves the old number words ("two", "three", "both") scattered through banners, docstrings and prose — grep the number words after any arity change
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When a construct is split — one function into three, two checks into five, "both callers"
|
|
9
|
+
into "all three" — the code is updated and the **number words describing it are not**. They
|
|
10
|
+
survive in module banners, docstrings, comment headers, error messages, and prose that
|
|
11
|
+
narrates the old shape. Nothing fails: the count is not executable, so no test observes it,
|
|
12
|
+
and the reader is told the wrong arity by a file that otherwise looks authoritative.
|
|
13
|
+
|
|
14
|
+
**Why it survives review:** a diff shows the new Nth item being *added* and gives no signal
|
|
15
|
+
about the sentences elsewhere that quantified the old set. The reviewer checks the new
|
|
16
|
+
member is correct — which it is. The stale count sits in a file the diff never touches.
|
|
17
|
+
|
|
18
|
+
**How to apply.** After any arity change:
|
|
19
|
+
|
|
20
|
+
1. **Grep the number words, not the identifiers:**
|
|
21
|
+
`\b(one|two|three|four|five|both|either|neither)\b` across the changed construct's own
|
|
22
|
+
file *and* every file that cites it. `both` and `neither` are the highest-yield needles
|
|
23
|
+
— they are only correct at exactly two and break silently at three.
|
|
24
|
+
2. **Include the prose surfaces a code grep misses:** module docstrings, comment
|
|
25
|
+
annotations, assertion messages, reference markdown, skill bodies, and changelog entries
|
|
26
|
+
that described the old shape.
|
|
27
|
+
3. **Re-read the sentence, do not pattern-match it.** "The two callers" may have become
|
|
28
|
+
"the two callers and the initializer", which is grammatical, cites three things, and
|
|
29
|
+
still says two.
|
|
30
|
+
4. A count in an **error message** is worse than one in a docstring: it is read at the
|
|
31
|
+
moment someone is already confused, and it is quoted into issues.
|
|
32
|
+
|
|
33
|
+
**Sibling shapes:** [[pattern-sibling-docstring-sweep]] (mirroring a rule into N places
|
|
34
|
+
amends exactly one docstring) and [[pattern-test-count-units]] (a "N tests" claim means
|
|
35
|
+
pytest-collected, not `def` count). All three are the same failure: a number that
|
|
36
|
+
describes code, written in prose, with nothing to keep the two in step.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-test-count-units
|
|
3
|
+
description: A spec's "N tests" claim means pytest-COLLECTED tests, not def count — always --collect-only before calling it wrong
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
When an artifact claims a test-file size ("43 tests, 651 lines", "67 mutation
|
|
9
|
+
controls"), resolve the unit with `pytest <file> --collect-only -q` before filing an
|
|
10
|
+
accuracy finding. Parameterization makes `grep -c "def test_"` wildly lower than the
|
|
11
|
+
collected count — a single `@pytest.mark.parametrize` function can collect dozens.
|
|
12
|
+
|
|
13
|
+
**Why:** grep count and collected count are different units, and a spec that is exactly
|
|
14
|
+
right in the collected unit looks wrong under a naive `def` grep. Filing that is a pure
|
|
15
|
+
false positive, and it burns a fix round on churn the artifact never needed.
|
|
16
|
+
|
|
17
|
+
**How to apply:** If a spec states a baseline in one unit and a *target* in the other
|
|
18
|
+
("43 tests" → "at most 5 tests"), that unit ambiguity is itself the finding — file it as
|
|
19
|
+
an `improvement` asking for the counting unit to be named, not as a factual `error`.
|
|
20
|
+
See [[pattern-spec-literals-are-claims]].
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pattern-vacuous-self-reading-tests
|
|
3
|
+
description: Tests that read their own source file are near-always vacuous unless they assert absence or scope the read; verify by a PROPERTY-PRESERVING mutation and check WHICH line goes red
|
|
4
|
+
metadata:
|
|
5
|
+
type: reference
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
A drift-guard test that does `source = read(Path(__file__).resolve())` and then asserts a
|
|
9
|
+
**positive** substring is almost always vacuous: the searched literal sits on the assert
|
|
10
|
+
line itself, so the whole-file read satisfies it unconditionally.
|
|
11
|
+
|
|
12
|
+
**Why:** the trap catches even the *fix* for a prior vacuity finding, which often
|
|
13
|
+
reproduces the identical defect while its own inline comment claims "this reads for a
|
|
14
|
+
DIFFERENT string than the one it writes". The fix pass validates it with a mutation that
|
|
15
|
+
changes a second property at the same time — replacing a derived roster with a *shrunken*
|
|
16
|
+
hardcoded list goes red, but at a pre-existing floor assertion (`len(...) >= MIN`), not at
|
|
17
|
+
the assertion under test. Seeing "red" is taken as proof; a roster-**preserving** hardcode
|
|
18
|
+
leaves the test fully green.
|
|
19
|
+
|
|
20
|
+
**How to apply:**
|
|
21
|
+
|
|
22
|
+
- Grep every changed test for `read(Path(__file__)` / `inspect.getsource`. For each,
|
|
23
|
+
locate the searched literal's occurrences in the file. Two occurrences (guarded site +
|
|
24
|
+
assert line) = vacuous.
|
|
25
|
+
- Never accept "the mutation went red". Demand the **line number** of the failing
|
|
26
|
+
assertion, and design the mutation to change exactly one property.
|
|
27
|
+
- Acceptable forms: assert **absence** (write the banned tokens without the syntax that
|
|
28
|
+
makes them live), or scope the read away from the guarding test's own body
|
|
29
|
+
(`inspect.getsource(<the guarded function>)`). The best form for "this expression is
|
|
30
|
+
still derived" is an `ast` parse, which the assertion's own text cannot satisfy.
|
|
31
|
+
|
|
32
|
+
See [[pattern-postfix-reverify]] and [[pattern-mechanical-rewrite-damage]].
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# `verify-state` — deterministic upstream-verification classification
|
|
2
|
+
|
|
3
|
+
`forge-4-backlog`, `forge-5-loop` and `forge-6-docs` each open by reading a served
|
|
4
|
+
stage's `stages.forge-verify-*` entry to answer one question — *has the upstream
|
|
5
|
+
artifact been verified, and what do I say if not?* Each answered it with its own
|
|
6
|
+
hand-rolled branch set: forge-4-backlog a binary verified/not check, forge-5-loop
|
|
7
|
+
four cases, forge-6-docs five. `forge-session.py verify-state` derives that answer
|
|
8
|
+
from the authoritative on-disk entry instead — one case enum, one message table,
|
|
9
|
+
the same "never eyeball the graph" move `select-outcome` makes for the exit outcome
|
|
10
|
+
(issue #277, part of the #265 guard-first program).
|
|
11
|
+
|
|
12
|
+
The verb reads, never writes. It reads the **raw** `forge-verify-{token}` status the
|
|
13
|
+
gates key on — it does **not** apply the version-aware freshness `verify_state()`
|
|
14
|
+
computes for the navigator's most-recent-stage gate. A `passed` entry classifies
|
|
15
|
+
`passed` regardless of the stage version, because that is exactly what the gates read
|
|
16
|
+
today; layering re-verify-on-revision onto them would be a behaviour change, not an
|
|
17
|
+
additive one.
|
|
18
|
+
|
|
19
|
+
## Synopsis
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
python3 forge-session.py verify-state \
|
|
23
|
+
--feature F --for-stage S [--specs-dir DIR] [--epic E] [--json]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`--for-stage` is one of the five verify-token production stages (`forge-1-prd`,
|
|
27
|
+
`forge-2-tech`, `forge-3-specs`, `forge-4-backlog`, `forge-5-loop`) — the stage whose
|
|
28
|
+
`forge-verify-{token}` entry is classified. `forge-0-epic` (verification lives in
|
|
29
|
+
`.epic-state.json`) and `forge-6-docs` (no verify token) are **out of scope** and
|
|
30
|
+
rejected at parse time.
|
|
31
|
+
|
|
32
|
+
Output — always `{case, verified, stale, message, nextCommand}`:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"case": "findings-applied",
|
|
37
|
+
"verified": false,
|
|
38
|
+
"stale": true,
|
|
39
|
+
"message": "Fixes were applied to auth's forge-4-backlog but nothing re-verified them; re-verification is still outstanding — run forge-verify auth backlog.",
|
|
40
|
+
"nextCommand": "forge-verify auth backlog"
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- **`case`** — one `VerifyStateCase`, the union of the cases the three gates spell out.
|
|
45
|
+
- **`verified`** — `true` only for `passed`. An explicit `skipped` is resolved but *not*
|
|
46
|
+
verified, so it is `false`.
|
|
47
|
+
- **`stale`** — `true` only for `findings-applied`: fixes landed but nothing re-verified
|
|
48
|
+
them, so a re-verify is still owed.
|
|
49
|
+
- **`message`** — the single canonical operator sentence for the case.
|
|
50
|
+
- **`nextCommand`** — the forge-verify retry for every unresolved case; `null` for
|
|
51
|
+
`passed`, which needs no action.
|
|
52
|
+
|
|
53
|
+
## The case enum
|
|
54
|
+
|
|
55
|
+
`VerifyStateCase` is the union of the raw `forge-verify-*` statuses the three gates
|
|
56
|
+
key on, plus `never` for the absent / `pending` / unrecognized bucket every gate
|
|
57
|
+
folds into "not verified". `tests/test_verify_state.py` pins the enum to the
|
|
58
|
+
enumerating gate bodies, both directions, so a gate cannot grow a seventh case or
|
|
59
|
+
spell an existing one differently.
|
|
60
|
+
|
|
61
|
+
| `case` | on-disk status | `verified` | `stale` | meaning |
|
|
62
|
+
| --- | --- | :---: | :---: | --- |
|
|
63
|
+
| `passed` | `passed` | ✓ | | verification passed — proceed |
|
|
64
|
+
| `findings-reported` | `findings-reported` | | | blocking findings live and unresolved |
|
|
65
|
+
| `findings-applied` | `findings-applied` | | ✓ | fixes applied, re-verify still owed |
|
|
66
|
+
| `auto-verify-pending` | `auto-verify-pending` | | | scheduled automatic verification, owed but unrun |
|
|
67
|
+
| `skipped` | `skipped` | | | user explicitly proceeded without verifying |
|
|
68
|
+
| `never` | absent / `pending` / unrecognized | | | never verified |
|
|
69
|
+
|
|
70
|
+
## Classification
|
|
71
|
+
|
|
72
|
+
The status ordering mirrors `verify_state()` — an explicit `skipped` and recorded
|
|
73
|
+
`auto-verify-pending` debt are tested **before** the generic bucket, so neither can
|
|
74
|
+
fall through to `never`:
|
|
75
|
+
|
|
76
|
+
1. `skipped` → **skipped**.
|
|
77
|
+
2. `auto-verify-pending` → **auto-verify-pending**. Unusable scheduling metadata
|
|
78
|
+
(missing/malformed `scheduledStageVersion`) warns once (REQ-DEBT-02) but the debt
|
|
79
|
+
stays owed — degrading it to `never` is exactly the conflation that requirement
|
|
80
|
+
forbids.
|
|
81
|
+
3. `findings-reported` → **findings-reported**.
|
|
82
|
+
4. `findings-applied` → **findings-applied**.
|
|
83
|
+
5. `passed` → **passed**.
|
|
84
|
+
6. anything else (absent, `pending`, or an out-of-vocabulary status) → **never**. A
|
|
85
|
+
present-but-unrecognized status is flagged once (#148) then treated as unverified,
|
|
86
|
+
the same answer an absent entry gets; a known `pending` (or an absent entry) is
|
|
87
|
+
quiet.
|
|
88
|
+
|
|
89
|
+
A missing, unreadable, or torn state file never raises — the entry reads as absent
|
|
90
|
+
and classifies `never`, the same fail-safe the three gates take.
|
|
91
|
+
|
|
92
|
+
## Messages
|
|
93
|
+
|
|
94
|
+
`VERIFY_STATE_MESSAGES` holds one canonical sentence per case; the `auto-verify-pending`
|
|
95
|
+
case reuses `AUTO_PENDING_DIAGNOSTIC` — the single normative owed-debt sentence every
|
|
96
|
+
read-side emitter already shares — and appends the revision-advance clause when the
|
|
97
|
+
recorded schedule predates the current artifact. `{subject}` is the feature (or epic
|
|
98
|
+
member), `{stage}` the served production stage, `{command}` the forge-verify retry.
|
|
@@ -642,7 +642,28 @@ def _compose_agent_file(answers: Answers, filename: str) -> str:
|
|
|
642
642
|
|
|
643
643
|
|
|
644
644
|
def write_hygiene(answers: Answers, target: Path, sentinel: Sentinel) -> None:
|
|
645
|
-
"""Emit README, LICENSE, and the host agent-instruction file(s) (02 §4.5).
|
|
645
|
+
"""Emit README, LICENSE, and the host agent-instruction file(s) (02 §4.5).
|
|
646
|
+
|
|
647
|
+
Interop with ``forge-init``'s root hygiene step
|
|
648
|
+
(``references/shared-conventions.md`` § "Root Hygiene (Tooling Feedback)"), which
|
|
649
|
+
writes the same "Tooling feedback" section into a root ``AGENTS.md``/``CLAUDE.md``.
|
|
650
|
+
The two writers cannot duplicate each other, but NOT because of the guard below:
|
|
651
|
+
a target that ``forge-init`` has touched holds ``forge.config.json`` (and possibly
|
|
652
|
+
``AGENTS.md``), neither of which ``ALLOWED_META_FILE_RE`` permits, so ``check()``
|
|
653
|
+
reports ``eligible: false`` and the greenfield gate refuses the whole bootstrap run
|
|
654
|
+
before ``scaffold()`` is reached. In the other direction it is ``forge-init``'s own
|
|
655
|
+
shell ``[ -f … ] ||`` guard that protects this file. ``_write_artifact``'s
|
|
656
|
+
never-overwrite guard is load-bearing here only for an interrupted-bootstrap resume
|
|
657
|
+
(REQ-LIFE-02) — worth knowing, since the obvious reading of "never overwrites" is
|
|
658
|
+
that it is what makes the two writers safe together, and it is not.
|
|
659
|
+
|
|
660
|
+
On that one resume path the skip has a cost worth stating: forge-init's template is
|
|
661
|
+
a stub carrying only the "Tooling feedback" section, so keeping it means the project
|
|
662
|
+
never receives the rest of THIS template — Project Purpose, Getting Started,
|
|
663
|
+
Conventions, and "Specs are pre-implementation". Keeping the user's file is still
|
|
664
|
+
the right call (it is not ours to overwrite), but the two files are not equivalent
|
|
665
|
+
and the block is a subset, not a superset.
|
|
666
|
+
"""
|
|
646
667
|
_write_artifact(target, "README.md", _compose_readme(answers), sentinel)
|
|
647
668
|
if answers["license"] != "none":
|
|
648
669
|
_write_artifact(target, "LICENSE", _compose_license(answers), sentinel)
|
|
@@ -806,7 +827,7 @@ def verify(target: Path, answers: Answers) -> VerifyResult:
|
|
|
806
827
|
return {"toolchainPresent": True, "lint": lint, "test": test, "green": green}
|
|
807
828
|
|
|
808
829
|
|
|
809
|
-
#: mirrors ``load_json_with_duplicates``/``warn_duplicate_keys`` in scripts/
|
|
830
|
+
#: mirrors ``load_json_with_duplicates``/``warn_duplicate_keys`` in scripts/forge_session/_common.py
|
|
810
831
|
def load_json_with_duplicates(path: Path) -> tuple[object, list[str]]:
|
|
811
832
|
"""Load JSON with last-key-wins values and ordered duplicate key names.
|
|
812
833
|
|
|
@@ -12,6 +12,44 @@
|
|
|
12
12
|
# generator (REQ-RES-05); keep it dependency-free beyond POSIX/Bash + the sentinel files.
|
|
13
13
|
set -euo pipefail
|
|
14
14
|
|
|
15
|
+
# ── Explain mode (#323; consumed only by doctor — the no-arg stdout contract is unchanged). ──
|
|
16
|
+
# `--explain` prints `channel<TAB>path` for the resolved root instead of the bare path;
|
|
17
|
+
# `--explain --all` prints one `channel<TAB>path` line for EVERY candidate root probed (complete
|
|
18
|
+
# or degraded) WITHOUT stopping at the first, so doctor can enumerate every install on the host.
|
|
19
|
+
# No args → the historic bare-path-to-stdout contract, byte-for-byte.
|
|
20
|
+
EXPLAIN=0
|
|
21
|
+
EXPLAIN_ALL=0
|
|
22
|
+
if [ "${1:-}" = "--explain" ]; then
|
|
23
|
+
EXPLAIN=1
|
|
24
|
+
[ "${2:-}" = "--all" ] && EXPLAIN_ALL=1
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# Print a resolved root: `channel<TAB>path` under --explain, else the bare path (the contract
|
|
28
|
+
# every prelude fence and tests/test_forge_root.py depend on).
|
|
29
|
+
emit_root() { # $1 = channel, $2 = path
|
|
30
|
+
if [ "$EXPLAIN" -eq 1 ]; then
|
|
31
|
+
printf '%s\t%s\n' "$1" "$2"
|
|
32
|
+
else
|
|
33
|
+
printf '%s\n' "$2"
|
|
34
|
+
fi
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# Classify a resolved path to its install channel — used only by the discovery probe, whose
|
|
38
|
+
# fixed candidate list mixes every agent's layout. The explicit steps pass their own channel.
|
|
39
|
+
classify_channel() { # $1 = path
|
|
40
|
+
case "$1" in
|
|
41
|
+
*"/.claude/plugins/cache/"*) printf 'marketplace-cache' ;;
|
|
42
|
+
*"/.claude/plugins/"*) printf 'plugins-dir' ;;
|
|
43
|
+
*"/.claude/skills/"*) printf 'skills-dir' ;;
|
|
44
|
+
*"/.agents/skills/"*) printf 'agents-skills' ;;
|
|
45
|
+
*"/.pi"*) printf 'pi-dir' ;;
|
|
46
|
+
*"/.cursor/"*) printf 'cursor-dir' ;;
|
|
47
|
+
*"/.gemini/"*) printf 'gemini-dir' ;;
|
|
48
|
+
*"/.github/"*) printf 'copilot-dir' ;;
|
|
49
|
+
*) printf 'discovery' ;;
|
|
50
|
+
esac
|
|
51
|
+
}
|
|
52
|
+
|
|
15
53
|
# Sentinel predicate (00-core-definitions.md §2 / SENTINEL_FILES). A directory is a valid
|
|
16
54
|
# feature-forge root iff it carries the neutral bundle sentinel `.feature-forge-bundle.json`
|
|
17
55
|
# (emitted into EVERY per-agent adapter bundle) OR the legacy Claude plugin manifest
|
|
@@ -33,12 +71,30 @@ CORE_ASSETS=(
|
|
|
33
71
|
"references/stage-exit-protocol.md"
|
|
34
72
|
)
|
|
35
73
|
|
|
74
|
+
# scripts/forge-session.py is a thin shim that imports the sibling scripts/forge_session/
|
|
75
|
+
# package (#279); a bundle that ships the shim but not the package cannot run the CLI, so
|
|
76
|
+
# the package is part of a COMPLETE install. It is enforced only when the shipped
|
|
77
|
+
# forge-session.py is ACTUALLY the shim (its body references `forge_session`): a legacy
|
|
78
|
+
# self-contained forge-session.py that predates the split has no such package and must not
|
|
79
|
+
# be spuriously flagged. This marker file proves the package dir shipped alongside the shim.
|
|
80
|
+
PACKAGE_MARKER="scripts/forge_session/__init__.py"
|
|
81
|
+
|
|
82
|
+
# Precise proxy for "this forge-session.py actually imports the forge_session package" — an
|
|
83
|
+
# `import forge_session` / `from forge_session… import` STATEMENT at line start (leading
|
|
84
|
+
# whitespace allowed). Anchoring to the statement avoids a bare token match (a comment or an
|
|
85
|
+
# unrelated symbol mentioning `forge_session`) firing the package requirement, and a real
|
|
86
|
+
# import line always satisfies it.
|
|
87
|
+
SHIM_IMPORT_RE='^[[:space:]]*(from|import)[[:space:]]+forge_session([._[:space:]]|$)'
|
|
88
|
+
|
|
36
89
|
# Echo the first missing core asset (relative path) for $1, or nothing when complete.
|
|
37
90
|
first_missing_asset() { # $1 = candidate dir
|
|
38
91
|
local a
|
|
39
92
|
for a in "${CORE_ASSETS[@]}"; do
|
|
40
93
|
[ -f "$1/$a" ] || { printf '%s' "$a"; return 0; }
|
|
41
94
|
done
|
|
95
|
+
if grep -qE "$SHIM_IMPORT_RE" "$1/scripts/forge-session.py" 2>/dev/null; then
|
|
96
|
+
[ -f "$1/$PACKAGE_MARKER" ] || { printf '%s' "$PACKAGE_MARKER"; return 0; }
|
|
97
|
+
fi
|
|
42
98
|
}
|
|
43
99
|
|
|
44
100
|
# A sentinel-bearing candidate that lacks a core asset is remembered here (first one wins)
|
|
@@ -47,16 +103,22 @@ first_missing_asset() { # $1 = candidate dir
|
|
|
47
103
|
partial_root=""
|
|
48
104
|
partial_missing=""
|
|
49
105
|
|
|
50
|
-
# Given a candidate that already passed is_root:
|
|
106
|
+
# Given a candidate that already passed is_root: emit + exit 0 if it is complete; otherwise
|
|
51
107
|
# record it as the degraded fallback and return so probing continues. Always returns 0 on the
|
|
52
|
-
# fall-through path so `set -e` never aborts the resolver on a partial candidate.
|
|
53
|
-
|
|
54
|
-
|
|
108
|
+
# fall-through path so `set -e` never aborts the resolver on a partial candidate. Under
|
|
109
|
+
# --explain --all it emits every candidate (tagged) and never exits, for enumeration.
|
|
110
|
+
accept_root() { # $1 = candidate dir (already is_root); $2 = channel ("auto" → classify by path)
|
|
111
|
+
local miss channel
|
|
112
|
+
channel="$2"
|
|
113
|
+
[ "$channel" = "auto" ] && channel="$(classify_channel "$1")"
|
|
55
114
|
miss="$(first_missing_asset "$1")"
|
|
56
115
|
if [ -z "$miss" ]; then
|
|
57
|
-
|
|
58
|
-
exit 0
|
|
116
|
+
emit_root "$channel" "$1"
|
|
117
|
+
[ "$EXPLAIN_ALL" -eq 1 ] || exit 0
|
|
118
|
+
return 0
|
|
59
119
|
fi
|
|
120
|
+
# Degraded candidate: --all reports it tagged so doctor sees the full picture.
|
|
121
|
+
[ "$EXPLAIN_ALL" -eq 1 ] && emit_root "${channel}(degraded)" "$1"
|
|
60
122
|
if [ -z "$partial_root" ]; then
|
|
61
123
|
partial_root="$1"
|
|
62
124
|
partial_missing="$miss"
|
|
@@ -64,13 +126,34 @@ accept_root() { # $1 = candidate dir (already is_root)
|
|
|
64
126
|
return 0
|
|
65
127
|
}
|
|
66
128
|
|
|
129
|
+
# ── Step 0: explicit operator override — FEATURE_FORGE_ROOT is authoritative (#323). ────────
|
|
130
|
+
# A set value MUST resolve here or fail loudly; it never silently falls back to discovery, so a
|
|
131
|
+
# dev-override pointing at the wrong/absent bundle is an actionable error rather than a surprise
|
|
132
|
+
# run of some other install on a multi-install host. (CLAUDE_PLUGIN_ROOT is a host-set fact, not
|
|
133
|
+
# an operator override, so it stays in Step 3.) --explain --all only enumerates, so it neither
|
|
134
|
+
# exits nor fails here.
|
|
135
|
+
if [ -n "${FEATURE_FORGE_ROOT:-}" ]; then
|
|
136
|
+
if is_root "$FEATURE_FORGE_ROOT"; then
|
|
137
|
+
accept_root "$FEATURE_FORGE_ROOT" "FEATURE_FORGE_ROOT"
|
|
138
|
+
# accept_root exited 0 on a complete override. Reaching here means it is DEGRADED (or we are
|
|
139
|
+
# enumerating): a set-but-incomplete override fails loudly, never falls back.
|
|
140
|
+
if [ "$EXPLAIN_ALL" -ne 1 ]; then
|
|
141
|
+
echo "feature-forge: FEATURE_FORGE_ROOT=$FEATURE_FORGE_ROOT is a degraded install (missing $partial_missing) — reinstall/update it, or unset FEATURE_FORGE_ROOT to fall back to discovery." >&2
|
|
142
|
+
exit 1
|
|
143
|
+
fi
|
|
144
|
+
elif [ "$EXPLAIN_ALL" -ne 1 ]; then
|
|
145
|
+
echo "feature-forge: FEATURE_FORGE_ROOT=$FEATURE_FORGE_ROOT is not a feature-forge root (no .feature-forge-bundle.json or .claude-plugin/plugin.json) — fix or unset it; discovery is skipped for an explicit override." >&2
|
|
146
|
+
exit 1
|
|
147
|
+
fi
|
|
148
|
+
fi
|
|
149
|
+
|
|
67
150
|
# ── Step 1: self-location — parent of this script's dir is the install root. ─────────────
|
|
68
151
|
# This is the PRIMARY path: a bundle ships its own scripts/forge-root.sh, so the parent of
|
|
69
152
|
# this script's dir is that bundle's root under any agent's layout.
|
|
70
153
|
self_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
|
|
71
154
|
root="$(cd -- "$self_dir/.." && pwd -P)"
|
|
72
155
|
if is_root "$root"; then
|
|
73
|
-
accept_root "$root"
|
|
156
|
+
accept_root "$root" "self-location"
|
|
74
157
|
fi
|
|
75
158
|
|
|
76
159
|
# ── Step 2a: Claude marketplace-cache installs — ~/.claude/plugins/cache/<mp>/<plugin>/<ver>/.
|
|
@@ -84,7 +167,7 @@ fi
|
|
|
84
167
|
while IFS= read -r manifest; do
|
|
85
168
|
candidate="${manifest%/.claude-plugin/plugin.json}"
|
|
86
169
|
if is_root "$candidate"; then
|
|
87
|
-
accept_root "$candidate"
|
|
170
|
+
accept_root "$candidate" "auto"
|
|
88
171
|
fi
|
|
89
172
|
done < <(ls -t "$HOME"/.claude/plugins/cache/*/feature-forge/*/.claude-plugin/plugin.json 2>/dev/null || true)
|
|
90
173
|
|
|
@@ -105,7 +188,7 @@ if [ -n "${PI_CODING_AGENT_DIR:-}" ]; then
|
|
|
105
188
|
"$PI_CODING_AGENT_DIR"/node_modules/@garygentry/feature-forge/adapters/pi \
|
|
106
189
|
; do
|
|
107
190
|
if is_root "$candidate"; then
|
|
108
|
-
accept_root "$candidate"
|
|
191
|
+
accept_root "$candidate" "auto"
|
|
109
192
|
fi
|
|
110
193
|
done
|
|
111
194
|
fi
|
|
@@ -137,7 +220,7 @@ for candidate in \
|
|
|
137
220
|
"$PWD"/.pi/node_modules/@garygentry/feature-forge/adapters/pi \
|
|
138
221
|
; do
|
|
139
222
|
if is_root "$candidate"; then
|
|
140
|
-
accept_root "$candidate"
|
|
223
|
+
accept_root "$candidate" "auto"
|
|
141
224
|
fi
|
|
142
225
|
done
|
|
143
226
|
|
|
@@ -150,7 +233,7 @@ probe_dir="$PWD"
|
|
|
150
233
|
while :; do
|
|
151
234
|
candidate="$probe_dir/.pi/skills/feature-forge"
|
|
152
235
|
if is_root "$candidate"; then
|
|
153
|
-
accept_root "$candidate"
|
|
236
|
+
accept_root "$candidate" "auto"
|
|
154
237
|
fi
|
|
155
238
|
[ "$probe_dir" = "/" ] && break
|
|
156
239
|
next_probe_dir="$(dirname -- "$probe_dir")"
|
|
@@ -158,19 +241,19 @@ while :; do
|
|
|
158
241
|
probe_dir="$next_probe_dir"
|
|
159
242
|
done
|
|
160
243
|
|
|
161
|
-
# ── Step 3: env fallback —
|
|
162
|
-
# The neutral override
|
|
163
|
-
#
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
fi
|
|
244
|
+
# ── Step 3: legacy env fallback — CLAUDE_PLUGIN_ROOT. ────────────────────────────────────
|
|
245
|
+
# The neutral FEATURE_FORGE_ROOT override is handled authoritatively in Step 0 (#323).
|
|
246
|
+
# CLAUDE_PLUGIN_ROOT is a host-set fact (Claude exports it), NOT an operator override, so it
|
|
247
|
+
# stays here as a last discovery hint — kept only for backwards compatibility with existing
|
|
248
|
+
# Claude installs (C-4).
|
|
167
249
|
if [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] && is_root "$CLAUDE_PLUGIN_ROOT"; then
|
|
168
|
-
accept_root "$CLAUDE_PLUGIN_ROOT"
|
|
250
|
+
accept_root "$CLAUDE_PLUGIN_ROOT" "CLAUDE_PLUGIN_ROOT"
|
|
169
251
|
fi
|
|
170
252
|
|
|
171
|
-
# ── Step 4: failure
|
|
172
|
-
# DEGRADED install (#152) — report it distinctly
|
|
173
|
-
#
|
|
253
|
+
# ── Step 4: failure (or, under --explain --all, the end of enumeration). A sentinel-bearing but
|
|
254
|
+
# asset-incomplete root found along the way is a DEGRADED install (#152) — report it distinctly
|
|
255
|
+
# and actionably rather than the generic cannot-locate message. ─
|
|
256
|
+
[ "$EXPLAIN_ALL" -eq 1 ] && exit 0 # --all printed every candidate; it is diagnostic, never a failure
|
|
174
257
|
if [ -n "$partial_root" ]; then
|
|
175
258
|
echo "feature-forge: install incomplete/degraded at $partial_root (missing $partial_missing) — reinstall with 'npx @garygentry/feature-forge' (or 'feature-forge update' for a stale install)." >&2
|
|
176
259
|
exit 1
|