fix(rectification): wire unique-minute confirmation to VedAstro and sealed holdout

Keep confirmation fail-closed until the public AA set is ready, and rewrite Technique Audit from the attached VedAstro status instead of a hardcoded blocked row.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-20 10:05:35 +08:00
co-authored by Cursor
parent a93a3cc1a9
commit 55d3119c68
34 changed files with 1220 additions and 59 deletions
@@ -89,4 +89,4 @@ export function evidenceWritesAllowed(
export const MAX_RESUMABLE_CASES_PER_USER = 1;
export const RECTIFICATION_SKILL_NAME = "jyotish-birth-time-rectification";
export const RECTIFICATION_SKILL_VERSION = "10.0.5";
export const RECTIFICATION_SKILL_VERSION = "10.0.6";
@@ -10,14 +10,15 @@
import { RECTIFICATION_POLICY } from "../../rectification-policy.ts";
import { indistinguishableWidthMinutes } from "./candidate-plateau.ts";
import sealedHoldout from "../../../../../references/rectification_sealed_holdout.v1.json";
export const SEALED_MINUTE_HOLDOUT = {
sealed_benchmark_id: "minute_rectification_holdout_v2",
status: "not_ready",
valid_public_aa_cases: 1,
required_cases: 20,
top_1_rate: 0,
confirmation_coverage_rate: 0,
sealed_benchmark_id: sealedHoldout.sealed_benchmark_id,
status: sealedHoldout.status === "ready" ? "ready" : "not_ready",
valid_public_aa_cases: sealedHoldout.valid_public_aa_cases,
required_cases: sealedHoldout.required_cases,
top_1_rate: sealedHoldout.top_1_rate,
confirmation_coverage_rate: sealedHoldout.confirmation_coverage_rate,
} as const;
type GateCandidate = Readonly<{
@@ -387,6 +387,77 @@ function engineRequestBody(input: {
};
}
export type V9VedastroValidateResult = Readonly<{
status: "passed" | "failed" | "not_evaluated";
canConfirmExactMinute: false;
minuteSensitiveStatus: "passed" | "failed" | "not_evaluated";
searchEventsSupportsLocalWinner: boolean;
raw: Readonly<Record<string, unknown>>;
}>;
function vedastroValidateStatus(value: unknown): "passed" | "failed" | "not_evaluated" {
if (value === "pass" || value === "passed") return "passed";
if (value === "fail" || value === "failed") return "failed";
return "not_evaluated";
}
export function mergeVedastroValidateIntoReceipt(
receipt: Readonly<Record<string, unknown>>,
validation: V9VedastroValidateResult,
): Record<string, unknown> {
const next = { ...receipt };
const gates = record(next.gates) ? { ...record(next.gates)! } : {};
const exact = record(gates.exact_confirmation) ? { ...record(gates.exact_confirmation)! } : {};
exact.vedastro_event_validation = {
status: validation.status,
search_events_primary_supports_local_winner: validation.searchEventsSupportsLocalWinner,
};
if (
(validation.minuteSensitiveStatus === "passed" || validation.minuteSensitiveStatus === "failed")
&& (exact.external_validation_status === "not_evaluated" || exact.external_validation_status == null)
) {
exact.external_validation_status = validation.minuteSensitiveStatus;
}
gates.exact_confirmation = exact;
next.gates = gates;
next.unique_minute_claim = false;
return next;
}
export async function runV9VedastroValidate(input: {
baselineBirthSnapshot: Readonly<Record<string, unknown>>;
candidateRange: { start_time: string; end_time: string };
events: readonly V9EngineEvent[];
candidateTimes: readonly [string, string];
}): Promise<V9VedastroValidateResult> {
const unevaluated = (): V9VedastroValidateResult => ({
status: "not_evaluated",
canConfirmExactMinute: false,
minuteSensitiveStatus: "not_evaluated",
searchEventsSupportsLocalWinner: false,
raw: { status: "not_evaluated", can_confirm_exact_minute: false },
});
if (input.candidateTimes[0] === input.candidateTimes[1]) return unevaluated();
try {
const data = await postEngine(
"/api/rectification/v5/vedastro-validate",
{ ...engineRequestBody(input), candidate_times: [...input.candidateTimes] },
12_000,
);
const eventValidation = record(data.event_validation);
const minuteValidation = record(data.minute_sensitive_validation);
return {
status: vedastroValidateStatus(data.status),
canConfirmExactMinute: false,
minuteSensitiveStatus: vedastroValidateStatus(minuteValidation?.status),
searchEventsSupportsLocalWinner: eventValidation?.search_events_primary_supports_local_winner === true,
raw: data,
};
} catch {
return unevaluated();
}
}
export async function runV9CandidateScore(input: {
baselineBirthSnapshot: Readonly<Record<string, unknown>>;
candidateRange: { start_time: string; end_time: string };
@@ -14,6 +14,10 @@ import {
import { parseWindowScan } from "./rectification-agentic/v9/varga-observations";
import type { TechniqueAuditRow } from "./consultation-agent-events";
import { normalizeTechniqueAuditRows } from "./consultation-technique-audit";
import {
buildConfirmationGate,
type ConfirmationGate,
} from "./rectification-agentic/v9/confirmation-gate";
export type RectificationCandidate = Readonly<{
candidateId: string;
@@ -63,6 +67,7 @@ export type RectificationCandidateResult = Readonly<{
nakshatraBoundary: NakshatraBoundary | null;
precisionStage: PrecisionStage | null;
oosBlindPrompts: readonly OosBlindPrompt[];
confirmationGate: ConfirmationGate;
}>;
function record(value: unknown): Record<string, unknown> | null {
@@ -241,6 +246,11 @@ export function parseRectificationCandidateResult(value: unknown): Rectification
nakshatraBoundary: refinement.nakshatra_boundary,
precisionStage: refinement.precision_stage,
oosBlindPrompts: refinement.oos_blind_prompts,
confirmationGate: buildConfirmationGate({
engineConfirmationAllowed: snapshot.confirmationAllowed === true,
candidates,
decisionReceipt: receipt,
}),
};
}