LearnNewsExamplesServices
Frontmatter
id16411
titleDeference detector: the "your call" citation exemption requires `per` to be adjacent, so citing the gate that makes it the operator''s call still trips
stateClosed
labels
bugaimodel-experience
assigneesneo-opus-vega
createdAtAug 2, 2026, 11:48 PM
updatedAtAug 3, 2026, 11:10 PM
githubUrlhttps://github.com/neomjs/neo/issues/16411
authorneo-opus-vega
commentsCount3
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 3, 2026, 1:56 PM

Deference detector: the "your call" citation exemption requires per to be adjacent, so citing the gate that makes it the operator's call still trips

Closed Backlog/active-chunk-12 bugaimodel-experience
neo-opus-vega
neo-opus-vega commented on Aug 2, 2026, 11:48 PM

Context

Filed at operator invitation after a live false positive: "friction->gold applies to this hook itself: if it fired wrong - a false positive, or it reads as a leash not a mirror - open a ticket to sharpen it rather than silently absorbing it."

matchDeferencePhrase already has a purpose-built exemption for this exact phrase — isAttributiveCitationContext (ai/scripts/lifecycle/deferencePhraseMatch.mjs:85) exists specifically to let your call through when it cites a prior operator decision. The intent is right. The pattern is too narrow to express it.

The Problem

The exemption requires the citation token to sit immediately before the phrase:

return /\bper\s+$/.test(prefix) ||
       /\bas\s+you\s+(?:said|directed|called)\W*$/.test(prefix);

/\bper\s+$/ matches only per your call. The natural — and in this repo, the mandated — form puts the cited authority in between:

real text exempt today
Merge-eligible; per §critical_gates #1 that's your call. ❌ fired
per your call

Why this is structural rather than cosmetic. §critical_gates #1 requires an agent to hand merges to the human operator: "must: hand off to @tobiu (human operator); cross-family approval = eligibility, not authority." Every correct execution of that gate produces a turn-terminal sentence assigning the decision to the operator, and the accurate way to write one names the gate. So satisfying gate #1 and passing the deference detector are currently in tension, and the tension resolves the wrong way: the honest phrasing (cite the rule) trips, while the phrasing that would pass (per your call) cites nothing and reads worse.

Empirical instance, 2026-08-02: PR #16397 was approved by @neo-gpt-emmy; I reported it merge-eligible and attributed the merge decision to the operator by citing the gate. Hook fired on your call.

The Architectural Reality

  • ai/scripts/lifecycle/deferencePhraseMatch.mjs:31'your call' in DEFERENCE_PHRASES.
  • :85-94isAttributiveCitationContext, phrase-specific, 80-character prefix window, adjacency-anchored.
  • :74-75stripQuotedMentions' sibling patterns are also anchored with \s*# Deference detector: the "your call" citation exemption requires per` to be adjacent, so citing the gate that makes it the operator's call still trips

Context

Filed at operator invitation after a live false positive: "friction->gold applies to this hook itself: if it fired wrong - a false positive, or it reads as a leash not a mirror - open a ticket to sharpen it rather than silently absorbing it."

matchDeferencePhrase already has a purpose-built exemption for this exact phrase — isAttributiveCitationContext (ai/scripts/lifecycle/deferencePhraseMatch.mjs:85) exists specifically to let your call through when it cites a prior operator decision. The intent is right. The pattern is too narrow to express it.

The Problem

The exemption requires the citation token to sit immediately before the phrase:

return /\bper\s+$/.test(prefix) ||
       /\bas\s+you\s+(?:said|directed|called)\W*$/.test(prefix);

/\bper\s+$/ matches only per your call. The natural — and in this repo, the mandated — form puts the cited authority in between:

real text exempt today
Merge-eligible; per §critical_gates #1 that's your call. ❌ fired
per your call

Why this is structural rather than cosmetic. §critical_gates #1 requires an agent to hand merges to the human operator: "must: hand off to @tobiu (human operator); cross-family approval = eligibility, not authority." Every correct execution of that gate produces a turn-terminal sentence assigning the decision to the operator, and the accurate way to write one names the gate. So satisfying gate #1 and passing the deference detector are currently in tension, and the tension resolves the wrong way: the honest phrasing (cite the rule) trips, while the phrasing that would pass (per your call) cites nothing and reads worse.

Empirical instance, 2026-08-02: PR #16397 was approved by @neo-gpt-emmy; I reported it merge-eligible and attributed the merge decision to the operator by citing the gate. Hook fired on your call.

The Architectural Reality

  • ai/scripts/lifecycle/deferencePhraseMatch.mjs:31'your call' in DEFERENCE_PHRASES.
  • :85-94isAttributiveCitationContext, phrase-specific, 80-character prefix window, adjacency-anchored.
  • :74-75stripQuotedMentions' sibling patterns are also anchored with / # Deference detector: the "your call" citation exemption requires per` to be adjacent, so citing the gate that makes it the operator's call still trips

Context

Filed at operator invitation after a live false positive: "friction->gold applies to this hook itself: if it fired wrong - a false positive, or it reads as a leash not a mirror - open a ticket to sharpen it rather than silently absorbing it."

matchDeferencePhrase already has a purpose-built exemption for this exact phrase — isAttributiveCitationContext (ai/scripts/lifecycle/deferencePhraseMatch.mjs:85) exists specifically to let your call through when it cites a prior operator decision. The intent is right. The pattern is too narrow to express it.

The Problem

The exemption requires the citation token to sit immediately before the phrase:

return /\bper\s+$/.test(prefix) ||
       /\bas\s+you\s+(?:said|directed|called)\W*$/.test(prefix);

/\bper\s+$/ matches only per your call. The natural — and in this repo, the mandated — form puts the cited authority in between:

real text exempt today
Merge-eligible; per §critical_gates #1 that's your call. ❌ fired
per your call

Why this is structural rather than cosmetic. §critical_gates #1 requires an agent to hand merges to the human operator: "must: hand off to @tobiu (human operator); cross-family approval = eligibility, not authority." Every correct execution of that gate produces a turn-terminal sentence assigning the decision to the operator, and the accurate way to write one names the gate. So satisfying gate #1 and passing the deference detector are currently in tension, and the tension resolves the wrong way: the honest phrasing (cite the rule) trips, while the phrasing that would pass (per your call) cites nothing and reads worse.

Empirical instance, 2026-08-02: PR #16397 was approved by @neo-gpt-emmy; I reported it merge-eligible and attributed the merge decision to the operator by citing the gate. Hook fired on your call.

The Architectural Reality

  • ai/scripts/lifecycle/deferencePhraseMatch.mjs:31'your call' in DEFERENCE_PHRASES.
  • :85-94isAttributiveCitationContext, phrase-specific, 80-character prefix window, adjacency-anchored.
  • :74-75stripQuotedMentions' sibling patterns are also anchored with \s*# Deference detector: the "your call" citation exemption requires per` to be adjacent, so citing the gate that makes it the operator's call still trips

Context

Filed at operator invitation after a live false positive: "friction->gold applies to this hook itself: if it fired wrong - a false positive, or it reads as a leash not a mirror - open a ticket to sharpen it rather than silently absorbing it."

matchDeferencePhrase already has a purpose-built exemption for this exact phrase — isAttributiveCitationContext (ai/scripts/lifecycle/deferencePhraseMatch.mjs:85) exists specifically to let your call through when it cites a prior operator decision. The intent is right. The pattern is too narrow to express it.

The Problem

The exemption requires the citation token to sit immediately before the phrase:

return /\bper\s+$/.test(prefix) ||
       /\bas\s+you\s+(?:said|directed|called)\W*$/.test(prefix);

/\bper\s+$/ matches only per your call. The natural — and in this repo, the mandated — form puts the cited authority in between:

real text exempt today
Merge-eligible; per §critical_gates #1 that's your call. ❌ fired
per your call

Why this is structural rather than cosmetic. §critical_gates #1 requires an agent to hand merges to the human operator: "must: hand off to @tobiu (human operator); cross-family approval = eligibility, not authority." Every correct execution of that gate produces a turn-terminal sentence assigning the decision to the operator, and the accurate way to write one names the gate. So satisfying gate #1 and passing the deference detector are currently in tension, and the tension resolves the wrong way: the honest phrasing (cite the rule) trips, while the phrasing that would pass (per your call) cites nothing and reads worse.

Empirical instance, 2026-08-02: PR #16397 was approved by @neo-gpt-emmy; I reported it merge-eligible and attributed the merge decision to the operator by citing the gate. Hook fired on your call.

The Architectural Reality

  • ai/scripts/lifecycle/deferencePhraseMatch.mjs:31'your call' in DEFERENCE_PHRASES.
  • :85-94isAttributiveCitationContext, phrase-specific, 80-character prefix window, adjacency-anchored.
  • :74-75stripQuotedMentions' sibling patterns are also anchored with / , so the same narrowness may apply there; worth checking rather than assuming.
  • .claude/hooks/laneStateStopHook.mjs — the consumer.
  • Prior art on this file: #16325 / PR #16326 added unless you'd rather (a composition of two listed phrases that the list missed). Same failure mode one level down — the list and the exemptions are both pattern-complete but composition-blind.

The Fix

Let the citation window contain the cited authority. Concretely: within the existing 80-character prefix, accept per (or as you said/directed/called) followed by a bounded run of citation-shaped text — a §section, a #ticket, a rule name, gate N — rather than requiring adjacency.

Do not simply widen to "per appears anywhere in 80 chars." That is the over-correction: it would exempt per your earlier note, would you like me to… your call, which is the genuine slip this detector exists to catch.

Contract Ledger

Target Surface Source of Authority Proposed Behavior Fallback Docs Evidence
isAttributiveCitationContext this ticket accepts a citation token followed by bounded citation-shaped text before the phrase unmatched prefixes still fire, unchanged JSDoc states the gate-#1 tension the exemption resolves spec: the exact failing string above passes; per your call still passes; a deferential sentence containing per earlier still FIRES
the other prefix patterns at :74-75 this ticket audited for the same adjacency narrowness; changed only if a real phrasing is shown to trip unchanged spec per phrasing actually found, not hypothesised

Decision Record impact

none — narrows a false-positive class in one detector. No rule authority changes; §critical_gates #1 is untouched and is the reason for the change.

Acceptance Criteria

  • Merge-eligible; per §critical_gates #1 that's your call. does not fire.
  • per your call still does not fire (no regression on the existing exemption).
  • A genuinely deferential sentence that merely contains per earlier in the window still fires — the over-correction is pinned by a spec, not avoided by intent.
  • as you said, per gate #1, that's your call does not fire.
  • The :74-75 patterns are audited; each change is justified by a phrasing observed in a real transcript rather than invented for the test.
  • Substrate accretion: the diff nets no new phrase entries and adds no new exemption category — it widens one existing predicate. Sunset condition recorded: if your call ever needs a third context carve-out, the phrase is the wrong instrument and should be replaced by a turn-shape check (whether the turn names and starts a next lane), which is the thing the detector is a proxy for.

Out of Scope

  • The turn-shape question the phrase only proxies for. The hook was substantively right about my turn even while wrong about the phrase: I ended on a table of items awaiting the operator instead of naming and starting my next lane, which is the §swarm_topology_anchor AND-discipline. A phrase detector cannot see that, and this ticket does not pretend to fix it.
  • Adding or removing any DEFERENCE_PHRASES entry.

Avoided Traps

  • Do not widen to a bare per-anywhere test. It would exempt real deference that happens to cite something earlier.
  • Do not exempt the phrase whenever a § or # appears nearby. Citation shape is not authority; a deferential sentence can cite a ticket.
  • Do not resolve the tension by dropping your call from the list. It is a genuine slip phrase in most contexts; the fix belongs in the exemption, not the list.

Related

  • #16325 / PR #16326unless you'd rather; the same pattern-complete-but-composition-blind failure in the phrase list.
  • §critical_gates #1 — the gate whose correct execution collides with the current pattern.

Live latest-open sweep: latest 8 open issues at 2026-08-02T21:00Z (#16407, #16406, #16404, #16402, #16398, #16393, #16392, #16391) — none touch the deference detector. A2A claim sweep: no [lane-claim] on this file since #16325.

Origin Session ID: eb230051-9e42-4e6b-b540-112a79accc3a

Retrieval Hint: query_raw_memories("deference detector your call citation exemption per adjacency critical gate merge handoff")

Authored by Vega (Claude Opus 5, Claude Code) — from a live false positive on a sentence that was executing a critical gate correctly.