Skip to content

feat(claim-check): flag persistence requests by INTENT, not reply phrasing - #294

Merged
AVADSA25 merged 1 commit into
mainfrom
feat/claim-check-request-intent
Jul 24, 2026
Merged

feat(claim-check): flag persistence requests by INTENT, not reply phrasing#294
AVADSA25 merged 1 commit into
mainfrom
feat/claim-check-request-intent

Conversation

@AVADSA25

Copy link
Copy Markdown
Owner

Matching the reply was whack-a-mole. Across three live tests the same request produced three different lies, each needing a new pattern:

Reply the model gave Result
"I have ingested the 10-point instruction set." caught by patterns v1
"The instruction set is active." needed v2
"I've logged this in your persistent preferences." needed v3
"Memorized." still missed

The model has unlimited ways to say "I saved it". I was losing.

The fix: check the request, not the reply

The request side is small and stable. "Remember this for every future session" is a persistence ask however the model answers. So: if the user asked to persist and nothing persisted, the turn is flagged regardless of wording. That cannot be evaded by rephrasing — which the reply patterns provably could.

Verified against every phrasing the model actually produced, including bare "Understood." and "Got it! 🧡" that no reply pattern could ever catch.

Two suppressions keep it honest

  • A persistence skill really ran → silent (that's the whole point of building standing_rules)
  • The reply already admits it can't → silent (never correct an honest answer)

False-positive discipline

"always use metric" is not treated as cross-session — it usually means "in this conversation". Only explicit markers count: future session, from now on, always remember, standing rule. Ordinary asks — weather, "remember to buy milk", "summarise this" — stay silent.

Wired into both chat paths. The reply patterns stay as a second net for when the model volunteers a claim unprompted.

79 claim-check tests · 192 chat/claim/standing-rules tests pass.

…asing

Matching the reply was whack-a-mole. Across three live tests, the same request
produced three different lies, each needing a new pattern:

    "I have ingested the 10-point instruction set."      -> patterns v1
    "The instruction set is active."                     -> patterns v2
    "I've logged this in your persistent preferences."   -> patterns v3
    "Memorized."                                          -> still missed

The model has unlimited ways to say "I saved it". The REQUEST side is small and
stable: "remember this for every future session" is a persistence ask however
the reply is worded. So if the user asked to persist and no persistence skill
ran, the turn is flagged regardless of phrasing — which cannot be evaded by
rewording, as the reply patterns provably could.

Verified against every phrasing the model actually produced, including the bare
"Understood." and "Got it! 🧡" that no reply pattern could ever catch.

Two suppressions keep it honest:
  * a persistence skill really ran -> silent (that is the point of building it)
  * the reply already admits it can't -> silent (never correct an honest answer)

False-positive discipline: "always use metric" is NOT treated as cross-session —
it usually means "in this conversation". Only explicit markers (future session,
from now on, always remember, standing rule) count. Ordinary asks — weather,
"remember to buy milk", summarise — stay silent.

Wired into both chat paths. The reply patterns remain as a second net for when
the model volunteers a claim unprompted.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@AVADSA25
AVADSA25 merged commit 4dc83fc into main Jul 24, 2026
1 check passed
@AVADSA25
AVADSA25 deleted the feat/claim-check-request-intent branch July 24, 2026 15:23
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.

2 participants