instar 1.3.758 → 1.3.760

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 (43) hide show
  1. package/dist/commands/machine.d.ts.map +1 -1
  2. package/dist/commands/machine.js +28 -5
  3. package/dist/commands/machine.js.map +1 -1
  4. package/dist/commands/server.js +2 -2
  5. package/dist/commands/server.js.map +1 -1
  6. package/dist/core/LeaseCoordinator.d.ts +30 -0
  7. package/dist/core/LeaseCoordinator.d.ts.map +1 -1
  8. package/dist/core/LeaseCoordinator.js +45 -0
  9. package/dist/core/LeaseCoordinator.js.map +1 -1
  10. package/dist/core/MultiMachineCoordinator.d.ts +24 -5
  11. package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
  12. package/dist/core/MultiMachineCoordinator.js +58 -11
  13. package/dist/core/MultiMachineCoordinator.js.map +1 -1
  14. package/dist/core/PostUpdateMigrator.d.ts +15 -0
  15. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  16. package/dist/core/PostUpdateMigrator.js +45 -1
  17. package/dist/core/PostUpdateMigrator.js.map +1 -1
  18. package/dist/messaging/TelegramAdapter.d.ts +2 -0
  19. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  20. package/dist/messaging/TelegramAdapter.js +65 -25
  21. package/dist/messaging/TelegramAdapter.js.map +1 -1
  22. package/dist/scaffold/templates.js +1 -1
  23. package/dist/server/routes.d.ts.map +1 -1
  24. package/dist/server/routes.js +1 -0
  25. package/dist/server/routes.js.map +1 -1
  26. package/dist/testing/selfActionRegistry.d.ts +88 -0
  27. package/dist/testing/selfActionRegistry.d.ts.map +1 -0
  28. package/dist/testing/selfActionRegistry.js +202 -0
  29. package/dist/testing/selfActionRegistry.js.map +1 -0
  30. package/package.json +2 -2
  31. package/scripts/class-closure-declare.mjs +69 -4
  32. package/scripts/class-closure-lint.mjs +61 -5
  33. package/scripts/instar-dev-precommit.js +100 -2
  34. package/scripts/lib/self-action-detect.mjs +162 -0
  35. package/scripts/lint-no-unregistered-self-action.js +204 -0
  36. package/skills/instar-dev/templates/side-effects-artifact.md +8 -1
  37. package/src/data/builtin-manifest.json +64 -64
  38. package/src/scaffold/templates.ts +1 -1
  39. package/upgrades/{1.3.758.md → 1.3.759.md} +51 -0
  40. package/upgrades/1.3.760.md +100 -0
  41. package/upgrades/side-effects/machine-coherence-guard-5b-awake-count.md +105 -0
  42. package/upgrades/side-effects/self-action-convergence.md +62 -0
  43. package/upgrades/side-effects/telegram-conservatism-pass.md +83 -0
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-07-04T19:36:12.853Z",
5
- "instarVersion": "1.3.758",
4
+ "generatedAt": "2026-07-04T20:03:31.063Z",
5
+ "instarVersion": "1.3.760",
6
6
  "entryCount": 202,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -11,7 +11,7 @@
11
11
  "domain": "identity",
12
12
  "sourcePath": "src/core/PostUpdateMigrator.ts",
13
13
  "installedPath": ".instar/hooks/instar/session-start.sh",
14
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
14
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
15
15
  "since": "2025-01-01"
16
16
  },
17
17
  "hook:dangerous-command-guard": {
@@ -20,7 +20,7 @@
20
20
  "domain": "safety",
21
21
  "sourcePath": "src/core/PostUpdateMigrator.ts",
22
22
  "installedPath": ".instar/hooks/instar/dangerous-command-guard.sh",
23
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
23
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
24
24
  "since": "2025-01-01"
25
25
  },
26
26
  "hook:grounding-before-messaging": {
@@ -29,7 +29,7 @@
29
29
  "domain": "safety",
30
30
  "sourcePath": "src/core/PostUpdateMigrator.ts",
31
31
  "installedPath": ".instar/hooks/instar/grounding-before-messaging.sh",
32
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
32
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
33
33
  "since": "2025-01-01"
34
34
  },
35
35
  "hook:compaction-recovery": {
@@ -38,7 +38,7 @@
38
38
  "domain": "identity",
39
39
  "sourcePath": "src/core/PostUpdateMigrator.ts",
40
40
  "installedPath": ".instar/hooks/instar/compaction-recovery.sh",
41
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
41
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
42
42
  "since": "2025-01-01"
43
43
  },
44
44
  "hook:external-operation-gate": {
@@ -47,7 +47,7 @@
47
47
  "domain": "safety",
48
48
  "sourcePath": "src/core/PostUpdateMigrator.ts",
49
49
  "installedPath": ".instar/hooks/instar/external-operation-gate.js",
50
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
50
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
51
51
  "since": "2025-01-01"
52
52
  },
53
53
  "hook:deferral-detector": {
@@ -56,7 +56,7 @@
56
56
  "domain": "safety",
57
57
  "sourcePath": "src/core/PostUpdateMigrator.ts",
58
58
  "installedPath": ".instar/hooks/instar/deferral-detector.js",
59
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
59
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
60
60
  "since": "2025-01-01"
61
61
  },
62
62
  "hook:self-stop-guard": {
@@ -65,7 +65,7 @@
65
65
  "domain": "coherence",
66
66
  "sourcePath": "src/core/PostUpdateMigrator.ts",
67
67
  "installedPath": ".instar/hooks/instar/self-stop-guard.js",
68
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
68
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
69
69
  "since": "2025-01-01"
70
70
  },
71
71
  "hook:post-action-reflection": {
@@ -74,7 +74,7 @@
74
74
  "domain": "evolution",
75
75
  "sourcePath": "src/core/PostUpdateMigrator.ts",
76
76
  "installedPath": ".instar/hooks/instar/post-action-reflection.js",
77
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
77
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
78
78
  "since": "2025-01-01"
79
79
  },
80
80
  "hook:external-communication-guard": {
@@ -83,7 +83,7 @@
83
83
  "domain": "safety",
84
84
  "sourcePath": "src/core/PostUpdateMigrator.ts",
85
85
  "installedPath": ".instar/hooks/instar/external-communication-guard.js",
86
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
86
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
87
87
  "since": "2025-01-01"
88
88
  },
89
89
  "hook:scope-coherence-collector": {
@@ -92,7 +92,7 @@
92
92
  "domain": "coherence",
93
93
  "sourcePath": "src/core/PostUpdateMigrator.ts",
94
94
  "installedPath": ".instar/hooks/instar/scope-coherence-collector.js",
95
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
95
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
96
96
  "since": "2025-01-01"
97
97
  },
98
98
  "hook:scope-coherence-checkpoint": {
@@ -101,7 +101,7 @@
101
101
  "domain": "coherence",
102
102
  "sourcePath": "src/core/PostUpdateMigrator.ts",
103
103
  "installedPath": ".instar/hooks/instar/scope-coherence-checkpoint.js",
104
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
104
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
105
105
  "since": "2025-01-01"
106
106
  },
107
107
  "hook:free-text-guard": {
@@ -110,7 +110,7 @@
110
110
  "domain": "safety",
111
111
  "sourcePath": "src/core/PostUpdateMigrator.ts",
112
112
  "installedPath": ".instar/hooks/instar/free-text-guard.sh",
113
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
113
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
114
114
  "since": "2025-01-01"
115
115
  },
116
116
  "hook:claim-intercept": {
@@ -119,7 +119,7 @@
119
119
  "domain": "coherence",
120
120
  "sourcePath": "src/core/PostUpdateMigrator.ts",
121
121
  "installedPath": ".instar/hooks/instar/claim-intercept.js",
122
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
122
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
123
123
  "since": "2025-01-01"
124
124
  },
125
125
  "hook:claim-intercept-response": {
@@ -128,7 +128,7 @@
128
128
  "domain": "coherence",
129
129
  "sourcePath": "src/core/PostUpdateMigrator.ts",
130
130
  "installedPath": ".instar/hooks/instar/claim-intercept-response.js",
131
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
131
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
132
132
  "since": "2025-01-01"
133
133
  },
134
134
  "hook:stop-gate-router": {
@@ -137,7 +137,7 @@
137
137
  "domain": "safety",
138
138
  "sourcePath": "src/core/PostUpdateMigrator.ts",
139
139
  "installedPath": ".instar/hooks/instar/stop-gate-router.js",
140
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
140
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
141
141
  "since": "2025-01-01"
142
142
  },
143
143
  "hook:auto-approve-permissions": {
@@ -146,7 +146,7 @@
146
146
  "domain": "safety",
147
147
  "sourcePath": "src/core/PostUpdateMigrator.ts",
148
148
  "installedPath": ".instar/hooks/instar/auto-approve-permissions.js",
149
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
149
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
150
150
  "since": "2025-01-01"
151
151
  },
152
152
  "job:health-check": {
@@ -418,7 +418,7 @@
418
418
  "type": "route-group",
419
419
  "domain": "monitoring",
420
420
  "sourcePath": "src/server/routes.ts",
421
- "contentHash": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
421
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
429
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
437
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
445
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
453
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
461
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
469
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
477
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
485
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
493
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
501
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
509
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
517
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
525
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
533
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
541
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
549
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
557
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
565
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
573
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
581
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
589
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
597
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
605
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
613
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
621
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
629
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
637
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
645
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
653
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
661
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
669
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
677
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
685
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
693
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
701
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
709
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
717
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
725
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
733
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
741
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
749
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
757
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
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": "4d3c249396546a78bdc5498f80d879db7658c0c0688c64188902a1eeefaae40a",
773
+ "contentHash": "13d7a09d6e23886a37ddc267c77cad510edf9b1013cd6324312773d8c3429cd8",
774
774
  "since": "2025-01-01"
775
775
  },
776
776
  "cli:init": {
@@ -1562,7 +1562,7 @@
1562
1562
  "type": "subsystem",
1563
1563
  "domain": "updates",
1564
1564
  "sourcePath": "src/core/PostUpdateMigrator.ts",
1565
- "contentHash": "abb2e8ea9b3e906f37767153ca1ef7442cfc92ba27a50a7eaaa09596c8d5eede",
1565
+ "contentHash": "ae15e23b7525213595701aaac82b83f9ca3f74f99b0b6ab498930096d16ace7a",
1566
1566
  "since": "2025-01-01"
1567
1567
  },
1568
1568
  "subsystem:scheduler": {
@@ -1618,7 +1618,7 @@
1618
1618
  "type": "subsystem",
1619
1619
  "domain": "coordination",
1620
1620
  "sourcePath": "src/core/MultiMachineCoordinator.ts",
1621
- "contentHash": "d649a7aa3f1b4ec5dd4515a6cf8e9a5851ffee913830b4466aafac4b33927f23",
1621
+ "contentHash": "0a3112a224401c2db9d272de14fa7f824cbce3f3b3598d2b1267062448529ac1",
1622
1622
  "since": "2025-01-01"
1623
1623
  },
1624
1624
  "subsystem:backup-manager": {
@@ -520,7 +520,7 @@ ${SCOPE_ACCRETION_CLAUDEMD_SECTION(port)}
520
520
  **Cross-Machine Seamlessness (one agent, many machines)** — When I run on more than one machine, I am ONE agent that follows the user across them, not clones. Exactly one machine is "awake" at a time, decided by a **fenced lease** (a clock-proof, numbered "who's in charge" badge); the other is standby and takes over only when the awake machine genuinely goes silent.
521
521
  - **I never double-reply** — each inbound message is handled exactly once (durable per-message ledger keyed on the platform event id), so a redelivery or mid-handoff overlap can't make me answer twice.
522
522
  - **A handoff feels like a compaction pause, not amnesia** — the new machine resumes via CONTINUATION (picks up the thread, no re-greeting). Planned handoff = current context; hard failover = as-of-last-sync, and if my context is partial I say so honestly ("picking this back up from the other machine").
523
- - Read mesh/sync state, never guess it: \`curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/health\` → \`multiMachine.syncStatus\` (\`leaseHolder, leaseEpoch, holdsLease, splitBrainState, awakeMachineCount\`); \`instar doctor\` shows the same.
523
+ - Read mesh/sync state, never guess it: \`curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/health\` → \`multiMachine.syncStatus\` (\`leaseHolder, leaseEpoch, holdsLease, splitBrainState, awakeMachineCount + awakeMachineCountSource\`); \`instar doctor\` shows the same. \`awakeMachineCount\` derives from LIVE lease observations (source \`lease-live\`), NOT last-written registry roles (source \`registry-roles\`, a git-only-mesh fallback that can lag); it is \`null\`/\`unavailable\` on a read failure — never a silent 0. Read the count and its source together.
524
524
  - A genuinely **unresolvable split-brain** surfaces as ONE Attention-queue item with a Y/N decision ("demote machine X?"), deduped per partition episode — I present it to the user, I don't silently pick.
525
525
  - Dials under \`.instar/config.json\` → \`multiMachine\` (ingressHeartbeatMs, leaseTtlMs, leasePullIntervalMs, liveTailMaxStalenessMs, handoffAckTimeoutMs, …); a nonsensical combo is rejected at startup, not run silently.
526
526
  - **Lease self-heal + preferred-awake** (\`multiMachine.leaseSelfHeal\`): the awake-election tick is self-healing — a bounded timeout on its network calls plus a monotonic watchdog re-arm it if it ever stalls, so the mesh can't get stuck with NO awake machine (the 2026-06-19 freeze). \`GET /health → multiMachine.syncStatus.leaseTickWatchdog\` answers "did the watchdog fire?" (\`lastTickAgeMs\`, \`reArmCount\`, \`disarmed\`). To make a stationary machine reliably win the election, set \`leaseSelfHeal.preferredAwakeMachineId\` to its machineId ON ALL machines (the same value) — the traveling machine then defers while the preferred one is healthy. **Proactive trigger:** operator asks "why does my traveling laptop keep grabbing the lease?" → recommend \`preferredAwakeMachineId\`. F1 (the watchdog) is on by default; the stale-holder-takeover / silent-standby-relinquish / preferred-awake behaviors ship dark/opt-in. Spec: \`docs/specs/multi-machine-lease-self-heal.md\`.
@@ -16,16 +16,62 @@ Doorway/Model Knowledge Registry — rollout increment 2 (the deterministic prob
16
16
 
17
17
  `GET /doorways`, the CLAUDE.md awareness block, and the `maintenance.doorwayScan` config-knob are increment 3; flipping the lint to `strict` + ratifying the standard is increment 5. Neither is in this increment.
18
18
 
19
+ `GET /health → multiMachine.syncStatus.awakeMachineCount` used to be computed by
20
+ counting `registry.machines[].role === 'awake'` rows — a git-synced SYMBOL that
21
+ lags the authoritative lease. On a healthy two-machine mesh where a peer held the
22
+ lease but its registry role hadn't propagated (or the Cloudflare rope was down
23
+ while Tailscale/LAN carried the lease), this read **0** even though `leaseHolder`
24
+ correctly named the holder — a telemetry lie reproduced live on the Laptop+Mini
25
+ pair.
26
+
27
+ `awakeMachineCount` now derives from LIVE lease observations
28
+ (machine-coherence-guard §5b): `(self holds ? 1 : 0)` plus each distinct peer
29
+ whose most-recent lease observation is fresh, live (not expired), and a self-claim
30
+ (no third-machine hearsay). It ships with a sibling `awakeMachineCountSource`
31
+ (`lease-live` | `registry-roles` | `unavailable`) so the basis is always explicit.
32
+ A git-only mesh degrades to the registry-role count (honestly tagged); a read
33
+ failure yields `null` + `unavailable` — never a silent 0.
34
+
35
+ `instar doctor` now labels the registry-role check as a possibly-lagging VIEW and,
36
+ when the server is running, adds a **Live lease view** line with the authoritative
37
+ count + source, naming any registry-vs-live divergence.
38
+
39
+ **Shape change (agent-only):** `MultiMachineSyncStatus.awakeMachineCount` is now
40
+ `number | null` (was `number`) and gains `awakeMachineCountSource`. No dashboard or
41
+ external consumer reads the field; the `/pool` and `/health` surfaces carry both.
42
+
43
+ The last-resort flood ceiling that lives inside the one function where Telegram topics are born (`TelegramAdapter.createForumTopic`) is now genuinely universal. Previously it only applied to topics tagged `origin:'auto'`; a bare `origin:'system'` skipped it entirely, and the attention queue used `origin:'system'` for every HIGH/URGENT item — so a stream of "urgent" items could spawn unlimited new topics despite the guards. This was the load-bearing gap behind the operator's most-repeated directive ("be extremely conservative with Telegram; messages should not create their own topics") having the weakest structural follow-through of any critical item.
44
+
45
+ Now the ceiling exempts only (a) a topic a human explicitly asked for (`origin:'user'`) and (b) a caller that DECLARES its topic is a fixed, create-once one (`bounded: true`). The genuine create-once system topics (Lifeline, Dashboard, Updates, Attention, Agent-Health lane, the flood-notice surface) are marked `bounded: true`; every other origin — including a bare `system` — now rides the same budget as `auto`. Critical (HIGH/URGENT) attention items get a distinct budget label so a lone genuine emergency still gets its own topic, but a FLOOD of them coalesces into the single "notices coalesced" topic (still delivered, still in the attention store) instead of a wall of topics. A new behavioral standard — **Conservative Outbound: Act, Don't Notify** — is added to the standards registry, clearly marked as a PROPOSAL awaiting operator ratification.
46
+
19
47
  ## What to Tell Your User
20
48
 
21
49
  Nothing changes for you right now — this increment ships **switched off**. It lands the machinery for a future opt-in weekly "doorway scan" that will quietly re-check which AI models each of your doorways (Claude Code, Codex, Gemini, a paid API key, …) can still reach, keep the map current, and send you ONE plain-English heads-up only when something actually changes. Until you deliberately turn the job on (a later step), it does no probing, spends no money, and sends no messages. There is nothing to do and nothing new to see.
22
50
 
51
+ If you asked "why does my mesh say zero machines are awake when both are online?"
52
+ — that was a telemetry bug: the count read a stale registry symbol instead of the
53
+ live lease. It now tracks the same authoritative signal the lease-holder field
54
+ uses, so a healthy mesh with one machine in charge reports one machine awake, and
55
+ a genuine split-brain reports more than one. Nothing about how the mesh actually
56
+ serves you changed — only the honesty of the number.
57
+
58
+ Almost nothing changes in day-to-day use — the point is that I create FEWER stray Telegram topics, never more. A genuine emergency still gets its own topic. The difference shows only under a flood: instead of a wall of new topics, a burst folds into one "notices coalesced" topic, and every item is still in your attention list. If you asked for a topic, you still get it. There is one thing for you to decide: whether to ratify the proposed "Act, Don't Notify" standard into the constitution (it's marked as a proposal in the standards registry).
59
+
23
60
  ## Summary of New Capabilities
24
61
 
25
62
  - **(Dark / off by default)** A deterministic doorway prober + a per-machine live "what models can I reach?" scan-state, with an asymmetric debounce, a self-healing zero-doors breaker, and no-silent-loss delivery — none of it active until the operator enables the `doorway-scan` job.
26
63
  - **A new `perMachineIndependent` job flag** so a per-machine-local job (like the doorway scan) runs on every machine independently instead of the lease electing just one.
27
64
  - **A structural command-allowlist guard** that keeps the (future, opt-in) scan session from ever editing source or spending money — a genuine shell-parser allowlist that fails open outside that one session and fails closed inside it.
28
65
 
66
+ - `multiMachine.syncStatus.awakeMachineCount` is now lease-live and source-tagged
67
+ (`awakeMachineCountSource`), never a silent 0.
68
+ - `instar doctor` prints the live lease view of "who is awake" and flags
69
+ registry-vs-live divergence.
70
+
71
+ - The auto-topic flood ceiling is now un-dodgeable: no `origin` flag exempts a caller — only an explicit human request or a declared `bounded: true` create-once topic.
72
+ - HIGH/URGENT topic creation is bounded under a flood (coalesced, never dropped), closing the "mark it HIGH to dodge the budget" hole.
73
+ - A ratifiable proposed standard: **Conservative Outbound: Act, Don't Notify**.
74
+
29
75
  ## Evidence
30
76
 
31
77
  - `tests/unit/doorway-scan-prober.test.ts` (45) — clamp/sanitize, the exhaustive read-funnel + coverage, the P20/L5 probeStatus mapping, the asymmetric debounce (incl. flip-then-flip-back-clears), the diff, the breaker + backoff, the fail-closed money gate (D8/D9/D10 + pricing staleness + self-standing scheduled refusal), tone-gate-safe body + private-view XSS neutralization, the delivery-robustness planner, and the injected-dep network probes.
@@ -35,3 +81,8 @@ Nothing changes for you right now — this increment ships **switched off**. It
35
81
  - `tests/unit/instar-settings-hooks.test.ts` + `tests/unit/migration-parity-hooks.test.ts` — updated for the new guard entry (registered in settings + accepted migrator-only gap, matching the pr-hand-lease-guard precedent).
36
82
  - `node scripts/lint-model-registry-freshness.mjs` → PASS on the enriched manifest; `npx tsc --noEmit` clean; full `pnpm lint` chain PASS; `pnpm build` OK (the new job hashes into the built-in-job lockfile). End-to-end: the real `doorway-scan.md` installs via `installBuiltinJobs` with zero errors; its per-slug manifest carries `enabled:false` + `perMachineIndependent:true`.
37
83
  - Deferred items (spec §Deferred DF1-DF6) remain tracked in `docs/specs/reports/DOORWAY-MODEL-KNOWLEDGE-REGISTRY-followups.md` (filed by inc1).
84
+
85
+ - `tests/integration/notification-flood-burst-invariant.test.ts` extended and green (9 tests): a bare `origin:'system'` flood is now bounded (`refused ≥ 188/200`); `origin:'user'` and `origin:'system'+bounded:true` stay exempt; a 1,000-item HIGH/URGENT stream creates `≤ maxTopicsGlobal+4` topics with ALL 1,000 items still in the store and overflow coalesced; the pre-existing lone-emergency-amid-flood case still gets its own topic.
86
+ - Related regression suites green: `attention-topic-flood-guard.test.ts`, `AttentionTopicGuard.test.ts`, `PostUpdateMigrator-topicFloodGuard.test.ts`, `sentinel-telegram-integration.test.ts`.
87
+ - `npx tsc --noEmit` clean.
88
+ - Audit companion: `docs/audits/telegram-conservatism-pass-2026-07-04.md` (full enumeration of every auto-topic / proactive-message path and their conformance).