Review-army + adversarial findings on the scope-gate observability work,
all verified before fixing:
- Floor check: acceptance scanned the CUMULATIVE buffer while the scope-gate
exclusion scanned only the 1500-byte tail, so an early gate render satisfied
the floor vacuously once ~1.5KB of output accumulated (found independently
by 4 review passes; predicate reproduced). Acceptance now scans only content
APPENDED after the first gate render (positional anchor), and the LLM-judge
'waiting' shortcut no longer fires while the gate menu is the pending render.
- High-water flags are built once and spread at every return path — the
hand-spread pattern had already drifted (judge-waiting return omitted two
flags), which made must-stay-false asserts vacuous on those paths.
- isScopeGateAutoSelectVisible: tense-tolerant selected/selecting/selects
token (must-be-TRUE asserts shouldn't fail semantically-perfect paraphrases)
and quoted-occurrence rejection (a model verbatim-quoting the announcement
while declining must not trip must-stay-FALSE asserts). Fixtures added for
both directions.
- PlanSkillObservation outcome union gains 'wrote_findings_before_asking'
(returned at runtime via classifyVisible but missing from the type).
- trackTokens/tokensObserved: cumulative-buffer token high-water for
consumption asserts (the 2KB evidence tail is lossy and the plan-file
fallback is unreachable outside plan mode).
- New scope-gate-floor unit pins (from the ship coverage audit): both gate
render forms trip acceptance and exclusion; a genuine finding AUQ is not
excluded; tail-scoping semantics pinned.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>