@engramx/idl 0.16.0-rc.4 → 0.16.0-rc.6

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/dist/engram.did CHANGED
@@ -220,11 +220,16 @@ type Result_8 =
220
220
  Err: Error;
221
221
  Ok: nat;
222
222
  };
223
- type Result_70 =
223
+ type Result_71 =
224
224
  variant {
225
225
  Err: Error;
226
226
  Ok: AgentRecord;
227
227
  };
228
+ type Result_70 =
229
+ variant {
230
+ Err: Error;
231
+ Ok: Eip712Registration;
232
+ };
228
233
  type Result_7 =
229
234
  variant {
230
235
  Err: Error;
@@ -233,47 +238,47 @@ type Result_7 =
233
238
  type Result_69 =
234
239
  variant {
235
240
  Err: Error;
236
- Ok: Eip712Registration;
241
+ Ok: record {activatesAtNs: int;};
237
242
  };
238
243
  type Result_68 =
239
244
  variant {
240
245
  Err: Error;
241
- Ok: record {activatesAtNs: int;};
246
+ Ok: CondenseResult;
242
247
  };
243
248
  type Result_67 =
244
249
  variant {
245
250
  Err: Error;
246
- Ok: CondenseResult;
251
+ Ok: MemoryRangeExport;
247
252
  };
248
- type Result_66 =
253
+ type Result_65 =
249
254
  variant {
250
255
  Err: Error;
251
- Ok: MemoryRangeExport;
256
+ Ok: Page_21;
252
257
  };
253
258
  type Result_64 =
254
259
  variant {
255
260
  Err: Error;
256
- Ok: Page_21;
261
+ Ok: AgentWriteReview;
257
262
  };
258
263
  type Result_63 =
259
264
  variant {
260
265
  Err: Error;
261
- Ok: AgentWriteReview;
266
+ Ok: BackupMetadata;
262
267
  };
263
268
  type Result_62 =
264
269
  variant {
265
270
  Err: Error;
266
- Ok: BackupMetadata;
271
+ Ok: ChildAllowanceRow;
267
272
  };
268
273
  type Result_61 =
269
274
  variant {
270
275
  Err: Error;
271
- Ok: ChildAllowanceRow;
276
+ Ok: ChildOpening;
272
277
  };
273
278
  type Result_60 =
274
279
  variant {
275
280
  Err: Error;
276
- Ok: ChildOpening;
281
+ Ok: blob;
277
282
  };
278
283
  type Result_6 =
279
284
  variant {
@@ -283,52 +288,52 @@ type Result_6 =
283
288
  type Result_59 =
284
289
  variant {
285
290
  Err: Error;
286
- Ok: blob;
291
+ Ok: EvmAddresses;
287
292
  };
288
293
  type Result_58 =
289
294
  variant {
290
295
  Err: Error;
291
- Ok: EvmAddresses;
296
+ Ok: AlertStatus;
292
297
  };
293
298
  type Result_57 =
294
299
  variant {
295
300
  Err: Error;
296
- Ok: AlertStatus;
301
+ Ok: MemoryHistory;
297
302
  };
298
303
  type Result_56 =
299
304
  variant {
300
305
  Err: Error;
301
- Ok: MemoryHistory;
306
+ Ok: MemoryRetentionPolicy;
302
307
  };
303
308
  type Result_55 =
304
309
  variant {
305
310
  Err: Error;
306
- Ok: MemoryRetentionPolicy;
311
+ Ok: OwnerConsole;
307
312
  };
308
313
  type Result_54 =
309
314
  variant {
310
315
  Err: Error;
311
- Ok: OwnerConsole;
316
+ Ok: record {paths: vec text;};
312
317
  };
313
318
  type Result_53 =
314
319
  variant {
315
320
  Err: Error;
316
- Ok: record {paths: vec text;};
321
+ Ok: SigningFloorStatus;
317
322
  };
318
323
  type Result_52 =
319
324
  variant {
320
325
  Err: Error;
321
- Ok: SigningFloorStatus;
326
+ Ok: SpendCeiling;
322
327
  };
323
328
  type Result_51 =
324
329
  variant {
325
330
  Err: Error;
326
- Ok: SpendCeiling;
331
+ Ok: SpendingPolicy;
327
332
  };
328
333
  type Result_50 =
329
334
  variant {
330
335
  Err: Error;
331
- Ok: SpendingPolicy;
336
+ Ok: StorageReport;
332
337
  };
333
338
  type Result_5 =
334
339
  variant {
@@ -338,52 +343,52 @@ type Result_5 =
338
343
  type Result_49 =
339
344
  variant {
340
345
  Err: Error;
341
- Ok: StorageReport;
346
+ Ok: WalletBalances;
342
347
  };
343
348
  type Result_48 =
344
349
  variant {
345
350
  Err: Error;
346
- Ok: WalletBalances;
351
+ Ok: WorldIdConfig;
347
352
  };
348
353
  type Result_47 =
349
354
  variant {
350
355
  Err: Error;
351
- Ok: WorldIdConfig;
356
+ Ok: WorldIdRpContext;
352
357
  };
353
358
  type Result_46 =
354
359
  variant {
355
360
  Err: Error;
356
- Ok: WorldIdRpContext;
361
+ Ok: opt text;
357
362
  };
358
363
  type Result_45 =
359
364
  variant {
360
365
  Err: Error;
361
- Ok: opt text;
366
+ Ok: bool;
362
367
  };
363
368
  type Result_44 =
364
369
  variant {
365
370
  Err: Error;
366
- Ok: bool;
371
+ Ok: text;
367
372
  };
368
373
  type Result_43 =
369
374
  variant {
370
375
  Err: Error;
371
- Ok: text;
376
+ Ok: Page_20;
372
377
  };
373
378
  type Result_42 =
374
379
  variant {
375
380
  Err: Error;
376
- Ok: Page_20;
381
+ Ok: Page_19;
377
382
  };
378
383
  type Result_41 =
379
384
  variant {
380
385
  Err: Error;
381
- Ok: Page_19;
386
+ Ok: Page_18;
382
387
  };
383
388
  type Result_40 =
384
389
  variant {
385
390
  Err: Error;
386
- Ok: Page_18;
391
+ Ok: Page_17;
387
392
  };
388
393
  type Result_4 =
389
394
  variant {
@@ -393,52 +398,52 @@ type Result_4 =
393
398
  type Result_39 =
394
399
  variant {
395
400
  Err: Error;
396
- Ok: Page_17;
401
+ Ok: Page_16;
397
402
  };
398
403
  type Result_38 =
399
404
  variant {
400
405
  Err: Error;
401
- Ok: Page_16;
406
+ Ok: CheckpointPage;
402
407
  };
403
408
  type Result_37 =
404
409
  variant {
405
410
  Err: Error;
406
- Ok: CheckpointPage;
411
+ Ok: Page_14;
407
412
  };
408
413
  type Result_36 =
409
414
  variant {
410
415
  Err: Error;
411
- Ok: Page_14;
416
+ Ok: Page_13;
412
417
  };
413
418
  type Result_35 =
414
419
  variant {
415
420
  Err: Error;
416
- Ok: Page_13;
421
+ Ok: Page_12;
417
422
  };
418
423
  type Result_34 =
419
424
  variant {
420
425
  Err: Error;
421
- Ok: Page_12;
426
+ Ok: Page_11;
422
427
  };
423
428
  type Result_33 =
424
429
  variant {
425
430
  Err: Error;
426
- Ok: Page_11;
431
+ Ok: Page_10;
427
432
  };
428
433
  type Result_32 =
429
434
  variant {
430
435
  Err: Error;
431
- Ok: Page_10;
436
+ Ok: ReceiptPage;
432
437
  };
433
438
  type Result_31 =
434
439
  variant {
435
440
  Err: Error;
436
- Ok: ReceiptPage;
441
+ Ok: Page_8;
437
442
  };
438
443
  type Result_30 =
439
444
  variant {
440
445
  Err: Error;
441
- Ok: Page_8;
446
+ Ok: LogPage;
442
447
  };
443
448
  type Result_3 =
444
449
  variant {
@@ -448,52 +453,52 @@ type Result_3 =
448
453
  type Result_29 =
449
454
  variant {
450
455
  Err: Error;
451
- Ok: LogPage;
456
+ Ok: Page_6;
452
457
  };
453
458
  type Result_28 =
454
459
  variant {
455
460
  Err: Error;
456
- Ok: Page_6;
461
+ Ok: Page_5;
457
462
  };
458
463
  type Result_27 =
459
464
  variant {
460
465
  Err: Error;
461
- Ok: Page_5;
466
+ Ok: Page_4;
462
467
  };
463
468
  type Result_26 =
464
469
  variant {
465
470
  Err: Error;
466
- Ok: Page_4;
471
+ Ok: PaymentSignatureCounts;
467
472
  };
468
473
  type Result_25 =
469
474
  variant {
470
475
  Err: Error;
471
- Ok: PaymentSignatureCounts;
476
+ Ok: Page_2;
472
477
  };
473
478
  type Result_24 =
474
479
  variant {
475
480
  Err: Error;
476
- Ok: Page_2;
481
+ Ok: Page_1;
477
482
  };
478
483
  type Result_23 =
479
484
  variant {
480
485
  Err: Error;
481
- Ok: Page_1;
486
+ Ok: Page;
482
487
  };
483
488
  type Result_22 =
484
489
  variant {
485
490
  Err: Error;
486
- Ok: Page;
491
+ Ok: principal;
487
492
  };
488
493
  type Result_21 =
489
494
  variant {
490
495
  Err: Error;
491
- Ok: principal;
496
+ Ok: EngramSessionState;
492
497
  };
493
498
  type Result_20 =
494
499
  variant {
495
500
  Err: Error;
496
- Ok: EngramSessionState;
501
+ Ok: Pairing;
497
502
  };
498
503
  type Result_2 =
499
504
  variant {
@@ -503,22 +508,22 @@ type Result_2 =
503
508
  type Result_19 =
504
509
  variant {
505
510
  Err: Error;
506
- Ok: Pairing;
511
+ Ok: CondensePreview;
507
512
  };
508
513
  type Result_18 =
509
514
  variant {
510
515
  Err: Error;
511
- Ok: CondensePreview;
516
+ Ok: vec BatchReadItem;
512
517
  };
513
518
  type Result_17 =
514
519
  variant {
515
520
  Err: Error;
516
- Ok: vec BatchReadItem;
521
+ Ok: MemoryByteChunk;
517
522
  };
518
523
  type Result_16 =
519
524
  variant {
520
525
  Err: Error;
521
- Ok: MemoryByteChunk;
526
+ Ok: EngramEscrowRecovery;
522
527
  };
523
528
  type Result_15 =
524
529
  variant {
@@ -1139,6 +1144,11 @@ type EngramSessionState =
1139
1144
  status: EngramSessionStatus;
1140
1145
  voucherCount: nat;
1141
1146
  };
1147
+ type EngramEscrowRecovery =
1148
+ record {
1149
+ amountE6: nat;
1150
+ blockIndex: nat;
1151
+ };
1142
1152
  type Engram =
1143
1153
  service {
1144
1154
  /// ⟨0.16.0⟩ `about()` — the ONE public projection, replacing `status()` and absorbing `metrics()`.
@@ -1170,7 +1180,7 @@ type Engram =
1170
1180
  /// nomination names. That check compares the caller inside the module, where
1171
1181
  /// test/key-replacement.test.mo runs it; this body names no roster gate, because the caller holds
1172
1182
  /// no role here until the move.
1173
- acceptAgentKeyNomination: (agentKey: principal) -> (Result_70);
1183
+ acceptAgentKeyNomination: (agentKey: principal) -> (Result_71);
1174
1184
  /// Consensus transform for the alert webhook outcall: collapse the response to status-only so
1175
1185
  /// replicas agree regardless of response headers/body (we only care that the POST landed 2xx).
1176
1186
  ///
@@ -1206,10 +1216,10 @@ type Engram =
1206
1216
  };
1207
1217
  primaryType: text;
1208
1218
  verifyingContract: text;
1209
- }) -> (Result_69);
1219
+ }) -> (Result_70);
1210
1220
  /// Owner-managed destination allowlist (D7). Additions LOOSEN and wait 24h; removals TIGHTEN
1211
1221
  /// and apply instantly — the ratified asymmetry, applied to the one mutable policy surface.
1212
- addEvmWithdrawDestination: (dest: text) -> (Result_68);
1222
+ addEvmWithdrawDestination: (dest: text) -> (Result_69);
1213
1223
  /// ⟨0.16.0, L1⟩ THE ROLE-CONFLICT ARM, and why three refusals here are not the same refusal.
1214
1224
  ///
1215
1225
  /// This method had five distinct ways to say no through one `text`, and a caller could only tell
@@ -1251,7 +1261,7 @@ type Engram =
1251
1261
  /// Gated on requireWritesNotPaused — unlike the export. This one destroys retained entries, which
1252
1262
  /// is exactly what a guardian pause exists to hold. No action alert is raised: the operation is
1253
1263
  /// owner-initiated, owner-only, and already chained into the audit log.
1254
- applyCondense: (toSeq: nat) -> (Result_67);
1264
+ applyCondense: (toSeq: nat) -> (Result_68);
1255
1265
  /// Owner-only: activate a guardian who has registered against an invite.
1256
1266
  ///
1257
1267
  /// Until this call the guardian is `#Pending` and can do NOTHING — registering is a claim, this
@@ -1322,13 +1332,13 @@ type Engram =
1322
1332
  ///
1323
1333
  /// The write half also refuses while writes are PAUSED.
1324
1334
  backupInit: (dbType: text, backupType: BackupType, parentBackupId:
1325
- opt text, sha256: text, backupLabel: opt text) -> (Result_43);
1335
+ opt text, sha256: text, backupLabel: opt text) -> (Result_44);
1326
1336
  /// Read one chunk of a finalized backup, by index.
1327
1337
  ///
1328
1338
  /// ⚠ GATED ON `read_backup`, which is NOT the permission the upload half uses — that one is
1329
1339
  /// `canAppendMemory`. Holding one says nothing about the other, deliberately: taking a backup and
1330
1340
  /// carrying it away are different authorities.
1331
- backupPullChunk: (backupId: text, chunkIndex: nat) -> (Result_59) query;
1341
+ backupPullChunk: (backupId: text, chunkIndex: nat) -> (Result_60) query;
1332
1342
  backupPushChunk: (backupId: text, chunkIndex: nat, data: blob) ->
1333
1343
  (Result_1);
1334
1344
  /// The OWNER cancels an agent's pending key nomination; the agent keeps its current key. Refused
@@ -1380,7 +1390,7 @@ type Engram =
1380
1390
  /// A principal that is already a GUARDIAN cannot become an agent — a guardian is an
1381
1391
  /// independent check on agents, so one wallet must not hold both.
1382
1392
  createAgentInvite: (name: text, permissions: AgentPermissions) ->
1383
- (Result_43);
1393
+ (Result_44);
1384
1394
  /// Owner-only: mint an invite for a GUARDIAN — an independent check on agents, not a
1385
1395
  /// co-owner and not a recovery agent.
1386
1396
  ///
@@ -1403,7 +1413,7 @@ type Engram =
1403
1413
  /// So an invite that fails to redeem for that reason is not a bad code. The rule exists because
1404
1414
  /// a check must be independent of the thing it checks.
1405
1415
  createGuardianInvite: (name: text, permissions: GuardianPermissions) ->
1406
- (Result_43);
1416
+ (Result_44);
1407
1417
  /// OWNER-ONLY deletion of a stored backup.
1408
1418
  ///
1409
1419
  /// ⚠ NOT THE SAME GATE AS THE REST OF THE FAMILY, and the asymmetry is deliberate: `backupInit`,
@@ -1459,7 +1469,7 @@ type Engram =
1459
1469
  ///
1460
1470
  /// ⟨Marker added 2026-08-23; the census row said "L7 mark added per review" and no mark was at
1461
1471
  /// the site.⟩
1462
- ensureEvmReady: () -> (Result_43);
1472
+ ensureEvmReady: () -> (Result_44);
1463
1473
  /// Record that log entries [fromSeq, toSeq] were served, and return the root that proves it.
1464
1474
  ///
1465
1475
  /// This is the receipt ledgerfs Q2 requires before any of those entries may be condensed away.
@@ -1473,7 +1483,7 @@ type Engram =
1473
1483
  /// situation rather than a safety measure. It IS gated on requireMemoryAttached: a store that
1474
1484
  /// failed its integrity check must not attest anything it cannot vouch for.
1475
1485
  exportMemoryRange: (fromSeq: nat, toSeq: nat, authorFilter:
1476
- opt principal) -> (Result_66);
1486
+ opt principal) -> (Result_67);
1477
1487
  /// ⟨0.16.0, L2.2 — renamed from `guardianFreezePayments`⟩ The prefix LIED about who may call it.
1478
1488
  /// The gate is `requireOwnerOrGuardian`, and an owner freezing their own payments is the ordinary
1479
1489
  /// case — the guardian is the exceptional one. A name that says otherwise sends an owner looking
@@ -1505,7 +1515,7 @@ type Engram =
1505
1515
  /// before this one. If any of them is wrong, this comment is where the argument should happen.
1506
1516
  freezePayments: () -> (Result_1);
1507
1517
  /// Delivery status + config readback. Owner-only (the URL is a secret).
1508
- getActionAlertStatus: () -> (Result_57) query;
1518
+ getActionAlertStatus: () -> (Result_58) query;
1509
1519
  /// Agents need to know what they may revise, so they can read it too. Whole-value config, same
1510
1520
  /// carve-out as getProtectedPaths — and kept a SEPARATE method from it deliberately (L2.2): a
1511
1521
  /// protected path and a revisable path are opposite grants, and one accessor for both would be a
@@ -1513,7 +1523,7 @@ type Engram =
1513
1523
  ///
1514
1524
  /// Refusal reason preserved from the trap: a grant is a power, and its absence and its
1515
1525
  /// concealment are different facts.
1516
- getAgentRevisablePaths: () -> (Result_53) query;
1526
+ getAgentRevisablePaths: () -> (Result_54) query;
1517
1527
  /// OWNER-ONLY: every engagement's seat weeks on this engram, with the agent's root — the day it
1518
1528
  /// paired, the days of its first and last payment signature, a 64-week map whose bit 0 is the week
1519
1529
  /// of the last one, and how many were produced. Never an amount, a recipient or a nonce.
@@ -1524,7 +1534,7 @@ type Engram =
1524
1534
  /// order. Anyone else is refused by name (`#Refused getAgentSeatWeeks: …`), never answered with an
1525
1535
  /// empty page. Paged; `total` is every engagement ever paired here (a reset keeps the rows).
1526
1536
  /// Two rows can name one root: an agent paired again after it left is a second engagement.
1527
- getAgentSeatWeeks: (start: nat, limit: nat) -> (Result_64) query;
1537
+ getAgentSeatWeeks: (start: nat, limit: nat) -> (Result_65) query;
1528
1538
  /// Owner: everything written into this engram by someone other than the owner since the last
1529
1539
  /// markAgentWritesReviewed() — agent appends/revisions AND paid-session appends (see
1530
1540
  /// qualifiesForReview for why those two families are recognised differently).
@@ -1532,7 +1542,7 @@ type Engram =
1532
1542
  /// them — the UI must page (markAgentWritesReviewed(?lastShownId)) and must NOT present 200
1533
1543
  /// as a total. `earliest` discloses ring eviction — if cursor < earliest, entries between them
1534
1544
  /// aged out of the ring (the CHAIN still proves total count; this view can't show their bodies).
1535
- getAgentWriteReview: () -> (Result_63) query;
1545
+ getAgentWriteReview: () -> (Result_64) query;
1536
1546
  /// Why anchoring is or is not advancing. PUBLIC: ungated on purpose — detecting a stalled
1537
1547
  /// engram is the point, a gated read would fail-to-empty and hand a third party fabricated zeros,
1538
1548
  /// and none of these fields is a secret — `total` is already public via getCertifiedAuditHead.
@@ -1551,7 +1561,7 @@ type Engram =
1551
1561
  /// below serves the same head WITH the subnet certificate for a caller that needs to verify it
1552
1562
  /// was signed rather than asserted.
1553
1563
  getAuditHead: () -> (AuditHead) query;
1554
- getBackupMetadata: (backupId: text) -> (Result_62) query;
1564
+ getBackupMetadata: (backupId: text) -> (Result_63) query;
1555
1565
  /// The cashier this engram recognises as its rent biller — `null` until the registry pushes one.
1556
1566
  ///
1557
1567
  /// PUBLIC: a payer about to send money needs to know which cashier this engram will accept credit
@@ -1581,11 +1591,11 @@ type Engram =
1581
1591
  /// query's state writes are discarded when it returns, and the `denied` call first written here
1582
1592
  /// recorded nothing while reading as if it did. The refusal is loud in the reply instead. WHAT
1583
1593
  /// WOULD MAKE THIS WRONG: a reason to record who asked — then this becomes an update that says so.
1584
- getChildAllowance: (agentPrincipal: principal) -> (Result_61) query;
1594
+ getChildAllowance: (agentPrincipal: principal) -> (Result_62) query;
1585
1595
  /// Owner-only, Billing-class: what opening an engram costs this engram, the balance below which an
1586
1596
  /// agent's request is refused, the balance now, and every agent's allowance. The console's cost
1587
1597
  /// sentence reads it. Cycles are owner-class information, as on the owner's console read.
1588
- getChildOpening: () -> (Result_60) query;
1598
+ getChildOpening: () -> (Result_61) query;
1589
1599
  /// Derive the shared memory-encryption key, encrypted under the caller's transport
1590
1600
  /// public key. Gated to owner + read-agents (the same principals allowed to read
1591
1601
  /// memory). The client decrypts it locally with its transport secret key.
@@ -1610,7 +1620,7 @@ type Engram =
1610
1620
  /// cost. Stated here because L7 requires the reason be readable from the interface rather than
1611
1621
  /// inferred by opening the body — which is exactly what had to happen to write this line.
1612
1622
  getEncryptedMemoryKey: (epoch: opt nat, transportPublicKey: blob) ->
1613
- (Result_59);
1623
+ (Result_60);
1614
1624
  /// ⟨0.16.0, owner ruling 2026-08-20 — option (a)⟩ `x402Support` REPORTS THE RAIL, not a constant.
1615
1625
  ///
1616
1626
  /// The card's config hardcodes `x402Support = true`, answering a buyer's question with a fact
@@ -1709,7 +1719,7 @@ type Engram =
1709
1719
  /// It refuses rather than half-answers: if either address cannot be derived the reply is
1710
1720
  /// `#Err`, never a record carrying an empty string (ic402's `getEvmAddress` answers `""` on a
1711
1721
  /// failed derivation — that is fail-to-empty on a money surface, and it stops here).
1712
- getEvmAddress: () -> (Result_58);
1722
+ getEvmAddress: () -> (Result_59);
1713
1723
  /// The owner's OWN EVM address, if they registered one — distinct from `getEvmAddress`, which is
1714
1724
  /// the address this canister derives for itself.
1715
1725
  ///
@@ -1724,7 +1734,7 @@ type Engram =
1724
1734
  /// the management canister's `ecdsa_public_key`. A query cannot await, so the round-trip is the
1725
1735
  /// cost — stated here because L7 requires the reason be readable from the interface rather than
1726
1736
  /// inferred by opening the body.
1727
- getEvmSignerAddress: () -> (Result_43);
1737
+ getEvmSignerAddress: () -> (Result_44);
1728
1738
  /// PUBLIC: where this chain begins, for the stranger deciding whether to trust it.
1729
1739
  ///
1730
1740
  /// The fourth of the four evidence methods (`getAuditHead`, `getCertifiedAuditHead`,
@@ -1733,7 +1743,7 @@ type Engram =
1733
1743
  /// cannot verify it, and nothing here identifies anybody.
1734
1744
  getGenesisNote: () -> (GenesisNote) query;
1735
1745
  /// A guardian's own channel status (their URL is their secret — each guardian sees only theirs).
1736
- getGuardianAlertStatus: () -> (Result_57) query;
1746
+ getGuardianAlertStatus: () -> (Result_58) query;
1737
1747
  /// The market this engram will accept signing requests from — `null` until the registry pushes
1738
1748
  /// one at spawn, which is why `requireMarket` refuses fleet-wide today.
1739
1749
  ///
@@ -1763,7 +1773,7 @@ type Engram =
1763
1773
  /// never renumbered: the next page starts at the last version returned plus one. Defaults
1764
1774
  /// return the whole history of any file a pre-FD engram could have held.
1765
1775
  getMemoryHistory: (path: text, start: opt nat, max: opt nat) ->
1766
- (Result_56) query;
1776
+ (Result_57) query;
1767
1777
  /// PUBLIC: the epoch alone, and deliberately nothing else (rotation study D4). A `rotatedAt[]`
1768
1778
  /// history would be a public, fleet-enumerable feed of when each owner terminated a trust
1769
1779
  /// relationship — readable by, among others, the party just terminated.
@@ -1804,7 +1814,7 @@ type Engram =
1804
1814
  /// Refusal reasons of both merge: an empty policy reads as "nothing is capped, every version kept
1805
1815
  /// forever" — a claim about what this engram will DESTROY — and an empty guard list reads as
1806
1816
  /// "nothing is held back".
1807
- getMemoryRetentionPolicy: () -> (Result_55) query;
1817
+ getMemoryRetentionPolicy: () -> (Result_56) query;
1808
1818
  /// The metrics reader this engram answers — `null` until the spawning registry names one.
1809
1819
  ///
1810
1820
  /// PUBLIC: an owner deciding whether to switch the read off needs to know who it is, and anyone
@@ -1827,7 +1837,7 @@ type Engram =
1827
1837
  /// was `nat`, then widened to `opt nat` so a refusal could be `null`, which broke every published
1828
1838
  /// client (rule 4) and bought a masked answer nobody had asked for — the census could not even
1829
1839
  /// find a consumer that read the masked `0`. Behind a gate there is nobody to mask it from.
1830
- getOwnerConsole: () -> (Result_54) query;
1840
+ getOwnerConsole: () -> (Result_55) query;
1831
1841
  /// Owner + agents only (agents need it to avoid writing protected paths).
1832
1842
  ///
1833
1843
  /// A NAMED RECORD, not a Page: the setter replaces this list wholesale, so there is no window to
@@ -1839,7 +1849,7 @@ type Engram =
1839
1849
  /// path on this engram is protected", and an agent consults this list precisely to avoid
1840
1850
  /// writing one — so a fabricated empty here does not merely misinform, it invites the write the
1841
1851
  /// list exists to prevent.
1842
- getProtectedPaths: () -> (Result_53) query;
1852
+ getProtectedPaths: () -> (Result_54) query;
1843
1853
  /// Whether the metrics reader's read is answered — `true` from birth.
1844
1854
  ///
1845
1855
  /// PUBLIC: the promise that an owner can switch this read off can be checked only if the switch
@@ -1848,7 +1858,7 @@ type Engram =
1848
1858
  /// Owner-only, Billing-class: the signing floor, the balance, one signature's price, and how many
1849
1859
  /// payment signatures the balance carries above the floor before `signX402Payment` is refused by
1850
1860
  /// name. The same numbers the check uses, so Billing can say only what the engram enforces.
1851
- getSigningFloor: () -> (Result_52) query;
1861
+ getSigningFloor: () -> (Result_53) query;
1852
1862
  /// The registry that spawned this engram, if it recorded one.
1853
1863
  ///
1854
1864
  /// PUBLIC: it is the provenance claim. An engram asserting it is part of a fleet, under that
@@ -1865,7 +1875,7 @@ type Engram =
1865
1875
  /// configuration, and the engram-wide total would also tell one agent how much the others spent.
1866
1876
  /// A refusal names this method (`Gated.gatedResult`) rather than answering null/0 — a ceiling of
1867
1877
  /// "none" and a spend of 0 are both real answers, so a fabricated one would be read as fact.
1868
- getSpendCeiling: () -> (Result_51) query;
1878
+ getSpendCeiling: () -> (Result_52) query;
1869
1879
  /// Read the caps in force for a caller.
1870
1880
  ///
1871
1881
  /// OWNER-ONLY, and this is where it diverges from the market's inbound twin, which is public.
@@ -1873,8 +1883,8 @@ type Engram =
1873
1883
  /// Here the engram serves no 402s at all: these caps are the owner's private custody
1874
1884
  /// configuration, and publishing them would tell any caller exactly how large a signing request
1875
1885
  /// can be before it needs an approval nobody is watching for.
1876
- getSpendPolicy: (caller: opt principal) -> (Result_50) query;
1877
- getStorageStats: () -> (Result_49) query;
1886
+ getSpendPolicy: (caller: opt principal) -> (Result_51) query;
1887
+ getStorageStats: () -> (Result_50) query;
1878
1888
  /// Timer arm-state. PUBLIC and deliberately so: these timers are self-arming to save cycles,
1879
1889
  /// and an optimisation nobody can verify is an optimisation nobody should trust. Cheap to read,
1880
1890
  /// leaks nothing (booleans about our own scheduling).
@@ -1898,6 +1908,10 @@ type Engram =
1898
1908
  /// because a persistent actor re-runs its init body BEFORE postupgrade restores stable sessions,
1899
1909
  /// so a predicate-gated arm would skip exactly the canisters that have live ones. The first tick
1900
1910
  /// disarms it. Still true minutes after an upgrade is a real bug — report it upstream.
1911
+ /// ⟨2026-10-07, beside the paragraph above⟩ The session sweep's interval is 300 seconds now (the
1912
+ /// owner's decision of that day; set in the actor body), so "one interval" is up to five minutes,
1913
+ /// and true five minutes after an upgrade is still expected. True ten minutes after, with no session
1914
+ /// open, is the bug.
1901
1915
  /// NOT the whole timer story. The hourly CYCLE timer — which also carries audit anchoring — is
1902
1916
  /// deliberately absent: it is a `transient let` armed unconditionally at init, so an "armed"
1903
1917
  /// boolean for it would read true forever and tell you nothing, exactly the false-positive the
@@ -1941,12 +1955,12 @@ type Engram =
1941
1955
  /// ⟨L7⟩ MARKER ADDED 2026-08-23, reasoning above UNCHANGED — this block already said "Stays an
1942
1956
  /// UPDATE, marked per L7: it awaits three ICRC-1 ledgers". It was marked in prose and invisible
1943
1957
  /// to any gate; the glyph is what `scripts/check-update-for-read.mjs` matches.
1944
- getWalletBalances: () -> (Result_48);
1958
+ getWalletBalances: () -> (Result_49);
1945
1959
  /// Refusal reason preserved, and it is the clearest case of why a masked read is worse than no
1946
1960
  /// read: three empty strings with `configured = false` is a VALID-LOOKING answer meaning "this
1947
1961
  /// engram has no World ID configuration" — handed to a caller who merely lacks a grant. The
1948
1962
  /// fabrication is indistinguishable from the truth by construction.
1949
- getWorldIdConfig: () -> (Result_47) query;
1963
+ getWorldIdConfig: () -> (Result_48) query;
1950
1964
  /// ⟨L7⟩ UPDATE, NOT QUERY: this awaits THREE system calls — `raw_rand()` for the nonce,
1951
1965
  /// `Call.signWithEcdsa` for the signature, and `worldIdRpPublicKey()` for the derived key. A
1952
1966
  /// query can do none of them.
@@ -1955,7 +1969,7 @@ type Engram =
1955
1969
  /// Valid iff the derived signer address (getWorldIdRpSignerAddress) is registered for this rp_id in
1956
1970
  /// the World Developer Portal. Short-lived (300s TTL, idkit-server's default) and single-purpose —
1957
1971
  /// it authorizes opening one verification request, nothing else.
1958
- getWorldIdRpContext: () -> (Result_46);
1972
+ getWorldIdRpContext: () -> (Result_47);
1959
1973
  /// Owner-only: the EVM address derived from the engram's dedicated World ID RP signing key (the
1960
1974
  /// "worldid-rp" tECDSA path). Register THIS address as the rp_id's signer in the World Developer
1961
1975
  /// Portal — the engram never holds or exports a private key (only threshold shares exist, on the
@@ -1965,7 +1979,7 @@ type Engram =
1965
1979
  /// awaits `worldIdRpPublicKey()` (management `ecdsa_public_key`), and it calls `denied()` on
1966
1980
  /// refusal — a state write, which a query cannot perform. So even if the key were cached this
1967
1981
  /// could not become a query without silently retiring its denial record (ADR-0002's class).
1968
- getWorldIdRpSignerAddress: () -> (Result_43);
1982
+ getWorldIdRpSignerAddress: () -> (Result_44);
1969
1983
  /// The verified IDKitResult, verbatim, as World's /api/v4/verify accepted it — the re-checkable
1970
1984
  /// artifact behind verifiedHuman. Role-gated because it carries the NULLIFIER.
1971
1985
  /// `Result<opt Text>` — and the double wrapper is the entire point, not redundancy.
@@ -1984,7 +1998,7 @@ type Engram =
1984
1998
  /// `///`, so the dead name was PUBLISHED in engram.did and pointed every client at a method the
1985
1999
  /// canister does not serve. The tombstones below and at `about()` are historical and correct as
1986
2000
  /// written; this one was present tense, which is the difference that matters.⟩
1987
- getWorldIdVerification: () -> (Result_45) query;
2001
+ getWorldIdVerification: () -> (Result_46) query;
1988
2002
  /// ⟨0.16.0, L1⟩ THE EMERGENCY FAMILY. Every refusal below is `#Refused` or `#NotFound`, and the
1989
2003
  /// absence of a `#Conflict` here is the point: these are the calls someone makes while something
1990
2004
  /// is going wrong, and the only two answers that help are "you may not do this" and "there is
@@ -2059,7 +2073,7 @@ type Engram =
2059
2073
  ///
2060
2074
  /// Owner-gated because it reports on custody posture, and answered as a Result so that a
2061
2075
  /// wrong-identity caller gets a refusal rather than a bare `false` that reads as "no address yet".
2062
- isEvmAddressCached: () -> (Result_44) query;
2076
+ isEvmAddressCached: () -> (Result_45) query;
2063
2077
  /// Issue an OAuth authorization code. Called by an OAuth client's sign-in bridge
2064
2078
  /// (an `/auth/connector`-style route) after II authentication. The client then
2065
2079
  /// redirects the user's browser to `redirectUri` with `?code=<this>` so the
@@ -2067,7 +2081,7 @@ type Engram =
2067
2081
  ///
2068
2082
  /// Owner-only: only the engram owner can authorize a Connector install.
2069
2083
  issueAuthCode: (redirectUri: text, scope: text, codeChallenge: text,
2070
- clientId: opt text) -> (Result_43);
2084
+ clientId: opt text) -> (Result_44);
2071
2085
  /// ⟨0.16.0⟩ `getCycleSnapshotSource` DELETED — folded into `CycleSnapshot.source`, one label per
2072
2086
  /// ROW. A single label for a whole ring misattributes every row recorded under the other source,
2073
2087
  /// and the source flips by design (self-call first, balance on fallback). Its documentation of
@@ -2081,7 +2095,7 @@ type Engram =
2081
2095
  /// Refusal reason preserved, and it is the sharpest of this family: a masked `[]` reads as a
2082
2096
  /// DORMANT engram and corrupts retention math — a fabricated empty here does not just misinform a
2083
2097
  /// reader, it feeds a wrong number into a decision about destroying data.
2084
- listActivitySnapshots: (start: nat, limit: nat) -> (Result_42) query;
2098
+ listActivitySnapshots: (start: nat, limit: nat) -> (Result_43) query;
2085
2099
  /// ⟨0.16.0⟩ THE PAGE EXEMPLAR. Trap → `#Refused`, bare array → `Result<Page<T>>` (L1 + L3).
2086
2100
  ///
2087
2101
  /// The refusal prose that used to be `gatedTrap`'s `whyNotEmpty` argument is not lost — it is why
@@ -2096,7 +2110,7 @@ type Engram =
2096
2110
  ///
2097
2111
  /// `withheld` is 0: this roster is owner-only in whole, so there is no partial-visibility case.
2098
2112
  /// A method that filters rows by caller sets it — see L1's row-level honesty rule.
2099
- listAgents: (start: nat, limit: nat) -> (Result_41) query;
2113
+ listAgents: (start: nat, limit: nat) -> (Result_42) query;
2100
2114
  /// The GUARDIAN-audience projection of the agent roster — three fields, not the full record.
2101
2115
  ///
2102
2116
  /// Two audiences, two methods (L1/L8), rather than one method masking fields by caller: a
@@ -2108,7 +2122,7 @@ type Engram =
2108
2122
  /// Refusal reason preserved: `[]` reads as "this engram has no agents", and this is the list a
2109
2123
  /// guardian consults BEFORE REVOKING ONE. A fabricated empty here does not merely misinform —
2110
2124
  /// it tells someone acting under emergency powers that there is nothing to act on.
2111
- listAgentsForGuardian: (start: nat, limit: nat) -> (Result_40) query;
2125
+ listAgentsForGuardian: (start: nat, limit: nat) -> (Result_41) query;
2112
2126
  /// Owner-only: rows carry caller, amount, operation and free-text rationale. The SDK omits it.
2113
2127
  ///
2114
2128
  /// The optional leading filter SURVIVES the L3 reshape — ratified (census tier-2 #8) rather than
@@ -2121,7 +2135,7 @@ type Engram =
2121
2135
  ///
2122
2136
  /// Refusal reason preserved: `[]` reads as "nothing is awaiting the owner's decision".
2123
2137
  listApprovalRequests: (statusFilter: opt ApprovalStatus, start: nat,
2124
- limit: nat) -> (Result_28) query;
2138
+ limit: nat) -> (Result_29) query;
2125
2139
  /// ⟨0.16.0⟩ `total` IS THE HEAD COUNTER, and on this method that is the entire point.
2126
2140
  ///
2127
2141
  /// The audit log is a bounded RING: it trims its tail, so "rows you can read" and "entries that
@@ -2141,7 +2155,7 @@ type Engram =
2141
2155
  /// For the owner and a guardian `withheld` is 0 and the page is the span. WHAT WOULD MAKE THIS
2142
2156
  /// WRONG: a reader who must see the whole record without being the owner or a guardian — the
2143
2157
  /// public certified head is the answer for integrity, and nothing else is.
2144
- listAuditEntries: (start: nat, limit: nat) -> (Result_23) query;
2158
+ listAuditEntries: (start: nat, limit: nat) -> (Result_24) query;
2145
2159
  /// ⟨0.16.0, L1 + L3 — census-ruled⟩ THE TWO-MECHANISM EXCEPTION DISSOLVES.
2146
2160
  ///
2147
2161
  /// This method used to answer THREE ways to one question: a list, an `#Err` text, and a trap,
@@ -2165,7 +2179,7 @@ type Engram =
2165
2179
  /// `dbTypeFilter` DIES on the wire (census). The capability does not: `EngramClient.listBackups`
2166
2180
  /// keeps its optional filter and applies it to the page, so no caller loses the ability to ask
2167
2181
  /// "backups of this database" — it stops being a thing the canister has to page around.
2168
- listBackups: (start: nat, limit: nat) -> (Result_39) query;
2182
+ listBackups: (start: nat, limit: nat) -> (Result_40) query;
2169
2183
  /// List all bearer tokens — Active, Revoked, and Expired. Owner uses this in
2170
2184
  /// the dashboard to show installed Connectors (claude.ai, Claude Desktop, etc.).
2171
2185
  /// Refusal reason preserved from the trap: `[]` reads as "no connector is installed on this
@@ -2175,7 +2189,7 @@ type Engram =
2175
2189
  /// `bearerTokenStore.list()` already resolves each token's status at read time (a token that
2176
2190
  /// merely stopped being used is reported `#Expired`, not a stale `#Active`), so the page carries
2177
2191
  /// the same honesty the store gained on 2026-08-17.
2178
- listBearerTokens: (start: nat, limit: nat) -> (Result_38) query;
2192
+ listBearerTokens: (start: nat, limit: nat) -> (Result_39) query;
2179
2193
  /// The condense checkpoints in the retained log at or above `startSeq`, oldest first.
2180
2194
  ///
2181
2195
  /// ⟨0.16.0, NEW⟩ The other half of the split above. A checkpoint is the only surviving record of a
@@ -2185,25 +2199,25 @@ type Engram =
2185
2199
  ///
2186
2200
  /// Owner-only like every other archive surface, and for the same structural reason: these rows
2187
2201
  /// carry the chain positions and roots of entries whose paths were inside the hash preimage.
2188
- listCondenseCheckpoints: (startSeq: nat, max: nat) -> (Result_37) query;
2202
+ listCondenseCheckpoints: (startSeq: nat, max: nat) -> (Result_38) query;
2189
2203
  /// ⟨0.16.0⟩ `metrics()` DELETED — absorbed by `about()`.
2190
2204
  ///
2191
2205
  /// Two public projections of one canister (L2.2): `metrics()` and `status()` both answered "what
2192
2206
  /// is this engram like" and disagreed on which counters they carried, so a consumer had to fetch
2193
2207
  /// both and know which one owned each field. Every field here survives on `about()`, day-flooring
2194
2208
  /// included.
2195
- listCycleSnapshots: (start: nat, limit: nat) -> (Result_36) query;
2209
+ listCycleSnapshots: (start: nat, limit: nat) -> (Result_37) query;
2196
2210
  /// Same `withheld` treatment as listMemoryFiles — the tombstone listing filtered reserved paths
2197
2211
  /// for non-owners just as silently, and a caller could not tell a filtered tombstone list from a
2198
2212
  /// complete one. Counted before slicing, so policy-hidden rows never blur into paging.
2199
- listDeletedMemoryFiles: (start: nat, limit: nat) -> (Result_35) query;
2213
+ listDeletedMemoryFiles: (start: nat, limit: nat) -> (Result_36) query;
2200
2214
  /// The registered shapes — E3: encodeTypeString is the display artifact, verbatim.
2201
2215
  /// Stays on the engram under B1 (hybrid): EIP-712 signing is custody, and custody does not leave.
2202
2216
  ///
2203
2217
  /// Refusal reason preserved: `[]` reads as "this engram can sign nothing" — a claim about SIGNING
2204
2218
  /// AUTHORITY, which is not a thing to hand an unauthorized reader. The public trail of every
2205
2219
  /// registration remains the audit chain under getCertifiedAuditHead.
2206
- listEip712Types: (start: nat, limit: nat) -> (Result_34) query;
2220
+ listEip712Types: (start: nat, limit: nat) -> (Result_35) query;
2207
2221
  /// Stays on the engram under B1 (hybrid): withdrawal custody does not leave.
2208
2222
  ///
2209
2223
  /// NAMED item, not a `(Text, Int)` tuple. The Int is an activation time, and a bare Int beside a
@@ -2212,14 +2226,14 @@ type Engram =
2212
2226
  /// Refusal reason preserved, and it has two halves that matter separately: `[]` reads as "this
2213
2227
  /// engram may withdraw nowhere", OR — worse — as "no allowlist is in force", which is the
2214
2228
  /// opposite security posture. It also erases any pending 24h activation from view.
2215
- listEvmWithdrawDestinations: (start: nat, limit: nat) -> (Result_33) query;
2229
+ listEvmWithdrawDestinations: (start: nat, limit: nat) -> (Result_34) query;
2216
2230
  /// Accessible by owner and guardians.
2217
2231
  ///
2218
2232
  /// Refusal reason carried over from the trap, because it is the sharpest example of why this
2219
2233
  /// surface may not fail soft: `[]` reads as "this engram has nobody who can freeze payments or
2220
2234
  /// pause writes" — a claim about who can STOP it. A caller who cannot tell that from "you may not
2221
2235
  /// see the roster" has been told the engram is unguarded when it may be fully guarded.
2222
- listGuardians: (start: nat, limit: nat) -> (Result_32) query;
2236
+ listGuardians: (start: nat, limit: nat) -> (Result_33) query;
2223
2237
  /// The export receipts in the retained log at or above `startSeq`, oldest first.
2224
2238
  ///
2225
2239
  /// ⟨0.16.0, L3⟩ ONE LIST, ONE QUESTION. This method used to return receipts AND checkpoints
@@ -2235,7 +2249,7 @@ type Engram =
2235
2249
  ///
2236
2250
  /// Read `MemoryRouter.ReceiptPage` before reading `page.total` as a receipt count. It is not one;
2237
2251
  /// it is the chain's length, and the declaration says why.
2238
- listMemoryExportReceipts: (startSeq: nat, max: nat) -> (Result_31) query;
2252
+ listMemoryExportReceipts: (startSeq: nat, max: nat) -> (Result_32) query;
2239
2253
  /// ⟨0.16.0⟩ THE `withheld` EXEMPLAR — L1 names this exact method as the defect it fixes.
2240
2254
  ///
2241
2255
  /// A non-owner's answer silently dropped every `config/` and `secrets/` row. Not "refused the
@@ -2251,7 +2265,7 @@ type Engram =
2251
2265
  /// Note the count is computed from the unfiltered list before slicing, so it reports rows hidden
2252
2266
  /// by POLICY, never rows merely off the end of this page — those are `total`'s job. Conflating
2253
2267
  /// the two would rebuild the ambiguity in a new place.
2254
- listMemoryFiles: (start: nat, limit: nat) -> (Result_30) query;
2268
+ listMemoryFiles: (start: nat, limit: nat) -> (Result_31) query;
2255
2269
  /// One page of the memory log, seq-ordered, optionally narrowed to one author.
2256
2270
  ///
2257
2271
  /// THE WINDOW IS THE CURSOR, and the page now states it. The window is
@@ -2277,7 +2291,7 @@ type Engram =
2277
2291
  /// with the disclosures that make the page verifiable — the hidden-bound defect the census itself
2278
2292
  /// names on previewCondense's row.
2279
2293
  listMemoryLog: (startSeq: nat, max: nat, authorFilter: opt principal) ->
2280
- (Result_29) query;
2294
+ (Result_30) query;
2281
2295
  /// The caller's OWN spend-approval requests. ⟨0.16.0, L1 + L3 — fixed 2026-08-18⟩
2282
2296
  ///
2283
2297
  /// Two defects in seven lines, and the first is the one this release exists to remove:
@@ -2294,7 +2308,7 @@ type Engram =
2294
2308
  /// to see, so `total` over their own rows is the honest count and nothing is hidden FROM them.
2295
2309
  /// (The unbounded MAP is filed separately — pruning an approval record destroys evidence of what
2296
2310
  /// was asked, which is a retention ruling rather than a shape fix.)
2297
- listMyApprovalRequests: (start: nat, limit: nat) -> (Result_28) query;
2311
+ listMyApprovalRequests: (start: nat, limit: nat) -> (Result_29) query;
2298
2312
  /// The payer's own sessions, live ones first. PAYER-SCOPED: a caller sees only their own, which
2299
2313
  /// is why this needs no role — a session id is not a secret from the person who paid for it.
2300
2314
  ///
@@ -2303,7 +2317,7 @@ type Engram =
2303
2317
  /// It took no arguments, and a cursor added after the freeze is an argument-list change every
2304
2318
  /// client would break on — the market paged its own pending withdrawals before its cut for the
2305
2319
  /// same reason. The order is the order sessions were opened.
2306
- listMySessions: (start: nat, limit: nat) -> (Result_27) query;
2320
+ listMySessions: (start: nat, limit: nat) -> (Result_28) query;
2307
2321
  ///
2308
2322
  /// ⟨0.16.0, L3⟩ Paged and enveloped like every other `list*`, and the envelope here is uniformity
2309
2323
  /// rather than gating: this method cannot refuse anybody, so `#Err` is unreachable on it. That is
@@ -2316,7 +2330,7 @@ type Engram =
2316
2330
  /// asked by strangers. `verifyEngramActiveOwner` on the registry answers only about the owner
2317
2331
  /// IT recorded, so this chain is what a caller composes with when currency matters — which it
2318
2332
  /// cannot do if it needs a role here.
2319
- listOwnershipTransfers: (start: nat, limit: nat) -> (Result_26) query;
2333
+ listOwnershipTransfers: (start: nat, limit: nat) -> (Result_27) query;
2320
2334
  /// ⟨2026-09-29, the platform's question from the build review⟩ OWNER-ONLY: how many payment
2321
2335
  /// signatures each agent has obtained today, and the daily limit (200, `PaymentSignCap`). The
2322
2336
  /// owner's console stated the rule and showed no number, because nothing served one; a number it
@@ -2332,7 +2346,7 @@ type Engram =
2332
2346
  /// marketplace's one shared count today is in the reply's `marketplace` field, with the limit this
2333
2347
  /// engram enforces for it — beside the agents, never a row among them
2334
2348
  /// (`PaymentSignCap.marketplaceRow`). Null when no marketplace is set.
2335
- listPaymentSignatureCounts: (start: nat, limit: nat) -> (Result_25) query;
2349
+ listPaymentSignatureCounts: (start: nat, limit: nat) -> (Result_26) query;
2336
2350
  /// Agent records removed by a reset. Each row is a NAMED record with the fields `principal`,
2337
2351
  /// `name`, `registeredAt` and `purgedAt` — read them BY NAME, never by position.
2338
2352
  /// ⟨2026-09-29, the vocabulary ruling: pairing is the one verb that admits an agent⟩ The field
@@ -2372,7 +2386,7 @@ type Engram =
2372
2386
  /// `invite` its enrolment named, and `ended` — why and on what day its engagement ended (its own
2373
2387
  /// earlier ending, or the reset) — the facts `resyncAgentEdges` re-sends. The stored rows are
2374
2388
  /// served as they are.
2375
- listPurgedAgents: (start: nat, limit: nat) -> (Result_24) query;
2389
+ listPurgedAgents: (start: nat, limit: nat) -> (Result_25) query;
2376
2390
  /// ⟨0.16.0⟩ ONE ACCESSOR, folding `readReadLog` and `getDenialLog` — and the fold only became
2377
2391
  /// safe because of a change made earlier in this same leg.
2378
2392
  ///
@@ -2434,7 +2448,7 @@ type Engram =
2434
2448
  /// on the chained record — the same `RecordView` filter, and `withheld` counts what it removed
2435
2449
  /// together with what `successFilter` removed. WHAT WOULD MAKE THIS WRONG: see `listAuditEntries`.
2436
2450
  listReadLog: (successFilter: opt bool, start: nat, limit: nat) ->
2437
- (Result_23) query;
2451
+ (Result_24) query;
2438
2452
  /// Same visibility as listAuditEntries: the owner, this engram's agents, and ACTIVE guardians
2439
2453
  /// see disputes. An unauthorized read REFUSES — it does not return an empty list, because an
2440
2454
  /// empty list reads as "no disputes have been filed", which is a claim, not an absence of one.
@@ -2449,7 +2463,7 @@ type Engram =
2449
2463
  /// window — which says disputes exist without showing them, never "none have been filed". WHAT
2450
2464
  /// WOULD MAKE THIS WRONG: a ruling that an agent may see the disputes of its own writes; this would
2451
2465
  /// then have to look up each disputed version's writer, which it does not do today.
2452
- listRepudiations: (start: nat, limit: nat) -> (Result_22) query;
2466
+ listRepudiations: (start: nat, limit: nat) -> (Result_23) query;
2453
2467
  /// Owner: advance the review cursor — "I have seen everything up to and including uptoAuditId"
2454
2468
  /// (null = everything at the current head). Bounded so the attestation can never cover entries
2455
2469
  /// the console did not render; clamped monotonic (the cursor never moves backward) and to the
@@ -2494,8 +2508,8 @@ type Engram =
2494
2508
  ///
2495
2509
  /// WHAT WOULD MAKE THIS WRONG: an await added between `ChildAllowance.take` and the registry call; the
2496
2510
  /// registry's `CHILD_MIN_ATTACHED_CYCLES` moving without `CHILD_ATTACH_CYCLES`.
2497
- openChildEngram: () -> (Result_21);
2498
- openSession: (config: SessionConfig, sig: PaymentSignature) -> (Result_20);
2511
+ openChildEngram: () -> (Result_22);
2512
+ openSession: (config: SessionConfig, sig: PaymentSignature) -> (Result_21);
2499
2513
  /// Withdraw tokens to the owner's principal. This is the ONLY way to
2500
2514
  /// move tokens out of the engram to an external address, and the
2501
2515
  /// destination is always hardcoded to the owner.
@@ -2560,7 +2574,7 @@ type Engram =
2560
2574
  pairAgent: (arg: record {
2561
2575
  code: text;
2562
2576
  enrolment: Enrolment;
2563
- }) -> (Result_19);
2577
+ }) -> (Result_20);
2564
2578
  /// ⟨0.16.0, L2.2 — renamed from `guardianPauseWrites`⟩ Same correction as freezePayments above:
2565
2579
  /// owner-or-guardian, and `resumeWrites` never carried the prefix either.
2566
2580
  pauseWrites: () -> (Result_1);
@@ -2582,7 +2596,7 @@ type Engram =
2582
2596
  ///
2583
2597
  /// `unlocked` is the export-receipt gate ONLY. It is not a promise the condense will land: the
2584
2598
  /// history-budget delta is checked at commit time and can still refuse a short prefix.
2585
- previewCondense: (toSeq: nat) -> (Result_18) query;
2599
+ previewCondense: (toSeq: nat) -> (Result_19) query;
2586
2600
  /// A quote for a session this caller has not opened and is not committed to — the intent a
2587
2601
  /// buyer signs against. Pure dry run, no state, no funds.
2588
2602
  ///
@@ -2640,7 +2654,7 @@ type Engram =
2640
2654
  /// Both are now what they are: a single `#Err` for the whole call. `#Ok` still carries a row per
2641
2655
  /// path, each with its own Result — a refused RESERVED path sits beside a readable one, which is
2642
2656
  /// a genuine per-path fact.
2643
- readMemoryBatch: (paths: vec text) -> (Result_17) query;
2657
+ readMemoryBatch: (paths: vec text) -> (Result_18) query;
2644
2658
  /// ⟨0.16.0⟩ `getMemoryRetentionGuards` DELETED — folded into `getMemoryRetentionPolicy` above.
2645
2659
  /// It was the second L2.1 array-returning `get*`, and separating it from the policy it modifies
2646
2660
  /// was the defect described there. Its own docs are preserved at the fold site.
@@ -2651,7 +2665,7 @@ type Engram =
2651
2665
  /// see it cannot know whether it has the whole range, which is how silent truncation gets
2652
2666
  /// reintroduced. Loop while `more` is true, advancing by the bytes actually returned.
2653
2667
  readMemoryBytes: (path: text, offset: nat, len: nat, version: opt nat) ->
2654
- (Result_16) query;
2668
+ (Result_17) query;
2655
2669
  /// The escrow exit for a session whose settle cannot pay.
2656
2670
  ///
2657
2671
  /// PAYER-ONLY, enforced inside the gateway, and deliberately not owner-triggered: the payer's own
@@ -2706,7 +2720,15 @@ type Engram =
2706
2720
  /// the transfer pays its own fee from the escrow. A session still reads `closing` only when its
2707
2721
  /// close trapped after one of its awaits, or an earlier version left it there, and of that one the
2708
2722
  /// line above still holds.
2709
- recoverEscrow: (sessionId: text, amountE6: nat) -> (Result_8);
2723
+ ///
2724
+ /// ⟨2026-10-07, the owner's decision of that day⟩ WHAT IT ANSWERS: what came back. `amountE6` is
2725
+ /// the ckUSDC base units transferred to the payer's own account (the amount asked, capped at the
2726
+ /// session's unconsumed deposit; the transfer's fee comes out of the escrow on top), and
2727
+ /// `blockIndex` is the ledger block of that transfer. Until this date it answered a bare `nat` that
2728
+ /// was the block index alone, which read as the amount. If the session's record is removed before
2729
+ /// the amount can be read back — a session closed in the same moment as the recovery and cleaned up
2730
+ /// during its transfer — it answers `#Other` naming the block, never a guessed amount.
2731
+ recoverEscrow: (sessionId: text, amountE6: nat) -> (Result_16);
2710
2732
  /// ⟨0.16.0, L1⟩ A REDEMPTION PATH, where the arm choice is a disclosure decision.
2711
2733
  ///
2712
2734
  /// Four of these refusals are about the CODE and one is about the caller. The code arms restate