fix(rectification): stop a stale candidate-set prefix from hiding the choice card
Independent Staging Quality Gate / validate (push) Successful in 11m31s
Independent Staging Quality Gate / publish (push) Successful in 14m41s

Scoring scoped the contrast packet to the previous round's candidate set while
minting probes for the new one, so every later read re-prefixed the stored hash
and the persisted focus schema could never match. Mint one prefix per set and
compare splits by probe identity.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LVapmh2oGNyr6ECHKjPJY8
This commit is contained in:
Jesse_Chen
2026-08-29 08:51:19 +00:00
co-authored by Claude Opus 5
parent 0044d4f358
commit 3cecb25f42
6 changed files with 276 additions and 8 deletions
@@ -63,6 +63,7 @@ import { decideRectification, type HoldoutValidationStatus } from "../core/recti
import {
datedDomainsFromEvidence,
isStructuredDiscriminator,
isSameCandidateSplit,
mentionedVargaKeysFromLedgerEvidence,
vargaLayerCovered,
vargaLayerFromSemanticKey,
@@ -1818,7 +1819,14 @@ export function projectRectificationChoiceCard(
: null;
if (input.activeFocus?.intent !== followup.intent) return null;
if (followup.semantic_key && schemaRow?.semantic_key !== followup.semantic_key) return null;
if (followup.candidate_split_hash && schemaRow?.candidate_split_hash !== followup.candidate_split_hash) return null;
if (
followup.candidate_split_hash
&& !isSameCandidateSplit(
typeof schemaRow?.candidate_split_hash === "string" ? schemaRow.candidate_split_hash : null,
followup.candidate_split_hash,
followup.semantic_key,
)
) return null;
if (
!followup.semantic_key
&& !followup.candidate_split_hash