instar 1.3.43 → 1.3.44

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 (99) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +292 -3
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/HandoffReceiver.d.ts +56 -0
  5. package/dist/core/HandoffReceiver.d.ts.map +1 -0
  6. package/dist/core/HandoffReceiver.js +103 -0
  7. package/dist/core/HandoffReceiver.js.map +1 -0
  8. package/dist/core/HandoffWireTransport.d.ts +61 -0
  9. package/dist/core/HandoffWireTransport.d.ts.map +1 -0
  10. package/dist/core/HandoffWireTransport.js +114 -0
  11. package/dist/core/HandoffWireTransport.js.map +1 -0
  12. package/dist/core/HttpLeaseTransport.d.ts +68 -0
  13. package/dist/core/HttpLeaseTransport.d.ts.map +1 -0
  14. package/dist/core/HttpLeaseTransport.js +97 -0
  15. package/dist/core/HttpLeaseTransport.js.map +1 -0
  16. package/dist/core/HttpLiveTailTransport.d.ts +88 -0
  17. package/dist/core/HttpLiveTailTransport.d.ts.map +1 -0
  18. package/dist/core/HttpLiveTailTransport.js +95 -0
  19. package/dist/core/HttpLiveTailTransport.js.map +1 -0
  20. package/dist/core/LeaseCoordinator.d.ts +14 -0
  21. package/dist/core/LeaseCoordinator.d.ts.map +1 -1
  22. package/dist/core/LeaseCoordinator.js +38 -0
  23. package/dist/core/LeaseCoordinator.js.map +1 -1
  24. package/dist/core/LiveTailSource.d.ts +65 -0
  25. package/dist/core/LiveTailSource.d.ts.map +1 -0
  26. package/dist/core/LiveTailSource.js +87 -0
  27. package/dist/core/LiveTailSource.js.map +1 -0
  28. package/dist/core/MultiMachineCoordinator.d.ts +14 -0
  29. package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
  30. package/dist/core/MultiMachineCoordinator.js +22 -0
  31. package/dist/core/MultiMachineCoordinator.js.map +1 -1
  32. package/dist/core/ReplyMarkerTransport.d.ts +58 -0
  33. package/dist/core/ReplyMarkerTransport.d.ts.map +1 -0
  34. package/dist/core/ReplyMarkerTransport.js +66 -0
  35. package/dist/core/ReplyMarkerTransport.js.map +1 -0
  36. package/dist/core/handoffReceiverWiring.d.ts +57 -0
  37. package/dist/core/handoffReceiverWiring.d.ts.map +1 -0
  38. package/dist/core/handoffReceiverWiring.js +65 -0
  39. package/dist/core/handoffReceiverWiring.js.map +1 -0
  40. package/dist/core/handoffSentinelBootWiring.d.ts +53 -0
  41. package/dist/core/handoffSentinelBootWiring.d.ts.map +1 -0
  42. package/dist/core/handoffSentinelBootWiring.js +52 -0
  43. package/dist/core/handoffSentinelBootWiring.js.map +1 -0
  44. package/dist/core/handoffSentinelWiring.d.ts +60 -0
  45. package/dist/core/handoffSentinelWiring.d.ts.map +1 -0
  46. package/dist/core/handoffSentinelWiring.js +59 -0
  47. package/dist/core/handoffSentinelWiring.js.map +1 -0
  48. package/dist/core/seamlessnessConfig.d.ts +8 -0
  49. package/dist/core/seamlessnessConfig.d.ts.map +1 -1
  50. package/dist/core/seamlessnessConfig.js +1 -0
  51. package/dist/core/seamlessnessConfig.js.map +1 -1
  52. package/dist/core/types.d.ts +6 -0
  53. package/dist/core/types.d.ts.map +1 -1
  54. package/dist/core/types.js.map +1 -1
  55. package/dist/messaging/TelegramAdapter.d.ts +6 -0
  56. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  57. package/dist/messaging/TelegramAdapter.js +8 -0
  58. package/dist/messaging/TelegramAdapter.js.map +1 -1
  59. package/dist/messaging/ingressDedup.d.ts +55 -0
  60. package/dist/messaging/ingressDedup.d.ts.map +1 -0
  61. package/dist/messaging/ingressDedup.js +69 -0
  62. package/dist/messaging/ingressDedup.js.map +1 -0
  63. package/dist/messaging/stuckMessageRecovery.d.ts +46 -0
  64. package/dist/messaging/stuckMessageRecovery.d.ts.map +1 -0
  65. package/dist/messaging/stuckMessageRecovery.js +52 -0
  66. package/dist/messaging/stuckMessageRecovery.js.map +1 -0
  67. package/dist/server/AgentServer.d.ts +64 -0
  68. package/dist/server/AgentServer.d.ts.map +1 -1
  69. package/dist/server/AgentServer.js +24 -0
  70. package/dist/server/AgentServer.js.map +1 -1
  71. package/dist/server/handoffInitiateRoutes.d.ts +40 -0
  72. package/dist/server/handoffInitiateRoutes.d.ts.map +1 -0
  73. package/dist/server/handoffInitiateRoutes.js +57 -0
  74. package/dist/server/handoffInitiateRoutes.js.map +1 -0
  75. package/dist/server/machineRoutes.d.ts +47 -0
  76. package/dist/server/machineRoutes.d.ts.map +1 -1
  77. package/dist/server/machineRoutes.js +138 -0
  78. package/dist/server/machineRoutes.js.map +1 -1
  79. package/dist/server/routes.d.ts +20 -0
  80. package/dist/server/routes.d.ts.map +1 -1
  81. package/dist/server/routes.js +65 -0
  82. package/dist/server/routes.js.map +1 -1
  83. package/package.json +1 -1
  84. package/src/data/builtin-manifest.json +49 -49
  85. package/upgrades/1.3.44.md +72 -0
  86. package/upgrades/side-effects/cross-machine-seamlessness-consent-acquire.md +52 -0
  87. package/upgrades/side-effects/cross-machine-seamlessness-exactly-once-ingress.md +73 -0
  88. package/upgrades/side-effects/cross-machine-seamlessness-handoff-ack-yield.md +82 -0
  89. package/upgrades/side-effects/cross-machine-seamlessness-handoff-begin.md +48 -0
  90. package/upgrades/side-effects/cross-machine-seamlessness-handoff-boot-wiring.md +68 -0
  91. package/upgrades/side-effects/cross-machine-seamlessness-handoff-receiver-wiring.md +52 -0
  92. package/upgrades/side-effects/cross-machine-seamlessness-handoff-receiver.md +46 -0
  93. package/upgrades/side-effects/cross-machine-seamlessness-handoff-sentinel-wiring.md +47 -0
  94. package/upgrades/side-effects/cross-machine-seamlessness-lease-wire.md +46 -0
  95. package/upgrades/side-effects/cross-machine-seamlessness-livetail-source.md +50 -0
  96. package/upgrades/side-effects/cross-machine-seamlessness-livetail-streaming.md +50 -0
  97. package/upgrades/side-effects/cross-machine-seamlessness-livetail-wire.md +65 -0
  98. package/upgrades/side-effects/cross-machine-seamlessness-noloss-recovery.md +61 -0
  99. package/upgrades/side-effects/cross-machine-seamlessness-reply-marker.md +65 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.43",
3
+ "version": "1.3.44",
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-05-28T01:24:38.781Z",
5
- "instarVersion": "1.3.43",
4
+ "generatedAt": "2026-05-28T01:59:27.143Z",
5
+ "instarVersion": "1.3.44",
6
6
  "entryCount": 193,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -409,7 +409,7 @@
409
409
  "type": "route-group",
410
410
  "domain": "monitoring",
411
411
  "sourcePath": "src/server/routes.ts",
412
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
412
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
413
413
  "since": "2025-01-01"
414
414
  },
415
415
  "route-group:agents": {
@@ -417,7 +417,7 @@
417
417
  "type": "route-group",
418
418
  "domain": "sessions",
419
419
  "sourcePath": "src/server/routes.ts",
420
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
420
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
421
421
  "since": "2025-01-01"
422
422
  },
423
423
  "route-group:backups": {
@@ -425,7 +425,7 @@
425
425
  "type": "route-group",
426
426
  "domain": "operations",
427
427
  "sourcePath": "src/server/routes.ts",
428
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
428
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
429
429
  "since": "2025-01-01"
430
430
  },
431
431
  "route-group:git": {
@@ -433,7 +433,7 @@
433
433
  "type": "route-group",
434
434
  "domain": "coordination",
435
435
  "sourcePath": "src/server/routes.ts",
436
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
436
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
437
437
  "since": "2025-01-01"
438
438
  },
439
439
  "route-group:memory": {
@@ -441,7 +441,7 @@
441
441
  "type": "route-group",
442
442
  "domain": "memory",
443
443
  "sourcePath": "src/server/routes.ts",
444
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
444
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
445
445
  "since": "2025-01-01"
446
446
  },
447
447
  "route-group:semantic": {
@@ -449,7 +449,7 @@
449
449
  "type": "route-group",
450
450
  "domain": "memory",
451
451
  "sourcePath": "src/server/routes.ts",
452
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
452
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
453
453
  "since": "2025-01-01"
454
454
  },
455
455
  "route-group:status": {
@@ -457,7 +457,7 @@
457
457
  "type": "route-group",
458
458
  "domain": "monitoring",
459
459
  "sourcePath": "src/server/routes.ts",
460
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
460
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
461
461
  "since": "2025-01-01"
462
462
  },
463
463
  "route-group:capabilities": {
@@ -465,7 +465,7 @@
465
465
  "type": "route-group",
466
466
  "domain": "mapping",
467
467
  "sourcePath": "src/server/routes.ts",
468
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
468
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
469
469
  "since": "2025-01-01"
470
470
  },
471
471
  "route-group:project-map": {
@@ -473,7 +473,7 @@
473
473
  "type": "route-group",
474
474
  "domain": "mapping",
475
475
  "sourcePath": "src/server/routes.ts",
476
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
476
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
477
477
  "since": "2025-01-01"
478
478
  },
479
479
  "route-group:coherence": {
@@ -481,7 +481,7 @@
481
481
  "type": "route-group",
482
482
  "domain": "coherence",
483
483
  "sourcePath": "src/server/routes.ts",
484
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
484
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
485
485
  "since": "2025-01-01"
486
486
  },
487
487
  "route-group:topic-bindings": {
@@ -489,7 +489,7 @@
489
489
  "type": "route-group",
490
490
  "domain": "sessions",
491
491
  "sourcePath": "src/server/routes.ts",
492
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
492
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
493
493
  "since": "2025-01-01"
494
494
  },
495
495
  "route-group:context": {
@@ -497,7 +497,7 @@
497
497
  "type": "route-group",
498
498
  "domain": "context",
499
499
  "sourcePath": "src/server/routes.ts",
500
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
500
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
501
501
  "since": "2025-01-01"
502
502
  },
503
503
  "route-group:scope-coherence": {
@@ -505,7 +505,7 @@
505
505
  "type": "route-group",
506
506
  "domain": "coherence",
507
507
  "sourcePath": "src/server/routes.ts",
508
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
508
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
509
509
  "since": "2025-01-01"
510
510
  },
511
511
  "route-group:canonical-state": {
@@ -513,7 +513,7 @@
513
513
  "type": "route-group",
514
514
  "domain": "state",
515
515
  "sourcePath": "src/server/routes.ts",
516
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
516
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
517
517
  "since": "2025-01-01"
518
518
  },
519
519
  "route-group:ci": {
@@ -521,7 +521,7 @@
521
521
  "type": "route-group",
522
522
  "domain": "monitoring",
523
523
  "sourcePath": "src/server/routes.ts",
524
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
524
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
525
525
  "since": "2025-01-01"
526
526
  },
527
527
  "route-group:sessions": {
@@ -529,7 +529,7 @@
529
529
  "type": "route-group",
530
530
  "domain": "sessions",
531
531
  "sourcePath": "src/server/routes.ts",
532
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
532
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
533
533
  "since": "2025-01-01"
534
534
  },
535
535
  "route-group:jobs": {
@@ -537,7 +537,7 @@
537
537
  "type": "route-group",
538
538
  "domain": "scheduling",
539
539
  "sourcePath": "src/server/routes.ts",
540
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
540
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
541
541
  "since": "2025-01-01"
542
542
  },
543
543
  "route-group:skip-ledger": {
@@ -545,7 +545,7 @@
545
545
  "type": "route-group",
546
546
  "domain": "scheduling",
547
547
  "sourcePath": "src/server/routes.ts",
548
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
548
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
549
549
  "since": "2025-01-01"
550
550
  },
551
551
  "route-group:telegram": {
@@ -553,7 +553,7 @@
553
553
  "type": "route-group",
554
554
  "domain": "communication",
555
555
  "sourcePath": "src/server/routes.ts",
556
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
556
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
557
557
  "since": "2025-01-01"
558
558
  },
559
559
  "route-group:attention": {
@@ -561,7 +561,7 @@
561
561
  "type": "route-group",
562
562
  "domain": "communication",
563
563
  "sourcePath": "src/server/routes.ts",
564
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
564
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
565
565
  "since": "2025-01-01"
566
566
  },
567
567
  "route-group:relationships": {
@@ -569,7 +569,7 @@
569
569
  "type": "route-group",
570
570
  "domain": "relationships",
571
571
  "sourcePath": "src/server/routes.ts",
572
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
572
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
573
573
  "since": "2025-01-01"
574
574
  },
575
575
  "route-group:feedback": {
@@ -577,7 +577,7 @@
577
577
  "type": "route-group",
578
578
  "domain": "feedback",
579
579
  "sourcePath": "src/server/routes.ts",
580
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
580
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
581
581
  "since": "2025-01-01"
582
582
  },
583
583
  "route-group:updates": {
@@ -585,7 +585,7 @@
585
585
  "type": "route-group",
586
586
  "domain": "updates",
587
587
  "sourcePath": "src/server/routes.ts",
588
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
588
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
589
589
  "since": "2025-01-01"
590
590
  },
591
591
  "route-group:dispatches": {
@@ -593,7 +593,7 @@
593
593
  "type": "route-group",
594
594
  "domain": "dispatches",
595
595
  "sourcePath": "src/server/routes.ts",
596
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
596
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
597
597
  "since": "2025-01-01"
598
598
  },
599
599
  "route-group:quota": {
@@ -601,7 +601,7 @@
601
601
  "type": "route-group",
602
602
  "domain": "monitoring",
603
603
  "sourcePath": "src/server/routes.ts",
604
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
604
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
605
605
  "since": "2025-01-01"
606
606
  },
607
607
  "route-group:publishing": {
@@ -609,7 +609,7 @@
609
609
  "type": "route-group",
610
610
  "domain": "publishing",
611
611
  "sourcePath": "src/server/routes.ts",
612
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
612
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
613
613
  "since": "2025-01-01"
614
614
  },
615
615
  "route-group:private-views": {
@@ -617,7 +617,7 @@
617
617
  "type": "route-group",
618
618
  "domain": "publishing",
619
619
  "sourcePath": "src/server/routes.ts",
620
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
620
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
621
621
  "since": "2025-01-01"
622
622
  },
623
623
  "route-group:tunnel": {
@@ -625,7 +625,7 @@
625
625
  "type": "route-group",
626
626
  "domain": "networking",
627
627
  "sourcePath": "src/server/routes.ts",
628
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
628
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
629
629
  "since": "2025-01-01"
630
630
  },
631
631
  "route-group:events": {
@@ -633,7 +633,7 @@
633
633
  "type": "route-group",
634
634
  "domain": "networking",
635
635
  "sourcePath": "src/server/routes.ts",
636
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
636
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
637
637
  "since": "2025-01-01"
638
638
  },
639
639
  "route-group:evolution": {
@@ -641,7 +641,7 @@
641
641
  "type": "route-group",
642
642
  "domain": "evolution",
643
643
  "sourcePath": "src/server/routes.ts",
644
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
644
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
645
645
  "since": "2025-01-01"
646
646
  },
647
647
  "route-group:watchdog": {
@@ -649,7 +649,7 @@
649
649
  "type": "route-group",
650
650
  "domain": "monitoring",
651
651
  "sourcePath": "src/server/routes.ts",
652
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
652
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
653
653
  "since": "2025-01-01"
654
654
  },
655
655
  "route-group:topic-memory": {
@@ -657,7 +657,7 @@
657
657
  "type": "route-group",
658
658
  "domain": "memory",
659
659
  "sourcePath": "src/server/routes.ts",
660
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
660
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
661
661
  "since": "2025-01-01"
662
662
  },
663
663
  "route-group:state-sync": {
@@ -665,7 +665,7 @@
665
665
  "type": "route-group",
666
666
  "domain": "coordination",
667
667
  "sourcePath": "src/server/routes.ts",
668
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
668
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
669
669
  "since": "2025-01-01"
670
670
  },
671
671
  "route-group:intent": {
@@ -673,7 +673,7 @@
673
673
  "type": "route-group",
674
674
  "domain": "intent",
675
675
  "sourcePath": "src/server/routes.ts",
676
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
676
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
677
677
  "since": "2025-01-01"
678
678
  },
679
679
  "route-group:triage": {
@@ -681,7 +681,7 @@
681
681
  "type": "route-group",
682
682
  "domain": "safety",
683
683
  "sourcePath": "src/server/routes.ts",
684
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
684
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
685
685
  "since": "2025-01-01"
686
686
  },
687
687
  "route-group:operations": {
@@ -689,7 +689,7 @@
689
689
  "type": "route-group",
690
690
  "domain": "safety",
691
691
  "sourcePath": "src/server/routes.ts",
692
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
692
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
693
693
  "since": "2025-01-01"
694
694
  },
695
695
  "route-group:sentinel": {
@@ -697,7 +697,7 @@
697
697
  "type": "route-group",
698
698
  "domain": "safety",
699
699
  "sourcePath": "src/server/routes.ts",
700
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
700
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
701
701
  "since": "2025-01-01"
702
702
  },
703
703
  "route-group:trust": {
@@ -705,7 +705,7 @@
705
705
  "type": "route-group",
706
706
  "domain": "safety",
707
707
  "sourcePath": "src/server/routes.ts",
708
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
708
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
709
709
  "since": "2025-01-01"
710
710
  },
711
711
  "route-group:monitoring": {
@@ -713,7 +713,7 @@
713
713
  "type": "route-group",
714
714
  "domain": "monitoring",
715
715
  "sourcePath": "src/server/routes.ts",
716
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
716
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
717
717
  "since": "2025-01-01"
718
718
  },
719
719
  "route-group:commitments": {
@@ -721,7 +721,7 @@
721
721
  "type": "route-group",
722
722
  "domain": "commitments",
723
723
  "sourcePath": "src/server/routes.ts",
724
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
724
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
725
725
  "since": "2025-01-01"
726
726
  },
727
727
  "route-group:episodes": {
@@ -729,7 +729,7 @@
729
729
  "type": "route-group",
730
730
  "domain": "memory",
731
731
  "sourcePath": "src/server/routes.ts",
732
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
732
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
733
733
  "since": "2025-01-01"
734
734
  },
735
735
  "route-group:messages": {
@@ -737,7 +737,7 @@
737
737
  "type": "route-group",
738
738
  "domain": "coordination",
739
739
  "sourcePath": "src/server/routes.ts",
740
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
740
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
741
741
  "since": "2025-01-01"
742
742
  },
743
743
  "route-group:system-reviews": {
@@ -745,7 +745,7 @@
745
745
  "type": "route-group",
746
746
  "domain": "monitoring",
747
747
  "sourcePath": "src/server/routes.ts",
748
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
748
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
749
749
  "since": "2025-01-01"
750
750
  },
751
751
  "route-group:machine-mesh": {
@@ -753,7 +753,7 @@
753
753
  "type": "route-group",
754
754
  "domain": "coordination",
755
755
  "sourcePath": "src/server/machineRoutes.ts",
756
- "contentHash": "5bd048aabb524e50a9f2808e4e0400ae728f5e36797e5850eff4ff7aae7921f9",
756
+ "contentHash": "b8a789fea855d5e45cffc3ffaea6fcf3c04d4cbb39b3097a1590ee76ccc5378b",
757
757
  "since": "2025-01-01"
758
758
  },
759
759
  "route-group:secret-drop": {
@@ -761,7 +761,7 @@
761
761
  "type": "route-group",
762
762
  "domain": "security",
763
763
  "sourcePath": "src/server/routes.ts",
764
- "contentHash": "d6cc32ccd33508137b7c33451cea0c9f0d29eda5fd13456743133c0c50a955ed",
764
+ "contentHash": "8c1ca53475ef9ebe286fcdc8a4bbf5a46e0503b242dfa1040685e15ea0eea830",
765
765
  "since": "2025-01-01"
766
766
  },
767
767
  "cli:init": {
@@ -1457,7 +1457,7 @@
1457
1457
  "type": "subsystem",
1458
1458
  "domain": "server",
1459
1459
  "sourcePath": "src/server/AgentServer.ts",
1460
- "contentHash": "d97b98638cccf4bd66b46d2d49615a5f5a416eebddf6bcae7ab3473800f02990",
1460
+ "contentHash": "678de8d250b39e3b7bf4470d1e8b7d6290791d0595fea7686f4bd8347b2b92bd",
1461
1461
  "since": "2025-01-01"
1462
1462
  },
1463
1463
  "subsystem:session-manager": {
@@ -1545,7 +1545,7 @@
1545
1545
  "type": "subsystem",
1546
1546
  "domain": "coordination",
1547
1547
  "sourcePath": "src/core/MultiMachineCoordinator.ts",
1548
- "contentHash": "48c59a44dc01c3f3e5f7e4579b623515f95b8751649e51b8f840eea5b45e1869",
1548
+ "contentHash": "f0ad105ab4996bb6d14d2c836430fb6f7c8b7adab512c6a21c03bd5f029d8d3b",
1549
1549
  "since": "2025-01-01"
1550
1550
  },
1551
1551
  "subsystem:backup-manager": {
@@ -0,0 +1,72 @@
1
+ # Instar Upgrade Guide — NEXT
2
+
3
+ <!-- bump: patch -->
4
+
5
+ ## What Changed
6
+
7
+ **Cross-machine seamlessness — full wiring landed (mostly dark).** The integration
8
+ follow-on to PR #419. #419 shipped the seamlessness *components* (G1 fenced lease,
9
+ G2 auto-sync, G3 ledger/outbox/live-tail/HandoffSentinel logic) unit-tested but
10
+ not wired into the live path. PR #428 wires them in — the machine-to-machine
11
+ "phone line", the handoff conductor, and the exactly-once message guarantee — and
12
+ proves each end-to-end. Single-machine agents are completely unaffected: every new
13
+ component is gated on a multi-machine mesh + lease holder + (where flagged) an
14
+ explicit opt-in config flag.
15
+
16
+ What's now LIVE on every install (not flag-gated, but no-op on a solo agent):
17
+
18
+ - **Lease wire transport** — `HttpLeaseTransport` + `POST /api/lease` route, into
19
+ `LeaseCoordinator`. Single-machine no-op (no peers).
20
+ - **Live-tail streaming** — holder pushes the encrypted conversation tail to the
21
+ standby on a cadence (`LiveTailSource` → `HttpLiveTailTransport` → receiver
22
+ `LiveTailBuffer`); redaction-before-encryption; only the lease holder streams.
23
+ - **Handoff conductor** — `HandoffSentinel` (outgoing) + `HandoffReceiver`
24
+ (incoming) bolted into server boot; `POST /api/handoff/{begin,ack,yield}`
25
+ (signed) + `POST /handoff/initiate` (operator trigger). The lease is **never
26
+ yielded** unless the incoming machine's echo verifies AND validation passes —
27
+ proven over two real booted servers (caught-up → handed-off; divergent → aborts
28
+ and stays awake = no two-captains).
29
+
30
+ What's DARK (behind `multiMachine.exactlyOnceIngress`, off by default until a live
31
+ two-machine test-as-self confirms no false-drops on the most critical path):
32
+
33
+ - **Exactly-once ingress ledger** — `MessageProcessingLedger` for inbound dedup +
34
+ outbound `FencedOutbox` for reply commit, plus `ReplyMarkerTransport` propagating
35
+ the `reply_committed` marker to standby peers so a post-handoff redelivery can't
36
+ re-send a reply the old holder already committed.
37
+
38
+ Architecture documentation added: `site/src/content/docs/features/multi-machine.md`
39
+ gains a "Seamlessness Architecture (Components)" section grouping the 14 new classes
40
+ by role (coordination, planned handoff, live-tail streaming, exactly-once delivery,
41
+ update coordination).
42
+
43
+ ## What to Tell Your User
44
+
45
+ - The seamlessness wiring you've been hearing about is now landed — your laptop and a
46
+ second machine (when you have one) can take turns being the awake agent without
47
+ losing the conversation. On a solo setup nothing changes; this is groundwork.
48
+ - The trickiest part — making sure a reply never goes out twice during a hand-off —
49
+ is wired but turned off by default until I've live-tested it on two real machines.
50
+ - A new architecture doc page explains the components in plain English if you ever
51
+ want a tour: Multi-Machine → Seamlessness Architecture.
52
+
53
+ ## Summary of New Capabilities
54
+
55
+ | Capability | How to Use |
56
+ |-----------|-----------|
57
+ | `POST /api/lease` | Low-latency lease transport between mesh peers (server-to-server, signed). Solo agents see no traffic. |
58
+ | `POST /api/handoff/{begin,ack,yield}` | Planned-handoff protocol endpoints (signed, machine-to-machine). |
59
+ | `POST /handoff/initiate` | Operator trigger: gracefully hand the awake role to a specific peer. |
60
+ | `multiMachine.exactlyOnceIngress` (config flag, default off) | Enables the inbound-dedup + reply-commit guarantee. Flip on only after a two-machine live test confirms no false-drops. |
61
+ | Multi-Machine doc: Seamlessness Architecture | New section in `site/src/content/docs/features/multi-machine.md` — names each component, groups by role. |
62
+
63
+ ## Evidence
64
+
65
+ **Integration follow-on, mostly wiring + boot glue.** All component logic was
66
+ unit-tested in #419; this PR adds the live-path wiring with paired wiring-integrity
67
+ tests for each bolt-in. Two real booted servers exercised the handoff protocol
68
+ (caught-up → handed-off; divergent → aborts and stays awake). Single-conflict merge
69
+ of main into the branch (only `src/commands/server.ts`, in the AgentServer
70
+ constructor call — both sides added new components; resolution kept all and merged
71
+ the field list). `tsc --noEmit` clean post-merge. Docs-coverage class floor cleared
72
+ (54% → 56%, > 55% floor).
@@ -0,0 +1,52 @@
1
+ # Side-Effects Review — Cross-Machine Seamlessness: consented lease acquire (planned handoff)
2
+
3
+ **Spec:** docs/specs/CROSS-MACHINE-SEAMLESSNESS-SPEC.md §8 G3e (converged, approved)
4
+
5
+ The lease primitive a PLANNED handoff needs: the incoming machine takes the lease
6
+ while the outgoing is still alive, which the liveness-gated `acquireIfEligible()`
7
+ correctly refuses. Added as an ADDITIVE consent path — the split-brain-critical
8
+ `canAcquire()` gate (hardware-verified for G1) is deliberately left untouched.
9
+
10
+ ## What changed
11
+ - `src/core/LeaseCoordinator.ts` — NEW `acquireOnConsent(yieldFromMachineId)`.
12
+ Bypasses the liveness `canAcquire()` gate (because the holder explicitly consented
13
+ via a verified yield), CAS-advances to epoch+1, broadcasts, emits the new epoch.
14
+ **Security guard:** if there is a current holder and it is NOT the yielding machine,
15
+ the acquire is REFUSED — a yield from any non-holder cannot trigger a takeover.
16
+ Already-ours → true (idempotent); empty lease → acquire.
17
+ - `src/core/MultiMachineCoordinator.ts` — NEW `acquireLeaseOnConsent(yieldFromMachineId)`:
18
+ the onYield entry point — delegates to the guarded consent path, then reconciles
19
+ role → awake on success.
20
+
21
+ ## Over-block / under-block
22
+ - The guard is the security boundary: only the CURRENT holder's yield grants the
23
+ takeover. Combined with the route's machineAuth (the yield came from an
24
+ authenticated machine), a forged or misdirected yield is doubly defeated.
25
+ - If the CAS is lost (someone already advanced), the consent acquire adopts the
26
+ observed epoch and stands down — no double-advance, no split-brain.
27
+ - The existing `acquireIfEligible()` / `canAcquire()` / `renew()` paths are byte-for-byte
28
+ UNCHANGED, so the hardware-verified G1 split-brain guarantee is preserved exactly. This
29
+ is purely additive surface reachable only from the handoff yield handler.
30
+
31
+ ## Signal vs authority
32
+ - This IS an authority mutation (it advances the lease epoch) — and it is correctly
33
+ gated: reachable only from the authenticated /api/handoff/yield handler, and only
34
+ when the yielding machine is the observed holder. The decision to yield (verified
35
+ ack + validation) lives upstream in HandoffSentinel.
36
+
37
+ ## Interactions
38
+ - Consumed (next integrating commit) by the /api/handoff/yield route's onYield handler:
39
+ `coordinator.acquireLeaseOnConsent(fromMachineId)`. The outgoing machine's HandoffSentinel
40
+ sends the yield only after a verified ack + passing validation, so by the time consent
41
+ reaches the incoming, the outgoing has committed to standing down.
42
+ - Mirrors the success path of acquireIfEligible (effectiveView → buildAcquisition → casWrite
43
+ → broadcast → emitEpoch), so behavior is consistent with the proven acquisition flow.
44
+
45
+ ## Rollback cost
46
+ - Minimal — two additive methods, no change to existing paths. Reverting removes them.
47
+
48
+ ## Tests
49
+ - `tests/unit/LeaseCoordinator.test.ts` (+4, 12 total): consent takes a LIVE peer-held
50
+ lease (the bypass) while the normal path refuses it; **SECURITY — a yield from a
51
+ non-holder is refused (no takeover)**; idempotent when already held; acquires from empty.
52
+ tsc clean.
@@ -0,0 +1,73 @@
1
+ # Side-Effects Review — Cross-Machine Seamlessness: exactly-once ingress gate (D, no-duplicate half)
2
+
3
+ **Spec:** docs/specs/CROSS-MACHINE-SEAMLESSNESS-SPEC.md §8 G3a (converged, approved)
4
+
5
+ Wires the MessageProcessingLedger into the live Telegram message path so a redelivered /
6
+ handoff-window-replayed inbound event is recognized and NOT answered twice. This is the
7
+ no-DUPLICATE-reply half of G3a. It ships DARK behind `multiMachine.exactlyOnceIngress`
8
+ (default false): when off, the message path is byte-for-byte unchanged.
9
+
10
+ ## What changed
11
+ - `src/messaging/ingressDedup.ts` — NEW. `decideIngress(ledger, dedupeKey, opts)` → process | drop
12
+ (records received → claims processing under the lease epoch; drops already-replied or
13
+ in-flight-not-stuck; re-claims a fenced-holder's stuck entry). `commitInboundReply(...)` →
14
+ reply_committed + cursor_advanced with the deterministic idempotency key. `dedupeKeyFor(...)`.
15
+ - `src/server/routes.ts` — INBOUND gate in `/internal/telegram-forward`, placed AFTER the
16
+ sentinel intercept (emergency-stop/pause must never be deduped) and BEFORE routing: on a
17
+ drop, returns `{ok:true,deduped:true}` without routing. OUTBOUND commit in
18
+ `/telegram/reply/:topicId` after a successful `sendToTopic`: commits the topic's current
19
+ inbound dedupeKey (skipped for proxy/system sends). Both FAIL-OPEN. Added `messageLedger` +
20
+ `currentInboundByTopic` to RouteContext.
21
+ - `src/server/AgentServer.ts` — `messageLedger?` + `currentInboundByTopic?` options → routeCtx.
22
+ - `src/commands/server.ts` — constructs the ledger + per-topic map ONLY when
23
+ `seamlessness.exactlyOnceIngress` (fail-open if open() throws → gate stays dark).
24
+ - `src/core/seamlessnessConfig.ts` + `src/core/types.ts` — `exactlyOnceIngress` flag (default false).
25
+ - `src/core/MultiMachineCoordinator.ts` — `getLeaseEpoch()` accessor (the ledger's fencing token).
26
+
27
+ ## Over-block / under-block
28
+ - UNDER-block (the dangerous direction = a real message silently dropped): mitigated three ways.
29
+ (1) The gate ONLY drops when the ledger shows the SAME dedupeKey already reply_committed/
30
+ cursor_advanced, or processing-and-not-stuck — never a first-seen event. Proven both sides in
31
+ ingress-dedup.test.ts + the integration test. (2) FAIL-OPEN: any ledger throw routes normally
32
+ (tested). (3) Ships DARK (flag default false) — zero behavior change until a live test-as-self
33
+ flips it on.
34
+ - OVER-block: a genuine NEW message is always `first-seen` → process. The dedupeKey is
35
+ `telegram:<topic>:<messageId>`, unique per user message, so two distinct messages never collide.
36
+ - dedupeKey uses Telegram `message_id` (already on the forward, stable across redeliveries and
37
+ across machines). The spec names `update_id`; message_id is the functional v1 key (gate falls
38
+ back to it). update_id threading is a tracked refinement. <!-- tracked: topic-13481 -->
39
+
40
+ ## Signal vs authority
41
+ - decideIngress returns a decision; the route is the single authority that drops/routes. The
42
+ ledger is durable record + fencing, not a gate of its own.
43
+
44
+ ## Interactions
45
+ - Placed after the sentinel intercept so "stop everything" is never deduped (wiring-integrity
46
+ test asserts gate index is between classify and onTopicMessage).
47
+ - Outbound commit skipped for `isProxy` sends (PresenceProxy etc. are not replies to a user
48
+ inbound) so it never falsely commits an unrelated topic.
49
+ - `currentInboundByTopic` is best-effort association (last claimed inbound per topic). Concurrent
50
+ inbounds for one topic before the first reply → the earlier one stays processing (eventually
51
+ reclaimable / replayed). Acceptable for v1, behind the flag.
52
+
53
+ ## NOT in this increment (tracked, topic-13481)
54
+ - **No-LOSS-on-crash replay** (re-inject un-committed entries on restart) — the other G3a half.
55
+ Without it, this increment is a strict IMPROVEMENT (adds dedup, no regression: a crash after
56
+ inject-before-reply loses the reply exactly as today). Next increment.
57
+ - Cross-machine `applyRemoteReplyMarker` propagation (tunnel+git) — the lease already ensures one
58
+ forwarder, so cross-machine double-handle is already prevented; this hardens the failover window.
59
+ - CONTINUATION resume verification (D3); update_id dedupeKey (vs message_id).
60
+
61
+ ## Rollback cost
62
+ - Low. Flag default-off ⇒ inert in production. Revert = drop the gate block + commit block + the
63
+ ledger construction; no migration, no persisted schema beyond the opt-in SQLite file. The route
64
+ returns to identical behavior when `messageLedger` is null.
65
+
66
+ ## Tests
67
+ - `tests/unit/ingress-dedup.test.ts` (8) — decision both sides: first-seen, in-flight drop,
68
+ already-replied drop, stuck re-claim, within-window no-reclaim; commit idempotent + deterministic key.
69
+ - `tests/integration/exactly-once-ingress.test.ts` (5) — gate through the REAL route + REAL ledger:
70
+ dark routes both, first routes + claims, in-flight dup dropped, already-replied dup dropped,
71
+ fail-open; + wiring-integrity (gate between sentinel and routing).
72
+ - `tests/e2e/exactly-once-ingress-e2e.test.ts` (1) — gate ALIVE in a real booted AgentServer:
73
+ already-replied redelivery → 200 + deduped over real HTTP, not routed.