instar 1.3.1211 → 1.3.1213

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.
Files changed (45) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +12 -0
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/BetweenWindowAdmissionGate.d.ts +2 -0
  5. package/dist/core/BetweenWindowAdmissionGate.d.ts.map +1 -1
  6. package/dist/core/BetweenWindowAdmissionGate.js +2 -0
  7. package/dist/core/BetweenWindowAdmissionGate.js.map +1 -1
  8. package/dist/core/PeerEndpointRecorder.d.ts +30 -0
  9. package/dist/core/PeerEndpointRecorder.d.ts.map +1 -1
  10. package/dist/core/PeerEndpointRecorder.js +53 -3
  11. package/dist/core/PeerEndpointRecorder.js.map +1 -1
  12. package/dist/core/WindowLifecycleObligationLedger.d.ts +382 -0
  13. package/dist/core/WindowLifecycleObligationLedger.d.ts.map +1 -0
  14. package/dist/core/WindowLifecycleObligationLedger.js +734 -0
  15. package/dist/core/WindowLifecycleObligationLedger.js.map +1 -0
  16. package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
  17. package/dist/core/WriteDomainRegistry.js +7 -0
  18. package/dist/core/WriteDomainRegistry.js.map +1 -1
  19. package/dist/data/standards-guard-index.json +1 -1
  20. package/dist/data/standards-guard-index.meta.json +2 -2
  21. package/dist/data/standards-registry.meta.json +1 -1
  22. package/dist/monitoring/SessionWatchdog.d.ts +29 -0
  23. package/dist/monitoring/SessionWatchdog.d.ts.map +1 -1
  24. package/dist/monitoring/SessionWatchdog.js +52 -0
  25. package/dist/monitoring/SessionWatchdog.js.map +1 -1
  26. package/dist/server/AgentServer.d.ts +5 -0
  27. package/dist/server/AgentServer.d.ts.map +1 -1
  28. package/dist/server/AgentServer.js +22 -0
  29. package/dist/server/AgentServer.js.map +1 -1
  30. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  31. package/dist/server/CapabilityIndex.js +25 -0
  32. package/dist/server/CapabilityIndex.js.map +1 -1
  33. package/dist/server/routes.d.ts +5 -0
  34. package/dist/server/routes.d.ts.map +1 -1
  35. package/dist/server/routes.js +806 -1
  36. package/dist/server/routes.js.map +1 -1
  37. package/package.json +1 -1
  38. package/src/data/builtin-manifest.json +47 -47
  39. package/src/data/standards-guard-index.json +1 -1
  40. package/src/data/standards-guard-index.meta.json +2 -2
  41. package/src/data/standards-registry.meta.json +1 -1
  42. package/upgrades/1.3.1212.md +28 -0
  43. package/upgrades/1.3.1213.md +45 -0
  44. package/upgrades/side-effects/mesh-endpoint-degradation-retention.md +106 -0
  45. package/upgrades/side-effects/window-lifecycle-obligation-ledger.md +94 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.1211",
3
+ "version": "1.3.1213",
4
4
  "description": "Coherence infrastructure for self-evolving AI agents — on the Claude Code or Codex subscription you already have.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-08-29T18:46:17.419Z",
5
- "instarVersion": "1.3.1211",
4
+ "generatedAt": "2026-08-29T20:28:30.776Z",
5
+ "instarVersion": "1.3.1213",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
421
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
429
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
437
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
445
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
453
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
461
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
469
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
477
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
485
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
493
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
501
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
509
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
517
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
525
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
533
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
541
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
549
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
557
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
565
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
573
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
581
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
589
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
597
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
605
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
613
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
621
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
629
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
637
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
645
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
653
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
661
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
669
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
677
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
685
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
693
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
701
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
709
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
717
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
725
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
733
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
741
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
749
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
757
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
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": "9da7ed7098895409b67172589e374590e0eabe2f8cf2e8050a56eea3bddb9b5b",
773
+ "contentHash": "8f36cd4834156adfe6213f468ab78288a3a5c34d44045844ba8263515ea1db9a",
774
774
  "since": "2025-01-01"
775
775
  },
776
776
  "cli:init": {
@@ -1530,7 +1530,7 @@
1530
1530
  "type": "subsystem",
1531
1531
  "domain": "server",
1532
1532
  "sourcePath": "src/server/AgentServer.ts",
1533
- "contentHash": "8e859dea098bdf3ef3dad695be63e82507568fc5fab8d407372d898bf97f15ee",
1533
+ "contentHash": "7a3633a568953a12f17d84a1973c4b27f29fcf2c465c59c8da32a0779422de35",
1534
1534
  "since": "2025-01-01"
1535
1535
  },
1536
1536
  "subsystem:session-manager": {
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "generatedFrom": "source-tree",
4
4
  "registrySha256": "8e6606a6722433c5ffc15b3870402283c5406083a14cdbd0e18e735731e2aae2",
5
- "packageVersion": "1.3.1211",
5
+ "packageVersion": "1.3.1213",
6
6
  "guards": [
7
7
  {
8
8
  "ref": "docs/audits/phase-b/f10-triage.md",
@@ -1,5 +1,5 @@
1
1
  {
2
- "sha256": "3b0e2fb49532fc71ccad75e7d03da358c58350c06b743a3c7a71b1d47e29fdfe",
2
+ "sha256": "0511bc378e28f623a7f8670ca57f2563ae0c20396c88c436fd87507377ca87b9",
3
3
  "registrySha256": "8e6606a6722433c5ffc15b3870402283c5406083a14cdbd0e18e735731e2aae2",
4
- "packageVersion": "1.3.1211"
4
+ "packageVersion": "1.3.1213"
5
5
  }
@@ -2,5 +2,5 @@
2
2
  "sha256": "8e6606a6722433c5ffc15b3870402283c5406083a14cdbd0e18e735731e2aae2",
3
3
  "articleCount": 90,
4
4
  "generatedFrom": "docs/STANDARDS-REGISTRY.md",
5
- "packageVersion": "1.3.1211"
5
+ "packageVersion": "1.3.1213"
6
6
  }
@@ -0,0 +1,28 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ - New `src/core/WindowLifecycleObligationLedger.ts`: a content-dependent compiler (source-derived AST over the governing documents; a recite-from-memory shortcut fails when the source changes), per-duty evidence policies with honest authority levels (local-store presence is never promoted to authenticated), per-class executor-liveness predicates (`pending-executable` / `completed-one-shot` / `future-phase`), a signed per-run audit census with hash chain, exact-digest operator-only waivers with non-waivable core duties, and an audited Echo-local rollback.
9
+ - `AgentServer`/`routes`: new authenticated `/window-lifecycle/*` routes (compile, evidence, evaluate, tick, transition, native admission, waiver, rollback, status), enforcement middleware over the session-creation, message-send, and completion-claim doors (typed 409 refusals when enforced), all registered in the `WriteDomainRegistry` and `CapabilityIndex`.
10
+ - `SessionWatchdog`: real all-session inspection authority with durable machine-local HMAC (epoch + monotonic revision, restart-safe) so stall-cadence evidence cannot be forged or replayed.
11
+ - `BetweenWindowAdmissionGate`: consumed unchanged behind a versioned adapter that persists exact inputs/outputs; its structural verdict is never dressed up as semantic proof.
12
+ - Shared test infrastructure: `session-management-e2e` fixtures now use process-unique tmux/temp prefixes so concurrent checkouts' suites cannot delete each other's live fixtures.
13
+
14
+ ## What to Tell Your User
15
+
16
+ This feature is scoped to the Echo development agent and ships dark: nothing changes on your install unless the ledger is explicitly compiled and graduated on that machine. For the operator it serves, the practical change is that governance-window claims ("opened", "closed", "report sent") stop being assertions and become checked states — a skipped duty now blocks or surfaces loudly instead of passing silently, and enforcement only turns on after a watch-only period proves it makes zero false calls.
17
+
18
+ ## Summary of New Capabilities
19
+
20
+ - A new Echo-only enforcement plane compiles governance duties (history reads, verbatim recitations, plan updates, cadenced reports) from their source documents into a machine-checkable obligation ledger, and refuses window "open"/"closed" claims while any duty lacks real evidence.
21
+ - Every duty carries an executor-liveness predicate: a duty that is registered but has nothing demonstrably running it becomes a loud `open-unexecuted` finding instead of silent non-execution.
22
+ - The whole plane ships maturation-gated: `off | dry-run (default) | enforced`. In dry-run it records what it would have blocked; it can only graduate to real enforcement on server-derived evidence of zero false calls, and tampering with that evidence demotes it back to dry-run.
23
+
24
+ ## Evidence
25
+
26
+ - 27 independent review-fix cycles to concurrence (cycle 22; re-confirmed at cycles 24 and 27 after integration corrections), recorded in the Window-28 build ledger with every rejection and disposition.
27
+ - Complete `npm run test:all` exited 0 with zero failures (final E2E phase: 341 files passed / 1 skipped, 3,107 tests passed), including the two-lifecycle production AgentServer E2E (real admission → cadence → mid → close → post-live → closure census, plus graduation, forgery-rejection, and demotion paths) and a mandatory incident test reproducing the 2026-08-28 registered-duty-with-no-executor silence, asserting admission refuses with both predicate and executor reasons.
28
+ - Spec `docs/specs/window-lifecycle-obligation-ledger.md` converged (3 iterations) and operator-approved 2026-08-28 09:32 PDT, with the approval quote recorded in the spec header; side-effects review with second-pass reviewer concurrence at `upgrades/side-effects/window-lifecycle-obligation-ledger.md`.
@@ -0,0 +1,45 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ `PeerEndpointRecorder` gained invariant 2b: a non-empty peer advertisement that OMITS a
9
+ rope kind no longer discards that kind when this machine's own rope-health record shows
10
+ it currently alive. Retention requires positive evidence — a dead rope, a never-dialled
11
+ rope, and an unreadable health source all keep the previous replace semantics, and an
12
+ advertised kind always wins for its own kind. Wired from `meshResolver.snapshot()` in
13
+ `server.ts`.
14
+
15
+ Found live on 2026-08-29: a peer whose agent runs inside WSL can only see an unreachable
16
+ virtual NIC, so it advertised `[lan]` alone, and the mesh discarded the working tailscale
17
+ rope that was carrying its traffic at that moment.
18
+
19
+ ## What to Tell Your User
20
+
21
+ If one of your machines runs its agent inside a nested environment (WSL, a container, a
22
+ VM), it may not be able to see the address the other machines actually reach it on. When
23
+ it announced the only address it *could* see, your other machines used to believe it and
24
+ throw away the route that was working — leaving that machine unreachable with no way for
25
+ it to correct the record.
26
+
27
+ Now a route your machine can see carrying traffic is kept even when an announcement
28
+ forgets to mention it. A route that has genuinely gone dead is still dropped, so nothing
29
+ lingers forever.
30
+
31
+ ## Summary of New Capabilities
32
+
33
+ - A peer's shorter address list can no longer delete a route this machine can see working.
34
+ - Retention is evidence-based: only a rope the local health record reports alive is kept;
35
+ dead and never-dialled ropes are dropped exactly as before.
36
+ - Fully reversible — with no health source wired the behaviour is byte-identical to the
37
+ previous replace semantics.
38
+
39
+ ## Evidence
40
+
41
+ - Unit: `tests/unit/PeerEndpointRecorder.test.ts` (+8 cases), verified red-then-green
42
+ against pre-2b behaviour.
43
+ - Integration: `tests/integration/mesh-endpoint-propagation.test.ts` (+2 cases) driving
44
+ the real `/api/lease` route with a real registry.
45
+ - Side-effects review: `upgrades/side-effects/mesh-endpoint-degradation-retention.md`.
@@ -0,0 +1,106 @@
1
+ # Side-effects review — mesh endpoint degradation retention (invariant 2b)
2
+
3
+ **Change:** `PeerEndpointRecorder.record()` no longer lets a non-empty but DEGRADED peer
4
+ advertisement discard a rope this machine's own health record currently shows alive.
5
+ Wired in `server.ts` from `meshResolver.snapshot()`.
6
+
7
+ **Origin (live incident, 2026-08-29, topic 62395):** a peer whose agent runs inside WSL
8
+ can only see an unreachable virtual NIC (`eth0 172.22.96.135`); Tailscale lives on the
9
+ Windows host, outside that VM. It advertised `[lan]` alone; the recorder replaced
10
+ `[tailscale, lan]`, and the mesh lost its only working route to that machine — while the
11
+ tailscale rope was verifiably carrying traffic at that moment (peer answered
12
+ `/health` 200 and a signed mesh probe returned the typed `not-router` refusal).
13
+
14
+ ## 1. Over-block — what legitimate input does this now reject?
15
+
16
+ None: the change never rejects an advertisement. Every advertised kind is still recorded
17
+ verbatim and still wins for its own kind (covered by the "re-advertising a kind with a new
18
+ url still wins" and "advertised kind actually changed" tests). The only behavioural delta
19
+ is ADDITIVE retention of an omitted kind.
20
+
21
+ The nearest thing to an over-block is over-RETENTION: keeping a rope the peer meant to
22
+ retire. Bounded three ways — retention requires a positive `alive === true`; `false` and
23
+ `undefined` (never dialled) both drop; and the resolver remains the dial-time authority,
24
+ so a retained rope that stops working is marked dead and then dropped on the next
25
+ degraded advertisement.
26
+
27
+ ## 2. Under-block — what does this still miss?
28
+
29
+ It does NOT help when the proven rope is ALSO not currently alive in the health record at
30
+ the moment the degraded advertisement lands (a machine that reboots into WSL-only
31
+ visibility while its tailscale rope happens to be marked dead). That case needs the
32
+ peer to be able to advertise an address it cannot locally see, which is the separate
33
+ NAT'd-machine work — tracked, not deferred silently:
34
+ <!-- tracked: CMT-211 -->
35
+
36
+ It also does not fix the root cause for that machine: a WSL-hosted agent still cannot
37
+ discover its own reachable address. This change stops the DATA LOSS, not the blindness.
38
+
39
+ ## 3. Level-of-abstraction fit
40
+
41
+ Correct layer. `PeerEndpointRecorder` is the documented single chokepoint for "I just
42
+ learned a peer's ropes" and already owns invariants 1–5, including the sibling
43
+ absence-is-never-a-wipe rule. Invariant 2b is the same class of protection (an
44
+ advertisement must not destroy knowledge) and belongs beside it, not in the two
45
+ callsites. Nothing lower (the validator) knows current state; nothing higher (the routes)
46
+ should own merge policy.
47
+
48
+ ## 4. Signal vs authority compliance
49
+
50
+ Compliant. The recorder produces/persists a SIGNAL (the known endpoint set); it holds no
51
+ blocking authority. `PeerEndpointResolver` remains the dial-time authority and already
52
+ deprioritises-but-probes dead ropes, so a retained-but-stale endpoint cannot block or
53
+ misroute anything — it can only be tried last. The new dep is a read-only evidence
54
+ source; an exception from it is caught and degrades to the previous behaviour.
55
+
56
+ ## 5. Interactions
57
+
58
+ - **Invariant 4 (idempotency):** preserved and explicitly tested — when the merged set
59
+ equals what is stored (the common steady-state case), the write is still skipped, so
60
+ this does not reintroduce the ~720 no-op rewrites/day the idempotency guard removed.
61
+ - **Invariant 2 (absence):** untouched; the empty/invalid path returns before the merge.
62
+ - **Invariant 5 (advisory):** untouched; only the peer's own entry is written.
63
+ - **`MeshEndpointValidator` cap:** the merge appends retained entries AFTER validation of
64
+ the advertised set. A peer at the kind cap cannot exceed it, because retention only
65
+ adds kinds the advertisement did NOT name and there are three kinds total.
66
+ - **No double-fire / no race added:** the merge is pure and synchronous inside the
67
+ existing single write path.
68
+
69
+ ## 6. External surfaces
70
+
71
+ No route, config key, schema, or user-visible surface changes. `GET /health →
72
+ multiMachine.syncStatus` and `GET /pool` may now show a peer retaining a rope kind they
73
+ would previously have lost — which is the intended correction. Timing dependence is
74
+ limited to reading a live snapshot, and the failure mode of that read is explicitly
75
+ "no evidence ⇒ previous behaviour".
76
+
77
+ ## 7. Multi-machine posture (Cross-Machine Coherence)
78
+
79
+ **Machine-local BY DESIGN.** The retention decision is made from the RECEIVING machine's
80
+ own rope-health record and written only into its own registry copy. This is deliberate
81
+ and load-bearing: rope health is inherently per-observer (machine A's tailscale rope to C
82
+ can be alive while B's is dead), so replicating the decision would let one machine's view
83
+ overwrite another's ground truth. Each machine independently reaches the correct answer
84
+ from its own evidence. No replication path is added and none is wanted. A single-machine
85
+ agent has no peers and is a strict no-op.
86
+
87
+ ## 8. Rollback cost
88
+
89
+ Trivial and total. Remove the `isEndpointAlive` dep from the `server.ts` construction and
90
+ the recorder falls back — by an explicitly-tested path ("with NO health dep wired,
91
+ behaviour is byte-identical to plain replace") — to the exact pre-change semantics. No
92
+ data migration: the registry format is unchanged, and a retained endpoint is an ordinary
93
+ entry the next advertisement can overwrite. No agent state repair.
94
+
95
+ ## Tests
96
+
97
+ - Unit (`tests/unit/PeerEndpointRecorder.test.ts`, +8): retain-on-alive, drop-on-dead,
98
+ drop-on-no-evidence, drop-on-throw, advertised-kind-upgrade-wins, idempotent-merge,
99
+ no-dep-is-identical. Verified RED against pre-2b behaviour (3 failures for the right
100
+ reason: the retention cases) and GREEN after.
101
+ - Integration (`tests/integration/mesh-endpoint-propagation.test.ts`, +2): the real
102
+ `/api/lease` route with a real registry — a degraded advertisement keeps a live rope,
103
+ and still drops a dead one.
104
+ - E2E: not applicable — no new API route or feature-liveness surface; the change is a
105
+ merge rule inside an existing chokepoint already covered end-to-end by the integration
106
+ route test.