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

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
@@ -213,12 +213,12 @@ type ResyncReport =
213
213
  type Result_9 =
214
214
  variant {
215
215
  Err: Error;
216
- Ok: SignedTransaction;
216
+ Ok: BackupRetentionReport;
217
217
  };
218
218
  type Result_8 =
219
219
  variant {
220
220
  Err: Error;
221
- Ok: nat;
221
+ Ok: SignedTransaction;
222
222
  };
223
223
  type Result_71 =
224
224
  variant {
@@ -543,17 +543,17 @@ type Result_13 =
543
543
  type Result_12 =
544
544
  variant {
545
545
  Err: Error;
546
- Ok: SessionContext;
546
+ Ok: nat;
547
547
  };
548
548
  type Result_11 =
549
549
  variant {
550
550
  Err: Error;
551
- Ok: MemoryFile;
551
+ Ok: SessionContext;
552
552
  };
553
553
  type Result_10 =
554
554
  variant {
555
555
  Err: Error;
556
- Ok: BackupRetentionReport;
556
+ Ok: MemoryFile;
557
557
  };
558
558
  type Result_1 =
559
559
  variant {
@@ -1372,7 +1372,7 @@ type Engram =
1372
1372
  /// ⟨2026-10-02⟩ The second parameter is NAMED `amountE6` now, as the census row above rules the
1373
1373
  /// pair — e6 base units of the token named first. A name only: Candid passes arguments by
1374
1374
  /// position, so nothing on the wire moved.
1375
- convertEarningsToCycles: (token: text, amountE6: nat) -> (Result_8);
1375
+ convertEarningsToCycles: (token: text, amountE6: nat) -> (Result_12);
1376
1376
  /// Owner-only: mint a single-use invite code an agent redeems with `pairAgent`.
1377
1377
  ///
1378
1378
  /// ⚠ READ THIS BEFORE INVITING SOMEONE BACK. Pairing is ONE-SHOT PER PRINCIPAL on
@@ -1442,35 +1442,6 @@ type Engram =
1442
1442
  /// `#NotFound` for an unknown id and `#Conflict` when the request is no longer pending, and it
1443
1443
  /// does not change the policy — the next request over the same limit will be raised again.
1444
1444
  denyRequest: (requestId: text, reason: text) -> (Result_1);
1445
- /// Force the tECDSA derivation and return the address.
1446
- ///
1447
- /// It exists because the gateway's own derivation fires from a timer that is lazy on some
1448
- /// replicas, and until it lands the EVM quote advertises the `0x0` fallback and settle fails
1449
- /// closed — a live money surface quoting an address that cannot receive.
1450
- ///
1451
- /// ⟨0.16.0, B-2⟩ Derivation now comes from `EvmIdentity`, and the return type carries the
1452
- /// outcome: this used to answer `""` on failure, which is a Text a caller can and did paste into
1453
- /// a payment flow. An empty string is not an address, and saying so is the difference between a
1454
- /// failed derivation and an address of nothing.
1455
- ///
1456
- /// ⚠ TRANSITIONAL: it also primes the ic402 gate, because the gate still settles commerce on this
1457
- /// canister until those 47 methods move. That second call disappears with them — it is listed in
1458
- /// the move order in the spec's B-2 addendum, not left for someone to find.
1459
- ///
1460
- /// PUBLIC: it inherits `getEvmAddress`'s gate rather than choosing one, and could not usefully be
1461
- /// narrower — it exists so a caller can make the derivation happen BEFORE a payment flow, and the
1462
- /// derivation itself is ungated. Idempotent and bounded to the same one-derivation-per-lifetime
1463
- /// work, so an anonymous caller can cause it once and no more.
1464
- /// ⟨L7⟩ UPDATE, NOT QUERY, and this one does not merely await — it WRITES. The body awaits
1465
- /// `EvmIdentity.deriveAddress` (the management canister's `ecdsa_public_key`) and
1466
- /// `gate.deriveEvmRecipientAt` ⟨renamed 2026-09-22 with the path⟩, then caches the result in `evmAddressCache`. So a query is
1467
- /// impossible twice over: it could not await the derivation, and it could not keep the answer.
1468
- /// Named `ensure*` rather than `get*` for that reason — the write is the point, and a read verb
1469
- /// would have promised a cheapness this cannot deliver.
1470
- ///
1471
- /// ⟨Marker added 2026-08-23; the census row said "L7 mark added per review" and no mark was at
1472
- /// the site.⟩
1473
- ensureEvmReady: () -> (Result_44);
1474
1445
  /// Record that log entries [fromSeq, toSeq] were served, and return the root that proves it.
1475
1446
  ///
1476
1447
  /// This is the receipt ledgerfs Q2 requires before any of those entries may be condensed away.
@@ -1646,10 +1617,6 @@ type Engram =
1646
1617
  /// has never met this engram what it is and how to transact with it. A card behind a gate cannot
1647
1618
  /// be discovered, and the ERC-8004 ecosystem it participates in assumes an open read.
1648
1619
  getEngramCard: () -> (AgentCard) query;
1649
- /// PUBLIC: the engram's permanent spawn ordinal — a provable, non-sensitive fact. It identifies a
1650
- /// canister, never a person.
1651
- /// null = spawned before numbering existed; the owner can backfill via syncEngramNumber().
1652
- getEngramNumber: () -> (opt nat) query;
1653
1620
  /// Re-pointed at `EvmIdentity` (B-2): custody derivation no longer routes through the ic402
1654
1621
  /// Gateway, which is leaving for the market canister. Behaviour is unchanged for a caller — same
1655
1622
  /// address, same tECDSA key — but the engram no longer needs a marketplace to know its own
@@ -2474,7 +2441,7 @@ type Engram =
2474
2441
  /// (every family qualifiesForReview admits is written to auditLogger, so they share that space),
2475
2442
  /// and this never inspects an operation or a role. Widening what the review shows therefore
2476
2443
  /// changes only which ids the console can pass here — it cannot desynchronise the cursor.
2477
- markAgentWritesReviewed: (uptoAuditId: opt nat) -> (Result_8);
2444
+ markAgentWritesReviewed: (uptoAuditId: opt nat) -> (Result_12);
2478
2445
  /// The AGENT's current key nominates the key that will replace it. Nothing moves yet: the new
2479
2446
  /// key must accept, by its own call, within 24 hours (`acceptAgentKeyNomination`). One pending
2480
2447
  /// nomination per agent — a new one replaces the earlier one, and the record says which. Refused,
@@ -2517,7 +2484,7 @@ type Engram =
2517
2484
  /// NOT freeze-gated: the owner always controls their own funds.
2518
2485
  /// Guardian freeze only blocks agent/public operations.
2519
2486
  ownerWithdraw: (amount: TokenAmount, ownerAuth: opt ActionAuth) ->
2520
- (Result_8);
2487
+ (Result_12);
2521
2488
  /// ⟨0.16.0⟩ `payRentFromEarnings` DELETED — ruled TWICE (B1 and B2), and it was the single
2522
2489
  /// clearest violation of the OSS/platform split in this repo.
2523
2490
  ///
@@ -2639,7 +2606,7 @@ type Engram =
2639
2606
  /// counter here could never persist; read counting lives on the update path
2640
2607
  /// (`sessionReadContext` and the MCP reads). A caller measuring engram usage from this method
2641
2608
  /// will measure nothing.
2642
- readMemory: (path: text) -> (Result_11) query;
2609
+ readMemory: (path: text) -> (Result_10) query;
2643
2610
  /// Read many paths in one call. Per-path Results are KEPT — partial success is the point, and
2644
2611
  /// one unreadable path must not fail the other nine.
2645
2612
  ///
@@ -2774,7 +2741,7 @@ type Engram =
2774
2741
  /// the original audit entry stay exactly where they were; this appends a chained
2775
2742
  /// `memory.repudiate` entry and lists the (path, version) so readers can see the dispute.
2776
2743
  repudiateMemoryWrite: (path: text, version: nat, reason: text) ->
2777
- (Result_8);
2744
+ (Result_12);
2778
2745
  /// ⚠ OWNER-ONLY BULK RESET. Destructive, and wider than its name suggests.
2779
2746
  ///
2780
2747
  /// It severs EVERY grant surface that can outlive a role — agents, guardians, invites and
@@ -2902,7 +2869,7 @@ type Engram =
2902
2869
  /// written, and only then does it await one notification per revoked agent. So a notification
2903
2870
  /// that fails leaves the agents revoked here regardless — a partial notify is not a partial
2904
2871
  /// revocation, which is the direction that matters for a panic button.
2905
- revokeAllAgents: () -> (Result_8);
2872
+ revokeAllAgents: () -> (Result_12);
2906
2873
  /// Owner-only panic button: revoke every connector bearer token at once. Returns how many.
2907
2874
  ///
2908
2875
  /// The THIRD independent surface — hosted connectors authenticate with bearer tokens, not with
@@ -2911,7 +2878,7 @@ type Engram =
2911
2878
  /// holding a live session.
2912
2879
  ///
2913
2880
  /// Tokens are re-issuable: revoking them is not permanent the way revoking an agent is.
2914
- revokeAllBearerTokens: () -> (Result_8);
2881
+ revokeAllBearerTokens: () -> (Result_12);
2915
2882
  /// ⟨0.16.0⟩ `removeAllGuardians` DELETED — test-only (L6), and verified NOT part of KILL-SWITCH's
2916
2883
  /// mass-revoke set. The destructive phase-07 suite iterates `removeGuardian` instead, so nothing
2917
2884
  /// loses a capability: what dies is a bulk spelling no runbook ever invoked.
@@ -2923,7 +2890,7 @@ type Engram =
2923
2890
  ///
2924
2891
  /// Unlike revoking an agent, this costs nothing permanently — an invite is a one-time code,
2925
2892
  /// so voiding it and minting a fresh one is the ordinary path.
2926
- revokeAllInvites: () -> (Result_8);
2893
+ revokeAllInvites: () -> (Result_12);
2927
2894
  /// Revoke a bearer token by its public tokenId. Idempotent.
2928
2895
  /// Subsequent /mcp requests using this token will be rejected.
2929
2896
  revokeBearerToken: (tokenId: text) -> (Result_1);
@@ -2950,13 +2917,6 @@ type Engram =
2950
2917
  /// agent on that record, so its standing is not the problem — the record's state is. An
2951
2918
  /// agent reading `#Refused` would go looking for a permission that was never missing.
2952
2919
  rotateAgentKeyHash: (newPublicKeyHash: text) -> (Result_1);
2953
- /// One-time onboarding seed: writes a starter file so the first read-back is non-empty.
2954
- ///
2955
- /// Owner-only, and it REFUSES once any memory exists — so it can only ever add the initial
2956
- /// placeholder and can never overwrite real content. Deliberately NOT counted as a write (no
2957
- /// `totalMemoryWrites`, no `firstWriteAt`): it is a system seed rather than activity, and
2958
- /// counting it would corrupt both the write metrics and time-to-first-write for every engram.
2959
- seedMemory: (path: text, content: blob) -> (Result);
2960
2920
  /// Append to a memory file against a PAID x402 session voucher — the write half of the paid rail,
2961
2921
  /// authorized by the voucher rather than by a role.
2962
2922
  /// ⟨2026-09-30, ic402 2.17.0⟩ Authorized by the payer's own call with the voucher: only the
@@ -3000,7 +2960,7 @@ type Engram =
3000
2960
  /// ⚠ RAW STORED BYTES, like `readMemoryBatch`. On a Private (encrypted) engram the content is
3001
2961
  /// CIPHERTEXT; the key-holding SDK decrypts it. A caller without the key gets bytes it cannot
3002
2962
  /// read, not an error.
3003
- sessionReadContext: (clientLabel: text) -> (Result_12);
2963
+ sessionReadContext: (clientLabel: text) -> (Result_11);
3004
2964
  /// Read one memory file against a PAID x402 session voucher. No role, no invite — the voucher is
3005
2965
  /// the authorization, which is what makes this the engram's one rail a stranger can pay to use.
3006
2966
  ///
@@ -3030,7 +2990,7 @@ type Engram =
3030
2990
  /// session must not be the side door: without this guard a stranger holding a fraction-of-a-
3031
2991
  /// cent voucher could read `secrets/*`.
3032
2992
  /// · Payments are frozen on this engram.
3033
- sessionReadMemory: (voucher: Voucher, path: text) -> (Result_11);
2993
+ sessionReadMemory: (voucher: Voucher, path: text) -> (Result_10);
3034
2994
  /// Configure action alerts: an https webhook that receives new chained-audit entries matching the
3035
2995
  /// enabled event classes (money / approvals / guardian / agentWrites), batched, at most one
3036
2996
  /// POST per minute. Owner-only. Payloads carry audit METADATA (operation, caller, role, bounded
@@ -3070,7 +3030,7 @@ type Engram =
3070
3030
  /// called it an "ops floor: retention enforcement deletes owner backup data silently", mitigated
3071
3031
  /// by a `Debug.print` nobody reads. An owner lowering the cap is destroying their own backups;
3072
3032
  /// they are told how many, in the reply and in the audit line.
3073
- setBackupRetention: (dbType: text, maxBackups: nat) -> (Result_10);
3033
+ setBackupRetention: (dbType: text, maxBackups: nat) -> (Result_9);
3074
3034
  /// Override the caps for ONE caller — an agent this owner trusts more, or less, than the rest.
3075
3035
  setCallerSpendPolicy: (caller: principal, policy: SpendingPolicy) ->
3076
3036
  (Result_1);
@@ -3297,7 +3257,7 @@ type Engram =
3297
3257
  maxFeePerGas: nat;
3298
3258
  maxPriorityFeePerGas: nat;
3299
3259
  nonce: nat;
3300
- }) -> (Result_9);
3260
+ }) -> (Result_8);
3301
3261
  /// Sign an EIP-3009 authorization for x402 payment. Agent-accessible.
3302
3262
  /// Client probes the URL, extracts chain/token/recipient/amount from the 402, and calls this.
3303
3263
  /// Canister signs → returns header → client retries with header.
@@ -3329,33 +3289,6 @@ type Engram =
3329
3289
  tokenName: text;
3330
3290
  tokenVersion: text;
3331
3291
  }) -> (Result_3);
3332
- /// Self-heal: if the registry's spawn-time push was missed, the owner pulls the number from
3333
- /// the spawning registry. Idempotent; fails closed if the registry has no record.
3334
- syncEngramNumber: () -> (Result_8);
3335
- /// Genesis seed — the atomic "spawn only when there's real content" primitive. The spawning
3336
- /// REGISTRY pushes the owner's first real memory immediately after install, so a canister is
3337
- /// never spawned holding nothing (see the registry's `provisionEngram` optional genesis).
3338
- ///
3339
- /// Gated `spawnedBy`-only and ONE-SHOT: it refuses once any file exists, so it can seed and never
3340
- /// overwrite. Unlike the owner-only `seedMemory` placeholder this is REAL owner content, so it
3341
- /// IS counted as an owner write (`firstWriteAt`, `totalMemoryWrites`) and is authored by the
3342
- /// OWNER rather than by the registry principal that called it. It never touches the
3343
- /// agent metrics.
3344
- ///
3345
- /// ⚠ THE PAYLOAD IS `Nat` AND MUST STAY `Nat`, which is a constraint on any client of this
3346
- /// method rather than an internal detail. Its only caller is the registry, over an
3347
- /// inter-canister boundary, through a hand-declared actor type — and the registry is ROUTINELY a
3348
- /// different version from the engram template it is seeding: it upgrades before the fleet does,
3349
- /// and during a transition it can serve a template older than itself. A return-type change here
3350
- /// breaks genesis provisioning across that skew. That is measured, not predicted: the registry
3351
- /// trapped with "IDL error: unexpected IDL type when parsing Nat" while seeding an engram built
3352
- /// at the staging tag. A receipt would buy nothing anyway — the caller does `ignore await`.
3353
- ///
3354
- /// ⚠ ORDERING: upload the engram TEMPLATE first, then upgrade the registry. The reverse leaves a
3355
- /// window where a spawn seeds an old-shape engram with a new-shape expectation; the reply fails
3356
- /// to decode and `provisionEngram` dies on a trap its own `try/catch` cannot reach (ADR-0001),
3357
- /// failing the WHOLE SPAWN rather than just the seed.
3358
- sysApplyGenesisSeed: (path: text, content: blob) -> (Result_8);
3359
3292
  /// OWNER force-close, for a session the payer abandoned.
3360
3293
  ///
3361
3294
  /// ⟨R1b, ruled 2026-08-26: owner-gated, NO guardian.⟩ It moves someone else's money, and only ever
@@ -3532,9 +3465,6 @@ type Engram =
3532
3465
  /// nobody but the spawning registry can fix it. That refusal therefore names the real remedy
3533
3466
  /// rather than telling an owner to run a call they can no longer make.
3534
3467
  sysSetBillerId: (id: principal) -> (Result_1);
3535
- /// One-shot assignment of the spawn ordinal — callable ONLY by the spawning registry, ONLY
3536
- /// while unset. Neither the owner nor any later registry can change an assigned number.
3537
- sysSetEngramNumber: (n: nat) -> (Result_1);
3538
3468
  /// Point this engram at the commerce satellite allowed to ask it for signatures. ⟨0.16.0, B1⟩
3539
3469
  ///
3540
3470
  /// SAME AUTHORITY AS `sysSetBillerId`, and for a stronger reason. That one routes money; this one
@@ -4050,8 +3980,6 @@ type About =
4050
3980
  agentMemoryWrites: nat;
4051
3981
  auditLogSize: nat;
4052
3982
  backupCount: nat;
4053
- distinctReaderClients: nat;
4054
- distinctReaderPrincipals: nat;
4055
3983
  encryptionEnabled: bool;
4056
3984
  firstAgentWriteAtNs: opt int;
4057
3985
  firstWriteAtNs: opt int;
@@ -7,7 +7,6 @@ export interface About {
7
7
  guardianCount: bigint;
8
8
  totalMemoryWrites: bigint;
9
9
  lastAgentWriteAtNs: [] | [bigint];
10
- distinctReaderPrincipals: bigint;
11
10
  lastWriteAtNs: [] | [bigint];
12
11
  totalBackupSize: bigint;
13
12
  backupCount: bigint;
@@ -24,7 +23,6 @@ export interface About {
24
23
  firstAgentWriteAtNs: [] | [bigint];
25
24
  lastReadAtNs: [] | [bigint];
26
25
  writesPaused: boolean;
27
- distinctReaderClients: bigint;
28
26
  totalMemoryReads: bigint;
29
27
  walletActivatedAtNs: [] | [bigint];
30
28
  encryptionEnabled: boolean;
@@ -548,7 +546,7 @@ export interface Engram {
548
546
  * / pair — e6 base units of the token named first. A name only: Candid passes arguments by
549
547
  * / position, so nothing on the wire moved.
550
548
  */
551
- convertEarningsToCycles: ActorMethod<[string, bigint], Result_8>;
549
+ convertEarningsToCycles: ActorMethod<[string, bigint], Result_12>;
552
550
  /**
553
551
  * / Owner-only: mint a single-use invite code an agent redeems with `pairAgent`.
554
552
  * /
@@ -626,37 +624,6 @@ export interface Engram {
626
624
  * / does not change the policy — the next request over the same limit will be raised again.
627
625
  */
628
626
  denyRequest: ActorMethod<[string, string], Result_1>;
629
- /**
630
- * / Force the tECDSA derivation and return the address.
631
- * /
632
- * / It exists because the gateway's own derivation fires from a timer that is lazy on some
633
- * / replicas, and until it lands the EVM quote advertises the `0x0` fallback and settle fails
634
- * / closed — a live money surface quoting an address that cannot receive.
635
- * /
636
- * / ⟨0.16.0, B-2⟩ Derivation now comes from `EvmIdentity`, and the return type carries the
637
- * / outcome: this used to answer `""` on failure, which is a Text a caller can and did paste into
638
- * / a payment flow. An empty string is not an address, and saying so is the difference between a
639
- * / failed derivation and an address of nothing.
640
- * /
641
- * / ⚠ TRANSITIONAL: it also primes the ic402 gate, because the gate still settles commerce on this
642
- * / canister until those 47 methods move. That second call disappears with them — it is listed in
643
- * / the move order in the spec's B-2 addendum, not left for someone to find.
644
- * /
645
- * / PUBLIC: it inherits `getEvmAddress`'s gate rather than choosing one, and could not usefully be
646
- * / narrower — it exists so a caller can make the derivation happen BEFORE a payment flow, and the
647
- * / derivation itself is ungated. Idempotent and bounded to the same one-derivation-per-lifetime
648
- * / work, so an anonymous caller can cause it once and no more.
649
- * / ⟨L7⟩ UPDATE, NOT QUERY, and this one does not merely await — it WRITES. The body awaits
650
- * / `EvmIdentity.deriveAddress` (the management canister's `ecdsa_public_key`) and
651
- * / `gate.deriveEvmRecipientAt` ⟨renamed 2026-09-22 with the path⟩, then caches the result in `evmAddressCache`. So a query is
652
- * / impossible twice over: it could not await the derivation, and it could not keep the answer.
653
- * / Named `ensure*` rather than `get*` for that reason — the write is the point, and a read verb
654
- * / would have promised a cheapness this cannot deliver.
655
- * /
656
- * / ⟨Marker added 2026-08-23; the census row said "L7 mark added per review" and no mark was at
657
- * / the site.⟩
658
- */
659
- ensureEvmReady: ActorMethod<[], Result_44>;
660
627
  /**
661
628
  * / Record that log entries [fromSeq, toSeq] were served, and return the root that proves it.
662
629
  * /
@@ -858,12 +825,6 @@ export interface Engram {
858
825
  * / be discovered, and the ERC-8004 ecosystem it participates in assumes an open read.
859
826
  */
860
827
  getEngramCard: ActorMethod<[], AgentCard>;
861
- /**
862
- * / PUBLIC: the engram's permanent spawn ordinal — a provable, non-sensitive fact. It identifies a
863
- * / canister, never a person.
864
- * / null = spawned before numbering existed; the owner can backfill via syncEngramNumber().
865
- */
866
- getEngramNumber: ActorMethod<[], [] | [bigint]>;
867
828
  /**
868
829
  * / Re-pointed at `EvmIdentity` (B-2): custody derivation no longer routes through the ic402
869
830
  * / Gateway, which is leaving for the market canister. Behaviour is unchanged for a caller — same
@@ -1792,7 +1753,7 @@ export interface Engram {
1792
1753
  * / and this never inspects an operation or a role. Widening what the review shows therefore
1793
1754
  * / changes only which ids the console can pass here — it cannot desynchronise the cursor.
1794
1755
  */
1795
- markAgentWritesReviewed: ActorMethod<[[] | [bigint]], Result_8>;
1756
+ markAgentWritesReviewed: ActorMethod<[[] | [bigint]], Result_12>;
1796
1757
  /**
1797
1758
  * / The AGENT's current key nominates the key that will replace it. Nothing moves yet: the new
1798
1759
  * / key must accept, by its own call, within 24 hours (`acceptAgentKeyNomination`). One pending
@@ -1840,7 +1801,7 @@ export interface Engram {
1840
1801
  * / NOT freeze-gated: the owner always controls their own funds.
1841
1802
  * / Guardian freeze only blocks agent/public operations.
1842
1803
  */
1843
- ownerWithdraw: ActorMethod<[TokenAmount, [] | [ActionAuth]], Result_8>;
1804
+ ownerWithdraw: ActorMethod<[TokenAmount, [] | [ActionAuth]], Result_12>;
1844
1805
  /**
1845
1806
  * / ⟨0.16.0⟩ `payRentFromEarnings` DELETED — ruled TWICE (B1 and B2), and it was the single
1846
1807
  * / clearest violation of the OSS/platform split in this repo.
@@ -1969,7 +1930,7 @@ export interface Engram {
1969
1930
  * / (`sessionReadContext` and the MCP reads). A caller measuring engram usage from this method
1970
1931
  * / will measure nothing.
1971
1932
  */
1972
- readMemory: ActorMethod<[string], Result_11>;
1933
+ readMemory: ActorMethod<[string], Result_10>;
1973
1934
  /**
1974
1935
  * / Read many paths in one call. Per-path Results are KEPT — partial success is the point, and
1975
1936
  * / one unreadable path must not fail the other nine.
@@ -2118,7 +2079,7 @@ export interface Engram {
2118
2079
  * / the original audit entry stay exactly where they were; this appends a chained
2119
2080
  * / `memory.repudiate` entry and lists the (path, version) so readers can see the dispute.
2120
2081
  */
2121
- repudiateMemoryWrite: ActorMethod<[string, bigint, string], Result_8>;
2082
+ repudiateMemoryWrite: ActorMethod<[string, bigint, string], Result_12>;
2122
2083
  /**
2123
2084
  * / ⚠ OWNER-ONLY BULK RESET. Destructive, and wider than its name suggests.
2124
2085
  * /
@@ -2262,7 +2223,7 @@ export interface Engram {
2262
2223
  * / that fails leaves the agents revoked here regardless — a partial notify is not a partial
2263
2224
  * / revocation, which is the direction that matters for a panic button.
2264
2225
  */
2265
- revokeAllAgents: ActorMethod<[], Result_8>;
2226
+ revokeAllAgents: ActorMethod<[], Result_12>;
2266
2227
  /**
2267
2228
  * / Owner-only panic button: revoke every connector bearer token at once. Returns how many.
2268
2229
  * /
@@ -2273,7 +2234,7 @@ export interface Engram {
2273
2234
  * /
2274
2235
  * / Tokens are re-issuable: revoking them is not permanent the way revoking an agent is.
2275
2236
  */
2276
- revokeAllBearerTokens: ActorMethod<[], Result_8>;
2237
+ revokeAllBearerTokens: ActorMethod<[], Result_12>;
2277
2238
  /**
2278
2239
  * / ⟨0.16.0⟩ `removeAllGuardians` DELETED — test-only (L6), and verified NOT part of KILL-SWITCH's
2279
2240
  * / mass-revoke set. The destructive phase-07 suite iterates `removeGuardian` instead, so nothing
@@ -2287,7 +2248,7 @@ export interface Engram {
2287
2248
  * / Unlike revoking an agent, this costs nothing permanently — an invite is a one-time code,
2288
2249
  * / so voiding it and minting a fresh one is the ordinary path.
2289
2250
  */
2290
- revokeAllInvites: ActorMethod<[], Result_8>;
2251
+ revokeAllInvites: ActorMethod<[], Result_12>;
2291
2252
  /**
2292
2253
  * / Revoke a bearer token by its public tokenId. Idempotent.
2293
2254
  * / Subsequent /mcp requests using this token will be rejected.
@@ -2320,15 +2281,6 @@ export interface Engram {
2320
2281
  * / agent reading `#Refused` would go looking for a permission that was never missing.
2321
2282
  */
2322
2283
  rotateAgentKeyHash: ActorMethod<[string], Result_1>;
2323
- /**
2324
- * / One-time onboarding seed: writes a starter file so the first read-back is non-empty.
2325
- * /
2326
- * / Owner-only, and it REFUSES once any memory exists — so it can only ever add the initial
2327
- * / placeholder and can never overwrite real content. Deliberately NOT counted as a write (no
2328
- * / `totalMemoryWrites`, no `firstWriteAt`): it is a system seed rather than activity, and
2329
- * / counting it would corrupt both the write metrics and time-to-first-write for every engram.
2330
- */
2331
- seedMemory: ActorMethod<[string, Uint8Array | number[]], Result>;
2332
2284
  /**
2333
2285
  * / Append to a memory file against a PAID x402 session voucher — the write half of the paid rail,
2334
2286
  * / authorized by the voucher rather than by a role.
@@ -2375,7 +2327,7 @@ export interface Engram {
2375
2327
  * / CIPHERTEXT; the key-holding SDK decrypts it. A caller without the key gets bytes it cannot
2376
2328
  * / read, not an error.
2377
2329
  */
2378
- sessionReadContext: ActorMethod<[string], Result_12>;
2330
+ sessionReadContext: ActorMethod<[string], Result_11>;
2379
2331
  /**
2380
2332
  * / Read one memory file against a PAID x402 session voucher. No role, no invite — the voucher is
2381
2333
  * / the authorization, which is what makes this the engram's one rail a stranger can pay to use.
@@ -2407,7 +2359,7 @@ export interface Engram {
2407
2359
  * / cent voucher could read `secrets/*`.
2408
2360
  * / · Payments are frozen on this engram.
2409
2361
  */
2410
- sessionReadMemory: ActorMethod<[Voucher, string], Result_11>;
2362
+ sessionReadMemory: ActorMethod<[Voucher, string], Result_10>;
2411
2363
  /**
2412
2364
  * / Configure action alerts: an https webhook that receives new chained-audit entries matching the
2413
2365
  * / enabled event classes (money / approvals / guardian / agentWrites), batched, at most one
@@ -2454,7 +2406,7 @@ export interface Engram {
2454
2406
  * / by a `Debug.print` nobody reads. An owner lowering the cap is destroying their own backups;
2455
2407
  * / they are told how many, in the reply and in the audit line.
2456
2408
  */
2457
- setBackupRetention: ActorMethod<[string, bigint], Result_10>;
2409
+ setBackupRetention: ActorMethod<[string, bigint], Result_9>;
2458
2410
  /**
2459
2411
  * / Override the caps for ONE caller — an agent this owner trusts more, or less, than the rest.
2460
2412
  */
@@ -2706,7 +2658,7 @@ export interface Engram {
2706
2658
  maxPriorityFeePerGas: bigint;
2707
2659
  },
2708
2660
  ],
2709
- Result_9
2661
+ Result_8
2710
2662
  >;
2711
2663
  /**
2712
2664
  * / Sign an EIP-3009 authorization for x402 payment. Agent-accessible.
@@ -2745,37 +2697,6 @@ export interface Engram {
2745
2697
  ],
2746
2698
  Result_3
2747
2699
  >;
2748
- /**
2749
- * / Self-heal: if the registry's spawn-time push was missed, the owner pulls the number from
2750
- * / the spawning registry. Idempotent; fails closed if the registry has no record.
2751
- */
2752
- syncEngramNumber: ActorMethod<[], Result_8>;
2753
- /**
2754
- * / Genesis seed — the atomic "spawn only when there's real content" primitive. The spawning
2755
- * / REGISTRY pushes the owner's first real memory immediately after install, so a canister is
2756
- * / never spawned holding nothing (see the registry's `provisionEngram` optional genesis).
2757
- * /
2758
- * / Gated `spawnedBy`-only and ONE-SHOT: it refuses once any file exists, so it can seed and never
2759
- * / overwrite. Unlike the owner-only `seedMemory` placeholder this is REAL owner content, so it
2760
- * / IS counted as an owner write (`firstWriteAt`, `totalMemoryWrites`) and is authored by the
2761
- * / OWNER rather than by the registry principal that called it. It never touches the
2762
- * / agent metrics.
2763
- * /
2764
- * / ⚠ THE PAYLOAD IS `Nat` AND MUST STAY `Nat`, which is a constraint on any client of this
2765
- * / method rather than an internal detail. Its only caller is the registry, over an
2766
- * / inter-canister boundary, through a hand-declared actor type — and the registry is ROUTINELY a
2767
- * / different version from the engram template it is seeding: it upgrades before the fleet does,
2768
- * / and during a transition it can serve a template older than itself. A return-type change here
2769
- * / breaks genesis provisioning across that skew. That is measured, not predicted: the registry
2770
- * / trapped with "IDL error: unexpected IDL type when parsing Nat" while seeding an engram built
2771
- * / at the staging tag. A receipt would buy nothing anyway — the caller does `ignore await`.
2772
- * /
2773
- * / ⚠ ORDERING: upload the engram TEMPLATE first, then upgrade the registry. The reverse leaves a
2774
- * / window where a spawn seeds an old-shape engram with a new-shape expectation; the reply fails
2775
- * / to decode and `provisionEngram` dies on a trap its own `try/catch` cannot reach (ADR-0001),
2776
- * / failing the WHOLE SPAWN rather than just the seed.
2777
- */
2778
- sysApplyGenesisSeed: ActorMethod<[string, Uint8Array | number[]], Result_8>;
2779
2700
  /**
2780
2701
  * / OWNER force-close, for a session the payer abandoned.
2781
2702
  * /
@@ -2972,11 +2893,6 @@ export interface Engram {
2972
2893
  * / rather than telling an owner to run a call they can no longer make.
2973
2894
  */
2974
2895
  sysSetBillerId: ActorMethod<[Principal], Result_1>;
2975
- /**
2976
- * / One-shot assignment of the spawn ordinal — callable ONLY by the spawning registry, ONLY
2977
- * / while unset. Neither the owner nor any later registry can change an assigned number.
2978
- */
2979
- sysSetEngramNumber: ActorMethod<[bigint], Result_1>;
2980
2896
  /**
2981
2897
  * / Point this engram at the commerce satellite allowed to ask it for signatures. ⟨0.16.0, B1⟩
2982
2898
  * /
@@ -3623,9 +3539,9 @@ export interface ResetReport {
3623
3539
  }
3624
3540
  export type Result = { Ok: WriteReceipt } | { Err: Error };
3625
3541
  export type Result_1 = { Ok: null } | { Err: Error };
3626
- export type Result_10 = { Ok: BackupRetentionReport } | { Err: Error };
3627
- export type Result_11 = { Ok: MemoryFile } | { Err: Error };
3628
- export type Result_12 = { Ok: SessionContext } | { Err: Error };
3542
+ export type Result_10 = { Ok: MemoryFile } | { Err: Error };
3543
+ export type Result_11 = { Ok: SessionContext } | { Err: Error };
3544
+ export type Result_12 = { Ok: bigint } | { Err: Error };
3629
3545
  export type Result_13 = { Ok: ResyncReport } | { Err: Error };
3630
3546
  export type Result_14 = { Ok: ResetReport } | { Err: Error };
3631
3547
  export type Result_15 = { Ok: GuardianRecord } | { Err: Error };
@@ -3690,8 +3606,8 @@ export type Result_69 = { Ok: { activatesAtNs: bigint } } | { Err: Error };
3690
3606
  export type Result_7 = { Ok: Array<Seat> } | { Err: Error };
3691
3607
  export type Result_70 = { Ok: Eip712Registration } | { Err: Error };
3692
3608
  export type Result_71 = { Ok: AgentRecord } | { Err: Error };
3693
- export type Result_8 = { Ok: bigint } | { Err: Error };
3694
- export type Result_9 = { Ok: SignedTransaction } | { Err: Error };
3609
+ export type Result_8 = { Ok: SignedTransaction } | { Err: Error };
3610
+ export type Result_9 = { Ok: BackupRetentionReport } | { Err: Error };
3695
3611
  export interface ResyncReport {
3696
3612
  startsAcknowledged: bigint;
3697
3613
  cannotBeRecorded: Array<UnrecordableEngagement>;
@@ -4,7 +4,6 @@ export const idlFactory = ({ IDL }) => {
4
4
  guardianCount: IDL.Nat,
5
5
  totalMemoryWrites: IDL.Nat,
6
6
  lastAgentWriteAtNs: IDL.Opt(IDL.Int),
7
- distinctReaderPrincipals: IDL.Nat,
8
7
  lastWriteAtNs: IDL.Opt(IDL.Int),
9
8
  totalBackupSize: IDL.Nat,
10
9
  backupCount: IDL.Nat,
@@ -21,7 +20,6 @@ export const idlFactory = ({ IDL }) => {
21
20
  firstAgentWriteAtNs: IDL.Opt(IDL.Int),
22
21
  lastReadAtNs: IDL.Opt(IDL.Int),
23
22
  writesPaused: IDL.Bool,
24
- distinctReaderClients: IDL.Nat,
25
23
  totalMemoryReads: IDL.Nat,
26
24
  walletActivatedAtNs: IDL.Opt(IDL.Int),
27
25
  encryptionEnabled: IDL.Bool,
@@ -145,7 +143,7 @@ export const idlFactory = ({ IDL }) => {
145
143
  });
146
144
  const Result_44 = IDL.Variant({ Ok: IDL.Text, Err: Error });
147
145
  const Result_60 = IDL.Variant({ Ok: IDL.Vec(IDL.Nat8), Err: Error });
148
- const Result_8 = IDL.Variant({ Ok: IDL.Nat, Err: Error });
146
+ const Result_12 = IDL.Variant({ Ok: IDL.Nat, Err: Error });
149
147
  const MemoryRangeExport = IDL.Record({
150
148
  seq: IDL.Nat,
151
149
  toSeq: IDL.Nat,
@@ -938,7 +936,7 @@ export const idlFactory = ({ IDL }) => {
938
936
  lastModifiedBy: IDL.Principal,
939
937
  lastModifiedAtNs: IDL.Int,
940
938
  });
941
- const Result_11 = IDL.Variant({ Ok: MemoryFile, Err: Error });
939
+ const Result_10 = IDL.Variant({ Ok: MemoryFile, Err: Error });
942
940
  const BatchReadItem = IDL.Record({
943
941
  result: IDL.Variant({ Ok: MemoryFile, Err: Error }),
944
942
  path: IDL.Text,
@@ -998,16 +996,13 @@ export const idlFactory = ({ IDL }) => {
998
996
  includedFiles: IDL.Nat,
999
997
  totalBytes: IDL.Nat,
1000
998
  });
1001
- const Result_12 = IDL.Variant({ Ok: SessionContext, Err: Error });
999
+ const Result_11 = IDL.Variant({ Ok: SessionContext, Err: Error });
1002
1000
  const BackupRetentionReport = IDL.Record({
1003
1001
  maxBackups: IDL.Nat,
1004
1002
  dbType: IDL.Text,
1005
1003
  prunedBackups: IDL.Nat,
1006
1004
  });
1007
- const Result_10 = IDL.Variant({
1008
- Ok: BackupRetentionReport,
1009
- Err: Error,
1010
- });
1005
+ const Result_9 = IDL.Variant({ Ok: BackupRetentionReport, Err: Error });
1011
1006
  const Eip712Value = IDL.Variant({
1012
1007
  string: IDL.Text,
1013
1008
  bool: IDL.Bool,
@@ -1028,7 +1023,7 @@ export const idlFactory = ({ IDL }) => {
1028
1023
  txHash: IDL.Text,
1029
1024
  rawTx: IDL.Text,
1030
1025
  });
1031
- const Result_9 = IDL.Variant({ Ok: SignedTransaction, Err: Error });
1026
+ const Result_8 = IDL.Variant({ Ok: SignedTransaction, Err: Error });
1032
1027
  const SignedAuthorization = IDL.Record({
1033
1028
  paidAmount: IDL.Nat,
1034
1029
  authorization: IDL.Record({
@@ -1140,13 +1135,12 @@ export const idlFactory = ({ IDL }) => {
1140
1135
  backupPushChunk: IDL.Func([IDL.Text, IDL.Nat, IDL.Vec(IDL.Nat8)], [Result_1], []),
1141
1136
  cancelAgentKeyNomination: IDL.Func([IDL.Principal], [Result_1], []),
1142
1137
  closeSession: IDL.Func([IDL.Text], [Result_1], []),
1143
- convertEarningsToCycles: IDL.Func([IDL.Text, IDL.Nat], [Result_8], []),
1138
+ convertEarningsToCycles: IDL.Func([IDL.Text, IDL.Nat], [Result_12], []),
1144
1139
  createAgentInvite: IDL.Func([IDL.Text, AgentPermissions], [Result_44], []),
1145
1140
  createGuardianInvite: IDL.Func([IDL.Text, GuardianPermissions], [Result_44], []),
1146
1141
  deleteBackup: IDL.Func([IDL.Text], [Result_1], []),
1147
1142
  deleteMemoryFile: IDL.Func([IDL.Text], [Result], []),
1148
1143
  denyRequest: IDL.Func([IDL.Text, IDL.Text], [Result_1], []),
1149
- ensureEvmReady: IDL.Func([], [Result_44], []),
1150
1144
  exportMemoryRange: IDL.Func([IDL.Nat, IDL.Nat, IDL.Opt(IDL.Principal)], [Result_67], []),
1151
1145
  freezePayments: IDL.Func([], [Result_1], []),
1152
1146
  getActionAlertStatus: IDL.Func([], [Result_58], ['query']),
@@ -1162,7 +1156,6 @@ export const idlFactory = ({ IDL }) => {
1162
1156
  getChildOpening: IDL.Func([], [Result_61], ['query']),
1163
1157
  getEncryptedMemoryKey: IDL.Func([IDL.Opt(IDL.Nat), IDL.Vec(IDL.Nat8)], [Result_60], []),
1164
1158
  getEngramCard: IDL.Func([], [AgentCard], ['query']),
1165
- getEngramNumber: IDL.Func([], [IDL.Opt(IDL.Nat)], ['query']),
1166
1159
  getEvmAddress: IDL.Func([], [Result_59], []),
1167
1160
  getEvmOwnerAddress: IDL.Func([], [IDL.Opt(IDL.Text)], ['query']),
1168
1161
  getEvmSignerAddress: IDL.Func([], [Result_44], []),
@@ -1258,16 +1251,16 @@ export const idlFactory = ({ IDL }) => {
1258
1251
  listPurgedAgents: IDL.Func([IDL.Nat, IDL.Nat], [Result_25], ['query']),
1259
1252
  listReadLog: IDL.Func([IDL.Opt(IDL.Bool), IDL.Nat, IDL.Nat], [Result_24], ['query']),
1260
1253
  listRepudiations: IDL.Func([IDL.Nat, IDL.Nat], [Result_23], ['query']),
1261
- markAgentWritesReviewed: IDL.Func([IDL.Opt(IDL.Nat)], [Result_8], []),
1254
+ markAgentWritesReviewed: IDL.Func([IDL.Opt(IDL.Nat)], [Result_12], []),
1262
1255
  nominateAgentKey: IDL.Func([IDL.Principal], [Result_1], []),
1263
1256
  openChildEngram: IDL.Func([], [Result_22], []),
1264
1257
  openSession: IDL.Func([SessionConfig, PaymentSignature], [Result_21], []),
1265
- ownerWithdraw: IDL.Func([TokenAmount, IDL.Opt(ActionAuth)], [Result_8], []),
1258
+ ownerWithdraw: IDL.Func([TokenAmount, IDL.Opt(ActionAuth)], [Result_12], []),
1266
1259
  pairAgent: IDL.Func([IDL.Record({ enrolment: Enrolment, code: IDL.Text })], [Result_20], []),
1267
1260
  pauseWrites: IDL.Func([], [Result_1], []),
1268
1261
  previewCondense: IDL.Func([IDL.Nat], [Result_19], ['query']),
1269
1262
  previewOpenSession: IDL.Func([], [SessionIntent], ['query']),
1270
- readMemory: IDL.Func([IDL.Text], [Result_11], ['query']),
1263
+ readMemory: IDL.Func([IDL.Text], [Result_10], ['query']),
1271
1264
  readMemoryBatch: IDL.Func([IDL.Vec(IDL.Text)], [Result_18], ['query']),
1272
1265
  readMemoryBytes: IDL.Func(
1273
1266
  [IDL.Text, IDL.Nat, IDL.Nat, IDL.Opt(IDL.Nat)],
@@ -1280,7 +1273,7 @@ export const idlFactory = ({ IDL }) => {
1280
1273
  removeEip712Type: IDL.Func([IDL.Vec(IDL.Nat8)], [Result_1], []),
1281
1274
  removeEvmWithdrawDestination: IDL.Func([IDL.Text], [Result_1], []),
1282
1275
  removeGuardian: IDL.Func([IDL.Principal], [Result_1], []),
1283
- repudiateMemoryWrite: IDL.Func([IDL.Text, IDL.Nat, IDL.Text], [Result_8], []),
1276
+ repudiateMemoryWrite: IDL.Func([IDL.Text, IDL.Nat, IDL.Text], [Result_12], []),
1284
1277
  resetEngram: IDL.Func([], [Result_14], []),
1285
1278
  resignAgent: IDL.Func([], [Result_1], []),
1286
1279
  resumeWrites: IDL.Func([], [Result_1], []),
@@ -1288,20 +1281,19 @@ export const idlFactory = ({ IDL }) => {
1288
1281
  returnToManaged: IDL.Func([], [Result_1], []),
1289
1282
  reviseMemory: IDL.Func([IDL.Text, IDL.Vec(IDL.Nat8)], [Result], []),
1290
1283
  revokeAgent: IDL.Func([IDL.Principal], [Result_1], []),
1291
- revokeAllAgents: IDL.Func([], [Result_8], []),
1292
- revokeAllBearerTokens: IDL.Func([], [Result_8], []),
1293
- revokeAllInvites: IDL.Func([], [Result_8], []),
1284
+ revokeAllAgents: IDL.Func([], [Result_12], []),
1285
+ revokeAllBearerTokens: IDL.Func([], [Result_12], []),
1286
+ revokeAllInvites: IDL.Func([], [Result_12], []),
1294
1287
  revokeBearerToken: IDL.Func([IDL.Text], [Result_1], []),
1295
1288
  rollbackMemory: IDL.Func([IDL.Text, IDL.Nat], [Result], []),
1296
1289
  rotateAgentKeyHash: IDL.Func([IDL.Text], [Result_1], []),
1297
- seedMemory: IDL.Func([IDL.Text, IDL.Vec(IDL.Nat8)], [Result], []),
1298
1290
  sessionAppendMemory: IDL.Func([Voucher, IDL.Text, IDL.Vec(IDL.Nat8)], [Result], []),
1299
- sessionReadContext: IDL.Func([IDL.Text], [Result_12], []),
1300
- sessionReadMemory: IDL.Func([Voucher, IDL.Text], [Result_11], []),
1291
+ sessionReadContext: IDL.Func([IDL.Text], [Result_11], []),
1292
+ sessionReadMemory: IDL.Func([Voucher, IDL.Text], [Result_10], []),
1301
1293
  setActionAlertConfig: IDL.Func([AlertConfig], [Result_1], []),
1302
1294
  setAgentPermissions: IDL.Func([IDL.Principal, AgentPermissions], [Result_1], []),
1303
1295
  setAgentRevisablePaths: IDL.Func([IDL.Vec(IDL.Text)], [Result_1], []),
1304
- setBackupRetention: IDL.Func([IDL.Text, IDL.Nat], [Result_10], []),
1296
+ setBackupRetention: IDL.Func([IDL.Text, IDL.Nat], [Result_9], []),
1305
1297
  setCallerSpendPolicy: IDL.Func([IDL.Principal, SpendingPolicy], [Result_1], []),
1306
1298
  setChildAllowance: IDL.Func([IDL.Principal, IDL.Nat], [Result_1], []),
1307
1299
  setEncryptionEnabled: IDL.Func([IDL.Bool], [Result_1], []),
@@ -1338,7 +1330,7 @@ export const idlFactory = ({ IDL }) => {
1338
1330
  maxPriorityFeePerGas: IDL.Nat,
1339
1331
  }),
1340
1332
  ],
1341
- [Result_9],
1333
+ [Result_8],
1342
1334
  [],
1343
1335
  ),
1344
1336
  signX402Payment: IDL.Func(
@@ -1357,8 +1349,6 @@ export const idlFactory = ({ IDL }) => {
1357
1349
  [Result_3],
1358
1350
  [],
1359
1351
  ),
1360
- syncEngramNumber: IDL.Func([], [Result_8], []),
1361
- sysApplyGenesisSeed: IDL.Func([IDL.Text, IDL.Vec(IDL.Nat8)], [Result_8], []),
1362
1352
  sysForceCloseSession: IDL.Func([IDL.Text], [Result_1], []),
1363
1353
  sysGetAgentSeatWeeks: IDL.Func([], [Result_7], []),
1364
1354
  sysGetRailHealth: IDL.Func([], [Result_6], ['query']),
@@ -1377,7 +1367,6 @@ export const idlFactory = ({ IDL }) => {
1377
1367
  [],
1378
1368
  ),
1379
1369
  sysSetBillerId: IDL.Func([IDL.Principal], [Result_1], []),
1380
- sysSetEngramNumber: IDL.Func([IDL.Nat], [Result_1], []),
1381
1370
  sysSetMarketId: IDL.Func([IDL.Principal], [Result_1], []),
1382
1371
  sysSetMetricsReaderId: IDL.Func([IDL.Principal], [Result_1], []),
1383
1372
  sysSignEip712: IDL.Func(
package/dist/registry.did CHANGED
@@ -806,6 +806,9 @@ service : {
806
806
  /// on two canisters is what a hand-written client cannot tell apart (a structural actor type
807
807
  /// matches either target), so it gets the rule `getMarketCanister` already follows: distinct
808
808
  /// names on distinct canisters. `…Of` says what the argument is for.
809
+ ///
810
+ /// ⟨2026-10-13⟩ The engram no longer serves `getEngramNumber` at all: its copy of the number went
811
+ /// with the genesis seed, so this is the one read of an engram's number.
809
812
  getEngramNumberOf: (canisterId: principal) -> (opt nat) query;
810
813
  /// ⟨2026-10-01, the owner's ruling of that day (2 A)⟩ What a lasting key opened through a parent:
811
814
  /// the engram, the engram it was opened from, and the cut-off's time if there is one. GATED:
@@ -1315,16 +1318,16 @@ service : {
1315
1318
  /// `#Ok : { canisterId : Principal }` was a record with nothing to disambiguate: the success of a
1316
1319
  /// spawn IS the canister it produced. The wrapper cost every caller a field access to reach the
1317
1320
  /// only thing the call returns, and invited a second field later that would belong somewhere else.
1321
+ ///
1322
+ /// ⟨2026-10-13, the owner's 6A⟩ `opts.genesis` (an optional first file, written as the canister
1323
+ /// spawned) is retired: the console creates an engram with no content (decision 2 B(b),
1324
+ /// 2026-09-30), the owner kit never calls this, and only test harnesses passed one. A caller still
1325
+ /// sending the field is unaffected — Candid ignores a record field the receiver does not declare.
1318
1326
  provisionEngram: (opts:
1319
- opt
1320
- record {
1321
- genesis: opt record {
1322
- content: blob;
1323
- path: text;
1324
- };
1325
- invite: opt text;
1326
- walletProof: opt blob;
1327
- }) -> (Result_1);
1327
+ opt record {
1328
+ invite: opt text;
1329
+ walletProof: opt blob;
1330
+ }) -> (Result_1);
1328
1331
  removeAuditViewer: (viewer: principal) -> (Result);
1329
1332
  /// ⟨0.16.0⟩ `Ok` IS THE ANSWER — the `{ reserved : Bool }` wrapper is gone.
1330
1333
  ///
@@ -683,6 +683,9 @@ export interface _SERVICE {
683
683
  * / on two canisters is what a hand-written client cannot tell apart (a structural actor type
684
684
  * / matches either target), so it gets the rule `getMarketCanister` already follows: distinct
685
685
  * / names on distinct canisters. `…Of` says what the argument is for.
686
+ * /
687
+ * / ⟨2026-10-13⟩ The engram no longer serves `getEngramNumber` at all: its copy of the number went
688
+ * / with the genesis seed, so this is the one read of an engram's number.
686
689
  */
687
690
  getEngramNumberOf: ActorMethod<[Principal], [] | [bigint]>;
688
691
  /**
@@ -1277,6 +1280,11 @@ export interface _SERVICE {
1277
1280
  * / `#Ok : { canisterId : Principal }` was a record with nothing to disambiguate: the success of a
1278
1281
  * / spawn IS the canister it produced. The wrapper cost every caller a field access to reach the
1279
1282
  * / only thing the call returns, and invited a second field later that would belong somewhere else.
1283
+ * /
1284
+ * / ⟨2026-10-13, the owner's 6A⟩ `opts.genesis` (an optional first file, written as the canister
1285
+ * / spawned) is retired: the console creates an engram with no content (decision 2 B(b),
1286
+ * / 2026-09-30), the owner kit never calls this, and only test harnesses passed one. A caller still
1287
+ * / sending the field is unaffected — Candid ignores a record field the receiver does not declare.
1280
1288
  */
1281
1289
  provisionEngram: ActorMethod<
1282
1290
  [
@@ -1285,7 +1293,6 @@ export interface _SERVICE {
1285
1293
  {
1286
1294
  walletProof: [] | [Uint8Array | number[]];
1287
1295
  invite: [] | [string];
1288
- genesis: [] | [{ content: Uint8Array | number[]; path: string }];
1289
1296
  },
1290
1297
  ],
1291
1298
  ],
@@ -464,7 +464,6 @@ export const idlFactory = ({ IDL }) => {
464
464
  IDL.Record({
465
465
  walletProof: IDL.Opt(IDL.Vec(IDL.Nat8)),
466
466
  invite: IDL.Opt(IDL.Text),
467
- genesis: IDL.Opt(IDL.Record({ content: IDL.Vec(IDL.Nat8), path: IDL.Text })),
468
467
  }),
469
468
  ),
470
469
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@engramx/idl",
3
- "version": "0.16.0-rc.11",
3
+ "version": "0.16.0-rc.13",
4
4
  "description": "The Candid interfaces of the EngramX canisters (engram, registry, market) — the .did files and the JS/TS IDL factories generated from them, published with every release so code that calls them pins the interface by version.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "EngramX <developer@engramx.ai>",