cat-mode: show the escape-hatch tag in the form the gate accepts - #786
Conversation
|
This pull request is part of a Mergify stack:
|
0201bdc to
fab6704
Compare
a993989 to
a0e5d05
Compare
Revision history
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit fab6704. Configure here.
a0e5d05 to
950a355
Compare
fab6704 to
1937775
Compare
950a355 to
b0e1eea
Compare
3ed5352 to
1fb69a0
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_ea2da72e-fd47-43db-b44d-ed1a0d1ab13b) |
1fb69a0 to
a8e7f75
Compare
b0e1eea to
51ed95a
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_dbe02907-5745-4823-8fe1-3b306668f806) |
|
Queued — the merge queue status continues in this comment ↓. |
The sentence that tells the reader to use the tag showed it as a bare token naming no blocker. That is the shape diu-stop rejects, so quoting cat-mode's own rule tripped the gate enforcing it. It now shows the same template engine/CLAUDE.core.md already uses. tests/test_cat_mode.py gains the structural catch: no tag anywhere in the skill may name no blocker, and the skill must still show the tag at all, so the fix cannot be "delete the example". Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Change-Id: If47021e83bdf3d8771ccbdb879001f6effc65a3c
The bare `{{CAT-UNVERIFIED}}` was fixed in SKILL.md, but the same sentence
lives twice on purpose: SKILL.md keeps the one-line form and references/
verify.md holds the full text the evidence gate leans on. verify.md still
showed the tag naming no blocker, so a reader sent to the reference copied
the shape diu-stop rejects.
verify.md now shows the same template. The structural catch walks every
markdown file in the skill instead of SKILL.md alone, and asserts the two
files that carry the rule are in the swept list, so an empty or mis-rooted
scan cannot report clean. The "still shows the tag at all" assertion now
covers both copies, so the fix cannot be deleting the example in either.
Fail-before / pass-after on
tests.test_cat_mode.TestEscapeHatchTemplateIsWellFormed: the extended scan
fails on verify.md's `['{{CAT-UNVERIFIED}}']` before the edit, and the full
91-test tests/test_cat_mode.py suite passes after.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The escape-hatch test explained why it pins SKILL.md and verify.md by name in three `#` comment lines. Comments are banned in code here, and CI's no-comments twin (scripts/ci/check_no_new_comments.py, the gate for engine/hooks/no-comments) failed the PR on exactly those three lines. The reason is worth keeping: a scan over an empty or mis-rooted list reports clean and reads the same as a pass, so the two files that carry the rule are asserted into the list before the sweep runs. Moving that text into the method docstring keeps it where a reader and `unittest -v` both see it, and the detector only looks for `#` and `//`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…est) Exit code: 0
|
@Mergifyio queue |
a8e7f75 to
2e69d29
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_fd27c241-ea9f-4f63-b0a9-0a7c35fb7a19) |
🛑 The pull request has been removed from the queue
|
|
@Mergifyio queue |
Merge Queue Status
This pull request spent 20 minutes 22 seconds in the queue, including 19 minutes 55 seconds running CI. Required conditions to merge
|

Summary
The conventions file shows the escape-hatch tag in a bare form the gate rejects.
Anyone quoting that line verbatim, which the same file tells them to do when relaying a blocked message, trips the gate.
This puts the full template in that line, matching how the core rules file already writes it.
Review Claim
The conventions file shows the tag in the form the gate accepts.
Review Lane
behavior
Review Unit
corpus-lesson
Safety Invariant
Only the example text changes. The gate's own rules are untouched, so nothing that used to block stops blocking.
Slice Rationale
A one-line documentation fix with a test that pins it. Kept out of the gate change so a prose edit never rides along with behaviour.
Non-goals
Does not change the tag format itself or any gate logic.
Test Plan
Test Plan
Run at this commit:
The added case asserts every tag example in the conventions file is one the gate accepts.
Revert Plan
Revert Plan
Revert this commit. The example returns to the bare form and quoting it trips the gate again.
Note
Low Risk
Documentation and regression tests only; marker validation behavior is untouched.
Overview
cat-mode showed the escape-hatch as bare
{{CAT-UNVERIFIED}}in the rule that tells readers to use that tag when they cannot prove a live-behavior claim. Quoting that line verbatim tripped the same gate the tag is meant to satisfy.The one-line rule in SKILL.md and the fuller copy in references/verify.md now use the full template
{{CAT-UNVERIFIED: <claim> -- cannot verify: <reason>}}, aligned with engine/CLAUDE.core.md. Gate logic is unchanged.tests/test_cat_mode.py adds
TestEscapeHatchTemplateIsWellFormed: it scans SKILL.md and every references/*.md viaengine/hooks/_markers/markers.pyso malformed tag examples cannot slip back in via verify.md alone.Reviewed by Cursor Bugbot for commit 2e69d29. Bugbot is set up for automated code reviews on this repo. Configure here.