instar 1.3.633 → 1.3.635

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 (83) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +59 -4
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +18 -1
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/LeaseCoordinator.d.ts +7 -0
  8. package/dist/core/LeaseCoordinator.d.ts.map +1 -1
  9. package/dist/core/LeaseCoordinator.js +9 -0
  10. package/dist/core/LeaseCoordinator.js.map +1 -1
  11. package/dist/core/MachinePoolRegistry.d.ts +8 -0
  12. package/dist/core/MachinePoolRegistry.d.ts.map +1 -1
  13. package/dist/core/MachinePoolRegistry.js +1 -0
  14. package/dist/core/MachinePoolRegistry.js.map +1 -1
  15. package/dist/core/MultiMachineCoordinator.d.ts +69 -0
  16. package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
  17. package/dist/core/MultiMachineCoordinator.js +183 -0
  18. package/dist/core/MultiMachineCoordinator.js.map +1 -1
  19. package/dist/core/churnBreaker.d.ts +68 -0
  20. package/dist/core/churnBreaker.d.ts.map +1 -0
  21. package/dist/core/churnBreaker.js +98 -0
  22. package/dist/core/churnBreaker.js.map +1 -0
  23. package/dist/core/clockSkewAlarm.d.ts +61 -0
  24. package/dist/core/clockSkewAlarm.d.ts.map +1 -0
  25. package/dist/core/clockSkewAlarm.js +68 -0
  26. package/dist/core/clockSkewAlarm.js.map +1 -0
  27. package/dist/core/configCoherence.d.ts +39 -0
  28. package/dist/core/configCoherence.d.ts.map +1 -0
  29. package/dist/core/configCoherence.js +52 -0
  30. package/dist/core/configCoherence.js.map +1 -0
  31. package/dist/core/leaseLiveness.d.ts +42 -0
  32. package/dist/core/leaseLiveness.d.ts.map +1 -0
  33. package/dist/core/leaseLiveness.js +34 -0
  34. package/dist/core/leaseLiveness.js.map +1 -0
  35. package/dist/core/pollIntent.d.ts +65 -0
  36. package/dist/core/pollIntent.d.ts.map +1 -0
  37. package/dist/core/pollIntent.js +112 -0
  38. package/dist/core/pollIntent.js.map +1 -0
  39. package/dist/core/pollerCount.d.ts +61 -0
  40. package/dist/core/pollerCount.d.ts.map +1 -0
  41. package/dist/core/pollerCount.js +62 -0
  42. package/dist/core/pollerCount.js.map +1 -0
  43. package/dist/core/types.d.ts +57 -1
  44. package/dist/core/types.d.ts.map +1 -1
  45. package/dist/core/types.js.map +1 -1
  46. package/dist/lifeline/TelegramLifeline.d.ts +18 -0
  47. package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
  48. package/dist/lifeline/TelegramLifeline.js +99 -0
  49. package/dist/lifeline/TelegramLifeline.js.map +1 -1
  50. package/dist/lifeline/pollDecision.d.ts +47 -0
  51. package/dist/lifeline/pollDecision.d.ts.map +1 -0
  52. package/dist/lifeline/pollDecision.js +50 -0
  53. package/dist/lifeline/pollDecision.js.map +1 -0
  54. package/dist/monitoring/CommitmentTracker.d.ts +15 -0
  55. package/dist/monitoring/CommitmentTracker.d.ts.map +1 -1
  56. package/dist/monitoring/CommitmentTracker.js +59 -22
  57. package/dist/monitoring/CommitmentTracker.js.map +1 -1
  58. package/dist/monitoring/DegradationReporter.d.ts +10 -0
  59. package/dist/monitoring/DegradationReporter.d.ts.map +1 -1
  60. package/dist/monitoring/DegradationReporter.js +45 -17
  61. package/dist/monitoring/DegradationReporter.js.map +1 -1
  62. package/dist/server/routes.d.ts.map +1 -1
  63. package/dist/server/routes.js +17 -0
  64. package/dist/server/routes.js.map +1 -1
  65. package/package.json +1 -1
  66. package/src/data/builtin-manifest.json +49 -49
  67. package/upgrades/1.3.634.md +59 -0
  68. package/upgrades/1.3.635.md +53 -0
  69. package/upgrades/side-effects/commitment-tracker-verify-batches-saves.md +109 -0
  70. package/upgrades/side-effects/mm-lease-poll-robustness-b1-lifeline-consumer.md +43 -0
  71. package/upgrades/side-effects/mm-lease-poll-robustness-b1-poll-decision.md +38 -0
  72. package/upgrades/side-effects/mm-lease-poll-robustness-b1-poll-intent-producer.md +37 -0
  73. package/upgrades/side-effects/mm-lease-poll-robustness-b2-churn-breaker.md +42 -0
  74. package/upgrades/side-effects/mm-lease-poll-robustness-b3-renew-timer.md +43 -0
  75. package/upgrades/side-effects/mm-lease-poll-robustness-b4-clockskew-alarm-core.md +25 -0
  76. package/upgrades/side-effects/mm-lease-poll-robustness-b4-d9-freeze-vs-skew.md +71 -0
  77. package/upgrades/side-effects/mm-lease-poll-robustness-b4-skew-immune-liveness.md +41 -0
  78. package/upgrades/side-effects/mm-lease-poll-robustness-b5-poller-count-route.md +24 -0
  79. package/upgrades/side-effects/mm-lease-poll-robustness-b5-poller-count.md +38 -0
  80. package/upgrades/side-effects/mm-lease-poll-robustness-b5-pollingactive-heartbeat.md +38 -0
  81. package/upgrades/side-effects/mm-lease-poll-robustness-ci-housekeeping.md +17 -0
  82. package/upgrades/side-effects/mm-lease-poll-robustness-config-coherence.md +23 -0
  83. package/upgrades/1.3.633.md +0 -37
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.633",
3
+ "version": "1.3.635",
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-06-20T22:29:33.870Z",
5
- "instarVersion": "1.3.633",
4
+ "generatedAt": "2026-06-21T10:22:16.189Z",
5
+ "instarVersion": "1.3.635",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
421
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
429
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
437
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
445
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
453
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
461
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
469
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
477
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
485
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
493
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
501
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
509
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
517
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
525
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
533
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
541
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
549
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
557
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
565
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
573
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
581
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
589
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
597
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
605
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
613
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
621
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
629
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
637
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
645
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
653
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
661
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
669
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
677
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
685
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
693
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
701
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
709
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
717
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
725
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
733
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
741
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
749
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
757
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
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": "e247652ca9c7f1e85815c18205495129ccf360de5410c0b6d50a2863b038bf81",
773
+ "contentHash": "dd358e22670951895a29a9427c0c6bb9d131542b5d66bf88551373b79873dc67",
774
774
  "since": "2025-01-01"
775
775
  },
776
776
  "cli:init": {
@@ -1586,7 +1586,7 @@
1586
1586
  "type": "subsystem",
1587
1587
  "domain": "monitoring",
1588
1588
  "sourcePath": "src/monitoring/DegradationReporter.ts",
1589
- "contentHash": "92982f94e8d2df044ca983d1011323719bdcd1a07ec4a181a80b1805375cb1ed",
1589
+ "contentHash": "cafbe8bf319bee2c188c4323f2779b189faba87643f2e29e29d375c2b0c5ceed",
1590
1590
  "since": "2025-01-01"
1591
1591
  },
1592
1592
  "subsystem:telegram-lifeline": {
@@ -1594,7 +1594,7 @@
1594
1594
  "type": "subsystem",
1595
1595
  "domain": "communication",
1596
1596
  "sourcePath": "src/lifeline/TelegramLifeline.ts",
1597
- "contentHash": "4de84b772c789b564e3e8b955fc572ab41604a43209c3db36196d6474ece2351",
1597
+ "contentHash": "459f66059e04e9893003e593c9a4836ffd5eaad268d73e8277f97993d2bfdbe8",
1598
1598
  "since": "2025-01-01"
1599
1599
  },
1600
1600
  "subsystem:orphan-process-reaper": {
@@ -1618,7 +1618,7 @@
1618
1618
  "type": "subsystem",
1619
1619
  "domain": "coordination",
1620
1620
  "sourcePath": "src/core/MultiMachineCoordinator.ts",
1621
- "contentHash": "7ff2c287a93bf83d18a2bf6751510a8c5b01534688366d06d4cc76d4864182a3",
1621
+ "contentHash": "8ac73d6d545d82629338e0c72353427cc4448d108bc94c55af2c51c2b41fed9c",
1622
1622
  "since": "2025-01-01"
1623
1623
  },
1624
1624
  "subsystem:backup-manager": {
@@ -0,0 +1,59 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ `FeedbackManager` now treats a `429`/`503` from the canonical feedback endpoint as a
9
+ stop-signal: it HALTS the current retry batch and waits (honoring `Retry-After`, else
10
+ exponential 60s→1h) before POSTing again. Previously `retryUnforwarded()` re-POSTed the
11
+ ENTIRE un-forwarded backlog every scheduled cycle regardless of rate-limiting — against
12
+ a 429-ing endpoint that re-sent the whole backlog forever (observed live: 661 backlog
13
+ items → 2,384+ failed POSTs). A pure `decideFeedbackRetry()` helper makes the cadence
14
+ decision; the local feedback record is always written (nothing is lost or dropped).
15
+
16
+ Phase 1 of the permanent fixes for the recurring multi-machine failures (double-handling, total silence, the awake/standby lease flap, the clock-skew-broken cross-machine handshake) from the 2026-06-20 audit. Five tightly-coupled fixes to the fenced-lease + Telegram poll-ownership machinery, all **dev-gated / dark-on-fleet** (live-on-dev, dry-run/observe even there), single-machine no-ops, each with a clean kill-switch:
17
+
18
+ - **B3 — lease renew timer.** A dedicated renew timer at `clamp(leaseTtlMs×0.5,[5s,60s])` so a held lease is renewed (same epoch) before it lapses, fixing the epoch-climb (default TTL 60s < heartbeat tick 120s → re-acquire every tick). Flag `leaseSelfHeal.resilientRenew`.
19
+ - **B4 — skew-immune lease liveness.** The lease's `presumedDeadHolders`/`allPeersPresumedGone` now derive peer liveness from the skew-immune router-observed clock (`routerReceivedAt`) instead of the peer's skew-contaminated `lastSeen` — the flap's root trigger. Plus a `pollingActive` heartbeat field (B5's source). Flag `leaseSelfHeal.skewImmuneLiveness`.
20
+ - **B2 — churn breaker.** Implements the previously-dead `leaseSelfHeal.churnDetector`: on >N role flips it latches deterministically to the preferred-awake role (exactly-one-awake resting state) with a hard cap. Observe-only/dry-run.
21
+ - **B5 — exactly-one-listener decision.** A three-valued (ok/dual/silence/indeterminate) poller-count decision + pool adapter; a dark peer → indeterminate (never a false alarm), and the Telegram 409 conflict is partition-immune dual-poll evidence. Decision core + `pollingActive` heartbeat propagation (the `/guards` row is a follow-up).
22
+ - **B1 — poll-ownership follows the lease.** The server publishes a lease-derived poll-intent file (PID/bootId/ts integrity); the lifeline reconciles its real Telegram poll to it with asymmetric hysteresis (slow-start/instant-stop). Ships dry-run even on dev (changes no ingress); the live flip is gated on the Phase-4 two-host proof + B2/B5 live. Flag `multiMachine.pollFollowsLease`.
23
+
24
+ No user-facing or fleet behavior changes ship in this PR — every item is dark/dry-run and verified (second-pass, against the live config) unable to disturb the live agent.
25
+
26
+ ## What to Tell Your User
27
+
28
+ If your agent had been quietly retrying feedback against a busy endpoint, it now backs
29
+ off politely instead of hammering it — fewer wasted network calls and less background
30
+ churn. Nothing you do changes; no feedback is lost (notes are still saved locally and
31
+ sent once the endpoint is ready).
32
+
33
+ Nothing changes for you yet — this PR is dark-shipped infrastructure. Every fix is OFF on the fleet and runs in observe/dry-run mode even on the development agent, so your agent's behaviour is byte-for-byte unchanged. These are the permanent fixes for the multi-machine glitches (two-of-me answering, occasional silence, the "who's awake" role flip-flopping) but they only switch on after a live two-machine test proves them — at which point a separate release will announce it. If your agent runs on a single machine, this is a complete no-op.
34
+
35
+ ## Summary of New Capabilities
36
+
37
+ - Rate-limit-aware feedback forwarding: halts on 429/503, honors `Retry-After`, backs
38
+ off exponentially (capped), and never re-sends the whole backlog against a limited
39
+ endpoint. Back-compatible on a healthy endpoint (forwards immediately as before).
40
+
41
+ No new user-facing capabilities ship enabled in this release. Dark/dev-gated infrastructure added (each with an off-switch, single-machine no-op): a lease renew timer (`leaseSelfHeal.resilientRenew`), skew-immune lease liveness (`leaseSelfHeal.skewImmuneLiveness`), a lease-flap circuit-breaker (`leaseSelfHeal.churnDetector`), an exactly-one-Telegram-listener decision + `pollingActive` heartbeat field, and poll-ownership-follows-the-lease (`multiMachine.pollFollowsLease`, dry-run). These graduate to live (and get their own user-facing announcement) only after the Phase-4 live two-host proof.
42
+
43
+ ### Phase 2 #7 (also in this PR)
44
+ Startup config-coherence WARNINGS (never a boot reject): flags `meshTransport.enabled:false` while session transfer is live (the worst-of-both state the 2026-06-20 audit identified) and duplicate/non-positive mesh rope priorities. Logged at boot on multi-machine agents only; single-machine is a no-op. No behaviour change beyond a yellow boot warning.
45
+
46
+ ## Evidence
47
+
48
+ - New `tests/unit/feedbackBackoff.test.ts` (11 cases): 2xx clears backoff; 429/503 halt
49
+ + exponential backoff capped at 1h; `Retry-After` honored + capped; non-429 errors
50
+ retry-next-cycle and PRESERVE the 429 streak (flap protection); junk/negative
51
+ `Retry-After` rejected.
52
+ - `tests/unit/FeedbackManager.test.ts` (+2 cases): a 429 halts the batch after ONE POST
53
+ (not the whole backlog) and the next cycle POSTs zero times while backed off; no item
54
+ lost. Independent second-pass review concurred.
55
+
56
+ - Spec: `docs/specs/multimachine-lease-poll-robustness.md` (converged via /spec-converge, 2 rounds, 6 reviewers + constitution gate; approved). ELI16: `docs/specs/multimachine-lease-poll-robustness.eli16.md`.
57
+ - ~48 unit tests across `LeaseCoordinator-resilientRenew`, `leaseLiveness`, `churnBreaker`, `pollerCount`, `pollDecision`, `pollIntent` — all green. `tsc --noEmit` clean; dev-gate-dark + SafeFs containment lints clean.
58
+ - Side-effects artifacts (one per increment) in `upgrades/side-effects/mm-lease-poll-robustness-*.md`; each ingress/lease/recovery-touching change had an independent second-pass review (B3's caught + fixed an observe-only-renew edge; B1's lifeline consumer verified dry-run-safe against the live config).
59
+ - Tracks CMT-1710 + the 2026-06-20 multi-machine audit.
@@ -0,0 +1,53 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ `CommitmentTracker.verify()` runs every 60 seconds and checks each active commitment.
9
+ Previously, each check that mutated a commitment rewrote the **entire** commitments
10
+ store to disk (a full `JSON.stringify` of the whole file). On an agent whose store had
11
+ grown large (observed: 1.6MB, ~1,700 commitments), a single 60-second sweep did
12
+ hundreds of full-store serializations back-to-back — enough synchronous work to freeze
13
+ the server's event loop for minutes (health checks timing out, an external watchdog
14
+ restarting the process in a loop).
15
+
16
+ Now `verify()` batches the whole sweep into **one** store write at the end, and writes
17
+ the store compactly instead of pretty-printed. The per-sweep cost drops from
18
+ "once per commitment" to "once per sweep".
19
+
20
+ ## What to Tell Your User
21
+
22
+ If your agent ever became briefly unresponsive on a regular cadence — health checks
23
+ failing, the server restarting itself — and you had accumulated a lot of tracked
24
+ commitments, this removes the cause. Nothing changes in how commitments work or what
25
+ gets saved; the agent just stops doing hundreds of redundant full-file saves each
26
+ minute. No action needed.
27
+
28
+ ## Summary of New Capabilities
29
+
30
+ No new user-facing capability — this is a performance/reliability fix. The commitments
31
+ store is now persisted once per verification sweep (was once per mutated commitment),
32
+ and saved compactly. Existing agents get it via the normal update; the on-disk store
33
+ format is unchanged (still a JSON object, just not pretty-printed).
34
+
35
+ ## Evidence
36
+
37
+ - New unit test `tests/unit/CommitmentTracker-verify-batches-saves.test.ts`: a sweep
38
+ over 40 mutated commitments produces exactly **1** store write (was 40); a lone mutate
39
+ outside a sweep still persists immediately.
40
+ - Live diagnosis on Echo (2026-06-21): a `JSON.stringify` tracer captured
41
+ `verify → verifyOne → mutateSync → saveStore` re-serializing the 1.6MB store
42
+ repeatedly within one sweep; after the fix the per-sweep write count is 1 and the
43
+ multi-minute event-loop freezes shortened.
44
+
45
+ ## What Changed (DegradationReporter reentrancy — same incident)
46
+
47
+ The "something degraded" reporter could feed itself into an infinite loop: reporting a
48
+ degradation runs a small AI "tone gate" to phrase the alert nicely, but that gate goes through
49
+ the same router that just degraded — so if a configured tool is missing, the gate degrades
50
+ again, which reports again, forever. The growing internal events list, serialized each cycle,
51
+ froze the agent for minutes (the restart "flapping"). Fixed with a reentrancy guard (the gate
52
+ won't run inside itself) plus a hard cap on the events list. Degradations are still logged and
53
+ alerted; the agent just no longer melts down when a configured framework isn't installed.
@@ -0,0 +1,109 @@
1
+ # Side-Effects Review — CommitmentTracker.verify() batches store saves (event-loop wedge fix)
2
+
3
+ **Version / slug:** `commitment-tracker-verify-batches-saves`
4
+ **Date:** `2026-06-21`
5
+ **Author:** Echo (autonomous)
6
+ **Second-pass reviewer:** required (touches a core monitoring write path on every agent)
7
+
8
+ ## Summary of the change
9
+
10
+ `CommitmentTracker.verify()` runs on a 60-second timer. It iterates every *active*
11
+ commitment and mutates each via `mutateSync()`, and **every** `mutateSync()` calls
12
+ `saveStore()`, which does `JSON.stringify(this.store, null, 2)` of the **entire**
13
+ commitments store. With a large store (observed live on Echo: **1.6MB, 1,724
14
+ commitments**, 1,137 of them terminal/never-pruned) and N active commitments, that is
15
+ **O(N) full-store serializations per sweep** — hundreds of 1.6MB pretty-printed
16
+ serializations every 60s. This monopolized the single event-loop thread for **minutes**:
17
+ `/health` returned HTTP 000, and an external watchdog SIGKILL/respawn loop ensued
18
+ (diagnosed 2026-06-21 via a `JSON.stringify` entry-tracer that caught the
19
+ `verify → verifyOne → mutateSync → saveStore` stack firing repeatedly in one sweep).
20
+
21
+ The fix:
22
+ 1. **Batch the sweep's writes.** `verify()` sets a `batchingSaves` flag for the duration
23
+ of its (fully synchronous) sweep; while set, `saveStore()` marks the store dirty and
24
+ returns instead of writing. The sweep flushes **exactly one** write at the end. This
25
+ collapses O(N) serializations to 1 per sweep. Proven by a new unit test: 40 mutated
26
+ commitments → 1 store write (was 40).
27
+ 2. **Compact JSON.** `JSON.stringify(this.store)` (drop `, null, 2`) — the store is a
28
+ machine-read state file; pretty-printing ~1.6MB was pure serialization + I/O overhead.
29
+
30
+ ## Decision-point inventory
31
+
32
+ - **Batch scope = the verify() sweep only.** A lone `mutateSync()` outside `verify()`
33
+ (e.g. from PresenceProxy / PromiseBeacon / a route) still persists immediately —
34
+ batching is sweep-scoped, asserted by a second unit test. Chosen because `verify()` is
35
+ the only O(N) caller; broadening batching would risk a non-sweep mutation not landing.
36
+ - **Safety of deferral.** `verify()` is fully synchronous (no `await` between mutations;
37
+ `verifyConfigChange`/`verifyBehavioral` use `readFileSync`), so the event loop never
38
+ turns during the deferred window → no concurrent write path can observe or interleave.
39
+ A crash mid-sweep loses only the in-memory mutations of that sweep, which the next
40
+ idempotent sweep re-derives — strictly no worse than the prior per-mutation writes.
41
+ - **Compact vs pretty.** Compact chosen; `loadStore()` parses with `JSON.parse` (format
42
+ agnostic), and the replication peer reader parses the same way. No human/tool consumes
43
+ the file as formatted text.
44
+ - **NOT in scope (tracked follow-up):** pruning terminal commitments to bound store
45
+ growth. The batch+compact fix removes the wedge regardless of store size; pruning
46
+ interacts with the P1.5 replication incarnation/seq machinery and deserves its own
47
+ reviewed change.
48
+
49
+ ## Roll-up across the seven review dimensions
50
+
51
+ - **Security:** none — no new inputs, no auth/credential surface, no external I/O change.
52
+ - **Scalability:** the entire point — per-sweep cost goes from O(N × storeSize) to
53
+ O(storeSize). Removes a fleet-wide event-loop-freeze class as commitment stores grow.
54
+ - **Adversarial:** the deferred-save flag is process-local and reset in a `finally`; a
55
+ thrown error inside the sweep still flushes and clears the flag.
56
+ - **Integration:** `saveStore()` and `verify()` are internal; the only behavioral change
57
+ is *fewer* identical writes. The store's on-disk shape is unchanged (still the same
58
+ JSON object, just compact).
59
+ - **Reliability:** one atomic write per sweep instead of N — fewer fsync/rename cycles,
60
+ less chance of a partial-write window.
61
+ - **Observability:** unchanged (the `verification` event still emits post-flush).
62
+ - **Migration parity:** pure code path; no installed-file/config/CLAUDE.md change, so no
63
+ PostUpdateMigrator entry needed. Existing agents get it via the normal dist update.
64
+
65
+ ## Evidence pointers
66
+
67
+ - New test: `tests/unit/CommitmentTracker-verify-batches-saves.test.ts` (2 cases) — green.
68
+ Asserts 1 store write per sweep over 40 mutated commitments, and immediate persist for a
69
+ lone mutate.
70
+ - Live diagnosis: a `JSON.stringify` tracer on Echo's server captured the
71
+ `CommitmentTracker.saveStore` stack firing repeatedly from `verify()`'s timer; the store
72
+ was 1.6MB / 1,724 commitments. Post-hotfix the per-sweep write count dropped to 1 and the
73
+ 4+ minute freezes shortened.
74
+
75
+ ---
76
+
77
+ # Side-Effects Review — DegradationReporter reentrancy wedge (same incident)
78
+
79
+ **Added 2026-06-21** — the dominant event-loop wedge from the same live investigation.
80
+
81
+ ## Summary
82
+ `DegradationReporter.gateHealthAlert()` runs `toneGate.review()` — an LLM call routed through
83
+ the IntelligenceRouter. When the configured framework is unavailable the router DEGRADES, and
84
+ that degradation re-enters `report → reportEvent → gateHealthAlert` in the same synchronous
85
+ stack — unbounded recursion. Each level pushes another event; a `JSON.stringify` of the growing
86
+ `events` array eventually hangs the single event-loop thread for minutes (observed live: /health
87
+ HTTP 000, watchdog SIGKILL/respawn loop — the dominant cause of Echo's flapping).
88
+
89
+ ## The change
90
+ 1. **Reentrancy guard** (`_gatingHealthAlert`): `gateHealthAlert` refuses to gate-within-a-gate,
91
+ returning the safe template instead of recursing. Breaks the cycle regardless of which
92
+ framework degrades.
93
+ 2. **Bounded `events` array** (`MAX_EVENTS = 500`): defence in depth — the in-memory array can
94
+ never grow without limit, so whole-array serializations stay cheap.
95
+
96
+ ## Roll-up
97
+ - **Security/Integration/Migration:** none — internal monitoring path; on-disk/event shapes
98
+ unchanged; degradations are still logged and alerted.
99
+ - **Reliability:** the entire point — removes a fleet-wide event-loop-freeze class. Any agent
100
+ with an unavailable configured framework would hit this.
101
+ - **Adversarial:** the guard flag is reset in a `finally`; a throw inside the gate still clears it.
102
+
103
+ ## Evidence
104
+ - `tests/unit/degradation-reporter-reentrancy-wedge.test.ts` (3 cases): the guard short-circuits
105
+ the gate while already gating; a re-entrant tone gate stays bounded (doesn't hang); the events
106
+ array is capped at 500. All green.
107
+ - Live: captured the hung `JSON.stringify` stack via a write-on-entry/clear-on-return catcher
108
+ (the call never returns, so profilers can't flush); post-fix verification showed 0 CPU-wedges,
109
+ 0 watchdog SIGKILLs, 200s continuous healthy (was flapping every ~3 min).