@allocator-one/rcl 4.5.3 → 4.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -3
- package/dist/converge/attempt-budget.d.ts +14 -0
- package/dist/converge/attempt-budget.js +216 -1
- package/dist/converge/attempt-budget.js.map +1 -1
- package/dist/converge/historical-delivery-reconciliation-schema.d.ts +131 -0
- package/dist/converge/historical-delivery-reconciliation-schema.js +111 -0
- package/dist/converge/historical-delivery-reconciliation-schema.js.map +1 -0
- package/dist/converge/historical-delivery-reconciliation.d.ts +15 -0
- package/dist/converge/historical-delivery-reconciliation.js +326 -0
- package/dist/converge/historical-delivery-reconciliation.js.map +1 -0
- package/dist/converge/launch-guard.js +25 -6
- package/dist/converge/launch-guard.js.map +1 -1
- package/dist/converge/launch-record.d.ts +36 -0
- package/dist/converge/launch-record.js +9 -3
- package/dist/converge/launch-record.js.map +1 -1
- package/dist/converge/legacy-launch-health.d.ts +36 -0
- package/dist/converge/native-lock.d.ts +3 -1
- package/dist/converge/native-lock.js +4 -4
- package/dist/converge/native-lock.js.map +1 -1
- package/dist/converge/ordinary-pending-export.d.ts +3 -0
- package/dist/converge/ordinary-pending-export.js +64 -17
- package/dist/converge/ordinary-pending-export.js.map +1 -1
- package/dist/converge/ordinary-pending-package.d.ts +11 -0
- package/dist/converge/ordinary-pending-package.js +18 -4
- package/dist/converge/ordinary-pending-package.js.map +1 -1
- package/dist/converge/pending-finalization-receipt.d.ts +4 -0
- package/dist/converge/pending-finalization-receipt.js +102 -0
- package/dist/converge/pending-finalization-receipt.js.map +1 -0
- package/dist/converge/pending-legacy-resume.d.ts +42 -3
- package/dist/converge/pending-legacy-resume.js +164 -32
- package/dist/converge/pending-legacy-resume.js.map +1 -1
- package/dist/converge/pending-recovery-source.d.ts +114 -0
- package/dist/converge/pending-recovery-source.js +36 -1
- package/dist/converge/pending-recovery-source.js.map +1 -1
- package/dist/converge/process-identity.d.ts +51 -0
- package/dist/converge/process-identity.js +190 -0
- package/dist/converge/process-identity.js.map +1 -0
- package/dist/converge/recovery-launch.js +39 -17
- package/dist/converge/recovery-launch.js.map +1 -1
- package/dist/converge/recovery-state.d.ts +55 -0
- package/dist/converge/recovery-state.js +306 -0
- package/dist/converge/recovery-state.js.map +1 -0
- package/dist/converge/run-state.d.ts +43 -1
- package/dist/converge/run-state.js +252 -18
- package/dist/converge/run-state.js.map +1 -1
- package/dist/converge/semantic-state.d.ts +55 -0
- package/dist/converge/semantic-state.js +666 -0
- package/dist/converge/semantic-state.js.map +1 -0
- package/dist/converge/stale-report.d.ts +412 -0
- package/dist/converge/stale-report.js +42 -0
- package/dist/converge/stale-report.js.map +1 -1
- package/dist/converge/terminal-rejection.d.ts +1 -0
- package/dist/converge/terminal-rejection.js +6 -6
- package/dist/converge/terminal-rejection.js.map +1 -1
- package/dist/dispatch/async-lane.d.ts +12 -0
- package/dist/dispatch/async-lane.js +94 -0
- package/dist/dispatch/async-lane.js.map +1 -1
- package/dist/evidence/claim-recovery/validation/native-state.d.ts +22 -0
- package/dist/evidence/claim-recovery/validation/native-state.js +91 -9
- package/dist/evidence/claim-recovery/validation/native-state.js.map +1 -1
- package/dist/evidence/claim-recovery/validation/obligations.js +2 -1
- package/dist/evidence/claim-recovery/validation/obligations.js.map +1 -1
- package/dist/evidence/claim-recovery/validation/semantic-validation.d.ts +11 -0
- package/dist/evidence/claim-recovery/validation/semantic-validation.js +105 -28
- package/dist/evidence/claim-recovery/validation/semantic-validation.js.map +1 -1
- package/dist/evidence/claim-recovery/validation/types.d.ts +10 -0
- package/dist/evidence/original-run/lock-scope.d.ts +12 -6
- package/dist/evidence/original-run/lock-scope.js +12 -9
- package/dist/evidence/original-run/lock-scope.js.map +1 -1
- package/dist/index.js +74 -11
- package/dist/index.js.map +1 -1
- package/dist/telemetry/recovery/files.d.ts +4 -0
- package/dist/telemetry/recovery/files.js +15 -5
- package/dist/telemetry/recovery/files.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { link, mkdir, open, realpath, rename, rm } from 'node:fs/promises';
|
|
4
|
+
import { dirname } from 'node:path';
|
|
5
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
6
|
+
import { claimHistoryContent, sameClaimHistoryEvidence } from '../evidence/claim-recovery/carrier-inventory.js';
|
|
7
|
+
import { deriveCurrentClaimProjection } from '../evidence/claim-recovery/validation/current-projection.js';
|
|
8
|
+
import { nativeMaterial, operationOccurrences, packNativeMaterial } from '../evidence/claim-recovery/validation/native-material.js';
|
|
9
|
+
import { deriveNativeOccurrenceEvidence } from '../evidence/claim-recovery/validation/native-occurrences.js';
|
|
10
|
+
import { validateRetainedNativeEvidence, effectivePendingIdentities, recoveryAnchors, validateNativeRecoveryOperationInput, verifyNativeRecoveryLineage, MAX_NATIVE_RECOVERY_SNAPSHOT_BYTES } from '../evidence/claim-recovery/validation/native-state.js';
|
|
11
|
+
import { validateRecoveryMaterials } from '../evidence/claim-recovery/validation/materials.js';
|
|
12
|
+
import { decodeRecoveryOriginal } from '../evidence/claim-recovery/validation/recovery-json.js';
|
|
13
|
+
import { object } from '../evidence/claim-recovery/validation/primitives.js';
|
|
14
|
+
import { inspectRecoveryDirectory } from '../evidence/original-run/lock-path.js';
|
|
15
|
+
import { syncDirectory } from '../evidence/original-run/journal.js';
|
|
16
|
+
import { readStable } from '../telemetry/recovery/files.js';
|
|
17
|
+
import { assertRecoveryTargetOwnership, withOwnedNativeOperation } from './target-ownership.js';
|
|
18
|
+
import { convergeRunStatePath, loadConvergeRunStateEvidence } from './run-state.js';
|
|
19
|
+
const MAX_BYTES = 64 * 1024 * 1024;
|
|
20
|
+
export { MAX_NATIVE_RECOVERY_SNAPSHOT_BYTES };
|
|
21
|
+
const sha = (raw) => createHash('sha256').update(raw).digest('hex');
|
|
22
|
+
const requireSource = (valid) => {
|
|
23
|
+
if (!valid)
|
|
24
|
+
throw new Error('native_recovery_source_conflict');
|
|
25
|
+
};
|
|
26
|
+
function mergeMaterials(first, second) {
|
|
27
|
+
const rows = new Map();
|
|
28
|
+
for (const row of [...first, ...second]) {
|
|
29
|
+
const old = rows.get(row.sha256);
|
|
30
|
+
requireSource(!old || old.text === row.text);
|
|
31
|
+
rows.set(row.sha256, row);
|
|
32
|
+
}
|
|
33
|
+
return [...rows.values()];
|
|
34
|
+
}
|
|
35
|
+
/** Pure exact-byte preview. Effectful authority is checked by applyNativeRecovery. */
|
|
36
|
+
export function deriveNativeRecovery(input, projectionVersion = 2) {
|
|
37
|
+
try {
|
|
38
|
+
const source = verifyNativeRecoveryLineage(input.sourceJson, input.target, input.nativeSourceJsons).state;
|
|
39
|
+
validateNativeRecoveryOperationInput(input);
|
|
40
|
+
const priorOccurrences = source.recovery?.operations.flatMap(operation => {
|
|
41
|
+
const value = operationOccurrences(operation, input.recoveryMaterials ?? []);
|
|
42
|
+
return value ? [value] : [];
|
|
43
|
+
}) ?? [];
|
|
44
|
+
const occurrences = deriveNativeOccurrenceEvidence(input, {
|
|
45
|
+
target: input.target,
|
|
46
|
+
sourceJson: input.sourceJson,
|
|
47
|
+
nativeSourceJsons: input.nativeSourceJsons,
|
|
48
|
+
anchors: [...recoveryAnchors(source), ...input.anchors],
|
|
49
|
+
previous: priorOccurrences,
|
|
50
|
+
});
|
|
51
|
+
const currentProjection = input.currentHistory
|
|
52
|
+
? deriveCurrentClaimProjection(source, [...recoveryAnchors(source), ...input.anchors], [...priorOccurrences, ...(occurrences ? [occurrences] : [])], input.currentHistory, input.nativeSourceJsons, input.sourceJson, projectionVersion)
|
|
53
|
+
: undefined;
|
|
54
|
+
requireSource(!currentProjection || input.externalMaterial);
|
|
55
|
+
const packed = input.externalMaterial && (occurrences || currentProjection)
|
|
56
|
+
? packNativeMaterial({ ...(occurrences ? { occurrences } : {}), ...(currentProjection ? { currentProjection } : {}) })
|
|
57
|
+
: undefined;
|
|
58
|
+
const operation = {
|
|
59
|
+
operationId: input.operationId,
|
|
60
|
+
sourceVersion: source.version,
|
|
61
|
+
sourceSha256: sha(input.sourceJson),
|
|
62
|
+
anchors: structuredClone(input.anchors),
|
|
63
|
+
sourceReceipts: structuredClone(input.sourceReceipts),
|
|
64
|
+
...(packed ? { material: packed.reference } : occurrences ? { occurrences } : {}),
|
|
65
|
+
};
|
|
66
|
+
const materials = packed
|
|
67
|
+
? mergeMaterials(input.recoveryMaterials ?? [], packed.materials)
|
|
68
|
+
: structuredClone(input.recoveryMaterials ?? []);
|
|
69
|
+
const result = {
|
|
70
|
+
...source,
|
|
71
|
+
version: 3,
|
|
72
|
+
sightings: source.sightings ?? [],
|
|
73
|
+
recovery: {
|
|
74
|
+
version: packed || source.recovery?.version === 2 ? 2 : 1,
|
|
75
|
+
operations: [...(source.recovery?.operations ?? []), operation],
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const resultJson = `${JSON.stringify(result, null, 2)}\n`;
|
|
79
|
+
requireSource(Buffer.byteLength(resultJson) <= MAX_BYTES);
|
|
80
|
+
return {
|
|
81
|
+
...structuredClone(input),
|
|
82
|
+
...(packed ? { recoveryMaterials: materials } : {}),
|
|
83
|
+
sourceVersion: source.version,
|
|
84
|
+
sourceSha256: operation.sourceSha256,
|
|
85
|
+
resultJson,
|
|
86
|
+
resultSha256: sha(resultJson),
|
|
87
|
+
actionableIdentities: effectivePendingIdentities(result),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (error instanceof Error && error.message.startsWith('native_recovery_'))
|
|
92
|
+
throw error;
|
|
93
|
+
throw new Error('native_recovery_source_conflict', { cause: error });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function nativeRecoveryPlanProjectionVersion(plan) {
|
|
97
|
+
if (!plan.currentHistory)
|
|
98
|
+
return 2;
|
|
99
|
+
requireSource(sha(plan.resultJson) === plan.resultSha256);
|
|
100
|
+
const result = decodeState(plan.resultJson, plan.target);
|
|
101
|
+
const operation = result.recovery?.operations.at(-1);
|
|
102
|
+
requireSource(operation?.operationId === plan.operationId && operation.sourceSha256 === plan.sourceSha256 && operation.material);
|
|
103
|
+
const projection = nativeMaterial(operation.material, plan.recoveryMaterials ?? []).currentProjection;
|
|
104
|
+
requireSource(projection && isDeepStrictEqual(projection.history, plan.currentHistory));
|
|
105
|
+
return projection.version;
|
|
106
|
+
}
|
|
107
|
+
function materialPath(commonDir, target, digest) {
|
|
108
|
+
requireSource(/^[a-f0-9]{64}$/.test(digest));
|
|
109
|
+
return `${convergeRunStatePath(commonDir, target)}.recovery-materials/${digest}`;
|
|
110
|
+
}
|
|
111
|
+
function snapshotPath(commonDir, target, digest) {
|
|
112
|
+
requireSource(/^[a-f0-9]{64}$/.test(digest));
|
|
113
|
+
return `${convergeRunStatePath(commonDir, target)}.recovery-sources/${digest}.json`;
|
|
114
|
+
}
|
|
115
|
+
function reportPath(commonDir, target, digest) {
|
|
116
|
+
requireSource(/^[a-f0-9]{64}$/.test(digest));
|
|
117
|
+
return `${convergeRunStatePath(commonDir, target)}.evidence/${digest}.json`;
|
|
118
|
+
}
|
|
119
|
+
function decodeState(raw, target) {
|
|
120
|
+
const decoded = decodeRecoveryOriginal(raw, { exactNumbers: true });
|
|
121
|
+
requireSource(decoded.transformations.length === 0 && object(decoded.value));
|
|
122
|
+
const state = decoded.value;
|
|
123
|
+
requireSource([1, 2, 3].includes(state.version) && state.target === target && Array.isArray(state.rounds) && object(state.findings));
|
|
124
|
+
return state;
|
|
125
|
+
}
|
|
126
|
+
export async function readNativeRecoveryMaterials(commonDir, state) {
|
|
127
|
+
const ids = [...new Set(state.recovery?.operations.flatMap(operation => operation.material?.sha256s ?? []) ?? [])];
|
|
128
|
+
requireSource(ids.length <= 20_000);
|
|
129
|
+
const rows = [];
|
|
130
|
+
let remaining = MAX_BYTES;
|
|
131
|
+
for (const id of ids) {
|
|
132
|
+
const raw = await readStable(materialPath(commonDir, state.target, id), remaining);
|
|
133
|
+
requireSource(raw.sha256 === id);
|
|
134
|
+
remaining -= raw.raw.length;
|
|
135
|
+
requireSource(remaining >= 0);
|
|
136
|
+
rows.push({ sha256: id, text: raw.text });
|
|
137
|
+
}
|
|
138
|
+
validateRecoveryMaterials(rows);
|
|
139
|
+
return rows;
|
|
140
|
+
}
|
|
141
|
+
/** Read only canonical exact predecessors, with one aggregate pre-read budget. */
|
|
142
|
+
export async function readNativeRecoverySourceJsons(commonDir, state) {
|
|
143
|
+
const snapshots = [];
|
|
144
|
+
const seen = new Set();
|
|
145
|
+
const maximum = (state.recovery?.operations.length ?? 0) + (state.migration ? 1 : 0);
|
|
146
|
+
let remaining = MAX_NATIVE_RECOVERY_SNAPSHOT_BYTES;
|
|
147
|
+
let current = state;
|
|
148
|
+
while (current.version === 3) {
|
|
149
|
+
requireSource(snapshots.length < maximum && current.recovery?.operations.length);
|
|
150
|
+
const operation = current.recovery.operations.at(-1);
|
|
151
|
+
requireSource(/^[a-f0-9]{64}$/.test(operation.sourceSha256) && !seen.has(operation.sourceSha256));
|
|
152
|
+
seen.add(operation.sourceSha256);
|
|
153
|
+
const source = await readStable(snapshotPath(commonDir, state.target, operation.sourceSha256), remaining);
|
|
154
|
+
remaining -= source.raw.length;
|
|
155
|
+
requireSource(remaining >= 0 && source.sha256 === operation.sourceSha256);
|
|
156
|
+
snapshots.push(source.text);
|
|
157
|
+
current = decodeState(source.text, state.target);
|
|
158
|
+
}
|
|
159
|
+
if (current.version === 2 && current.migration) {
|
|
160
|
+
requireSource(snapshots.length < maximum);
|
|
161
|
+
const migration = current.migration;
|
|
162
|
+
requireSource(await realpath(migration.snapshotPath) ===
|
|
163
|
+
await realpath(`${convergeRunStatePath(commonDir, state.target)}.v1-${migration.sourceSha256}.snapshot`));
|
|
164
|
+
const source = await readStable(migration.snapshotPath, remaining);
|
|
165
|
+
requireSource(source.sha256 === migration.sourceSha256 && !seen.has(source.sha256));
|
|
166
|
+
snapshots.push(source.text);
|
|
167
|
+
}
|
|
168
|
+
return snapshots;
|
|
169
|
+
}
|
|
170
|
+
/** Validate exact retained bytes and all physical recovery reads. */
|
|
171
|
+
export async function validateNativeRecoveryState(state, commonDir, raw) {
|
|
172
|
+
try {
|
|
173
|
+
requireSource(state.version === 3);
|
|
174
|
+
const sourceRaw = raw ?? Buffer.from(`${JSON.stringify(state, null, 2)}\n`);
|
|
175
|
+
requireSource(sourceRaw.equals(Buffer.from(sourceRaw.toString('utf8'))));
|
|
176
|
+
const sources = await readNativeRecoverySourceJsons(commonDir, state);
|
|
177
|
+
const admissionSourceJsons = [];
|
|
178
|
+
let admissionSourceBytes = MAX_BYTES;
|
|
179
|
+
for (const digest of [...new Set(state.rounds.flatMap(round => round.admission ? [round.admission.sourceStateSha256] : []))]) {
|
|
180
|
+
const source = await readStable(snapshotPath(commonDir, state.target, digest), admissionSourceBytes);
|
|
181
|
+
admissionSourceBytes -= source.raw.length;
|
|
182
|
+
requireSource(admissionSourceBytes >= 0 && source.sha256 === digest);
|
|
183
|
+
admissionSourceJsons.push(source.text);
|
|
184
|
+
}
|
|
185
|
+
const materials = await readNativeRecoveryMaterials(commonDir, state);
|
|
186
|
+
const reportDigests = [...new Set([
|
|
187
|
+
...state.recovery.operations.flatMap(operation => operation.anchors.map(anchor => anchor.source.reportSha256)),
|
|
188
|
+
...state.rounds.flatMap(round => round.reportBinding ? [round.reportBinding.reportSha256] : []),
|
|
189
|
+
])];
|
|
190
|
+
let remaining = MAX_BYTES;
|
|
191
|
+
const reports = [];
|
|
192
|
+
for (const digest of reportDigests) {
|
|
193
|
+
const report = await readStable(reportPath(commonDir, state.target, digest), remaining);
|
|
194
|
+
remaining -= report.raw.length;
|
|
195
|
+
requireSource(remaining >= 0 && report.sha256 === digest);
|
|
196
|
+
reports.push(report.text);
|
|
197
|
+
}
|
|
198
|
+
validateRetainedNativeEvidence({
|
|
199
|
+
sourceJson: sourceRaw.toString('utf8'), target: state.target, reports,
|
|
200
|
+
nativeSourceJsons: sources, admissionSourceJsons, recoveryMaterials: materials,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
catch (cause) {
|
|
204
|
+
throw new Error('native_recovery_state_invalid', { cause });
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function retainRaw(path, raw) {
|
|
208
|
+
const directory = dirname(path);
|
|
209
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
210
|
+
await inspectRecoveryDirectory(directory, true);
|
|
211
|
+
await syncDirectory(dirname(directory));
|
|
212
|
+
const temporary = `${path}.${randomUUID()}.retain-tmp`;
|
|
213
|
+
let handle;
|
|
214
|
+
let created = false;
|
|
215
|
+
try {
|
|
216
|
+
handle = await open(temporary, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | (constants.O_NOFOLLOW ?? 0), 0o600);
|
|
217
|
+
created = true;
|
|
218
|
+
await handle.writeFile(raw);
|
|
219
|
+
await handle.sync();
|
|
220
|
+
await handle.close();
|
|
221
|
+
handle = undefined;
|
|
222
|
+
try {
|
|
223
|
+
await link(temporary, path);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
if (error.code !== 'EEXIST' || (await readStable(path, MAX_BYTES)).text !== raw)
|
|
227
|
+
throw error;
|
|
228
|
+
const retained = await open(path, constants.O_RDWR | (constants.O_NOFOLLOW ?? 0));
|
|
229
|
+
try {
|
|
230
|
+
await retained.sync();
|
|
231
|
+
}
|
|
232
|
+
finally {
|
|
233
|
+
await retained.close();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
await syncDirectory(directory);
|
|
237
|
+
}
|
|
238
|
+
finally {
|
|
239
|
+
try {
|
|
240
|
+
if (handle)
|
|
241
|
+
await handle.close();
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
if (created)
|
|
245
|
+
await rm(temporary, { force: true });
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/** Retain the exact pre-admission native bytes authenticated by a round report. */
|
|
250
|
+
export async function retainNativeRecoverySource(commonDir, target, raw) {
|
|
251
|
+
const digest = sha(raw);
|
|
252
|
+
await retainRaw(snapshotPath(commonDir, target, digest), raw);
|
|
253
|
+
return digest;
|
|
254
|
+
}
|
|
255
|
+
/** Exact CAS under strict target ownership; an already-applied result is not rewritten. */
|
|
256
|
+
export function applyNativeRecovery(options) {
|
|
257
|
+
const plan = structuredClone(options.plan);
|
|
258
|
+
const commonInput = options.gitCommonDir;
|
|
259
|
+
return withOwnedNativeOperation(options.ownership, commonInput, plan.target, async (ownership) => {
|
|
260
|
+
await assertRecoveryTargetOwnership(ownership, commonInput, plan.target);
|
|
261
|
+
const commonDir = await realpath(commonInput);
|
|
262
|
+
if (plan.currentHistory) {
|
|
263
|
+
requireSource(options.history && sameClaimHistoryEvidence(claimHistoryContent(options.history), plan.currentHistory) &&
|
|
264
|
+
Date.parse(plan.currentHistory.readWindow.completedAt) <= Date.parse(claimHistoryContent(options.history).readWindow.completedAt));
|
|
265
|
+
}
|
|
266
|
+
validateRecoveryMaterials(plan.recoveryMaterials ?? []);
|
|
267
|
+
const expected = deriveNativeRecovery(plan, nativeRecoveryPlanProjectionVersion(plan));
|
|
268
|
+
requireSource(plan.sourceVersion === expected.sourceVersion && plan.sourceSha256 === expected.sourceSha256 &&
|
|
269
|
+
plan.resultJson === expected.resultJson && plan.resultSha256 === expected.resultSha256 &&
|
|
270
|
+
isDeepStrictEqual(plan.actionableIdentities, expected.actionableIdentities));
|
|
271
|
+
const { assertReviewCyclePair, assertNoPendingFreshReview } = await import('./fresh-review.js');
|
|
272
|
+
await assertNoPendingFreshReview(commonDir, plan.target);
|
|
273
|
+
await assertReviewCyclePair(commonDir, plan.target, decodeState(plan.resultJson, plan.target).cycle);
|
|
274
|
+
const path = convergeRunStatePath(commonDir, plan.target);
|
|
275
|
+
await inspectRecoveryDirectory(dirname(path), true);
|
|
276
|
+
const observed = await readStable(path, MAX_BYTES);
|
|
277
|
+
const snapshot = snapshotPath(commonDir, plan.target, plan.sourceSha256);
|
|
278
|
+
if (observed.sha256 === plan.resultSha256 && observed.text === plan.resultJson) {
|
|
279
|
+
await validateNativeRecoveryState(decodeState(observed.text, plan.target), commonDir, observed.raw);
|
|
280
|
+
await retainRaw(path, plan.resultJson);
|
|
281
|
+
return { status: 'already_applied', snapshotPath: snapshot, resultSha256: plan.resultSha256 };
|
|
282
|
+
}
|
|
283
|
+
requireSource(observed.sha256 === plan.sourceSha256 && observed.text === plan.sourceJson);
|
|
284
|
+
const native = await loadConvergeRunStateEvidence(commonDir, plan.target);
|
|
285
|
+
requireSource(native?.sha256 === observed.sha256);
|
|
286
|
+
await retainRaw(snapshot, plan.sourceJson);
|
|
287
|
+
for (const report of plan.reports)
|
|
288
|
+
await retainRaw(reportPath(commonDir, plan.target, sha(report)), report);
|
|
289
|
+
for (const row of plan.recoveryMaterials ?? [])
|
|
290
|
+
await retainRaw(materialPath(commonDir, plan.target, row.sha256), row.text);
|
|
291
|
+
await validateNativeRecoveryState(decodeState(plan.resultJson, plan.target), commonDir, Buffer.from(plan.resultJson));
|
|
292
|
+
const temporary = `${path}.${randomUUID()}.recovery-tmp`;
|
|
293
|
+
try {
|
|
294
|
+
await retainRaw(temporary, plan.resultJson);
|
|
295
|
+
requireSource((await readStable(path, MAX_BYTES)).sha256 === plan.sourceSha256);
|
|
296
|
+
await rename(temporary, path);
|
|
297
|
+
await syncDirectory(dirname(path));
|
|
298
|
+
}
|
|
299
|
+
finally {
|
|
300
|
+
await rm(temporary, { force: true });
|
|
301
|
+
}
|
|
302
|
+
return { status: 'applied', snapshotPath: snapshot, resultSha256: plan.resultSha256 };
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
export { effectivePendingIdentities, recoveryAnchors, verifyNativeRecoveryLineage };
|
|
306
|
+
//# sourceMappingURL=recovery-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery-state.js","sourceRoot":"","sources":["../../src/converge/recovery-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,15 @@ import { type RejectionEntry } from './terminal-rejection-schema.js';
|
|
|
2
2
|
import { type StaleReportEntry } from './stale-report-schema.js';
|
|
3
3
|
import { type NativeTargetOwnership } from './target-ownership.js';
|
|
4
4
|
import { type RoundGapEntry } from './round-gap-schema.js';
|
|
5
|
+
import { type HistoricalDeliveryReconciliationEntry } from './historical-delivery-reconciliation-schema.js';
|
|
5
6
|
import type { ConsensusFinding } from '../consensus/types.js';
|
|
7
|
+
import type { ClaimDescriptor } from '../evidence/claim-recovery/validation/claims.js';
|
|
8
|
+
import type { NativeRecoveryMetadata, ReportBinding, RoundAdmissionSnapshot, SemanticSighting } from '../evidence/claim-recovery/validation/types.js';
|
|
9
|
+
import { type RecoveryProjectionFreshness } from '../evidence/claim-recovery/validation/current-projection.js';
|
|
6
10
|
import type { GuardedLaunchState } from './launch-guard.js';
|
|
7
11
|
import { type NativeReviewCycle } from './review-cycle.js';
|
|
12
|
+
import { verdictClearsPending } from '../evidence/claim-recovery/validation/obligations.js';
|
|
13
|
+
export { verdictClearsPending };
|
|
8
14
|
/**
|
|
9
15
|
* Per-converge-run state (RCL-24): the machine-enforced round cap and the
|
|
10
16
|
* cross-round finding ledger (identity, verdicts, suppression). Lives next
|
|
@@ -54,6 +60,8 @@ export interface FindingEntry {
|
|
|
54
60
|
* pre-2.1.1 states — the retained `severity` is frozen before new sightings.
|
|
55
61
|
*/
|
|
56
62
|
verdictSeverity?: string;
|
|
63
|
+
claimDescriptor?: ClaimDescriptor;
|
|
64
|
+
pendingRound?: number;
|
|
57
65
|
}
|
|
58
66
|
export interface RoundCounts {
|
|
59
67
|
new: number;
|
|
@@ -62,8 +70,15 @@ export interface RoundCounts {
|
|
|
62
70
|
regating: number;
|
|
63
71
|
}
|
|
64
72
|
export interface ConvergeRunState {
|
|
65
|
-
version: 1 | 2;
|
|
73
|
+
version: 1 | 2 | 3;
|
|
66
74
|
cycle?: NativeReviewCycle;
|
|
75
|
+
recovery?: NativeRecoveryMetadata;
|
|
76
|
+
sightings?: SemanticSighting[];
|
|
77
|
+
migration?: {
|
|
78
|
+
sourceSha256: string;
|
|
79
|
+
snapshotPath: string;
|
|
80
|
+
migratedAt: string;
|
|
81
|
+
};
|
|
67
82
|
target: string;
|
|
68
83
|
roundCap: number;
|
|
69
84
|
/** `runId` is the report's `run.id` (rcl ≥ 3.0), which converge-verdict sends with every verdict. */
|
|
@@ -71,6 +86,9 @@ export interface ConvergeRunState {
|
|
|
71
86
|
round: number;
|
|
72
87
|
counts: RoundCounts;
|
|
73
88
|
runId?: string;
|
|
89
|
+
reportBinding?: ReportBinding;
|
|
90
|
+
/** Immutable obligations at semantic admission, before verdict or later recovery mutation. */
|
|
91
|
+
admission?: RoundAdmissionSnapshot;
|
|
74
92
|
/** Strongest sighting per identity in this round, including for delayed verdicts. Absent in legacy state. */
|
|
75
93
|
severities?: Record<string, ConsensusFinding['severity']>;
|
|
76
94
|
}>;
|
|
@@ -82,6 +100,9 @@ export interface ConvergeRunState {
|
|
|
82
100
|
staleReportAudit?: StaleReportEntry[];
|
|
83
101
|
/** Detect accidental truncation while preserving native state as the local authority. */
|
|
84
102
|
staleReportAuditCount?: number;
|
|
103
|
+
/** Append-only authority repair for a named retained predecessor after lastLaunch advances. */
|
|
104
|
+
historicalDeliveryReconciliationAudit?: HistoricalDeliveryReconciliationEntry[];
|
|
105
|
+
historicalDeliveryReconciliationAuditCount?: number;
|
|
85
106
|
/** Additive local audit only; entries never stand for an admitted round. */
|
|
86
107
|
roundGapAudit?: {
|
|
87
108
|
version: 1;
|
|
@@ -100,6 +121,8 @@ export interface ConvergeRunState {
|
|
|
100
121
|
status: FindingStatus;
|
|
101
122
|
gating: string;
|
|
102
123
|
}>;
|
|
124
|
+
/** Pending obligations as admitted, before verdicts can clear them. */
|
|
125
|
+
actionableBeforeTriage?: string[];
|
|
103
126
|
};
|
|
104
127
|
}
|
|
105
128
|
export type FindingStatus = 'new' | 'repeat' | 'suppressed' | 'regating';
|
|
@@ -108,10 +131,15 @@ export interface AnnotatedRoundFinding {
|
|
|
108
131
|
status: FindingStatus;
|
|
109
132
|
suppressReason?: string;
|
|
110
133
|
finding: ConsensusFinding;
|
|
134
|
+
sighting?: SemanticSighting;
|
|
111
135
|
}
|
|
112
136
|
export interface RoundReport {
|
|
113
137
|
roundCap: number;
|
|
114
138
|
counts: RoundCounts;
|
|
139
|
+
actionableIdentities?: string[];
|
|
140
|
+
reportBinding?: ReportBinding;
|
|
141
|
+
classificationVersion?: 1;
|
|
142
|
+
legacyPendingIdentities?: string[];
|
|
115
143
|
findings: AnnotatedRoundFinding[];
|
|
116
144
|
}
|
|
117
145
|
export declare function convergeRunStatePath(gitCommonDir: string, target: string): string;
|
|
@@ -123,6 +151,8 @@ export declare function loadConvergeRunStateEvidence(gitCommonDir: string, targe
|
|
|
123
151
|
} | undefined>;
|
|
124
152
|
/** Persist only under live explicit target authority; started writes drain before release. */
|
|
125
153
|
export declare function writeState(gitCommonDir: string, state: ConvergeRunState, ownership: NativeTargetOwnership): Promise<void>;
|
|
154
|
+
/** Exact ordinary CAS for retained transitions under the same target lease. */
|
|
155
|
+
export declare function writeStateIfUnchanged(gitCommonDir: string, sourceSha256: string, next: ConvergeRunState, ownership: NativeTargetOwnership): Promise<'written' | 'already-written'>;
|
|
126
156
|
/** Read-only qualification for an update to an existing native state file. */
|
|
127
157
|
export declare function preflightConvergeRunStateWrite(gitCommonDir: string, state: ConvergeRunState, ownership: NativeTargetOwnership): Promise<void>;
|
|
128
158
|
export declare function loadConvergeRunState(gitCommonDir: string, target: string): Promise<ConvergeRunState | undefined>;
|
|
@@ -172,6 +202,9 @@ export interface ProcessRoundOptions {
|
|
|
172
202
|
lineWindow?: number;
|
|
173
203
|
/** The report's own run id, kept so verdicts can be bound to the round's run. */
|
|
174
204
|
runId?: string;
|
|
205
|
+
evidence?: {
|
|
206
|
+
reportJson: string;
|
|
207
|
+
};
|
|
175
208
|
reportSha256?: string;
|
|
176
209
|
cycleId?: string;
|
|
177
210
|
ownership?: NativeTargetOwnership;
|
|
@@ -192,6 +225,7 @@ export interface RoundResolution {
|
|
|
192
225
|
/** Identities recorded fixed this round (any status — every fix changes the patch). */
|
|
193
226
|
fixedThisRound: number;
|
|
194
227
|
status: 'converged-dismissal-only' | 'fixes-pending-fresh-round' | 'unresolved';
|
|
228
|
+
recoveryProjection?: RecoveryProjectionFreshness;
|
|
195
229
|
}
|
|
196
230
|
export interface RecordVerdictsResult {
|
|
197
231
|
runId?: string;
|
|
@@ -218,7 +252,15 @@ export interface RecordVerdictsOptions {
|
|
|
218
252
|
verdict: FindingVerdict;
|
|
219
253
|
reason?: string;
|
|
220
254
|
}>;
|
|
255
|
+
requireVerifiedBinding?: boolean;
|
|
221
256
|
ownership?: NativeTargetOwnership;
|
|
222
257
|
}
|
|
223
258
|
export declare function recordVerdicts(options: RecordVerdictsOptions): Promise<RecordVerdictsResult>;
|
|
224
259
|
export declare function resolveRoundResolution(state: ConvergeRunState, round: number): RoundResolution | undefined;
|
|
260
|
+
/** Pure ordinary verdict projection for retained persistence before any write. */
|
|
261
|
+
export declare function prepareVerdicts(source: ConvergeRunState, options: Omit<RecordVerdictsOptions, 'gitCommonDir' | 'ownership' | 'requireVerifiedBinding'> & {
|
|
262
|
+
recordedAt: string;
|
|
263
|
+
}): {
|
|
264
|
+
state: ConvergeRunState;
|
|
265
|
+
result: RecordVerdictsResult;
|
|
266
|
+
};
|