instar 1.3.995 → 1.3.997
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/dist/core/instarChannels.d.ts.map +1 -1
- package/dist/core/instarChannels.js +6 -3
- package/dist/core/instarChannels.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +32 -3
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +46 -46
- package/upgrades/1.3.996.md +38 -0
- package/upgrades/1.3.997.md +61 -0
- package/upgrades/side-effects/patch-actions-strict.md +131 -0
- package/upgrades/side-effects/relay-scope-detail.md +119 -0
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-07-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-07-27T07:30:21.063Z",
|
|
5
|
+
"instarVersion": "1.3.997",
|
|
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": "
|
|
421
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
429
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
437
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
445
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
453
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
461
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
469
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
477
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
485
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
493
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
501
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
509
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
517
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
525
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
533
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
541
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
549
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
557
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
565
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
573
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
581
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
589
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
597
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
605
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
613
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
621
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
629
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
637
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
645
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
653
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
661
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
669
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
677
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
685
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
693
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
701
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
709
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
717
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
725
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
733
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
741
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
749
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
757
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
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": "
|
|
773
|
+
"contentHash": "675cd3e00c868dcd0262d7964ec0ee503afc0e7436a46eda9af4aa3e9e93b990",
|
|
774
774
|
"since": "2025-01-01"
|
|
775
775
|
},
|
|
776
776
|
"cli:init": {
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
`PATCH /evolution/actions/:id` now rejects unsupported request fields instead of acknowledging a write it will discard. The route accepts the documented update surface, `status` and `resolution`, validates those values before mutation, rejects bodies with no usable update, and passes only explicitly present supported fields into `updateAction`.
|
|
9
|
+
|
|
10
|
+
Before this change, a caller could send a field such as `title`, receive `{ "ok": true }`, and still have the stored action title remain unchanged. That made a failed correction look recorded.
|
|
11
|
+
|
|
12
|
+
## What to Tell Your User
|
|
13
|
+
|
|
14
|
+
The action update API is now honest about what it can change.
|
|
15
|
+
|
|
16
|
+
If an agent or script tries to change a field this route does not support, it now gets a clear error that names both what it sent and what is actually supported. That prevents the worst version of the bug: your agent being told the change was saved while it was quietly thrown away.
|
|
17
|
+
|
|
18
|
+
The normal path is unchanged — updating an action's status, its resolution, or both, still works exactly as before. Anything that needs to edit a title, description, priority, tags, due date, or source belongs on a route that genuinely supports those, rather than one that used to pretend it had.
|
|
19
|
+
|
|
20
|
+
## Summary of New Capabilities
|
|
21
|
+
|
|
22
|
+
No new endpoint or config key. The existing evolution action patch route gained strict request-body validation and now fails loudly when a caller asks it to update fields it does not own.
|
|
23
|
+
|
|
24
|
+
## Evidence
|
|
25
|
+
|
|
26
|
+
Added integration coverage in `tests/integration/evolution-actions-patch-route.test.ts` for:
|
|
27
|
+
|
|
28
|
+
- unsupported fields returning `400` while the stored record remains unchanged
|
|
29
|
+
- valid `status` plus `resolution` updates still persisting
|
|
30
|
+
- empty usable update bodies returning `400`
|
|
31
|
+
- missing action IDs still returning `404` after a valid update body
|
|
32
|
+
- invalid status values returning `400` before any write
|
|
33
|
+
|
|
34
|
+
Typecheck evidence: `npx tsc --noEmit`.
|
|
35
|
+
|
|
36
|
+
## Known Limits
|
|
37
|
+
|
|
38
|
+
This is a breaking change for callers that were sending extra fields and depending on a `200` response. The documented callers send only `status` and `resolution`, so the known supported path is unchanged. The broken callers are the ones whose extra fields were already being ignored.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
The `threadline-relay` row in the channel registry reported `relay reports ready and connected`
|
|
9
|
+
without naming the subject of that verdict. It reads `ctx.threadlineRelayClient` — the **server
|
|
10
|
+
process's** relay client. The MCP tool path runs in a different process holding its own client, so
|
|
11
|
+
`GET /channels` could report `working` while a send from the MCP path failed, and both readings were
|
|
12
|
+
true at the same time.
|
|
13
|
+
|
|
14
|
+
The verdicts are unchanged. Only the claims are scoped, following the `mutual-ssh` precedent already
|
|
15
|
+
in the same file. The working branch now reports the server-process client explicitly and states that
|
|
16
|
+
this is neither another process's client nor a guarantee that a given send will land; the broken
|
|
17
|
+
branch is scoped the same way. `cost` is updated because it is user-visible registry prose, while
|
|
18
|
+
`whenPreferred` is left alone because it describes channel preference rather than the runtime client
|
|
19
|
+
whose state was measured.
|
|
20
|
+
|
|
21
|
+
## What to Tell Your User
|
|
22
|
+
|
|
23
|
+
When your agent tells you a channel is working, it now tells you which part of itself it checked.
|
|
24
|
+
|
|
25
|
+
Your agent runs in more than one process, and they can hold different connection states at the same
|
|
26
|
+
time. Previously it could report that the agent-to-agent relay was connected while a message sent by
|
|
27
|
+
a different part of the agent quietly failed — and both statements were true, which is what made it
|
|
28
|
+
confusing. The report now names what it actually measured, so a green reading cannot be misread as a
|
|
29
|
+
promise about a path it never checked.
|
|
30
|
+
|
|
31
|
+
## Summary of New Capabilities
|
|
32
|
+
|
|
33
|
+
No new endpoint, command, or configuration. The threadline relay row in the channel registry now
|
|
34
|
+
names the process whose relay state it reports, in both its working and its broken form.
|
|
35
|
+
|
|
36
|
+
## Evidence
|
|
37
|
+
|
|
38
|
+
Restoring the original unscoped claim fails the new test for the right reason:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
× threadline-relay working detail scopes the verdict to the server-process relay client
|
|
42
|
+
→ expected 'relay reports ready and connected' to contain 'server process relay client'
|
|
43
|
+
Tests 1 failed | 7 passed (8)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Removing the `mutual-ssh` caveat likewise fails, confirming the precedent test still bites:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
× mutual-ssh reports construction WITHOUT claiming a completed round-trip
|
|
50
|
+
→ expected 'runtime constructed and listening' to contain 'not a completed round-trip'
|
|
51
|
+
Tests 1 failed | 7 passed (8)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Both restored byte-identical. Green: `Test Files 3 passed (3) · Tests 36 passed (36)` across
|
|
55
|
+
`channel-registry-claims`, `channel-registry` and `user-channel-liveness`; `tsc --noEmit` exit 0.
|
|
56
|
+
|
|
57
|
+
## Known limits
|
|
58
|
+
|
|
59
|
+
The row still reports a single measurement — the server process's relay client — and now says so.
|
|
60
|
+
It does not probe the MCP tool's client, so it cannot tell you that path's state; it only stops
|
|
61
|
+
implying it. Nor does a connected reading promise that any particular send will land.
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Side-Effects Review - PATCH actions strict body
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `patch-actions-strict`
|
|
4
|
+
**Date:** `2026-07-26`
|
|
5
|
+
**Author:** `Codex`
|
|
6
|
+
**Second-pass reviewer:** `not required`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
This change tightens `PATCH /evolution/actions/:id` in `src/server/routes.ts` so the route refuses request bodies containing fields outside the documented patch contract, currently `status` and `resolution`. It also rejects empty usable updates, validates the type and allowed values of supported fields before mutation, and passes `EvolutionManager.updateAction` only the fields actually present. The integration coverage in `tests/integration/evolution-actions-patch-route.test.ts` asserts both responses and stored records so the old "ok but discarded" behavior is caught.
|
|
11
|
+
|
|
12
|
+
## Decision-point inventory
|
|
13
|
+
|
|
14
|
+
- `PATCH /evolution/actions/:id` body validation in `src/server/routes.ts` - modify - deterministic API schema gate now rejects unsupported fields and empty usable updates before any store write.
|
|
15
|
+
- `PATCH /evolution/actions/:id` supported field validation in `src/server/routes.ts` - modify - `status` and `resolution` are type-checked before constructing the update object.
|
|
16
|
+
- `EvolutionManager.updateAction` call site in `src/server/routes.ts` - modify - receives only validated, explicitly present update keys instead of destructured possibly-undefined values.
|
|
17
|
+
- Standby-write reconciliation via `refuseInadmissibleWrite(req, res)` - pass-through - still runs after body validation and before mutation, preserving the existing admission order.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. Over-block
|
|
22
|
+
|
|
23
|
+
The intentional over-block is that callers sending any extra field now receive `400` where they previously received `200`. Concrete examples: `{ "title": "Corrected title" }`, `{ "description": "Retract the false claim" }`, and `{ "status": "completed", "title": "Corrected title" }` are now rejected because `title` and `description` are not supported by this patch route. A caller that used extra fields as harmless client metadata in the same JSON body also gets a `400`; that caller must stop sending those fields or use a separate supported surface. This is acceptable because the old behavior silently ignored those fields while claiming success.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 2. Under-block
|
|
28
|
+
|
|
29
|
+
This still does not add support for changing action title, description, priority, tags, due date, or source. It also does not validate semantic transitions such as whether moving from `cancelled` back to `completed` is appropriate. A request with a syntactically valid but poor resolution like `{ "resolution": "done" }` still passes because the route only enforces a non-empty string, not quality or evidence. A request with `{ "status": "completed" }` and no resolution still passes, matching the existing documented surface.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 3. Level-of-abstraction fit
|
|
34
|
+
|
|
35
|
+
This is at the route schema layer, which is the right layer for an enumerable API contract. The route knows which fields it supports and can reject any other key before the persistence layer sees the request. This should not be an LLM authority or a higher-level intent gate because there are no competing contextual signals to weigh; the question is simply whether the JSON body matches the route's declared write surface. It still uses the existing lower-level `EvolutionManager.updateAction` primitive for the actual mutation instead of reimplementing persistence.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 4. Signal vs authority compliance
|
|
40
|
+
|
|
41
|
+
**Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
|
|
42
|
+
|
|
43
|
+
**Does this change hold blocking authority with brittle logic?**
|
|
44
|
+
|
|
45
|
+
- [ ] No - this change produces a signal consumed by an existing smart gate.
|
|
46
|
+
- [ ] No - this change has no block/allow surface.
|
|
47
|
+
- [ ] Yes - but the logic is a smart gate with full conversational context (LLM-backed with recent history or equivalent).
|
|
48
|
+
- [ ] Warning: Yes, with brittle logic - STOP. Reshape the design. Brittle detectors must not own block authority. Either promote the logic to smart-gate level (with proper context) or demote it to a signal that feeds an existing smart gate.
|
|
49
|
+
|
|
50
|
+
None of the predefined checkboxes exactly names deterministic API schema validation. The change does hold reject authority, but not over a brittle inferred signal. The supported field set is a finite invariant owned by the route, so refusing non-contract keys is ordinary request validation rather than a competing-signals judgment point. No signal-vs-authority issue identified.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 4b. Judgment-point check (Judgment Within Floors standard)
|
|
55
|
+
|
|
56
|
+
**Does this change add a static heuristic at a competing-signals decision point? If yes: why is it not a judgment point within a floor?**
|
|
57
|
+
|
|
58
|
+
No new static heuristic at a competing-signals decision point. The body shape is enumerable: `status` and `resolution` are the only supported fields for this route. There is no live conflict between evidence, liveness, ownership, urgency, or operator intent that needs an arbiter.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 5. Interactions
|
|
63
|
+
|
|
64
|
+
**Shadowing:** The new schema validation runs before `refuseInadmissibleWrite`. It can shadow the standby-write reconciliation check for malformed requests, but only before any mutation and only for requests that the route should not admit. Valid requests still reach the existing reconciliation gate in the same relative position before `updateAction`.
|
|
65
|
+
|
|
66
|
+
**Double-fire:** No issue identified. The new route validation returns one HTTP response and performs no side effect. It cannot double-submit an action update or duplicate a reconciliation event.
|
|
67
|
+
|
|
68
|
+
**Races:** No issue identified. The change does not introduce shared state or asynchronous work. The same list-then-update pattern for the class-review completion side effect remains unchanged.
|
|
69
|
+
|
|
70
|
+
**Feedback loops:** No issue identified. The only new feedback is a synchronous `400` response naming unsupported fields, which helps callers correct their request rather than feeding another automatic retry loop.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 6. External surfaces
|
|
75
|
+
|
|
76
|
+
This changes the HTTP API response for malformed `PATCH /evolution/actions/:id` requests. Other agents or scripts on the same machine that send unsupported fields now see `400` instead of `200`. Other users of the install base get the stricter behavior after upgrade. There is no direct Telegram, Slack, GitHub, Cloudflare, or other external-service call. Persistent state changes are reduced: unsupported writes now leave state untouched and visibly fail, where they previously left state untouched while claiming success. No timing or runtime condition is introduced.
|
|
77
|
+
|
|
78
|
+
**Operator surface (Mobile-Complete Operator Actions):** No operator-facing action is added. The change touches an existing HTTP route, not a dashboard form or approval page, so no phone-completable operator surface is required.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 6b. Operator-surface quality (Operator-Surface Quality standard)
|
|
83
|
+
|
|
84
|
+
No operator surface - not applicable. This change does not touch dashboard markup, approval pages, grant/revoke forms, or secret-drop forms.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 7. Multi-machine posture (Cross-Machine Coherence)
|
|
89
|
+
|
|
90
|
+
**machine-local BY DESIGN** - the route validates a request body before mutating the local evolution store for the agent instance handling the request. The validation rule is code-level behavior that ships identically to every machine, but the action records themselves remain the existing local evolution state. The change emits no user-facing notices, so one-voice gating is not needed. It holds no new durable state, so there is nothing new to strand on topic transfer. It generates no URLs, so there is no cross-machine link survival concern.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 8. Rollback cost
|
|
95
|
+
|
|
96
|
+
**Hot-fix release:** Revert the route validation and test additions, then ship a patch release.
|
|
97
|
+
|
|
98
|
+
**Data migration:** No data migration. The change creates no new files in runtime state and changes no schema.
|
|
99
|
+
|
|
100
|
+
**Agent state repair:** No agent state repair is required. If a caller hit the new `400`, its prior ignored write still did not mutate state; the repair is to resend a supported patch or add a real route for the intended field.
|
|
101
|
+
|
|
102
|
+
**User visibility:** During rollback propagation, malformed callers would go back to receiving `200` for ignored fields, which is the original defect. Documented callers sending only `status` and `resolution` should not notice rollback either way.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Conclusion
|
|
107
|
+
|
|
108
|
+
The review identifies one intentional compatibility break: callers sending extra unsupported fields now fail loudly. That is the point of the change because the previous behavior created false evidence of a correction. The change is small, route-local, deterministic, and does not add new persistent state or external side effects. Clear to ship with the explicit release note that extra fields now receive `400`.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Second-pass review (if required)
|
|
113
|
+
|
|
114
|
+
**Reviewer:** `not required`
|
|
115
|
+
**Independent read of the artifact:** `concur`
|
|
116
|
+
|
|
117
|
+
Tier 1 does not require a second-pass reviewer for this route-local schema hardening.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Evidence pointers
|
|
122
|
+
|
|
123
|
+
- `docs/specs/patch-actions-strict.eli16.md`
|
|
124
|
+
- `tests/integration/evolution-actions-patch-route.test.ts`
|
|
125
|
+
- `npx tsc --noEmit`
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Class-Closure Declaration (display-only mirror)
|
|
130
|
+
|
|
131
|
+
No agent-authored-artifact defect - not applicable.
|