instar 1.2.80 → 1.2.81

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-05-25T21:59:37.920Z",
5
- "instarVersion": "1.2.80",
4
+ "generatedAt": "2026-05-26T01:28:49.478Z",
5
+ "instarVersion": "1.2.81",
6
6
  "entryCount": 191,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -392,7 +392,7 @@
392
392
  "type": "route-group",
393
393
  "domain": "monitoring",
394
394
  "sourcePath": "src/server/routes.ts",
395
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
395
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
396
396
  "since": "2025-01-01"
397
397
  },
398
398
  "route-group:agents": {
@@ -400,7 +400,7 @@
400
400
  "type": "route-group",
401
401
  "domain": "sessions",
402
402
  "sourcePath": "src/server/routes.ts",
403
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
403
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
404
404
  "since": "2025-01-01"
405
405
  },
406
406
  "route-group:backups": {
@@ -408,7 +408,7 @@
408
408
  "type": "route-group",
409
409
  "domain": "operations",
410
410
  "sourcePath": "src/server/routes.ts",
411
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
411
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
412
412
  "since": "2025-01-01"
413
413
  },
414
414
  "route-group:git": {
@@ -416,7 +416,7 @@
416
416
  "type": "route-group",
417
417
  "domain": "coordination",
418
418
  "sourcePath": "src/server/routes.ts",
419
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
419
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
420
420
  "since": "2025-01-01"
421
421
  },
422
422
  "route-group:memory": {
@@ -424,7 +424,7 @@
424
424
  "type": "route-group",
425
425
  "domain": "memory",
426
426
  "sourcePath": "src/server/routes.ts",
427
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
427
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
428
428
  "since": "2025-01-01"
429
429
  },
430
430
  "route-group:semantic": {
@@ -432,7 +432,7 @@
432
432
  "type": "route-group",
433
433
  "domain": "memory",
434
434
  "sourcePath": "src/server/routes.ts",
435
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
435
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
436
436
  "since": "2025-01-01"
437
437
  },
438
438
  "route-group:status": {
@@ -440,7 +440,7 @@
440
440
  "type": "route-group",
441
441
  "domain": "monitoring",
442
442
  "sourcePath": "src/server/routes.ts",
443
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
443
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
444
444
  "since": "2025-01-01"
445
445
  },
446
446
  "route-group:capabilities": {
@@ -448,7 +448,7 @@
448
448
  "type": "route-group",
449
449
  "domain": "mapping",
450
450
  "sourcePath": "src/server/routes.ts",
451
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
451
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
452
452
  "since": "2025-01-01"
453
453
  },
454
454
  "route-group:project-map": {
@@ -456,7 +456,7 @@
456
456
  "type": "route-group",
457
457
  "domain": "mapping",
458
458
  "sourcePath": "src/server/routes.ts",
459
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
459
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
460
460
  "since": "2025-01-01"
461
461
  },
462
462
  "route-group:coherence": {
@@ -464,7 +464,7 @@
464
464
  "type": "route-group",
465
465
  "domain": "coherence",
466
466
  "sourcePath": "src/server/routes.ts",
467
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
467
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
468
468
  "since": "2025-01-01"
469
469
  },
470
470
  "route-group:topic-bindings": {
@@ -472,7 +472,7 @@
472
472
  "type": "route-group",
473
473
  "domain": "sessions",
474
474
  "sourcePath": "src/server/routes.ts",
475
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
475
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
476
476
  "since": "2025-01-01"
477
477
  },
478
478
  "route-group:context": {
@@ -480,7 +480,7 @@
480
480
  "type": "route-group",
481
481
  "domain": "context",
482
482
  "sourcePath": "src/server/routes.ts",
483
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
483
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
484
484
  "since": "2025-01-01"
485
485
  },
486
486
  "route-group:scope-coherence": {
@@ -488,7 +488,7 @@
488
488
  "type": "route-group",
489
489
  "domain": "coherence",
490
490
  "sourcePath": "src/server/routes.ts",
491
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
491
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
492
492
  "since": "2025-01-01"
493
493
  },
494
494
  "route-group:canonical-state": {
@@ -496,7 +496,7 @@
496
496
  "type": "route-group",
497
497
  "domain": "state",
498
498
  "sourcePath": "src/server/routes.ts",
499
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
499
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
500
500
  "since": "2025-01-01"
501
501
  },
502
502
  "route-group:ci": {
@@ -504,7 +504,7 @@
504
504
  "type": "route-group",
505
505
  "domain": "monitoring",
506
506
  "sourcePath": "src/server/routes.ts",
507
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
507
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
508
508
  "since": "2025-01-01"
509
509
  },
510
510
  "route-group:sessions": {
@@ -512,7 +512,7 @@
512
512
  "type": "route-group",
513
513
  "domain": "sessions",
514
514
  "sourcePath": "src/server/routes.ts",
515
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
515
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
516
516
  "since": "2025-01-01"
517
517
  },
518
518
  "route-group:jobs": {
@@ -520,7 +520,7 @@
520
520
  "type": "route-group",
521
521
  "domain": "scheduling",
522
522
  "sourcePath": "src/server/routes.ts",
523
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
523
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
524
524
  "since": "2025-01-01"
525
525
  },
526
526
  "route-group:skip-ledger": {
@@ -528,7 +528,7 @@
528
528
  "type": "route-group",
529
529
  "domain": "scheduling",
530
530
  "sourcePath": "src/server/routes.ts",
531
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
531
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
532
532
  "since": "2025-01-01"
533
533
  },
534
534
  "route-group:telegram": {
@@ -536,7 +536,7 @@
536
536
  "type": "route-group",
537
537
  "domain": "communication",
538
538
  "sourcePath": "src/server/routes.ts",
539
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
539
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
540
540
  "since": "2025-01-01"
541
541
  },
542
542
  "route-group:attention": {
@@ -544,7 +544,7 @@
544
544
  "type": "route-group",
545
545
  "domain": "communication",
546
546
  "sourcePath": "src/server/routes.ts",
547
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
547
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
548
548
  "since": "2025-01-01"
549
549
  },
550
550
  "route-group:relationships": {
@@ -552,7 +552,7 @@
552
552
  "type": "route-group",
553
553
  "domain": "relationships",
554
554
  "sourcePath": "src/server/routes.ts",
555
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
555
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
556
556
  "since": "2025-01-01"
557
557
  },
558
558
  "route-group:feedback": {
@@ -560,7 +560,7 @@
560
560
  "type": "route-group",
561
561
  "domain": "feedback",
562
562
  "sourcePath": "src/server/routes.ts",
563
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
563
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
564
564
  "since": "2025-01-01"
565
565
  },
566
566
  "route-group:updates": {
@@ -568,7 +568,7 @@
568
568
  "type": "route-group",
569
569
  "domain": "updates",
570
570
  "sourcePath": "src/server/routes.ts",
571
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
571
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
572
572
  "since": "2025-01-01"
573
573
  },
574
574
  "route-group:dispatches": {
@@ -576,7 +576,7 @@
576
576
  "type": "route-group",
577
577
  "domain": "dispatches",
578
578
  "sourcePath": "src/server/routes.ts",
579
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
579
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
580
580
  "since": "2025-01-01"
581
581
  },
582
582
  "route-group:quota": {
@@ -584,7 +584,7 @@
584
584
  "type": "route-group",
585
585
  "domain": "monitoring",
586
586
  "sourcePath": "src/server/routes.ts",
587
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
587
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
588
588
  "since": "2025-01-01"
589
589
  },
590
590
  "route-group:publishing": {
@@ -592,7 +592,7 @@
592
592
  "type": "route-group",
593
593
  "domain": "publishing",
594
594
  "sourcePath": "src/server/routes.ts",
595
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
595
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
596
596
  "since": "2025-01-01"
597
597
  },
598
598
  "route-group:private-views": {
@@ -600,7 +600,7 @@
600
600
  "type": "route-group",
601
601
  "domain": "publishing",
602
602
  "sourcePath": "src/server/routes.ts",
603
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
603
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
604
604
  "since": "2025-01-01"
605
605
  },
606
606
  "route-group:tunnel": {
@@ -608,7 +608,7 @@
608
608
  "type": "route-group",
609
609
  "domain": "networking",
610
610
  "sourcePath": "src/server/routes.ts",
611
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
611
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
612
612
  "since": "2025-01-01"
613
613
  },
614
614
  "route-group:events": {
@@ -616,7 +616,7 @@
616
616
  "type": "route-group",
617
617
  "domain": "networking",
618
618
  "sourcePath": "src/server/routes.ts",
619
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
619
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
620
620
  "since": "2025-01-01"
621
621
  },
622
622
  "route-group:evolution": {
@@ -624,7 +624,7 @@
624
624
  "type": "route-group",
625
625
  "domain": "evolution",
626
626
  "sourcePath": "src/server/routes.ts",
627
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
627
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
628
628
  "since": "2025-01-01"
629
629
  },
630
630
  "route-group:watchdog": {
@@ -632,7 +632,7 @@
632
632
  "type": "route-group",
633
633
  "domain": "monitoring",
634
634
  "sourcePath": "src/server/routes.ts",
635
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
635
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
636
636
  "since": "2025-01-01"
637
637
  },
638
638
  "route-group:topic-memory": {
@@ -640,7 +640,7 @@
640
640
  "type": "route-group",
641
641
  "domain": "memory",
642
642
  "sourcePath": "src/server/routes.ts",
643
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
643
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
644
644
  "since": "2025-01-01"
645
645
  },
646
646
  "route-group:state-sync": {
@@ -648,7 +648,7 @@
648
648
  "type": "route-group",
649
649
  "domain": "coordination",
650
650
  "sourcePath": "src/server/routes.ts",
651
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
651
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
652
652
  "since": "2025-01-01"
653
653
  },
654
654
  "route-group:intent": {
@@ -656,7 +656,7 @@
656
656
  "type": "route-group",
657
657
  "domain": "intent",
658
658
  "sourcePath": "src/server/routes.ts",
659
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
659
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
660
660
  "since": "2025-01-01"
661
661
  },
662
662
  "route-group:triage": {
@@ -664,7 +664,7 @@
664
664
  "type": "route-group",
665
665
  "domain": "safety",
666
666
  "sourcePath": "src/server/routes.ts",
667
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
667
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
668
668
  "since": "2025-01-01"
669
669
  },
670
670
  "route-group:operations": {
@@ -672,7 +672,7 @@
672
672
  "type": "route-group",
673
673
  "domain": "safety",
674
674
  "sourcePath": "src/server/routes.ts",
675
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
675
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
676
676
  "since": "2025-01-01"
677
677
  },
678
678
  "route-group:sentinel": {
@@ -680,7 +680,7 @@
680
680
  "type": "route-group",
681
681
  "domain": "safety",
682
682
  "sourcePath": "src/server/routes.ts",
683
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
683
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
684
684
  "since": "2025-01-01"
685
685
  },
686
686
  "route-group:trust": {
@@ -688,7 +688,7 @@
688
688
  "type": "route-group",
689
689
  "domain": "safety",
690
690
  "sourcePath": "src/server/routes.ts",
691
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
691
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
692
692
  "since": "2025-01-01"
693
693
  },
694
694
  "route-group:monitoring": {
@@ -696,7 +696,7 @@
696
696
  "type": "route-group",
697
697
  "domain": "monitoring",
698
698
  "sourcePath": "src/server/routes.ts",
699
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
699
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
700
700
  "since": "2025-01-01"
701
701
  },
702
702
  "route-group:commitments": {
@@ -704,7 +704,7 @@
704
704
  "type": "route-group",
705
705
  "domain": "commitments",
706
706
  "sourcePath": "src/server/routes.ts",
707
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
707
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
708
708
  "since": "2025-01-01"
709
709
  },
710
710
  "route-group:episodes": {
@@ -712,7 +712,7 @@
712
712
  "type": "route-group",
713
713
  "domain": "memory",
714
714
  "sourcePath": "src/server/routes.ts",
715
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
715
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
716
716
  "since": "2025-01-01"
717
717
  },
718
718
  "route-group:messages": {
@@ -720,7 +720,7 @@
720
720
  "type": "route-group",
721
721
  "domain": "coordination",
722
722
  "sourcePath": "src/server/routes.ts",
723
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
723
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
724
724
  "since": "2025-01-01"
725
725
  },
726
726
  "route-group:system-reviews": {
@@ -728,7 +728,7 @@
728
728
  "type": "route-group",
729
729
  "domain": "monitoring",
730
730
  "sourcePath": "src/server/routes.ts",
731
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
731
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
732
732
  "since": "2025-01-01"
733
733
  },
734
734
  "route-group:machine-mesh": {
@@ -744,7 +744,7 @@
744
744
  "type": "route-group",
745
745
  "domain": "security",
746
746
  "sourcePath": "src/server/routes.ts",
747
- "contentHash": "7ac85b7a93c149b17daa4e7ef7a6396e85ecab9f9560eb79b083284013907d5a",
747
+ "contentHash": "14df7a55267370b38a717411ec2dd50be2364f68e4e6e4c6ca031b9ce5f2ca40",
748
748
  "since": "2025-01-01"
749
749
  },
750
750
  "cli:init": {
@@ -1448,7 +1448,7 @@
1448
1448
  "type": "subsystem",
1449
1449
  "domain": "sessions",
1450
1450
  "sourcePath": "src/core/SessionManager.ts",
1451
- "contentHash": "0790ca703a6823e20c6df49d1d570ec7b3d5f5aff0d16c1bbfa01df476d14451",
1451
+ "contentHash": "b0de35800c7eacf06e520b7224d3169b81e8f0293ce65b69047fae3be1befad4",
1452
1452
  "since": "2025-01-01"
1453
1453
  },
1454
1454
  "subsystem:auto-updater": {
@@ -0,0 +1,27 @@
1
+ # Unreleased
2
+
3
+ ## What Changed
4
+
5
+ Fixed Threadline topic-bound reply surfacing (CMT-515): a reply from another agent on a thread bound to a Telegram topic now reliably reaches that topic instead of silently vanishing into the store.
6
+
7
+ - **Lost replies + broken history (one root cause):** `ThreadResumeMap.get()` no longer nulls topic-linkage entries via the Claude-JSONL existence guard — a topic-linkage thread's liveness is its topic, not a transcript file. This repairs both inbound routing (replies were falling through to a throwaway session spawn) and `threadline_history` (which returned "not found" for threads that existed).
8
+ - **Relay-path leak:** topic-bound replies arriving over the cross-machine relay are no longer swallowed by the warm-listener side-channel; they now reach the topic-linkage router (the local same-machine path was already covered, which is why a co-located test missed this).
9
+ - **Unreliable hand-off:** injecting a reply into a live session is now *confirmed* — a stalled paste no longer counts as delivered. When the hand-off stalls, a deterministic Telegram notification surfaces the reply as a safety net; when it succeeds, no duplicate notification is posted. A commitment resolves only on a confirmed user-facing surface (a confirmed live hand-off OR an actual notification).
10
+ - **History completeness + peer attribution:** both legs of a local conversation are now persisted to the thread aggregate (history showed only the other agent's half), and the sender's originating topic is stamped on the delivered envelope so the peer can attribute replies to its own topic.
11
+
12
+ ## What to Tell Your User
13
+
14
+ If you reach out to another agent in the background while you're chatting, that agent's reply now shows up in our conversation reliably — before, it could land in my records but never make it back to you. You'll get a short "replied" note in the topic if I can't weave it in live, and you won't get double-pinged when I can. No action needed; this just makes background agent collaboration trustworthy.
15
+
16
+ ## Summary of New Capabilities
17
+
18
+ - Topic-bound Threadline replies surface to their originating Telegram topic on both the local and cross-machine relay paths.
19
+ - Live-session hand-off is consumption-confirmed, with a guaranteed Telegram fallback when it stalls and no double-post when it succeeds.
20
+ - `threadline_history` / `getThread` resolve live topic-bound threads and return both legs of the conversation.
21
+ - Inter-agent envelopes carry the sender's originating topic id for peer-side attribution.
22
+
23
+ ## Evidence
24
+
25
+ - Root causes verified against v1.2.80 source (including an in-code comment that already documented the `get()` JSONL-guard hazard on the send path but never fixed the inbound path).
26
+ - 3-tier tests: new unit coverage for the `get()` topic-linkage exemption, confirmed-vs-stalled inject (no-double-surface / safety-net-fallback), and both-legs thread persistence; full threadline suite green (1539 unit/integration + 329 e2e, zero regressions).
27
+ - Independent second-pass review concurred on the actual diff (no over/under-block, no inject double-recovery race, return-type change breaks no caller).
@@ -0,0 +1,68 @@
1
+ # Side-Effects Review — Threadline topic-bound reply surfacing fix
2
+
3
+ **Version / slug:** `threadline-reply-surfacing`
4
+ **Date:** 2026-05-25
5
+ **Author:** Echo
6
+ **Second-pass reviewer:** (pending — required; this touches messaging surfacing decisions, session inject lifecycle, and "gate"/"guard" surfaces)
7
+
8
+ ## Summary of the change
9
+
10
+ Makes a co-located/relayed agent's reply on a topic-bound Threadline thread reliably surface to the bound Telegram topic, instead of vanishing into the store. Files: `src/threadline/ThreadResumeMap.ts` (get() guard), `src/commands/server.ts` (warm-listener relay guard + injectIntoSession now confirms consumption), `src/core/SessionManager.ts` (new `injectPasteNotificationConfirmed`), `src/threadline/TopicLinkageHandler.ts` (surface only when the live hand-off didn't confirm + first-reply carve-out), `src/messaging/MessageRouter.ts` (thread-aggregate maintenance for both legs + `recordLocalOutbound`), `src/server/routes.ts` (stamp `transport.originTopicId`, persist outbound leg). Decision points touched: the inbound spawn-vs-route branch, the warm-listener routing branch, the Telegram-surface gate inside `tryRouteReplyToTopic`, and the commitment-resolution gate.
11
+
12
+ ## Decision-point inventory
13
+
14
+ - `ThreadResumeMap.get()` JSONL-existence guard — **modify** — exempts topic-linkage entries (originTopicId set) from the guard so they aren't falsely nulled.
15
+ - `server.ts` relay `gate-passed` warm-listener branch — **modify** — adds a `!isTopicBoundReply` condition so topic-bound replies reach the router.
16
+ - `TopicLinkageHandler.tryRouteReplyToTopic` live-inject vs surface — **modify** — `deliveryMode='live-inject'` now requires confirmed consumption; `shouldSurface` excludes confirmed live-inject; first-reply bypasses rate limit.
17
+ - commitment-resolution (`surfacedToUser`) — **pass-through** (logic unchanged, but now correct because `live-inject` means confirmed).
18
+ - thread-aggregate write (`MessageRouter.relay` / new `recordLocalOutbound`) — **add** — maintains `threads/{id}.json` for both legs.
19
+
20
+ ---
21
+
22
+ ## 1. Over-block
23
+
24
+ **What legitimate inputs does this reject that it shouldn't?**
25
+
26
+ The surfacing gate now fires a Telegram note whenever a topic-bound reply's live-inject is NOT confirmed (failure-visible/resume-pending). It could *over-surface* (post a note the user didn't strictly need) for a low-salience reply that happened to land while the session was busy — but salience still suppresses pure-acks for the non-failure path, and the per-thread (60s) / per-topic (3/60s) rate limits cap volume. It does NOT reject/drop any legitimate input. The `ThreadResumeMap.get()` change only *widens* what `get()` returns (fewer false nulls) — it cannot newly reject anything.
27
+
28
+ ## 2. Under-block
29
+
30
+ **What failure modes does this still miss?**
31
+
32
+ - If `sendTelegramToTopic` is null (no Telegram configured) AND the live-inject stalls, the reply is not surfaced and the commitment stays open (by design — never falsely resolved; PromiseBeacon + 7-day TTL are the backstop). Documented; covered by a unit test.
33
+ - A reply whose live-inject is *confirmed* but whose agent then fails to relay conversationally (agent-level failure, not inject-level) would not get a deterministic note. This is out of the inject layer's visibility; the commitment-resolution-on-confirmed-inject preserves existing behavior here.
34
+ - Cross-machine replies that take neither the warm-listener nor pipe branch and have no resume entry still cold-spawn — unchanged, and correct (no topic binding to honor).
35
+
36
+ ## 3. Level-of-abstraction fit
37
+
38
+ `ThreadResumeMap.get()` is a low-level data-access guard; exempting topic-linkage entries is correct at that layer because the entry itself carries the topic-vs-JSONL distinction (`originTopicId`). The surfacing decision stays in `TopicLinkageHandler` (the existing authority for topic-linkage replies) — no new parallel authority is introduced. The inject-confirmation is a capability added to `SessionManager` (the owner of tmux injection), consumed by the handler via the existing `injectIntoSession` dep — the handler does not re-implement tmux probing. Correct layering throughout.
39
+
40
+ ## 4. Signal vs authority compliance
41
+
42
+ The change adds NO brittle check with blocking authority. The inject-confirmation is a *signal* (did the paste submit?) consumed by the existing `TopicLinkageHandler` authority. The warm-listener guard is a routing predicate (signal) that defers the decision to the existing `handleInboundMessage`/`tryRouteReplyToTopic` authority. The `get()` change removes a false-negative from a data guard. Per `docs/signal-vs-authority.md`: detectors feed authorities; no detector gained blocking power.
43
+
44
+ ## 5. Interactions
45
+
46
+ - **CollaborationSurfacer overlap:** topic-bound replies route via TopicLinkageHandler; parentless via CollaborationSurfacer. Mutual exclusivity preserved (the topic-bound predicate gates which path runs). Covered by an integration test.
47
+ - **Double-surface:** eliminated — the deterministic surface is suppressed when live-inject is confirmed (the agent relays instead).
48
+ - **verifyInjection double-recovery:** `injectPasteNotificationConfirmed` *observes* the recovery window; it does not fire its own Enter-resends, so it does not race with `injectMessage`'s internal `verifyInjection`.
49
+ - **Other `get()` callers** (pipe-spawn guard, tryInjectIntoLiveSession, onSessionEnd/Resolved/Failed, MCP history): enumerated in the spec §3; the pipe-spawn guard now correctly excludes topic-bound (desired); others operate benignly on the returned entry.
50
+ - **Thread-aggregate writes** added to `relay()`: non-fatal try/catch; idempotent (store.save dedups). No double-fire — `updateThread` is idempotent on message id.
51
+
52
+ ## 6. External surfaces
53
+
54
+ - New optional `transport.originTopicId` on the local-delivery envelope — additive; older peers ignore it; it is an opaque per-chat integer (Telegram `message_thread_id`), inert without bot token+chat id. The peer maps it via its own table and must never echo it back as a routing target (the existing F1 anti-poisoning guard on the send path still holds).
55
+ - More Telegram notifications may appear in topics where replies previously vanished — this is the intended user-visible behavior (rate-limited).
56
+ - Inject confirmation adds up to ~7.5s latency to the live-inject path of a *stalled* inbound reply handler (returns ~1s on a healthy submit). Not user-blocking (background reply surfacing).
57
+
58
+ ## 7. Rollback cost
59
+
60
+ Localized to six files; revert is a clean `git revert` of the implementation commit. No data migration (thread-aggregate writes are additive + idempotent; existing reads tolerate missing aggregates). No agent-state repair. `transport.originTopicId` is optional, so a rollback leaves no dangling dependency. Pure `src/` change → existing agents pick up the revert via the normal update path; no PostUpdateMigrator entry involved.
61
+
62
+ ---
63
+
64
+ ## Second-pass review
65
+
66
+ **Concur with the review** (independent reviewer, 2026-05-25). Audited the full diff against the artifact: diff matches §1–7; the `injectPasteNotification` void→string change breaks no caller (4 callers discard the return); `injectPasteNotificationConfirmed` only reads (no `fireStuckInputRecovery`) so it observes rather than races `verifyInjection`; `relay()`'s `exists()` early-return precedes `updateThread` so no inbound double-count; the awaited inject (≤7.5s) runs only on the background reply-surface path when a session is alive AND the inject stalls (healthy submit returns ~1s), gates no transport, holds no lock; the `originTopicId === undefined` guard exemption is safe (it derives solely from `boundTopicId`, so non-topic resume entries still null correctly).
67
+
68
+ Reviewer's one non-blocking note — `updateThread` is not internally idempotent, so the artifact's "recordLocalOutbound idempotent (store.save dedups)" overstated where idempotency comes from — has been **addressed in code**: `recordLocalOutbound` now gates `updateThread` on a first-sight `store.exists()` check, making it truly idempotent regardless of caller behavior.