@engramx/idl 0.16.0-rc.13 → 0.16.0-rc.14

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.
@@ -280,6 +280,11 @@ export interface Eip3009Authorization {
280
280
  nonce: Uint8Array | number[];
281
281
  validBefore: bigint;
282
282
  }
283
+ export interface Eip712Destination {
284
+ activeFromNs: bigint;
285
+ value: string;
286
+ }
287
+ export type Eip712FieldRule = { mustEqual: string } | { atMost: { max: bigint; decimals: bigint } };
283
288
  export interface Eip712Registration {
284
289
  encodeTypeString: string;
285
290
  cooloffEndsAtNs: bigint;
@@ -292,6 +297,25 @@ export interface Eip712SignatureOut {
292
297
  rendered: string;
293
298
  digest: Uint8Array | number[];
294
299
  }
300
+ export interface Eip712TypeView {
301
+ primaryType: string;
302
+ encodeTypeString: string;
303
+ cooloffEndsAtNs: bigint;
304
+ domainName: string;
305
+ typeId: Uint8Array | number[];
306
+ verifyingContract: string;
307
+ dailySignCap: bigint;
308
+ fields: Array<[string, string]>;
309
+ domainSeparator: Uint8Array | number[];
310
+ destinationFields: Array<string>;
311
+ authorityClass: AuthorityClass;
312
+ typeHash: Uint8Array | number[];
313
+ registeredAtNs: bigint;
314
+ fieldRules: Array<[string, Eip712FieldRule]>;
315
+ chainId: bigint;
316
+ domainVersion: string;
317
+ ackIrrevocable: boolean;
318
+ }
295
319
  export type Eip712Value =
296
320
  | { string: string }
297
321
  | { bool: boolean }
@@ -333,7 +357,7 @@ export interface Engram {
333
357
  * / test/key-replacement.test.mo runs it; this body names no roster gate, because the caller holds
334
358
  * / no role here until the move.
335
359
  */
336
- acceptAgentKeyNomination: ActorMethod<[Principal], Result_71>;
360
+ acceptAgentKeyNomination: ActorMethod<[Principal], Result_72>;
337
361
  /**
338
362
  * / Consensus transform for the alert webhook outcall: collapse the response to status-only so
339
363
  * / replicas agree regardless of response headers/body (we only care that the POST landed 2xx).
@@ -347,10 +371,35 @@ export interface Engram {
347
371
  [{ context: Uint8Array | number[]; response: HttpRequestResult }],
348
372
  HttpRequestResult
349
373
  >;
374
+ /**
375
+ * / Owner-managed destination allowlist (D7). Additions LOOSEN and wait 24h; removals TIGHTEN
376
+ * / and apply instantly — the ratified asymmetry, applied to the one mutable policy surface.
377
+ * /
378
+ * / ⟨2026-10-14, the owner's ruling 4A⟩ ONE LIST PER REGISTERED ACTION. `addEvmWithdrawDestination`,
379
+ * / `removeEvmWithdrawDestination` and `listEvmWithdrawDestinations` — one list for every action —
380
+ * / are REMOVED; these three take the action's `typeId`. Same rules, per action: the owner only; an
381
+ * / addition activates after 24 hours and is refused while payments are frozen; a removal is instant
382
+ * / and works while frozen; a value is 1–128 characters (an address, or a venue value such as an
383
+ * / account name). The action must be registered: a destination list belongs to an action, and a
384
+ * / list for no action would be a value nothing checks. The caller is the owner's app.
385
+ */
386
+ addEip712Destination: ActorMethod<[Uint8Array | number[], string], Result_71>;
350
387
  /**
351
388
  * / Register a typed-data shape as signable. Owner-only, freeze-gated (a registration is a grant
352
389
  * / of FUTURE authority — a frozen engram must not be able to widen what it can sign), and the
353
390
  * / shape is IMMUTABLE: any change mints a new typeId.
391
+ * /
392
+ * / ⟨2026-10-14, the owner's rulings 3A and 5A⟩ ONE BAR FOR EVERY REGISTRATION — the class the owner
393
+ * / names is stored as a label and decides nothing. Every registration: records the irrevocability
394
+ * / acknowledgement (`ackIrrevocable = true`); has no opaque field (`bytes`, `bytes1..32`); names at
395
+ * / least one destination field OR carries a must-equal rule; passes the watchers — an owner alert
396
+ * / webhook set, enabled AND with its money class on, and an `#Active` guardian holding
397
+ * / `canFreezePayments`; and waits `Eip712Policy.COOLOFF_NS` (72 hours). It may carry per-field
398
+ * / rules (`fieldRules`: "at most N" read as a plain decimal with D places, "must equal X"), which
399
+ * / are part of the registered shape — inside the typeId, stored in `eip712FieldRules`, enforced in
400
+ * / `eip712SignFor` before the cap reservation. Before this, a withdrawal registered as `#standard`
401
+ * / needed no webhook, no guardian and no destination field, waited one hour, and signed to any
402
+ * / address. Intrinsic checks still come first and the watchers last (the 2026-08-06 re-ordering).
354
403
  */
355
404
  addEip712Type: ActorMethod<
356
405
  [
@@ -363,6 +412,7 @@ export interface Engram {
363
412
  fields: Array<[string, string]>;
364
413
  destinationFields: Array<string>;
365
414
  authorityClass: { standingAuthority: null } | { valueBearing: null } | { standard: null };
415
+ fieldRules: Array<[string, Eip712FieldRule]>;
366
416
  chainId: bigint;
367
417
  domainVersion: string;
368
418
  ackIrrevocable: boolean;
@@ -370,11 +420,6 @@ export interface Engram {
370
420
  ],
371
421
  Result_70
372
422
  >;
373
- /**
374
- * / Owner-managed destination allowlist (D7). Additions LOOSEN and wait 24h; removals TIGHTEN
375
- * / and apply instantly — the ratified asymmetry, applied to the one mutable policy surface.
376
- */
377
- addEvmWithdrawDestination: ActorMethod<[string], Result_69>;
378
423
  /**
379
424
  * / ⟨0.16.0, L1⟩ THE ROLE-CONFLICT ARM, and why three refusals here are not the same refusal.
380
425
  * /
@@ -420,7 +465,7 @@ export interface Engram {
420
465
  * / is exactly what a guardian pause exists to hold. No action alert is raised: the operation is
421
466
  * / owner-initiated, owner-only, and already chained into the audit log.
422
467
  */
423
- applyCondense: ActorMethod<[bigint], Result_68>;
468
+ applyCondense: ActorMethod<[bigint], Result_69>;
424
469
  /**
425
470
  * / Owner-only: activate a guardian who has registered against an invite.
426
471
  * /
@@ -500,7 +545,7 @@ export interface Engram {
500
545
  * /
501
546
  * / The write half also refuses while writes are PAUSED.
502
547
  */
503
- backupInit: ActorMethod<[string, BackupType, [] | [string], string, [] | [string]], Result_44>;
548
+ backupInit: ActorMethod<[string, BackupType, [] | [string], string, [] | [string]], Result_45>;
504
549
  /**
505
550
  * / Read one chunk of a finalized backup, by index.
506
551
  * /
@@ -508,7 +553,7 @@ export interface Engram {
508
553
  * / `canAppendMemory`. Holding one says nothing about the other, deliberately: taking a backup and
509
554
  * / carrying it away are different authorities.
510
555
  */
511
- backupPullChunk: ActorMethod<[string, bigint], Result_60>;
556
+ backupPullChunk: ActorMethod<[string, bigint], Result_61>;
512
557
  backupPushChunk: ActorMethod<[string, bigint, Uint8Array | number[]], Result_1>;
513
558
  /**
514
559
  * / The OWNER cancels an agent's pending key nomination; the agent keeps its current key. Refused
@@ -566,7 +611,7 @@ export interface Engram {
566
611
  * / A principal that is already a GUARDIAN cannot become an agent — a guardian is an
567
612
  * / independent check on agents, so one wallet must not hold both.
568
613
  */
569
- createAgentInvite: ActorMethod<[string, AgentPermissions], Result_44>;
614
+ createAgentInvite: ActorMethod<[string, AgentPermissions], Result_45>;
570
615
  /**
571
616
  * / Owner-only: mint an invite for a GUARDIAN — an independent check on agents, not a
572
617
  * / co-owner and not a recovery agent.
@@ -590,7 +635,7 @@ export interface Engram {
590
635
  * / So an invite that fails to redeem for that reason is not a bad code. The rule exists because
591
636
  * / a check must be independent of the thing it checks.
592
637
  */
593
- createGuardianInvite: ActorMethod<[string, GuardianPermissions], Result_44>;
638
+ createGuardianInvite: ActorMethod<[string, GuardianPermissions], Result_45>;
594
639
  /**
595
640
  * / OWNER-ONLY deletion of a stored backup.
596
641
  * /
@@ -638,7 +683,7 @@ export interface Engram {
638
683
  * / situation rather than a safety measure. It IS gated on requireMemoryAttached: a store that
639
684
  * / failed its integrity check must not attest anything it cannot vouch for.
640
685
  */
641
- exportMemoryRange: ActorMethod<[bigint, bigint, [] | [Principal]], Result_67>;
686
+ exportMemoryRange: ActorMethod<[bigint, bigint, [] | [Principal]], Result_68>;
642
687
  /**
643
688
  * / ⟨0.16.0, L2.2 — renamed from `guardianFreezePayments`⟩ The prefix LIED about who may call it.
644
689
  * / The gate is `requireOwnerOrGuardian`, and an owner freezing their own payments is the ordinary
@@ -655,6 +700,8 @@ export interface Engram {
655
700
  * / individual method's body finds nothing — the check is one level down.⟩
656
701
  * / · `addEip712Type` and `addEvmWithdrawDestination` — pre-staging for a later payout is the
657
702
  * / thing a brake most needs to stop, so the destination list is frozen along with the signing.
703
+ * / ⟨2026-10-14, the owner's ruling 4A⟩ `addEvmWithdrawDestination` is removed; its place is
704
+ * / `addEip712Destination` (one list per registered action), freeze-gated the same way.
658
705
  * / · `sessionReadMemory` and `sessionAppendMemory` — the paid-memory rail, money coming IN.
659
706
  * /
660
707
  * / AND WHAT IT DELIBERATELY DOES NOT, stated so the absence is not read as an oversight:
@@ -674,7 +721,7 @@ export interface Engram {
674
721
  /**
675
722
  * / Delivery status + config readback. Owner-only (the URL is a secret).
676
723
  */
677
- getActionAlertStatus: ActorMethod<[], Result_58>;
724
+ getActionAlertStatus: ActorMethod<[], Result_59>;
678
725
  /**
679
726
  * / Agents need to know what they may revise, so they can read it too. Whole-value config, same
680
727
  * / carve-out as getProtectedPaths — and kept a SEPARATE method from it deliberately (L2.2): a
@@ -684,7 +731,7 @@ export interface Engram {
684
731
  * / Refusal reason preserved from the trap: a grant is a power, and its absence and its
685
732
  * / concealment are different facts.
686
733
  */
687
- getAgentRevisablePaths: ActorMethod<[], Result_54>;
734
+ getAgentRevisablePaths: ActorMethod<[], Result_55>;
688
735
  /**
689
736
  * / OWNER-ONLY: every engagement's seat weeks on this engram, with the agent's root — the day it
690
737
  * / paired, the days of its first and last payment signature, a 64-week map whose bit 0 is the week
@@ -697,7 +744,7 @@ export interface Engram {
697
744
  * / empty page. Paged; `total` is every engagement ever paired here (a reset keeps the rows).
698
745
  * / Two rows can name one root: an agent paired again after it left is a second engagement.
699
746
  */
700
- getAgentSeatWeeks: ActorMethod<[bigint, bigint], Result_65>;
747
+ getAgentSeatWeeks: ActorMethod<[bigint, bigint], Result_66>;
701
748
  /**
702
749
  * / Owner: everything written into this engram by someone other than the owner since the last
703
750
  * / markAgentWritesReviewed() — agent appends/revisions AND paid-session appends (see
@@ -707,7 +754,7 @@ export interface Engram {
707
754
  * / as a total. `earliest` discloses ring eviction — if cursor < earliest, entries between them
708
755
  * / aged out of the ring (the CHAIN still proves total count; this view can't show their bodies).
709
756
  */
710
- getAgentWriteReview: ActorMethod<[], Result_64>;
757
+ getAgentWriteReview: ActorMethod<[], Result_65>;
711
758
  /**
712
759
  * / Why anchoring is or is not advancing. PUBLIC: ungated on purpose — detecting a stalled
713
760
  * / engram is the point, a gated read would fail-to-empty and hand a third party fabricated zeros,
@@ -730,7 +777,7 @@ export interface Engram {
730
777
  * / was signed rather than asserted.
731
778
  */
732
779
  getAuditHead: ActorMethod<[], AuditHead>;
733
- getBackupMetadata: ActorMethod<[string], Result_63>;
780
+ getBackupMetadata: ActorMethod<[string], Result_64>;
734
781
  /**
735
782
  * / The cashier this engram recognises as its rent biller — `null` until the registry pushes one.
736
783
  * /
@@ -766,13 +813,13 @@ export interface Engram {
766
813
  * / recorded nothing while reading as if it did. The refusal is loud in the reply instead. WHAT
767
814
  * / WOULD MAKE THIS WRONG: a reason to record who asked — then this becomes an update that says so.
768
815
  */
769
- getChildAllowance: ActorMethod<[Principal], Result_62>;
816
+ getChildAllowance: ActorMethod<[Principal], Result_63>;
770
817
  /**
771
818
  * / Owner-only, Billing-class: what opening an engram costs this engram, the balance below which an
772
819
  * / agent's request is refused, the balance now, and every agent's allowance. The console's cost
773
820
  * / sentence reads it. Cycles are owner-class information, as on the owner's console read.
774
821
  */
775
- getChildOpening: ActorMethod<[], Result_61>;
822
+ getChildOpening: ActorMethod<[], Result_62>;
776
823
  /**
777
824
  * / Derive the shared memory-encryption key, encrypted under the caller's transport
778
825
  * / public key. Gated to owner + read-agents (the same principals allowed to read
@@ -798,7 +845,7 @@ export interface Engram {
798
845
  * / cost. Stated here because L7 requires the reason be readable from the interface rather than
799
846
  * / inferred by opening the body — which is exactly what had to happen to write this line.
800
847
  */
801
- getEncryptedMemoryKey: ActorMethod<[[] | [bigint], Uint8Array | number[]], Result_60>;
848
+ getEncryptedMemoryKey: ActorMethod<[[] | [bigint], Uint8Array | number[]], Result_61>;
802
849
  /**
803
850
  * / ⟨0.16.0, owner ruling 2026-08-20 — option (a)⟩ `x402Support` REPORTS THE RAIL, not a constant.
804
851
  * /
@@ -897,7 +944,7 @@ export interface Engram {
897
944
  * / `#Err`, never a record carrying an empty string (ic402's `getEvmAddress` answers `""` on a
898
945
  * / failed derivation — that is fail-to-empty on a money surface, and it stops here).
899
946
  */
900
- getEvmAddress: ActorMethod<[], Result_59>;
947
+ getEvmAddress: ActorMethod<[], Result_60>;
901
948
  /**
902
949
  * / The owner's OWN EVM address, if they registered one — distinct from `getEvmAddress`, which is
903
950
  * / the address this canister derives for itself.
@@ -916,7 +963,7 @@ export interface Engram {
916
963
  * / cost — stated here because L7 requires the reason be readable from the interface rather than
917
964
  * / inferred by opening the body.
918
965
  */
919
- getEvmSignerAddress: ActorMethod<[], Result_44>;
966
+ getEvmSignerAddress: ActorMethod<[], Result_45>;
920
967
  /**
921
968
  * / PUBLIC: where this chain begins, for the stranger deciding whether to trust it.
922
969
  * /
@@ -929,7 +976,7 @@ export interface Engram {
929
976
  /**
930
977
  * / A guardian's own channel status (their URL is their secret — each guardian sees only theirs).
931
978
  */
932
- getGuardianAlertStatus: ActorMethod<[], Result_58>;
979
+ getGuardianAlertStatus: ActorMethod<[], Result_59>;
933
980
  /**
934
981
  * / The market this engram will accept signing requests from — `null` until the registry pushes
935
982
  * / one at spawn, which is why `requireMarket` refuses fleet-wide today.
@@ -962,7 +1009,7 @@ export interface Engram {
962
1009
  * / never renumbered: the next page starts at the last version returned plus one. Defaults
963
1010
  * / return the whole history of any file a pre-FD engram could have held.
964
1011
  */
965
- getMemoryHistory: ActorMethod<[string, [] | [bigint], [] | [bigint]], Result_57>;
1012
+ getMemoryHistory: ActorMethod<[string, [] | [bigint], [] | [bigint]], Result_58>;
966
1013
  /**
967
1014
  * / PUBLIC: the epoch alone, and deliberately nothing else (rotation study D4). A `rotatedAt[]`
968
1015
  * / history would be a public, fleet-enumerable feed of when each owner terminated a trust
@@ -1011,7 +1058,7 @@ export interface Engram {
1011
1058
  * / forever" — a claim about what this engram will DESTROY — and an empty guard list reads as
1012
1059
  * / "nothing is held back".
1013
1060
  */
1014
- getMemoryRetentionPolicy: ActorMethod<[], Result_56>;
1061
+ getMemoryRetentionPolicy: ActorMethod<[], Result_57>;
1015
1062
  /**
1016
1063
  * / The metrics reader this engram answers — `null` until the spawning registry names one.
1017
1064
  * /
@@ -1040,7 +1087,7 @@ export interface Engram {
1040
1087
  * / client (rule 4) and bought a masked answer nobody had asked for — the census could not even
1041
1088
  * / find a consumer that read the masked `0`. Behind a gate there is nobody to mask it from.
1042
1089
  */
1043
- getOwnerConsole: ActorMethod<[], Result_55>;
1090
+ getOwnerConsole: ActorMethod<[], Result_56>;
1044
1091
  /**
1045
1092
  * / Owner + agents only (agents need it to avoid writing protected paths).
1046
1093
  * /
@@ -1054,7 +1101,7 @@ export interface Engram {
1054
1101
  * / writing one — so a fabricated empty here does not merely misinform, it invites the write the
1055
1102
  * / list exists to prevent.
1056
1103
  */
1057
- getProtectedPaths: ActorMethod<[], Result_54>;
1104
+ getProtectedPaths: ActorMethod<[], Result_55>;
1058
1105
  /**
1059
1106
  * / Whether the metrics reader's read is answered — `true` from birth.
1060
1107
  * /
@@ -1067,7 +1114,7 @@ export interface Engram {
1067
1114
  * / payment signatures the balance carries above the floor before `signX402Payment` is refused by
1068
1115
  * / name. The same numbers the check uses, so Billing can say only what the engram enforces.
1069
1116
  */
1070
- getSigningFloor: ActorMethod<[], Result_53>;
1117
+ getSigningFloor: ActorMethod<[], Result_54>;
1071
1118
  /**
1072
1119
  * / The registry that spawned this engram, if it recorded one.
1073
1120
  * /
@@ -1088,7 +1135,7 @@ export interface Engram {
1088
1135
  * / A refusal names this method (`Gated.gatedResult`) rather than answering null/0 — a ceiling of
1089
1136
  * / "none" and a spend of 0 are both real answers, so a fabricated one would be read as fact.
1090
1137
  */
1091
- getSpendCeiling: ActorMethod<[], Result_52>;
1138
+ getSpendCeiling: ActorMethod<[], Result_53>;
1092
1139
  /**
1093
1140
  * / Read the caps in force for a caller.
1094
1141
  * /
@@ -1098,8 +1145,8 @@ export interface Engram {
1098
1145
  * / configuration, and publishing them would tell any caller exactly how large a signing request
1099
1146
  * / can be before it needs an approval nobody is watching for.
1100
1147
  */
1101
- getSpendPolicy: ActorMethod<[[] | [Principal]], Result_51>;
1102
- getStorageStats: ActorMethod<[], Result_50>;
1148
+ getSpendPolicy: ActorMethod<[[] | [Principal]], Result_52>;
1149
+ getStorageStats: ActorMethod<[], Result_51>;
1103
1150
  /**
1104
1151
  * / Timer arm-state. PUBLIC and deliberately so: these timers are self-arming to save cycles,
1105
1152
  * / and an optimisation nobody can verify is an optimisation nobody should trust. Cheap to read,
@@ -1172,14 +1219,14 @@ export interface Engram {
1172
1219
  * / UPDATE, marked per L7: it awaits three ICRC-1 ledgers". It was marked in prose and invisible
1173
1220
  * / to any gate; the glyph is what `scripts/check-update-for-read.mjs` matches.
1174
1221
  */
1175
- getWalletBalances: ActorMethod<[], Result_49>;
1222
+ getWalletBalances: ActorMethod<[], Result_50>;
1176
1223
  /**
1177
1224
  * / Refusal reason preserved, and it is the clearest case of why a masked read is worse than no
1178
1225
  * / read: three empty strings with `configured = false` is a VALID-LOOKING answer meaning "this
1179
1226
  * / engram has no World ID configuration" — handed to a caller who merely lacks a grant. The
1180
1227
  * / fabrication is indistinguishable from the truth by construction.
1181
1228
  */
1182
- getWorldIdConfig: ActorMethod<[], Result_48>;
1229
+ getWorldIdConfig: ActorMethod<[], Result_49>;
1183
1230
  /**
1184
1231
  * / ⟨L7⟩ UPDATE, NOT QUERY: this awaits THREE system calls — `raw_rand()` for the nonce,
1185
1232
  * / `Call.signWithEcdsa` for the signature, and `worldIdRpPublicKey()` for the derived key. A
@@ -1190,7 +1237,7 @@ export interface Engram {
1190
1237
  * / the World Developer Portal. Short-lived (300s TTL, idkit-server's default) and single-purpose —
1191
1238
  * / it authorizes opening one verification request, nothing else.
1192
1239
  */
1193
- getWorldIdRpContext: ActorMethod<[], Result_47>;
1240
+ getWorldIdRpContext: ActorMethod<[], Result_48>;
1194
1241
  /**
1195
1242
  * / Owner-only: the EVM address derived from the engram's dedicated World ID RP signing key (the
1196
1243
  * / "worldid-rp" tECDSA path). Register THIS address as the rp_id's signer in the World Developer
@@ -1202,7 +1249,7 @@ export interface Engram {
1202
1249
  * / refusal — a state write, which a query cannot perform. So even if the key were cached this
1203
1250
  * / could not become a query without silently retiring its denial record (ADR-0002's class).
1204
1251
  */
1205
- getWorldIdRpSignerAddress: ActorMethod<[], Result_44>;
1252
+ getWorldIdRpSignerAddress: ActorMethod<[], Result_45>;
1206
1253
  /**
1207
1254
  * / The verified IDKitResult, verbatim, as World's /api/v4/verify accepted it — the re-checkable
1208
1255
  * / artifact behind verifiedHuman. Role-gated because it carries the NULLIFIER.
@@ -1223,7 +1270,7 @@ export interface Engram {
1223
1270
  * / canister does not serve. The tombstones below and at `about()` are historical and correct as
1224
1271
  * / written; this one was present tense, which is the difference that matters.⟩
1225
1272
  */
1226
- getWorldIdVerification: ActorMethod<[], Result_46>;
1273
+ getWorldIdVerification: ActorMethod<[], Result_47>;
1227
1274
  /**
1228
1275
  * / ⟨0.16.0, L1⟩ THE EMERGENCY FAMILY. Every refusal below is `#Refused` or `#NotFound`, and the
1229
1276
  * / absence of a `#Conflict` here is the point: these are the calls someone makes while something
@@ -1307,7 +1354,7 @@ export interface Engram {
1307
1354
  * / Owner-gated because it reports on custody posture, and answered as a Result so that a
1308
1355
  * / wrong-identity caller gets a refusal rather than a bare `false` that reads as "no address yet".
1309
1356
  */
1310
- isEvmAddressCached: ActorMethod<[], Result_45>;
1357
+ isEvmAddressCached: ActorMethod<[], Result_46>;
1311
1358
  /**
1312
1359
  * / Issue an OAuth authorization code. Called by an OAuth client's sign-in bridge
1313
1360
  * / (an `/auth/connector`-style route) after II authentication. The client then
@@ -1316,7 +1363,7 @@ export interface Engram {
1316
1363
  * /
1317
1364
  * / Owner-only: only the engram owner can authorize a Connector install.
1318
1365
  */
1319
- issueAuthCode: ActorMethod<[string, string, string, [] | [string]], Result_44>;
1366
+ issueAuthCode: ActorMethod<[string, string, string, [] | [string]], Result_45>;
1320
1367
  /**
1321
1368
  * / ⟨0.16.0⟩ `getCycleSnapshotSource` DELETED — folded into `CycleSnapshot.source`, one label per
1322
1369
  * / ROW. A single label for a whole ring misattributes every row recorded under the other source,
@@ -1332,7 +1379,7 @@ export interface Engram {
1332
1379
  * / DORMANT engram and corrupts retention math — a fabricated empty here does not just misinform a
1333
1380
  * / reader, it feeds a wrong number into a decision about destroying data.
1334
1381
  */
1335
- listActivitySnapshots: ActorMethod<[bigint, bigint], Result_43>;
1382
+ listActivitySnapshots: ActorMethod<[bigint, bigint], Result_44>;
1336
1383
  /**
1337
1384
  * / ⟨0.16.0⟩ THE PAGE EXEMPLAR. Trap → `#Refused`, bare array → `Result<Page<T>>` (L1 + L3).
1338
1385
  * /
@@ -1349,7 +1396,7 @@ export interface Engram {
1349
1396
  * / `withheld` is 0: this roster is owner-only in whole, so there is no partial-visibility case.
1350
1397
  * / A method that filters rows by caller sets it — see L1's row-level honesty rule.
1351
1398
  */
1352
- listAgents: ActorMethod<[bigint, bigint], Result_42>;
1399
+ listAgents: ActorMethod<[bigint, bigint], Result_43>;
1353
1400
  /**
1354
1401
  * / The GUARDIAN-audience projection of the agent roster — three fields, not the full record.
1355
1402
  * /
@@ -1363,7 +1410,7 @@ export interface Engram {
1363
1410
  * / guardian consults BEFORE REVOKING ONE. A fabricated empty here does not merely misinform —
1364
1411
  * / it tells someone acting under emergency powers that there is nothing to act on.
1365
1412
  */
1366
- listAgentsForGuardian: ActorMethod<[bigint, bigint], Result_41>;
1413
+ listAgentsForGuardian: ActorMethod<[bigint, bigint], Result_42>;
1367
1414
  /**
1368
1415
  * / Owner-only: rows carry caller, amount, operation and free-text rationale. The SDK omits it.
1369
1416
  * /
@@ -1398,8 +1445,22 @@ export interface Engram {
1398
1445
  * / For the owner and a guardian `withheld` is 0 and the page is the span. WHAT WOULD MAKE THIS
1399
1446
  * / WRONG: a reader who must see the whole record without being the owner or a guardian — the
1400
1447
  * / public certified head is the answer for integrity, and nothing else is.
1401
- */
1402
- listAuditEntries: ActorMethod<[bigint, bigint], Result_24>;
1448
+ * /
1449
+ * / ⟨2026-10-15, the owner's ruling 6B of 2026-10-14⟩ PUBLIC NOW, AND THE COUNT BECAME ROWS. The
1450
+ * / reply is a `Wire.RecordPage`: every entry in the span the reader may not see in full comes back
1451
+ * / as a hash-only row in `sealed` (id, SHA-256 of its body, entry hash) instead of being counted in
1452
+ * / `withheld`, so `items.size() + sealed.size()` is the span examined. Each entry is hashed first,
1453
+ * / then chained (`AuditLog`), so those rows are enough to walk from any entry to the certified
1454
+ * / head — which is what lets a stranger check one entry without the owner. A caller with no role,
1455
+ * / the anonymous caller included, is a stranger (`RecordView.readerFrom`) and gets only sealed
1456
+ * / rows; the owner and guardians still see every entry, an agent its own. Nothing here refuses,
1457
+ * / so the read's former refusal ("Anonymous caller not allowed") is gone from it.
1458
+ * / `ringFloor` says where the ring starts — a `start` below it begins at it — and `hashFirstFrom`
1459
+ * / where this record switched to the hash-first rule. A sealed row costs one SHA-256 of its body
1460
+ * / at read time; nothing new is stored. WHAT WOULD MAKE THIS WRONG: a sealed row carrying any part
1461
+ * / of a body, or a stranger reaching `items` (test/record-view.test.mo pins both).
1462
+ */
1463
+ listAuditEntries: ActorMethod<[bigint, bigint], Result_41>;
1403
1464
  /**
1404
1465
  * / ⟨0.16.0, L1 + L3 — census-ruled⟩ THE TWO-MECHANISM EXCEPTION DISSOLVES.
1405
1466
  * /
@@ -1465,15 +1526,6 @@ export interface Engram {
1465
1526
  * / complete one. Counted before slicing, so policy-hidden rows never blur into paging.
1466
1527
  */
1467
1528
  listDeletedMemoryFiles: ActorMethod<[bigint, bigint], Result_36>;
1468
- /**
1469
- * / The registered shapes — E3: encodeTypeString is the display artifact, verbatim.
1470
- * / Stays on the engram under B1 (hybrid): EIP-712 signing is custody, and custody does not leave.
1471
- * /
1472
- * / Refusal reason preserved: `[]` reads as "this engram can sign nothing" — a claim about SIGNING
1473
- * / AUTHORITY, which is not a thing to hand an unauthorized reader. The public trail of every
1474
- * / registration remains the audit chain under getCertifiedAuditHead.
1475
- */
1476
- listEip712Types: ActorMethod<[bigint, bigint], Result_35>;
1477
1529
  /**
1478
1530
  * / Stays on the engram under B1 (hybrid): withdrawal custody does not leave.
1479
1531
  * /
@@ -1483,8 +1535,26 @@ export interface Engram {
1483
1535
  * / Refusal reason preserved, and it has two halves that matter separately: `[]` reads as "this
1484
1536
  * / engram may withdraw nowhere", OR — worse — as "no allowlist is in force", which is the
1485
1537
  * / opposite security posture. It also erases any pending 24h activation from view.
1538
+ * /
1539
+ * / ⟨2026-10-14, 4A⟩ One action's list: `typeId` names the action, and an unregistered one is
1540
+ * / `#NotFound` rather than an empty page (an empty page means "this action may sign to nothing").
1541
+ * / The item's field is `value`, not `address`: a list may hold a venue value that is no address.
1542
+ * / Readable by the owner, an active agent or an active guardian, as the old list was.
1543
+ */
1544
+ listEip712Destinations: ActorMethod<[Uint8Array | number[], bigint, bigint], Result_35>;
1545
+ /**
1546
+ * / The registered shapes — E3: encodeTypeString is the display artifact, verbatim.
1547
+ * / Stays on the engram under B1 (hybrid): EIP-712 signing is custody, and custody does not leave.
1548
+ * /
1549
+ * / Refusal reason preserved: `[]` reads as "this engram can sign nothing" — a claim about SIGNING
1550
+ * / AUTHORITY, which is not a thing to hand an unauthorized reader. The public trail of every
1551
+ * / registration remains the audit chain under getCertifiedAuditHead.
1552
+ * /
1553
+ * / ⟨2026-10-14, the owner's ruling 3A⟩ Each row carries its per-field rules (`fieldRules`), joined in
1554
+ * / from `eip712FieldRules` — they are part of what the type authorises, so a reader of the list must
1555
+ * / not have to make a second call to learn them. The row type is `Eip712TypeView`.
1486
1556
  */
1487
- listEvmWithdrawDestinations: ActorMethod<[bigint, bigint], Result_34>;
1557
+ listEip712Types: ActorMethod<[bigint, bigint], Result_34>;
1488
1558
  /**
1489
1559
  * / Accessible by owner and guardians.
1490
1560
  * /
@@ -2050,6 +2120,11 @@ export interface Engram {
2050
2120
  * / following later changes. That makes every override permanent in effect.
2051
2121
  */
2052
2122
  removeCallerSpendPolicy: ActorMethod<[Principal], Result_1>;
2123
+ /**
2124
+ * / ⟨2026-10-14, 4A⟩ Remove a destination from one action's list. Instant, and NOT freeze-gated:
2125
+ * / removal TIGHTENS, and a frozen engram must still be able to shrink what it could sign to.
2126
+ */
2127
+ removeEip712Destination: ActorMethod<[Uint8Array | number[], string], Result_1>;
2053
2128
  /**
2054
2129
  * / De-register a type that has NEVER SIGNED. Exists because of a hazard the first external
2055
2130
  * / validation found within hours (consumer report, 2026-08-06): a bare-name #standard registration —
@@ -2060,9 +2135,10 @@ export interface Engram {
2060
2135
  * / removes only authority that was never exercised, which is removing nothing but the mistake.
2061
2136
  * / NOT freeze-gated, same reasoning as removeEvmWithdrawDestination: this is TIGHTENING, and a
2062
2137
  * / frozen engram must still be able to shrink what it could sign.
2138
+ * / ⟨2026-10-14⟩ `removeEvmWithdrawDestination` is now `removeEip712Destination` (ruling 4A); same
2139
+ * / reasoning. Removing a type now also drops its rules and its own destination list.
2063
2140
  */
2064
2141
  removeEip712Type: ActorMethod<[Uint8Array | number[]], Result_1>;
2065
- removeEvmWithdrawDestination: ActorMethod<[string], Result_1>;
2066
2142
  /**
2067
2143
  * / Owner-only: remove a guardian from the roster.
2068
2144
  * /
@@ -2528,6 +2604,10 @@ export interface Engram {
2528
2604
  * / bounded instead by each registered type's daily count and destination list; and agent-
2529
2605
  * / registration transactions (`signEngramRegistration`), bounded by three per caller per day and
2530
2606
  * / the 500-gwei gas ceiling. Whether the ceiling should cover them is a separate owner question.⟩
2607
+ * / ⟨2026-10-14, the owner's rulings 3A, 4A and 5A⟩ Typed-data signatures are now bounded by each
2608
+ * / registered type's daily count, its per-field rules ("at most N", "must equal X") and ITS OWN
2609
+ * / destination list, and the signing floor (`SigningFloor`) guards them as it guards x402 payments.
2610
+ * / They are still not counted against this ceiling.
2531
2611
  * /
2532
2612
  * / WHY: the owner decided on 2026-09-28 to add one daily spending ceiling across all callers on an
2533
2613
  * / engram and keep the limit of five agents. Every other spending limit is per caller, so without
@@ -2934,6 +3014,9 @@ export interface Engram {
2934
3014
  * / (the market cannot introduce a shape), its cool-off must have elapsed, its per-type daily cap
2935
3015
  * / still binds, the destination allowlist still fails closed, and a payments freeze still stops
2936
3016
  * / it. What the market supplies is the request; what the engram supplies is the whole policy.
3017
+ * / ⟨2026-10-14⟩ And the type's per-field rules, its own destination list (ruling 4A) and the
3018
+ * / signing floor (ruling 5A) — all in `eip712SignFor`, so they bind the market as they bind the
3019
+ * / owner; a refusal here is on the chained record under the market's caller and role.
2937
3020
  * /
2938
3021
  * / That is what "signatures only" means in code, and it is why this method needs no new authority
2939
3022
  * / model: an unregistered typeId is refused for the market exactly as it is for the owner.
@@ -3365,12 +3448,12 @@ export interface Page_10 {
3365
3448
  export interface Page_11 {
3366
3449
  total: bigint;
3367
3450
  withheld: bigint;
3368
- items: Array<{ activeFromNs: bigint; address: string }>;
3451
+ items: Array<Eip712TypeView>;
3369
3452
  }
3370
3453
  export interface Page_12 {
3371
3454
  total: bigint;
3372
3455
  withheld: bigint;
3373
- items: Array<RegisteredType>;
3456
+ items: Array<Eip712Destination>;
3374
3457
  }
3375
3458
  export interface Page_13 {
3376
3459
  total: bigint;
@@ -3506,23 +3589,12 @@ export interface ReceiptPage {
3506
3589
  page: Page_9;
3507
3590
  scannedThroughSeq: bigint;
3508
3591
  }
3509
- export interface RegisteredType {
3510
- primaryType: string;
3511
- encodeTypeString: string;
3512
- cooloffEndsAtNs: bigint;
3513
- domainName: string;
3514
- typeId: Uint8Array | number[];
3515
- verifyingContract: string;
3516
- dailySignCap: bigint;
3517
- fields: Array<[string, string]>;
3518
- domainSeparator: Uint8Array | number[];
3519
- destinationFields: Array<string>;
3520
- authorityClass: AuthorityClass;
3521
- typeHash: Uint8Array | number[];
3522
- registeredAtNs: bigint;
3523
- chainId: bigint;
3524
- domainVersion: string;
3525
- ackIrrevocable: boolean;
3592
+ export interface RecordPage {
3593
+ ringFloor: bigint;
3594
+ total: bigint;
3595
+ sealed: Array<SealedEntry>;
3596
+ items: Array<AuditEntry>;
3597
+ hashFirstFrom: bigint;
3526
3598
  }
3527
3599
  export interface Repudiation {
3528
3600
  atNs: bigint;
@@ -3573,39 +3645,40 @@ export type Result_38 = { Ok: CheckpointPage } | { Err: Error };
3573
3645
  export type Result_39 = { Ok: Page_16 } | { Err: Error };
3574
3646
  export type Result_4 = { Ok: Eip712SignatureOut } | { Err: Error };
3575
3647
  export type Result_40 = { Ok: Page_17 } | { Err: Error };
3576
- export type Result_41 = { Ok: Page_18 } | { Err: Error };
3577
- export type Result_42 = { Ok: Page_19 } | { Err: Error };
3578
- export type Result_43 = { Ok: Page_20 } | { Err: Error };
3579
- export type Result_44 = { Ok: string } | { Err: Error };
3580
- export type Result_45 = { Ok: boolean } | { Err: Error };
3581
- export type Result_46 = { Ok: [] | [string] } | { Err: Error };
3582
- export type Result_47 = { Ok: WorldIdRpContext } | { Err: Error };
3583
- export type Result_48 = { Ok: WorldIdConfig } | { Err: Error };
3584
- export type Result_49 = { Ok: WalletBalances } | { Err: Error };
3648
+ export type Result_41 = { Ok: RecordPage } | { Err: Error };
3649
+ export type Result_42 = { Ok: Page_18 } | { Err: Error };
3650
+ export type Result_43 = { Ok: Page_19 } | { Err: Error };
3651
+ export type Result_44 = { Ok: Page_20 } | { Err: Error };
3652
+ export type Result_45 = { Ok: string } | { Err: Error };
3653
+ export type Result_46 = { Ok: boolean } | { Err: Error };
3654
+ export type Result_47 = { Ok: [] | [string] } | { Err: Error };
3655
+ export type Result_48 = { Ok: WorldIdRpContext } | { Err: Error };
3656
+ export type Result_49 = { Ok: WorldIdConfig } | { Err: Error };
3585
3657
  export type Result_5 = { Ok: SignatureCounts } | { Err: Error };
3586
- export type Result_50 = { Ok: StorageReport } | { Err: Error };
3587
- export type Result_51 = { Ok: SpendingPolicy } | { Err: Error };
3588
- export type Result_52 = { Ok: SpendCeiling } | { Err: Error };
3589
- export type Result_53 = { Ok: SigningFloorStatus } | { Err: Error };
3590
- export type Result_54 = { Ok: { paths: Array<string> } } | { Err: Error };
3591
- export type Result_55 = { Ok: OwnerConsole } | { Err: Error };
3592
- export type Result_56 = { Ok: MemoryRetentionPolicy } | { Err: Error };
3593
- export type Result_57 = { Ok: MemoryHistory } | { Err: Error };
3594
- export type Result_58 = { Ok: AlertStatus } | { Err: Error };
3595
- export type Result_59 = { Ok: EvmAddresses } | { Err: Error };
3658
+ export type Result_50 = { Ok: WalletBalances } | { Err: Error };
3659
+ export type Result_51 = { Ok: StorageReport } | { Err: Error };
3660
+ export type Result_52 = { Ok: SpendingPolicy } | { Err: Error };
3661
+ export type Result_53 = { Ok: SpendCeiling } | { Err: Error };
3662
+ export type Result_54 = { Ok: SigningFloorStatus } | { Err: Error };
3663
+ export type Result_55 = { Ok: { paths: Array<string> } } | { Err: Error };
3664
+ export type Result_56 = { Ok: OwnerConsole } | { Err: Error };
3665
+ export type Result_57 = { Ok: MemoryRetentionPolicy } | { Err: Error };
3666
+ export type Result_58 = { Ok: MemoryHistory } | { Err: Error };
3667
+ export type Result_59 = { Ok: AlertStatus } | { Err: Error };
3596
3668
  export type Result_6 = { Ok: RailHealth } | { Err: Error };
3597
- export type Result_60 = { Ok: Uint8Array | number[] } | { Err: Error };
3598
- export type Result_61 = { Ok: ChildOpening } | { Err: Error };
3599
- export type Result_62 = { Ok: ChildAllowanceRow } | { Err: Error };
3600
- export type Result_63 = { Ok: BackupMetadata } | { Err: Error };
3601
- export type Result_64 = { Ok: AgentWriteReview } | { Err: Error };
3602
- export type Result_65 = { Ok: Page_21 } | { Err: Error };
3603
- export type Result_67 = { Ok: MemoryRangeExport } | { Err: Error };
3604
- export type Result_68 = { Ok: CondenseResult } | { Err: Error };
3605
- export type Result_69 = { Ok: { activatesAtNs: bigint } } | { Err: Error };
3669
+ export type Result_60 = { Ok: EvmAddresses } | { Err: Error };
3670
+ export type Result_61 = { Ok: Uint8Array | number[] } | { Err: Error };
3671
+ export type Result_62 = { Ok: ChildOpening } | { Err: Error };
3672
+ export type Result_63 = { Ok: ChildAllowanceRow } | { Err: Error };
3673
+ export type Result_64 = { Ok: BackupMetadata } | { Err: Error };
3674
+ export type Result_65 = { Ok: AgentWriteReview } | { Err: Error };
3675
+ export type Result_66 = { Ok: Page_21 } | { Err: Error };
3676
+ export type Result_68 = { Ok: MemoryRangeExport } | { Err: Error };
3677
+ export type Result_69 = { Ok: CondenseResult } | { Err: Error };
3606
3678
  export type Result_7 = { Ok: Array<Seat> } | { Err: Error };
3607
3679
  export type Result_70 = { Ok: Eip712Registration } | { Err: Error };
3608
- export type Result_71 = { Ok: AgentRecord } | { Err: Error };
3680
+ export type Result_71 = { Ok: { activatesAtNs: bigint } } | { Err: Error };
3681
+ export type Result_72 = { Ok: AgentRecord } | { Err: Error };
3609
3682
  export type Result_8 = { Ok: SignedTransaction } | { Err: Error };
3610
3683
  export type Result_9 = { Ok: BackupRetentionReport } | { Err: Error };
3611
3684
  export interface ResyncReport {
@@ -3641,6 +3714,11 @@ export type Role =
3641
3714
  | { Agent: null }
3642
3715
  | { Other: null }
3643
3716
  | { Owner: null };
3717
+ export interface SealedEntry {
3718
+ id: bigint;
3719
+ entryHash: Uint8Array | number[];
3720
+ digest: Uint8Array | number[];
3721
+ }
3644
3722
  export interface Seat {
3645
3723
  pairedDay: bigint;
3646
3724
  lastPaymentDay: [] | [bigint];
@@ -3774,8 +3852,14 @@ export interface WorldIdRpContext {
3774
3852
  }
3775
3853
  export interface WriteReceipt {
3776
3854
  seq: bigint;
3855
+ contentRoot: Uint8Array | number[];
3856
+ atNs: bigint;
3777
3857
  head: Uint8Array | number[];
3858
+ prev: Uint8Array | number[];
3859
+ size: bigint;
3860
+ recordPrev: Uint8Array | number[];
3778
3861
  version: bigint;
3862
+ recordId: bigint;
3779
3863
  }
3780
3864
  export type X402SignOutcome =
3781
3865
  { ApprovalPending: ApprovalRequest } | { Signed: SignedAuthorization };