fix(rectification): stop stamping pending receipts and document aggregate blocker

Implement BUG-984 F2 option A and reproduce mixed completed identities through real tools. Stop at the required SQL authorization boundary; F1/F3/F4 remain pending.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
jesse-ux
2026-09-20 15:55:09 +08:00
co-authored by Claude Code
parent f09f3d809a
commit d575e89a83
9 changed files with 186 additions and 21 deletions
@@ -160,7 +160,6 @@ import {
readV9EngineScoringIdentity,
cachedEngineScoreIsReusable,
toEngineEvents,
v9EngineVersion,
executedMethodsFromLedger,
runV9RangeReading,
runV9BlockScan,
@@ -900,7 +899,6 @@ export function createRectificationV9ReadOnlyTools(ctx: RectificationV9Context)
export function createRectificationV9Tools(ctx: RectificationV9Context) {
const { accounting, userId, caseId, turnId, attemptId, userMessage } = ctx;
const engineVersion = v9EngineVersion();
let hasReadCase = false;
let spokenPromptFailures = 0;
let setFocusCompleted = 0;
@@ -934,7 +932,7 @@ export function createRectificationV9Tools(ctx: RectificationV9Context) {
toolName: string,
publicPhase: string,
error: unknown,
extra: { inputFingerprint?: string | null; engineVersion?: string | null } = {},
extra: { inputFingerprint?: string | null } = {},
) => {
const code = safeToolErrorCode(error);
const message = engineMessageForReceipt(error);
@@ -947,7 +945,6 @@ export function createRectificationV9Tools(ctx: RectificationV9Context) {
}));
await receipt(toolName, publicPhase, "failed", {
inputFingerprint: extra.inputFingerprint ?? null,
engineVersion: extra.engineVersion ?? null,
safeErrorCode: code,
resultFingerprint: JSON.stringify({
safe_error_code: code,
@@ -1925,7 +1922,7 @@ export function createRectificationV9Tools(ctx: RectificationV9Context) {
execute: async (input) => {
assertCaseRef(input, caseId);
const inputFingerprint = canonicalToolInputFingerprint("rectification-compare-candidates", input);
await receipt("rectification-compare-candidates", "candidates.comparing", "started", { inputFingerprint, engineVersion });
await receipt("rectification-compare-candidates", "candidates.comparing", "started", { inputFingerprint });
try {
const scored = await scoreAndPersistCurrentEvidence(input.caseId);
const latest = scored.parsed.case.stage === "block_scan"
@@ -1979,14 +1976,13 @@ export function createRectificationV9Tools(ctx: RectificationV9Context) {
vedastro_validate_ms: scored.timings.vedastro_validate_ms,
persist_ms: scored.timings.persist_ms,
}),
engineVersion: scored.persisted.algorithmVersion ?? engineVersion,
engineVersion: scored.persisted.algorithmVersion ?? null,
executedMethods: scored.score.executedMethods,
});
return { ...projection, executed_methods: scored.score.executedMethods };
} catch (error) {
await failReceipt("rectification-compare-candidates", "candidates.comparing", error, {
inputFingerprint,
engineVersion,
});
throw error;
}
@@ -2001,7 +1997,7 @@ export function createRectificationV9Tools(ctx: RectificationV9Context) {
execute: async (input) => {
assertCaseRef(input, caseId);
const inputFingerprint = canonicalToolInputFingerprint("rectification-read-diagnostics", input);
await receipt("rectification-read-diagnostics", "diagnostics.completed", "started", { inputFingerprint, engineVersion });
await receipt("rectification-read-diagnostics", "diagnostics.completed", "started", { inputFingerprint });
try {
const dossier = await loadV9CaseDossier(accounting, userId, input.caseId);
const parsed = parseDossierForTools(dossier);
@@ -2034,7 +2030,7 @@ export function createRectificationV9Tools(ctx: RectificationV9Context) {
});
return { ...projection, executed_methods: diagnostics.executedMethods };
} catch (error) {
await failReceipt("rectification-read-diagnostics", "diagnostics.completed", error, { inputFingerprint, engineVersion });
await failReceipt("rectification-read-diagnostics", "diagnostics.completed", error, { inputFingerprint });
throw error;
}
},