instar 1.2.5 → 1.2.7
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/SafeFsExecutor.d.ts.map +1 -1
- package/dist/core/SafeFsExecutor.js +35 -0
- package/dist/core/SafeFsExecutor.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts +68 -0
- package/dist/server/CapabilityIndex.d.ts.map +1 -0
- package/dist/server/CapabilityIndex.js +711 -0
- package/dist/server/CapabilityIndex.js.map +1 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +11 -400
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +46 -46
- package/upgrades/1.2.6.md +42 -0
- package/upgrades/1.2.7.md +82 -0
- package/upgrades/side-effects/capabilities-introspection.md +119 -0
- package/upgrades/side-effects/safe-fs-agent-state-carveout.md +98 -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-05-
|
|
5
|
-
"instarVersion": "1.2.
|
|
4
|
+
"generatedAt": "2026-05-21T17:33:33.304Z",
|
|
5
|
+
"instarVersion": "1.2.7",
|
|
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": "
|
|
395
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
403
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
411
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
419
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
427
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
435
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
443
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
451
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
459
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
467
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
475
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
483
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
491
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
499
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
507
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
515
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
523
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
531
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
539
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
547
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
555
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
563
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
571
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
579
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
587
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
595
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
603
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
611
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
619
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
627
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
635
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
643
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
651
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
659
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
667
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
675
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
683
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
691
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
699
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
707
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
715
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
723
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
731
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
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": "
|
|
747
|
+
"contentHash": "909be5f4c0f174f688356cc66c804b363e61b118a7a4e754a3d5bc1474c8839b",
|
|
748
748
|
"since": "2025-01-01"
|
|
749
749
|
},
|
|
750
750
|
"cli:init": {
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- bump: minor -->
|
|
4
|
+
<!-- minor = internal refactor with new test surface, no behavioral change -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
**refactor(capabilities): /capabilities and its lint now share one source of truth — src/server/CapabilityIndex.ts.**
|
|
9
|
+
|
|
10
|
+
PR #290 surfaced the discoverability gap that started the 2026-05-21 case study. PR #292 closed the workaround-reflex side by retiring the unsafe Secret Drop retrieval pattern. This release closes the last loose end: the /capabilities handler used to be a 440-line hand-curated object literal in routes.ts, and the discoverability lint kept a parallel hand-written INTERNAL_ALLOWLIST. Two surfaces had to stay in sync; nothing structurally enforced the sync.
|
|
11
|
+
|
|
12
|
+
After this release:
|
|
13
|
+
|
|
14
|
+
- A new module, src/server/CapabilityIndex.ts, holds the full registry — one entry per capability with a typed build function plus an INTERNAL_PREFIXES allowlist for operator-only routes.
|
|
15
|
+
- The /capabilities handler in routes.ts shrinks from ~440 lines of inline logic to ~25 lines that iterate the index.
|
|
16
|
+
- The discoverability lint in tests/unit/capabilities-discoverability.test.ts imports CAPABILITY_INDEX and INTERNAL_PREFIXES directly instead of duplicating policy in test code.
|
|
17
|
+
- A new CapabilityIndex unit-test file pins module-level invariants: every entry key is unique, every prefix is unique across the registry, INTERNAL_PREFIXES has a reason on every entry, and the secrets entry continues to surface the hardened-retrieval hint.
|
|
18
|
+
|
|
19
|
+
The response shape is unchanged. Every key that appeared in /capabilities before still appears with the same nested fields. Existing consumers (agents, dashboard, integration tests) see identical output.
|
|
20
|
+
|
|
21
|
+
## What to Tell Your User
|
|
22
|
+
|
|
23
|
+
No user-visible behavior change. Adding a new top-level route prefix to instar now requires a single deliberate classification in CapabilityIndex.ts — either claim it under a CAPABILITY_INDEX entry (surfaces it to agents) or add it to INTERNAL_PREFIXES with a one-line reason (skips discovery). The lint refuses unclassified prefixes at CI time, so the next primitive cannot slip through silently.
|
|
24
|
+
|
|
25
|
+
## Summary of New Capabilities
|
|
26
|
+
|
|
27
|
+
For the agent: nothing new at runtime. The /capabilities response carries the same data; the way it is produced is now a single iteration over a typed array.
|
|
28
|
+
|
|
29
|
+
For contributors: a new file to maintain, but only when adding or renaming top-level route prefixes. The compiler enforces shape; the lint enforces classification.
|
|
30
|
+
|
|
31
|
+
## Evidence
|
|
32
|
+
|
|
33
|
+
Behavioral parity verified:
|
|
34
|
+
- The 76-case integration suite that touches /capabilities (tests/integration/view-tunnel-routes.test.ts, tests/integration/publishing-routes.test.ts, tests/integration/external-operation-safety-routes.test.ts, tests/integration/imessage-routes.test.ts) passes unchanged.
|
|
35
|
+
- The discoverability lint shrunk from 81 cases (with a hand-written allowlist) to 84 cases that read from the source-of-truth module. All green.
|
|
36
|
+
- New CapabilityIndex.test.ts pins 9 invariants on the registry itself. All green.
|
|
37
|
+
|
|
38
|
+
Spec: docs/specs/capabilities-introspection.md
|
|
39
|
+
ELI16: docs/specs/capabilities-introspection.eli16.md
|
|
40
|
+
Side-effects: upgrades/side-effects/capabilities-introspection.md
|
|
41
|
+
|
|
42
|
+
Origin: 2026-05-21 case-study audit (topic 11141, follow-up #2 of two).
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- bump: patch -->
|
|
4
|
+
<!-- patch = bug fixes, refactors, test additions, doc updates -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
**fix(safe-fs): runtime artifacts under `<root>/.instar/` get a carve-out from the source-tree guard.**
|
|
9
|
+
|
|
10
|
+
Closes the "agent goes dark on cold start" failure mode that surfaced after v1.2.4 in the field (Echo, 2026-05-21): every fresh launchd spawn hit `EADDRINUSE` on the stale unix socket at `.instar/listener.sock`, the `WakeSocketServer` stale-socket-recovery path correctly tried to unlink it, but `SafeFsExecutor` routed the unlink through `assertNotInstarSourceTree` and the guard fired because the agent's deployed directory IS a checkout of the instar source (same `.git`, same `.instar-source-tree` marker, same `package.json` with `name: "instar"`). The supervisor then escalated to its bind-failure recovery path and force-rebuilt better-sqlite3 on every cycle, which in turn produced an incompatible binary and the server never bound.
|
|
11
|
+
|
|
12
|
+
The fix is a narrow carve-out in `SafeFsExecutor.guard()`: when the canonicalized target path is under a `.instar/` subdirectory of the source root, skip the source-tree guard. The carve-out is intentionally interior-only — the `.instar` directory itself is still protected (`safeRmSync` on `<root>/.instar` still throws `SourceTreeGuardError`). All five subdirectories that the project's own `.gitignore` excludes (`.instar/state/`, `.instar/logs/`, `.instar/audit/`, `.instar/instar-dev-traces/`, plus `.instar/shared-state.jsonl`) are runtime state, not source code, and destructive ops on them are a normal part of operation rather than a 2026-04-22-class incident.
|
|
13
|
+
|
|
14
|
+
The guard's three layers (marker file, canonical origin URL, source-identity signature) are unchanged. The 2026-04-22 incident is still caught: that incident targeted source files at the tree root (`README.md`, `src/auth.ts`, `src/middleware.ts`), not anything under `.instar/`. The included tests verify both directions — the carve-out lets the right paths through, and source-tree paths outside `.instar/` (and `.instar` itself) still fault.
|
|
15
|
+
|
|
16
|
+
## Why now
|
|
17
|
+
|
|
18
|
+
After v1.2.4 every fresh boot of Echo on dawn-macbook entered the loop: lifeline restarts → WakeSocketServer EADDRINUSE → stale-socket-recovery blocked by guard → supervisor declares health-check failed → bind-failure escalation → force-rebuild better-sqlite3 → binary mismatch → loop. Manually unlinking the socket and bootstrapping cleanly worked once, but the next launchd respawn re-entered the loop because nothing fixed the structural block.
|
|
19
|
+
|
|
20
|
+
## Audit trail
|
|
21
|
+
|
|
22
|
+
The carve-out also leaves a positive audit signal: `safeUnlinkSync` (and siblings) emit an `outcome: "allowed"` entry to `.instar/audit/destructive-ops.jsonl` with `reason: "agent-runtime-state-carveout"` whenever the carve-out path is taken. Lets you see how often the runtime-state path is being exercised vs how often it would have been a false-positive block before.
|
|
23
|
+
|
|
24
|
+
## Tests
|
|
25
|
+
|
|
26
|
+
5 new tests in `tests/unit/SafeFsExecutor.test.ts` under `SafeFsExecutor agent-runtime-state carve-out`:
|
|
27
|
+
|
|
28
|
+
- `allows unlink on a socket file under <root>/.instar/`
|
|
29
|
+
- `allows unlink on a lock file under <root>/.instar/`
|
|
30
|
+
- `allows rm on a nested file under <root>/.instar/state/`
|
|
31
|
+
- `still BLOCKS rm on the .instar directory itself (not its contents)`
|
|
32
|
+
- `still BLOCKS unlink on source files at the tree root`
|
|
33
|
+
|
|
34
|
+
All 17 SafeFsExecutor tests pass (12 existing + 5 new).
|
|
35
|
+
|
|
36
|
+
## Summary of New Capabilities
|
|
37
|
+
|
|
38
|
+
This is a fix-only release. No new user-facing capabilities. The carve-out unblocks `WakeSocketServer.stale-socket-recovery`, `AutoUpdater` shadow-install management, and lifeline lockfile cleanup — all of which were already supposed to work but were silently blocked by the source-tree guard in agent mode.
|
|
39
|
+
|
|
40
|
+
## What to Tell Your User
|
|
41
|
+
|
|
42
|
+
If you're running an instar agent on macOS and have hit cold-start crash loops where the agent's logs say EADDRINUSE and reference SafeFsExecutor, this release fixes the underlying block. Pull v1.2.x (next), restart your agent. No config changes required, no migration needed.
|
|
43
|
+
|
|
44
|
+
If you've never seen this — you're on a deployment style where the agent dir is NOT a checkout of the instar source, and the guard was never the problem. This release is a no-op for you.
|
|
45
|
+
|
|
46
|
+
If you ran the manual workaround (rm .instar/listener.sock then bootstrap your launchd plist) — the workaround is no longer needed once this release is installed.
|
|
47
|
+
|
|
48
|
+
## Evidence
|
|
49
|
+
|
|
50
|
+
**Reproduction**: Run instar in agent mode where the agent's deployed directory is also a checkout of the instar source tree (the `~/.instar/agents/echo` pattern on dawn-macbook). Cold-start with a stale `.instar/listener.sock` present. Observed before this fix: `WakeSocketServer` attempts to unlink the stale socket via `SafeFsExecutor.safeUnlinkSync`, which throws `SourceTreeGuardError`. The supervisor's bind-failure escalation triggers (`Bind-failure escalation armed: N consecutive spawns failed before binding`). After 5 retries the supervisor enters 300s cooldown. Server never binds. Tunnel returns 502.
|
|
51
|
+
|
|
52
|
+
**Observed before** (Echo, 2026-05-21T16:46Z, sample from `logs/lifeline-launchd.err`):
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
Error: stale socket at /Users/justin/.instar/agents/echo/.instar/listener.sock could not be unlinked:
|
|
56
|
+
Refusing to run src/threadline/WakeSocketServer.ts:stale-socket-recovery against the instar source tree
|
|
57
|
+
(requested dir: /Users/justin/.instar/agents/echo/.instar/listener.sock,
|
|
58
|
+
resolved git root: /Users/justin/.instar/agents/echo).
|
|
59
|
+
[Supervisor] Bind-failure escalation armed: 34 consecutive spawns failed before binding.
|
|
60
|
+
[Supervisor] Max restart attempts (5) reached. Cooling down for 300s before retrying.
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Observed after** (same agent, hot-patched 2026-05-21T17:00Z with the same source change applied to `shadow-install/.../SafeFsExecutor.js`):
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
$ curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:4042/health # 5 times, 3s apart
|
|
67
|
+
200
|
|
68
|
+
200
|
|
69
|
+
200
|
|
70
|
+
200
|
|
71
|
+
200
|
|
72
|
+
|
|
73
|
+
$ curl -s -o /dev/null -w "%{http_code}\n" https://echo.dawn-tunnel.dev/health
|
|
74
|
+
200
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Tunnel-fronted dashboard at `https://echo.dawn-tunnel.dev/dashboard?session=<...>` returns HTTP 200 with the live dashboard HTML (316KB). The bind-failure escalation never fires. The audit log shows the carve-out's positive signal:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
$ grep agent-runtime-state-carveout .instar/audit/destructive-ops.jsonl | head -3
|
|
81
|
+
{"timestamp":"2026-05-21T17:00:23.118Z","executor":"fs","operation":"WakeSocketServer.ts:stale-socket-recovery","verb":"safeUnlinkSync","target":".../.instar/listener.sock","outcome":"allowed","reason":"agent-runtime-state-carveout","caller":"..."}
|
|
82
|
+
```
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Side-Effects Review — Capabilities Introspection
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `capabilities-introspection`
|
|
4
|
+
**Date:** `2026-05-21`
|
|
5
|
+
**Author:** `Echo (instar-developing agent)`
|
|
6
|
+
**Second-pass reviewer:** `not required` (pure refactor; response shape preserved; no new decision-point surface)
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
Extracts `src/server/CapabilityIndex.ts` as the single source of truth for the /capabilities self-discovery surface AND the discoverability lint that PR #290 introduced. The /capabilities handler shrinks from ~440 lines of inline build logic to ~25 lines that iterate the index. The lint rewrites to import the registry directly instead of maintaining a parallel hand-written allowlist. Adds a CapabilityIndex unit-test file that pins module-level invariants.
|
|
11
|
+
|
|
12
|
+
Files touched:
|
|
13
|
+
|
|
14
|
+
- `src/server/CapabilityIndex.ts` — new module (the registry).
|
|
15
|
+
- `src/server/routes.ts` — /capabilities handler refactor.
|
|
16
|
+
- `tests/unit/capabilities-discoverability.test.ts` — switch from inline allowlist to imports.
|
|
17
|
+
- `tests/unit/CapabilityIndex.test.ts` — new module-level invariant tests.
|
|
18
|
+
- `src/data/builtin-manifest.json` — regenerated hashes.
|
|
19
|
+
- `upgrades/NEXT.md` — release notes.
|
|
20
|
+
- `docs/specs/capabilities-introspection.{md,eli16.md}` — spec + ELI16.
|
|
21
|
+
|
|
22
|
+
## Decision-point inventory
|
|
23
|
+
|
|
24
|
+
- /capabilities response builder — **modify (refactor)** — same output, different production path.
|
|
25
|
+
- Discoverability lint — **modify** — same invariant, different source of truth.
|
|
26
|
+
|
|
27
|
+
No new gate/block surface. No runtime decisions changed.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 1. Over-block
|
|
32
|
+
|
|
33
|
+
**What legitimate inputs does this change reject that it shouldn't?**
|
|
34
|
+
|
|
35
|
+
No block/allow surface — over-block not applicable. The lint refuses CI for unclassified route prefixes (the desired behavior). A new route prefix that the author forgot to classify fails the lint with a precise error pointing at CapabilityIndex.ts.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 2. Under-block
|
|
40
|
+
|
|
41
|
+
**What failure modes does this still miss?**
|
|
42
|
+
|
|
43
|
+
The lint catches the structural gap (prefix not classified) but does not validate the SEMANTIC correctness of a classification — a contributor could claim a public agent-facing route under INTERNAL_PREFIXES with a bogus reason and the lint would pass. The reason field is reviewer-enforced, not machine-enforced. Acceptable: the reviewer is the right authority for semantic intent; the machine's job is to ensure the choice is made and documented.
|
|
44
|
+
|
|
45
|
+
The CapabilityIndex.test.ts regression guard for the secrets entry's retrievalHint is intentionally narrow — it asserts the hint mentions `secret-drop-retrieve.mjs` and "NEVER prints the response body." A reviewer could weaken the hint in other ways that still pass the regex (e.g., remove the explicit warning against raw curl). That's a residual risk; the broader feature-delivery-completeness lint catches the related CLAUDE.md → /capabilities parity.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 3. Level-of-abstraction fit
|
|
50
|
+
|
|
51
|
+
**Is this at the right layer?**
|
|
52
|
+
|
|
53
|
+
Yes. The CapabilityIndex module sits in `src/server/` alongside routes.ts and SecretDrop.ts. It depends on the route-context type via a `type-only` import to avoid a circular module dependency at runtime. The lint sits in `tests/unit/` and imports from `src/server/` as a regular dependency, which is the standard test-to-source direction.
|
|
54
|
+
|
|
55
|
+
A higher-level abstraction (e.g., deriving CAPABILITY_INDEX from the Express router at runtime) would not replace the classification step — the router doesn't carry semantic intent. The static registry is the right shape.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 4. Signal vs authority compliance
|
|
60
|
+
|
|
61
|
+
**Required reference:** [docs/signal-vs-authority.md](../../docs/signal-vs-authority.md)
|
|
62
|
+
|
|
63
|
+
**Does this change hold blocking authority with brittle logic?**
|
|
64
|
+
|
|
65
|
+
- [x] No — this change has no block/allow surface at runtime.
|
|
66
|
+
|
|
67
|
+
The lint has CI-time block authority but only via the CI gate's enforcement; it emits a signal that a smart authority (the reviewer + branch protection) acts on. The lint's logic is straightforward set arithmetic — not a brittle heuristic.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 5. Interactions
|
|
72
|
+
|
|
73
|
+
**Does this interact with existing checks, recovery paths, or infrastructure?**
|
|
74
|
+
|
|
75
|
+
- **Shadowing:** none. The /capabilities handler is the only consumer of the registry at runtime; the lint is the only consumer at test time.
|
|
76
|
+
- **Double-fire:** none. Each invocation produces a fresh map; no shared mutable state.
|
|
77
|
+
- **Races:** none. CAPABILITY_INDEX is a frozen const at module load; the build functions are pure.
|
|
78
|
+
- **Feedback loops:** none. /capabilities reads from the registry; nothing writes back.
|
|
79
|
+
|
|
80
|
+
The refactor preserves all existing consumers of /capabilities. Concretely verified: `tests/integration/view-tunnel-routes.test.ts` (privateViewer assertion), `tests/integration/publishing-routes.test.ts` (publishing assertion), `tests/integration/external-operation-safety-routes.test.ts` (externalOperationSafety assertion), `tests/integration/imessage-routes.test.ts` (imessage assertion) — all 76 cases pass unchanged.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 6. External surfaces
|
|
85
|
+
|
|
86
|
+
**Does this change anything visible outside the immediate code path?**
|
|
87
|
+
|
|
88
|
+
- **Agents on the same machine:** see the same /capabilities response. Field names, nesting, values, iteration order all preserved.
|
|
89
|
+
- **Dashboard:** unchanged. The dashboard reads the JSON and renders selected fields; field names are stable.
|
|
90
|
+
- **External systems:** none touched.
|
|
91
|
+
- **Persistent state:** none introduced.
|
|
92
|
+
- **Timing / runtime conditions:** no measurable latency change. The iteration over CAPABILITY_INDEX is O(n) with n=~30; the prior inline literal was also O(n) at JIT eval time.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 7. Rollback cost
|
|
97
|
+
|
|
98
|
+
**If this turns out wrong in production, what's the back-out?**
|
|
99
|
+
|
|
100
|
+
Pure code change. Revert the three new files (CapabilityIndex.ts, CapabilityIndex.test.ts, the spec/artifact docs) and the routes.ts diff. The lint test reverts to its prior body. No persistent state, no agent-state repair, no user-visible regression during the rollback window.
|
|
101
|
+
|
|
102
|
+
Realistic rollback: revert + patch release. Under 5 minutes.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Conclusion
|
|
107
|
+
|
|
108
|
+
This is a low-risk refactor that closes the parallel-surfaces gap introduced by PR #290. The /capabilities response shape is preserved byte-for-byte; the lint is now anchored to a typed module instead of a hand-maintained test allowlist; module-level invariants are pinned by a new test file. No second-pass review required.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Evidence pointers
|
|
113
|
+
|
|
114
|
+
- Spec: `docs/specs/capabilities-introspection.md`
|
|
115
|
+
- ELI16: `docs/specs/capabilities-introspection.eli16.md`
|
|
116
|
+
- New tests: `tests/unit/CapabilityIndex.test.ts` (9 cases), refactored `tests/unit/capabilities-discoverability.test.ts` (84 cases). All green.
|
|
117
|
+
- Integration tests that exercise /capabilities (76 cases) pass unchanged.
|
|
118
|
+
- `npx tsc --noEmit` clean.
|
|
119
|
+
- Origin: 2026-05-21 case-study audit (topic 11141, follow-up #2 of two).
|