Skip to content

skills: decompose prove-it into a principle plus four evidence products - #302

Merged
EdbertChan merged 1 commit into
mainfrom
prove-it-decompose
Sep 9, 2026
Merged

skills: decompose prove-it into a principle plus four evidence products#302
EdbertChan merged 1 commit into
mainfrom
prove-it-decompose

Conversation

@EdbertChan

@EdbertChan EdbertChan commented Sep 9, 2026

Copy link
Copy Markdown
Owner

Summary

Catstack now owns the prove-it rule instead of borrowing it. Three of our hooks already enforce prove-it and eight of our skills cite it, but the rule itself lived in Invoker's installed skill directory, which ./install.sh cannot touch.

This splits it in two. principle-prove-it holds the claim gate: no claim settled without evidence in the same message. Four product skills gather that evidence — how for the mechanism, why for the lineage, alternatives-considered for the option set, spike-and-validate for the option nobody has run yet.

Idea borrowed from lauren (@poteto)'s pstack guide, which has /how and /why as understand-before-edit skills. We had neither. Our only git-history rule was one bullet inside principle-fix-root-causes.

Review Claim

Catstack should own the prove-it claim gate as a corpus principle, with the four evidence-gathering procedures as product skills.

Review Lane

policy

Review Unit

product-skill (dominant: 12 of 16 files)

Safety Invariant

Adds only — no existing file is modified and no hook logic changes. The single behavior change is that principle-prove-it omits disable-model-invocation, so it can auto-load on claim-shaped turns. Its content restates evidence rules that engine/CLAUDE.core.md already loads on every turn, so a load puts the agent under no rule it was not already under. The four products are inert until invoked.

Slice Rationale

Two review units ship together because they cannot be separated: all four product skills cite corpus/skills/principle-prove-it/references/finding-shape.md, so a products-only slice fails scripts/check_skill_file_refs.py, and a principle-only slice ships a routing table pointing at four skills that do not exist.

check_codify_has_code.py was run with --allow-prose-only. This slice adds rule prose whose enforcement already ships: engine/hooks/prove-it-ship-gate, engine/hooks/hedge-runs-prove-it, and engine/hooks/diu-stop. It relocates a rule into a loadable skill; it does not introduce an unenforced invariant.

Non-goals

  • Does not retire or modify Invoker's invoker-prove-it. Both exist after this.
  • Does not repoint engine/hooks/diu-stop's message, which still cites the Invoker path.
  • Does not document or enforce which skills may auto-fire. That is the next slice, which found that product/skills/admin-bypass-sweep — force-merges PRs past required checks — is auto-invocable today and held back only by prose in its own description.
  • Does not run ./install.sh. From a worktree that would point the home skill roots at .worktrees/.

Test Plan

Test Plan
  • python3 scripts/check_ecosystem_boundaries.pyok ecosystem boundaries
  • python3 scripts/check_skill_file_refs.pyok skill file refs
  • python3 scripts/check_skills_three_harnesses.pyok skills three-harness check
  • python3 scripts/check_skill_trigger_mechanism.pyok skill trigger mechanism
  • python3 scripts/check_skill_test_coverage.py --base origin/main --head HEADok skill test coverage
  • python3 scripts/check_no_dated_provenance.py --base origin/mainok no dated provenance
  • python3 scripts/check_codify_has_code.py --base origin/main --allow-prose-onlyok codify-has-code: prose-only change explicitly allowed

Note: the first check_skill_test_coverage.py run passed vacuously — it compared origin/main against an uncommitted HEAD. The result above is the post-commit rerun.

Revert Plan

Revert Plan
  • Safe to revert? Yes
  • Revert command: git revert <sha>
  • Post-revert steps: rerun ./install.sh from the main checkout to prune the five skill symlinks from the three harness roots
  • Data migration? No

🤖 Generated with Claude Code

https://claude.ai/code/session_01JQMWSLRArEfEm1psa7RKdD


Note

Low Risk
Additive markdown skills only; prove-it behavior is already enforced by hooks and core engine rules—the main nuance is optional auto-invocation of the principle on claim-shaped turns.

Overview
Catstack now owns the prove-it workflow in-repo instead of relying on Invoker’s external skill: a corpus principle-prove-it defines the claim gate (same-turn evidence or UNVERIFIED:, hedges trigger verification) and routes to four investigation products. Unlike other principle-* skills, it omits disable-model-invocation so it can auto-match claim-shaped turns.

The four new product skills (how, why, alternatives-considered, spike-and-validate) spell out fan-out/merge procedures for mechanism tracing, git/PR lineage, labeled option sets (considered vs invented), and throwaway spikes with pasted output. They share a finding-shape.md contract (grounding, evidence, null_result, merge rules). Each skill ships fires_example / stays_silent_example fixtures for trigger coverage.

No hook or existing file edits in this diff—enforcement stays on existing engine/hooks/*; this slice is documentation and loadable skill content wired for check_skill_file_refs and related skill harness checks.

Reviewed by Cursor Bugbot for commit 251d82e. Bugbot is set up for automated code reviews on this repo. Configure here.

## Context
- Problem: catstack ships three hooks that enforce prove-it
  (prove-it-ship-gate, hedge-runs-prove-it, diu-stop) and eight skills that
  cite it, but does not own the rule. diu-stop tells the agent to read
  "skills/prove-it/SKILL.md in the Invoker repo"; ~/.claude/skills/
  invoker-prove-it is a real directory written by Invoker's installer, so
  ./install.sh cannot update it. Engine-only mode cites a file it does not
  install.
- Trigger: reading lauren (@poteto)'s pstack guide (mirrored at
  github.com/cursor/plugins/pstack/docs/guide) surfaced /how and /why as
  understand-before-edit skills catstack has no equivalent of. The gap is
  real: our only git-history rule is one bullet in
  principle-fix-root-causes:22, not a procedure.

## Considerations
- Chose: split the rule from the procedures. principle-prove-it holds the
  claim gate (corpus, because check_ecosystem_boundaries.py:206 requires
  principle-* live there). how / why / alternatives-considered /
  spike-and-validate hold the fan-outs (product, human-authored portable
  workflows per docs/ecosystem.md).
- Chose: principle-prove-it is the one principle that does NOT carry
  disable-model-invocation. The other 25 are steering vocabulary you invoke
  by name; this one is a gate whose job is to intercept a claim as it forms.
  A gate that only fires when someone remembers to name it is not a gate.
  prove-it-ship-gate already auto-fires from corpus, so there is precedent.
- Rejected: reusing independent-judge-swarm's board shape. That grades a
  finished artifact (verdict/score/blocking_issues); these four return
  findings about work that has not happened yet, so there is nothing to
  grade. Shared shape lives in principle-prove-it/references/
  finding-shape.md instead, reusing the fan-out mechanic and the
  document-the-null rule from reflect/references/lenses.md.
- Rejected: treating alternatives-considered as symmetric with how/why.
  how and why read what exists and can return an honest null;
  alternatives generates, so it can always produce three plausible options
  and manufacture evidence for the very gate it feeds. Every option is
  labeled considered (cited) or invented (untested), and an invented option
  may not decide anything until spike-and-validate turns it into a run with
  real output.
- Not done here: retiring invoker-prove-it, repointing diu-stop's message at
  the new principle, and documenting/enforcing which skills may auto-fire.
  The last one is the next slice in this stack — it found that
  product/skills/admin-bypass-sweep (force-merge past required checks) is
  auto-invocable today and held back only by prose in its description.

## Blast Radius
- Adds only. No existing file modified, no hook logic touched.
- New: corpus/skills/principle-prove-it/ (SKILL.md, references/
  finding-shape.md, 2 test fixtures); product/skills/{how,why,
  alternatives-considered,spike-and-validate}/ (SKILL.md + 2 fixtures each).
- principle-prove-it auto-fires, so it can now load on claim-shaped turns
  that previously loaded nothing. Cost is context on exactly the turns where
  the rule applies.
- Risk: `how` and `why` are generic names in a flat installed skill
  namespace. Verified no collision in ~/.claude/skills at authoring time.
- Revertable with git revert; ./install.sh prunes the symlinks on rerun.

## Verification
- python3 scripts/check_ecosystem_boundaries.py -> ok
- python3 scripts/check_skill_file_refs.py -> ok
- python3 scripts/check_skills_three_harnesses.py -> ok
- python3 scripts/check_skill_trigger_mechanism.py -> ok
- python3 scripts/check_skill_test_coverage.py --base origin/main --head HEAD
  -> ok (rerun post-commit; the pre-commit run compared origin/main to an
  unchanged HEAD and passed vacuously)
- check_codify_has_code.py run with --allow-prose-only: this slice adds rule
  prose whose enforcement already ships in engine/hooks/prove-it-ship-gate,
  engine/hooks/hedge-runs-prove-it, and engine/hooks/diu-stop.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQMWSLRArEfEm1psa7RKdD
@cursor

cursor Bot commented Sep 9, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_36b6abee-907f-442a-a22c-a19276db75a9)

@mergify

mergify Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Queued — the merge queue status continues in this comment ↓.

@EdbertChan

Copy link
Copy Markdown
Owner Author

@Mergifyio queue

@EdbertChan
EdbertChan merged commit 2dc9a9f into main Sep 9, 2026
4 checks passed
@mergify

mergify Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • Entered queue2026-09-09 20:05 UTC · Rule: admin-bypass · triggered by a @mergifyio queue command
  • 🟠 Checks running · on draft merge queue: checking #302 on main (2dc9a9f) #314
  • 🚫 Left the queue2026-09-09 20:10 UTC · at 251d82ecdc289c025c32d0a47d2c4eca82104693

This pull request spent 5 minutes 6 seconds in the queue, with no time running CI.

Waiting for
  • check-success = lint
  • check-success = test
All conditions
  • check-success = lint
  • check-success = test

Reason

Pull request #302 has been merged manually at 2dc9a9f

Hint

You were too fast!

Tick the box to put this pull request back in the merge queue (same as @mergifyio queue).

  • Requeue this pull request

@mergify mergify Bot added the queued label Sep 9, 2026
@mergify

mergify Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

queue

☑️ The pull request has been merged manually

Details

The pull request has been merged manually at 2dc9a9f

@mergify mergify Bot removed the queued label Sep 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants