@remnic/core 9.7.10 → 9.7.11

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 (50) hide show
  1. package/dist/access-boundary.d.ts +1 -1
  2. package/dist/access-boundary.js +1 -1
  3. package/dist/access-cli.js +7 -7
  4. package/dist/access-http.d.ts +2 -1
  5. package/dist/access-http.js +5 -5
  6. package/dist/access-mcp.js +4 -4
  7. package/dist/access-operations-batch.js +2 -2
  8. package/dist/access-operations.d.ts +4 -4
  9. package/dist/access-operations.js +3 -3
  10. package/dist/access-schema.d.ts +64 -64
  11. package/dist/access-surface-catalog.js +2 -0
  12. package/dist/access-surface-catalog.js.map +1 -1
  13. package/dist/{chunk-N3LWQJ6Y.js → chunk-5U65RIVI.js} +294 -2
  14. package/dist/chunk-5U65RIVI.js.map +1 -0
  15. package/dist/{chunk-UZRIKUFS.js → chunk-6LM6PPDX.js} +3 -1
  16. package/dist/chunk-6LM6PPDX.js.map +1 -0
  17. package/dist/chunk-7XRUYC6G.js +1794 -0
  18. package/dist/chunk-7XRUYC6G.js.map +1 -0
  19. package/dist/{chunk-VDLMAJXS.js → chunk-GHVJASQ4.js} +2 -2
  20. package/dist/{chunk-7EX4YOKH.js → chunk-JYRFO4EH.js} +2 -2
  21. package/dist/{chunk-QVALQE4P.js → chunk-QHT4W3RU.js} +126 -8
  22. package/dist/chunk-QHT4W3RU.js.map +1 -0
  23. package/dist/{chunk-7CKS4AXY.js → chunk-W6R43NLA.js} +3 -3
  24. package/dist/cli.js +6 -6
  25. package/dist/index.d.ts +3990 -4
  26. package/dist/index.js +54 -7
  27. package/dist/orchestrator.js +7 -7
  28. package/dist/schemas.d.ts +52 -52
  29. package/dist/shared-context/manager.d.ts +8 -8
  30. package/dist/transfer/types.d.ts +66 -66
  31. package/package.json +2 -2
  32. package/src/access-boundary.ts +2 -0
  33. package/src/access-http.ts +147 -6
  34. package/src/access-mcp-cancellation.test.ts +2 -2
  35. package/src/access-operations.ts +2 -0
  36. package/src/access-surface-catalog.ts +2 -0
  37. package/src/index.ts +53 -0
  38. package/src/relay/mission-access.test.ts +379 -0
  39. package/src/relay/mission-access.ts +125 -0
  40. package/src/relay/mission-fixture.ts +301 -0
  41. package/src/relay/mission.test.ts +964 -0
  42. package/src/relay/mission.ts +1725 -0
  43. package/dist/chunk-FNJX2O6G.js +0 -467
  44. package/dist/chunk-FNJX2O6G.js.map +0 -1
  45. package/dist/chunk-N3LWQJ6Y.js.map +0 -1
  46. package/dist/chunk-QVALQE4P.js.map +0 -1
  47. package/dist/chunk-UZRIKUFS.js.map +0 -1
  48. /package/dist/{chunk-VDLMAJXS.js.map → chunk-GHVJASQ4.js.map} +0 -0
  49. /package/dist/{chunk-7EX4YOKH.js.map → chunk-JYRFO4EH.js.map} +0 -0
  50. /package/dist/{chunk-7CKS4AXY.js.map → chunk-W6R43NLA.js.map} +0 -0
@@ -0,0 +1,964 @@
1
+ import assert from "node:assert/strict";
2
+ import { chmod, link, mkdtemp, readFile, readdir, rename, rm, symlink, writeFile } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import test from "node:test";
6
+
7
+ import { RELAY_DEMO_MISSION_ID, RELAY_DEMO_NAMESPACE, createRelayMissionFixture } from "./mission-fixture.js";
8
+ import {
9
+ type RelayMissionEvent,
10
+ RelayMissionEventInputSchema,
11
+ RelayMissionEventSchema,
12
+ RelayMissionStore,
13
+ RelayMissionStoreError,
14
+ reduceRelayMission,
15
+ relayMissionReceiptDigest,
16
+ } from "./mission.js";
17
+
18
+ async function withTempRoot(run: (root: string) => Promise<void>): Promise<void> {
19
+ const root = await mkdtemp(path.join(os.tmpdir(), "remnic-relay-"));
20
+ try {
21
+ await run(root);
22
+ } finally {
23
+ await rm(root, { recursive: true, force: true });
24
+ }
25
+ }
26
+
27
+ function deterministicStore(root: string, options: { maxEvents?: number } = {}): RelayMissionStore {
28
+ let nextId = 0;
29
+ return new RelayMissionStore({
30
+ rootDir: root,
31
+ namespace: RELAY_DEMO_NAMESPACE,
32
+ now: () => new Date("2026-07-17T19:00:00.000Z"),
33
+ createEventId: () => `event-${String(++nextId).padStart(3, "0")}`,
34
+ ...options,
35
+ });
36
+ }
37
+
38
+ function fixtureEvents(): RelayMissionEvent[] {
39
+ return createRelayMissionFixture().map((input, index) =>
40
+ RelayMissionEventSchema.parse({
41
+ schemaVersion: "1",
42
+ eventId: `fixture-event-${String(index + 1).padStart(3, "0")}`,
43
+ missionId: RELAY_DEMO_MISSION_ID,
44
+ namespace: RELAY_DEMO_NAMESPACE,
45
+ recordedAt: input.occurredAt,
46
+ occurredAt: input.occurredAt,
47
+ ...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}),
48
+ payload: input.payload,
49
+ })
50
+ );
51
+ }
52
+
53
+ function liveFixtureEvents(authenticatedPrincipal: string): RelayMissionEvent[] {
54
+ return fixtureEvents().map((event) =>
55
+ RelayMissionEventSchema.parse({
56
+ ...event,
57
+ authenticatedPrincipal,
58
+ payload: {
59
+ ...event.payload,
60
+ ...(event.payload.kind === "mission_started" ? { runMode: "live" } : {}),
61
+ evidence: event.payload.evidence.map((item) => ({ ...item, capture: "at_action" })),
62
+ },
63
+ })
64
+ );
65
+ }
66
+
67
+ function firstFixtureInput() {
68
+ const [first] = createRelayMissionFixture();
69
+ if (!first) throw new Error("Relay mission fixture must contain a start event");
70
+ return first;
71
+ }
72
+
73
+ function moveEventBefore(
74
+ events: RelayMissionEvent[],
75
+ select: (event: RelayMissionEvent) => boolean,
76
+ before: (event: RelayMissionEvent) => boolean
77
+ ): RelayMissionEvent[] {
78
+ const movingIndex = events.findIndex(select);
79
+ assert.notEqual(movingIndex, -1, "moving event must exist");
80
+ const moving = events[movingIndex];
81
+ assert.ok(moving);
82
+ const remaining = events.filter((_, index) => index !== movingIndex);
83
+ const anchorIndex = remaining.findIndex(before);
84
+ assert.notEqual(anchorIndex, -1, "anchor event must exist");
85
+ return [...remaining.slice(0, anchorIndex), moving, ...remaining.slice(anchorIndex)];
86
+ }
87
+
88
+ test("fixture reduces to a complete correction and cold-start receipt", async () => {
89
+ await withTempRoot(async (root) => {
90
+ const store = deterministicStore(root);
91
+ for (const input of createRelayMissionFixture()) {
92
+ const result = await store.append(RELAY_DEMO_MISSION_ID, input);
93
+ assert.equal(result.appended, true);
94
+ assert.equal(result.replayed, false);
95
+ }
96
+
97
+ const snapshot = await store.read(RELAY_DEMO_MISSION_ID);
98
+ assert.equal(snapshot.found, true);
99
+ assert.equal(snapshot.readHealth, "ok");
100
+ assert.equal(snapshot.status, "completed");
101
+ assert.equal(snapshot.events.length, 16);
102
+ assert.deepEqual(snapshot.receipt.activeDecisionIds, ["decision-refresh-after-expiry"]);
103
+ assert.deepEqual(snapshot.receipt.supersededDecisionIds, ["decision-new-token-every-request"]);
104
+ assert.equal(snapshot.receipt.coldStartVerified, true);
105
+ assert.equal(snapshot.receipt.passingOutcomeVerified, true);
106
+ assert.deepEqual(snapshot.receipt.missingEvidence, []);
107
+ assert.equal(snapshot.receipt.complete, true);
108
+ assert.equal(snapshot.corrections[0]?.status, "propagated");
109
+ assert.equal(snapshot.corrections[0]?.appliedAt, "2026-07-17T18:00:23.000Z");
110
+ assert.equal(snapshot.agents.find((agent) => agent.agentId === "agent-orbit")?.recalls[0]?.coldStart, true);
111
+ assert.equal(
112
+ snapshot.decisions.find((item) => item.status === "superseded")?.supersededBy,
113
+ "decision-refresh-after-expiry"
114
+ );
115
+
116
+ const digest = relayMissionReceiptDigest(snapshot);
117
+ assert.match(digest, /^[a-f0-9]{64}$/);
118
+ assert.equal(digest, relayMissionReceiptDigest(await store.read(RELAY_DEMO_MISSION_ID)));
119
+
120
+ const mode = await readFile(path.join(root, "state", "relay", "missions", `${RELAY_DEMO_MISSION_ID}.jsonl`));
121
+ assert.ok(mode.length > 0);
122
+ });
123
+ });
124
+
125
+ test("live receipts reject fixture-captured evidence", () => {
126
+ const forgedLiveEvents = fixtureEvents().map((event) =>
127
+ event.payload.kind === "mission_started"
128
+ ? {
129
+ ...event,
130
+ payload: { ...event.payload, runMode: "live" as const },
131
+ }
132
+ : event
133
+ );
134
+
135
+ const snapshot = reduceRelayMission({
136
+ missionId: RELAY_DEMO_MISSION_ID,
137
+ namespace: RELAY_DEMO_NAMESPACE,
138
+ events: forgedLiveEvents,
139
+ });
140
+
141
+ assert.equal(snapshot.mission.runMode, "live");
142
+ assert.equal(snapshot.receipt.complete, false);
143
+ assert.equal(snapshot.receipt.coldStartVerified, false);
144
+ assert.equal(snapshot.receipt.passingOutcomeVerified, false);
145
+ assert.ok(snapshot.receipt.missingEvidence.includes("mission:live-fixture-evidence:fixture-event-001"));
146
+ });
147
+
148
+ test("idempotent append replays matching input and rejects conflicting input", async () => {
149
+ await withTempRoot(async (root) => {
150
+ const store = deterministicStore(root);
151
+ const [first] = createRelayMissionFixture();
152
+ assert.ok(first);
153
+ assert.equal(first.payload.kind, "mission_started");
154
+ if (first.payload.kind !== "mission_started") throw new Error("fixture contract drift");
155
+ const initial = await store.append(RELAY_DEMO_MISSION_ID, first, {
156
+ authenticatedPrincipal: "relay-operator",
157
+ });
158
+ const replay = await store.append(RELAY_DEMO_MISSION_ID, first, {
159
+ authenticatedPrincipal: "relay-operator",
160
+ });
161
+ assert.equal(replay.replayed, true);
162
+ assert.equal(replay.event.eventId, initial.event.eventId);
163
+ assert.equal(initial.event.authenticatedPrincipal, "relay-operator");
164
+
165
+ await assert.rejects(
166
+ store.append(RELAY_DEMO_MISSION_ID, first, { authenticatedPrincipal: "different-operator" }),
167
+ (error: unknown) => error instanceof RelayMissionStoreError && error.code === "idempotency_conflict"
168
+ );
169
+
170
+ await assert.rejects(
171
+ store.append(RELAY_DEMO_MISSION_ID, {
172
+ ...first,
173
+ payload: { ...first.payload, title: "Different mission" },
174
+ }),
175
+ (error: unknown) => error instanceof RelayMissionStoreError && error.code === "idempotency_conflict"
176
+ );
177
+ });
178
+ });
179
+
180
+ test("a rejected append hook does not poison the mission mutation chain", async () => {
181
+ await withTempRoot(async (root) => {
182
+ const store = deterministicStore(root);
183
+ const first = firstFixtureInput();
184
+ await assert.rejects(
185
+ store.append(RELAY_DEMO_MISSION_ID, first, {
186
+ beforeAppend: () => {
187
+ throw new Error("quota rejected");
188
+ },
189
+ }),
190
+ /quota rejected/
191
+ );
192
+ const recovered = await store.append(RELAY_DEMO_MISSION_ID, first);
193
+ assert.equal(recovered.appended, true);
194
+ });
195
+ });
196
+
197
+ test("empty, partial, and bounded reads remain distinct and deterministic", async () => {
198
+ await withTempRoot(async (root) => {
199
+ const store = deterministicStore(root);
200
+ const empty = await store.read(RELAY_DEMO_MISSION_ID);
201
+ assert.equal(empty.found, false);
202
+ assert.equal(empty.readHealth, "empty");
203
+ assert.equal(empty.status, "not_started");
204
+ assert.deepEqual(await readdir(root), []);
205
+
206
+ for (const input of createRelayMissionFixture()) {
207
+ await store.append(RELAY_DEMO_MISSION_ID, input);
208
+ }
209
+ const file = path.join(root, "state", "relay", "missions", `${RELAY_DEMO_MISSION_ID}.jsonl`);
210
+ await writeFile(file, `${await readFile(file, "utf8")}not-json\n`, { mode: 0o600 });
211
+
212
+ const partial = await store.read(RELAY_DEMO_MISSION_ID, {
213
+ since: "2026-07-17T18:00:02.000Z",
214
+ until: "2026-07-17T18:00:03.000Z",
215
+ limit: 1,
216
+ });
217
+ assert.equal(partial.readHealth, "partial");
218
+ assert.equal(partial.bounds.corruptLines, 1);
219
+ assert.equal(partial.bounds.totalEvents, 1);
220
+ assert.equal(partial.events[0]?.payload.kind, "agent_status");
221
+ assert.equal(partial.events[0]?.occurredAt, "2026-07-17T18:00:02.000Z");
222
+ assert.equal(partial.receipt.complete, false);
223
+ assert.ok(partial.receipt.missingEvidence.includes("mission:corrupt-events"));
224
+
225
+ const outsideWindow = await store.read(RELAY_DEMO_MISSION_ID, {
226
+ since: "2026-07-17T19:00:00.000Z",
227
+ limit: 1,
228
+ });
229
+ assert.equal(outsideWindow.found, true, "a known mission remains found outside the selected window");
230
+ assert.equal(outsideWindow.bounds.totalEvents, 0);
231
+ });
232
+ });
233
+
234
+ test("read serves an existing receipt without mutating a read-only mission directory", async () => {
235
+ await withTempRoot(async (root) => {
236
+ const store = deterministicStore(root);
237
+ for (const input of createRelayMissionFixture()) {
238
+ await store.append(RELAY_DEMO_MISSION_ID, input);
239
+ }
240
+ const missionDir = path.join(root, "state", "relay", "missions");
241
+ const missionFile = path.join(missionDir, `${RELAY_DEMO_MISSION_ID}.jsonl`);
242
+ const entriesBefore = (await readdir(missionDir)).sort();
243
+
244
+ await chmod(missionFile, 0o400);
245
+ await chmod(missionDir, 0o555);
246
+ try {
247
+ const snapshot = await store.read(RELAY_DEMO_MISSION_ID);
248
+ assert.equal(snapshot.receipt.complete, true);
249
+ assert.deepEqual((await readdir(missionDir)).sort(), entriesBefore);
250
+ } finally {
251
+ await chmod(missionDir, 0o700);
252
+ await chmod(missionFile, 0o600);
253
+ }
254
+ });
255
+ });
256
+
257
+ test("event contract rejects invalid identifiers, self-supersession, and mislabeled recall", () => {
258
+ const fixture = createRelayMissionFixture();
259
+ assert.throws(() => new RelayMissionStore({ rootDir: "/tmp", namespace: "" }));
260
+ assert.equal(
261
+ RelayMissionEventInputSchema.safeParse({
262
+ occurredAt: "2026-07-17T18:00:00.000Z",
263
+ payload: {
264
+ kind: "decision_superseded",
265
+ decisionId: "same",
266
+ replacementDecisionId: "same",
267
+ correctionId: "correction",
268
+ evidence: [],
269
+ },
270
+ }).success,
271
+ false
272
+ );
273
+ const recall = fixture.find((item) => item.payload.kind === "recall_observed");
274
+ assert.ok(recall && recall.payload.kind === "recall_observed");
275
+ assert.equal(
276
+ RelayMissionEventInputSchema.safeParse({
277
+ ...recall,
278
+ payload: {
279
+ ...recall.payload,
280
+ evidence: recall.payload.evidence.map((item) => ({
281
+ ...item,
282
+ capture: "historical_lookup" as const,
283
+ })),
284
+ },
285
+ }).success,
286
+ false
287
+ );
288
+ assert.equal(
289
+ RelayMissionEventInputSchema.safeParse({
290
+ ...recall,
291
+ payload: {
292
+ ...recall.payload,
293
+ evidence: recall.payload.evidence.map((item) => ({
294
+ ...item,
295
+ id: "different-recall-receipt",
296
+ })),
297
+ },
298
+ }).success,
299
+ false
300
+ );
301
+ });
302
+
303
+ test("reducer sorts equal-time events with a stable event-id tie break", () => {
304
+ const base = {
305
+ schemaVersion: "1" as const,
306
+ missionId: RELAY_DEMO_MISSION_ID,
307
+ namespace: RELAY_DEMO_NAMESPACE,
308
+ recordedAt: "2026-07-17T18:00:00.000Z",
309
+ occurredAt: "2026-07-17T18:00:00.000Z",
310
+ payload: firstFixtureInput().payload,
311
+ };
312
+ const events: RelayMissionEvent[] = [
313
+ { ...base, eventId: "event-b" },
314
+ { ...base, eventId: "event-a" },
315
+ ];
316
+ const snapshot = reduceRelayMission({
317
+ missionId: RELAY_DEMO_MISSION_ID,
318
+ namespace: RELAY_DEMO_NAMESPACE,
319
+ events,
320
+ });
321
+ assert.deepEqual(
322
+ snapshot.events.map((event) => event.eventId),
323
+ ["event-a", "event-b"]
324
+ );
325
+ });
326
+
327
+ test("reducer sorts offset timestamps by instant before applying state transitions", () => {
328
+ const base = {
329
+ schemaVersion: "1" as const,
330
+ missionId: RELAY_DEMO_MISSION_ID,
331
+ namespace: RELAY_DEMO_NAMESPACE,
332
+ recordedAt: "2026-07-17T16:00:00.000Z",
333
+ payload: firstFixtureInput().payload,
334
+ };
335
+ const events: RelayMissionEvent[] = [
336
+ { ...base, eventId: "event-later", occurredAt: "2026-07-17T10:00:00.000-05:00" },
337
+ { ...base, eventId: "event-earlier", occurredAt: "2026-07-17T14:00:00.000Z" },
338
+ ];
339
+ const snapshot = reduceRelayMission({
340
+ missionId: RELAY_DEMO_MISSION_ID,
341
+ namespace: RELAY_DEMO_NAMESPACE,
342
+ events,
343
+ });
344
+ assert.deepEqual(
345
+ snapshot.events.map((event) => event.eventId),
346
+ ["event-earlier", "event-later"]
347
+ );
348
+ });
349
+
350
+ test("time windows filter the event feed without rewriting authoritative receipt state", () => {
351
+ const snapshot = reduceRelayMission({
352
+ missionId: RELAY_DEMO_MISSION_ID,
353
+ namespace: RELAY_DEMO_NAMESPACE,
354
+ events: fixtureEvents(),
355
+ options: { since: "2026-07-17T19:00:00.000Z", limit: 1 },
356
+ });
357
+
358
+ assert.equal(snapshot.found, true);
359
+ assert.equal(snapshot.status, "completed");
360
+ assert.equal(snapshot.receipt.complete, true);
361
+ assert.equal(snapshot.bounds.totalEvents, 0);
362
+ assert.equal(snapshot.bounds.returnedEvents, 0);
363
+ assert.deepEqual(snapshot.events, []);
364
+ });
365
+
366
+ test("receipt requires an observed, decision-linked conflict and coherent mission lifecycle", () => {
367
+ const withoutConflict = reduceRelayMission({
368
+ missionId: RELAY_DEMO_MISSION_ID,
369
+ namespace: RELAY_DEMO_NAMESPACE,
370
+ events: fixtureEvents().filter((event) => event.payload.kind !== "conflict_detected"),
371
+ });
372
+ assert.equal(withoutConflict.receipt.complete, false);
373
+ assert.deepEqual(withoutConflict.conflicts, []);
374
+ assert.ok(withoutConflict.receipt.missingEvidence.includes("conflict:conflict-token-lifecycle:observation"));
375
+
376
+ const lateStart = reduceRelayMission({
377
+ missionId: RELAY_DEMO_MISSION_ID,
378
+ namespace: RELAY_DEMO_NAMESPACE,
379
+ events: fixtureEvents().map((event) =>
380
+ event.payload.kind === "mission_started" ? { ...event, occurredAt: "2026-07-17T18:00:40.000Z" } : event
381
+ ),
382
+ });
383
+ assert.equal(lateStart.status, "active");
384
+ assert.equal(lateStart.receipt.complete, false);
385
+ assert.ok(lateStart.receipt.missingEvidence.includes("mission:lifecycle-order"));
386
+ assert.ok(lateStart.receipt.missingEvidence.some((item) => item.startsWith("mission:event-before-start:")));
387
+ assert.deepEqual(lateStart.decisions, []);
388
+ assert.equal(lateStart.outcome, null);
389
+
390
+ const [start, firstEvidence, ...remainingEvents] = fixtureEvents();
391
+ assert.ok(start && firstEvidence);
392
+ const appendedBeforeStart = reduceRelayMission({
393
+ missionId: RELAY_DEMO_MISSION_ID,
394
+ namespace: RELAY_DEMO_NAMESPACE,
395
+ events: [firstEvidence, start, ...remainingEvents],
396
+ });
397
+ assert.equal(appendedBeforeStart.receipt.complete, false);
398
+ assert.ok(
399
+ appendedBeforeStart.receipt.missingEvidence.includes(`mission:event-before-start:${firstEvidence.eventId}`)
400
+ );
401
+ });
402
+
403
+ test("conflict participants must hold distinct conflicting decisions at detection time", () => {
404
+ const singleHolder = fixtureEvents().map((event) =>
405
+ event.payload.kind === "belief_observed" && event.payload.decisionId === "decision-refresh-after-expiry"
406
+ ? {
407
+ ...event,
408
+ payload: { ...event.payload, agentId: "agent-atlas" },
409
+ }
410
+ : event
411
+ );
412
+ const snapshot = reduceRelayMission({
413
+ missionId: RELAY_DEMO_MISSION_ID,
414
+ namespace: RELAY_DEMO_NAMESPACE,
415
+ events: singleHolder,
416
+ });
417
+
418
+ assert.equal(snapshot.receipt.complete, false);
419
+ assert.ok(
420
+ snapshot.receipt.missingEvidence.includes("conflict:conflict-token-lifecycle:participant:agent-nova:decision-link")
421
+ );
422
+ });
423
+
424
+ test("conflict decisions must contain genuinely distinct normalized statements", () => {
425
+ const identicalPolicies = fixtureEvents().map((event) =>
426
+ event.payload.kind === "belief_observed" && event.payload.decisionId === "decision-refresh-after-expiry"
427
+ ? {
428
+ ...event,
429
+ payload: {
430
+ ...event.payload,
431
+ statement: " MINT a new checkout token for every request and retry!!! ",
432
+ },
433
+ }
434
+ : event
435
+ );
436
+ const snapshot = reduceRelayMission({
437
+ missionId: RELAY_DEMO_MISSION_ID,
438
+ namespace: RELAY_DEMO_NAMESPACE,
439
+ events: identicalPolicies,
440
+ });
441
+
442
+ assert.equal(snapshot.receipt.complete, false);
443
+ assert.deepEqual(snapshot.receipt.supersededDecisionIds, []);
444
+ assert.equal(snapshot.conflicts[0]?.status, "open");
445
+ assert.ok(
446
+ snapshot.receipt.missingEvidence.includes("conflict:conflict-token-lifecycle:distinct-decision-statements")
447
+ );
448
+ });
449
+
450
+ test("decision identity remains bound to one normalized statement across beliefs and corrections", () => {
451
+ const events = fixtureEvents();
452
+ const replacementBeliefIndex = events.findIndex(
453
+ (event) => event.payload.kind === "belief_observed" && event.payload.decisionId === "decision-refresh-after-expiry"
454
+ );
455
+ assert.notEqual(replacementBeliefIndex, -1);
456
+ const replacementBelief = events[replacementBeliefIndex];
457
+ assert.ok(replacementBelief?.payload.kind === "belief_observed");
458
+ const reboundBelief = RelayMissionEventSchema.parse({
459
+ ...replacementBelief,
460
+ eventId: "fixture-event-rebound-policy",
461
+ payload: {
462
+ ...replacementBelief.payload,
463
+ beliefId: "belief-rebound-policy",
464
+ statement: "Mint a new checkout token for every request and retry.",
465
+ },
466
+ });
467
+ const reboundSnapshot = reduceRelayMission({
468
+ missionId: RELAY_DEMO_MISSION_ID,
469
+ namespace: RELAY_DEMO_NAMESPACE,
470
+ events: [
471
+ ...events.slice(0, replacementBeliefIndex + 1),
472
+ reboundBelief,
473
+ ...events.slice(replacementBeliefIndex + 1),
474
+ ],
475
+ });
476
+ assert.equal(reboundSnapshot.receipt.complete, false);
477
+ assert.ok(
478
+ reboundSnapshot.receipt.missingEvidence.includes("decision:decision-refresh-after-expiry:statement-consistency")
479
+ );
480
+
481
+ const contradictoryCorrection = events.map((event) =>
482
+ event.payload.kind === "correction_proposed"
483
+ ? {
484
+ ...event,
485
+ payload: {
486
+ ...event.payload,
487
+ statement: "Mint a new checkout token for every request and retry.",
488
+ },
489
+ }
490
+ : event
491
+ );
492
+ const correctionSnapshot = reduceRelayMission({
493
+ missionId: RELAY_DEMO_MISSION_ID,
494
+ namespace: RELAY_DEMO_NAMESPACE,
495
+ events: contradictoryCorrection,
496
+ });
497
+ assert.equal(correctionSnapshot.receipt.complete, false);
498
+ assert.deepEqual(correctionSnapshot.receipt.supersededDecisionIds, []);
499
+ assert.equal(correctionSnapshot.conflicts[0]?.status, "open");
500
+ assert.ok(
501
+ correctionSnapshot.receipt.missingEvidence.includes("correction:correction-token-refresh:replacement-statement")
502
+ );
503
+ });
504
+
505
+ test("a correction must account for every decision in its observed conflict", () => {
506
+ const events = fixtureEvents();
507
+ const belief = events.find((event) => event.payload.kind === "belief_observed");
508
+ assert.ok(belief && belief.payload.kind === "belief_observed");
509
+ const thirdDecision: RelayMissionEvent = RelayMissionEventSchema.parse({
510
+ ...belief,
511
+ eventId: "fixture-event-third-conflict",
512
+ recordedAt: "2026-07-17T18:00:11.000Z",
513
+ occurredAt: "2026-07-17T18:00:11.000Z",
514
+ payload: {
515
+ ...belief.payload,
516
+ beliefId: "belief-static-token",
517
+ decisionId: "decision-use-static-token",
518
+ statement: "Reuse one static token indefinitely.",
519
+ },
520
+ });
521
+ const incompleteConflict = events.map((event) =>
522
+ event.payload.kind === "conflict_detected"
523
+ ? {
524
+ ...event,
525
+ payload: {
526
+ ...event.payload,
527
+ decisionIds: [...event.payload.decisionIds, "decision-use-static-token"],
528
+ },
529
+ }
530
+ : event
531
+ );
532
+ const snapshot = reduceRelayMission({
533
+ missionId: RELAY_DEMO_MISSION_ID,
534
+ namespace: RELAY_DEMO_NAMESPACE,
535
+ events: [...incompleteConflict, thirdDecision],
536
+ });
537
+
538
+ assert.equal(snapshot.receipt.complete, false);
539
+ assert.deepEqual(snapshot.receipt.supersededDecisionIds, []);
540
+ assert.equal(snapshot.conflicts[0]?.status, "open");
541
+ assert.equal(snapshot.corrections[0]?.status, "approved");
542
+ assert.ok(snapshot.receipt.missingEvidence.includes("conflict:conflict-token-lifecycle:decision-link"));
543
+ });
544
+
545
+ test("a recovered correction must share source evidence with its observed conflict", () => {
546
+ const withoutSources = fixtureEvents().map((event) =>
547
+ RelayMissionEventSchema.parse({
548
+ ...event,
549
+ payload: {
550
+ ...event.payload,
551
+ evidence: event.payload.evidence.map((item) =>
552
+ item.kind === "source" ? { ...item, kind: "test" as const } : item
553
+ ),
554
+ },
555
+ })
556
+ );
557
+ const ungrounded = reduceRelayMission({
558
+ missionId: RELAY_DEMO_MISSION_ID,
559
+ namespace: RELAY_DEMO_NAMESPACE,
560
+ events: withoutSources,
561
+ });
562
+
563
+ assert.equal(ungrounded.receipt.complete, false);
564
+ assert.deepEqual(ungrounded.receipt.supersededDecisionIds, []);
565
+ assert.equal(ungrounded.conflicts[0]?.status, "open");
566
+ assert.ok(ungrounded.receipt.missingEvidence.includes("conflict:conflict-token-lifecycle:source"));
567
+ assert.ok(ungrounded.receipt.missingEvidence.includes("correction:correction-token-refresh:source"));
568
+ assert.ok(ungrounded.receipt.missingEvidence.includes("correction:correction-token-refresh:source-link"));
569
+
570
+ const mismatchedSource = fixtureEvents().map((event) =>
571
+ event.payload.kind === "correction_proposed"
572
+ ? RelayMissionEventSchema.parse({
573
+ ...event,
574
+ payload: {
575
+ ...event.payload,
576
+ evidence: event.payload.evidence.map((item) =>
577
+ item.kind === "source" ? { ...item, id: "source-unrelated-contract" } : item
578
+ ),
579
+ },
580
+ })
581
+ : event
582
+ );
583
+ const unlinked = reduceRelayMission({
584
+ missionId: RELAY_DEMO_MISSION_ID,
585
+ namespace: RELAY_DEMO_NAMESPACE,
586
+ events: mismatchedSource,
587
+ });
588
+ assert.equal(unlinked.receipt.complete, false);
589
+ assert.ok(unlinked.receipt.missingEvidence.includes("correction:correction-token-refresh:source-link"));
590
+ });
591
+
592
+ test("events after completion cannot rewrite the terminal mission snapshot", () => {
593
+ const events = fixtureEvents();
594
+ const proposal = events.find((event) => event.payload.kind === "correction_proposed");
595
+ assert.ok(proposal && proposal.payload.kind === "correction_proposed");
596
+ const postCompletionProposal: RelayMissionEvent = RelayMissionEventSchema.parse({
597
+ ...proposal,
598
+ eventId: "fixture-event-after-completion",
599
+ recordedAt: "2026-07-17T18:00:40.000Z",
600
+ occurredAt: "2026-07-17T18:00:40.000Z",
601
+ payload: {
602
+ ...proposal.payload,
603
+ correctionId: "correction-after-completion",
604
+ },
605
+ });
606
+ const backdatedPostCompletionProposal: RelayMissionEvent = RelayMissionEventSchema.parse({
607
+ ...proposal,
608
+ eventId: "fixture-event-backdated-after-completion",
609
+ recordedAt: "2026-07-17T18:00:41.000Z",
610
+ occurredAt: "2026-07-17T18:00:20.000Z",
611
+ payload: {
612
+ ...proposal.payload,
613
+ correctionId: "correction-backdated-after-completion",
614
+ },
615
+ });
616
+ const snapshot = reduceRelayMission({
617
+ missionId: RELAY_DEMO_MISSION_ID,
618
+ namespace: RELAY_DEMO_NAMESPACE,
619
+ events: [...events, postCompletionProposal, backdatedPostCompletionProposal],
620
+ });
621
+
622
+ assert.equal(snapshot.status, "completed");
623
+ assert.equal(snapshot.outcome?.result, "recovered");
624
+ assert.equal(snapshot.corrections.length, 1);
625
+ assert.equal(snapshot.corrections[0]?.status, "propagated");
626
+ assert.equal(snapshot.receipt.complete, false);
627
+ assert.ok(snapshot.receipt.missingEvidence.includes("mission:event-after-completion:fixture-event-after-completion"));
628
+ assert.ok(
629
+ snapshot.receipt.missingEvidence.includes("mission:event-after-completion:fixture-event-backdated-after-completion")
630
+ );
631
+ });
632
+
633
+ test("propagation requires a matching post-application recall from a cold agent session", () => {
634
+ const recallBeforeApplication = reduceRelayMission({
635
+ missionId: RELAY_DEMO_MISSION_ID,
636
+ namespace: RELAY_DEMO_NAMESPACE,
637
+ events: fixtureEvents().map((event) =>
638
+ event.payload.kind === "recall_observed" ? { ...event, occurredAt: "2026-07-17T18:00:22.000Z" } : event
639
+ ),
640
+ });
641
+ assert.equal(recallBeforeApplication.receipt.complete, false);
642
+ assert.equal(recallBeforeApplication.receipt.coldStartVerified, false);
643
+ assert.ok(recallBeforeApplication.receipt.missingEvidence.includes("recall:recall-orbit-cold:post-application"));
644
+
645
+ const warmAgent = reduceRelayMission({
646
+ missionId: RELAY_DEMO_MISSION_ID,
647
+ namespace: RELAY_DEMO_NAMESPACE,
648
+ events: fixtureEvents().map((event) => {
649
+ if (event.payload.kind !== "recall_observed" && event.payload.kind !== "propagation_verified") return event;
650
+ return {
651
+ ...event,
652
+ payload: {
653
+ ...event.payload,
654
+ agentId: "agent-atlas",
655
+ sessionId: "session-atlas",
656
+ },
657
+ };
658
+ }),
659
+ });
660
+ assert.equal(warmAgent.receipt.complete, false);
661
+ assert.equal(warmAgent.receipt.coldStartVerified, false);
662
+ assert.ok(warmAgent.receipt.missingEvidence.includes("recall:recall-orbit-cold:cold-start"));
663
+ });
664
+
665
+ test("receipt cannot apply or propagate a correction without prior approval", () => {
666
+ const events = fixtureEvents().filter((event) => event.payload.kind !== "correction_approved");
667
+ const snapshot = reduceRelayMission({
668
+ missionId: RELAY_DEMO_MISSION_ID,
669
+ namespace: RELAY_DEMO_NAMESPACE,
670
+ events,
671
+ });
672
+
673
+ assert.equal(snapshot.receipt.complete, false);
674
+ assert.equal(snapshot.receipt.coldStartVerified, false);
675
+ assert.deepEqual(snapshot.receipt.supersededDecisionIds, []);
676
+ assert.equal(
677
+ snapshot.decisions.find((decision) => decision.decisionId === "decision-new-token-every-request")?.status,
678
+ "active"
679
+ );
680
+ assert.equal(snapshot.corrections[0]?.status, "proposed");
681
+ assert.ok(snapshot.receipt.missingEvidence.includes("correction:correction-token-refresh:approval"));
682
+ });
683
+
684
+ test("receipt binds the full correction proof chain to server append order", () => {
685
+ const scenarios = [
686
+ {
687
+ name: "conflict appended before its beliefs",
688
+ events: moveEventBefore(
689
+ fixtureEvents(),
690
+ (event) => event.payload.kind === "conflict_detected",
691
+ (event) => event.payload.kind === "belief_observed"
692
+ ),
693
+ missing: "conflict:conflict-token-lifecycle:decision:decision-new-token-every-request:append-order",
694
+ },
695
+ {
696
+ name: "proposal appended before conflict",
697
+ events: moveEventBefore(
698
+ fixtureEvents(),
699
+ (event) => event.payload.kind === "correction_proposed",
700
+ (event) => event.payload.kind === "conflict_detected"
701
+ ),
702
+ missing: "correction:correction-token-refresh:conflict-append-order",
703
+ },
704
+ {
705
+ name: "approval appended after supersession",
706
+ events: moveEventBefore(
707
+ fixtureEvents(),
708
+ (event) => event.payload.kind === "decision_superseded",
709
+ (event) => event.payload.kind === "correction_approved"
710
+ ),
711
+ missing: "correction:correction-token-refresh:approval-append-order",
712
+ },
713
+ {
714
+ name: "recall appended after propagation",
715
+ events: moveEventBefore(
716
+ fixtureEvents(),
717
+ (event) => event.payload.kind === "propagation_verified",
718
+ (event) => event.payload.kind === "recall_observed"
719
+ ),
720
+ missing: "recall:recall-orbit-cold:propagation-append-order",
721
+ },
722
+ {
723
+ name: "passing test appended before propagation",
724
+ events: moveEventBefore(
725
+ fixtureEvents(),
726
+ (event) => event.payload.kind === "test_result" && event.payload.status === "passed",
727
+ (event) => event.payload.kind === "propagation_verified"
728
+ ),
729
+ missing: "outcome:passing-test",
730
+ },
731
+ ];
732
+
733
+ for (const scenario of scenarios) {
734
+ const snapshot = reduceRelayMission({
735
+ missionId: RELAY_DEMO_MISSION_ID,
736
+ namespace: RELAY_DEMO_NAMESPACE,
737
+ events: scenario.events,
738
+ });
739
+ assert.equal(snapshot.receipt.complete, false, scenario.name);
740
+ assert.ok(snapshot.receipt.missingEvidence.includes(scenario.missing), scenario.name);
741
+ }
742
+ });
743
+
744
+ test("receipt requires human approval and a passing test after verified propagation", () => {
745
+ const agentApproved = fixtureEvents().map((event) =>
746
+ event.payload.kind === "correction_approved"
747
+ ? {
748
+ ...event,
749
+ payload: {
750
+ ...event.payload,
751
+ approvedBy: { kind: "agent" as const, id: "policy-agent", label: "Policy agent" },
752
+ },
753
+ }
754
+ : event
755
+ );
756
+ const agentApprovedSnapshot = reduceRelayMission({
757
+ missionId: RELAY_DEMO_MISSION_ID,
758
+ namespace: RELAY_DEMO_NAMESPACE,
759
+ events: agentApproved,
760
+ });
761
+ assert.equal(agentApprovedSnapshot.receipt.complete, false);
762
+ assert.ok(
763
+ agentApprovedSnapshot.receipt.missingEvidence.includes("correction:correction-token-refresh:human-approval")
764
+ );
765
+
766
+ const forgedHumanEvents = liveFixtureEvents("agent-runner");
767
+ const forgedApprovalIndex = forgedHumanEvents.findIndex((event) => event.payload.kind === "correction_approved");
768
+ assert.notEqual(forgedApprovalIndex, -1);
769
+ const forgedApprovalSnapshot = reduceRelayMission({
770
+ missionId: RELAY_DEMO_MISSION_ID,
771
+ namespace: RELAY_DEMO_NAMESPACE,
772
+ events: forgedHumanEvents.slice(0, forgedApprovalIndex + 1),
773
+ });
774
+ assert.equal(forgedApprovalSnapshot.status, "awaiting_approval");
775
+ assert.equal(forgedApprovalSnapshot.corrections[0]?.status, "proposed");
776
+
777
+ const forgedHumanSnapshot = reduceRelayMission({
778
+ missionId: RELAY_DEMO_MISSION_ID,
779
+ namespace: RELAY_DEMO_NAMESPACE,
780
+ events: forgedHumanEvents,
781
+ });
782
+ assert.equal(forgedHumanSnapshot.receipt.complete, false);
783
+ assert.ok(
784
+ forgedHumanSnapshot.receipt.missingEvidence.includes(
785
+ "correction:correction-token-refresh:authenticated-human-approval"
786
+ )
787
+ );
788
+
789
+ const authenticatedHumanSnapshot = reduceRelayMission({
790
+ missionId: RELAY_DEMO_MISSION_ID,
791
+ namespace: RELAY_DEMO_NAMESPACE,
792
+ events: liveFixtureEvents("operator-build-week"),
793
+ });
794
+ assert.equal(authenticatedHumanSnapshot.receipt.complete, true);
795
+ assert.equal(authenticatedHumanSnapshot.corrections[0]?.approvalPrincipal, "operator-build-week");
796
+
797
+ const passBeforePropagation = fixtureEvents().map((event) =>
798
+ event.payload.kind === "test_result" && event.payload.status === "passed"
799
+ ? { ...event, occurredAt: "2026-07-17T18:00:11.500Z" }
800
+ : event
801
+ );
802
+ const earlyPassSnapshot = reduceRelayMission({
803
+ missionId: RELAY_DEMO_MISSION_ID,
804
+ namespace: RELAY_DEMO_NAMESPACE,
805
+ events: passBeforePropagation,
806
+ });
807
+ assert.equal(earlyPassSnapshot.receipt.complete, false);
808
+ assert.equal(earlyPassSnapshot.receipt.passingOutcomeVerified, false);
809
+ assert.ok(earlyPassSnapshot.receipt.missingEvidence.includes("outcome:passing-test"));
810
+
811
+ const unrelatedPass = fixtureEvents().map((event) =>
812
+ event.payload.kind === "test_result" && event.payload.status === "passed"
813
+ ? { ...event, payload: { ...event.payload, decisionId: "decision-unrelated" } }
814
+ : event
815
+ );
816
+ const unrelatedPassSnapshot = reduceRelayMission({
817
+ missionId: RELAY_DEMO_MISSION_ID,
818
+ namespace: RELAY_DEMO_NAMESPACE,
819
+ events: unrelatedPass,
820
+ });
821
+ assert.equal(unrelatedPassSnapshot.receipt.passingOutcomeVerified, false);
822
+ assert.ok(unrelatedPassSnapshot.receipt.missingEvidence.includes("outcome:passing-test"));
823
+
824
+ const ungroundedPass = fixtureEvents().map((event) =>
825
+ event.payload.kind === "test_result" && event.payload.status === "passed"
826
+ ? {
827
+ ...event,
828
+ payload: {
829
+ ...event.payload,
830
+ evidence: event.payload.evidence.filter((item) => item.kind !== "correction"),
831
+ },
832
+ }
833
+ : event
834
+ );
835
+ const ungroundedPassSnapshot = reduceRelayMission({
836
+ missionId: RELAY_DEMO_MISSION_ID,
837
+ namespace: RELAY_DEMO_NAMESPACE,
838
+ events: ungroundedPass,
839
+ });
840
+ assert.equal(ungroundedPassSnapshot.receipt.passingOutcomeVerified, false);
841
+ assert.ok(ungroundedPassSnapshot.receipt.missingEvidence.includes("outcome:passing-test"));
842
+
843
+ const noTestArtifact = fixtureEvents().map((event) =>
844
+ event.payload.kind === "test_result" && event.payload.status === "passed"
845
+ ? {
846
+ ...event,
847
+ payload: {
848
+ ...event.payload,
849
+ evidence: event.payload.evidence.filter((item) => item.kind !== "test"),
850
+ },
851
+ }
852
+ : event
853
+ );
854
+ const noTestArtifactSnapshot = reduceRelayMission({
855
+ missionId: RELAY_DEMO_MISSION_ID,
856
+ namespace: RELAY_DEMO_NAMESPACE,
857
+ events: noTestArtifact,
858
+ });
859
+ assert.equal(noTestArtifactSnapshot.receipt.passingOutcomeVerified, false);
860
+ assert.ok(noTestArtifactSnapshot.receipt.missingEvidence.includes("outcome:passing-test"));
861
+ });
862
+
863
+ test("missing evidence is explicit rather than conflated with a complete receipt", () => {
864
+ const input = firstFixtureInput();
865
+ assert.ok(input.occurredAt);
866
+ const event: RelayMissionEvent = {
867
+ schemaVersion: "1",
868
+ eventId: "event-no-evidence",
869
+ missionId: RELAY_DEMO_MISSION_ID,
870
+ namespace: RELAY_DEMO_NAMESPACE,
871
+ recordedAt: input.occurredAt,
872
+ occurredAt: input.occurredAt,
873
+ payload: { ...input.payload, evidence: [] },
874
+ };
875
+ const snapshot = reduceRelayMission({
876
+ missionId: RELAY_DEMO_MISSION_ID,
877
+ namespace: RELAY_DEMO_NAMESPACE,
878
+ events: [event],
879
+ });
880
+ assert.equal(snapshot.receipt.complete, false);
881
+ assert.deepEqual(snapshot.receipt.missingEvidence, ["event:event-no-evidence:evidence"]);
882
+ });
883
+
884
+ test("store rejects a symlinked Relay directory and event-count overflow", async () => {
885
+ await withTempRoot(async (root) => {
886
+ const outside = await mkdtemp(path.join(os.tmpdir(), "remnic-relay-outside-"));
887
+ try {
888
+ await symlink(outside, path.join(root, "state"));
889
+ const unsafe = deterministicStore(root);
890
+ await assert.rejects(
891
+ unsafe.read(RELAY_DEMO_MISSION_ID),
892
+ (error: unknown) => error instanceof RelayMissionStoreError && error.code === "unsafe_path"
893
+ );
894
+ } finally {
895
+ await rm(outside, { recursive: true, force: true });
896
+ }
897
+ });
898
+
899
+ await withTempRoot(async (root) => {
900
+ const bounded = deterministicStore(root, { maxEvents: 1 });
901
+ const [first, second] = createRelayMissionFixture();
902
+ assert.ok(first && second);
903
+ await bounded.append(RELAY_DEMO_MISSION_ID, first);
904
+ await assert.rejects(
905
+ bounded.append(RELAY_DEMO_MISSION_ID, second),
906
+ (error: unknown) => error instanceof RelayMissionStoreError && error.code === "limit_exceeded"
907
+ );
908
+ });
909
+ });
910
+
911
+ test("append remains pinned inside the Relay root when the missions pathname is swapped", async () => {
912
+ await withTempRoot(async (root) => {
913
+ const outside = await mkdtemp(path.join(os.tmpdir(), "remnic-relay-swap-outside-"));
914
+ const missionDir = path.join(root, "state", "relay", "missions");
915
+ const pinnedDir = path.join(root, "state", "relay", "missions-pinned");
916
+ const missionFileName = `${RELAY_DEMO_MISSION_ID}.jsonl`;
917
+ try {
918
+ const store = deterministicStore(root);
919
+ await store.append(RELAY_DEMO_MISSION_ID, firstFixtureInput(), {
920
+ beforeAppend: async () => {
921
+ await rename(missionDir, pinnedDir);
922
+ await symlink(outside, missionDir);
923
+ },
924
+ });
925
+
926
+ assert.match(await readFile(path.join(pinnedDir, missionFileName), "utf8"), /mission_started/);
927
+ await assert.rejects(
928
+ readFile(path.join(outside, missionFileName), "utf8"),
929
+ (error: unknown) => (error as NodeJS.ErrnoException).code === "ENOENT"
930
+ );
931
+ } finally {
932
+ await rm(outside, { recursive: true, force: true });
933
+ }
934
+ });
935
+ });
936
+
937
+ test("mission files reject hard links before append and read", async () => {
938
+ await withTempRoot(async (root) => {
939
+ const store = deterministicStore(root);
940
+ const outsideFile = path.join(root, "outside-mission.jsonl");
941
+ const missionFile = path.join(root, "state", "relay", "missions", `${RELAY_DEMO_MISSION_ID}.jsonl`);
942
+ await writeFile(outsideFile, "outside remains unchanged\n", { mode: 0o600 });
943
+
944
+ await assert.rejects(
945
+ store.append(RELAY_DEMO_MISSION_ID, firstFixtureInput(), {
946
+ beforeAppend: () => link(outsideFile, missionFile),
947
+ }),
948
+ (error: unknown) => error instanceof RelayMissionStoreError && error.code === "unsafe_path"
949
+ );
950
+ assert.equal(await readFile(outsideFile, "utf8"), "outside remains unchanged\n");
951
+ await assert.rejects(
952
+ store.read(RELAY_DEMO_MISSION_ID),
953
+ (error: unknown) => error instanceof RelayMissionStoreError && error.code === "unsafe_path"
954
+ );
955
+ });
956
+ });
957
+
958
+ test("mission identifiers cannot traverse the storage root", async () => {
959
+ await withTempRoot(async (root) => {
960
+ const store = deterministicStore(root);
961
+ await assert.rejects(store.read("../production"));
962
+ await assert.rejects(store.append("bad/id", firstFixtureInput()));
963
+ });
964
+ });