Skip to content

hook(diu-stop): scope the unverified marker to its own paragraph - #383

Closed
EdbertChan wants to merge 1 commit into
stack/EdbertChan/reflect/ui-input-guard-hook-freshness-20260908/cat-mode-rejoin-wrapped-prose-file-back-under-own--40138c11from
stack/EdbertChan/reflect/ui-input-guard-hook-freshness-20260908/scope-unverified-marker-own-paragraph--11fd3df0
Closed

hook(diu-stop): scope the unverified marker to its own paragraph#383
EdbertChan wants to merge 1 commit into
stack/EdbertChan/reflect/ui-input-guard-hook-freshness-20260908/cat-mode-rejoin-wrapped-prose-file-back-under-own--40138c11from
stack/EdbertChan/reflect/ui-input-guard-hook-freshness-20260908/scope-unverified-marker-own-paragraph--11fd3df0

Conversation

@EdbertChan

@EdbertChan EdbertChan commented Sep 10, 2026

Copy link
Copy Markdown
Owner

Summary

One UNVERIFIED: anywhere in a reply silenced every other check in that reply.

A hedge in the opening line therefore let an unhedged causal claim three paragraphs later through untouched. That is how one marker turned into a mute for a whole message, and it happened in the session that motivated this.

The marker now excuses the paragraph it sits in, exactly like a fence, keeping main's newer rule that inline code only counts when it looks like command output.

The prove-it nudge also stops firing on a marker that names its blocker, which is the documented use, and keeps firing on one that names nothing. The block text now says so.

Before and After

The same three-paragraph reply (a marker that names its blocker in the first paragraph, then an unhedged "because" claim in the third) was piped as {"last_assistant_message": ...} into python3 engine/hooks/diu-stop/claude_stop_check.py on the base commit a420fc8 and on this PR's commit 2438709. Before, the hook only nudged about the marker and missed the claim; after, it catches the claim and drops the nudge.

Before (a420fc8, exit=2):
This message contains an `UNVERIFIED:` claim. Per skills/prove-it/SKILL.md: attempt to verify it now (run the actual check) before finishing this turn, or tell the user explicitly what is blocking verification and why it can't happen right now.

After (2438709, exit=2):
This message makes an unverified-shaped claim ("because") with no adjacent evidence (pasted command output, or an `UNVERIFIED:` prefix). A backticked name or command alone is not output. Per skills/prove-it/SKILL.md: paste the output of what was actually run or checked. The prefix is for a check that cannot run, and it has to name the blocker: `UNVERIFIED: <claim> -- cannot verify: <reason>`.

Review Claim

The marker excuses its own paragraph rather than the whole message, and a marker with no named blocker still draws the prove-it nudge.

Review Lane

behavior

Review Unit

tooling-policy

Safety Invariant

The paragraph loop, the output-shape test for inline code, and every existing pattern are untouched; the change removes one early return and adds the marker to the same per-paragraph skip that fences already use. All 77 tests in the hook's suite pass, including the ones that pin the older behavior for a single-paragraph reply.

Slice Rationale

One hook, one behavior, on top of the cap fix it needs to be green.

Non-goals

Does not judge whether the evidence beside a claim is real, does not change the word-count gate, and does not touch the sibling hedge hook that reads the same marker.

Test Plan

Test Plan
  • python3 -m unittest discover -s engine/hooks/diu-stop/tests — 77 tests, OK
  • The two new scope tests fail before the change (FAILED (failures=2)) and pass after
  • python3 scripts/check_no_new_comments.py --base origin/main — ok

Revert Plan

Revert Plan
  • Safe to revert? Yes
  • Revert command: git revert <sha>
  • Post-revert steps: None
  • Data migration? No

🤖 Generated with Claude Code

https://claude.ai/code/session_01KU2pPKob4MJ1NqjsfTNyYJ

One `UNVERIFIED:` anywhere in a reply silenced every other check in that
reply, so a hedge in the opening line let an unhedged causal claim three
paragraphs later through untouched. The marker now excuses the paragraph it
sits in, exactly like a backtick or a fence.

The prove-it nudge also stops firing on a marker that names its blocker
("cannot verify: no network"), which is the documented use, and keeps firing
on one that names nothing. The block text now says the prefix is for a check
that cannot run and has to name why.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KU2pPKob4MJ1NqjsfTNyYJ
Change-Id: I11fd3df007c88b3751292e581fd337b98b9ebaf1
@EdbertChan

Copy link
Copy Markdown
Owner Author

This pull request is part of a Mergify stack:

# Pull Request Link
1 cat-mode: rejoin wrapped prose so the file is back under its own cap #382
2 hook(diu-stop): scope the unverified marker to its own paragraph #383 👈
3 skill(reflect): do not apply findings from a fan-out that never returned #384
4 audit(token_audit): count naming the shortcut, and typing the fix command #385

@cursor

cursor Bot commented Sep 10, 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_ca545818-1826-42e5-a704-aa096ac78095)

@EdbertChan

Copy link
Copy Markdown
Owner Author

Superseded by #415 (stack #415-#420): same paragraph scoping and must-name-a-blocker rule, moved onto the {{CAT-UNVERIFIED: <claim> -- cannot verify: <reason>}} tag. Its base #382 is untouched.

@EdbertChan EdbertChan closed this Sep 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant