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:
@@ -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,
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user