instar 1.3.250 → 1.3.252

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.250",
3
+ "version": "1.3.252",
4
4
  "description": "Coherence infrastructure for self-evolving AI agents — on the Claude Code or Codex subscription you already have.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-06-04T21:48:43.306Z",
5
- "instarVersion": "1.3.250",
4
+ "generatedAt": "2026-06-04T23:01:14.429Z",
5
+ "instarVersion": "1.3.252",
6
6
  "entryCount": 198,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -418,7 +418,7 @@
418
418
  "type": "route-group",
419
419
  "domain": "monitoring",
420
420
  "sourcePath": "src/server/routes.ts",
421
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
421
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
422
422
  "since": "2025-01-01"
423
423
  },
424
424
  "route-group:agents": {
@@ -426,7 +426,7 @@
426
426
  "type": "route-group",
427
427
  "domain": "sessions",
428
428
  "sourcePath": "src/server/routes.ts",
429
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
429
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
430
430
  "since": "2025-01-01"
431
431
  },
432
432
  "route-group:backups": {
@@ -434,7 +434,7 @@
434
434
  "type": "route-group",
435
435
  "domain": "operations",
436
436
  "sourcePath": "src/server/routes.ts",
437
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
437
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
438
438
  "since": "2025-01-01"
439
439
  },
440
440
  "route-group:git": {
@@ -442,7 +442,7 @@
442
442
  "type": "route-group",
443
443
  "domain": "coordination",
444
444
  "sourcePath": "src/server/routes.ts",
445
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
445
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
446
446
  "since": "2025-01-01"
447
447
  },
448
448
  "route-group:memory": {
@@ -450,7 +450,7 @@
450
450
  "type": "route-group",
451
451
  "domain": "memory",
452
452
  "sourcePath": "src/server/routes.ts",
453
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
453
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
454
454
  "since": "2025-01-01"
455
455
  },
456
456
  "route-group:semantic": {
@@ -458,7 +458,7 @@
458
458
  "type": "route-group",
459
459
  "domain": "memory",
460
460
  "sourcePath": "src/server/routes.ts",
461
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
461
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
462
462
  "since": "2025-01-01"
463
463
  },
464
464
  "route-group:status": {
@@ -466,7 +466,7 @@
466
466
  "type": "route-group",
467
467
  "domain": "monitoring",
468
468
  "sourcePath": "src/server/routes.ts",
469
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
469
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
470
470
  "since": "2025-01-01"
471
471
  },
472
472
  "route-group:capabilities": {
@@ -474,7 +474,7 @@
474
474
  "type": "route-group",
475
475
  "domain": "mapping",
476
476
  "sourcePath": "src/server/routes.ts",
477
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
477
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
478
478
  "since": "2025-01-01"
479
479
  },
480
480
  "route-group:project-map": {
@@ -482,7 +482,7 @@
482
482
  "type": "route-group",
483
483
  "domain": "mapping",
484
484
  "sourcePath": "src/server/routes.ts",
485
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
485
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
486
486
  "since": "2025-01-01"
487
487
  },
488
488
  "route-group:coherence": {
@@ -490,7 +490,7 @@
490
490
  "type": "route-group",
491
491
  "domain": "coherence",
492
492
  "sourcePath": "src/server/routes.ts",
493
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
493
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
494
494
  "since": "2025-01-01"
495
495
  },
496
496
  "route-group:topic-bindings": {
@@ -498,7 +498,7 @@
498
498
  "type": "route-group",
499
499
  "domain": "sessions",
500
500
  "sourcePath": "src/server/routes.ts",
501
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
501
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
502
502
  "since": "2025-01-01"
503
503
  },
504
504
  "route-group:context": {
@@ -506,7 +506,7 @@
506
506
  "type": "route-group",
507
507
  "domain": "context",
508
508
  "sourcePath": "src/server/routes.ts",
509
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
509
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
510
510
  "since": "2025-01-01"
511
511
  },
512
512
  "route-group:scope-coherence": {
@@ -514,7 +514,7 @@
514
514
  "type": "route-group",
515
515
  "domain": "coherence",
516
516
  "sourcePath": "src/server/routes.ts",
517
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
517
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
518
518
  "since": "2025-01-01"
519
519
  },
520
520
  "route-group:canonical-state": {
@@ -522,7 +522,7 @@
522
522
  "type": "route-group",
523
523
  "domain": "state",
524
524
  "sourcePath": "src/server/routes.ts",
525
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
525
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
526
526
  "since": "2025-01-01"
527
527
  },
528
528
  "route-group:ci": {
@@ -530,7 +530,7 @@
530
530
  "type": "route-group",
531
531
  "domain": "monitoring",
532
532
  "sourcePath": "src/server/routes.ts",
533
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
533
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
534
534
  "since": "2025-01-01"
535
535
  },
536
536
  "route-group:sessions": {
@@ -538,7 +538,7 @@
538
538
  "type": "route-group",
539
539
  "domain": "sessions",
540
540
  "sourcePath": "src/server/routes.ts",
541
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
541
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
542
542
  "since": "2025-01-01"
543
543
  },
544
544
  "route-group:jobs": {
@@ -546,7 +546,7 @@
546
546
  "type": "route-group",
547
547
  "domain": "scheduling",
548
548
  "sourcePath": "src/server/routes.ts",
549
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
549
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
550
550
  "since": "2025-01-01"
551
551
  },
552
552
  "route-group:skip-ledger": {
@@ -554,7 +554,7 @@
554
554
  "type": "route-group",
555
555
  "domain": "scheduling",
556
556
  "sourcePath": "src/server/routes.ts",
557
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
557
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
558
558
  "since": "2025-01-01"
559
559
  },
560
560
  "route-group:telegram": {
@@ -562,7 +562,7 @@
562
562
  "type": "route-group",
563
563
  "domain": "communication",
564
564
  "sourcePath": "src/server/routes.ts",
565
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
565
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
566
566
  "since": "2025-01-01"
567
567
  },
568
568
  "route-group:attention": {
@@ -570,7 +570,7 @@
570
570
  "type": "route-group",
571
571
  "domain": "communication",
572
572
  "sourcePath": "src/server/routes.ts",
573
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
573
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
574
574
  "since": "2025-01-01"
575
575
  },
576
576
  "route-group:relationships": {
@@ -578,7 +578,7 @@
578
578
  "type": "route-group",
579
579
  "domain": "relationships",
580
580
  "sourcePath": "src/server/routes.ts",
581
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
581
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
582
582
  "since": "2025-01-01"
583
583
  },
584
584
  "route-group:feedback": {
@@ -586,7 +586,7 @@
586
586
  "type": "route-group",
587
587
  "domain": "feedback",
588
588
  "sourcePath": "src/server/routes.ts",
589
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
589
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
590
590
  "since": "2025-01-01"
591
591
  },
592
592
  "route-group:updates": {
@@ -594,7 +594,7 @@
594
594
  "type": "route-group",
595
595
  "domain": "updates",
596
596
  "sourcePath": "src/server/routes.ts",
597
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
597
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
598
598
  "since": "2025-01-01"
599
599
  },
600
600
  "route-group:dispatches": {
@@ -602,7 +602,7 @@
602
602
  "type": "route-group",
603
603
  "domain": "dispatches",
604
604
  "sourcePath": "src/server/routes.ts",
605
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
605
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
606
606
  "since": "2025-01-01"
607
607
  },
608
608
  "route-group:quota": {
@@ -610,7 +610,7 @@
610
610
  "type": "route-group",
611
611
  "domain": "monitoring",
612
612
  "sourcePath": "src/server/routes.ts",
613
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
613
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
614
614
  "since": "2025-01-01"
615
615
  },
616
616
  "route-group:publishing": {
@@ -618,7 +618,7 @@
618
618
  "type": "route-group",
619
619
  "domain": "publishing",
620
620
  "sourcePath": "src/server/routes.ts",
621
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
621
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
622
622
  "since": "2025-01-01"
623
623
  },
624
624
  "route-group:private-views": {
@@ -626,7 +626,7 @@
626
626
  "type": "route-group",
627
627
  "domain": "publishing",
628
628
  "sourcePath": "src/server/routes.ts",
629
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
629
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
630
630
  "since": "2025-01-01"
631
631
  },
632
632
  "route-group:tunnel": {
@@ -634,7 +634,7 @@
634
634
  "type": "route-group",
635
635
  "domain": "networking",
636
636
  "sourcePath": "src/server/routes.ts",
637
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
637
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
638
638
  "since": "2025-01-01"
639
639
  },
640
640
  "route-group:events": {
@@ -642,7 +642,7 @@
642
642
  "type": "route-group",
643
643
  "domain": "networking",
644
644
  "sourcePath": "src/server/routes.ts",
645
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
645
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
646
646
  "since": "2025-01-01"
647
647
  },
648
648
  "route-group:evolution": {
@@ -650,7 +650,7 @@
650
650
  "type": "route-group",
651
651
  "domain": "evolution",
652
652
  "sourcePath": "src/server/routes.ts",
653
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
653
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
654
654
  "since": "2025-01-01"
655
655
  },
656
656
  "route-group:watchdog": {
@@ -658,7 +658,7 @@
658
658
  "type": "route-group",
659
659
  "domain": "monitoring",
660
660
  "sourcePath": "src/server/routes.ts",
661
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
661
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
662
662
  "since": "2025-01-01"
663
663
  },
664
664
  "route-group:topic-memory": {
@@ -666,7 +666,7 @@
666
666
  "type": "route-group",
667
667
  "domain": "memory",
668
668
  "sourcePath": "src/server/routes.ts",
669
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
669
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
670
670
  "since": "2025-01-01"
671
671
  },
672
672
  "route-group:state-sync": {
@@ -674,7 +674,7 @@
674
674
  "type": "route-group",
675
675
  "domain": "coordination",
676
676
  "sourcePath": "src/server/routes.ts",
677
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
677
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
678
678
  "since": "2025-01-01"
679
679
  },
680
680
  "route-group:intent": {
@@ -682,7 +682,7 @@
682
682
  "type": "route-group",
683
683
  "domain": "intent",
684
684
  "sourcePath": "src/server/routes.ts",
685
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
685
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
686
686
  "since": "2025-01-01"
687
687
  },
688
688
  "route-group:triage": {
@@ -690,7 +690,7 @@
690
690
  "type": "route-group",
691
691
  "domain": "safety",
692
692
  "sourcePath": "src/server/routes.ts",
693
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
693
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
694
694
  "since": "2025-01-01"
695
695
  },
696
696
  "route-group:operations": {
@@ -698,7 +698,7 @@
698
698
  "type": "route-group",
699
699
  "domain": "safety",
700
700
  "sourcePath": "src/server/routes.ts",
701
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
701
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
702
702
  "since": "2025-01-01"
703
703
  },
704
704
  "route-group:sentinel": {
@@ -706,7 +706,7 @@
706
706
  "type": "route-group",
707
707
  "domain": "safety",
708
708
  "sourcePath": "src/server/routes.ts",
709
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
709
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
710
710
  "since": "2025-01-01"
711
711
  },
712
712
  "route-group:trust": {
@@ -714,7 +714,7 @@
714
714
  "type": "route-group",
715
715
  "domain": "safety",
716
716
  "sourcePath": "src/server/routes.ts",
717
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
717
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
718
718
  "since": "2025-01-01"
719
719
  },
720
720
  "route-group:monitoring": {
@@ -722,7 +722,7 @@
722
722
  "type": "route-group",
723
723
  "domain": "monitoring",
724
724
  "sourcePath": "src/server/routes.ts",
725
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
725
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
726
726
  "since": "2025-01-01"
727
727
  },
728
728
  "route-group:commitments": {
@@ -730,7 +730,7 @@
730
730
  "type": "route-group",
731
731
  "domain": "commitments",
732
732
  "sourcePath": "src/server/routes.ts",
733
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
733
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
734
734
  "since": "2025-01-01"
735
735
  },
736
736
  "route-group:episodes": {
@@ -738,7 +738,7 @@
738
738
  "type": "route-group",
739
739
  "domain": "memory",
740
740
  "sourcePath": "src/server/routes.ts",
741
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
741
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
742
742
  "since": "2025-01-01"
743
743
  },
744
744
  "route-group:messages": {
@@ -746,7 +746,7 @@
746
746
  "type": "route-group",
747
747
  "domain": "coordination",
748
748
  "sourcePath": "src/server/routes.ts",
749
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
749
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
750
750
  "since": "2025-01-01"
751
751
  },
752
752
  "route-group:system-reviews": {
@@ -754,7 +754,7 @@
754
754
  "type": "route-group",
755
755
  "domain": "monitoring",
756
756
  "sourcePath": "src/server/routes.ts",
757
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
757
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
758
758
  "since": "2025-01-01"
759
759
  },
760
760
  "route-group:machine-mesh": {
@@ -770,7 +770,7 @@
770
770
  "type": "route-group",
771
771
  "domain": "security",
772
772
  "sourcePath": "src/server/routes.ts",
773
- "contentHash": "de1afbb5ae85ad64a3802c1953f0ab7672af2b05ce15609a3b6c3a177dc2bd72",
773
+ "contentHash": "d62dbd5537f6bdb0fa68efe3e2192ee204af4d86a7e3eed8fe2c77ebfa635e98",
774
774
  "since": "2025-01-01"
775
775
  },
776
776
  "cli:init": {
@@ -0,0 +1,37 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ Completes the multi-machine relocation fix: a machine now resolves its OWN nickname.
9
+
10
+ - **Root cause (live-caught on real hardware):** `updateNickname` is local-only, so a
11
+ machine rename applied on a peer's registry never reached the owning machine — its own
12
+ capacity entry was `nickname=None` while peers saw the name. The relocation check runs on
13
+ the holder, so it couldn't resolve its own nickname and "move it back to <this machine>"
14
+ silently failed.
15
+ - **`SelfNicknameResolver`** (pure) — resolves self-nickname: local view → peer view → derive.
16
+ - **Convergence task** — at boot and on a timer, if the local self-nickname is missing, it
17
+ adopts the name a peer authoritatively reports and persists it, making `getCapacities()`
18
+ symmetric so the recognizer, transfer route, and `/pool` all resolve self.
19
+ - **Transfer route** resolves the self-nickname via the resolver (was capacity-only).
20
+
21
+ ## What to Tell Your User
22
+
23
+ - **"Move it back here" works now.** When a conversation is on one of your machines and you
24
+ ask to move it back to the machine you're on, that used to silently do nothing in some
25
+ setups — your agent didn't know its own name. It learns its own name from its other
26
+ machines now, so moving things back and forth just works.
27
+
28
+ ## Summary of New Capabilities
29
+
30
+ - A machine resolves its own user-facing nickname (from peers when its local copy is missing).
31
+ - Reliable "move this to the machine it's already on" — the last gap in nickname transfers.
32
+
33
+ ## Evidence
34
+
35
+ Live-caught on the real laptop+mini pair (laptop returned 404 "unknown machine: Laptop" for
36
+ its own name). 7 unit tests incl. the asymmetry regression + an e2e proving self-nickname
37
+ transfer resolves through the real AgentServer. Spec: MULTI-MACHINE-SESSION-POOL-SPEC §L4.
@@ -0,0 +1,56 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ When a Gemini call hit a per-model capacity limit (e.g. "You have exhausted your
9
+ capacity on this model. Quota resets after 46m"), instar's Gemini capacity policy
10
+ globally deferred on that model and wrote a `quota-state.json` snapshot with
11
+ `recommendation: 'stop'` / `fiveHourPercent: 100`. But the known Gemini models
12
+ (`gemini-2.5-flash`, `gemini-2.5-pro`) draw on SEPARATE quotas, so one model
13
+ exhausting was mis-recorded as a full account-wide block — and every reader of that
14
+ file (the agent, the mentor, the escalation monitor) concluded the whole Gemini
15
+ agent was down, even when the account had headroom on the other model. This produced
16
+ repeated false "agent is blocked" reports.
17
+
18
+ The policy now switches to a known model with headroom and retries before deferring
19
+ (mirroring the codex auto-swap-on-limit policy). Only when EVERY known model is
20
+ exhausted does it globally defer and write the stop-state — now tagged
21
+ `scope: 'account'`. The per-model exhaustion windows are tracked time-based and
22
+ self-clear, so there is no switch loop and no stale state. The model switch uses a
23
+ short 250ms backoff (a different model needs no wait).
24
+
25
+ ## What to Tell Your User
26
+
27
+ If you run a Gemini-backed agent: when one Gemini model hits its limit, the agent now
28
+ quietly switches to the other model and keeps working, instead of going dark for the
29
+ length of that model's reset window. It only reports itself as out of capacity when
30
+ every model is genuinely exhausted. Nothing to do — it just stops the false "blocked"
31
+ reports and keeps the agent productive.
32
+
33
+ ## Summary of New Capabilities
34
+
35
+ Gemini agents auto-fall-back across models on a per-model capacity limit (parity with
36
+ the codex auto-swap), and the durable quota-state now distinguishes a single-model
37
+ deferral from a genuine account-wide block (`scope: 'account'`).
38
+
39
+ ## Evidence
40
+
41
+ - **Reproduction (live this session):** a Gemini agent's `gemini -p` probe returned
42
+ "You have exhausted your capacity on this model. Your quota will reset after 46m11s"
43
+ while the account `/stats` showed 20% remaining on the Auto model — i.e. one model
44
+ exhausted, account fine. The old policy wrote `recommendation: 'stop'` for this,
45
+ which read as a full block.
46
+ - **Before:** single-model exhaustion → global defer + `recommendation:'stop'` /
47
+ `fiveHourPercent:100`; the agent appeared fully blocked for the whole reset window.
48
+ - **After:** single-model exhaustion → switch to the model with headroom and keep
49
+ working; global stop-state (now `scope:'account'`) is written ONLY when every known
50
+ model is exhausted.
51
+ - **Tests:** 21 across three tiers — `tests/unit/geminiCapacityPolicy.test.ts`
52
+ (switch-then-defer, single-model-no-global-stop, `pickGeminiFallbackModel`,
53
+ self-clearing windows), `tests/integration/gemini-capacity-policy-integration.test.ts`,
54
+ and `tests/e2e/gemini-capacity-policy-lifecycle.test.ts` (both updated to assert the
55
+ two-model attempt + account scope), plus the escalation-monitor suite. `tsc --noEmit`
56
+ clean.
@@ -0,0 +1,81 @@
1
+ # Side-Effects Review — Gemini per-model exhaustion switches model before deferring
2
+
3
+ **Version / slug:** `gemini-model-fallback-on-exhaustion`
4
+ **Date:** `2026-06-04`
5
+ **Author:** `echo`
6
+ **Second-pass reviewer:** `required (LLM-routing behavior change)`
7
+
8
+ ## Summary of the change
9
+
10
+ When a Gemini call hit a capacity limit, `decideGeminiCapacityPolicy` (after its
11
+ short-window immediate-retry path) went straight to a GLOBAL `defer` on the SAME
12
+ model, and `recordGeminiCapacityDeferral` wrote a `quota-state.json` snapshot with
13
+ `fiveHourPercent: 100` / `recommendation: 'stop'`. But the known Gemini models —
14
+ `gemini-2.5-flash` and `gemini-2.5-pro` — draw on **separate** quotas. So one model
15
+ exhausting (e.g. "You have exhausted your capacity on this model. Quota resets after
16
+ 46m") was recorded as a full account-wide block, and any reader of `quota-state.json`
17
+ (including the agent itself, the mentor, the escalation monitor) saw `recommendation:
18
+ 'stop'` and concluded the whole Gemini agent was down — even when the account had
19
+ headroom on the other model. This caused repeated false "Gemi is blocked" reports
20
+ (confirmed live this session: a `gemini -p` probe returned that exact error while
21
+ `/stats` showed the account at 20% remaining on Auto).
22
+
23
+ The fix (mirrors the existing codex auto-swap-on-limit policy, #31): on per-model
24
+ exhaustion, record the exhausted model's reset window, then switch to a known model
25
+ with headroom and retry. Only when **every** known model is exhausted do we globally
26
+ defer and write the stop-state — now tagged `scope: 'account'`. Because the caller
27
+ records a deferral only on `action: 'defer'`, switching models also means a single-
28
+ model exhaustion no longer writes a global stop at all.
29
+
30
+ ## Decision-point inventory
31
+
32
+ 1. **`decideGeminiCapacityPolicy` (long-reset branch):** record `model` as exhausted
33
+ (time-based, `now + deferMs`); pick a fallback via `pickGeminiFallbackModel`; if
34
+ one exists → `retry` with that model; else → `defer`.
35
+ 2. **`pickGeminiFallbackModel`:** a candidate qualifies when known, ≠ the exhausted
36
+ model, and not itself inside a recorded exhaustion window at `now`. Prefers an
37
+ operator-configured `fallbackModel`, else the first known model with headroom.
38
+
39
+ ## 1. Over-block (what still defers / blocks)
40
+
41
+ - When ALL known models are in an exhaustion window → `defer` + the global stop-state
42
+ (now `scope: 'account'`). That is the genuine account-wide block and still gates
43
+ scheduler spawns exactly as before. (tests: "defers once ALL models exhausted",
44
+ integration "defers after a long quota reset", e2e lifecycle.)
45
+ - The short-window immediate-retry path (attempt < maxImmediateRetries, small reset)
46
+ is unchanged.
47
+ - Non-capacity errors are unchanged — `decide` returns `none` and the error surfaces.
48
+
49
+ ## 2. Under-block (what it now allows that it didn't)
50
+
51
+ - A single model exhausting now triggers ONE extra Gemini spawn on the other model
52
+ (the switch) before any deferral. Worst-case cost when BOTH models are exhausted:
53
+ two spawns instead of one (flash then pro) before the global defer — bounded at 2
54
+ (one per known model; each is recorded exhausted so it is never retried within its
55
+ window). The model-switch retry uses a 250ms backoff (not the 5s same-model
56
+ backoff) since a different model needs no wait.
57
+ - Loop-safety: `modelExhaustedUntil` is time-based and self-clears once a window
58
+ passes, so there is no permanent state and no A→B→A switch loop (each model is
59
+ recorded before fallback selection; once both are recorded, `pickGeminiFallbackModel`
60
+ returns undefined → defer). (tests: "returns undefined once both exhausted",
61
+ "windows self-clear once the reset passes".)
62
+
63
+ ## 3. Blast radius
64
+
65
+ - One file of logic: `src/providers/adapters/gemini-cli/observability/geminiCapacityPolicy.ts`
66
+ (new module state `modelExhaustedUntil`, new export `pickGeminiFallbackModel`, a
67
+ `now?` param on `decide`, the switch-before-defer branch, `scope` on the stop-state,
68
+ reset clears the map).
69
+ - NO consumer signature changes: both callers (`transport/oneShotCompletion.ts`,
70
+ `core/GeminiCliIntelligenceProvider.ts`) already switch to `decision.model` on
71
+ `action:'retry'` and record a deferral only on `action:'defer'`.
72
+ - Affects only Gemini-CLI agents. Claude / codex paths untouched. The added
73
+ `scope` field is additive (readers that don't know it are unaffected).
74
+
75
+ ## 4. Reversibility
76
+
77
+ Fully reversible: revert the one policy file + the test updates. Module state is
78
+ in-process and time-based (no persistence); the `quota-state.json` shape only gains
79
+ an additive `scope` field. Verified: `tsc --noEmit` clean; 21 tests green across
80
+ unit + integration + e2e + escalation tiers (both the switch path and the genuine
81
+ all-models-defer path).
@@ -0,0 +1,23 @@
1
+ # Self-Nickname Convergence — Plain-English Overview
2
+
3
+ > One line: a machine now learns its OWN user-facing nickname from its peers, so "move it back to <this machine>" finally works.
4
+
5
+ ## The problem in one breath
6
+
7
+ We shipped placement/transfer robustness, but live-testing on the real laptop+mini pair exposed that the fix was incomplete: the laptop couldn't resolve its OWN name "Laptop". Root cause — `updateNickname` (the dashboard rename) is local-only, so a rename applied on a peer's registry never reached the owning machine. The laptop's own capacity entry was `nickname=None` while peers correctly saw "Laptop". The relocation check runs on the holder (laptop), so it couldn't match "Laptop" → "move it back to the laptop" silently failed.
8
+
9
+ ## What this adds
10
+
11
+ - **`SelfNicknameResolver` (pure)** — resolves this machine's own nickname: local capacity view → any PEER's view that names it (the drift backstop) → deterministic derive. Unit-tested incl. the exact asymmetry (self absent locally, present in a peer view).
12
+ - **Self-nickname convergence task (server)** — periodically (and at boot), if the local self-entry has no nickname, it fetches an online peer's `/pool`, finds what the peer calls this machine, and persists it via `updateNickname`. This makes `getCapacities()` SYMMETRIC, so the recognizer, the transfer route, and `/pool` all resolve self. No-ops once known.
13
+ - **Transfer route** now resolves the self-nickname via the resolver (was caps-only).
14
+
15
+ ## The safeguards
16
+
17
+ - **Best-effort, never blocks** — convergence catches all errors (annotated `@silent-fallback-ok`); a failed peer fetch just retries on the timer.
18
+ - **No mis-routing** — adoption only happens when the local nickname is missing and a peer authoritatively names this machineId; `updateNickname` still enforces pool-uniqueness.
19
+ - **Tests** — Tier 1 (7 unit on the resolver incl. the regression), Tier 3 (e2e: transfer to THIS machine's own nickname resolves through the real AgentServer — 404'd before). `tsc` clean.
20
+
21
+ ## Spec lineage
22
+
23
+ §L4 of the approved `docs/specs/MULTI-MACHINE-SESSION-POOL-SPEC.md` (nickname-based placement/transfer). No new authority — a convergence read-model over existing nickname state.