cat-mode: relabeling text away from a checker is the fifth way past a block - #520
Conversation
…cat-mode names a hook or classifier block as a stop, with the concrete ways of getting past a block spelled out as forbidden. Review lane: docs Safety invariant: Prose only. No hook, script, installer, or settings change, and no edit outside corpus/skills/cat-mode. Pending user confirmation in this session. Effectiveness measurement: The coverage and provenance gates pass on the diff and the bullet's bold lead appears once in SKILL.md. Slice rationale: One rule in one skill, so the diff carries one claim. Architectural effect: None; the mode skill gains one standing rule. Goal: Add the bullet to SKILL.md under Named constraints and its full text to references/named-constraints.md, mirroring the neighbours' structure. Motivation: The same complaint class recurred in three sessions and the existing lines cover only reading a gate and classifier denials. Alternative considerations: Relying on the tag-needs-a-tool-call hook alone was rejected because rewording a subagent prompt and reissuing a denied command are not tag shapes. Restating the classifier-denial rule from CLAUDE.learned.md was rejected; the new text references it in one clause. Implementation details: See prompt. Non-goals: No hook or code change. No change to CLAUDE.core.md or CLAUDE.learned.md. No dates, session ids, or incident narrative in the rule text. Layer: docs Feature state: active Files: - corpus/skills/cat-mode/SKILL.md - corpus/skills/cat-mode/references/named-constraints.md Change types: - corpus/skills/cat-mode/SKILL.md: modify - corpus/skills/cat-mode/references/named-constraints.md: modify Acceptance criteria: - `git grep -c "A hook or classifier block is a stop, not a puzzle" -- corpus/skills/cat-mode/SKILL.md` prints 1. - `python3 scripts/check_skill_test_coverage.py --base origin/main --head HEAD` exits 0. - `python3 scripts/check_no_dated_provenance.py` exits 0. Exit code: 0 Invoker-Finalize-Id: 6f060ec2-4eb0-4b6e-af44-cf78932754c7
…aim: the rule is present exactly once and the prose gates pass on the finished branch. Review lane: proof Safety invariant: Verification is read-only and does not alter any file. Effectiveness measurement: The grep count and the two gate runs are the direct measurement. Slice rationale: One focused proof per claim before review. Architectural effect: None; verification only. Goal: Prove the bullet landed once and the coverage and provenance gates are green. Layer exception: allowed. Proof runs after the docs task so it checks the finished branch; it reads files only and changes nothing. Motivation: A rule that fails a gate never reaches the installed skill. Alternative considerations: Reading the diff by eye was rejected as non-deterministic. Implementation details: Run the grep and the two gate scripts. Non-goals: No mutations. Layer: app_regression Feature state: active Acceptance criteria: - Exits 0 only when the grep count is 1 and both gates pass. Exit code: 1 Invoker-Finalize-Id: d7581d63-c315-4b14-8995-518d9748c0f7
The prior docs commit added the "hook or classifier block is a stop" bullet to SKILL.md and named-constraints.md without a corresponding test change, failing check_skill_test_coverage.py. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…aim: the rule is present exactly once and the prose gates pass on the finished branch. Review lane: proof Safety invariant: Verification is read-only and does not alter any file. Effectiveness measurement: The grep count and the two gate runs are the direct measurement. Slice rationale: One focused proof per claim before review. Architectural effect: None; verification only. Goal: Prove the bullet landed once and the coverage and provenance gates are green. Layer exception: allowed. Proof runs after the docs task so it checks the finished branch; it reads files only and changes nothing. Motivation: A rule that fails a gate never reaches the installed skill. Alternative considerations: Reading the diff by eye was rejected as non-deterministic. Implementation details: Run the grep and the two gate scripts. Non-goals: No mutations. Layer: app_regression Feature state: active Acceptance criteria: - Exits 0 only when the grep count is 1 and both gates pass. Exit code: 0 Invoker-Finalize-Id: publish-approved-fix
…o ephemeral inter-task handoff files remain in the worktree before the merge gate. Review lane: cleanup Safety invariant: The scrub script only checks for known handoff artifact names and never touches source, tests, or other repository files. Effectiveness measurement: The script exits non-zero if any handoff artifact remains. Slice rationale: Required terminal scrub for every implementation workflow. Architectural effect: None; hygiene only. Goal: Leave the branch free of handoff artifacts. Motivation: Handoff files must not reach the PR. Alternative considerations: Manual cleanup was rejected as non-deterministic. Implementation details: Run scripts/scrub-handoff-artifacts.sh. Non-goals: No product edits. Layer: app_regression Feature state: active Acceptance criteria: - `bash scripts/scrub-handoff-artifacts.sh` exits 0. Exit code: 0 Invoker-Finalize-Id: 608b0668-5db8-4b5b-898b-415a17f9d6c7
Bugbot couldn't run - usage limit reachedBugbot 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_3bac8e76-778c-4372-ae31-199737dc7147) |
|
Replaces #485: same claim, rebased onto main after #471 (its old base) squash-merged, plus the test the skill coverage gate requires. #485 could not be reopened. GitHub refused, because its branch was force-pushed while the PR was closed: |
|
Queued — the merge queue status continues in this comment ↓. |
Tests: - python3 -m unittest tests.test_cat_mode -v OK - git grep -c "relabel or relocate wording" -- corpus/skills/cat-mode/references/named-constraints.md corpus/skills/cat-mode/references/named-constraints.md:1 - python3 scripts/check_no_dated_provenance.py ok no dated provenance
…k-is-a-stop rule's full text names relabeling wording away from a checker as a forbidden shape. Review lane: docs Safety invariant: Prose only. No hook, script, installer, or settings change, and no edit outside corpus/skills/cat-mode/references; every existing cat-mode test assertion keeps its target text. Pending user confirmation in this session. Effectiveness measurement: tests/test_cat_mode.py passes in full and the new sentence appears exactly once in the reference file. Slice rationale: One rule's full text gains one sentence, so the diff carries one claim. Architectural effect: None; the page summary in SKILL.md is untouched. Goal: Add the sentence to the reference entry. Motivation: The session that produced the rule passed a plan checker by placing unchanged step text under a heading the checker does not inspect. Alternative considerations: Adding the shape to the SKILL.md bullet was rejected because the page is capped and the full text lives in the reference file. Implementation details: In corpus/skills/cat-mode/references/named-constraints.md, inside the entry that begins "A hook or classifier block is a stop, not a puzzle", add one sentence before "Do what the block asks": Do not relabel or relocate wording so that the region a checker inspects no longer contains it; the words stay where the check looks, or the check is raised with the user. Keep the entry's wrap width. Then run the cat-mode test module and confirm every assertion still finds its text. Non-goals: No change to SKILL.md, any other bullet, hook, or script. No dates, session identifiers, or incident narrative. Layer: docs Feature state: active Files: - corpus/skills/cat-mode/references/named-constraints.md Change types: - corpus/skills/cat-mode/references/named-constraints.md: modify Acceptance criteria: - `python3 -m unittest tests.test_cat_mode -v` exits 0. - `git grep -c "relabel or relocate wording" -- corpus/skills/cat-mode/references/named-constraints.md` prints 1. - `python3 scripts/check_no_dated_provenance.py` exits 0. Exit code: 0 Invoker-Finalize-Id: 44d91e03-2d3a-4321-856b-a2845718380c
… claim: the cat-mode test module and the prose gates pass on the finished branch. Review lane: proof Safety invariant: Verification is read-only and does not alter any file. Effectiveness measurement: The test module run and the two gates are the direct measurement. Slice rationale: One focused proof per claim before review. Architectural effect: None; verification only. Goal: Prove the reference text landed and nothing else changed. Layer exception: allowed. Proof runs after the docs task so it checks the finished branch; it reads files only and changes nothing. Motivation: A sentence that breaks an assertion never reaches the installed skill. Alternative considerations: The full repository suite was rejected; this module is the one the branch touches. Implementation details: Run the cat-mode test module, the provenance gate, and the skill coverage gate. Non-goals: No mutations. Layer: app_regression Feature state: active Acceptance criteria: - Exits 0 only when all three pass. Exit code: 0 Invoker-Finalize-Id: c2258fad-e08d-4bc0-bcad-62aac2474252
…No ephemeral inter-task handoff files remain in the worktree before the merge gate. Review lane: cleanup Safety invariant: The scrub script only checks for known handoff artifact names and never touches source, tests, or other repository files. Effectiveness measurement: The script exits non-zero if any handoff artifact remains. Slice rationale: Required terminal scrub for every implementation workflow. Architectural effect: None; hygiene only. Goal: Leave the branch free of handoff artifacts. Motivation: Handoff files must not reach the PR. Alternative considerations: Manual cleanup was rejected as non-deterministic. Implementation details: Run scripts/scrub-handoff-artifacts.sh. Non-goals: No product edits. Layer: app_regression Feature state: active Acceptance criteria: - `bash scripts/scrub-handoff-artifacts.sh` exits 0. Exit code: 0 Invoker-Finalize-Id: 065b98b8-c465-4895-a3a8-cd8a2afd2bcd
|
@Mergifyio queue |
Merge Queue Status
This pull request spent 2 minutes 40 seconds in the queue, with no time running CI. Waiting for
All conditions
ReasonThe pull request #520 has been manually updated Tick the box to put this pull request back in the merge queue (same as
|
…ade5d843b-1fd551d4 — Review claim: No ephemeral inter-task handoff files remain in the worktree before the merge gate. Review lane: cleanup Safety invariant: The scrub script only checks for known handoff artifact names and never touches source, tests, or other repository files. Effectiveness measurement: The script exits non-zero if any handoff artifact remains. Slice rationale: Required terminal scrub for every implementation workflow. Architectural effect: None; hygiene only. Goal: Leave the branch free of handoff artifacts. Motivation: Handoff files must not reach the PR. Alternative considerations: Manual cleanup was rejected as non-deterministic. Implementation details: Run scripts/scrub-handoff-artifacts.sh. Non-goals: No product edits. Layer: app_regression Feature state: active Acceptance criteria: - `bash scripts/scrub-handoff-artifacts.sh` exits 0.
714e424 to
b67afca
Compare
Bugbot couldn't run - usage limit reachedBugbot 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_3f8b7b59-7d6b-424f-9854-c59193d45095) |
|
Mergify repair stopped: missing required check lint |
Summary
This rule tells agents to stop when a hook or checker blocks a requested action.
The rule previously named four ways to evade that stop, but omitted moving wording outside the checker’s inspection area.
This change names that fifth forbidden shape in the rule’s full reference text.
Review Claim
The block-is-a-stop rule explicitly forbids relocating wording so a checker no longer sees it.
Review Lane
behavior
Review Unit
corpus-lesson
Safety Invariant
This is prose only. It changes one sentence in the rule reference and touches no hooks, scripts, installers, settings, tests, or files outside the reference corpus.
Slice Rationale
This slice carries one sentence for one rule. The page summary and its line-cap cleanup belong to the stacked base change.
Non-goals
Test Plan
Test Plan
python3 -m unittest tests.test_cat_mode -v && python3 scripts/check_no_dated_provenance.py && python3 scripts/check_skill_test_coverage.py --base origin/main --head HEADbash scripts/scrub-handoff-artifacts.shgit grep -c "relabel or relocate wording" -- corpus/skills/cat-mode/references/named-constraints.mdprints 1.Revert Plan
Revert Plan
git revert <the commit that adds this sentence>