diff --git a/corpus/skills/cat-mode/SKILL.md b/corpus/skills/cat-mode/SKILL.md index 2f2d5c40..dc128f65 100644 --- a/corpus/skills/cat-mode/SKILL.md +++ b/corpus/skills/cat-mode/SKILL.md @@ -201,16 +201,11 @@ bug: invoke `automate-me`, do not wait. - **Treat absolute negatives as categorical.** - **A blocked target is a stop, not a licence to substitute.** A number produced on a proxy carries the proxy's name beside the number. -- **A hook or classifier block is a stop, not a puzzle.** Do what the block - asks, or report the block and stop. Never reword the prompt, switch tools, - retag the claim, or propose weakening the hook to get past it. - Disagreement with a block goes to the user, after reading the hook's - source. +- **A hook or classifier block is a stop, not a puzzle.** + Do what the block asks, or report the block and stop; the forbidden shapes are in references/named-constraints.md. - **An answer given through a tool binds exactly as hard as a typed one.** - Each rule's full text: [references/named-constraints.md](references/named-constraints.md). - ## Categorical constraints & recurrence - Words like `only`, `never`, `any`, `no`, `do not`, `all`, `every`, and diff --git a/corpus/skills/cat-mode/references/named-constraints.md b/corpus/skills/cat-mode/references/named-constraints.md index 67f4ed17..0635021d 100644 --- a/corpus/skills/cat-mode/references/named-constraints.md +++ b/corpus/skills/cat-mode/references/named-constraints.md @@ -27,8 +27,11 @@ individual constraints it covers. turn with a couldn't-verify tag instead of running the check the gate asked for. Do not reissue a denied command through a different tool, flag, or invocation; the classifier-denial rule in `corpus/CLAUDE.learned.md` already - binds this shape. Do not open a change that makes a hook complain less. Do - what the block asks, and if the block is wrong, read the hook's source and + binds this shape. Do not open a change that makes a hook complain less. + 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. Do what the block asks, and if the block is wrong, + read the hook's source and raise it with the user with that evidence. - **An answer given through a tool binds exactly as hard as a typed one.** A free-text reply to a multiple-choice question means every option offered diff --git a/tests/test_cat_mode.py b/tests/test_cat_mode.py index 8c198bf6..4f5467dc 100644 --- a/tests/test_cat_mode.py +++ b/tests/test_cat_mode.py @@ -605,16 +605,23 @@ def test_named_constraints_reference_keeps_its_rules(self): def test_block_is_a_stop_rule_kept_its_full_text_in_the_reference(self): """The bullet's bold lead lives in SKILL.md; the concrete forbidden - shapes (reword, retag, reissue through another tool, weaken the hook) - live in named-constraints.md. Locks both halves the same way + shapes (reword, retag, reissue through another tool, weaken the hook, + relabel text away from the checker) live in named-constraints.md. + Locks both halves the same way test_unhedged_claim_rule_kept_its_full_text_when_it_moved does.""" skill = normalized_skill_text() self.assertIn("A hook or classifier block is a stop, not a puzzle.", skill) + self.assertIn("the forbidden shapes are in references/named-constraints.md", skill) + self.assertNotIn("Never reword the prompt, switch tools", skill) reference = normalized_reference_text("named-constraints.md") self.assertIn("A hook or classifier block is a stop, not a puzzle.", reference) self.assertIn("Do not reword a subagent prompt after `agent-routing-guard` refused it", reference) self.assertIn("Do not reissue a denied command through a different tool, flag, or invocation", reference) self.assertIn("Do not open a change that makes a hook complain less", reference) + self.assertIn( + "Do not relabel or relocate wording so that the region a checker inspects no longer contains it", + reference, + ) def test_routing_defers_to_an_installed_harness_routing_skill(self): skill = normalized_skill_text()