@engramx/idl 0.16.0-rc.21 → 0.16.0-rc.22

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.
@@ -86,6 +86,11 @@ export interface ChangelogEntry {
86
86
  releaseNotes: string;
87
87
  version: string;
88
88
  }
89
+ export interface ChildSignInOffer {
90
+ parentActive: boolean;
91
+ parentIsFirstEngram: boolean;
92
+ parentOwner: [] | [Principal];
93
+ }
89
94
  export type ControlStep = { EngramMustMove: null } | { MovedByRegistry: null };
90
95
  export type CustodyMode = { Sovereign: null } | { Managed: null };
91
96
  export interface Dispute {
@@ -286,6 +291,23 @@ export interface ReferralCounts {
286
291
  throughParent: PairedSoon;
287
292
  agentsByTreesSpanned: TreesSpanned;
288
293
  }
294
+ export interface RegistryClockHealth {
295
+ nextWakeAtNs: [] | [bigint];
296
+ lastAttemptAtNs: [] | [bigint];
297
+ attemptTotal: [] | [bigint];
298
+ lastErrorAtNs: [] | [bigint];
299
+ okTotal: [] | [bigint];
300
+ overdue: [] | [bigint];
301
+ lastError: [] | [string];
302
+ lastOkAtNs: [] | [bigint];
303
+ }
304
+ export interface RegistryHealth {
305
+ anchors: [] | [AnchorStats];
306
+ adminRoles: [] | [AdminRoles];
307
+ atNs: [] | [bigint];
308
+ clock: [] | [RegistryClockHealth];
309
+ cycleReserve: [] | [{ cycleBalance: bigint; minOperatingReserveCycles: bigint }];
310
+ }
289
311
  export type ReleaseClass = { Security: null } | { Feature: null };
290
312
  export interface ReservationView {
291
313
  reservedAtNs: bigint;
@@ -318,7 +340,7 @@ export interface RestartTotals {
318
340
  advancePaid: bigint;
319
341
  }
320
342
  export type Result = { Ok: null } | { Err: Error };
321
- export type Result_1 = { Ok: Principal } | { Err: Error };
343
+ export type Result_1 = { Ok: { accepted: bigint } } | { Err: Error };
322
344
  export type Result_10 = { Ok: CustodyMode } | { Err: Error };
323
345
  export type Result_11 = { Ok: Array<string> } | { Err: Error };
324
346
  export type Result_12 = { Ok: Page } | { Err: Error };
@@ -329,17 +351,19 @@ export type Result_16 = { Ok: Array<OpenedEngram> } | { Err: Error };
329
351
  export type Result_17 = { Ok: Page_5 } | { Err: Error };
330
352
  export type Result_18 = { Ok: RecordPage } | { Err: Error };
331
353
  export type Result_19 = { Ok: Page_6 } | { Err: Error };
332
- export type Result_2 = { Ok: { accepted: bigint } } | { Err: Error };
354
+ export type Result_2 = { Ok: Principal } | { Err: Error };
333
355
  export type Result_20 = { Ok: [] | [string] } | { Err: Error };
334
- export type Result_21 = { Ok: ReferralCounts } | { Err: Error };
335
- export type Result_22 = { Ok: OpenedThrough } | { Err: Error };
336
- export type Result_23 = { Ok: OpeningCounts } | { Err: Error };
337
- export type Result_24 = { Ok: RestartStatus } | { Err: Error };
338
- export type Result_25 = { Ok: PrivateMetrics } | { Err: Error };
339
- export type Result_26 = { Ok: Uint8Array | number[] } | { Err: Error };
340
- export type Result_27 = { Ok: CertifiedStanding } | { Err: Error };
341
- export type Result_28 = { Ok: FleetCycleHealth } | { Err: Error };
356
+ export type Result_21 = { Ok: RegistryHealth } | { Err: Error };
357
+ export type Result_22 = { Ok: ReferralCounts } | { Err: Error };
358
+ export type Result_23 = { Ok: OpenedThrough } | { Err: Error };
359
+ export type Result_24 = { Ok: OpeningCounts } | { Err: Error };
360
+ export type Result_25 = { Ok: RestartStatus } | { Err: Error };
361
+ export type Result_26 = { Ok: PrivateMetrics } | { Err: Error };
362
+ export type Result_27 = { Ok: Uint8Array | number[] } | { Err: Error };
363
+ export type Result_28 = { Ok: ChildSignInOffer } | { Err: Error };
364
+ export type Result_29 = { Ok: CertifiedStanding } | { Err: Error };
342
365
  export type Result_3 = { Ok: ControlStep } | { Err: Error };
366
+ export type Result_30 = { Ok: FleetCycleHealth } | { Err: Error };
343
367
  export type Result_4 = { Ok: MeterReading } | { Err: Error };
344
368
  export type Result_5 = { Ok: { repaid: bigint; stillOwed: bigint } } | { Err: Error };
345
369
  export type Result_6 =
@@ -407,6 +431,9 @@ export interface _SERVICE {
407
431
  * / CANISTER ID, so an engram's ciphertext and wallet cannot follow it anywhere (engramx
408
432
  * / docs/ENCRYPTION-OPERATIONS.md, "Canister-id binding"). Abandoning is starting over, not
409
433
  * / migrating, and the caller must be told so before they do it.
434
+ * /
435
+ * / ⟨2026-11-02⟩ REFUSED for an engram opened through another: it is never abandoned, so it stays on
436
+ * / this registry's security updates for life; it ends by its parent's cut-off or by running dry.
410
437
  */
411
438
  abandonMyEngram: ActorMethod<[], Result>;
412
439
  addAuditViewer: ActorMethod<[Principal], Result>;
@@ -449,6 +476,9 @@ export interface _SERVICE {
449
476
  * / ⚠ IT IS REVERSIBLE, which is the fact most worth publishing: the engram's own
450
477
  * / `returnToManaged` adds the registry back ALONGSIDE the owner. Sovereignty is a door, not a
451
478
  * / cliff.
479
+ * /
480
+ * / ⟨2026-11-02, the owner's ruling "choice 4 without hand over"⟩ REFUSED for an engram opened
481
+ * / through another: it stays managed by this registry for life, and its key is never a controller.
452
482
  */
453
483
  claimSovereignty: ActorMethod<[], Result>;
454
484
  /**
@@ -514,7 +544,7 @@ export interface _SERVICE {
514
544
  * / this one is a noun. That gate now reads the census's L7 citations as a second population for
515
545
  * / exactly this blind spot.⟩
516
546
  */
517
- fleetCycleHealth: ActorMethod<[bigint, bigint, bigint], Result_28>;
547
+ fleetCycleHealth: ActorMethod<[bigint, bigint, bigint], Result_30>;
518
548
  /**
519
549
  * / PUBLIC: ⟨0.16.0, L2.4⟩ `fleetSummary` — the ONE public projection of this registry,
520
550
  * / replacing `status()` and ABSORBING `publicMetrics()`.
@@ -627,7 +657,7 @@ export interface _SERVICE {
627
657
  * / `listAgents`. "The agent itself" is a caller holding that root key. A key for one engram has no
628
658
  * / record of its own here; asking about one gets the refusal or, from the key itself, `#NotFound`.
629
659
  */
630
- getAgentStanding: ActorMethod<[Principal], Result_27>;
660
+ getAgentStanding: ActorMethod<[Principal], Result_29>;
631
661
  /**
632
662
  * / Fleet-wide anchoring liveness. Exists because ABSENCE is otherwise uninformative: an engram
633
663
  * / that never wrote, one still on a template without the push, and one whose push is broken all
@@ -704,6 +734,28 @@ export interface _SERVICE {
704
734
  * / bytes is never a fingerprint, and answers `null` before the lookup.
705
735
  */
706
736
  getCertifiedBirth: ActorMethod<[Uint8Array | number[]], [] | [CertifiedBirth]>;
737
+ /**
738
+ * / ⟨2026-11-02, the owner's ruling "1-4 all as you recommended"; the lead's answer L4 with the
739
+ * / Challenge's fix C3.2⟩ WHAT THE KIT OFFERS AS A NEW ENGRAM'S SIGN-IN, read before it opens one
740
+ * / through `parent`. The answer: the parent's owner — ONLY when the parent is a first engram (the
741
+ * / kit offers that principal as the default sign-in only then, after it prints it and the person
742
+ * / running the agent confirms it is theirs; for a parent opened through another the field is
743
+ * / absent, so the read never discloses a key file's principal); whether the parent is a first
744
+ * / engram; and whether it is registered, `#Active` and not abandoned (`isRegisteredActiveEngram`'s
745
+ * / rule).
746
+ * /
747
+ * / CALLER: a lasting key with a LIVE engagement with `parent` at this registry, in either store
748
+ * / (`Engagements.hasOpenEither` — the same fact `sysOpenChild`'s admission reads, so exactly the
749
+ * / keys that may be opened an engram through `parent` may read what it offers). It discloses the
750
+ * / parent's owner to the parent's own engaged agent, the party `getParentOf` answers once the child
751
+ * / exists. Anyone else is REFUSED loudly (ADR-0002), in the same words whether or not `parent` is
752
+ * / an engram, so a refusal tells a stranger nothing. A QUERY, so the refusal is not in the denial
753
+ * / log (`denied` says why a query cannot write). `#NotFound` only to an engaged caller, for a
754
+ * / parent this registry holds no owner for.
755
+ * / Called by: the owner kit's opening of an engram through a parent, signed by the agent's lasting
756
+ * / key, before it names the new engram's sign-in.
757
+ */
758
+ getChildSignInOffer: ActorMethod<[Principal], Result_28>;
707
759
  /**
708
760
  * / The ATTESTABLE custody-mode fact (agent-native model item 19): "managed" | "sovereign" |
709
761
  * / "unknown", derived from the registry's OWN transition records (claimSovereignty /
@@ -774,7 +826,7 @@ export interface _SERVICE {
774
826
  * / `#NotFound` only to a permitted reader, for a key that opened nothing: a true answer, like
775
827
  * / `listMyAgentDisputes`'s empty list.
776
828
  */
777
- getEngramOpenedThrough: ActorMethod<[Principal], Result_22>;
829
+ getEngramOpenedThrough: ActorMethod<[Principal], Result_23>;
778
830
  /**
779
831
  * / The i-th 1 MiB slice of the attested engram wasm (0-indexed). The caller reassembles all
780
832
  * / chunks in order and MUST verify sha256(reassembled) == getEngramWasmHash before installing —
@@ -787,7 +839,7 @@ export interface _SERVICE {
787
839
  * / a truncated one, so it would hash a partial wasm and report a mismatch against the official
788
840
  * / list, which reads as "this template is unofficial" rather than "I stopped reading too early".
789
841
  */
790
- getEngramWasmChunk: ActorMethod<[bigint], Result_26>;
842
+ getEngramWasmChunk: ActorMethod<[bigint], Result_27>;
791
843
  /**
792
844
  * / The stored template's release class — FREE and UNGATED, because it is the checkable half of a
793
845
  * / promise made to people who are not our customers. ⟨2026-10-25⟩ The funding rule it checks:
@@ -837,7 +889,7 @@ export interface _SERVICE {
837
889
  * / site. L1 retired the motive of trapping-to-refuse; it did not give queries the ability to
838
890
  * / write, which is the thing this actually depends on.
839
891
  */
840
- getFleetMetrics: ActorMethod<[], Result_25>;
892
+ getFleetMetrics: ActorMethod<[], Result_26>;
841
893
  /**
842
894
  * / PUBLIC: a genesis note that only privileged callers could read would defeat its purpose —
843
895
  * / the reader who most needs it is the stranger deciding whether to trust this chain.
@@ -915,7 +967,7 @@ export interface _SERVICE {
915
967
  * / restart": `nextRestartAtNs` is only the weekly limit on a loan. A restart on the owner's own
916
968
  * / compute is allowed now, whatever it says. Field name and shape unchanged.
917
969
  */
918
- getMyRestartStatus: ActorMethod<[], Result_24>;
970
+ getMyRestartStatus: ActorMethod<[], Result_25>;
919
971
  /**
920
972
  * / ⟨2026-10-02⟩ How many engrams were ever opened, and how — lifetime sizes of state this registry
921
973
  * / never deletes, plus the two counters of refused openings (`Funnel.OpeningCounts` names each).
@@ -926,7 +978,7 @@ export interface _SERVICE {
926
978
  * / "nothing was ever opened". A QUERY: counts only, and cheap; its refusal is not in the denial
927
979
  * / log (`denied` says why a query cannot write).
928
980
  */
929
- getOpeningCounts: ActorMethod<[], Result_23>;
981
+ getOpeningCounts: ActorMethod<[], Result_24>;
930
982
  /**
931
983
  * / Where an engram was opened from ⟨2026-10-26, the owner's lineage ruling L4: "a child reads its own
932
984
  * / parent by its canister id"⟩: the engram, the engram it was opened from, and the cut-off's time if
@@ -943,7 +995,7 @@ export interface _SERVICE {
943
995
  * / this registry never opened is said to be one, not passed off as a first engram (ADR-0002).
944
996
  * / L8C: `listChildrenOf` is unchanged. L7B: the change-of-owner gate is unchanged.
945
997
  */
946
- getParentOf: ActorMethod<[Principal], Result_22>;
998
+ getParentOf: ActorMethod<[Principal], Result_23>;
947
999
  /**
948
1000
  * / ⟨2026-10-02⟩ How far agents reach across owners — COUNTS ONLY: agents by how many trees their
949
1001
  * / record spans (1 · 2 · 3–4 · 5+), engrams opened through a parent that are live or cut off, and
@@ -957,7 +1009,25 @@ export interface _SERVICE {
957
1009
  * / weekly. Anyone else is REFUSED by name with their class — never zeros. A QUERY: its cost grows
958
1010
  * / with the agents and engrams it walks (one pass over each), so a reader asks weekly, not hourly.
959
1011
  */
960
- getReferralCounts: ActorMethod<[Array<Principal>], Result_21>;
1012
+ getReferralCounts: ActorMethod<[Array<Principal>], Result_22>;
1013
+ /**
1014
+ * / ⟨2026-11-02, the owner's rulings "E ok." and "go ahead with your noticing failures changes"⟩ THE
1015
+ * / REGISTRY'S HEALTH IN ONE READ: its cycle reserve, its roster, its anchoring counts — the same
1016
+ * / answers `getCycleReserveStatus`, `getAdminRoles` and `getAnchorStats` give, which stay served
1017
+ * / unchanged for everyone who reads them one at a time — and the stamps of its clock, which wakes only
1018
+ * / at the deadlines it records (with a six-hour net) and so is silent by design: `clock.nextWakeAtNs`
1019
+ * / more than an hour behind `atNs` is a lost clock. `Types.RegistryHealth` says what each field
1020
+ * / means, and why every field is `opt` and always filled.
1021
+ * /
1022
+ * / CALLER: the deployment's monitor, once an hour, under the audit-viewer grant its daily count-of-use
1023
+ * / reading already holds (ADR-0020 rule 1). Also the admin.
1024
+ * /
1025
+ * / GATED, LIKE THE COUNT-OF-USE READS THAT MONITOR MAKES (`getOpeningCounts`): the admin or an audit
1026
+ * / viewer; anyone else is REFUSED by name — never an empty or zero reading. A QUERY: its refusal is
1027
+ * / not in the denial log (a query cannot write; `denied` says why). One read where there were three
1028
+ * / saves the monitor and this registry two calls an hour each.
1029
+ */
1030
+ getRegistryHealth: ActorMethod<[], Result_21>;
961
1031
  /**
962
1032
  * / PUBLIC: the biller identity is an operational fact a
963
1033
  * / payer's cashier must verify BEFORE taking money (paying into a cashier the registry does not
@@ -1032,7 +1102,7 @@ export interface _SERVICE {
1032
1102
  getSecurityReleaseCount: ActorMethod<[], bigint>;
1033
1103
  /**
1034
1104
  * / ⟨2026-10-01, the owner's ruling of that day (2 A)⟩ Cumulative cycles accepted at the sponsored
1035
- * / door (`sysSpawnChild`) and forwarded into engrams opened through another — cycles the calling
1105
+ * / door (`sysOpenChild`) and forwarded into engrams opened through another — cycles the calling
1036
1106
  * / engrams attached, never the registry's own. Kept apart from the grant counter
1037
1107
  * / (`totalCyclesAllocated`) so neither figure is inflated by the other.
1038
1108
  * /
@@ -1475,7 +1545,7 @@ export interface _SERVICE {
1475
1545
  },
1476
1546
  ],
1477
1547
  ],
1478
- Result_1
1548
+ Result_2
1479
1549
  >;
1480
1550
  removeAuditViewer: ActorMethod<[Principal], Result>;
1481
1551
  /**
@@ -1563,6 +1633,8 @@ export interface _SERVICE {
1563
1633
  restartMyStoppedEngram: ActorMethod<[], Result_8>;
1564
1634
  /**
1565
1635
  * / Return to managed: user calls AFTER adding registry back as controller
1636
+ * /
1637
+ * / ⟨2026-11-02⟩ Refused for an engram opened through another, which is never independent.
1566
1638
  */
1567
1639
  returnToManaged: ActorMethod<[], Result>;
1568
1640
  /**
@@ -1643,6 +1715,9 @@ export interface _SERVICE {
1643
1715
  * /
1644
1716
  * / `claimSovereignty` sets this to `#ManualOnly` as a side effect, since a registry that is no
1645
1717
  * / longer a controller could not honour anything else.
1718
+ * /
1719
+ * / ⟨2026-11-02⟩ An engram opened through another is refused `#ManualOnly`: it takes this registry's
1720
+ * / updates automatically for life.
1646
1721
  */
1647
1722
  setUpdatePreference: ActorMethod<[UpdatePreference], Result>;
1648
1723
  /**
@@ -1787,6 +1862,84 @@ export interface _SERVICE {
1787
1862
  * / names). The rules are in `src/shared/ControlHandover.mo`.
1788
1863
  */
1789
1864
  sysNotifyOwnershipTransfer: ActorMethod<[Principal], Result_3>;
1865
+ /**
1866
+ * / ⟨2026-10-01, the owner's ruling of that day: the October concept's decision 1, "build it now"⟩
1867
+ * / THE SPONSORED DOOR. An engram opens an engram for one of its agents: the caller is the engram
1868
+ * / (the engram it is opened from — `parentOf` in code), `ownerKey` is the agent's LASTING key, which
1869
+ * / owns what is opened, and the cycles the opened engram lives on are the ones the caller ATTACHES.
1870
+ * /
1871
+ * / CALLER: a registered engram — `canisterToOwner` membership, checked first, exactly as
1872
+ * / `sysRecordAgentEdge` checks it (ADR-0020: every `sys` method names and checks its caller). The
1873
+ * / engram's own rules (the owner's standing allowance for this agent, its frozen-payments state,
1874
+ * / its balance) are the engram's to check before it calls; this method checks what only the
1875
+ * / registry can know.
1876
+ * /
1877
+ * / NOTHING IS ACCEPTED UNTIL EVERY CHECK HAS PASSED (`ChildDoor.admission`, cheapest first), so
1878
+ * / every refusal before the accept returns the attached cycles to the caller by construction —
1879
+ * / the IC returns unaccepted cycles when the call replies. After the accept:
1880
+ * / · the network refuses the canister → what it refunded is deposited back to the caller, and
1881
+ * / the reply says how much came back;
1882
+ * / · the template will not install after one retry → the cycles are INSIDE the new canister and
1883
+ * / no canister can withdraw another's cycles. The one honest exception to "returned on every
1884
+ * / failure": nothing is recorded, and the reply names the canister, its controllers (this
1885
+ * / registry and the key) and what the key can do with it;
1886
+ * / ⟨CORRECTED 2026-11-02, beside the line above — the owner's ruling "choice 4 without hand
1887
+ * / over" (V0)⟩ The controller is THIS REGISTRY ALONE; the key is not one and can install
1888
+ * / nothing. The reply names the canister and says the cycles sit in it unrecorded, for whoever
1889
+ * / runs this deployment to decide on;
1890
+ * / · the key came to own an engram during the awaits → the new canister is named, nothing is
1891
+ * / recorded (the same third guard `spawnEngramFor` carries).
1892
+ * /
1893
+ * / WHAT IT DOES NOT DO, deliberately: it never attaches the registry's own cycles (the grant stays
1894
+ * / with first engrams); it never writes a predecessor (a key with any record was refused); it never
1895
+ * / consults the reserve gate (the parent owner's approval is this door's admission — the gate's
1896
+ * / arming note stays on `provisionEngram`); it never tells the calling engram anything but this
1897
+ * / reply. No payment AMOUNT reaches it (ADR-0005): it carries cycles and a key, nothing else.
1898
+ * /
1899
+ * / THE RATE LIMIT ⟨2026-10-01, evening — the owner's ruling "1B"; until then this door shared
1900
+ * / first engrams' limiter in full: their 24-hour count, their in-flight count and
1901
+ * / `effectiveDailyCap`⟩. The door shares only the DIAL (`spawnCeiling`) and the WINDOW LENGTH (24
1902
+ * / hours). Its count is its own (`sponsoredCreationTimestampsBuf`, pruned by
1903
+ * / `pruneSponsoredWindow`), its in-flight count is its own (`sponsoredInFlight`), and its cap is
1904
+ * / `spawnCeiling` alone — the reserve-derived term never applies, because the opened engram lives
1905
+ * / on the cycles the caller attached and the registry funds nothing. So an opening never uses up a
1906
+ * / first engram's slot, and is never refused for the registry's own low balance. The per-key
1907
+ * / pending mark (`createEngramPending`) stays shared: it is about ONE key, not a count, and a key
1908
+ * / must not be mid-spawn at both doors at once.
1909
+ * /
1910
+ * / THE CUT-OFF AT BIRTH. If the caller ended the key's engagement while the canister was being
1911
+ * / created (the ending is recorded by `sysRecordAgentEdge` between this method's awaits), the
1912
+ * / opened engram is recorded AND cut off in the same step — the cycles are already in it, so the
1913
+ * / key keeps it, but it starts on nobody's record. Without this the ending's cut-off writer would
1914
+ * / have found no `openedThroughParent` row yet, and the engram would never be cut off.
1915
+ * / WHAT WOULD MAKE THIS WRONG: a second path that writes `parentOf`, or an `await` placed between
1916
+ * / the post-await re-check and the record below.
1917
+ * /
1918
+ * / ⟨2026-11-02, the owner's rulings "choice 4 without hand over" (V0) and "1-4 all as you
1919
+ * / recommended"⟩ CONTROLLED BY THIS REGISTRY ALONE, AND BORN KNOWING ITS PARENT AND ITS SIGN-IN.
1920
+ * / The canister's controllers are `[this registry]` — the key is not a controller, so it can never
1921
+ * / reinstall, delete or re-control the engram; only this registry installs code on it. Such an
1922
+ * / engram is managed for life: `claimSovereignty`, `returnToManaged`, `abandonMyEngram`, a
1923
+ * / `#ManualOnly` preference and a change of owner (`sysNotifyOwnershipTransfer`) are all refused
1924
+ * / for it, by `parentOf`. `signIn` is the opened engram's second credential, named by the person
1925
+ * / running the agent (`ChildDoor.signInRefusal` refuses the key itself, the anonymous principal and
1926
+ * / a canister); it and the parent travel in the engram's init record, so the engram knows both
1927
+ * / before it answers its first message. `null` = no sign-in: the engram keeps small limits for life.
1928
+ * / An engram built before this argument sends one argument; the missing trailing `opt` decodes as
1929
+ * / `null` (Candid's rule for a missing optional argument), and the engram opens with no sign-in.
1930
+ * / ⟨CORRECTED 2026-11-02, later — the stage-1 review's B1, beside the two lines above, which no
1931
+ * / longer hold⟩ ONE RECORD, A NEW NAME. This door was `sysSpawnChild(ownerKey : Principal)`; giving
1932
+ * / it a second positional argument grew its argument TUPLE, which ADR-0018 rule 0 freezes ("evolution
1933
+ * / happens inside records", ratified R1) and the interface gate reads as ILLEGAL. So the door is
1934
+ * / `sysOpenChild({ ownerKey; signIn })` — later fields are opt fields of this record, never another
1935
+ * / argument — and `sysSpawnChild` is REMOVED (a NOTICE at the gate). An engram built before this
1936
+ * / change still calls `sysSpawnChild`; this registry no longer serves it, so that call is REJECTED
1937
+ * / (IC0536, a reject the engram's `try` catches — ADR-0018 probe 11), the attached cycles come back
1938
+ * / as the call's refund, and nothing is opened. An older engram therefore never opens an engram with
1939
+ * / no sign-in by accident; it opens them again once it runs a template that calls this method.
1940
+ * / (Was: the one-argument call decoded `signIn` as `null` — INFERRED for moc 2.1.0, never witnessed.)
1941
+ */
1942
+ sysOpenChild: ActorMethod<[{ ownerKey: Principal; signIn: [] | [Principal] }], Result_2>;
1790
1943
  /**
1791
1944
  * / ⟨2026-09-28, owner decision: build the full agent track-record design for the launch release⟩
1792
1945
  * / An engram tells this registry that one of its agents started, or ended and WHY.
@@ -1883,7 +2036,7 @@ export interface _SERVICE {
1883
2036
  * / name one of its OWN advances (the caller must match), so the worst it can do is settle its own
1884
2037
  * / other advance early with cycles that are still the registry's.
1885
2038
  */
1886
- sysRepayUpgradeAdvance: ActorMethod<[{ advanceId: bigint }], Result_2>;
2039
+ sysRepayUpgradeAdvance: ActorMethod<[{ advanceId: bigint }], Result_1>;
1887
2040
  /**
1888
2041
  * / ⟨2026-09-29, owner ruling follow-up 8⟩ A SOVEREIGN engram could not change its own controllers
1889
2042
  * / after this registry moved its record, and asks for the record back so the transfer does not
@@ -1894,56 +2047,6 @@ export interface _SERVICE {
1894
2047
  * / engram then answers its owner with `ControlHandover.stuck`.
1895
2048
  */
1896
2049
  sysRevertOwnershipTransfer: ActorMethod<[Principal], Result>;
1897
- /**
1898
- * / ⟨2026-10-01, the owner's ruling of that day: the October concept's decision 1, "build it now"⟩
1899
- * / THE SPONSORED DOOR. An engram opens an engram for one of its agents: the caller is the engram
1900
- * / (the engram it is opened from — `parentOf` in code), `ownerKey` is the agent's LASTING key, which
1901
- * / owns what is opened, and the cycles the opened engram lives on are the ones the caller ATTACHES.
1902
- * /
1903
- * / CALLER: a registered engram — `canisterToOwner` membership, checked first, exactly as
1904
- * / `sysRecordAgentEdge` checks it (ADR-0020: every `sys` method names and checks its caller). The
1905
- * / engram's own rules (the owner's standing allowance for this agent, its frozen-payments state,
1906
- * / its balance) are the engram's to check before it calls; this method checks what only the
1907
- * / registry can know.
1908
- * /
1909
- * / NOTHING IS ACCEPTED UNTIL EVERY CHECK HAS PASSED (`ChildDoor.admission`, cheapest first), so
1910
- * / every refusal before the accept returns the attached cycles to the caller by construction —
1911
- * / the IC returns unaccepted cycles when the call replies. After the accept:
1912
- * / · the network refuses the canister → what it refunded is deposited back to the caller, and
1913
- * / the reply says how much came back;
1914
- * / · the template will not install after one retry → the cycles are INSIDE the new canister and
1915
- * / no canister can withdraw another's cycles. The one honest exception to "returned on every
1916
- * / failure": nothing is recorded, and the reply names the canister, its controllers (this
1917
- * / registry and the key) and what the key can do with it;
1918
- * / · the key came to own an engram during the awaits → the new canister is named, nothing is
1919
- * / recorded (the same third guard `spawnEngramFor` carries).
1920
- * /
1921
- * / WHAT IT DOES NOT DO, deliberately: it never attaches the registry's own cycles (the grant stays
1922
- * / with first engrams); it never writes a predecessor (a key with any record was refused); it never
1923
- * / consults the reserve gate (the parent owner's approval is this door's admission — the gate's
1924
- * / arming note stays on `provisionEngram`); it never tells the calling engram anything but this
1925
- * / reply. No payment AMOUNT reaches it (ADR-0005): it carries cycles and a key, nothing else.
1926
- * /
1927
- * / THE RATE LIMIT ⟨2026-10-01, evening — the owner's ruling "1B"; until then this door shared
1928
- * / first engrams' limiter in full: their 24-hour count, their in-flight count and
1929
- * / `effectiveDailyCap`⟩. The door shares only the DIAL (`spawnCeiling`) and the WINDOW LENGTH (24
1930
- * / hours). Its count is its own (`sponsoredCreationTimestampsBuf`, pruned by
1931
- * / `pruneSponsoredWindow`), its in-flight count is its own (`sponsoredInFlight`), and its cap is
1932
- * / `spawnCeiling` alone — the reserve-derived term never applies, because the opened engram lives
1933
- * / on the cycles the caller attached and the registry funds nothing. So an opening never uses up a
1934
- * / first engram's slot, and is never refused for the registry's own low balance. The per-key
1935
- * / pending mark (`createEngramPending`) stays shared: it is about ONE key, not a count, and a key
1936
- * / must not be mid-spawn at both doors at once.
1937
- * /
1938
- * / THE CUT-OFF AT BIRTH. If the caller ended the key's engagement while the canister was being
1939
- * / created (the ending is recorded by `sysRecordAgentEdge` between this method's awaits), the
1940
- * / opened engram is recorded AND cut off in the same step — the cycles are already in it, so the
1941
- * / key keeps it, but it starts on nobody's record. Without this the ending's cut-off writer would
1942
- * / have found no `openedThroughParent` row yet, and the engram would never be cut off.
1943
- * / WHAT WOULD MAKE THIS WRONG: a second path that writes `parentOf`, or an `await` placed between
1944
- * / the post-await re-check and the record below.
1945
- */
1946
- sysSpawnChild: ActorMethod<[Principal], Result_1>;
1947
2050
  /**
1948
2051
  * / Admin: upgrade one engram to the current template. RESPECTS the owner's update preference —
1949
2052
  * / an engram set to `#ManualOnly` is not moved by this method, which is what makes the preference
@@ -21,7 +21,7 @@ export const idlFactory = ({ IDL }) => {
21
21
  sovereignSkipped: IDL.Nat,
22
22
  lowCycles: IDL.Nat,
23
23
  });
24
- const Result_28 = IDL.Variant({ Ok: FleetCycleHealth, Err: Error });
24
+ const Result_30 = IDL.Variant({ Ok: FleetCycleHealth, Err: Error });
25
25
  const FleetSummary = IDL.Record({
26
26
  registrySinceNs: IDL.Opt(IDL.Int),
27
27
  uniqueOwners: IDL.Nat,
@@ -69,7 +69,7 @@ export const idlFactory = ({ IDL }) => {
69
69
  leaf: StandingLeaf,
70
70
  witness: IDL.Vec(IDL.Nat8),
71
71
  });
72
- const Result_27 = IDL.Variant({ Ok: CertifiedStanding, Err: Error });
72
+ const Result_29 = IDL.Variant({ Ok: CertifiedStanding, Err: Error });
73
73
  const AnchorStats = IDL.Record({
74
74
  lastAnchorAtNs: IDL.Opt(IDL.Int),
75
75
  lastEngramAnchorAtNs: IDL.Opt(IDL.Int),
@@ -109,6 +109,12 @@ export const idlFactory = ({ IDL }) => {
109
109
  certificate: IDL.Opt(IDL.Vec(IDL.Nat8)),
110
110
  witness: IDL.Vec(IDL.Nat8),
111
111
  });
112
+ const ChildSignInOffer = IDL.Record({
113
+ parentActive: IDL.Bool,
114
+ parentIsFirstEngram: IDL.Bool,
115
+ parentOwner: IDL.Opt(IDL.Principal),
116
+ });
117
+ const Result_28 = IDL.Variant({ Ok: ChildSignInOffer, Err: Error });
112
118
  const CustodyMode = IDL.Variant({
113
119
  Sovereign: IDL.Null,
114
120
  Managed: IDL.Null,
@@ -119,8 +125,8 @@ export const idlFactory = ({ IDL }) => {
119
125
  child: IDL.Principal,
120
126
  parent: IDL.Principal,
121
127
  });
122
- const Result_22 = IDL.Variant({ Ok: OpenedThrough, Err: Error });
123
- const Result_26 = IDL.Variant({ Ok: IDL.Vec(IDL.Nat8), Err: Error });
128
+ const Result_23 = IDL.Variant({ Ok: OpenedThrough, Err: Error });
129
+ const Result_27 = IDL.Variant({ Ok: IDL.Vec(IDL.Nat8), Err: Error });
124
130
  const ReleaseClass = IDL.Variant({
125
131
  Security: IDL.Null,
126
132
  Feature: IDL.Null,
@@ -143,7 +149,7 @@ export const idlFactory = ({ IDL }) => {
143
149
  totalEngrams: IDL.Nat,
144
150
  activeEngrams: IDL.Nat,
145
151
  });
146
- const Result_25 = IDL.Variant({ Ok: PrivateMetrics, Err: Error });
152
+ const Result_26 = IDL.Variant({ Ok: PrivateMetrics, Err: Error });
147
153
  const GenesisNote = IDL.Record({
148
154
  predecessorSize: IDL.Opt(IDL.Nat),
149
155
  predecessorHeadHash: IDL.Opt(IDL.Vec(IDL.Nat8)),
@@ -174,7 +180,7 @@ export const idlFactory = ({ IDL }) => {
174
180
  loanOwed: IDL.Nat,
175
181
  openUntilNs: IDL.Opt(IDL.Int),
176
182
  });
177
- const Result_24 = IDL.Variant({ Ok: RestartStatus, Err: Error });
183
+ const Result_25 = IDL.Variant({ Ok: RestartStatus, Err: Error });
178
184
  const OpeningCounts = IDL.Record({
179
185
  reopened: IDL.Nat,
180
186
  openedThroughParent: IDL.Nat,
@@ -184,7 +190,7 @@ export const idlFactory = ({ IDL }) => {
184
190
  reservationAttemptsRefusedAtCapacity: IDL.Nat,
185
191
  spawnAttemptsRefusedAtCap: IDL.Nat,
186
192
  });
187
- const Result_23 = IDL.Variant({ Ok: OpeningCounts, Err: Error });
193
+ const Result_24 = IDL.Variant({ Ok: OpeningCounts, Err: Error });
188
194
  const PairedSoon = IDL.Record({
189
195
  opened: IDL.Nat,
190
196
  pairedWithin7Days: IDL.Nat,
@@ -202,7 +208,30 @@ export const idlFactory = ({ IDL }) => {
202
208
  throughParent: PairedSoon,
203
209
  agentsByTreesSpanned: TreesSpanned,
204
210
  });
205
- const Result_21 = IDL.Variant({ Ok: ReferralCounts, Err: Error });
211
+ const Result_22 = IDL.Variant({ Ok: ReferralCounts, Err: Error });
212
+ const RegistryClockHealth = IDL.Record({
213
+ nextWakeAtNs: IDL.Opt(IDL.Int),
214
+ lastAttemptAtNs: IDL.Opt(IDL.Int),
215
+ attemptTotal: IDL.Opt(IDL.Nat),
216
+ lastErrorAtNs: IDL.Opt(IDL.Int),
217
+ okTotal: IDL.Opt(IDL.Nat),
218
+ overdue: IDL.Opt(IDL.Nat),
219
+ lastError: IDL.Opt(IDL.Text),
220
+ lastOkAtNs: IDL.Opt(IDL.Int),
221
+ });
222
+ const RegistryHealth = IDL.Record({
223
+ anchors: IDL.Opt(AnchorStats),
224
+ adminRoles: IDL.Opt(AdminRoles),
225
+ atNs: IDL.Opt(IDL.Int),
226
+ clock: IDL.Opt(RegistryClockHealth),
227
+ cycleReserve: IDL.Opt(
228
+ IDL.Record({
229
+ cycleBalance: IDL.Nat,
230
+ minOperatingReserveCycles: IDL.Nat,
231
+ }),
232
+ ),
233
+ });
234
+ const Result_21 = IDL.Variant({ Ok: RegistryHealth, Err: Error });
206
235
  const ReserveGateConfig = IDL.Record({
207
236
  enabled: IDL.Bool,
208
237
  inviteIssuer: IDL.Principal,
@@ -373,7 +402,7 @@ export const idlFactory = ({ IDL }) => {
373
402
  frozen: IDL.Bool,
374
403
  });
375
404
  const Result_9 = IDL.Variant({ Ok: EngramComputeView, Err: Error });
376
- const Result_1 = IDL.Variant({ Ok: IDL.Principal, Err: Error });
405
+ const Result_2 = IDL.Variant({ Ok: IDL.Principal, Err: Error });
377
406
  const RestartReply = IDL.Record({
378
407
  securityInstalled: IDL.Bool,
379
408
  lentCycles: IDL.Nat,
@@ -415,7 +444,7 @@ export const idlFactory = ({ IDL }) => {
415
444
  inviteCode: IDL.Text,
416
445
  });
417
446
  const EdgeEvent = IDL.Variant({ Ended: Ending, Added: EnrolmentProof });
418
- const Result_2 = IDL.Variant({
447
+ const Result_1 = IDL.Variant({
419
448
  Ok: IDL.Record({ accepted: IDL.Nat }),
420
449
  Err: Error,
421
450
  });
@@ -428,7 +457,7 @@ export const idlFactory = ({ IDL }) => {
428
457
  engramWasmFinalize: IDL.Func([IDL.Text], [Result_7], []),
429
458
  engramWasmInit: IDL.Func([], [Result], []),
430
459
  engramWasmPushChunk: IDL.Func([IDL.Vec(IDL.Nat8)], [Result_7], []),
431
- fleetCycleHealth: IDL.Func([IDL.Nat, IDL.Nat, IDL.Nat], [Result_28], []),
460
+ fleetCycleHealth: IDL.Func([IDL.Nat, IDL.Nat, IDL.Nat], [Result_30], []),
432
461
  fleetSummary: IDL.Func([], [FleetSummary], ['query']),
433
462
  getAbandonedAtNs: IDL.Func([IDL.Principal], [IDL.Opt(IDL.Int)], ['query']),
434
463
  getActivationFunnel: IDL.Func([], [ActivationFunnel], ['query']),
@@ -438,12 +467,13 @@ export const idlFactory = ({ IDL }) => {
438
467
  [IDL.Record({ agents: IDL.Nat, liveEngagements: IDL.Nat })],
439
468
  ['query'],
440
469
  ),
441
- getAgentStanding: IDL.Func([IDL.Principal], [Result_27], ['query']),
470
+ getAgentStanding: IDL.Func([IDL.Principal], [Result_29], ['query']),
442
471
  getAnchorStats: IDL.Func([], [AnchorStats], ['query']),
443
472
  getAuditHead: IDL.Func([], [AuditHead], ['query']),
444
473
  getCertifiedAnchor: IDL.Func([IDL.Principal], [IDL.Opt(CertifiedAnchor)], ['query']),
445
474
  getCertifiedAuditHead: IDL.Func([], [CertifiedAuditHead], ['query']),
446
475
  getCertifiedBirth: IDL.Func([IDL.Vec(IDL.Nat8)], [IDL.Opt(CertifiedBirth)], ['query']),
476
+ getChildSignInOffer: IDL.Func([IDL.Principal], [Result_28], ['query']),
447
477
  getCustodyMode: IDL.Func([IDL.Principal], [Result_10], ['query']),
448
478
  getCycleReserveStatus: IDL.Func(
449
479
  [],
@@ -456,22 +486,23 @@ export const idlFactory = ({ IDL }) => {
456
486
  ['query'],
457
487
  ),
458
488
  getEngramNumberOf: IDL.Func([IDL.Principal], [IDL.Opt(IDL.Nat)], ['query']),
459
- getEngramOpenedThrough: IDL.Func([IDL.Principal], [Result_22], ['query']),
460
- getEngramWasmChunk: IDL.Func([IDL.Nat], [Result_26], ['query']),
489
+ getEngramOpenedThrough: IDL.Func([IDL.Principal], [Result_23], ['query']),
490
+ getEngramWasmChunk: IDL.Func([IDL.Nat], [Result_27], ['query']),
461
491
  getEngramWasmClass: IDL.Func([], [ReleaseClass], ['query']),
462
492
  getEngramWasmHash: IDL.Func([], [IDL.Text], ['query']),
463
493
  getEngramWasmInfo: IDL.Func([], [EngramWasmInfo], ['query']),
464
- getFleetMetrics: IDL.Func([], [Result_25], []),
494
+ getFleetMetrics: IDL.Func([], [Result_26], []),
465
495
  getGenesisNote: IDL.Func([], [GenesisNote], ['query']),
466
496
  getLastUpgrade: IDL.Func([IDL.Principal], [IDL.Opt(LastUpgrade)], ['query']),
467
497
  getMarketCanister: IDL.Func([], [IDL.Opt(IDL.Principal)], ['query']),
468
498
  getMetricsReader: IDL.Func([], [IDL.Opt(IDL.Principal)], ['query']),
469
499
  getMyEngram: IDL.Func([], [IDL.Opt(EngramRecordView)], ['query']),
470
500
  getMyReservation: IDL.Func([], [IDL.Opt(ReservationView)], ['query']),
471
- getMyRestartStatus: IDL.Func([], [Result_24], ['query']),
472
- getOpeningCounts: IDL.Func([], [Result_23], ['query']),
473
- getParentOf: IDL.Func([IDL.Principal], [Result_22], ['query']),
474
- getReferralCounts: IDL.Func([IDL.Vec(IDL.Principal)], [Result_21], ['query']),
501
+ getMyRestartStatus: IDL.Func([], [Result_25], ['query']),
502
+ getOpeningCounts: IDL.Func([], [Result_24], ['query']),
503
+ getParentOf: IDL.Func([IDL.Principal], [Result_23], ['query']),
504
+ getReferralCounts: IDL.Func([IDL.Vec(IDL.Principal)], [Result_22], ['query']),
505
+ getRegistryHealth: IDL.Func([], [Result_21], ['query']),
475
506
  getRentBiller: IDL.Func([], [IDL.Opt(IDL.Principal)], ['query']),
476
507
  getReserveGateConfig: IDL.Func([], [ReserveGateConfig], ['query']),
477
508
  getRestartTotals: IDL.Func([], [RestartTotals], ['query']),
@@ -542,7 +573,7 @@ export const idlFactory = ({ IDL }) => {
542
573
  }),
543
574
  ),
544
575
  ],
545
- [Result_1],
576
+ [Result_2],
546
577
  [],
547
578
  ),
548
579
  removeAuditViewer: IDL.Func([IDL.Principal], [Result], []),
@@ -585,14 +616,23 @@ export const idlFactory = ({ IDL }) => {
585
616
  sysMeterEngram: IDL.Func([IDL.Principal], [Result_4], []),
586
617
  sysNoteReset: IDL.Func([], [Result], []),
587
618
  sysNotifyOwnershipTransfer: IDL.Func([IDL.Principal], [Result_3], []),
619
+ sysOpenChild: IDL.Func(
620
+ [
621
+ IDL.Record({
622
+ ownerKey: IDL.Principal,
623
+ signIn: IDL.Opt(IDL.Principal),
624
+ }),
625
+ ],
626
+ [Result_2],
627
+ [],
628
+ ),
588
629
  sysRecordAgentEdge: IDL.Func(
589
630
  [IDL.Record({ root: IDL.Principal, event: EdgeEvent })],
590
631
  [Result],
591
632
  [],
592
633
  ),
593
- sysRepayUpgradeAdvance: IDL.Func([IDL.Record({ advanceId: IDL.Nat })], [Result_2], []),
634
+ sysRepayUpgradeAdvance: IDL.Func([IDL.Record({ advanceId: IDL.Nat })], [Result_1], []),
594
635
  sysRevertOwnershipTransfer: IDL.Func([IDL.Principal], [Result], []),
595
- sysSpawnChild: IDL.Func([IDL.Principal], [Result_1], []),
596
636
  upgradeEngram: IDL.Func([IDL.Principal], [Result], []),
597
637
  upgradeMyEngram: IDL.Func([], [Result], []),
598
638
  verifyEngramActiveOwner: IDL.Func([IDL.Principal, IDL.Principal], [IDL.Bool], ['query']),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@engramx/idl",
3
- "version": "0.16.0-rc.21",
3
+ "version": "0.16.0-rc.22",
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>",