instar 1.3.1338 → 1.3.1339

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.1338",
3
+ "version": "1.3.1339",
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-10-09T21:53:05.040Z",
5
- "instarVersion": "1.3.1338",
4
+ "generatedAt": "2026-10-11T00:18:12.887Z",
5
+ "instarVersion": "1.3.1339",
6
6
  "entryCount": 203,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -427,7 +427,7 @@
427
427
  "type": "route-group",
428
428
  "domain": "monitoring",
429
429
  "sourcePath": "src/server/routes.ts",
430
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
430
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
431
431
  "since": "2025-01-01"
432
432
  },
433
433
  "route-group:agents": {
@@ -435,7 +435,7 @@
435
435
  "type": "route-group",
436
436
  "domain": "sessions",
437
437
  "sourcePath": "src/server/routes.ts",
438
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
438
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
439
439
  "since": "2025-01-01"
440
440
  },
441
441
  "route-group:backups": {
@@ -443,7 +443,7 @@
443
443
  "type": "route-group",
444
444
  "domain": "operations",
445
445
  "sourcePath": "src/server/routes.ts",
446
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
446
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
447
447
  "since": "2025-01-01"
448
448
  },
449
449
  "route-group:git": {
@@ -451,7 +451,7 @@
451
451
  "type": "route-group",
452
452
  "domain": "coordination",
453
453
  "sourcePath": "src/server/routes.ts",
454
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
454
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
455
455
  "since": "2025-01-01"
456
456
  },
457
457
  "route-group:memory": {
@@ -459,7 +459,7 @@
459
459
  "type": "route-group",
460
460
  "domain": "memory",
461
461
  "sourcePath": "src/server/routes.ts",
462
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
462
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
463
463
  "since": "2025-01-01"
464
464
  },
465
465
  "route-group:semantic": {
@@ -467,7 +467,7 @@
467
467
  "type": "route-group",
468
468
  "domain": "memory",
469
469
  "sourcePath": "src/server/routes.ts",
470
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
470
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
471
471
  "since": "2025-01-01"
472
472
  },
473
473
  "route-group:status": {
@@ -475,7 +475,7 @@
475
475
  "type": "route-group",
476
476
  "domain": "monitoring",
477
477
  "sourcePath": "src/server/routes.ts",
478
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
478
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
479
479
  "since": "2025-01-01"
480
480
  },
481
481
  "route-group:capabilities": {
@@ -483,7 +483,7 @@
483
483
  "type": "route-group",
484
484
  "domain": "mapping",
485
485
  "sourcePath": "src/server/routes.ts",
486
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
486
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
487
487
  "since": "2025-01-01"
488
488
  },
489
489
  "route-group:project-map": {
@@ -491,7 +491,7 @@
491
491
  "type": "route-group",
492
492
  "domain": "mapping",
493
493
  "sourcePath": "src/server/routes.ts",
494
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
494
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
495
495
  "since": "2025-01-01"
496
496
  },
497
497
  "route-group:coherence": {
@@ -499,7 +499,7 @@
499
499
  "type": "route-group",
500
500
  "domain": "coherence",
501
501
  "sourcePath": "src/server/routes.ts",
502
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
502
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
503
503
  "since": "2025-01-01"
504
504
  },
505
505
  "route-group:topic-bindings": {
@@ -507,7 +507,7 @@
507
507
  "type": "route-group",
508
508
  "domain": "sessions",
509
509
  "sourcePath": "src/server/routes.ts",
510
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
510
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
511
511
  "since": "2025-01-01"
512
512
  },
513
513
  "route-group:context": {
@@ -515,7 +515,7 @@
515
515
  "type": "route-group",
516
516
  "domain": "context",
517
517
  "sourcePath": "src/server/routes.ts",
518
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
518
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
519
519
  "since": "2025-01-01"
520
520
  },
521
521
  "route-group:scope-coherence": {
@@ -523,7 +523,7 @@
523
523
  "type": "route-group",
524
524
  "domain": "coherence",
525
525
  "sourcePath": "src/server/routes.ts",
526
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
526
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
527
527
  "since": "2025-01-01"
528
528
  },
529
529
  "route-group:canonical-state": {
@@ -531,7 +531,7 @@
531
531
  "type": "route-group",
532
532
  "domain": "state",
533
533
  "sourcePath": "src/server/routes.ts",
534
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
534
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
535
535
  "since": "2025-01-01"
536
536
  },
537
537
  "route-group:ci": {
@@ -539,7 +539,7 @@
539
539
  "type": "route-group",
540
540
  "domain": "monitoring",
541
541
  "sourcePath": "src/server/routes.ts",
542
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
542
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
543
543
  "since": "2025-01-01"
544
544
  },
545
545
  "route-group:sessions": {
@@ -547,7 +547,7 @@
547
547
  "type": "route-group",
548
548
  "domain": "sessions",
549
549
  "sourcePath": "src/server/routes.ts",
550
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
550
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
551
551
  "since": "2025-01-01"
552
552
  },
553
553
  "route-group:jobs": {
@@ -555,7 +555,7 @@
555
555
  "type": "route-group",
556
556
  "domain": "scheduling",
557
557
  "sourcePath": "src/server/routes.ts",
558
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
558
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
559
559
  "since": "2025-01-01"
560
560
  },
561
561
  "route-group:skip-ledger": {
@@ -563,7 +563,7 @@
563
563
  "type": "route-group",
564
564
  "domain": "scheduling",
565
565
  "sourcePath": "src/server/routes.ts",
566
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
566
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
567
567
  "since": "2025-01-01"
568
568
  },
569
569
  "route-group:telegram": {
@@ -571,7 +571,7 @@
571
571
  "type": "route-group",
572
572
  "domain": "communication",
573
573
  "sourcePath": "src/server/routes.ts",
574
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
574
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
575
575
  "since": "2025-01-01"
576
576
  },
577
577
  "route-group:attention": {
@@ -579,7 +579,7 @@
579
579
  "type": "route-group",
580
580
  "domain": "communication",
581
581
  "sourcePath": "src/server/routes.ts",
582
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
582
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
583
583
  "since": "2025-01-01"
584
584
  },
585
585
  "route-group:relationships": {
@@ -587,7 +587,7 @@
587
587
  "type": "route-group",
588
588
  "domain": "relationships",
589
589
  "sourcePath": "src/server/routes.ts",
590
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
590
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
591
591
  "since": "2025-01-01"
592
592
  },
593
593
  "route-group:feedback": {
@@ -595,7 +595,7 @@
595
595
  "type": "route-group",
596
596
  "domain": "feedback",
597
597
  "sourcePath": "src/server/routes.ts",
598
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
598
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
599
599
  "since": "2025-01-01"
600
600
  },
601
601
  "route-group:updates": {
@@ -603,7 +603,7 @@
603
603
  "type": "route-group",
604
604
  "domain": "updates",
605
605
  "sourcePath": "src/server/routes.ts",
606
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
606
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
607
607
  "since": "2025-01-01"
608
608
  },
609
609
  "route-group:dispatches": {
@@ -611,7 +611,7 @@
611
611
  "type": "route-group",
612
612
  "domain": "dispatches",
613
613
  "sourcePath": "src/server/routes.ts",
614
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
614
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
615
615
  "since": "2025-01-01"
616
616
  },
617
617
  "route-group:quota": {
@@ -619,7 +619,7 @@
619
619
  "type": "route-group",
620
620
  "domain": "monitoring",
621
621
  "sourcePath": "src/server/routes.ts",
622
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
622
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
623
623
  "since": "2025-01-01"
624
624
  },
625
625
  "route-group:publishing": {
@@ -627,7 +627,7 @@
627
627
  "type": "route-group",
628
628
  "domain": "publishing",
629
629
  "sourcePath": "src/server/routes.ts",
630
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
630
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
631
631
  "since": "2025-01-01"
632
632
  },
633
633
  "route-group:private-views": {
@@ -635,7 +635,7 @@
635
635
  "type": "route-group",
636
636
  "domain": "publishing",
637
637
  "sourcePath": "src/server/routes.ts",
638
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
638
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
639
639
  "since": "2025-01-01"
640
640
  },
641
641
  "route-group:tunnel": {
@@ -643,7 +643,7 @@
643
643
  "type": "route-group",
644
644
  "domain": "networking",
645
645
  "sourcePath": "src/server/routes.ts",
646
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
646
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
647
647
  "since": "2025-01-01"
648
648
  },
649
649
  "route-group:events": {
@@ -651,7 +651,7 @@
651
651
  "type": "route-group",
652
652
  "domain": "networking",
653
653
  "sourcePath": "src/server/routes.ts",
654
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
654
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
655
655
  "since": "2025-01-01"
656
656
  },
657
657
  "route-group:evolution": {
@@ -659,7 +659,7 @@
659
659
  "type": "route-group",
660
660
  "domain": "evolution",
661
661
  "sourcePath": "src/server/routes.ts",
662
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
662
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
663
663
  "since": "2025-01-01"
664
664
  },
665
665
  "route-group:watchdog": {
@@ -667,7 +667,7 @@
667
667
  "type": "route-group",
668
668
  "domain": "monitoring",
669
669
  "sourcePath": "src/server/routes.ts",
670
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
670
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
671
671
  "since": "2025-01-01"
672
672
  },
673
673
  "route-group:topic-memory": {
@@ -675,7 +675,7 @@
675
675
  "type": "route-group",
676
676
  "domain": "memory",
677
677
  "sourcePath": "src/server/routes.ts",
678
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
678
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
679
679
  "since": "2025-01-01"
680
680
  },
681
681
  "route-group:state-sync": {
@@ -683,7 +683,7 @@
683
683
  "type": "route-group",
684
684
  "domain": "coordination",
685
685
  "sourcePath": "src/server/routes.ts",
686
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
686
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
687
687
  "since": "2025-01-01"
688
688
  },
689
689
  "route-group:intent": {
@@ -691,7 +691,7 @@
691
691
  "type": "route-group",
692
692
  "domain": "intent",
693
693
  "sourcePath": "src/server/routes.ts",
694
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
694
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
695
695
  "since": "2025-01-01"
696
696
  },
697
697
  "route-group:triage": {
@@ -699,7 +699,7 @@
699
699
  "type": "route-group",
700
700
  "domain": "safety",
701
701
  "sourcePath": "src/server/routes.ts",
702
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
702
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
703
703
  "since": "2025-01-01"
704
704
  },
705
705
  "route-group:operations": {
@@ -707,7 +707,7 @@
707
707
  "type": "route-group",
708
708
  "domain": "safety",
709
709
  "sourcePath": "src/server/routes.ts",
710
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
710
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
711
711
  "since": "2025-01-01"
712
712
  },
713
713
  "route-group:sentinel": {
@@ -715,7 +715,7 @@
715
715
  "type": "route-group",
716
716
  "domain": "safety",
717
717
  "sourcePath": "src/server/routes.ts",
718
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
718
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
719
719
  "since": "2025-01-01"
720
720
  },
721
721
  "route-group:trust": {
@@ -723,7 +723,7 @@
723
723
  "type": "route-group",
724
724
  "domain": "safety",
725
725
  "sourcePath": "src/server/routes.ts",
726
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
726
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
727
727
  "since": "2025-01-01"
728
728
  },
729
729
  "route-group:monitoring": {
@@ -731,7 +731,7 @@
731
731
  "type": "route-group",
732
732
  "domain": "monitoring",
733
733
  "sourcePath": "src/server/routes.ts",
734
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
734
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
735
735
  "since": "2025-01-01"
736
736
  },
737
737
  "route-group:commitments": {
@@ -739,7 +739,7 @@
739
739
  "type": "route-group",
740
740
  "domain": "commitments",
741
741
  "sourcePath": "src/server/routes.ts",
742
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
742
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
743
743
  "since": "2025-01-01"
744
744
  },
745
745
  "route-group:episodes": {
@@ -747,7 +747,7 @@
747
747
  "type": "route-group",
748
748
  "domain": "memory",
749
749
  "sourcePath": "src/server/routes.ts",
750
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
750
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
751
751
  "since": "2025-01-01"
752
752
  },
753
753
  "route-group:messages": {
@@ -755,7 +755,7 @@
755
755
  "type": "route-group",
756
756
  "domain": "coordination",
757
757
  "sourcePath": "src/server/routes.ts",
758
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
758
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
759
759
  "since": "2025-01-01"
760
760
  },
761
761
  "route-group:system-reviews": {
@@ -763,7 +763,7 @@
763
763
  "type": "route-group",
764
764
  "domain": "monitoring",
765
765
  "sourcePath": "src/server/routes.ts",
766
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
766
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
767
767
  "since": "2025-01-01"
768
768
  },
769
769
  "route-group:machine-mesh": {
@@ -779,7 +779,7 @@
779
779
  "type": "route-group",
780
780
  "domain": "security",
781
781
  "sourcePath": "src/server/routes.ts",
782
- "contentHash": "f19ccb020508cb92e2f35d90f12ddecbf5515f9ea15f1b9fd57f213094647eb7",
782
+ "contentHash": "4063a5c83ca8f3149333c4090d815bfc4af2a3db56e08101dfab9d72ca88629e",
783
783
  "since": "2025-01-01"
784
784
  },
785
785
  "cli:init": {
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "generatedFrom": "source-tree",
4
4
  "registrySha256": "35448db940d659661ebdfb09761439033f93a15157540ee2f6eecf825488e1e6",
5
- "packageVersion": "1.3.1338",
5
+ "packageVersion": "1.3.1339",
6
6
  "guards": [
7
7
  {
8
8
  "ref": "docs/audits/phase-b/f10-triage.md",
@@ -1,5 +1,5 @@
1
1
  {
2
- "sha256": "5b4d03f85005340c306df84994bd70cce4183699ef6fc70590635f4e9dbe4b97",
2
+ "sha256": "c095cc2f04124b77c960da745e9fb02cacf4036692174b7d95780c5f5691c5cc",
3
3
  "registrySha256": "35448db940d659661ebdfb09761439033f93a15157540ee2f6eecf825488e1e6",
4
- "packageVersion": "1.3.1338"
4
+ "packageVersion": "1.3.1339"
5
5
  }
@@ -2,5 +2,5 @@
2
2
  "sha256": "35448db940d659661ebdfb09761439033f93a15157540ee2f6eecf825488e1e6",
3
3
  "articleCount": 92,
4
4
  "generatedFrom": "docs/STANDARDS-REGISTRY.md",
5
- "packageVersion": "1.3.1338"
5
+ "packageVersion": "1.3.1339"
6
6
  }
@@ -0,0 +1,20 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ `POST /sessions/refresh` now answers target refusals synchronously instead of returning 202 "Refresh scheduled" and refusing 500ms later in the server log only (EVO-025, from LRN-034). `SessionRefresh` gains a read-only `precheckRefusal(sessionName)` that runs the same detect phase as `refreshSession()` (now shared via a private `resolveTarget()`), the in-flight check, and a non-recording rate-limit check. The route calls it before the busy precheck: `not_telegram_bound`, `session_not_found`, `refresh_in_progress` and `slack_respawner_unwired` return 409 `{code, error}`; `rate_limited` returns 429. When the name given is a running session's display name, the refusal names its `tmuxSession` (a hint, never a silent remap — display names are not unique). `refreshSession()` still re-checks everything after the 202.
9
+
10
+ ## What to Tell Your User
11
+
12
+ If you (or I) ask to restart a session by the wrong name, you now hear right away that it can't be done and which name to use, instead of being told the restart was scheduled when it never happened.
13
+
14
+ ## Summary of New Capabilities
15
+
16
+ - Session restart requests report refusals immediately, with the correct session name when a display name was used.
17
+
18
+ ## Evidence
19
+
20
+ - Tests: `tests/unit/SessionRefresh.test.ts` (+6: null for a restartable session, not_telegram_bound, display-name hint names the tmux session and the authoritative path kills nothing, no hint for unknown names, session_not_found, rate_limited reported without consuming budget); `tests/unit/sessions-refresh-route.test.ts` (+2: 409 not 202 for an unbindable name with refreshSession never called, 429 for rate_limited). Existing Slack-arm, integration and e2e swap-continuity suites pass unchanged. `tsc` clean.
@@ -0,0 +1,113 @@
1
+ # Side-Effects Review — POST /sessions/refresh answers target refusals before the 202 (EVO-025)
2
+
3
+ **Version / slug:** `sessions-refresh-prebind`
4
+ **Date:** `2026-09-24`
5
+ **Author:** `Echo`
6
+ **Second-pass reviewer:** `independent reviewer subagent (required: session lifecycle)`
7
+
8
+ ## Summary of the change
9
+
10
+ `POST /sessions/refresh` returned 202 "Refresh scheduled" and only 500ms later called `SessionRefresh.refreshSession()`; target refusals (`not_telegram_bound`, `session_not_found`, `refresh_in_progress`, `rate_limited`, `slack_respawner_unwired`) reached only `console.warn`. A caller passing a display name ("Jev") instead of the tmux name ("echo-jev") was told the restart was scheduled when it was refused. The detect phase of `refreshSession()` is extracted verbatim into a private `resolveTarget()`; a new read-only `precheckRefusal(sessionName)` runs `resolveTarget()` plus the in-flight check plus a non-recording rate-limit check. The route calls it before the existing busy precheck and answers a refusal synchronously (409 with `{code, error}`; 429 for `rate_limited`). The `not_telegram_bound` and `session_not_found` messages gain a display-name hint naming the matching running session's `tmuxSession`. Files: `src/core/SessionRefresh.ts`, `src/server/routes.ts`, `tests/unit/SessionRefresh.test.ts`, `tests/unit/sessions-refresh-route.test.ts`.
11
+
12
+ ## Decision-point inventory
13
+
14
+ - `POST /sessions/refresh` admission — modify — target refusals are now answered pre-202 instead of post-202 in the log.
15
+ - `SessionRefresh.refreshSession` detect phase — pass-through — same checks, same order, same refusal codes (the not_telegram_bound / session_not_found messages gain the display-name hint, which also reaches the post-202 log line); moved into `resolveTarget()` and shared.
16
+ - `SessionRefresh.precheckRefusal` — add — read-only early answer; never kills, records, or respawns.
17
+
18
+ ---
19
+
20
+ ## 1. Over-block
21
+
22
+ The early check refuses only when `refreshSession()` itself would refuse with the same code at that moment, using the same lookups. A binding that is registered in the ≤500ms between the precheck and the scheduled call used to succeed and is now refused (the caller can retry immediately); this window is negligible and the caller now learns the result. No legitimate request that would have been refreshed is refused for any other reason. The work gate is not duplicated here (it has its own precheck), so `force:true` behaviour is unchanged.
23
+
24
+ ---
25
+
26
+ ## 2. Under-block
27
+
28
+ A refusal that arises only after the 202 (binding removed or the session exiting in the 500ms window, a work-gate verdict change, a respawner failure) is still reported only in the log — `refreshSession()` re-runs every check authoritatively, so this is a reporting gap, not a safety gap. The self-refresh case (the caller is the session being killed) still needs the 202-before-kill ordering and keeps it.
29
+
30
+ ---
31
+
32
+ ## 3. Level-of-abstraction fit
33
+
34
+ Correct layer: the orchestrator owns the lookup logic and exposes it once; the route only translates a refusal to an HTTP status. No lookup is re-implemented in the route (unlike `restart-all`, which inlines the Telegram lookup). The display-name hint lives in the orchestrator next to the state lookup it depends on.
35
+
36
+ ---
37
+
38
+ ## 4. Signal vs authority compliance
39
+
40
+ **Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
41
+
42
+ - [x] No — this change has no new block/allow surface.
43
+
44
+ The refusals are the orchestrator's existing deterministic refusals (binding existence, session existence, in-flight, rate cap) — structural invariants, not judgment. The change moves when the caller hears them; it grants no new authority and removes none. The display-name case is deliberately a hint, never a remap.
45
+
46
+ ---
47
+
48
+ ## 4b. Judgment-point check (Judgment Within Floors standard)
49
+
50
+ No new static heuristic at a competing-signals decision point. The checks are enumerable invariants (is there a binding, is there a running session with this tmux name, is a refresh in flight, is the fixed rate cap reached).
51
+
52
+ ---
53
+
54
+ ## 5. Interactions
55
+
56
+ - **Shadowing:** the new precheck runs before the busy precheck. For an unbound name the caller now gets 409 `not_telegram_bound` instead of a busy verdict — correct, since the refresh could not run anyway. Likewise a session that is both busy and out of rate budget now gets 429 `rate_limited` where it used to get 409 `session-busy`; both are correct refusals. The busy precheck and post-202 authoritative path are unchanged.
57
+ - **Double-fire:** none — the precheck performs no action.
58
+ - **Races:** `precheckRefusal` reads `inFlight` and the rate window without writing (the rate check's opportunistic prune of expired timestamps is idempotent and already happens on every refresh). Test proves repeated prechecks consume no budget.
59
+ - **Feedback loops:** the loop-guarded mcp-autorefresh hook POSTs this route fire-and-forget; a 409 is simply logged by curl, no retry loop. Internal callers (ContextWedgeSentinel, quota swap, restart-all) call `refreshSession()` directly and are unaffected.
60
+
61
+ ---
62
+
63
+ ## 6. External surfaces
64
+
65
+ - The HTTP response for a refused target changes from 202 to 409/429 with `{code, error}`. This is the intended fix; the documented usage already says to pass the tmux name. No in-repo caller depends on a 202 for a refused name (grep of src, scripts, templates).
66
+ - No persistent state, no external systems, no notices.
67
+ - Operator surface: no operator-facing actions added.
68
+
69
+ ---
70
+
71
+ ## 6b. Operator-surface quality (Operator-Surface Quality standard)
72
+
73
+ No operator surface — not applicable.
74
+
75
+ ---
76
+
77
+ ## 7. Multi-machine posture (Cross-Machine Coherence)
78
+
79
+ Machine-local by design: a refresh acts on a tmux session on the machine serving the request, and the orchestrator's in-flight set and rate window are already per-process. No notices, no durable state, no URLs.
80
+
81
+ ---
82
+
83
+ ## 8. Rollback cost
84
+
85
+ Pure code change — revert and ship a patch. No persistent state, no migration, no agent state repair. During a rollback window callers would again receive 202 for refused names (the prior behaviour).
86
+
87
+ ---
88
+
89
+ ## Conclusion
90
+
91
+ Small correctness fix: the route now tells callers the truth about target refusals it previously hid in the log. The detect phase was extracted without behaviour change (the existing SessionRefresh, Slack-arm, route, integration and e2e swap-continuity suites pass unchanged apart from the route mock gaining the new method). GET /sessions already exposes the binding as `platform`/`platformId`; the stored `topicId` field is left as-is rather than redefined. Second-pass reviewer concurred; clear to ship.
92
+
93
+ ---
94
+
95
+ ## Second-pass review (if required)
96
+
97
+ **Reviewer:** independent general-purpose reviewer subagent (read-only, same worktree)
98
+ **Independent read of the artifact: concur**
99
+
100
+ Concur: the extraction is behaviour-preserving, `precheckRefusal` is non-mutating (the rate-window prune only drops already-expired timestamps), the self-refresh 202 still precedes the kill, and the suites plus `tsc` pass. Two artifact corrections raised and applied: messages (not only codes) gain the display-name hint, and busy + rate-exhausted now answers 429 instead of 409 session-busy.
101
+
102
+ ---
103
+
104
+ ## Evidence pointers
105
+
106
+ - `npx vitest run tests/unit/SessionRefresh.test.ts tests/unit/sessions-refresh-route.test.ts tests/unit/sessionRefresh-slack.test.ts tests/integration/swap-continuity-antithrash-routes.test.ts tests/e2e/swap-continuity-antithrash-lifecycle.test.ts` → 5 files, 74 tests passed.
107
+ - `tsc --noEmit` clean.
108
+
109
+ ---
110
+
111
+ ## Class-Closure Declaration (display-only mirror)
112
+
113
+ No agent-authored-artifact defect — not applicable. (Route response-ordering bug in server source; not a prompt/hook/config/skill/standards defect, and not a self-triggered controller.)