@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.
Files changed (75) hide show
  1. package/README.md +12 -3
  2. package/dist/converge/attempt-budget.d.ts +14 -0
  3. package/dist/converge/attempt-budget.js +216 -1
  4. package/dist/converge/attempt-budget.js.map +1 -1
  5. package/dist/converge/historical-delivery-reconciliation-schema.d.ts +131 -0
  6. package/dist/converge/historical-delivery-reconciliation-schema.js +111 -0
  7. package/dist/converge/historical-delivery-reconciliation-schema.js.map +1 -0
  8. package/dist/converge/historical-delivery-reconciliation.d.ts +15 -0
  9. package/dist/converge/historical-delivery-reconciliation.js +326 -0
  10. package/dist/converge/historical-delivery-reconciliation.js.map +1 -0
  11. package/dist/converge/launch-guard.js +25 -6
  12. package/dist/converge/launch-guard.js.map +1 -1
  13. package/dist/converge/launch-record.d.ts +36 -0
  14. package/dist/converge/launch-record.js +9 -3
  15. package/dist/converge/launch-record.js.map +1 -1
  16. package/dist/converge/legacy-launch-health.d.ts +36 -0
  17. package/dist/converge/native-lock.d.ts +3 -1
  18. package/dist/converge/native-lock.js +4 -4
  19. package/dist/converge/native-lock.js.map +1 -1
  20. package/dist/converge/ordinary-pending-export.d.ts +3 -0
  21. package/dist/converge/ordinary-pending-export.js +64 -17
  22. package/dist/converge/ordinary-pending-export.js.map +1 -1
  23. package/dist/converge/ordinary-pending-package.d.ts +11 -0
  24. package/dist/converge/ordinary-pending-package.js +18 -4
  25. package/dist/converge/ordinary-pending-package.js.map +1 -1
  26. package/dist/converge/pending-finalization-receipt.d.ts +4 -0
  27. package/dist/converge/pending-finalization-receipt.js +102 -0
  28. package/dist/converge/pending-finalization-receipt.js.map +1 -0
  29. package/dist/converge/pending-legacy-resume.d.ts +42 -3
  30. package/dist/converge/pending-legacy-resume.js +164 -32
  31. package/dist/converge/pending-legacy-resume.js.map +1 -1
  32. package/dist/converge/pending-recovery-source.d.ts +114 -0
  33. package/dist/converge/pending-recovery-source.js +36 -1
  34. package/dist/converge/pending-recovery-source.js.map +1 -1
  35. package/dist/converge/process-identity.d.ts +51 -0
  36. package/dist/converge/process-identity.js +190 -0
  37. package/dist/converge/process-identity.js.map +1 -0
  38. package/dist/converge/recovery-launch.js +39 -17
  39. package/dist/converge/recovery-launch.js.map +1 -1
  40. package/dist/converge/recovery-state.d.ts +55 -0
  41. package/dist/converge/recovery-state.js +306 -0
  42. package/dist/converge/recovery-state.js.map +1 -0
  43. package/dist/converge/run-state.d.ts +43 -1
  44. package/dist/converge/run-state.js +252 -18
  45. package/dist/converge/run-state.js.map +1 -1
  46. package/dist/converge/semantic-state.d.ts +55 -0
  47. package/dist/converge/semantic-state.js +666 -0
  48. package/dist/converge/semantic-state.js.map +1 -0
  49. package/dist/converge/stale-report.d.ts +412 -0
  50. package/dist/converge/stale-report.js +42 -0
  51. package/dist/converge/stale-report.js.map +1 -1
  52. package/dist/converge/terminal-rejection.d.ts +1 -0
  53. package/dist/converge/terminal-rejection.js +6 -6
  54. package/dist/converge/terminal-rejection.js.map +1 -1
  55. package/dist/dispatch/async-lane.d.ts +12 -0
  56. package/dist/dispatch/async-lane.js +94 -0
  57. package/dist/dispatch/async-lane.js.map +1 -1
  58. package/dist/evidence/claim-recovery/validation/native-state.d.ts +22 -0
  59. package/dist/evidence/claim-recovery/validation/native-state.js +91 -9
  60. package/dist/evidence/claim-recovery/validation/native-state.js.map +1 -1
  61. package/dist/evidence/claim-recovery/validation/obligations.js +2 -1
  62. package/dist/evidence/claim-recovery/validation/obligations.js.map +1 -1
  63. package/dist/evidence/claim-recovery/validation/semantic-validation.d.ts +11 -0
  64. package/dist/evidence/claim-recovery/validation/semantic-validation.js +105 -28
  65. package/dist/evidence/claim-recovery/validation/semantic-validation.js.map +1 -1
  66. package/dist/evidence/claim-recovery/validation/types.d.ts +10 -0
  67. package/dist/evidence/original-run/lock-scope.d.ts +12 -6
  68. package/dist/evidence/original-run/lock-scope.js +12 -9
  69. package/dist/evidence/original-run/lock-scope.js.map +1 -1
  70. package/dist/index.js +74 -11
  71. package/dist/index.js.map +1 -1
  72. package/dist/telemetry/recovery/files.d.ts +4 -0
  73. package/dist/telemetry/recovery/files.js +15 -5
  74. package/dist/telemetry/recovery/files.js.map +1 -1
  75. package/package.json +1 -1
@@ -0,0 +1,111 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ import { z } from 'zod';
3
+ import { reviewerHealthSchema, strongDeliveryReconciliationSchema } from './launch-record.js';
4
+ import { decodeRecoveryDocument } from '../evidence/original-run/decode.js';
5
+ import { serializeRecoveryDocument } from '../evidence/original-run/journal.js';
6
+ import { sha256 } from '../telemetry/recovery/files.js';
7
+ const digest = z.string().regex(/^[a-f0-9]{64}$/);
8
+ const commit = z.string().regex(/^[a-f0-9]{40}$/);
9
+ const uuid = z.string().uuid();
10
+ export const historicalServerProjectionSchema = z.object({
11
+ origin: z.string().url(),
12
+ runId: uuid,
13
+ provenance: z.literal('live'),
14
+ receivedAt: z.string().datetime({ offset: true }),
15
+ cycleId: uuid,
16
+ repoVerified: z.literal(true),
17
+ isCrossRepository: z.literal(false),
18
+ headVerified: z.string().min(1),
19
+ target: z.object({
20
+ kind: z.enum(['pr', 'patch']),
21
+ repo: z.string().min(1),
22
+ prNumber: z.number().int().positive().safe(),
23
+ headSha: commit,
24
+ baseSha: commit,
25
+ diffSha256: digest,
26
+ }).strict(),
27
+ converge: z.object({
28
+ target: z.string().min(1),
29
+ attempt: z.number().int().positive().safe(),
30
+ round: z.number().int().positive().safe(),
31
+ }).strict(),
32
+ report: z.object({
33
+ declaredSha256: digest,
34
+ declaredBytes: z.number().int().nonnegative().safe(),
35
+ stored: z.literal(true),
36
+ }).strict(),
37
+ }).strict();
38
+ export const historicalDeliveryReconciliationManifestSchema = z.object({
39
+ kind: z.literal('rcl-historical-delivery-reconciliation'),
40
+ version: z.literal(1),
41
+ operationId: uuid,
42
+ createdAt: z.string().datetime({ offset: true }),
43
+ gitCommonDir: z.string().min(1),
44
+ target: z.string().min(1),
45
+ runId: uuid,
46
+ nativeStateSha256: digest,
47
+ attemptStateSha256: digest,
48
+ sourceStaleManifestSha256s: z.array(digest).min(1).max(100).refine(values => new Set(values).size === values.length && isDeepStrictEqual(values, [...values].sort()), 'Historical stale manifest digests must be unique and sorted'),
49
+ successor: z.object({
50
+ runId: uuid,
51
+ attempt: z.number().int().positive().safe(),
52
+ round: z.number().int().positive().safe(),
53
+ headSha: commit,
54
+ inputSha256: digest,
55
+ }).strict(),
56
+ reconciliation: strongDeliveryReconciliationSchema,
57
+ baseSha: commit,
58
+ diffSha256: digest,
59
+ reviewerHealth: reviewerHealthSchema,
60
+ server: historicalServerProjectionSchema,
61
+ serverProjectionSha256: digest,
62
+ }).strict();
63
+ export const historicalDeliveryReconciliationReceiptSchema = z.object({
64
+ kind: z.literal('rcl-historical-delivery-reconciliation-receipt'),
65
+ version: z.literal(1),
66
+ operationId: uuid,
67
+ runId: uuid,
68
+ manifestSha256: digest,
69
+ beforeStateSha256: digest,
70
+ afterStateSha256: digest,
71
+ attemptStateSha256: digest,
72
+ sourceStaleManifestSha256s: z.array(digest).min(1).max(100),
73
+ serverProjectionSha256: digest,
74
+ }).strict();
75
+ const historicalDeliveryReconciliationEntrySchema = z.object({
76
+ manifestJson: z.string().max(128 * 1024), manifestSha256: digest,
77
+ }).strict();
78
+ export function historicalDeliveryManifest(entry) {
79
+ const parsedEntry = historicalDeliveryReconciliationEntrySchema.parse(entry);
80
+ if (sha256(parsedEntry.manifestJson) !== parsedEntry.manifestSha256)
81
+ throw new Error('historical_delivery_reconciliation_manifest_digest_mismatch');
82
+ const manifest = historicalDeliveryReconciliationManifestSchema.parse(decodeRecoveryDocument(parsedEntry.manifestJson));
83
+ if (parsedEntry.manifestJson !== serializeRecoveryDocument(manifest)) {
84
+ throw new Error('historical_delivery_reconciliation_manifest_noncanonical');
85
+ }
86
+ return manifest;
87
+ }
88
+ export function validateHistoricalDeliveryReconciliationAudit(value) {
89
+ const audit = value.historicalDeliveryReconciliationAudit;
90
+ if (audit === undefined) {
91
+ if (value.historicalDeliveryReconciliationAuditCount !== undefined) {
92
+ throw new Error('historical_delivery_reconciliation_audit_count_mismatch');
93
+ }
94
+ return;
95
+ }
96
+ if (!Array.isArray(audit) || audit.length === 0 || audit.length > 10_000 ||
97
+ value.historicalDeliveryReconciliationAuditCount !== audit.length) {
98
+ throw new Error('historical_delivery_reconciliation_audit_count_mismatch');
99
+ }
100
+ const operations = new Set();
101
+ const runs = new Set();
102
+ for (const entry of audit) {
103
+ const manifest = historicalDeliveryManifest(entry);
104
+ if (manifest.target !== value.target || operations.has(manifest.operationId) || runs.has(manifest.runId)) {
105
+ throw new Error('historical_delivery_reconciliation_audit_duplicate');
106
+ }
107
+ operations.add(manifest.operationId);
108
+ runs.add(manifest.runId);
109
+ }
110
+ }
111
+ //# sourceMappingURL=historical-delivery-reconciliation-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historical-delivery-reconciliation-schema.js","sourceRoot":"","sources":["../../src/converge/historical-delivery-reconciliation-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type HistoricalDeliveryReconciliationManifest } from './historical-delivery-reconciliation-schema.js';
2
+ import { type ConvergeRunState } from './run-state.js';
3
+ import { getRun } from '../evidence/reads.js';
4
+ import type { HarnessSink } from '../telemetry/sink.js';
5
+ interface HistoricalReconciliationOptions {
6
+ getRun?: typeof getRun;
7
+ now?: () => Date;
8
+ }
9
+ /** Print-only qualification; callers may write the returned reviewed manifest separately. */
10
+ export declare function previewHistoricalDeliveryReconciliation(input: unknown, gitCommonDir: string, sink: HarnessSink, options?: HistoricalReconciliationOptions): Promise<HistoricalDeliveryReconciliationManifest>;
11
+ /** Reverify every authority source under the target lock, then append one local receipt atomically. */
12
+ export declare function applyHistoricalDeliveryReconciliation(input: unknown, gitCommonDir: string, sink: HarnessSink, options?: HistoricalReconciliationOptions): Promise<'applied' | 'unchanged'>;
13
+ /** Local fail-closed verification used before claims and report admission. */
14
+ export declare function verifyHistoricalDeliveryReconciliations(common: string, state: ConvergeRunState): Promise<void>;
15
+ export {};
@@ -0,0 +1,326 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { realpath } from 'node:fs/promises';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import { isDeepStrictEqual } from 'node:util';
5
+ import { z } from 'zod';
6
+ import { convergeAttemptStatePath, validateConvergeAttemptState } from './attempt-budget.js';
7
+ import { assertNoPendingFreshReview } from './fresh-review.js';
8
+ import { historicalDeliveryManifest, historicalDeliveryReconciliationManifestSchema, historicalDeliveryReconciliationReceiptSchema, historicalServerProjectionSchema, validateHistoricalDeliveryReconciliationAudit, } from './historical-delivery-reconciliation-schema.js';
9
+ import { strongDeliveryReconciliationSchema } from './launch-record.js';
10
+ import { convergeRunStatePath, loadConvergeRunStateEvidence, writeState, } from './run-state.js';
11
+ import { inspectVerifiedStaleReportReceipts } from './stale-report.js';
12
+ import { readStaleObject, retainStaleFile as retain, selectedStaleFile as selected } from './stale-report-storage.js';
13
+ import { assertDeadOwner } from './terminal-rejection.js';
14
+ import { withRecoveryTarget } from './target-ownership.js';
15
+ import { getRun } from '../evidence/reads.js';
16
+ import { decodeRecoveryDocument } from '../evidence/original-run/decode.js';
17
+ import { serializeRecoveryDocument, syncDirectory } from '../evidence/original-run/journal.js';
18
+ import { inspectRecoveryDirectory, prepareLockRoot } from '../evidence/original-run/lock-path.js';
19
+ import { normalizeUrl } from '../telemetry/credentials.js';
20
+ import { readStable, sha256 } from '../telemetry/recovery/files.js';
21
+ const digest = z.string().regex(/^[a-f0-9]{64}$/);
22
+ const selectionSchema = z.object({
23
+ target: z.string().min(1).max(200).refine(value => value.trim() === value),
24
+ runId: z.string().uuid(),
25
+ }).strict();
26
+ const applySchema = z.object({ manifest: z.string().min(1), manifestSha256: digest }).strict();
27
+ function fail(code) { throw new Error(`historical_delivery_reconciliation_${code}`); }
28
+ function endpoint(value) {
29
+ const normalized = normalizeUrl(value);
30
+ if (!normalized)
31
+ fail('origin_invalid');
32
+ return normalized;
33
+ }
34
+ function selectedServerProjection(sink, detail, local) {
35
+ const cycle = local.state.cycle;
36
+ if (!cycle || endpoint(sink.baseUrl) !== endpoint(cycle.url))
37
+ fail('server_origin_mismatch');
38
+ const reports = detail.artifacts?.filter(artifact => artifact.kind === 'report_json') ?? [];
39
+ const report = reports[0];
40
+ if (detail.id.toLowerCase() !== local.runId.toLowerCase() || detail.provenance !== 'live' ||
41
+ detail.repo_verified !== true || detail.is_cross_repository !== false ||
42
+ typeof detail.head_verified !== 'string' || detail.head_verified.length === 0 ||
43
+ detail.cycle_id !== cycle.id || reports.length !== 1 || !report ||
44
+ report.stored !== true || report.declared_sha256 !== local.reportSha256 ||
45
+ report.declared_bytes !== local.reportBytes || detail.target.kind !== local.targetKind ||
46
+ detail.target.repo?.toLowerCase() !== cycle.repo.toLowerCase() || detail.target.pr_number !== cycle.prNumber ||
47
+ detail.target.head_sha !== local.headSha || detail.target.base_sha !== local.baseSha ||
48
+ detail.target.diff_sha256 !== local.diffSha256 ||
49
+ detail.converge?.target !== local.target || detail.converge.attempt !== local.attempt ||
50
+ detail.converge.round !== local.round || typeof detail.received_at !== 'string') {
51
+ fail('server_binding_mismatch');
52
+ }
53
+ const parsed = z.string().datetime({ offset: true }).safeParse(detail.received_at);
54
+ if (!parsed.success)
55
+ fail('server_binding_mismatch');
56
+ return historicalServerProjectionSchema.parse({
57
+ origin: endpoint(sink.baseUrl), runId: detail.id, provenance: 'live', receivedAt: detail.received_at,
58
+ cycleId: cycle.id, repoVerified: true, isCrossRepository: false,
59
+ headVerified: detail.head_verified,
60
+ target: { kind: detail.target.kind, repo: detail.target.repo, prNumber: detail.target.pr_number,
61
+ headSha: detail.target.head_sha, baseSha: detail.target.base_sha, diffSha256: detail.target.diff_sha256 },
62
+ converge: { target: detail.converge.target, attempt: detail.converge.attempt, round: detail.converge.round },
63
+ report: { declaredSha256: report.declared_sha256, declaredBytes: report.declared_bytes, stored: true },
64
+ });
65
+ }
66
+ async function readServerProjection(sink, local, options) {
67
+ const outcome = await (options.getRun ?? getRun)(sink, local.runId, { requireCompleteRead: true });
68
+ if (outcome.kind !== 'ok')
69
+ fail(`server_${outcome.kind}`);
70
+ return selectedServerProjection(sink, outcome.value, local);
71
+ }
72
+ function commonPredecessor(proofs, target, runId) {
73
+ const matches = proofs.filter((proof) => proof.m.version === 2 &&
74
+ proof.m.outcome === 'delivered-hard-failure' && proof.m.target === target &&
75
+ proof.m.runId.toLowerCase() === runId.toLowerCase());
76
+ if (matches.length === 0)
77
+ fail('predecessor_not_found');
78
+ const first = matches[0];
79
+ const launch = first.previous;
80
+ const marker = launch.deliveryReconciliation;
81
+ if (marker?.version !== 1 || launch.status !== 'completed' || launch.hardFailure !== true ||
82
+ launch.deliveryPending !== false || launch.exitCode !== 4 || !launch.reviewerHealth ||
83
+ launch.runId !== runId || launch.reportJsonSha256 !== first.m.reportSha256 ||
84
+ first.m.deliveryReconciliation.version !== 1 || !isDeepStrictEqual(first.m.deliveryReconciliation, marker)) {
85
+ fail('predecessor_ineligible');
86
+ }
87
+ const binding = {
88
+ target: first.m.target, runId: first.m.runId, reportSha256: first.m.reportSha256,
89
+ headSha: first.m.previousHeadSha, inputSha256: first.m.previousInputSha256,
90
+ attempt: first.m.attempt, round: first.m.round, cycleId: first.m.cycleId,
91
+ marker: first.m.deliveryReconciliation, reviewerHealth: first.m.reviewerHealth,
92
+ launch, evidence: first.evidence,
93
+ };
94
+ for (const proof of matches.slice(1)) {
95
+ const candidate = {
96
+ target: proof.m.target, runId: proof.m.runId, reportSha256: proof.m.reportSha256,
97
+ headSha: proof.m.previousHeadSha, inputSha256: proof.m.previousInputSha256,
98
+ attempt: proof.m.attempt, round: proof.m.round, cycleId: proof.m.cycleId,
99
+ marker: proof.m.deliveryReconciliation, reviewerHealth: proof.m.reviewerHealth,
100
+ launch: proof.previous, evidence: proof.evidence,
101
+ };
102
+ if (!isDeepStrictEqual(candidate, binding))
103
+ fail('predecessor_ambiguous');
104
+ }
105
+ return { binding, sourceDigests: matches.map(proof => proof.entry.manifestSha256).sort() };
106
+ }
107
+ async function deriveLocalAuthority(common, target, runId, state, nativeSha256, attemptFile, requireDeadOwner) {
108
+ validateHistoricalDeliveryReconciliationAudit(state);
109
+ if (!state.cycle)
110
+ fail('cycle_missing');
111
+ const attemptsPath = convergeAttemptStatePath(common, target);
112
+ const attempts = validateConvergeAttemptState(decodeRecoveryDocument(attemptFile.text), target, attemptsPath);
113
+ if (!isDeepStrictEqual(attempts.cycle, state.cycle))
114
+ fail('cycle_mismatch');
115
+ const proofs = await inspectVerifiedStaleReportReceipts(common, state.staleReportAudit ?? []);
116
+ const { binding, sourceDigests } = commonPredecessor(proofs, target, runId);
117
+ if (binding.cycleId !== state.cycle.id || !isDeepStrictEqual(binding.evidence.attempts.cycle, state.cycle)) {
118
+ fail('cycle_mismatch');
119
+ }
120
+ const claim = attempts.attempts.find(record => record.attempt === binding.attempt && record.source === 'claim');
121
+ if (!claim || claim.pid !== binding.launch.pid || binding.launch.pid !== binding.evidence.attempts.attempts
122
+ .find(record => record.attempt === binding.attempt && record.source === 'claim')?.pid)
123
+ fail('attempt_mismatch');
124
+ if (requireDeadOwner)
125
+ assertDeadOwner(binding.launch.pid);
126
+ const reportTarget = binding.evidence.report.run.target;
127
+ if (!['pr', 'patch'].includes(reportTarget.kind))
128
+ fail('retained_report_target_kind_mismatch');
129
+ if (reportTarget.repo?.toLowerCase() !== state.cycle.repo.toLowerCase())
130
+ fail('retained_report_repository_mismatch');
131
+ if (reportTarget.pr_number !== state.cycle.prNumber)
132
+ fail('retained_report_pull_request_mismatch');
133
+ if (reportTarget.head_sha !== binding.headSha)
134
+ fail('retained_report_head_mismatch');
135
+ if (!/^[a-f0-9]{40}$/.test(reportTarget.base_sha ?? ''))
136
+ fail('retained_report_base_missing');
137
+ if (!/^[a-f0-9]{64}$/.test(reportTarget.diff_sha256 ?? ''))
138
+ fail('retained_report_diff_missing');
139
+ const retainedReport = await readStaleObject(common, binding.reportSha256);
140
+ const successor = state.lastLaunch;
141
+ if (!successor?.runId || successor.status !== 'completed' || successor.attempt <= binding.attempt ||
142
+ successor.runId === binding.runId)
143
+ fail('successor_missing');
144
+ const successorClaim = attempts.attempts.find(record => record.attempt === successor.attempt && record.source === 'claim');
145
+ if (attempts.attemptsUsed !== successor.attempt || !successorClaim || successorClaim.pid !== successor.pid) {
146
+ fail('successor_attempt_mismatch');
147
+ }
148
+ const reconciliation = strongDeliveryReconciliationSchema.parse({ version: 2, runId: binding.runId,
149
+ reportJsonSha256: binding.reportSha256, headSha: binding.headSha, inputSha256: binding.inputSha256,
150
+ attempt: binding.attempt, round: binding.round, claimPid: binding.launch.pid, cycleId: state.cycle.id,
151
+ reconciledAt: '1970-01-01T00:00:00.000Z' });
152
+ return { common, target, runId, state, nativeSha256, attempts, attemptFile, attemptSha256: attemptFile.sha256,
153
+ sourceDigests, headSha: binding.headSha, reportSha256: binding.reportSha256, attempt: binding.attempt,
154
+ round: binding.round, reviewerHealth: binding.reviewerHealth, reconciliation,
155
+ targetKind: reportTarget.kind, baseSha: reportTarget.base_sha,
156
+ diffSha256: reportTarget.diff_sha256, reportBytes: retainedReport.raw.byteLength,
157
+ successor: { runId: successor.runId, attempt: successor.attempt, round: successor.round,
158
+ headSha: successor.headSha, inputSha256: successor.inputSha256 } };
159
+ }
160
+ async function localAuthority(common, target, runId) {
161
+ await assertNoPendingFreshReview(common, target);
162
+ const native = await loadConvergeRunStateEvidence(common, target);
163
+ if (!native)
164
+ fail('state_missing');
165
+ if (native.state.historicalDeliveryReconciliationAudit?.some(entry => historicalDeliveryManifest(entry).runId === runId))
166
+ fail('already_applied');
167
+ const attemptFile = await readStable(convergeAttemptStatePath(common, target));
168
+ return deriveLocalAuthority(common, target, runId, native.state, native.sha256, attemptFile, true);
169
+ }
170
+ function assertServerBinding(local, server) {
171
+ const cycle = local.state.cycle;
172
+ if (!cycle || server.origin !== endpoint(cycle.url) || server.runId.toLowerCase() !== local.runId.toLowerCase() ||
173
+ server.cycleId !== cycle.id || server.target.kind !== local.targetKind ||
174
+ server.target.repo.toLowerCase() !== cycle.repo.toLowerCase() || server.target.prNumber !== cycle.prNumber ||
175
+ server.target.headSha !== local.headSha || server.target.baseSha !== local.baseSha ||
176
+ server.target.diffSha256 !== local.diffSha256 || server.converge.target !== local.target ||
177
+ server.converge.attempt !== local.attempt || server.converge.round !== local.round ||
178
+ server.report.declaredSha256 !== local.reportSha256 || server.report.declaredBytes !== local.reportBytes) {
179
+ fail('retained_server_binding_mismatch');
180
+ }
181
+ }
182
+ function buildManifest(local, server, operationId, createdAt) {
183
+ assertServerBinding(local, server);
184
+ return historicalDeliveryReconciliationManifestSchema.parse({
185
+ kind: 'rcl-historical-delivery-reconciliation', version: 1, operationId, createdAt,
186
+ gitCommonDir: local.common, target: local.target, runId: local.runId,
187
+ nativeStateSha256: local.nativeSha256, attemptStateSha256: local.attemptSha256,
188
+ sourceStaleManifestSha256s: local.sourceDigests, successor: local.successor,
189
+ reconciliation: { ...local.reconciliation, reconciledAt: createdAt },
190
+ baseSha: server.target.baseSha, diffSha256: server.target.diffSha256,
191
+ reviewerHealth: local.reviewerHealth, server,
192
+ serverProjectionSha256: sha256(Buffer.from(serializeRecoveryDocument(server))),
193
+ });
194
+ }
195
+ /** Print-only qualification; callers may write the returned reviewed manifest separately. */
196
+ export async function previewHistoricalDeliveryReconciliation(input, gitCommonDir, sink, options = {}) {
197
+ const selection = selectionSchema.parse(input);
198
+ const common = await realpath(resolve(gitCommonDir));
199
+ const local = await localAuthority(common, selection.target, selection.runId);
200
+ const server = await readServerProjection(sink, local, options);
201
+ return buildManifest(local, server, randomUUID(), (options.now ?? (() => new Date()))().toISOString());
202
+ }
203
+ function nextState(before, entry, at) {
204
+ const { staleReportAudit, staleReportAuditCount, historicalDeliveryReconciliationAudit: audit = [], historicalDeliveryReconciliationAuditCount: _historicalCount, updatedAt: _updatedAt, ...rest } = before;
205
+ return {
206
+ ...(staleReportAudit ? { staleReportAudit } : {}), ...rest,
207
+ historicalDeliveryReconciliationAudit: [...audit, entry],
208
+ historicalDeliveryReconciliationAuditCount: audit.length + 1,
209
+ ...(staleReportAuditCount !== undefined ? { staleReportAuditCount } : {}), updatedAt: at,
210
+ };
211
+ }
212
+ function directory(common, manifest) {
213
+ return join(common, 'rcl-historical-delivery-reconciliations', manifest.operationId);
214
+ }
215
+ function receiptFor(manifest, manifestSha256, afterStateSha256) {
216
+ return historicalDeliveryReconciliationReceiptSchema.parse({
217
+ kind: 'rcl-historical-delivery-reconciliation-receipt', version: 1,
218
+ operationId: manifest.operationId, runId: manifest.runId, manifestSha256,
219
+ beforeStateSha256: manifest.nativeStateSha256, afterStateSha256,
220
+ attemptStateSha256: manifest.attemptStateSha256,
221
+ sourceStaleManifestSha256s: manifest.sourceStaleManifestSha256s,
222
+ serverProjectionSha256: manifest.serverProjectionSha256,
223
+ });
224
+ }
225
+ /** Reverify every authority source under the target lock, then append one local receipt atomically. */
226
+ export async function applyHistoricalDeliveryReconciliation(input, gitCommonDir, sink, options = {}) {
227
+ const pinned = applySchema.parse(input);
228
+ const selectedManifest = await readStable(pinned.manifest, 128 * 1024);
229
+ if (selectedManifest.sha256 !== pinned.manifestSha256)
230
+ fail('manifest_digest_mismatch');
231
+ const manifest = historicalDeliveryReconciliationManifestSchema.parse(decodeRecoveryDocument(selectedManifest.text));
232
+ if (selectedManifest.text !== serializeRecoveryDocument(manifest))
233
+ fail('manifest_noncanonical');
234
+ const common = await realpath(resolve(gitCommonDir));
235
+ if (manifest.gitCommonDir !== common)
236
+ fail('repository_mismatch');
237
+ return withRecoveryTarget(common, manifest.target, async (ownership) => {
238
+ const currentFile = await readStable(convergeRunStatePath(common, manifest.target));
239
+ const current = await loadConvergeRunStateEvidence(common, manifest.target);
240
+ if (!current || current.sha256 !== currentFile.sha256)
241
+ fail('state_missing');
242
+ validateHistoricalDeliveryReconciliationAudit(current.state);
243
+ await verifyHistoricalDeliveryReconciliations(common, current.state);
244
+ const entry = {
245
+ manifestJson: selectedManifest.text, manifestSha256: selectedManifest.sha256,
246
+ };
247
+ const prior = current.state.historicalDeliveryReconciliationAudit?.find(entry => historicalDeliveryManifest(entry).runId === manifest.runId);
248
+ if (prior) {
249
+ if (!isDeepStrictEqual(prior, entry))
250
+ fail('operation_conflict');
251
+ return 'unchanged';
252
+ }
253
+ await assertNoPendingFreshReview(common, manifest.target);
254
+ if (current.sha256 !== manifest.nativeStateSha256)
255
+ fail('state_changed');
256
+ const attemptFile = await readStable(convergeAttemptStatePath(common, manifest.target));
257
+ const local = await deriveLocalAuthority(common, manifest.target, manifest.runId, current.state, current.sha256, attemptFile, true);
258
+ const server = await readServerProjection(sink, local, options);
259
+ assertServerBinding(local, server);
260
+ const expected = buildManifest(local, server, manifest.operationId, manifest.createdAt);
261
+ if (!isDeepStrictEqual(expected, manifest))
262
+ fail('manifest_binding_mismatch');
263
+ const next = nextState(current.state, entry, manifest.createdAt);
264
+ validateHistoricalDeliveryReconciliationAudit(next);
265
+ const afterBytes = Buffer.from(serializeRecoveryDocument(next));
266
+ const serverBytes = Buffer.from(serializeRecoveryDocument(server));
267
+ if (sha256(serverBytes) !== manifest.serverProjectionSha256)
268
+ fail('server_projection_digest_mismatch');
269
+ const receipt = receiptFor(manifest, selectedManifest.sha256, sha256(afterBytes));
270
+ const dir = directory(common, manifest);
271
+ await prepareLockRoot(dirname(dir));
272
+ await syncDirectory(common);
273
+ await prepareLockRoot(dir);
274
+ await syncDirectory(dirname(dir));
275
+ await retain(join(dir, 'manifest.json'), selectedManifest.raw);
276
+ await retain(join(dir, 'native-before.json'), currentFile.raw);
277
+ await retain(join(dir, 'attempts-before.json'), attemptFile.raw);
278
+ await retain(join(dir, 'server-projection.json'), serverBytes);
279
+ await retain(join(dir, 'complete.json'), Buffer.from(serializeRecoveryDocument(receipt)));
280
+ const finalState = await selected(convergeRunStatePath(common, manifest.target), manifest.nativeStateSha256);
281
+ const finalAttempts = await selected(convergeAttemptStatePath(common, manifest.target), manifest.attemptStateSha256);
282
+ const finalLocal = await deriveLocalAuthority(common, manifest.target, manifest.runId, decodeRecoveryDocument(finalState.text), finalState.sha256, finalAttempts, true);
283
+ const finalServer = await readServerProjection(sink, finalLocal, options);
284
+ assertServerBinding(finalLocal, finalServer);
285
+ if (!isDeepStrictEqual(buildManifest(finalLocal, finalServer, manifest.operationId, manifest.createdAt), manifest)) {
286
+ fail('manifest_binding_mismatch');
287
+ }
288
+ await verifyHistoricalDeliveryReconciliations(common, next);
289
+ await writeState(common, next, ownership);
290
+ await selected(convergeRunStatePath(common, manifest.target), sha256(afterBytes));
291
+ return 'applied';
292
+ });
293
+ }
294
+ /** Local fail-closed verification used before claims and report admission. */
295
+ export async function verifyHistoricalDeliveryReconciliations(common, state) {
296
+ validateHistoricalDeliveryReconciliationAudit(state);
297
+ const audit = state.historicalDeliveryReconciliationAudit ?? [];
298
+ if (audit.length === 0)
299
+ return;
300
+ const root = join(common, 'rcl-historical-delivery-reconciliations');
301
+ await inspectRecoveryDirectory(root, true);
302
+ const prefix = [];
303
+ for (const entry of audit) {
304
+ const manifest = historicalDeliveryManifest(entry);
305
+ const dir = directory(common, manifest);
306
+ await inspectRecoveryDirectory(dir, true);
307
+ await selected(join(dir, 'manifest.json'), entry.manifestSha256);
308
+ const beforeFile = await selected(join(dir, 'native-before.json'), manifest.nativeStateSha256);
309
+ const before = decodeRecoveryDocument(beforeFile.text);
310
+ if (!isDeepStrictEqual(before.historicalDeliveryReconciliationAudit ?? [], prefix))
311
+ fail('audit_prefix');
312
+ const attemptFile = await selected(join(dir, 'attempts-before.json'), manifest.attemptStateSha256);
313
+ const serverFile = await selected(join(dir, 'server-projection.json'), manifest.serverProjectionSha256);
314
+ const server = historicalServerProjectionSchema.parse(decodeRecoveryDocument(serverFile.text));
315
+ const local = await deriveLocalAuthority(common, manifest.target, manifest.runId, before, beforeFile.sha256, attemptFile, false);
316
+ assertServerBinding(local, server);
317
+ if (!isDeepStrictEqual(buildManifest(local, server, manifest.operationId, manifest.createdAt), manifest)) {
318
+ fail('retained_source_mismatch');
319
+ }
320
+ const after = Buffer.from(serializeRecoveryDocument(nextState(before, entry, manifest.createdAt)));
321
+ const receipt = receiptFor(manifest, entry.manifestSha256, sha256(after));
322
+ await selected(join(dir, 'complete.json'), sha256(Buffer.from(serializeRecoveryDocument(receipt))));
323
+ prefix.push(entry);
324
+ }
325
+ }
326
+ //# sourceMappingURL=historical-delivery-reconciliation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historical-delivery-reconciliation.js","sourceRoot":"","sources":["../../src/converge/historical-delivery-reconciliation.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,8 @@ import { scrubText } from '../telemetry/scrub.js';
19
19
  import { verifyBoundFixRecovery } from './bound-fix-recovery.js';
20
20
  import { boundFixRecoverySourceSchema } from './bound-fix-recovery-source.js';
21
21
  import { createOriginalLaunch, encodeOriginalLaunch, remainingOriginalBudget } from '../dispatch/original-launch.js';
22
+ import { verifyCyclePendingFinalization } from './pending-finalization-receipt.js';
23
+ import { captureCurrentProcessIdentity } from './process-identity.js';
22
24
  export class ReviewLaunchRefused extends Error {
23
25
  code;
24
26
  constructor(code, message) {
@@ -120,6 +122,18 @@ async function requireLaunch(options, state, attemptsUsed) {
120
122
  return { round };
121
123
  }
122
124
  if (previous.status !== 'completed') {
125
+ if (state.cycle && ((previous.status === 'pending' && !previous.runId) || previous.pendingRecovery)) {
126
+ if (!await verifyCyclePendingFinalization(options.gitCommonDir, state, previous)) {
127
+ refuse('cycle_pending_recovery_required', 'The previous cycle dispatch is not terminal. Authenticate and finalize its pending recovery before launching a successor.');
128
+ }
129
+ if (previous.headSha === options.headSha && previous.inputSha256 === options.inputSha256) {
130
+ refuse('cycle_pending_inputs_unchanged', 'The recovered dispatch remains unknown; its successor must use materially changed exact review inputs.');
131
+ }
132
+ if (!options.retryReason) {
133
+ refuse('dispatch_unknown', 'The recovered dispatch remains spent; supply a bounded retry reason for its successor.');
134
+ }
135
+ return { round };
136
+ }
123
137
  if (!options.retryReason)
124
138
  refuse('dispatch_unknown', 'Previous dispatch is unknown; no automatic retry. Supply a bounded retry reason only after recovery.');
125
139
  return { round };
@@ -280,6 +294,9 @@ async function guardReviewLaunchOwned(options, ownership) {
280
294
  else {
281
295
  await assertNoPendingFreshReview(options.gitCommonDir, options.target);
282
296
  }
297
+ const processIdentity = process.platform === 'linux' || process.platform === 'darwin' || process.platform === 'win32'
298
+ ? await captureCurrentProcessIdentity()
299
+ : undefined;
283
300
  const claim = await claimConvergeAttempt({
284
301
  gitCommonDir: options.gitCommonDir,
285
302
  target: options.target,
@@ -290,6 +307,8 @@ async function guardReviewLaunchOwned(options, ownership) {
290
307
  try {
291
308
  state = await loadConvergeRunState(options.gitCommonDir, options.target) ?? initialConvergeRunState(options.target);
292
309
  await verifyStaleReportReceipts(options.gitCommonDir, state.staleReportAudit ?? []);
310
+ const { verifyHistoricalDeliveryReconciliations } = await import('./historical-delivery-reconciliation.js');
311
+ await verifyHistoricalDeliveryReconciliations(options.gitCommonDir, state);
293
312
  await verifyTerminalRejections(options.gitCommonDir, state);
294
313
  }
295
314
  catch (error) {
@@ -331,13 +350,12 @@ async function guardReviewLaunchOwned(options, ownership) {
331
350
  await options.originalLaunch.beforeClaim(preparedOriginal, ownership);
332
351
  assertOriginalLive();
333
352
  }
334
- // Pending-package export covers ordinary launches only. Special launch
335
- // modes keep their own recovery contract and must not inherit this
336
- // capture's size or storage requirements.
337
- const ordinaryLaunch = !options.startOver && !state.cycle && !options.originalLaunch &&
338
- !options.legacyRetry && !options.boundFixRecovery;
353
+ // Retain normal dispatch inputs, including cycle-backed launches. Bound
354
+ // original/retry recovery modes keep their own immutable input contract.
355
+ const ordinaryLaunch = !options.originalLaunch && !options.legacyRetry && !options.boundFixRecovery;
339
356
  const retained = ordinaryLaunch ? await options.beforeClaim?.(Object.freeze({ target: options.target, round,
340
- attempt: (attempts?.attemptsUsed ?? 0) + 1 }), ownership) : undefined;
357
+ attempt: (attempts?.attemptsUsed ?? 0) + 1,
358
+ ...(state.cycle ? { cycleId: state.cycle.id } : {}) }), ownership) : undefined;
341
359
  const ordinaryInputs = retained === undefined ? undefined : ordinaryLaunchInputsBindingSchema.parse(retained.ordinaryInputs);
342
360
  if (retryProof)
343
361
  await retainLegacyRetry(options.gitCommonDir, retryProof);
@@ -346,6 +364,7 @@ async function guardReviewLaunchOwned(options, ownership) {
346
364
  status: 'pending', attempt: (attempts?.attemptsUsed ?? 0) + 1, round,
347
365
  headSha: options.headSha, inputSha256: options.inputSha256,
348
366
  startedAt: new Date().toISOString(), pid: process.pid,
367
+ ...(processIdentity ? { processIdentity } : {}),
349
368
  ...(ordinaryInputs ? { ordinaryInputs } : {}),
350
369
  ...(preparedOriginal ? { retainedOriginal: { version: 1, runId: preparedOriginal.launch.runId,
351
370
  planDigest: preparedOriginal.launch.planDigest, capturedInputsSha256: preparedOriginal.launch.capturedInputsSha256 } } : {}),