instar 1.3.1007 → 1.3.1009

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.1007",
3
+ "version": "1.3.1009",
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-07-27T17:44:44.950Z",
5
- "instarVersion": "1.3.1007",
4
+ "generatedAt": "2026-07-27T19:04:51.259Z",
5
+ "instarVersion": "1.3.1009",
6
6
  "entryCount": 202,
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
421
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
429
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
437
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
445
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
453
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
461
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
469
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
477
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
485
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
493
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
501
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
509
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
517
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
525
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
533
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
541
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
549
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
557
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
565
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
573
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
581
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
589
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
597
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
605
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
613
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
621
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
629
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
637
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
645
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
653
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
661
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
669
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
677
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
685
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
693
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
701
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
709
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
717
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
725
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
733
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
741
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
749
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
757
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
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": "6576dddf2ae6a47a18f00cd06d178f2080d3aabee319f5da1cccb12225091e8c",
773
+ "contentHash": "66fd80500954f3527022e010a54d7b73b1a0d3f5dfab6342f5581e683e558145",
774
774
  "since": "2025-01-01"
775
775
  },
776
776
  "cli:init": {
@@ -1530,7 +1530,7 @@
1530
1530
  "type": "subsystem",
1531
1531
  "domain": "server",
1532
1532
  "sourcePath": "src/server/AgentServer.ts",
1533
- "contentHash": "b9037bc4bf60a2fb1a9a949e00e2453cf93069a6a40825cbffbc5177f6309043",
1533
+ "contentHash": "a96f5e8942bb9a56eba284e59992f5f027a249cb7e600ae08db78a579764572e",
1534
1534
  "since": "2025-01-01"
1535
1535
  },
1536
1536
  "subsystem:session-manager": {
@@ -0,0 +1,39 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ The live mentor-onboarding delivery path now places a durable content-keyed retry brake in front of every outbound prompt.
9
+
10
+ - Identical unanswered content is limited to three attempts.
11
+ - The attempt is persisted before transport actuation.
12
+ - A transport refusal consumes the same bounded budget as an unacknowledged send.
13
+ - The fourth identical attempt is suppressed.
14
+ - A different agenda item receives an independent budget.
15
+ - Exhaustion emits one distinct delivery-degradation signal, protected by a restart-surviving latch.
16
+ - The retry ledger stores hashes rather than prompt text and refuses growth beyond 64 unresolved keys.
17
+
18
+ The mentor tick now awaits the delivery callback and records a specific `deliveryReason` when the delivery layer refuses or fails. It no longer marks an asynchronous send as delivered before the transport has answered.
19
+
20
+ ## What to Tell Your User
21
+
22
+ Mentor onboarding will no longer keep reposting the same unanswered question forever. It makes at most three attempts for identical content, remembers that limit across restarts, and reports one distinct delivery failure when the limit is reached. A genuinely new agenda item can still proceed.
23
+
24
+ The prior anti-ping-pong guard was correlation-scoped. Once an unanswered correlation aged past the reply timeout, the guard deleted it and the next tick could post the same generated question again. A bot-to-bot receive-path failure therefore produced about twenty-four visible copies over twelve hours.
25
+
26
+ ## Summary of New Capabilities
27
+
28
+ - Durable, normalized-content deduplication bounds identical unanswered mentor prompts at three attempts.
29
+ - Retry exhaustion and transport failures are visible as structured delivery outcomes with one restart-surviving escalation.
30
+ - New agenda content remains independently eligible while an exhausted item stays suppressed.
31
+ - Existing version-1 outstanding-prompt files load normally and upgrade on their next write.
32
+
33
+ ## Compatibility
34
+
35
+ Existing version-1 outstanding-prompt files continue to load. The next write upgrades the file to version 2. No config, route, migration job, tick cadence, agenda rule, or reply timeout changes.
36
+
37
+ ## Validation
38
+
39
+ Refusal-first unit tests failed on unmodified source, then passed with the implementation. Unit, integration, and end-to-end coverage pins the bounded attempts, novel-content independence, restart durability, one-shot escalation, production transport-failure behavior, and status visibility.
@@ -0,0 +1,71 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ Fixed a rollout-active feature that could never graduate because the evidence its own spec
9
+ nominates was unreadable.
10
+
11
+ `docs/specs/claim-verification-sentinel.md` is `status: approved`, `rollout-disposition: active`,
12
+ `rollout-evidence-type: endpoint`, with the graduation criterion
13
+ `classified-completion-claims >= 1`. On `main`, that criterion was unevaluable:
14
+
15
+ - `CompletionClaimVerifier` exists and **is** constructed (`AgentServer.ts:2572`), with
16
+ `monitoring.completionClaimVerification` configured at `dryRun: true`.
17
+ - `POST /completion-claim/observe` and `GET /completion-claim/audit` are live, and the audit
18
+ route was **actively recording** (records dated `2026-07-27T17:46Z`, verdicts such as
19
+ `uncorroborated-unknown`).
20
+ - `CompletionClaimVerifier.stats()` is implemented and was **called by no route**.
21
+ - `/completion-claim/stats` → 404, and the spec's `rollout-evidence-ref`
22
+ (`/completion-claim-verification/stats`) named a prefix that has never existed → 404.
23
+
24
+ So the feature observed, recorded, and sat in dry-run indefinitely with nothing able to read the
25
+ number that would let anyone graduate it — and no error, alarm, or degraded signal anywhere,
26
+ because a feature stuck in watch-only mode is indistinguishable from a feature being careful.
27
+
28
+ Adds `GET /completion-claim/stats` (read-only counters, 503 when the verifier is absent, matching
29
+ the sibling audit route) and corrects the spec's `rollout-evidence-ref` to the path that exists.
30
+
31
+ The response carries both `stats.classifiedTurns` and the spec's own metric name
32
+ `classified-completion-claims`, so a rollout check does not need to know the internal field name.
33
+
34
+ ## What to Tell Your User
35
+
36
+ Your agent has a safety check that watches its own outgoing messages and flags factual claims it
37
+ can't back up. It has been running in watch-only mode, which is correct — it was meant to prove
38
+ itself before being allowed to do anything.
39
+
40
+ It could never have finished proving itself. The plan said "switch it on once it has checked at
41
+ least one claim", and pointed at an address for reading that number. The address was never built.
42
+ The counting code existed and had been counting the whole time, with nothing able to read it.
43
+
44
+ So it would have stayed in watch-only mode forever — not failing, just unmeasurable, and looking
45
+ from the outside exactly like a feature being cautious.
46
+
47
+ Nothing about what the check *does* has changed. It still only watches. What changed is that its
48
+ progress can now be read, so a decision about switching it on can actually be made.
49
+
50
+ ## Summary of New Capabilities
51
+
52
+ - Completion-claim verifier counters are readable at `GET /completion-claim/stats`, so a
53
+ rollout-active feature that was structurally unable to graduate now has evaluable evidence.
54
+ - The spec's graduation metric is surfaced under its own name, so a rollout check does not depend
55
+ on internal field naming.
56
+ - A feature that has classified nothing reports `0` rather than omitting the metric, so "idle" and
57
+ "broken endpoint" are distinguishable.
58
+
59
+ ## Evidence
60
+
61
+ Tests run against **unmodified source first**:
62
+
63
+ | run | result |
64
+ |---|---|
65
+ | route reverted | **5 failed** |
66
+ | route applied | **5 passed** |
67
+ | `tsc --noEmit` | clean |
68
+
69
+ The retained case worth naming: when the feature has classified nothing, the metric must read `0`
70
+ and not be omitted. An absent number is indistinguishable from "the endpoint does not work" —
71
+ exactly the confusion that produced this defect.
@@ -0,0 +1,53 @@
1
+ # Bounded mentor-onboarding retries — Plain-English Overview
2
+
3
+ > The one-line version: an unanswered mentor prompt can now be sent at most three times, the limit survives a restart, and the system reports delivery trouble instead of posting the same question forever.
4
+
5
+ ## The problem
6
+
7
+ The mentor loop already avoided sending a second prompt while the first one was waiting for a reply. That protection had a hole: after twenty minutes, the old correlation was declared expired and removed. The next tick then treated the same words as a brand-new prompt.
8
+
9
+ That is how one permission question appeared about every thirty minutes for roughly twelve hours. Each individual send looked legal because the previous correlation had expired. Across the whole episode, however, there was no content-level limit, so the system could repeat its own action indefinitely.
10
+
11
+ The visible Telegram post also did not prove that the mentee could receive it. Telegram can display a message from one bot while withholding that bot-authored message from another bot's update stream. The old loop interpreted the missing reply as an unanswered coaching question and retried. It needed to recognize the repeated lack of confirmation as a delivery problem.
12
+
13
+ ## What changes
14
+
15
+ Before any live mentor send, the existing outstanding-prompt tracker now normalizes the message, combines it with the mentee identity, and hashes that pair into a content key. The tracker durably reserves the attempt before it calls the transport.
16
+
17
+ Each content key gets three attempts:
18
+
19
+ - Attempt one is allowed.
20
+ - Attempts two and three are allowed after the earlier correlation expires or the transport refuses it.
21
+ - A fourth attempt with the same unanswered content is refused.
22
+ - Different content gets a different key and remains eligible.
23
+
24
+ The state file is upgraded in place from version 1 to version 2. It keeps the existing outstanding correlations and adds a bounded retry ledger. Only hashes and timing/count metadata are stored; the prompt text is not copied into this state.
25
+
26
+ ## Why the ordering matters
27
+
28
+ The reservation is written before the send. If the retry ledger cannot be persisted, the transport is not called. This prevents a disk or state failure from silently removing the very brake that makes the self-action bounded.
29
+
30
+ A transport refusal still consumes an attempt. Otherwise an unreachable destination could be retried forever while the counter remained at zero. A confirmed correlated reply clears that content episode, because repeating the same words after an actual reply is a new conversation rather than an unanswered retry.
31
+
32
+ ## What the operator sees
33
+
34
+ The normal first attempts remain unchanged. When the content budget is exhausted, the mentor tick reports a distinct delivery reason instead of claiming success or folding the event into a generic unanswered-question state.
35
+
36
+ The first exhaustion also emits one degradation signal explaining that delivery could not be confirmed and that identical sends are now suppressed. A persisted `escalatedAt` latch prevents the escalation itself from becoming another flood, including across a restart.
37
+
38
+ ## Boundaries
39
+
40
+ This change does not alter Threadline identity resolution, Telegram's bot-to-bot behavior, the process-wide LLM circuit breaker, the mentor agenda, the reply timeout, the tick cadence, or budget limits. It does not add a route or configuration switch.
41
+
42
+ The retry ledger is capped at 64 unresolved content keys. Reaching that cap refuses new mentor sends rather than growing state without limit. Version-1 files remain readable and are rewritten as version 2 on the next state change.
43
+
44
+ ## Proof
45
+
46
+ The four requested refusal-first tests were added before implementation and failed against the original source because `reserveSend` did not exist. After implementation they prove:
47
+
48
+ - first content is allowed;
49
+ - identical unanswered content is refused after three attempts;
50
+ - a different agenda item remains allowed;
51
+ - the breaker and its one-shot escalation survive a reconstructed tracker using the same state file.
52
+
53
+ Additional coverage proves whitespace-normalized dedupe, raw prompt text exclusion, the 64-key state bound, asynchronous delivery outcome handling, HTTP status propagation, and the real production delivery closure over three transport failures plus a fourth-send refusal.