instar 1.3.545 → 1.3.546

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.545",
3
+ "version": "1.3.546",
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-13T23:13:47.670Z",
5
- "instarVersion": "1.3.545",
4
+ "generatedAt": "2026-06-13T23:37:35.177Z",
5
+ "instarVersion": "1.3.546",
6
6
  "entryCount": 201,
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
421
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
429
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
437
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
445
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
453
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
461
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
469
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
477
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
485
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
493
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
501
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
509
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
517
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
525
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
533
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
541
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
549
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
557
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
565
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
573
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
581
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
589
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
597
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
605
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
613
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
621
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
629
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
637
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
645
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
653
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
661
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
669
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
677
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
685
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
693
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
701
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
709
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
717
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
725
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
733
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
741
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
749
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
757
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
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": "47778814f51cfe564085e64c530904ea74db70c12d92b7ae4adc30b425135fd9",
773
+ "contentHash": "bc356c0c0497201b29e29a91e2e5cb2885f5594f1e0fbbe16302c0078748e355",
774
774
  "since": "2025-01-01"
775
775
  },
776
776
  "cli:init": {
@@ -0,0 +1,24 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ Makes the autonomous balancer actually run — on a development agent, in dry-run — so it dogfoods its decisions instead of sitting as unwired code.
9
+
10
+ - **Wired into the server** — the `CredentialRebalancer` is constructed in the credential-repointing bundle with the snapshot-mapper providers (ledger → slots, subscription pool → accounts, config resolver) and an `isEnabled` that mirrors the location gate exactly (dev-gate-resolved AND not env-token-refused). A reentrancy-guarded, interval-clamped (`[60s, 60min]`), `.unref()`'d `setInterval` runs the pass; tick errors are caught so a throw never crashes the loop.
11
+ - **Live status surface** — `GET /credentials/rebalancer` now reports `balancerWired:true` + `rebalancer.status()` (enabled, the P19 breaker state, cooldown counts, and the last pass's decisions/degraded/attention) when the feature is live, scrubbed via the audit chokepoint; it stays a strict 503 no-op while dark.
12
+ - **Dry-run dogfood, zero writes** — on a dev agent the loop runs the full decision loop and audits what it WOULD do, but the executor's `dryRun` default keeps every credential write off until a deliberate `dryRun:false`.
13
+
14
+ ## What to Tell Your User
15
+
16
+ The automatic account-balancer is now actually running on me — but in dry-run, so it's all observation, no action. Every few minutes it looks at your quota picture, decides whether a login should move, and records what it WOULD do — moving zero real credentials. You can watch it at the rebalancer status endpoint (which account it would shuffle and why, plus its safety circuit-breaker). It only runs on a development agent like me (your wider fleet stays dark), and the step where it actually starts moving logins is still your deliberate switch, after the livetest. This is the dogfooding rung of the maturity path — it's live and watchable, with nothing irreversible happening.
17
+
18
+ ## Summary of New Capabilities
19
+
20
+ The autonomous balancer (Increment B) is now wired + running in dry-run on a development agent. `GET /credentials/rebalancer` reports the live balancer status (last pass + P19 breaker). On a dev agent the balancer pass runs every ~5min (interval-clamped, reentrancy-guarded) computing + auditing its decisions; zero credential writes while `dryRun` holds (the default). The fleet stays dark (strict 503/no-op). No new write authority — the executor's dry-run gate is the load-bearing write guard.
21
+
22
+ ## Evidence
23
+
24
+ - `tests/e2e/credential-repointing-routes-alive.test.ts` (6) — the rebalancer route now surfaces `balancerWired:true` + the live `rebalancer.status()` (enabled + breaker) on a production-shaped bundle with a real wired CredentialRebalancer; the dark path still 503s (strict no-op). tsc + full lint clean. Independent second-pass review CONCUR (gate mirrors the location gate; dry-run defaults true with the executor as the write guard; timer reentrancy-guarded/clamped/unref'd/error-caught; route is a leak-free 503-while-dark surface).
@@ -0,0 +1,46 @@
1
+ # Side-Effects Review — WS5.2 Increment B / B3b-wire: balancer wired into the server (dry-run on dev)
2
+
3
+ **Version / slug:** `ws52-incb-b3b-wire`
4
+ **Date:** 2026-06-13
5
+ **Author:** echo
6
+ **Second-pass reviewer:** independent reviewer subagent — CONCUR (wires autonomous-write actuation into the live server → Phase 5 required)
7
+
8
+ ## Summary of the change
9
+
10
+ Wires the (already-reviewed) `CredentialRebalancer` orchestrator into the server composition root: constructs it in the `credentialRepointing` bundle (server.ts) with the snapshot-mapper providers + the re-gated `isEnabled`, schedules a reentrancy-guarded periodic `setInterval` pass, adds `rebalancer` to the bundle, and extends `GET /credentials/rebalancer` to report `rebalancer.status()` (last pass + breaker) alongside the env-token gate verdict. Because the feature is re-gated to live-on-dev-in-dry-run, on a DEV agent this loop now RUNS every ~5min in dry-run (full decision loop + audit, ZERO credential writes); on the fleet it is a strict no-op. This is the dogfooding the maturation path needs (CMT-1493). Real writes still require a deliberate `dryRun:false` (CMT-1494).
11
+
12
+ ## Decision-point inventory
13
+
14
+ - `credentialRebalancer.tick()` (now scheduled) — the autonomous balancer pass, now LIVE-on-dev in dry-run. Its `isEnabled` mirrors the location gate exactly (dev-gate-resolved AND not env-token-refused); the destructive write is gated by the executor's own `dryRun` (default true). The orchestrator's decision/breaker logic was reviewed in B3a; this change is the WIRING.
15
+
16
+ ---
17
+
18
+ ## 1. Over-block
19
+ No block/allow surface. Conservative direction preserved: the pass is a strict no-op whenever the feature is dark OR the env-token gate refuses; even when it runs (dev), the executor's dry-run gate blocks every write.
20
+
21
+ ## 2. Under-block
22
+ The new exposure on a dev agent: the balancer loop now actuates decisions (in dry-run) every pass. The reviewer confirmed no path writes a credential without an explicit `dryRun:false`. The known operator-opt-in subtlety (an explicit `enabled:true` resolves the gate true even on a fleet agent) is the documented two-flag design and remains write-protected by the dry-run default.
23
+
24
+ ## 3. Level-of-abstraction fit
25
+ Correct: the wiring layer holds ONLY the construction + scheduling; the decision is the pure policy's, the actuation is the gated executor's, the cross-pass state is the orchestrator's. The snapshot mappers (kept pure) translate live state. The setInterval is the thin "make it run" layer.
26
+
27
+ ## 4. Signal vs authority compliance
28
+ - [x] Yes — the conservatively-bounded actuation authority the §2.4 Tier-0 justification sanctions: deterministic policy, oracle-verified reversible swaps, every pass audited, dark + dry-run-first. The wiring grants no NEW authority beyond scheduling the already-reviewed orchestrator under the unchanged gate. (Ref: docs/signal-vs-authority.md; §2.4.)
29
+
30
+ ## 5. Interactions
31
+ - **Gate interaction:** `isEnabled` is byte-identical to the location gate, so the balancer and the QuotaPoller-attribution path agree on dark/live. The executor's own dark/dryRun gate is belt-and-suspenders.
32
+ - **Timer:** reentrancy-guarded (a slow tick never overlaps), interval clamped [60s, 60min], `.unref()`'d (never holds the process open), tick errors caught (a throw never crashes the loop or sticks the in-flight flag).
33
+ - **Route:** the dark path (`!credRepointEnabled()`) short-circuits to a 503 no-op BEFORE touching the rebalancer; the enabled path adds `balancerWired` + a leak-free `status()` (only enabled/breaker/cooldown counts + the last pass's slot/account/objective/reason — no token/blob material; scrubbed via `credSend → audit.response`).
34
+
35
+ ## 6. External surfaces
36
+ - On a **dev agent**: `GET /credentials/rebalancer` now reports `balancerWired:true` + the live status, and the balancer runs its dry-run loop (visible in the audit + DegradationReporter/attention on a surfaced terminal state). Zero credential writes. On the **fleet**: byte-for-byte unchanged (dark 503; the unref'd timer's tick is a strict no-op).
37
+
38
+ ## 7. Multi-machine posture (Cross-Machine Coherence)
39
+ - **Machine-local BY DESIGN.** Each machine schedules its own pass over its own ledger/pool/keychain snapshot; the in-memory cooldown/breaker state is per-process. No cross-machine input or coordination.
40
+
41
+ ## 8. Rollback cost
42
+ Low. Revert the commit → the rebalancer is no longer constructed/scheduled and the route returns to `balancerWired:false`. No state, no migration, no credential touch (dry-run never wrote). Any swap the live balancer ever performs is the reversible, oracle-verified, dry-run-gated round-trip the executor owns.
43
+
44
+ ## Follow-ups (tracked, not orphaned)
45
+ - An explicit operator default-account config + tmux-activity busyness for the drain target are dogfood refinements `<!-- tracked: 20905 -->` (B3b uses the current `~/.claude` tenant as the desired default and uniform busyness for now — safe in dry-run).
46
+ - B4 (livetest tie-in) + the `dryRun:false` promotion decision are tracked as commitments CMT-1493 / CMT-1494.