@engramx/idl 0.16.0-rc.20 → 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.
package/dist/engram.did CHANGED
@@ -180,6 +180,19 @@ type ServiceEntry =
180
180
  skills: vec text;
181
181
  version: text;
182
182
  };
183
+ type SellerView =
184
+ record {
185
+ activatesAtNs: int;
186
+ addedAtNs: int;
187
+ addedBy: principal;
188
+ isPayout: bool;
189
+ liveNow: bool;
190
+ payTo: text;
191
+ pendingActivatesAtNs: opt int;
192
+ pendingCapE6: opt nat;
193
+ perDayCapE6: nat;
194
+ spentTodayE6: nat;
195
+ };
183
196
  type Seat =
184
197
  record {
185
198
  firstPaymentDay: opt nat;
@@ -259,25 +272,40 @@ type Result_9 =
259
272
  Err: Error;
260
273
  Ok: vec Seat;
261
274
  };
262
- type Result_83 =
275
+ type Result_89 =
263
276
  variant {
264
277
  Err: Error;
265
278
  Ok: AgentRecord;
266
279
  };
280
+ type Result_87 =
281
+ variant {
282
+ Err: Error;
283
+ Ok: Eip712Registration;
284
+ };
285
+ type Result_85 =
286
+ variant {
287
+ Err: Error;
288
+ Ok: CondenseResult;
289
+ };
290
+ type Result_84 =
291
+ variant {
292
+ Err: Error;
293
+ Ok: MemoryRangeExport;
294
+ };
267
295
  type Result_82 =
268
296
  variant {
269
297
  Err: Error;
270
- Ok: record {activatesAtNs: int;};
298
+ Ok: Page_26;
271
299
  };
272
300
  type Result_81 =
273
301
  variant {
274
302
  Err: Error;
275
- Ok: Eip712Registration;
303
+ Ok: AgentWriteReview;
276
304
  };
277
305
  type Result_80 =
278
306
  variant {
279
307
  Err: Error;
280
- Ok: CondenseResult;
308
+ Ok: BackupMetadata;
281
309
  };
282
310
  type Result_8 =
283
311
  variant {
@@ -287,47 +315,52 @@ type Result_8 =
287
315
  type Result_79 =
288
316
  variant {
289
317
  Err: Error;
290
- Ok: MemoryRangeExport;
318
+ Ok: BackupRetention;
319
+ };
320
+ type Result_78 =
321
+ variant {
322
+ Err: Error;
323
+ Ok: vec BirthRecord;
291
324
  };
292
325
  type Result_77 =
293
326
  variant {
294
327
  Err: Error;
295
- Ok: Page_25;
328
+ Ok: Brakes;
296
329
  };
297
330
  type Result_76 =
298
331
  variant {
299
332
  Err: Error;
300
- Ok: AgentWriteReview;
333
+ Ok: ChildAllowanceRow;
301
334
  };
302
335
  type Result_75 =
303
336
  variant {
304
337
  Err: Error;
305
- Ok: BackupMetadata;
338
+ Ok: ChildOpening;
306
339
  };
307
340
  type Result_74 =
308
341
  variant {
309
342
  Err: Error;
310
- Ok: BackupRetention;
343
+ Ok: EvmAddresses;
311
344
  };
312
345
  type Result_73 =
313
346
  variant {
314
347
  Err: Error;
315
- Ok: vec BirthRecord;
348
+ Ok: AlertStatus;
316
349
  };
317
350
  type Result_72 =
318
351
  variant {
319
352
  Err: Error;
320
- Ok: Brakes;
353
+ Ok: blob;
321
354
  };
322
355
  type Result_71 =
323
356
  variant {
324
357
  Err: Error;
325
- Ok: ChildAllowanceRow;
358
+ Ok: KeyBackupStatus;
326
359
  };
327
360
  type Result_70 =
328
361
  variant {
329
362
  Err: Error;
330
- Ok: ChildOpening;
363
+ Ok: MemoryHistory;
331
364
  };
332
365
  type Result_7 =
333
366
  variant {
@@ -337,52 +370,52 @@ type Result_7 =
337
370
  type Result_69 =
338
371
  variant {
339
372
  Err: Error;
340
- Ok: blob;
373
+ Ok: MemoryRetentionPolicy;
341
374
  };
342
375
  type Result_68 =
343
376
  variant {
344
377
  Err: Error;
345
- Ok: EvmAddresses;
378
+ Ok: OwnerConsole;
346
379
  };
347
380
  type Result_67 =
348
381
  variant {
349
382
  Err: Error;
350
- Ok: AlertStatus;
383
+ Ok: OwnerSignInView;
351
384
  };
352
385
  type Result_66 =
353
386
  variant {
354
387
  Err: Error;
355
- Ok: MemoryHistory;
388
+ Ok: record {paths: vec text;};
356
389
  };
357
390
  type Result_65 =
358
391
  variant {
359
392
  Err: Error;
360
- Ok: MemoryRetentionPolicy;
393
+ Ok: RecipientHistory;
361
394
  };
362
395
  type Result_64 =
363
396
  variant {
364
397
  Err: Error;
365
- Ok: OwnerConsole;
398
+ Ok: SigningFloorStatus;
366
399
  };
367
400
  type Result_63 =
368
401
  variant {
369
402
  Err: Error;
370
- Ok: record {paths: vec text;};
403
+ Ok: SpendCeiling;
371
404
  };
372
405
  type Result_62 =
373
406
  variant {
374
407
  Err: Error;
375
- Ok: SigningFloorStatus;
408
+ Ok: SpendingPolicy;
376
409
  };
377
410
  type Result_61 =
378
411
  variant {
379
412
  Err: Error;
380
- Ok: SpendCeiling;
413
+ Ok: StorageReport;
381
414
  };
382
415
  type Result_60 =
383
416
  variant {
384
417
  Err: Error;
385
- Ok: SpendingPolicy;
418
+ Ok: WalletBalances;
386
419
  };
387
420
  type Result_6 =
388
421
  variant {
@@ -392,52 +425,52 @@ type Result_6 =
392
425
  type Result_59 =
393
426
  variant {
394
427
  Err: Error;
395
- Ok: StorageReport;
428
+ Ok: WorldIdConfig;
396
429
  };
397
430
  type Result_58 =
398
431
  variant {
399
432
  Err: Error;
400
- Ok: WalletBalances;
433
+ Ok: WorldIdRpContext;
401
434
  };
402
435
  type Result_57 =
403
436
  variant {
404
437
  Err: Error;
405
- Ok: WorldIdConfig;
438
+ Ok: opt text;
406
439
  };
407
440
  type Result_56 =
408
441
  variant {
409
442
  Err: Error;
410
- Ok: WorldIdRpContext;
443
+ Ok: bool;
411
444
  };
412
445
  type Result_55 =
413
446
  variant {
414
447
  Err: Error;
415
- Ok: opt text;
448
+ Ok: text;
416
449
  };
417
450
  type Result_54 =
418
451
  variant {
419
452
  Err: Error;
420
- Ok: bool;
453
+ Ok: Page_25;
421
454
  };
422
455
  type Result_53 =
423
456
  variant {
424
457
  Err: Error;
425
- Ok: text;
458
+ Ok: AgentSpendToday;
426
459
  };
427
460
  type Result_52 =
428
461
  variant {
429
462
  Err: Error;
430
- Ok: Page_24;
463
+ Ok: Page_23;
431
464
  };
432
465
  type Result_51 =
433
466
  variant {
434
467
  Err: Error;
435
- Ok: AgentSpendToday;
468
+ Ok: Page_22;
436
469
  };
437
470
  type Result_50 =
438
471
  variant {
439
472
  Err: Error;
440
- Ok: Page_22;
473
+ Ok: RecordPage;
441
474
  };
442
475
  type Result_5 =
443
476
  variant {
@@ -452,47 +485,47 @@ type Result_49 =
452
485
  type Result_48 =
453
486
  variant {
454
487
  Err: Error;
455
- Ok: RecordPage;
488
+ Ok: Page_20;
456
489
  };
457
490
  type Result_47 =
458
491
  variant {
459
492
  Err: Error;
460
- Ok: Page_20;
493
+ Ok: CheckpointPage;
461
494
  };
462
495
  type Result_46 =
463
496
  variant {
464
497
  Err: Error;
465
- Ok: Page_19;
498
+ Ok: Page_18;
466
499
  };
467
500
  type Result_45 =
468
501
  variant {
469
502
  Err: Error;
470
- Ok: CheckpointPage;
503
+ Ok: Page_17;
471
504
  };
472
505
  type Result_44 =
473
506
  variant {
474
507
  Err: Error;
475
- Ok: Page_17;
508
+ Ok: Page_16;
476
509
  };
477
510
  type Result_43 =
478
511
  variant {
479
512
  Err: Error;
480
- Ok: Page_16;
513
+ Ok: Page_15;
481
514
  };
482
515
  type Result_42 =
483
516
  variant {
484
517
  Err: Error;
485
- Ok: Page_15;
518
+ Ok: Page_14;
486
519
  };
487
520
  type Result_41 =
488
521
  variant {
489
522
  Err: Error;
490
- Ok: Page_14;
523
+ Ok: Page_13;
491
524
  };
492
525
  type Result_40 =
493
526
  variant {
494
527
  Err: Error;
495
- Ok: Page_13;
528
+ Ok: ReceiptPage;
496
529
  };
497
530
  type Result_4 =
498
531
  variant {
@@ -502,52 +535,52 @@ type Result_4 =
502
535
  type Result_39 =
503
536
  variant {
504
537
  Err: Error;
505
- Ok: Page_12;
538
+ Ok: Page_11;
506
539
  };
507
540
  type Result_38 =
508
541
  variant {
509
542
  Err: Error;
510
- Ok: ReceiptPage;
543
+ Ok: LogPage;
511
544
  };
512
545
  type Result_37 =
513
546
  variant {
514
547
  Err: Error;
515
- Ok: Page_10;
548
+ Ok: Page_9;
516
549
  };
517
550
  type Result_36 =
518
551
  variant {
519
552
  Err: Error;
520
- Ok: LogPage;
553
+ Ok: Page_8;
521
554
  };
522
555
  type Result_35 =
523
556
  variant {
524
557
  Err: Error;
525
- Ok: Page_8;
558
+ Ok: Page_7;
526
559
  };
527
560
  type Result_34 =
528
561
  variant {
529
562
  Err: Error;
530
- Ok: Page_7;
563
+ Ok: PaymentSignatureCounts;
531
564
  };
532
565
  type Result_33 =
533
566
  variant {
534
567
  Err: Error;
535
- Ok: Page_6;
568
+ Ok: Page_5;
536
569
  };
537
570
  type Result_32 =
538
571
  variant {
539
572
  Err: Error;
540
- Ok: PaymentSignatureCounts;
573
+ Ok: Page_4;
541
574
  };
542
575
  type Result_31 =
543
576
  variant {
544
577
  Err: Error;
545
- Ok: Page_4;
578
+ Ok: Page_3;
546
579
  };
547
580
  type Result_30 =
548
581
  variant {
549
582
  Err: Error;
550
- Ok: Page_3;
583
+ Ok: Page_2;
551
584
  };
552
585
  type Result_3 =
553
586
  variant {
@@ -557,52 +590,52 @@ type Result_3 =
557
590
  type Result_29 =
558
591
  variant {
559
592
  Err: Error;
560
- Ok: Page_2;
593
+ Ok: Page_1;
561
594
  };
562
595
  type Result_28 =
563
596
  variant {
564
597
  Err: Error;
565
- Ok: Page_1;
598
+ Ok: Page;
566
599
  };
567
600
  type Result_27 =
568
601
  variant {
569
602
  Err: Error;
570
- Ok: Page;
603
+ Ok: AgentGrant;
571
604
  };
572
605
  type Result_26 =
573
606
  variant {
574
607
  Err: Error;
575
- Ok: AgentGrant;
608
+ Ok: principal;
576
609
  };
577
610
  type Result_25 =
578
611
  variant {
579
612
  Err: Error;
580
- Ok: principal;
613
+ Ok: EngramSessionState;
581
614
  };
582
615
  type Result_24 =
583
616
  variant {
584
617
  Err: Error;
585
- Ok: EngramSessionState;
618
+ Ok: Pairing;
586
619
  };
587
620
  type Result_23 =
588
621
  variant {
589
622
  Err: Error;
590
- Ok: Pairing;
623
+ Ok: CondensePreview;
591
624
  };
592
625
  type Result_22 =
593
626
  variant {
594
627
  Err: Error;
595
- Ok: CondensePreview;
628
+ Ok: RetentionPreview;
596
629
  };
597
630
  type Result_21 =
598
631
  variant {
599
632
  Err: Error;
600
- Ok: RetentionPreview;
633
+ Ok: vec BatchReadItem;
601
634
  };
602
635
  type Result_20 =
603
636
  variant {
604
637
  Err: Error;
605
- Ok: vec BatchReadItem;
638
+ Ok: MemoryByteChunk;
606
639
  };
607
640
  type Result_2 =
608
641
  variant {
@@ -612,47 +645,47 @@ type Result_2 =
612
645
  type Result_19 =
613
646
  variant {
614
647
  Err: Error;
615
- Ok: MemoryByteChunk;
648
+ Ok: EngramEscrowRecovery;
616
649
  };
617
650
  type Result_18 =
618
651
  variant {
619
652
  Err: Error;
620
- Ok: EngramEscrowRecovery;
653
+ Ok: GuardianRecord;
621
654
  };
622
655
  type Result_17 =
623
656
  variant {
624
657
  Err: Error;
625
- Ok: GuardianRecord;
658
+ Ok: ResetReport;
626
659
  };
627
660
  type Result_16 =
628
661
  variant {
629
662
  Err: Error;
630
- Ok: ResetReport;
663
+ Ok: ResyncReport;
631
664
  };
632
665
  type Result_15 =
633
666
  variant {
634
667
  Err: Error;
635
- Ok: ResyncReport;
668
+ Ok: nat;
636
669
  };
637
670
  type Result_14 =
638
671
  variant {
639
672
  Err: Error;
640
- Ok: nat;
673
+ Ok: SessionContext;
641
674
  };
642
675
  type Result_13 =
643
676
  variant {
644
677
  Err: Error;
645
- Ok: SessionContext;
678
+ Ok: MemoryFile;
646
679
  };
647
680
  type Result_12 =
648
681
  variant {
649
682
  Err: Error;
650
- Ok: MemoryFile;
683
+ Ok: BackupRetentionReport;
651
684
  };
652
685
  type Result_11 =
653
686
  variant {
654
687
  Err: Error;
655
- Ok: BackupRetentionReport;
688
+ Ok: record {activatesAtNs: int;};
656
689
  };
657
690
  type Result_10 =
658
691
  variant {
@@ -699,10 +732,21 @@ type RecordNote =
699
732
  auditId: nat;
700
733
  note: text;
701
734
  };
735
+ type RecipientHistory =
736
+ record {
737
+ firstPaidAtNs: opt int;
738
+ historyFull: bool;
739
+ largestPaidE6: nat;
740
+ lastPaidAtNs: opt int;
741
+ listedSeller: bool;
742
+ liveNow: bool;
743
+ paidBefore: bool;
744
+ timesPaid: nat;
745
+ };
702
746
  type ReceiptPage =
703
747
  record {
704
748
  firstAvailableSeq: nat;
705
- page: Page_11;
749
+ page: Page_12;
706
750
  scannedThroughSeq: nat;
707
751
  };
708
752
  type RailHealth =
@@ -744,7 +788,7 @@ type PaymentsNow =
744
788
  };
745
789
  type PaymentSignatureCounts =
746
790
  record {
747
- agents: Page_5;
791
+ agents: Page_6;
748
792
  day: int;
749
793
  limit: nat;
750
794
  marketplace: opt MarketplacePaymentSignatures;
@@ -777,71 +821,71 @@ type Pairing =
777
821
  };
778
822
  type Page_9 =
779
823
  record {
780
- items: vec MemoryLogEvent;
824
+ items: vec ApprovalRequest;
781
825
  total: nat;
782
826
  withheld: nat;
783
827
  };
784
828
  type Page_8 =
785
829
  record {
786
- items: vec ApprovalRequest;
830
+ items: vec EngramSessionState;
787
831
  total: nat;
788
832
  withheld: nat;
789
833
  };
790
834
  type Page_7 =
791
835
  record {
792
- items: vec EngramSessionState;
836
+ items: vec OwnershipTransfer;
793
837
  total: nat;
794
838
  withheld: nat;
795
839
  };
796
840
  type Page_6 =
797
841
  record {
798
- items: vec OwnershipTransfer;
842
+ items: vec AgentPaymentSignatures;
799
843
  total: nat;
800
844
  withheld: nat;
801
845
  };
802
846
  type Page_5 =
803
847
  record {
804
- items: vec AgentPaymentSignatures;
848
+ items: vec PurgedAgent;
805
849
  total: nat;
806
850
  withheld: nat;
807
851
  };
808
852
  type Page_4 =
809
853
  record {
810
- items: vec PurgedAgent;
854
+ items: vec AuditEntry;
811
855
  total: nat;
812
856
  withheld: nat;
813
857
  };
814
858
  type Page_3 =
815
859
  record {
816
- items: vec AuditEntry;
860
+ items: vec RecordNote;
817
861
  total: nat;
818
862
  withheld: nat;
819
863
  };
820
- type Page_25 =
864
+ type Page_26 =
821
865
  record {
822
866
  items: vec OwnerRow;
823
867
  total: nat;
824
868
  withheld: nat;
825
869
  };
826
- type Page_24 =
870
+ type Page_25 =
827
871
  record {
828
872
  items: vec ActivitySnapshot;
829
873
  total: nat;
830
874
  withheld: nat;
831
875
  };
832
- type Page_23 =
876
+ type Page_24 =
833
877
  record {
834
878
  items: vec AgentSpendRow;
835
879
  total: nat;
836
880
  withheld: nat;
837
881
  };
838
- type Page_22 =
882
+ type Page_23 =
839
883
  record {
840
884
  items: vec AgentRecord;
841
885
  total: nat;
842
886
  withheld: nat;
843
887
  };
844
- type Page_21 =
888
+ type Page_22 =
845
889
  record {
846
890
  items: vec record {
847
891
  name: text;
@@ -851,81 +895,87 @@ type Page_21 =
851
895
  total: nat;
852
896
  withheld: nat;
853
897
  };
854
- type Page_20 =
898
+ type Page_21 =
855
899
  record {
856
900
  items: vec BackupMetadata;
857
901
  total: nat;
858
902
  withheld: nat;
859
903
  };
904
+ type Page_20 =
905
+ record {
906
+ items: vec BearerToken;
907
+ total: nat;
908
+ withheld: nat;
909
+ };
860
910
  type Page_2 =
861
911
  record {
862
- items: vec RecordNote;
912
+ items: vec Repudiation;
863
913
  total: nat;
864
914
  withheld: nat;
865
915
  };
866
916
  type Page_19 =
867
917
  record {
868
- items: vec BearerToken;
918
+ items: vec CondenseCheckpointRow;
869
919
  total: nat;
870
920
  withheld: nat;
871
921
  };
872
922
  type Page_18 =
873
923
  record {
874
- items: vec CondenseCheckpointRow;
924
+ items: vec CycleSnapshot;
875
925
  total: nat;
876
926
  withheld: nat;
877
927
  };
878
928
  type Page_17 =
879
929
  record {
880
- items: vec CycleSnapshot;
930
+ items: vec text;
881
931
  total: nat;
882
932
  withheld: nat;
883
933
  };
884
934
  type Page_16 =
885
935
  record {
886
- items: vec text;
936
+ items: vec Eip712Destination;
887
937
  total: nat;
888
938
  withheld: nat;
889
939
  };
890
940
  type Page_15 =
891
941
  record {
892
- items: vec Eip712Destination;
942
+ items: vec Eip712TypeView;
893
943
  total: nat;
894
944
  withheld: nat;
895
945
  };
896
946
  type Page_14 =
897
947
  record {
898
- items: vec Eip712TypeView;
948
+ items: vec GuardianDispute;
899
949
  total: nat;
900
950
  withheld: nat;
901
951
  };
902
952
  type Page_13 =
903
953
  record {
904
- items: vec GuardianDispute;
954
+ items: vec GuardianRecord;
905
955
  total: nat;
906
956
  withheld: nat;
907
957
  };
908
958
  type Page_12 =
909
959
  record {
910
- items: vec GuardianRecord;
960
+ items: vec ExportReceiptRow;
911
961
  total: nat;
912
962
  withheld: nat;
913
963
  };
914
964
  type Page_11 =
915
965
  record {
916
- items: vec ExportReceiptRow;
966
+ items: vec MemoryFileRow;
917
967
  total: nat;
918
968
  withheld: nat;
919
969
  };
920
970
  type Page_10 =
921
971
  record {
922
- items: vec MemoryFileRow;
972
+ items: vec MemoryLogEvent;
923
973
  total: nat;
924
974
  withheld: nat;
925
975
  };
926
976
  type Page_1 =
927
977
  record {
928
- items: vec Repudiation;
978
+ items: vec SellerView;
929
979
  total: nat;
930
980
  withheld: nat;
931
981
  };
@@ -942,6 +992,16 @@ type OwnershipTransfer =
942
992
  from: opt principal;
943
993
  to: principal;
944
994
  };
995
+ type OwnerSignInView =
996
+ record {
997
+ askedAtNs: opt int;
998
+ callerIsAsked: bool;
999
+ callerIsSignIn: bool;
1000
+ declinedAtNs: opt int;
1001
+ declinedBy: opt principal;
1002
+ openedFrom: opt principal;
1003
+ ownerSignIn: opt principal;
1004
+ };
945
1005
  type OwnerRow =
946
1006
  record {
947
1007
  firstPaymentDay: opt nat;
@@ -1157,13 +1217,21 @@ type LogPage =
1157
1217
  record {
1158
1218
  firstAvailableSeq: nat;
1159
1219
  head: blob;
1160
- page: Page_9;
1220
+ page: Page_10;
1161
1221
  };
1162
1222
  type KeyNomination =
1163
1223
  record {
1164
1224
  atNs: int;
1165
1225
  key: principal;
1166
1226
  };
1227
+ type KeyBackupStatus =
1228
+ record {
1229
+ copyWaitsWithAsk: bool;
1230
+ matchesSignIn: bool;
1231
+ sealed: bool;
1232
+ sealedAtNs: opt int;
1233
+ sealedFor: opt principal;
1234
+ };
1167
1235
  type Ic402Maintenance =
1168
1236
  record {
1169
1237
  dailySpendRemoved: nat;
@@ -1342,7 +1410,13 @@ type Engram =
1342
1410
  /// nomination names. That check compares the caller inside the module, where
1343
1411
  /// test/key-replacement.test.mo runs it; this body names no roster gate, because the caller holds
1344
1412
  /// no role here until the move.
1345
- acceptAgentKeyNomination: (agentKey: principal) -> (Result_83);
1413
+ acceptAgentKeyNomination: (agentKey: principal) -> (Result_89);
1414
+ /// The person the owner asked again ACCEPTS: they become this engram's sign-in, and the sealed copy
1415
+ /// that came with the ask becomes the engram's (sealed for them). Until this call they have no power
1416
+ /// at all. Callable only by that person while the ask waits; refused (as at birth) if they are now
1417
+ /// an agent or a guardian here.
1418
+ /// Named caller: an owner console — "accept" on a waiting ask, signed in as the person asked.
1419
+ acceptSignIn: () -> (Result_2);
1346
1420
  /// Consensus transform for the alert webhook outcall: collapse the response to status-only so
1347
1421
  /// replicas agree regardless of response headers/body (we only care that the POST landed 2xx).
1348
1422
  ///
@@ -1372,7 +1446,7 @@ type Engram =
1372
1446
  /// and works while frozen; a value is 1–128 characters (an address, or a venue value such as an
1373
1447
  /// account name). The action must be registered: a destination list belongs to an action, and a
1374
1448
  /// list for no action would be a value nothing checks. The caller is the owner's app.
1375
- addEip712Destination: (typeId: blob, value: text) -> (Result_82);
1449
+ addEip712Destination: (typeId: blob, value: text) -> (Result_11);
1376
1450
  /// Register a typed-data shape as signable. Owner-only, freeze-gated (a registration is a grant
1377
1451
  /// of FUTURE authority — a frozen engram must not be able to widen what it can sign), and the
1378
1452
  /// shape is IMMUTABLE: any change mints a new typeId.
@@ -1388,6 +1462,14 @@ type Engram =
1388
1462
  /// `eip712SignFor` before the cap reservation. Before this, a withdrawal registered as `#standard`
1389
1463
  /// needed no webhook, no guardian and no destination field, waited one hour, and signed to any
1390
1464
  /// address. Intrinsic checks still come first and the watchers last (the 2026-08-06 re-ordering).
1465
+ ///
1466
+ /// ⟨2026-11-02, the child build's stage 5⟩ In an engram opened through another, after the spec's own
1467
+ /// checks: the venue actions that move money or control to another account are refused by name
1468
+ /// (`HyperliquidTransaction:` `UsdSend`, `SpotSend`, `SendAsset`, `SendToEvmWithData`,
1469
+ /// `ConvertToMultiSigUser`, `ApproveBuilderFee`, `TokenDelegate` — `#Refused`), and
1470
+ /// `HyperliquidTransaction:Withdraw` registers only with a must-equal rule on `destination` naming this
1471
+ /// engram's own pay address (`#Refused` otherwise; `#Conflict` while the pay address has not been
1472
+ /// derived — call `getEvmAddress` first). A first engram is unchanged.
1391
1473
  addEip712Type: (spec:
1392
1474
  record {
1393
1475
  ackIrrevocable: bool;
@@ -1412,7 +1494,7 @@ type Engram =
1412
1494
  };
1413
1495
  primaryType: text;
1414
1496
  verifyingContract: text;
1415
- }) -> (Result_81);
1497
+ }) -> (Result_87);
1416
1498
  /// ⟨0.16.0, L1⟩ THE ROLE-CONFLICT ARM, and why three refusals here are not the same refusal.
1417
1499
  ///
1418
1500
  /// This method had five distinct ways to say no through one `text`, and a caller could only tell
@@ -1431,7 +1513,17 @@ type Engram =
1431
1513
  /// refused by `requireOwner`'s own words. Empty words, words over `RecordWords.WORDS_MAX` or
1432
1514
  /// holding a line break are `#Invalid`; an id past the head is `#NotFound`; nothing is recorded
1433
1515
  /// on any refusal.
1434
- addRecordNote: (about: nat, note: text) -> (Result_14);
1516
+ addRecordNote: (about: nat, note: text) -> (Result_15);
1517
+ /// List a seller: from 24 hours after this call, x402 may pay `payTo` up to `perDayCapE6` a UTC day
1518
+ /// (minor units of a six-decimal stablecoin — 1_000_000 is $1.00) without an approval, and a payment
1519
+ /// to it no longer counts against the engram-wide ceiling or the paying agent's own limits. Above the
1520
+ /// cap a payment goes to the approval queue like any other. `isPayout` marks it as where this engram
1521
+ /// pays out (the same row, its own cap). The sign-in only, in an engram opened through another; the
1522
+ /// owner in a first engram. Refused while payments are frozen, for a malformed or already-listed
1523
+ /// address, a cap of 0, and past `Sellers.MAX_SELLERS` rows. Answers when the row starts to count.
1524
+ /// Named callers: an owner console's seller list for an engram (signed in as its sign-in, for one
1525
+ /// opened through another), and the owner kit.
1526
+ addSeller: (payTo: text, perDayCapE6: nat, isPayout: bool) -> (Result_11);
1435
1527
  /// Returns the write RECEIPT, not just the version.
1436
1528
  ///
1437
1529
  /// The receipt was always computed and then thrown away: MemoryRouter hands back
@@ -1463,7 +1555,7 @@ type Engram =
1463
1555
  /// Gated on requireWritesNotPaused — unlike the export. This one destroys retained entries, which
1464
1556
  /// is exactly what a guardian pause exists to hold. No action alert is raised: the operation is
1465
1557
  /// owner-initiated, owner-only, and already chained into the audit log.
1466
- applyCondense: (toSeq: nat) -> (Result_80);
1558
+ applyCondense: (toSeq: nat) -> (Result_85);
1467
1559
  /// Owner-only: activate a guardian who has registered against an invite.
1468
1560
  ///
1469
1561
  /// Until this call the guardian is `#Pending` and can do NOTHING — registering is a claim, this
@@ -1494,6 +1586,16 @@ type Engram =
1494
1586
  /// no longer pending — already approved, denied or expired. The status is in the message because
1495
1587
  /// "not pending" is the one refusal here an owner acts on differently depending on which it is.
1496
1588
  approveRequest: (requestId: text) -> (Result_2);
1589
+ /// The OWNER asks the person who last declined to be this engram's sign-in again. No principal
1590
+ /// argument: the ask goes to `signInDeclinedBy` alone, so the key file can never seat a sign-in of
1591
+ /// its choosing — re-asking the person who already said no gives a thief nothing. `sealed` is the
1592
+ /// owner's key sealed by the kit for that person; it is stored with the ask, inert, and becomes the
1593
+ /// engram's sealed copy only if they accept. Refused in a first engram, while a sign-in is in place,
1594
+ /// when nobody ever declined (an engram opened without a sign-in has nobody to ask, for life), while
1595
+ /// an ask already waits, within 7 days of the last decline (`OwnerSignIn.askRefusal`), and when the
1596
+ /// person has since become an agent or a guardian here. The sign-in and the person asked are refused.
1597
+ /// Named caller: the owner kit, signed by the agent's lasting key (it seals the key for that person).
1598
+ askSignInAgain: (sealed: blob) -> (Result_2);
1497
1599
  /// Discard a backup started by `backupInit` and never finalized. The way out of a failed upload,
1498
1600
  /// and the reason a stalled one need not occupy space indefinitely. Same gate as the rest of the
1499
1601
  /// write half: owner, or an agent holding `canAppendMemory`.
@@ -1534,13 +1636,13 @@ type Engram =
1534
1636
  ///
1535
1637
  /// The write half also refuses while writes are PAUSED.
1536
1638
  backupInit: (dbType: text, backupType: BackupType, parentBackupId:
1537
- opt text, sha256: text, backupLabel: opt text) -> (Result_53);
1639
+ opt text, sha256: text, backupLabel: opt text) -> (Result_55);
1538
1640
  /// Read one chunk of a finalized backup, by index.
1539
1641
  ///
1540
1642
  /// ⚠ GATED ON `read_backup`, which is NOT the permission the upload half uses — that one is
1541
1643
  /// `canAppendMemory`. Holding one says nothing about the other, deliberately: taking a backup and
1542
1644
  /// carrying it away are different authorities.
1543
- backupPullChunk: (backupId: text, chunkIndex: nat) -> (Result_69) query;
1645
+ backupPullChunk: (backupId: text, chunkIndex: nat) -> (Result_72) query;
1544
1646
  backupPushChunk: (backupId: text, chunkIndex: nat, data: blob) ->
1545
1647
  (Result_2);
1546
1648
  /// The OWNER cancels an agent's pending key nomination; the agent keeps its current key. Refused
@@ -1573,7 +1675,7 @@ type Engram =
1573
1675
  /// ⟨2026-10-02⟩ The second parameter is NAMED `amountE6` now, as the census row above rules the
1574
1676
  /// pair — e6 base units of the token named first. A name only: Candid passes arguments by
1575
1677
  /// position, so nothing on the wire moved.
1576
- convertEarningsToCycles: (token: text, amountE6: nat) -> (Result_14);
1678
+ convertEarningsToCycles: (token: text, amountE6: nat) -> (Result_15);
1577
1679
  /// Owner-only: mint a single-use invite code an agent redeems with `pairAgent`.
1578
1680
  ///
1579
1681
  /// ⚠ READ THIS BEFORE INVITING SOMEONE BACK. Pairing is ONE-SHOT PER PRINCIPAL on
@@ -1602,7 +1704,7 @@ type Engram =
1602
1704
  /// ⟨2026-10-29, review F7⟩ A name the owner gives meets the rule `renameAgent` applies: a line break
1603
1705
  /// or another control character is `#Invalid` (`People.nameRefusal`), as a rename to it would be.
1604
1706
  createAgentInvite: (name: text, permissions: AgentPermissions) ->
1605
- (Result_53);
1707
+ (Result_55);
1606
1708
  /// Owner-only: mint an invite for a GUARDIAN — an independent check on agents, not a
1607
1709
  /// co-owner and not a recovery agent.
1608
1710
  ///
@@ -1625,7 +1727,22 @@ type Engram =
1625
1727
  /// So an invite that fails to redeem for that reason is not a bad code. The rule exists because
1626
1728
  /// a check must be independent of the thing it checks.
1627
1729
  createGuardianInvite: (name: text, permissions: GuardianPermissions) ->
1628
- (Result_53);
1730
+ (Result_55);
1731
+ /// The sign-in GIVES ITSELF UP, or the person the owner asked again says no. ⟨the owner's ruling "1
1732
+ /// yes, but the child can ask again" — the child build's Challenge C3.1: whoever the kit names cannot
1733
+ /// otherwise refuse a seat they never agreed to⟩
1734
+ /// · as the sign-in: the slot empties, the sealed copy of the owner's key is deleted (nobody may
1735
+ /// hold a copy for a seat that is gone), and the caller is recorded as the one who declined, with
1736
+ /// the time. The engram keeps its small limits; the owner may ask this person again in 7 days.
1737
+ /// Listed sellers stop counting at once (a raise waiting in them too): the rows are kept, and
1738
+ /// count again only if this person accepts a re-ask (`Sellers.inForce`).
1739
+ /// · as the person a waiting ask goes to: the ask and the copy that came with it are dropped, and
1740
+ /// the decline's time moves to now (the next ask waits another 7 days).
1741
+ /// The key file is refused: it cannot empty the slot (a thief would, to strand the honest owner's
1742
+ /// approvals). A first engram has nothing to decline.
1743
+ /// Named caller: an owner console — the sign-in's "decline", and the person asked's "decline" on a
1744
+ /// waiting ask.
1745
+ declineSignIn: () -> (Result_2);
1629
1746
  /// OWNER-ONLY deletion of a stored backup.
1630
1747
  ///
1631
1748
  /// ⚠ NOT THE SAME GATE AS THE REST OF THE FAMILY, and the asymmetry is deliberate: `backupInit`,
@@ -1668,7 +1785,7 @@ type Engram =
1668
1785
  /// WHAT: an entry the owner's review would show (`qualifiesForReview` — an agent's append or
1669
1786
  /// revision, or a paid session's append) that succeeded, still held in full by the ring.
1670
1787
  /// One dispute per guardian per write (`#Conflict`, the first stands).
1671
- disputeAgentWrite: (about: nat, reason: text) -> (Result_14);
1788
+ disputeAgentWrite: (about: nat, reason: text) -> (Result_15);
1672
1789
  /// Record that log entries [fromSeq, toSeq] were served, and return the root that proves it.
1673
1790
  ///
1674
1791
  /// This is the receipt ledgerfs Q2 requires before any of those entries may be condensed away.
@@ -1682,7 +1799,7 @@ type Engram =
1682
1799
  /// situation rather than a safety measure. It IS gated on requireMemoryAttached: a store that
1683
1800
  /// failed its integrity check must not attest anything it cannot vouch for.
1684
1801
  exportMemoryRange: (fromSeq: nat, toSeq: nat, authorFilter:
1685
- opt principal) -> (Result_79);
1802
+ opt principal) -> (Result_84);
1686
1803
  /// ⟨0.16.0, L2.2 — renamed from `guardianFreezePayments`⟩ The prefix LIED about who may call it.
1687
1804
  /// The gate is `requireOwnerOrGuardian`, and an owner freezing their own payments is the ordinary
1688
1805
  /// case — the guardian is the exceptional one. A name that says otherwise sends an owner looking
@@ -1724,7 +1841,9 @@ type Engram =
1724
1841
  /// brake is NOT pulled — the caller pulls it with `freezePayments`, or shortens the words.
1725
1842
  freezePaymentsWithReason: (reason: text) -> (Result_2);
1726
1843
  /// Delivery status + config readback. Owner-only (the URL is a secret).
1727
- getActionAlertStatus: () -> (Result_67) query;
1844
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
1845
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
1846
+ getActionAlertStatus: () -> (Result_73) query;
1728
1847
  /// Agents need to know what they may revise, so they can read it too. Whole-value config, same
1729
1848
  /// carve-out as getProtectedPaths — and kept a SEPARATE method from it deliberately (L2.2): a
1730
1849
  /// protected path and a revisable path are opposite grants, and one accessor for both would be a
@@ -1732,7 +1851,7 @@ type Engram =
1732
1851
  ///
1733
1852
  /// Refusal reason preserved from the trap: a grant is a power, and its absence and its
1734
1853
  /// concealment are different facts.
1735
- getAgentRevisablePaths: () -> (Result_63) query;
1854
+ getAgentRevisablePaths: () -> (Result_66) query;
1736
1855
  /// OWNER-ONLY: every engagement's seat weeks on this engram, with the agent's root — the day it
1737
1856
  /// paired, the days of its first and last payment signature, a 64-week map whose bit 0 is the week
1738
1857
  /// of the last one, and how many were produced. Never an amount, a recipient or a nonce.
@@ -1743,7 +1862,9 @@ type Engram =
1743
1862
  /// order. Anyone else is refused by name (`#Refused getAgentSeatWeeks: …`), never answered with an
1744
1863
  /// empty page. Paged; `total` is every engagement ever paired here (a reset keeps the rows).
1745
1864
  /// Two rows can name one root: an agent paired again after it left is a second engagement.
1746
- getAgentSeatWeeks: (start: nat, limit: nat) -> (Result_77) query;
1865
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
1866
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
1867
+ getAgentSeatWeeks: (start: nat, limit: nat) -> (Result_82) query;
1747
1868
  /// Owner: everything written into this engram by someone other than the owner since the last
1748
1869
  /// markAgentWritesReviewed() — agent appends/revisions AND paid-session appends (see
1749
1870
  /// qualifiesForReview for why those two families are recognised differently).
@@ -1751,7 +1872,10 @@ type Engram =
1751
1872
  /// them — the UI must page (markAgentWritesReviewed(?lastShownId)) and must NOT present 200
1752
1873
  /// as a total. `earliest` discloses ring eviction — if cursor < earliest, entries between them
1753
1874
  /// aged out of the ring (the CHAIN still proves total count; this view can't show their bodies).
1754
- getAgentWriteReview: () -> (Result_76) query;
1875
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
1876
+ /// an engram opened through another, as the owner (`AccessControl.requireOwnerOrSignIn`); a first
1877
+ /// engram is unchanged.
1878
+ getAgentWriteReview: () -> (Result_81) query;
1755
1879
  /// Why anchoring is or is not advancing. PUBLIC: ungated on purpose — detecting a stalled
1756
1880
  /// engram is the point, a gated read would fail-to-empty and hand a third party fabricated zeros,
1757
1881
  /// and none of these fields is a secret — `total` is already public via getCertifiedAuditHead.
@@ -1770,7 +1894,7 @@ type Engram =
1770
1894
  /// below serves the same head WITH the subnet certificate for a caller that needs to verify it
1771
1895
  /// was signed rather than asserted.
1772
1896
  getAuditHead: () -> (AuditHead) query;
1773
- getBackupMetadata: (backupId: text) -> (Result_75) query;
1897
+ getBackupMetadata: (backupId: text) -> (Result_80) query;
1774
1898
  /// ⟨2026-10-21, the owner's round-11 answer m: a backup-retention getter⟩ How many backups of
1775
1899
  /// `dbType` each creator keeps, and whether that is the default — the read `setBackupRetention`
1776
1900
  /// lacked, so "Keeps your newest 3" showed only on the phone that last set it.
@@ -1781,7 +1905,7 @@ type Engram =
1781
1905
  /// denied"), a revoked or resigned agent, a guardian (guardians take no backups), a stranger and
1782
1906
  /// the anonymous caller. A kind the setter would refuse is `#Invalid` here too
1783
1907
  /// (`Backup.getRetention`). Records nothing (a query).
1784
- getBackupRetention: (dbType: text) -> (Result_74) query;
1908
+ getBackupRetention: (dbType: text) -> (Result_79) query;
1785
1909
  /// The cashier this engram recognises as its rent biller — `null` until the registry pushes one.
1786
1910
  ///
1787
1911
  /// PUBLIC: a payer about to send money needs to know which cashier this engram will accept credit
@@ -1796,7 +1920,9 @@ type Engram =
1796
1920
  /// from, which is the owner's to disclose, not the registry's. The certified half is at the registry
1797
1921
  /// (`getCertifiedBirth`, public, revealing only whether a fingerprint is present); the client's
1798
1922
  /// `verifyBirthChain` checks both. Refused to anyone else by the combinator (`#ownerOnly`).
1799
- getBirthChain: () -> (Result_73) query;
1923
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
1924
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
1925
+ getBirthChain: () -> (Result_78) query;
1800
1926
  /// ⟨2026-10-21, the owner's round-11 answer d⟩ Each brake: on or off, and while on, who pulled it
1801
1927
  /// LAST (their key and whether as owner or guardian), since when, and the reason they gave — the
1802
1928
  /// same person and time as the newest brake entry on the record (`RecordWords.BrakePull`). For the
@@ -1805,7 +1931,7 @@ type Engram =
1805
1931
  /// — an agent learns a brake is on from the refusal of what it tried, and needs no more). `pull`
1806
1932
  /// is null for a brake that is off, and for one carried on across the upgrade that added this
1807
1933
  /// read (who pulled it was not recorded then) — never a guessed pull.
1808
- getBrakes: () -> (Result_72) query;
1934
+ getBrakes: () -> (Result_77) query;
1809
1935
  /// ⟨0.16.0, L9/L10 — census row⟩ `Wire.CertifiedAuditHead`, not an anonymous record. The
1810
1936
  /// registry, market and cashier already served the shared type; the engram — the canister that
1811
1937
  /// IS the evidence product — was the one chain still answering in a shape of its own, missing
@@ -1828,11 +1954,31 @@ type Engram =
1828
1954
  /// query's state writes are discarded when it returns, and the `denied` call first written here
1829
1955
  /// recorded nothing while reading as if it did. The refusal is loud in the reply instead. WHAT
1830
1956
  /// WOULD MAKE THIS WRONG: a reason to record who asked — then this becomes an update that says so.
1831
- getChildAllowance: (agentPrincipal: principal) -> (Result_71) query;
1957
+ getChildAllowance: (agentPrincipal: principal) -> (Result_76) query;
1832
1958
  /// Owner-only, Billing-class: what opening an engram costs this engram, the balance below which an
1833
1959
  /// agent's request is refused, the balance now, and every agent's allowance. The console's cost
1834
1960
  /// sentence reads it. Cycles are owner-class information, as on the owner's console read.
1835
- getChildOpening: () -> (Result_70) query;
1961
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
1962
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
1963
+ getChildOpening: () -> (Result_75) query;
1964
+ /// Derive the key that opens the sealed copy, encrypted under the caller's transport public key —
1965
+ /// for the SIGN-IN alone (the combinator's `#ownerSignIn`; the key file is refused by name: only the
1966
+ /// sign-in opens the backup, and the key file holds the plaintext anyway). The derivation input is the
1967
+ /// sign-in's own principal, the same identity the kit sealed the copy to, so a former sign-in's key
1968
+ /// never opens a copy re-sealed for its successor. Refused in a first engram, with no sign-in, and
1969
+ /// with no copy, all before the call. The opening is recorded (`keyBackup.opened`), so the owner's
1970
+ /// alert fires: the one act a thief holding the sign-in cannot hide. Not blocked by a freeze: a
1971
+ /// freeze must never lock the owner out of its own key.
1972
+ /// ⟨CORRECTED 2026-11-03, the stage-6 review's m1, beside the sentence above⟩ "cannot hide" overstates
1973
+ /// it: in an engram opened through another the sign-in sets the alert address, so a thief holding the
1974
+ /// sign-in can re-point it first. Each opening is recorded in the engram's record (which the key file
1975
+ /// reads) and alerted to whatever address the sign-in has set.
1976
+ ///
1977
+ /// ⟨L7⟩ UPDATE, NOT QUERY, and this is the system call that forces it: the body awaits
1978
+ /// `VetKeys.ManagementCanister.vetKdDeriveKey`. A query cannot await.
1979
+ /// Named callers: an owner console signed in as the sign-in (the browser's recovery), and the owner
1980
+ /// kit's `--recover-key` signed by a key-file sign-in.
1981
+ getEncryptedKeyBackupKey: (transportPublicKey: blob) -> (Result_72);
1836
1982
  /// Derive the shared memory-encryption key, encrypted under the caller's transport
1837
1983
  /// public key. Gated to owner + read-agents (the same principals allowed to read
1838
1984
  /// memory). The client decrypts it locally with its transport secret key.
@@ -1857,7 +2003,7 @@ type Engram =
1857
2003
  /// cost. Stated here because L7 requires the reason be readable from the interface rather than
1858
2004
  /// inferred by opening the body — which is exactly what had to happen to write this line.
1859
2005
  getEncryptedMemoryKey: (epoch: opt nat, transportPublicKey: blob) ->
1860
- (Result_69);
2006
+ (Result_72);
1861
2007
  /// ⟨0.16.0, owner ruling 2026-08-20 — option (a)⟩ `x402Support` REPORTS THE RAIL, not a constant.
1862
2008
  ///
1863
2009
  /// The card's config hardcodes `x402Support = true`, answering a buyer's question with a fact
@@ -1952,7 +2098,7 @@ type Engram =
1952
2098
  /// It refuses rather than half-answers: if either address cannot be derived the reply is
1953
2099
  /// `#Err`, never a record carrying an empty string (ic402's `getEvmAddress` answers `""` on a
1954
2100
  /// failed derivation — that is fail-to-empty on a money surface, and it stops here).
1955
- getEvmAddress: () -> (Result_68);
2101
+ getEvmAddress: () -> (Result_74);
1956
2102
  /// The owner's OWN EVM address, if they registered one — distinct from `getEvmAddress`, which is
1957
2103
  /// the address this canister derives for itself.
1958
2104
  ///
@@ -1967,7 +2113,10 @@ type Engram =
1967
2113
  /// the management canister's `ecdsa_public_key`. A query cannot await, so the round-trip is the
1968
2114
  /// cost — stated here because L7 requires the reason be readable from the interface rather than
1969
2115
  /// inferred by opening the body.
1970
- getEvmSignerAddress: () -> (Result_53);
2116
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2117
+ /// an engram opened through another, as the owner (`AccessControl.requireOwnerOrSignIn`); a first
2118
+ /// engram is unchanged.
2119
+ getEvmSignerAddress: () -> (Result_55);
1971
2120
  /// PUBLIC: where this chain begins, for the stranger deciding whether to trust it.
1972
2121
  ///
1973
2122
  /// The fourth of the four evidence methods (`getAuditHead`, `getCertifiedAuditHead`,
@@ -1976,7 +2125,40 @@ type Engram =
1976
2125
  /// cannot verify it, and nothing here identifies anybody.
1977
2126
  getGenesisNote: () -> (GenesisNote) query;
1978
2127
  /// A guardian's own channel status (their URL is their secret — each guardian sees only theirs).
1979
- getGuardianAlertStatus: () -> (Result_67) query;
2128
+ getGuardianAlertStatus: () -> (Result_73) query;
2129
+ /// The sealed copy itself — opaque bytes only the sign-in can open. Readable by the sign-in (it
2130
+ /// opens them with the key `getEncryptedKeyBackupKey` derives for it) and by the key file, which
2131
+ /// holds the plaintext already and so learns nothing — it reads them to compare with the copy the kit
2132
+ /// made (the Challenge's C2.11: a copy someone else stored first reads as "not this key", not as
2133
+ /// "sealed"). Refused in a first engram, and `#NotFound` when no copy is held. The copy that waits
2134
+ /// with an ask is never served here: it is inert until accepted.
2135
+ /// A QUERY: the refusal is in the reply, not the denial log (a query's writes are discarded).
2136
+ /// Named callers: the owner kit (`--recover-key`, and its check after sealing), and an owner console
2137
+ /// signed in as the sign-in (the browser's recovery).
2138
+ getKeyBackupCiphertext: () -> (Result_72) query;
2139
+ /// Whether this engram holds a sealed copy of its owner's key, for whom, since when, whether it is
2140
+ /// sealed for the sign-in seated now, and whether a copy waits with an ask (`Types.KeyBackupStatus`).
2141
+ /// Readable by the key file and the sign-in (`#ownerOrSignIn`); refused loudly to anyone else
2142
+ /// (ADR-0002). A first engram refuses by name rather than answer "not sealed": it never holds one,
2143
+ /// and an empty answer there would read as a child whose seal failed.
2144
+ /// A QUERY: the refusal is in the reply, not the denial log (a query's writes are discarded).
2145
+ /// Named callers: the owner kit after it opens an engram (it prints whether the copy is stored), and
2146
+ /// an owner console showing an engram opened through another (whether recovery can work).
2147
+ getKeyBackupStatus: () -> (Result_71) query;
2148
+ /// BLS verification key under which the owner kit seals the backup (`IbeCiphertext.encrypt` to the
2149
+ /// sign-in's principal) and the opener verifies the derived key. Served on-canister so the kit never
2150
+ /// has to know which master key this network uses (the spec's Q-K3: a wrong guess would seal a copy
2151
+ /// nobody can open). Static per (context, key id, canister) — cacheable.
2152
+ ///
2153
+ /// PUBLIC: intentionally unauthenticated — a vetKD public key reveals nothing secret and cannot
2154
+ /// decrypt anything — the sensitive derivation is getEncryptedKeyBackupKey below, which IS gated
2155
+ /// (the sign-in alone) and returns key material encrypted to the caller's transport key. The same
2156
+ /// reasoning as getMemoryKeyVerificationKey, for the backup's own context.
2157
+ /// ⟨L7⟩ UPDATE, NOT QUERY, and this is the system call that forces it: the body awaits
2158
+ /// `VetKeys.ManagementCanister.vetKdPublicKey`. A query cannot await.
2159
+ /// Named callers: the owner kit, when it seals the copy at birth or for an ask; an owner console,
2160
+ /// to verify the derived key during recovery.
2161
+ getKeyBackupVerificationKey: () -> (blob);
1980
2162
  /// The market this engram will accept signing requests from — `null` until the registry pushes
1981
2163
  /// one at spawn, which is why `requireMarket` refuses fleet-wide today.
1982
2164
  ///
@@ -2006,7 +2188,7 @@ type Engram =
2006
2188
  /// never renumbered: the next page starts at the last version returned plus one. Defaults
2007
2189
  /// return the whole history of any file a pre-FD engram could have held.
2008
2190
  getMemoryHistory: (path: text, start: opt nat, max: opt nat) ->
2009
- (Result_66) query;
2191
+ (Result_70) query;
2010
2192
  /// PUBLIC: the epoch alone, and deliberately nothing else (rotation study D4). A `rotatedAt[]`
2011
2193
  /// history would be a public, fleet-enumerable feed of when each owner terminated a trust
2012
2194
  /// relationship — readable by, among others, the party just terminated.
@@ -2047,7 +2229,7 @@ type Engram =
2047
2229
  /// Refusal reasons of both merge: an empty policy reads as "nothing is capped, every version kept
2048
2230
  /// forever" — a claim about what this engram will DESTROY — and an empty guard list reads as
2049
2231
  /// "nothing is held back".
2050
- getMemoryRetentionPolicy: () -> (Result_65) query;
2232
+ getMemoryRetentionPolicy: () -> (Result_69) query;
2051
2233
  /// The metrics reader this engram answers — `null` until the spawning registry names one.
2052
2234
  ///
2053
2235
  /// PUBLIC: an owner deciding whether to switch the read off needs to know who it is, and anyone
@@ -2060,7 +2242,7 @@ type Engram =
2060
2242
  /// see: the only row it can ever return is the caller's own, so "you are not a guardian here" is
2061
2243
  /// a fact about the caller, told to the caller. There is nothing to leak by omission — which is
2062
2244
  /// the test the #NotFound arm sets.
2063
- getMyGuardianStatus: () -> (Result_17) query;
2245
+ getMyGuardianStatus: () -> (Result_18) query;
2064
2246
  /// ⟨0.16.0, NEW⟩ The gated half of the status() split.
2065
2247
  ///
2066
2248
  /// Every field is bare — no masking, no `authorized` discriminator — because reaching this record
@@ -2070,7 +2252,16 @@ type Engram =
2070
2252
  /// was `nat`, then widened to `opt nat` so a refusal could be `null`, which broke every published
2071
2253
  /// client (rule 4) and bought a masked answer nobody had asked for — the census could not even
2072
2254
  /// find a consumer that read the masked `0`. Behind a gate there is nobody to mask it from.
2073
- getOwnerConsole: () -> (Result_64) query;
2255
+ getOwnerConsole: () -> (Result_68) query;
2256
+ /// The engram's sign-in, as `Types.OwnerSignInView` describes it: whether this engram was opened
2257
+ /// through another, who its sign-in is, whether the caller is it, and any decline or waiting ask.
2258
+ /// Readable by the owner's key, the sign-in, and the person a waiting ask goes to (they need to see
2259
+ /// the ask to answer it); refused loudly to anyone else (ADR-0002) — never an empty view, which would
2260
+ /// read as "no sign-in". A first engram answers its owner with every field null or false.
2261
+ /// A QUERY: the refusal is in the reply, not the denial log (a query's writes are discarded).
2262
+ /// Named callers: an owner console showing an engram opened through another (who signs in, and a
2263
+ /// waiting ask with Accept and Decline), and the owner kit after it opens one.
2264
+ getOwnerSignIn: () -> (Result_67) query;
2074
2265
  /// Owner + agents only (agents need it to avoid writing protected paths).
2075
2266
  ///
2076
2267
  /// A NAMED RECORD, not a Page: the setter replaces this list wholesale, so there is no window to
@@ -2082,7 +2273,18 @@ type Engram =
2082
2273
  /// path on this engram is protected", and an agent consults this list precisely to avoid
2083
2274
  /// writing one — so a fabricated empty here does not merely misinform, it invites the write the
2084
2275
  /// list exists to prevent.
2085
- getProtectedPaths: () -> (Result_63) query;
2276
+ getProtectedPaths: () -> (Result_66) query;
2277
+ /// What an approval card shows beside a payment to `payTo` (`Types.RecipientHistory`): whether an x402
2278
+ /// signature from this engram has paid it before and since when, whether it is a listed seller and
2279
+ /// counts now, and whether the history is full (then "not paid before" may be one it forgot). Read
2280
+ /// beside the request, because the stored request is never reshaped. For the key file and the sign-in
2281
+ /// (the owner in a first engram); refused loudly to anyone else. A malformed address is `#Invalid`.
2282
+ /// ⟨2026-11-02, the child build's stage 5⟩ Also how many times x402 has paid it and the largest of
2283
+ /// those payments (`timesPaid`, `largestPaidE6`, six-decimal minor units), so a card can say "paid 3
2284
+ /// times, largest $12"; the history forgets the address paid longest ago when full.
2285
+ /// ⟨2026-11-03, the pre-gate fixes⟩ And when it was LAST paid (`lastPaidAtNs`; null when never).
2286
+ /// Named callers: an owner console's approval card for a payment request.
2287
+ getRecipientHistory: (payTo: text) -> (Result_65) query;
2086
2288
  /// Whether the metrics reader's read is answered — `true` from birth.
2087
2289
  ///
2088
2290
  /// PUBLIC: the promise that an owner can switch this read off can be checked only if the switch
@@ -2091,7 +2293,12 @@ type Engram =
2091
2293
  /// Owner-only, Billing-class: the signing floor, the balance, one signature's price, and how many
2092
2294
  /// payment signatures the balance carries above the floor before `signX402Payment` is refused by
2093
2295
  /// name. The same numbers the check uses, so Billing can say only what the engram enforces.
2094
- getSigningFloor: () -> (Result_62) query;
2296
+ /// ⟨2026-11-01, "6 fix"⟩ Refused by name (`#Unavailable`) while this engram has not read its own
2297
+ /// freezing setting: there is no floor to serve then, and a 30-day figure would be a made-up one
2298
+ /// (ADR-0002) — the signers refuse in that state too, so the refusal is the truth on Billing.
2299
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2300
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
2301
+ getSigningFloor: () -> (Result_64) query;
2095
2302
  /// The registry that spawned this engram, if it recorded one.
2096
2303
  ///
2097
2304
  /// PUBLIC: it is the provenance claim. An engram asserting it is part of a fleet, under that
@@ -2108,7 +2315,9 @@ type Engram =
2108
2315
  /// configuration, and the engram-wide total would also tell one agent how much the others spent.
2109
2316
  /// A refusal names this method (`Gated.gatedResult`) rather than answering null/0 — a ceiling of
2110
2317
  /// "none" and a spend of 0 are both real answers, so a fabricated one would be read as fact.
2111
- getSpendCeiling: () -> (Result_61) query;
2318
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2319
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
2320
+ getSpendCeiling: () -> (Result_63) query;
2112
2321
  /// Read the caps in force for a caller.
2113
2322
  ///
2114
2323
  /// OWNER-ONLY, and this is where it diverges from the market's inbound twin, which is public.
@@ -2116,8 +2325,17 @@ type Engram =
2116
2325
  /// Here the engram serves no 402s at all: these caps are the owner's private custody
2117
2326
  /// configuration, and publishing them would tell any caller exactly how large a signing request
2118
2327
  /// can be before it needs an approval nobody is watching for.
2119
- getSpendPolicy: (caller: opt principal) -> (Result_60) query;
2120
- getStorageStats: () -> (Result_59) query;
2328
+ ///
2329
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2330
+ /// an engram opened through another, as the owner, through the combinator's `#ownerOrSignIn` (a first
2331
+ /// engram is unchanged: the owner only). The inline owner comparison that stood here is gone with it —
2332
+ /// one fewer unnamed caller guard. Its refusal sentence is kept as the reason it never fails soft:
2333
+ /// "Spending caps are the owner's custody configuration. Refusing rather than answering with
2334
+ /// defaults — a default-looking answer would understate the real limits to anyone probing them." The
2335
+ /// refusal itself is now the combinator's (`#Refused getSpendPolicy: …`, `requireOwner`'s words), and
2336
+ /// an engram with no owner yet is refused the same way rather than answered `#Conflict`.
2337
+ getSpendPolicy: (caller: opt principal) -> (Result_62) query;
2338
+ getStorageStats: () -> (Result_61) query;
2121
2339
  /// Timer arm-state. PUBLIC and deliberately so: these timers are self-arming to save cycles,
2122
2340
  /// and an optimisation nobody can verify is an optimisation nobody should trust. Cheap to read,
2123
2341
  /// leaks nothing (booleans about our own scheduling).
@@ -2200,12 +2418,12 @@ type Engram =
2200
2418
  /// ⟨L7⟩ MARKER ADDED 2026-08-23, reasoning above UNCHANGED — this block already said "Stays an
2201
2419
  /// UPDATE, marked per L7: it awaits three ICRC-1 ledgers". It was marked in prose and invisible
2202
2420
  /// to any gate; the glyph is what `scripts/check-update-for-read.mjs` matches.
2203
- getWalletBalances: () -> (Result_58);
2421
+ getWalletBalances: () -> (Result_60);
2204
2422
  /// Refusal reason preserved, and it is the clearest case of why a masked read is worse than no
2205
2423
  /// read: three empty strings with `configured = false` is a VALID-LOOKING answer meaning "this
2206
2424
  /// engram has no World ID configuration" — handed to a caller who merely lacks a grant. The
2207
2425
  /// fabrication is indistinguishable from the truth by construction.
2208
- getWorldIdConfig: () -> (Result_57) query;
2426
+ getWorldIdConfig: () -> (Result_59) query;
2209
2427
  /// ⟨L7⟩ UPDATE, NOT QUERY: this awaits THREE system calls — `raw_rand()` for the nonce,
2210
2428
  /// `Call.signWithEcdsa` for the signature, and `worldIdRpPublicKey()` for the derived key. A
2211
2429
  /// query can do none of them.
@@ -2214,7 +2432,7 @@ type Engram =
2214
2432
  /// Valid iff the derived signer address (getWorldIdRpSignerAddress) is registered for this rp_id in
2215
2433
  /// the World Developer Portal. Short-lived (300s TTL, idkit-server's default) and single-purpose —
2216
2434
  /// it authorizes opening one verification request, nothing else.
2217
- getWorldIdRpContext: () -> (Result_56);
2435
+ getWorldIdRpContext: () -> (Result_58);
2218
2436
  /// Owner-only: the EVM address derived from the engram's dedicated World ID RP signing key (the
2219
2437
  /// "worldid-rp" tECDSA path). Register THIS address as the rp_id's signer in the World Developer
2220
2438
  /// Portal — the engram never holds or exports a private key (only threshold shares exist, on the
@@ -2224,7 +2442,10 @@ type Engram =
2224
2442
  /// awaits `worldIdRpPublicKey()` (management `ecdsa_public_key`), and it calls `denied()` on
2225
2443
  /// refusal — a state write, which a query cannot perform. So even if the key were cached this
2226
2444
  /// could not become a query without silently retiring its denial record (ADR-0002's class).
2227
- getWorldIdRpSignerAddress: () -> (Result_53);
2445
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2446
+ /// an engram opened through another, as the owner (`AccessControl.requireOwnerOrSignIn`); a first
2447
+ /// engram is unchanged.
2448
+ getWorldIdRpSignerAddress: () -> (Result_55);
2228
2449
  /// The verified IDKitResult, verbatim, as World's /api/v4/verify accepted it — the re-checkable
2229
2450
  /// artifact behind verifiedHuman. Role-gated because it carries the NULLIFIER.
2230
2451
  /// `Result<opt Text>` — and the double wrapper is the entire point, not redundancy.
@@ -2243,7 +2464,7 @@ type Engram =
2243
2464
  /// `///`, so the dead name was PUBLISHED in engram.did and pointed every client at a method the
2244
2465
  /// canister does not serve. The tombstones below and at `about()` are historical and correct as
2245
2466
  /// written; this one was present tense, which is the difference that matters.⟩
2246
- getWorldIdVerification: () -> (Result_55) query;
2467
+ getWorldIdVerification: () -> (Result_57) query;
2247
2468
  /// ⟨0.16.0, L1⟩ THE EMERGENCY FAMILY. Every refusal below is `#Refused` or `#NotFound`, and the
2248
2469
  /// absence of a `#Conflict` here is the point: these are the calls someone makes while something
2249
2470
  /// is going wrong, and the only two answers that help are "you may not do this" and "there is
@@ -2318,7 +2539,10 @@ type Engram =
2318
2539
  ///
2319
2540
  /// Owner-gated because it reports on custody posture, and answered as a Result so that a
2320
2541
  /// wrong-identity caller gets a refusal rather than a bare `false` that reads as "no address yet".
2321
- isEvmAddressCached: () -> (Result_54) query;
2542
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2543
+ /// an engram opened through another, as the owner (`AccessControl.requireOwnerOrSignIn`); a first
2544
+ /// engram is unchanged.
2545
+ isEvmAddressCached: () -> (Result_56) query;
2322
2546
  /// Issue an OAuth authorization code. Called by an OAuth client's sign-in bridge
2323
2547
  /// (an `/auth/connector`-style route) after II authentication. The client then
2324
2548
  /// redirects the user's browser to `redirectUri` with `?code=<this>` so the
@@ -2326,7 +2550,7 @@ type Engram =
2326
2550
  ///
2327
2551
  /// Owner-only: only the engram owner can authorize a Connector install.
2328
2552
  issueAuthCode: (redirectUri: text, scope: text, codeChallenge: text,
2329
- clientId: opt text) -> (Result_53);
2553
+ clientId: opt text) -> (Result_55);
2330
2554
  /// ⟨0.16.0⟩ `getCycleSnapshotSource` DELETED — folded into `CycleSnapshot.source`, one label per
2331
2555
  /// ROW. A single label for a whole ring misattributes every row recorded under the other source,
2332
2556
  /// and the source flips by design (self-call first, balance on fallback). Its documentation of
@@ -2340,7 +2564,7 @@ type Engram =
2340
2564
  /// Refusal reason preserved, and it is the sharpest of this family: a masked `[]` reads as a
2341
2565
  /// DORMANT engram and corrupts retention math — a fabricated empty here does not just misinform a
2342
2566
  /// reader, it feeds a wrong number into a decision about destroying data.
2343
- listActivitySnapshots: (start: nat, limit: nat) -> (Result_52) query;
2567
+ listActivitySnapshots: (start: nat, limit: nat) -> (Result_54) query;
2344
2568
  /// ⟨2026-10-21, round 11 item l — the owner's answer "round 11: a, b, c, d, e, f, g, h, i, j, k, l,
2345
2569
  /// m."⟩ OWNER-ONLY: what each agent has spent today, beside the daily limit in force for it, so the
2346
2570
  /// agent rows can say "$0.50 of $5.00 today" where they said a count of payments. Read from the
@@ -2357,7 +2581,9 @@ type Engram =
2357
2581
  /// because the payment path keeps no figure then (`SpendCeiling.AgentSpendRow` says why).
2358
2582
  /// WHAT WOULD MAKE THIS WRONG: `x402SignFor` keeping the per-caller total by something other than
2359
2583
  /// the calling key, or under another day boundary.
2360
- listAgentSpendToday: (start: nat, limit: nat) -> (Result_51) query;
2584
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2585
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
2586
+ listAgentSpendToday: (start: nat, limit: nat) -> (Result_53) query;
2361
2587
  /// ⟨0.16.0⟩ THE PAGE EXEMPLAR. Trap → `#Refused`, bare array → `Result<Page<T>>` (L1 + L3).
2362
2588
  ///
2363
2589
  /// The refusal prose that used to be `gatedTrap`'s `whyNotEmpty` argument is not lost — it is why
@@ -2372,7 +2598,9 @@ type Engram =
2372
2598
  ///
2373
2599
  /// `withheld` is 0: this roster is owner-only in whole, so there is no partial-visibility case.
2374
2600
  /// A method that filters rows by caller sets it — see L1's row-level honesty rule.
2375
- listAgents: (start: nat, limit: nat) -> (Result_50) query;
2601
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2602
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
2603
+ listAgents: (start: nat, limit: nat) -> (Result_52) query;
2376
2604
  /// The GUARDIAN-audience projection of the agent roster — three fields, not the full record.
2377
2605
  ///
2378
2606
  /// Two audiences, two methods (L1/L8), rather than one method masking fields by caller: a
@@ -2384,7 +2612,7 @@ type Engram =
2384
2612
  /// Refusal reason preserved: `[]` reads as "this engram has no agents", and this is the list a
2385
2613
  /// guardian consults BEFORE REVOKING ONE. A fabricated empty here does not merely misinform —
2386
2614
  /// it tells someone acting under emergency powers that there is nothing to act on.
2387
- listAgentsForGuardian: (start: nat, limit: nat) -> (Result_49) query;
2615
+ listAgentsForGuardian: (start: nat, limit: nat) -> (Result_51) query;
2388
2616
  /// Owner-only: rows carry caller, amount, operation and free-text rationale. The SDK omits it.
2389
2617
  ///
2390
2618
  /// The optional leading filter SURVIVES the L3 reshape — ratified (census tier-2 #8) rather than
@@ -2397,7 +2625,7 @@ type Engram =
2397
2625
  ///
2398
2626
  /// Refusal reason preserved: `[]` reads as "nothing is awaiting the owner's decision".
2399
2627
  listApprovalRequests: (statusFilter: opt ApprovalStatus, start: nat,
2400
- limit: nat) -> (Result_35) query;
2628
+ limit: nat) -> (Result_37) query;
2401
2629
  /// ⟨0.16.0⟩ `total` IS THE HEAD COUNTER, and on this method that is the entire point.
2402
2630
  ///
2403
2631
  /// The audit log is a bounded RING: it trims its tail, so "rows you can read" and "entries that
@@ -2431,7 +2659,7 @@ type Engram =
2431
2659
  /// where this record switched to the hash-first rule. A sealed row costs one SHA-256 of its body
2432
2660
  /// at read time; nothing new is stored. WHAT WOULD MAKE THIS WRONG: a sealed row carrying any part
2433
2661
  /// of a body, or a stranger reaching `items` (test/record-view.test.mo pins both).
2434
- listAuditEntries: (start: nat, limit: nat) -> (Result_48) query;
2662
+ listAuditEntries: (start: nat, limit: nat) -> (Result_50) query;
2435
2663
  /// ⟨0.16.0, L1 + L3 — census-ruled⟩ THE TWO-MECHANISM EXCEPTION DISSOLVES.
2436
2664
  ///
2437
2665
  /// This method used to answer THREE ways to one question: a list, an `#Err` text, and a trap,
@@ -2455,7 +2683,7 @@ type Engram =
2455
2683
  /// `dbTypeFilter` DIES on the wire (census). The capability does not: `EngramClient.listBackups`
2456
2684
  /// keeps its optional filter and applies it to the page, so no caller loses the ability to ask
2457
2685
  /// "backups of this database" — it stops being a thing the canister has to page around.
2458
- listBackups: (start: nat, limit: nat) -> (Result_47) query;
2686
+ listBackups: (start: nat, limit: nat) -> (Result_49) query;
2459
2687
  /// List all bearer tokens — Active, Revoked, and Expired. Owner uses this in
2460
2688
  /// the dashboard to show installed Connectors (claude.ai, Claude Desktop, etc.).
2461
2689
  /// Refusal reason preserved from the trap: `[]` reads as "no connector is installed on this
@@ -2465,7 +2693,9 @@ type Engram =
2465
2693
  /// `bearerTokenStore.list()` already resolves each token's status at read time (a token that
2466
2694
  /// merely stopped being used is reported `#Expired`, not a stale `#Active`), so the page carries
2467
2695
  /// the same honesty the store gained on 2026-08-17.
2468
- listBearerTokens: (start: nat, limit: nat) -> (Result_46) query;
2696
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2697
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
2698
+ listBearerTokens: (start: nat, limit: nat) -> (Result_48) query;
2469
2699
  /// The condense checkpoints in the retained log at or above `startSeq`, oldest first.
2470
2700
  ///
2471
2701
  /// ⟨0.16.0, NEW⟩ The other half of the split above. A checkpoint is the only surviving record of a
@@ -2475,18 +2705,18 @@ type Engram =
2475
2705
  ///
2476
2706
  /// Owner-only like every other archive surface, and for the same structural reason: these rows
2477
2707
  /// carry the chain positions and roots of entries whose paths were inside the hash preimage.
2478
- listCondenseCheckpoints: (startSeq: nat, max: nat) -> (Result_45) query;
2708
+ listCondenseCheckpoints: (startSeq: nat, max: nat) -> (Result_47) query;
2479
2709
  /// ⟨0.16.0⟩ `metrics()` DELETED — absorbed by `about()`.
2480
2710
  ///
2481
2711
  /// Two public projections of one canister (L2.2): `metrics()` and `status()` both answered "what
2482
2712
  /// is this engram like" and disagreed on which counters they carried, so a consumer had to fetch
2483
2713
  /// both and know which one owned each field. Every field here survives on `about()`, day-flooring
2484
2714
  /// included.
2485
- listCycleSnapshots: (start: nat, limit: nat) -> (Result_44) query;
2715
+ listCycleSnapshots: (start: nat, limit: nat) -> (Result_46) query;
2486
2716
  /// Same `withheld` treatment as listMemoryFiles — the tombstone listing filtered reserved paths
2487
2717
  /// for non-owners just as silently, and a caller could not tell a filtered tombstone list from a
2488
2718
  /// complete one. Counted before slicing, so policy-hidden rows never blur into paging.
2489
- listDeletedMemoryFiles: (start: nat, limit: nat) -> (Result_43) query;
2719
+ listDeletedMemoryFiles: (start: nat, limit: nat) -> (Result_45) query;
2490
2720
  /// Stays on the engram under B1 (hybrid): withdrawal custody does not leave.
2491
2721
  ///
2492
2722
  /// NAMED item, not a `(Text, Int)` tuple. The Int is an activation time, and a bare Int beside a
@@ -2501,7 +2731,7 @@ type Engram =
2501
2731
  /// The item's field is `value`, not `address`: a list may hold a venue value that is no address.
2502
2732
  /// Readable by the owner, an active agent or an active guardian, as the old list was.
2503
2733
  listEip712Destinations: (typeId: blob, start: nat, limit: nat) ->
2504
- (Result_42) query;
2734
+ (Result_44) query;
2505
2735
  /// The registered shapes — E3: encodeTypeString is the display artifact, verbatim.
2506
2736
  /// Stays on the engram under B1 (hybrid): EIP-712 signing is custody, and custody does not leave.
2507
2737
  ///
@@ -2512,20 +2742,20 @@ type Engram =
2512
2742
  /// ⟨2026-10-14, the owner's ruling 3A⟩ Each row carries its per-field rules (`fieldRules`), joined in
2513
2743
  /// from `eip712FieldRules` — they are part of what the type authorises, so a reader of the list must
2514
2744
  /// not have to make a second call to learn them. The row type is `Eip712TypeView`.
2515
- listEip712Types: (start: nat, limit: nat) -> (Result_41) query;
2745
+ listEip712Types: (start: nat, limit: nat) -> (Result_43) query;
2516
2746
  /// ⟨2026-10-21, round 11 c⟩ Guardians' disputes, oldest first. Same visibility as
2517
2747
  /// `listRepudiations` and `listRecordNotes`: the owner and ACTIVE guardians read the rows; an
2518
2748
  /// agent gets an empty page whose `withheld` counts them (ruling 16 B holds — a dispute is the
2519
2749
  /// guardian's entry, not the agent's); a stranger, a pending guardian and the anonymous caller are
2520
2750
  /// refused.
2521
- listGuardianDisputes: (start: nat, limit: nat) -> (Result_40) query;
2751
+ listGuardianDisputes: (start: nat, limit: nat) -> (Result_42) query;
2522
2752
  /// Accessible by owner and guardians.
2523
2753
  ///
2524
2754
  /// Refusal reason carried over from the trap, because it is the sharpest example of why this
2525
2755
  /// surface may not fail soft: `[]` reads as "this engram has nobody who can freeze payments or
2526
2756
  /// pause writes" — a claim about who can STOP it. A caller who cannot tell that from "you may not
2527
2757
  /// see the roster" has been told the engram is unguarded when it may be fully guarded.
2528
- listGuardians: (start: nat, limit: nat) -> (Result_39) query;
2758
+ listGuardians: (start: nat, limit: nat) -> (Result_41) query;
2529
2759
  /// The export receipts in the retained log at or above `startSeq`, oldest first.
2530
2760
  ///
2531
2761
  /// ⟨0.16.0, L3⟩ ONE LIST, ONE QUESTION. This method used to return receipts AND checkpoints
@@ -2541,7 +2771,7 @@ type Engram =
2541
2771
  ///
2542
2772
  /// Read `MemoryRouter.ReceiptPage` before reading `page.total` as a receipt count. It is not one;
2543
2773
  /// it is the chain's length, and the declaration says why.
2544
- listMemoryExportReceipts: (startSeq: nat, max: nat) -> (Result_38) query;
2774
+ listMemoryExportReceipts: (startSeq: nat, max: nat) -> (Result_40) query;
2545
2775
  /// ⟨0.16.0⟩ THE `withheld` EXEMPLAR — L1 names this exact method as the defect it fixes.
2546
2776
  ///
2547
2777
  /// A non-owner's answer silently dropped every `config/` and `secrets/` row. Not "refused the
@@ -2566,7 +2796,7 @@ type Engram =
2566
2796
  /// the rows of THIS page (`MemoryRouter.info`), after the slice, so the cost is one lookup per
2567
2797
  /// row served, never one per file stored. A WIDENED REPLY: a reader that decodes the row by
2568
2798
  /// position rather than by field name breaks — none in this repository does.
2569
- listMemoryFiles: (start: nat, limit: nat) -> (Result_37) query;
2799
+ listMemoryFiles: (start: nat, limit: nat) -> (Result_39) query;
2570
2800
  /// One page of the memory log, seq-ordered, optionally narrowed to one author.
2571
2801
  ///
2572
2802
  /// THE WINDOW IS THE CURSOR, and the page now states it. The window is
@@ -2592,7 +2822,7 @@ type Engram =
2592
2822
  /// with the disclosures that make the page verifiable — the hidden-bound defect the census itself
2593
2823
  /// names on previewCondense's row.
2594
2824
  listMemoryLog: (startSeq: nat, max: nat, authorFilter: opt principal) ->
2595
- (Result_36) query;
2825
+ (Result_38) query;
2596
2826
  /// The caller's OWN spend-approval requests. ⟨0.16.0, L1 + L3 — fixed 2026-08-18⟩
2597
2827
  ///
2598
2828
  /// Two defects in seven lines, and the first is the one this release exists to remove:
@@ -2609,7 +2839,7 @@ type Engram =
2609
2839
  /// to see, so `total` over their own rows is the honest count and nothing is hidden FROM them.
2610
2840
  /// (The unbounded MAP is filed separately — pruning an approval record destroys evidence of what
2611
2841
  /// was asked, which is a retention ruling rather than a shape fix.)
2612
- listMyApprovalRequests: (start: nat, limit: nat) -> (Result_35) query;
2842
+ listMyApprovalRequests: (start: nat, limit: nat) -> (Result_37) query;
2613
2843
  /// The payer's own sessions, live ones first. PAYER-SCOPED: a caller sees only their own, which
2614
2844
  /// is why this needs no role — a session id is not a secret from the person who paid for it.
2615
2845
  ///
@@ -2618,7 +2848,7 @@ type Engram =
2618
2848
  /// It took no arguments, and a cursor added after the freeze is an argument-list change every
2619
2849
  /// client would break on — the market paged its own pending withdrawals before its cut for the
2620
2850
  /// same reason. The order is the order sessions were opened.
2621
- listMySessions: (start: nat, limit: nat) -> (Result_34) query;
2851
+ listMySessions: (start: nat, limit: nat) -> (Result_36) query;
2622
2852
  ///
2623
2853
  /// ⟨0.16.0, L3⟩ Paged and enveloped like every other `list*`, and the envelope here is uniformity
2624
2854
  /// rather than gating: this method cannot refuse anybody, so `#Err` is unreachable on it. That is
@@ -2631,7 +2861,7 @@ type Engram =
2631
2861
  /// asked by strangers. `verifyEngramActiveOwner` on the registry answers only about the owner
2632
2862
  /// IT recorded, so this chain is what a caller composes with when currency matters — which it
2633
2863
  /// cannot do if it needs a role here.
2634
- listOwnershipTransfers: (start: nat, limit: nat) -> (Result_33) query;
2864
+ listOwnershipTransfers: (start: nat, limit: nat) -> (Result_35) query;
2635
2865
  /// ⟨2026-09-29, the platform's question from the build review⟩ OWNER-ONLY: how many payment
2636
2866
  /// signatures each agent has obtained today, and the daily limit (200, `PaymentSignCap`). The
2637
2867
  /// owner's console stated the rule and showed no number, because nothing served one; a number it
@@ -2647,7 +2877,9 @@ type Engram =
2647
2877
  /// marketplace's one shared count today is in the reply's `marketplace` field, with the limit this
2648
2878
  /// engram enforces for it — beside the agents, never a row among them
2649
2879
  /// (`PaymentSignCap.marketplaceRow`). Null when no marketplace is set.
2650
- listPaymentSignatureCounts: (start: nat, limit: nat) -> (Result_32) query;
2880
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2881
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
2882
+ listPaymentSignatureCounts: (start: nat, limit: nat) -> (Result_34) query;
2651
2883
  /// Agent records removed by a reset. Each row is a NAMED record with the fields `principal`,
2652
2884
  /// `name`, `registeredAt` and `purgedAt` — read them BY NAME, never by position.
2653
2885
  /// ⟨2026-09-29, the vocabulary ruling: pairing is the one verb that admits an agent⟩ The field
@@ -2687,7 +2919,9 @@ type Engram =
2687
2919
  /// `invite` its enrolment named, and `ended` — why and on what day its engagement ended (its own
2688
2920
  /// earlier ending, or the reset) — the facts `resyncAgentEdges` re-sends. The stored rows are
2689
2921
  /// served as they are.
2690
- listPurgedAgents: (start: nat, limit: nat) -> (Result_31) query;
2922
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
2923
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
2924
+ listPurgedAgents: (start: nat, limit: nat) -> (Result_33) query;
2691
2925
  /// ⟨0.16.0⟩ ONE ACCESSOR, folding `readReadLog` and `getDenialLog` — and the fold only became
2692
2926
  /// safe because of a change made earlier in this same leg.
2693
2927
  ///
@@ -2749,13 +2983,13 @@ type Engram =
2749
2983
  /// on the chained record — the same `RecordView` filter, and `withheld` counts what it removed
2750
2984
  /// together with what `successFilter` removed. WHAT WOULD MAKE THIS WRONG: see `listAuditEntries`.
2751
2985
  listReadLog: (successFilter: opt bool, start: nat, limit: nat) ->
2752
- (Result_30) query;
2986
+ (Result_32) query;
2753
2987
  /// ⟨2026-10-21, round 11 b⟩ The owner's notes, oldest first. Same visibility as
2754
2988
  /// `listRepudiations`, for the same reason: the owner and ACTIVE guardians read the rows; an agent
2755
2989
  /// reads only the entries it caused (follow-up 16 B), and every note is the owner's, so an agent
2756
2990
  /// gets an empty page whose `withheld` counts the notes in its window — never "there are none". A
2757
2991
  /// stranger, a pending guardian and the anonymous caller are refused.
2758
- listRecordNotes: (start: nat, limit: nat) -> (Result_29) query;
2992
+ listRecordNotes: (start: nat, limit: nat) -> (Result_31) query;
2759
2993
  /// Same visibility as listAuditEntries: the owner, this engram's agents, and ACTIVE guardians
2760
2994
  /// see disputes. An unauthorized read REFUSES — it does not return an empty list, because an
2761
2995
  /// empty list reads as "no disputes have been filed", which is a claim, not an absence of one.
@@ -2770,7 +3004,14 @@ type Engram =
2770
3004
  /// window — which says disputes exist without showing them, never "none have been filed". WHAT
2771
3005
  /// WOULD MAKE THIS WRONG: a ruling that an agent may see the disputes of its own writes; this would
2772
3006
  /// then have to look up each disputed version's writer, which it does not do today.
2773
- listRepudiations: (start: nat, limit: nat) -> (Result_28) query;
3007
+ listRepudiations: (start: nat, limit: nat) -> (Result_30) query;
3008
+ /// The seller list, a page at a time, as `Types.SellerView` (a raise whose wait is over shown applied;
3009
+ /// `liveNow` — false for every row while an engram opened through another has no sign-in seated; what
3010
+ /// x402 reserved for each today). For the key file and the sign-in in an engram opened
3011
+ /// through another, the owner in a first engram; refused loudly to anyone else — never an empty page,
3012
+ /// which would read as "no sellers". A QUERY: the refusal is in the reply, not the denial log.
3013
+ /// Named callers: an owner console's seller list.
3014
+ listSellers: (start: nat, limit: nat) -> (Result_29) query;
2774
3015
  /// ⟨2026-10-21, the owner's round-11 answer f⟩ OWNER-ONLY: the sign-ins, each with the name its app
2775
3016
  /// registered. The same tokens, in the same order and paged the same way, as `listBearerTokens`,
2776
3017
  /// each beside `clientName` — the RFC 7591 `client_name` the app registered when the token was
@@ -2779,7 +3020,9 @@ type Engram =
2779
3020
  /// apps apart. A NEW method rather than a field on `BearerToken`: that record is stored (M0170)
2780
3021
  /// and `listBearerTokens`' reply is shipped (never widened). An agent, a guardian, a stranger and
2781
3022
  /// the anonymous caller are refused, by `listBearerTokens`' own gate and for its reason.
2782
- listSignIns: (start: nat, limit: nat) -> (Result_27) query;
3023
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
3024
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
3025
+ listSignIns: (start: nat, limit: nat) -> (Result_28) query;
2783
3026
  /// Owner: advance the review cursor — "I have seen everything up to and including uptoAuditId"
2784
3027
  /// (null = everything at the current head). Bounded so the attestation can never cover entries
2785
3028
  /// the console did not render; clamped monotonic (the cursor never moves backward) and to the
@@ -2789,7 +3032,7 @@ type Engram =
2789
3032
  /// (every family qualifiesForReview admits is written to auditLogger, so they share that space),
2790
3033
  /// and this never inspects an operation or a role. Widening what the review shows therefore
2791
3034
  /// changes only which ids the console can pass here — it cannot desynchronise the cursor.
2792
- markAgentWritesReviewed: (uptoAuditId: opt nat) -> (Result_14);
3035
+ markAgentWritesReviewed: (uptoAuditId: opt nat) -> (Result_15);
2793
3036
  /// ⟨2026-10-21, the owner's round-11 answer g⟩ AN AGENT READS ITS OWN GRANT — to the calling key
2794
3037
  /// only (`People.AgentGrant`): what it may read, where it may write, its rate, and the payment
2795
3038
  /// limits enforced against that key. It reveals nothing a refusal does not already say, and lets
@@ -2807,7 +3050,7 @@ type Engram =
2807
3050
  /// the caps alone no longer read as money an agent can spend. `People.SpendState` names each one.
2808
3051
  /// ⟨2026-10-29, review F2⟩ And which whole-key refusal stops every payment now, if one does
2809
3052
  /// (`paymentsStoppedBy`: the brake, the signing floor, the daily count of payment signatures).
2810
- myGrant: () -> (Result_26) query;
3053
+ myGrant: () -> (Result_27) query;
2811
3054
  /// The AGENT's current key nominates the key that will replace it. Nothing moves yet: the new
2812
3055
  /// key must accept, by its own call, within 24 hours (`acceptAgentKeyNomination`). One pending
2813
3056
  /// nomination per agent — a new one replaces the earlier one, and the record says which. Refused,
@@ -2815,7 +3058,7 @@ type Engram =
2815
3058
  /// not hold the record (`KeyReplacement.nomineeRefusal`).
2816
3059
  nominateAgentKey: (newKey: principal) -> (Result_2);
2817
3060
  /// An AGENT paired here asks this engram to open an engram of its own. This engram attaches 1.3 T of
2818
- /// its own cycles to the registry's `sysSpawnChild`; the agent's lasting key owns what is opened, and
3061
+ /// its own cycles to the registry's `sysOpenChild`; the agent's lasting key owns what is opened, and
2819
3062
  /// the engram is recorded as opened through this one. Answers the new engram's canister id.
2820
3063
  ///
2821
3064
  /// APPROVING IS GIVING: the owner allowed this with `setChildAllowance`, and what is attached is the
@@ -2842,15 +3085,36 @@ type Engram =
2842
3085
  ///
2843
3086
  /// WHAT WOULD MAKE THIS WRONG: an await added between `ChildAllowance.take` and the registry call; the
2844
3087
  /// registry's `CHILD_MIN_ATTACHED_CYCLES` moving without `CHILD_ATTACH_CYCLES`.
2845
- openChildEngram: () -> (Result_25);
2846
- openSession: (config: SessionConfig, sig: PaymentSignature) -> (Result_24);
3088
+ ///
3089
+ /// ⟨2026-11-02, the owner's ruling "1-4 all as you recommended" (the child build's stage 2)⟩ THE
3090
+ /// SIGN-IN. `signIn` names the opened engram's sign-in — the person running the agent, on a second
3091
+ /// credential; null opens it with none, and it then keeps small limits for life. It goes to the
3092
+ /// registry's door and from there into the opened engram's init record, so that engram never runs a
3093
+ /// message without it. Refused here first, with no await and before the allowance is taken, by the
3094
+ /// door's own three rules (`OwnerSignIn.candidateRefusal`): the agent's lasting key itself, the
3095
+ /// anonymous principal, a canister — so the agent sees the refusal before any cycles move. The
3096
+ /// record entry says `signIn=set` or `signIn=none`, never the principal.
3097
+ /// ⟨2026-11-02, the stage-2 review M3, beside the above⟩ And a fourth, the door's own: the key this
3098
+ /// call is signed by — the agent's session key — is refused as the sign-in too
3099
+ /// (`OwnerSignIn.agentKeyRefusal`), at the same place.
3100
+ ///
3101
+ /// ⟨2026-11-02, the child build's stage 2 — RENAMED from `openChildEngram`, beside the paragraphs
3102
+ /// above, which describe the same door⟩ It was `openChildEngram()`, with no argument. A second
3103
+ /// positional argument would grow its argument tuple, and a shipped tuple is frozen (evolution
3104
+ /// happens inside records), so the door takes ONE record whose later fields are optional, under a
3105
+ /// new name — the shape the registry's own door took the same day (`sysSpawnChild` →
3106
+ /// `sysOpenChild`). An rc.21 kit calling the old name is rejected
3107
+ /// (IC0536) with nothing spent; it can never open an engram without a sign-in by accident.
3108
+ /// Named caller: the owner kit's `open-engram` command, signed by the agent's session key.
3109
+ openChild: (req: record {signIn: opt principal;}) -> (Result_26);
3110
+ openSession: (config: SessionConfig, sig: PaymentSignature) -> (Result_25);
2847
3111
  /// Withdraw tokens to the owner's principal. This is the ONLY way to
2848
3112
  /// move tokens out of the engram to an external address, and the
2849
3113
  /// destination is always hardcoded to the owner.
2850
3114
  /// NOT freeze-gated: the owner always controls their own funds.
2851
3115
  /// Guardian freeze only blocks agent/public operations.
2852
3116
  ownerWithdraw: (amount: TokenAmount, ownerAuth: opt ActionAuth) ->
2853
- (Result_14);
3117
+ (Result_15);
2854
3118
  /// ⟨0.16.0⟩ `payRentFromEarnings` DELETED — ruled TWICE (B1 and B2), and it was the single
2855
3119
  /// clearest violation of the OSS/platform split in this repo.
2856
3120
  ///
@@ -2908,7 +3172,7 @@ type Engram =
2908
3172
  pairAgent: (arg: record {
2909
3173
  code: text;
2910
3174
  enrolment: Enrolment;
2911
- }) -> (Result_23);
3175
+ }) -> (Result_24);
2912
3176
  /// ⟨0.16.0, L2.2 — renamed from `guardianPauseWrites`⟩ Same correction as freezePayments above:
2913
3177
  /// owner-or-guardian, and `resumeWrites` never carried the prefix either.
2914
3178
  pauseWrites: () -> (Result_2);
@@ -2933,7 +3197,7 @@ type Engram =
2933
3197
  ///
2934
3198
  /// `unlocked` is the export-receipt gate ONLY. It is not a promise the condense will land: the
2935
3199
  /// history-budget delta is checked at commit time and can still refuse a short prefix.
2936
- previewCondense: (toSeq: nat) -> (Result_22) query;
3200
+ previewCondense: (toSeq: nat) -> (Result_23) query;
2937
3201
  /// A quote for a session this caller has not opened and is not committed to — the intent a
2938
3202
  /// buyer signs against. Pure dry run, no state, no funds.
2939
3203
  ///
@@ -2978,10 +3242,12 @@ type Engram =
2978
3242
  /// takes effect change it.
2979
3243
  /// HONEST WHEN CUT SHORT: `complete = false` when the planning budget
2980
3244
  /// (`MemoryRouter.PREVIEW_MAX_DROPS`) ran out — the totals are then a floor, and say so.
3245
+ /// ⟨2026-11-03, the pre-gate fixes — spec §7, "child: sign-in — reads yes"⟩ Also the seated sign-in of
3246
+ /// an engram opened through another, as the owner (`#ownerOrSignIn`); a first engram is unchanged.
2981
3247
  previewRetention: (entries: vec record {
2982
3248
  text;
2983
3249
  RetentionClassSpec;
2984
- }) -> (Result_21) query;
3250
+ }) -> (Result_22) query;
2985
3251
  /// Read one memory file at its current version.
2986
3252
  ///
2987
3253
  /// Gated on the `read_memory` permission, so an agent holding that grant reaches it — unlike
@@ -2996,7 +3262,7 @@ type Engram =
2996
3262
  /// counter here could never persist; read counting lives on the update path
2997
3263
  /// (`sessionReadContext` and the MCP reads). A caller measuring engram usage from this method
2998
3264
  /// will measure nothing.
2999
- readMemory: (path: text) -> (Result_12) query;
3265
+ readMemory: (path: text) -> (Result_13) query;
3000
3266
  /// Read many paths in one call. Per-path Results are KEPT — partial success is the point, and
3001
3267
  /// one unreadable path must not fail the other nine.
3002
3268
  ///
@@ -3012,7 +3278,7 @@ type Engram =
3012
3278
  /// Both are now what they are: a single `#Err` for the whole call. `#Ok` still carries a row per
3013
3279
  /// path, each with its own Result — a refused RESERVED path sits beside a readable one, which is
3014
3280
  /// a genuine per-path fact.
3015
- readMemoryBatch: (paths: vec text) -> (Result_20) query;
3281
+ readMemoryBatch: (paths: vec text) -> (Result_21) query;
3016
3282
  /// ⟨0.16.0⟩ `getMemoryRetentionGuards` DELETED — folded into `getMemoryRetentionPolicy` above.
3017
3283
  /// It was the second L2.1 array-returning `get*`, and separating it from the policy it modifies
3018
3284
  /// was the defect described there. Its own docs are preserved at the fold site.
@@ -3023,7 +3289,7 @@ type Engram =
3023
3289
  /// see it cannot know whether it has the whole range, which is how silent truncation gets
3024
3290
  /// reintroduced. Loop while `more` is true, advancing by the bytes actually returned.
3025
3291
  readMemoryBytes: (path: text, offset: nat, len: nat, version: opt nat) ->
3026
- (Result_19) query;
3292
+ (Result_20) query;
3027
3293
  /// The escrow exit for a session whose settle cannot pay.
3028
3294
  ///
3029
3295
  /// PAYER-ONLY, enforced inside the gateway, and deliberately not owner-triggered: the payer's own
@@ -3086,7 +3352,7 @@ type Engram =
3086
3352
  /// was the block index alone, which read as the amount. If the session's record is removed before
3087
3353
  /// the amount can be read back — a session closed in the same moment as the recovery and cleaned up
3088
3354
  /// during its transfer — it answers `#Other` naming the block, never a guessed amount.
3089
- recoverEscrow: (sessionId: text, amountE6: nat) -> (Result_18);
3355
+ recoverEscrow: (sessionId: text, amountE6: nat) -> (Result_19);
3090
3356
  /// ⟨0.16.0, L1⟩ A REDEMPTION PATH, where the arm choice is a disclosure decision.
3091
3357
  ///
3092
3358
  /// Four of these refusals are about the CODE and one is about the caller. The code arms restate
@@ -3100,7 +3366,7 @@ type Engram =
3100
3366
  /// rather than `()`. The new guardian learns, in the same reply, the name and permissions the
3101
3367
  /// owner's invite gave them and that they cannot act until approved; before, that took a second
3102
3368
  /// read they had no reason to know to make.
3103
- registerGuardian: (code: text) -> (Result_17);
3369
+ registerGuardian: (code: text) -> (Result_18);
3104
3370
  /// Remove a per-caller override so that caller reverts to — and keeps TRACKING — the global caps.
3105
3371
  ///
3106
3372
  /// It travels with its pair and is never dropped alone: without it the only way "back" from an
@@ -3131,6 +3397,13 @@ type Engram =
3131
3397
  /// `#NotFound` rather than `#Refused` when there is no such guardian: only the owner reaches this
3132
3398
  /// line, so the roster is theirs and its contents are not a secret being withheld from them.
3133
3399
  removeGuardian: (guardianPrincipal: principal) -> (Result_2);
3400
+ /// Remove a listed seller, at once: from now a payment to it meets the engram-wide ceiling and the
3401
+ /// paying agent's own limits again, and adding it back waits 24 hours. Removing TIGHTENS, so the key
3402
+ /// file may do it as well as the sign-in, and it works while payments are frozen. Its "paid before"
3403
+ /// history is kept (that is about the address, not the row). Unknown address `#NotFound`.
3404
+ /// Named callers: an owner console's seller list, and the owner kit (the key file's way to stop a
3405
+ /// seller).
3406
+ removeSeller: (payTo: text) -> (Result_2);
3134
3407
  /// ⟨2026-10-21, the owner's round-11 answer a⟩ OWNER-ONLY: give an agent a new name. A name was
3135
3408
  /// fixed at the invite, and two agents both called "agent" is how the 2026-10-20 session started.
3136
3409
  /// Only the VALUE of the stored `AgentRecord.name` changes — no new state, no reshaped record —
@@ -3146,7 +3419,7 @@ type Engram =
3146
3419
  /// the original audit entry stay exactly where they were; this appends a chained
3147
3420
  /// `memory.repudiate` entry and lists the (path, version) so readers can see the dispute.
3148
3421
  repudiateMemoryWrite: (path: text, version: nat, reason: text) ->
3149
- (Result_14);
3422
+ (Result_15);
3150
3423
  /// ⚠ OWNER-ONLY BULK RESET. Destructive, and wider than its name suggests.
3151
3424
  ///
3152
3425
  /// It severs EVERY grant surface that can outlive a role — agents, guardians, invites and
@@ -3165,6 +3438,10 @@ type Engram =
3165
3438
  /// · ⟨2026-10-02⟩ the seat weeks of every engagement (`agentSeatWeeks`), with the signature count
3166
3439
  /// they sit beside, and the owner's switch over the metrics reader's read and the reader it
3167
3440
  /// names — a reset severs access, it does not change who may read what was kept.
3441
+ /// · ⟨2026-11-02, the child build — decided "unless you object", recorded at stage 5⟩ the seller
3442
+ /// list and the paid history (`listSellers`, `getRecipientHistory`), as the typed-data
3443
+ /// destinations are kept: a reset severs access, it does not forget which counterparties the
3444
+ /// owner approved or which addresses this engram has paid.
3168
3445
  ///
3169
3446
  /// ⟨2026-10-02⟩ It tells the spawning registry that it happened (`sysNoteReset`), on every reset.
3170
3447
  ///
@@ -3174,7 +3451,7 @@ type Engram =
3174
3451
  /// NOT unbounded. It caps at MAX_ENTRIES and trims its oldest tenth on overflow, so on any engram
3175
3452
  /// long-lived enough for the rent model to apply, the reset entry is not guaranteed to still be
3176
3453
  /// there. `agentPurgeLog` is the evidence that does not age out — which is why it exists.
3177
- resetEngram: () -> (Result_16);
3454
+ resetEngram: () -> (Result_17);
3178
3455
  /// ⟨2026-09-28, owner decision: an agent can resign from an engram, and the resignation is
3179
3456
  /// recorded⟩ The AGENT ends its own engagement with this engram.
3180
3457
  ///
@@ -3220,7 +3497,7 @@ type Engram =
3220
3497
  /// all that is left to send is the ending, and the registry has nothing to end. The report lists
3221
3498
  /// each such engagement under `cannotBeRecorded` (key, root, invite, and how and when it ended),
3222
3499
  /// apart from `notRecorded`, so the owner sees them rather than silence.
3223
- resyncAgentEdges: () -> (Result_15);
3500
+ resyncAgentEdges: () -> (Result_16);
3224
3501
  /// Return to managed custody: the engram adds the registry back as a controller ALONGSIDE the
3225
3502
  /// owner — it does not remove the owner. The inverse of `claimSovereignty`, and the reason
3226
3503
  /// sovereignty is not a one-way door.
@@ -3274,7 +3551,7 @@ type Engram =
3274
3551
  /// written, and only then does it await one notification per revoked agent. So a notification
3275
3552
  /// that fails leaves the agents revoked here regardless — a partial notify is not a partial
3276
3553
  /// revocation, which is the direction that matters for a panic button.
3277
- revokeAllAgents: () -> (Result_14);
3554
+ revokeAllAgents: () -> (Result_15);
3278
3555
  /// Owner-only panic button: revoke every connector bearer token at once. Returns how many.
3279
3556
  ///
3280
3557
  /// The THIRD independent surface — hosted connectors authenticate with bearer tokens, not with
@@ -3283,7 +3560,7 @@ type Engram =
3283
3560
  /// holding a live session.
3284
3561
  ///
3285
3562
  /// Tokens are re-issuable: revoking them is not permanent the way revoking an agent is.
3286
- revokeAllBearerTokens: () -> (Result_14);
3563
+ revokeAllBearerTokens: () -> (Result_15);
3287
3564
  /// ⟨0.16.0⟩ `removeAllGuardians` DELETED — test-only (L6), and verified NOT part of KILL-SWITCH's
3288
3565
  /// mass-revoke set. The destructive phase-07 suite iterates `removeGuardian` instead, so nothing
3289
3566
  /// loses a capability: what dies is a bulk spelling no runbook ever invoked.
@@ -3295,7 +3572,7 @@ type Engram =
3295
3572
  ///
3296
3573
  /// Unlike revoking an agent, this costs nothing permanently — an invite is a one-time code,
3297
3574
  /// so voiding it and minting a fresh one is the ordinary path.
3298
- revokeAllInvites: () -> (Result_14);
3575
+ revokeAllInvites: () -> (Result_15);
3299
3576
  /// Revoke a bearer token by its public tokenId. Idempotent.
3300
3577
  /// Subsequent /mcp requests using this token will be rejected.
3301
3578
  revokeBearerToken: (tokenId: text) -> (Result_2);
@@ -3322,6 +3599,32 @@ type Engram =
3322
3599
  /// agent on that record, so its standing is not the problem — the record's state is. An
3323
3600
  /// agent reading `#Refused` would go looking for a permission that was never missing.
3324
3601
  rotateAgentKeyHash: (newPublicKeyHash: text) -> (Result_2);
3602
+ /// Send money from this engram's wallet to the engram it was opened through — "up", and only up:
3603
+ /// the destination is always the parent engram's own default account, never an address the caller
3604
+ /// names. ANY amount (the owner's ruling "B"); the answer is the ledger's block index.
3605
+ ///
3606
+ /// WHO: the owner's key file or the sign-in, in an engram opened through another (the build's
3607
+ /// resolution L14: both may send — the key file's honest sweep needs it, and the sign-in may sweep
3608
+ /// too); refused to anyone else. In a first engram there is nothing above it, and it refuses with
3609
+ /// `#Conflict`. NOT freeze-gated: up is not out, so a payments freeze does not stop it.
3610
+ ///
3611
+ /// ORDER: the caller, then the parent from this engram's own birth record (`openedFrom`, no await),
3612
+ /// then ONE call to the registry — refused unless the registry shows the parent registered, active
3613
+ /// and not abandoned (`#Refused`; the registry unreachable is `#Unavailable`; nothing sent either
3614
+ /// way) — then ONE ledger transfer, the same per-token ledger as `ownerWithdraw`. Both calls are
3615
+ /// counted (ADR-0025), so near its freezing line this engram may be unable to send the registry
3616
+ /// call at all; it then answers `#Unavailable` and nothing moves.
3617
+ ///
3618
+ /// NO RE-CHECK between the two calls, deliberately: the parent can be abandoned in between, and the
3619
+ /// money then sits in an existing canister whose owner can still withdraw it. Guarding that window
3620
+ /// would need a third call and buys nothing the owner of the parent does not already have.
3621
+ ///
3622
+ /// NOT INCOME. The parent's track record is engagements, standing, seat-weeks and counts of use, and
3623
+ /// signature counts count signatures; nothing reads a ledger balance, and this method calls none of
3624
+ /// those writers (test/child-sign-in-wiring.test.ts rule 13). Written to the record as
3625
+ /// `wallet.sendToParent` (money class), with the amount, the token, the parent and the block.
3626
+ /// Named callers: the owner kit, signed by the key file; an owner console, signed in as the sign-in.
3627
+ sendToParent: (amount: TokenAmount) -> (Result_15);
3325
3628
  /// Append to a memory file against a PAID x402 session voucher — the write half of the paid rail,
3326
3629
  /// authorized by the voucher rather than by a role.
3327
3630
  /// ⟨2026-09-30, ic402 2.17.0⟩ Authorized by the payer's own call with the voucher: only the
@@ -3365,7 +3668,7 @@ type Engram =
3365
3668
  /// ⚠ RAW STORED BYTES, like `readMemoryBatch`. On a Private (encrypted) engram the content is
3366
3669
  /// CIPHERTEXT; the key-holding SDK decrypts it. A caller without the key gets bytes it cannot
3367
3670
  /// read, not an error.
3368
- sessionReadContext: (clientLabel: text) -> (Result_13);
3671
+ sessionReadContext: (clientLabel: text) -> (Result_14);
3369
3672
  /// Read one memory file against a PAID x402 session voucher. No role, no invite — the voucher is
3370
3673
  /// the authorization, which is what makes this the engram's one rail a stranger can pay to use.
3371
3674
  ///
@@ -3395,7 +3698,7 @@ type Engram =
3395
3698
  /// session must not be the side door: without this guard a stranger holding a fraction-of-a-
3396
3699
  /// cent voucher could read `secrets/*`.
3397
3700
  /// · Payments are frozen on this engram.
3398
- sessionReadMemory: (voucher: Voucher, path: text) -> (Result_12);
3701
+ sessionReadMemory: (voucher: Voucher, path: text) -> (Result_13);
3399
3702
  /// Configure action alerts: an https webhook that receives new chained-audit entries matching the
3400
3703
  /// enabled event classes (money / approvals / guardian / agentWrites), batched, at most one
3401
3704
  /// POST per minute. ⟨2026-10-29⟩ Delivered within seconds of the action (a 5 s batch window), and
@@ -3442,7 +3745,7 @@ type Engram =
3442
3745
  /// own, and this setter applies the number to every creator's set, so `prunedBackups` counts
3443
3746
  /// across all of them. "The write is the read" above went stale for a second phone, which never
3444
3747
  /// made the write: `getBackupRetention` is the read.
3445
- setBackupRetention: (dbType: text, maxBackups: nat) -> (Result_11);
3748
+ setBackupRetention: (dbType: text, maxBackups: nat) -> (Result_12);
3446
3749
  /// Override the caps for ONE caller — an agent this owner trusts more, or less, than the rest.
3447
3750
  setCallerSpendPolicy: (caller: principal, policy: SpendingPolicy) ->
3448
3751
  (Result_2);
@@ -3514,6 +3817,16 @@ type Engram =
3514
3817
  text;
3515
3818
  RetentionClassSpec;
3516
3819
  }) -> (Result_2);
3820
+ /// The SIGN-IN changes itself to `next` — "changeable only by itself". Immediate (a delay would need
3821
+ /// a third credential to cut it short). The key file is refused by name: it never names a sign-in,
3822
+ /// or a thief holding a copy would name themselves. A first engram refuses: its owner is its own
3823
+ /// sign-in. `next` must pass the door's rules and not be an agent or a guardian here. When this
3824
+ /// engram holds a sealed copy of the owner's key, `resealedBackup` is that copy re-sealed for `next`
3825
+ /// (the sign-in opens it and re-seals it client-side) and is stored in the same message, so the copy
3826
+ /// never names a sign-in that is not this engram's; with no copy held, none may be passed. Not
3827
+ /// blocked by a freeze: a freeze must not lock the sign-in out of itself.
3828
+ /// Named caller: an owner console, signed in as the sign-in ("change your sign-in").
3829
+ setOwnerSignIn: (next: principal, resealedBackup: opt blob) -> (Result_2);
3517
3830
  /// Owner-only: open or close the monetized read rail. When disabled (the default), sessionReadMemory
3518
3831
  /// fails closed for every voucher-bearer — selling the owner's memory is opt-in, not the default.
3519
3832
  ///
@@ -3544,6 +3857,13 @@ type Engram =
3544
3857
  /// call is a chained record entry (`metrics.setSeatWeeksReadEnabled`, the new and the old value), so
3545
3858
  /// when the read was on or off is part of the record. Anyone else is refused by name.
3546
3859
  setSeatWeeksReadEnabled: (enabled: bool) -> (Result_2);
3860
+ /// Change a listed seller's daily cap. A LOWER (or equal) cap applies at once and cancels a raise that
3861
+ /// was waiting; a HIGHER cap waits 24 hours, as a new seller does (the cap in force until then is the
3862
+ /// old one, and a second raise restarts the wait). Answers when the new cap applies. The sign-in only,
3863
+ /// in an engram opened through another; the owner in a first engram. A raise is refused while payments
3864
+ /// are frozen; a lowering is not. Unknown address `#NotFound`; a cap of 0 `#Invalid` (remove instead).
3865
+ /// Named callers: an owner console's seller list, as `addSeller`.
3866
+ setSellerCap: (payTo: text, perDayCapE6: nat) -> (Result_11);
3547
3867
  /// Set the most this engram may spend per day ACROSS EVERY CALLER — five agents, the owner and the
3548
3868
  /// marketplace together. `null` removes the ceiling. ⟨2026-09-28⟩
3549
3869
  /// ⟨CORRECTED 2026-09-29, review finding X-8: "spend" was too wide. The ceiling covers the x402
@@ -3640,6 +3960,14 @@ type Engram =
3640
3960
  /// ⟨0.16.0⟩ PERSISTS beside the market's `sysSignEip712` (census row 177, ruled). The owner does
3641
3961
  /// not lose the ability to sign because a marketplace gained it, and the two share every control
3642
3962
  /// below the caller gate.
3963
+ ///
3964
+ /// ⟨2026-11-02, the owner's ruling "1-4 all as you recommended" (the sign-in "approves trading keys")
3965
+ /// — the child build's stage 5⟩ In an engram opened through another, a type named
3966
+ /// `HyperliquidTransaction:ApproveAgent` (`Eip712Policy.childSignInOnlyToSign`) is signed by the
3967
+ /// sign-in alone: the key file is refused it by name, and the sign-in may sign it (as the owner, on
3968
+ /// the record). Every other type is the key file's to sign, as before. An access check beside the
3969
+ /// owner gate, keyed by the registered NAME, before any of `eip712SignFor`'s eight checks; a first
3970
+ /// engram is untouched (its owner is its own sign-in).
3643
3971
  signEip712: (typeId: blob, values: vec record {
3644
3972
  text;
3645
3973
  Eip712Value;
@@ -3730,6 +4058,15 @@ type Engram =
3730
4058
  /// disputes stay on the record. Like `removeGuardian`, it is not terminal: the owner may invite
3731
4059
  /// the same person again.
3732
4060
  stepDownAsGuardian: () -> (Result_2);
4061
+ /// The key file stores the sealed copy of its own key — once, right after the engram is opened,
4062
+ /// sealed by the owner kit for the sign-in named at birth. Refused in a first engram, when no
4063
+ /// sign-in is seated (nobody could open it), when a copy is already held (set-once: a thief holding
4064
+ /// the same file cannot overwrite the honest copy; a later sign-in's copy arrives through
4065
+ /// `setOwnerSignIn`'s re-seal or `acceptSignIn`), and for an empty or oversized blob
4066
+ /// (`OwnerSignIn.storeRefusal`). The engram stamps whom the copy is for from its own sign-in — the
4067
+ /// caller never names it. Not blocked by a freeze: storing a recovery path loosens nothing.
4068
+ /// Named caller: the owner kit, signed by the agent's lasting key, right after it opens the engram.
4069
+ storeKeyBackup: (ciphertext: blob) -> (Result_2);
3733
4070
  /// OWNER force-close, for a session the payer abandoned.
3734
4071
  ///
3735
4072
  /// ⟨R1b, ruled 2026-08-26: owner-gated, NO guardian.⟩ It moves someone else's money, and only ever
@@ -4004,6 +4341,10 @@ type Engram =
4004
4341
  ///
4005
4342
  /// That is what "signatures only" means in code, and it is why this method needs no new authority
4006
4343
  /// model: an unregistered typeId is refused for the market exactly as it is for the owner.
4344
+ ///
4345
+ /// ⟨2026-11-02, the child build's stage 5⟩ In an engram opened through another, approving a trading
4346
+ /// key (`HyperliquidTransaction:ApproveAgent`) is refused to the market (`#Refused`): it is signed by
4347
+ /// that engram's sign-in alone, through `signEip712`.
4007
4348
  sysSignEip712: (typeId: blob, values: vec record {
4008
4349
  text;
4009
4350
  Eip712Value;
@@ -4280,7 +4621,7 @@ type ChildAllowanceRow =
4280
4621
  type CheckpointPage =
4281
4622
  record {
4282
4623
  firstAvailableSeq: nat;
4283
- page: Page_18;
4624
+ page: Page_19;
4284
4625
  scannedThroughSeq: nat;
4285
4626
  };
4286
4627
  type CertifiedAuditHead =
@@ -4505,7 +4846,7 @@ type AgentStatus =
4505
4846
  };
4506
4847
  type AgentSpendToday =
4507
4848
  record {
4508
- agents: Page_23;
4849
+ agents: Page_24;
4509
4850
  dayStartNs: int;
4510
4851
  };
4511
4852
  type AgentSpendRow =
@@ -4623,5 +4964,7 @@ type About =
4623
4964
  service : (initArgs: opt
4624
4965
  record {
4625
4966
  owner: opt principal;
4967
+ ownerSignIn: opt principal;
4968
+ parent: opt principal;
4626
4969
  registry: opt principal;
4627
4970
  }) -> Engram