Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions corpus/skills/cat-mode/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -201,11 +201,8 @@ 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:
Expand Down
6 changes: 4 additions & 2 deletions corpus/skills/cat-mode/references/named-constraints.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,10 @@ individual constraints it covers.
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
raise it with the user with that evidence.
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
was wrong. Restate it as a binding parameter in the plan before any work
Expand Down
11 changes: 9 additions & 2 deletions tests/test_cat_mode.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Loading