instar 1.3.1649 → 1.3.1650

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 (451) hide show
  1. package/dashboard/console/accounts.js +2 -1
  2. package/dashboard/console/agents-model.js +3 -3
  3. package/dashboard/console/agents.js +7 -4
  4. package/dashboard/console/console.css +1 -0
  5. package/dashboard/console/console.js +35 -4
  6. package/dashboard/console/costs-model.js +12 -0
  7. package/dashboard/console/costs.js +6 -3
  8. package/dashboard/console/development-model.js +9 -3
  9. package/dashboard/console/development.js +7 -4
  10. package/dashboard/console/home-model.js +30 -14
  11. package/dashboard/console/mandates.js +3 -3
  12. package/dashboard/console/needs-model.js +105 -0
  13. package/dashboard/console/plans.js +2 -1
  14. package/dashboard/console/secrets.js +2 -2
  15. package/dashboard/console/ticket-model.js +36 -0
  16. package/dashboard/console/ui.js +3 -0
  17. package/dist/cli.js +8 -0
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/install.d.ts +9 -7
  20. package/dist/commands/install.d.ts.map +1 -1
  21. package/dist/commands/install.js +2 -19
  22. package/dist/commands/install.js.map +1 -1
  23. package/dist/commands/reflect.d.ts.map +1 -1
  24. package/dist/commands/reflect.js +2 -0
  25. package/dist/commands/reflect.js.map +1 -1
  26. package/dist/commands/route.d.ts.map +1 -1
  27. package/dist/commands/route.js +2 -0
  28. package/dist/commands/route.js.map +1 -1
  29. package/dist/commands/server.d.ts.map +1 -1
  30. package/dist/commands/server.js +315 -14
  31. package/dist/commands/server.js.map +1 -1
  32. package/dist/commands/setClaudeKey.d.ts +8 -0
  33. package/dist/commands/setClaudeKey.d.ts.map +1 -0
  34. package/dist/commands/setClaudeKey.js +35 -0
  35. package/dist/commands/setClaudeKey.js.map +1 -0
  36. package/dist/core/AccountFollowMeOrchestrator.d.ts.map +1 -1
  37. package/dist/core/AccountFollowMeOrchestrator.js +4 -0
  38. package/dist/core/AccountFollowMeOrchestrator.js.map +1 -1
  39. package/dist/core/AppMediaStore.d.ts.map +1 -1
  40. package/dist/core/AppMediaStore.js +3 -0
  41. package/dist/core/AppMediaStore.js.map +1 -1
  42. package/dist/core/BackupManager.d.ts.map +1 -1
  43. package/dist/core/BackupManager.js +2 -0
  44. package/dist/core/BackupManager.js.map +1 -1
  45. package/dist/core/ClaudeCliIntelligenceProvider.d.ts.map +1 -1
  46. package/dist/core/ClaudeCliIntelligenceProvider.js +11 -3
  47. package/dist/core/ClaudeCliIntelligenceProvider.js.map +1 -1
  48. package/dist/core/ClaudeKeyHealth.d.ts +141 -0
  49. package/dist/core/ClaudeKeyHealth.d.ts.map +1 -0
  50. package/dist/core/ClaudeKeyHealth.js +467 -0
  51. package/dist/core/ClaudeKeyHealth.js.map +1 -0
  52. package/dist/core/CodexTaskContinuationStore.d.ts.map +1 -1
  53. package/dist/core/CodexTaskContinuationStore.js +7 -0
  54. package/dist/core/CodexTaskContinuationStore.js.map +1 -1
  55. package/dist/core/CoherenceJournal.d.ts +1 -1
  56. package/dist/core/CoherenceJournal.d.ts.map +1 -1
  57. package/dist/core/CoherenceJournal.js +11 -2
  58. package/dist/core/CoherenceJournal.js.map +1 -1
  59. package/dist/core/Config.d.ts +8 -0
  60. package/dist/core/Config.d.ts.map +1 -1
  61. package/dist/core/Config.js +26 -0
  62. package/dist/core/Config.js.map +1 -1
  63. package/dist/core/CredentialSwapExecutor.d.ts.map +1 -1
  64. package/dist/core/CredentialSwapExecutor.js +10 -0
  65. package/dist/core/CredentialSwapExecutor.js.map +1 -1
  66. package/dist/core/DecisionQualityRecorderImpl.d.ts.map +1 -1
  67. package/dist/core/DecisionQualityRecorderImpl.js +6 -0
  68. package/dist/core/DecisionQualityRecorderImpl.js.map +1 -1
  69. package/dist/core/DiscoveryEvaluator.d.ts.map +1 -1
  70. package/dist/core/DiscoveryEvaluator.js +4 -0
  71. package/dist/core/DiscoveryEvaluator.js.map +1 -1
  72. package/dist/core/IdentityReannounceClaimant.d.ts.map +1 -1
  73. package/dist/core/IdentityReannounceClaimant.js +4 -0
  74. package/dist/core/IdentityReannounceClaimant.js.map +1 -1
  75. package/dist/core/IntelligenceRouter.d.ts.map +1 -1
  76. package/dist/core/IntelligenceRouter.js +9 -0
  77. package/dist/core/IntelligenceRouter.js.map +1 -1
  78. package/dist/core/JournalSyncApplier.d.ts +1 -0
  79. package/dist/core/JournalSyncApplier.d.ts.map +1 -1
  80. package/dist/core/JournalSyncApplier.js +48 -0
  81. package/dist/core/JournalSyncApplier.js.map +1 -1
  82. package/dist/core/LeaseCoordinator.d.ts +4 -0
  83. package/dist/core/LeaseCoordinator.d.ts.map +1 -1
  84. package/dist/core/LeaseCoordinator.js +64 -1
  85. package/dist/core/LeaseCoordinator.js.map +1 -1
  86. package/dist/core/MessagingToneGate.d.ts +11 -7
  87. package/dist/core/MessagingToneGate.d.ts.map +1 -1
  88. package/dist/core/MessagingToneGate.js +15 -1
  89. package/dist/core/MessagingToneGate.js.map +1 -1
  90. package/dist/core/MobileDeviceKeys.d.ts +10 -0
  91. package/dist/core/MobileDeviceKeys.d.ts.map +1 -1
  92. package/dist/core/MobileDeviceKeys.js +17 -0
  93. package/dist/core/MobileDeviceKeys.js.map +1 -1
  94. package/dist/core/MultiMachineCoordinator.d.ts +12 -0
  95. package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
  96. package/dist/core/MultiMachineCoordinator.js +115 -3
  97. package/dist/core/MultiMachineCoordinator.js.map +1 -1
  98. package/dist/core/MutualSshRuntime.d.ts +1 -0
  99. package/dist/core/MutualSshRuntime.d.ts.map +1 -1
  100. package/dist/core/MutualSshRuntime.js +17 -1
  101. package/dist/core/MutualSshRuntime.js.map +1 -1
  102. package/dist/core/ObservedEndpointTracker.d.ts +1 -0
  103. package/dist/core/ObservedEndpointTracker.d.ts.map +1 -1
  104. package/dist/core/ObservedEndpointTracker.js +17 -0
  105. package/dist/core/ObservedEndpointTracker.js.map +1 -1
  106. package/dist/core/OverloadShedPlanner.d.ts.map +1 -1
  107. package/dist/core/OverloadShedPlanner.js +9 -0
  108. package/dist/core/OverloadShedPlanner.js.map +1 -1
  109. package/dist/core/OwnershipApplier.d.ts.map +1 -1
  110. package/dist/core/OwnershipApplier.js +7 -0
  111. package/dist/core/OwnershipApplier.js.map +1 -1
  112. package/dist/core/OwnershipReconciler.d.ts.map +1 -1
  113. package/dist/core/OwnershipReconciler.js +5 -0
  114. package/dist/core/OwnershipReconciler.js.map +1 -1
  115. package/dist/core/PostUpdateMigrator.d.ts +8 -0
  116. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  117. package/dist/core/PostUpdateMigrator.js +76 -2
  118. package/dist/core/PostUpdateMigrator.js.map +1 -1
  119. package/dist/core/PrHandLease.d.ts.map +1 -1
  120. package/dist/core/PrHandLease.js +2 -0
  121. package/dist/core/PrHandLease.js.map +1 -1
  122. package/dist/core/ProactiveSwapMonitor.d.ts.map +1 -1
  123. package/dist/core/ProactiveSwapMonitor.js +7 -0
  124. package/dist/core/ProactiveSwapMonitor.js.map +1 -1
  125. package/dist/core/ProjectRoundExecution.d.ts.map +1 -1
  126. package/dist/core/ProjectRoundExecution.js +3 -2
  127. package/dist/core/ProjectRoundExecution.js.map +1 -1
  128. package/dist/core/QueueDrainLoop.d.ts +7 -0
  129. package/dist/core/QueueDrainLoop.d.ts.map +1 -1
  130. package/dist/core/QueueDrainLoop.js +37 -1
  131. package/dist/core/QueueDrainLoop.js.map +1 -1
  132. package/dist/core/RemoteAckStore.d.ts.map +1 -1
  133. package/dist/core/RemoteAckStore.js +4 -0
  134. package/dist/core/RemoteAckStore.js.map +1 -1
  135. package/dist/core/ReplicatedStoreReconcilerWiring.d.ts.map +1 -1
  136. package/dist/core/ReplicatedStoreReconcilerWiring.js +1 -0
  137. package/dist/core/ReplicatedStoreReconcilerWiring.js.map +1 -1
  138. package/dist/core/SecretSync.d.ts +1 -0
  139. package/dist/core/SecretSync.d.ts.map +1 -1
  140. package/dist/core/SecretSync.js +16 -0
  141. package/dist/core/SecretSync.js.map +1 -1
  142. package/dist/core/SessionManager.d.ts +11 -0
  143. package/dist/core/SessionManager.d.ts.map +1 -1
  144. package/dist/core/SessionManager.js +125 -14
  145. package/dist/core/SessionManager.js.map +1 -1
  146. package/dist/core/SessionPoolFailoverRunner.d.ts.map +1 -1
  147. package/dist/core/SessionPoolFailoverRunner.js +4 -0
  148. package/dist/core/SessionPoolFailoverRunner.js.map +1 -1
  149. package/dist/core/SleepWakeDetector.d.ts.map +1 -1
  150. package/dist/core/SleepWakeDetector.js +10 -0
  151. package/dist/core/SleepWakeDetector.js.map +1 -1
  152. package/dist/core/SubscriptionReloginStore.d.ts.map +1 -1
  153. package/dist/core/SubscriptionReloginStore.js +10 -1
  154. package/dist/core/SubscriptionReloginStore.js.map +1 -1
  155. package/dist/core/TopicPinMutation.d.ts.map +1 -1
  156. package/dist/core/TopicPinMutation.js +5 -0
  157. package/dist/core/TopicPinMutation.js.map +1 -1
  158. package/dist/core/UnjustifiedStopGate.d.ts.map +1 -1
  159. package/dist/core/UnjustifiedStopGate.js +22 -0
  160. package/dist/core/UnjustifiedStopGate.js.map +1 -1
  161. package/dist/core/WindowRunCadenceExecutor.d.ts.map +1 -1
  162. package/dist/core/WindowRunCadenceExecutor.js +20 -0
  163. package/dist/core/WindowRunCadenceExecutor.js.map +1 -1
  164. package/dist/core/claudeChildAuth.d.ts +68 -0
  165. package/dist/core/claudeChildAuth.d.ts.map +1 -0
  166. package/dist/core/claudeChildAuth.js +173 -0
  167. package/dist/core/claudeChildAuth.js.map +1 -0
  168. package/dist/core/claudeKeyProbe.d.ts +23 -0
  169. package/dist/core/claudeKeyProbe.d.ts.map +1 -0
  170. package/dist/core/claudeKeyProbe.js +68 -0
  171. package/dist/core/claudeKeyProbe.js.map +1 -0
  172. package/dist/core/codexDeviceLimitWiring.d.ts.map +1 -1
  173. package/dist/core/codexDeviceLimitWiring.js +12 -0
  174. package/dist/core/codexDeviceLimitWiring.js.map +1 -1
  175. package/dist/core/deliverToConversation.d.ts.map +1 -1
  176. package/dist/core/deliverToConversation.js +11 -0
  177. package/dist/core/deliverToConversation.js.map +1 -1
  178. package/dist/core/meteredCallEntry.d.ts.map +1 -1
  179. package/dist/core/meteredCallEntry.js +21 -0
  180. package/dist/core/meteredCallEntry.js.map +1 -1
  181. package/dist/core/nobodyPollingActuator.d.ts.map +1 -1
  182. package/dist/core/nobodyPollingActuator.js +5 -0
  183. package/dist/core/nobodyPollingActuator.js.map +1 -1
  184. package/dist/core/operatorSurfaceReferral.d.ts +18 -0
  185. package/dist/core/operatorSurfaceReferral.d.ts.map +1 -0
  186. package/dist/core/operatorSurfaceReferral.js +32 -0
  187. package/dist/core/operatorSurfaceReferral.js.map +1 -0
  188. package/dist/core/ownershipFollowsLiveWork.d.ts.map +1 -1
  189. package/dist/core/ownershipFollowsLiveWork.js +10 -1
  190. package/dist/core/ownershipFollowsLiveWork.js.map +1 -1
  191. package/dist/core/types.d.ts +15 -0
  192. package/dist/core/types.d.ts.map +1 -1
  193. package/dist/core/types.js.map +1 -1
  194. package/dist/core/worktreeDirtyCheck.d.ts.map +1 -1
  195. package/dist/core/worktreeDirtyCheck.js +2 -0
  196. package/dist/core/worktreeDirtyCheck.js.map +1 -1
  197. package/dist/data/stageBCertifiedSet.d.ts +9 -0
  198. package/dist/data/stageBCertifiedSet.d.ts.map +1 -1
  199. package/dist/data/stageBCertifiedSet.js +12 -0
  200. package/dist/data/stageBCertifiedSet.js.map +1 -1
  201. package/dist/data/standards-guard-index.json +1 -1
  202. package/dist/data/standards-guard-index.meta.json +2 -2
  203. package/dist/data/standards-registry.meta.json +1 -1
  204. package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
  205. package/dist/lifeline/TelegramLifeline.js +17 -3
  206. package/dist/lifeline/TelegramLifeline.js.map +1 -1
  207. package/dist/messaging/attentionHubPolicy.d.ts.map +1 -1
  208. package/dist/messaging/attentionHubPolicy.js +1 -0
  209. package/dist/messaging/attentionHubPolicy.js.map +1 -1
  210. package/dist/monitoring/AgentWorktreeReaper.d.ts.map +1 -1
  211. package/dist/monitoring/AgentWorktreeReaper.js +15 -0
  212. package/dist/monitoring/AgentWorktreeReaper.js.map +1 -1
  213. package/dist/monitoring/ApprenticeshipCycleSlaMonitor.d.ts.map +1 -1
  214. package/dist/monitoring/ApprenticeshipCycleSlaMonitor.js +18 -9
  215. package/dist/monitoring/ApprenticeshipCycleSlaMonitor.js.map +1 -1
  216. package/dist/monitoring/CodexArmSessionSweeper.d.ts.map +1 -1
  217. package/dist/monitoring/CodexArmSessionSweeper.js +11 -0
  218. package/dist/monitoring/CodexArmSessionSweeper.js.map +1 -1
  219. package/dist/monitoring/CrashLoopPauser.d.ts.map +1 -1
  220. package/dist/monitoring/CrashLoopPauser.js +8 -0
  221. package/dist/monitoring/CrashLoopPauser.js.map +1 -1
  222. package/dist/monitoring/DegradationReporter.d.ts.map +1 -1
  223. package/dist/monitoring/DegradationReporter.js +7 -1
  224. package/dist/monitoring/DegradationReporter.js.map +1 -1
  225. package/dist/monitoring/DegradedTmuxGuard.d.ts +2 -0
  226. package/dist/monitoring/DegradedTmuxGuard.d.ts.map +1 -1
  227. package/dist/monitoring/DegradedTmuxGuard.js +14 -0
  228. package/dist/monitoring/DegradedTmuxGuard.js.map +1 -1
  229. package/dist/monitoring/DurableOutputScrubber.d.ts.map +1 -1
  230. package/dist/monitoring/DurableOutputScrubber.js +7 -0
  231. package/dist/monitoring/DurableOutputScrubber.js.map +1 -1
  232. package/dist/monitoring/DurableVaultSession.d.ts.map +1 -1
  233. package/dist/monitoring/DurableVaultSession.js +15 -0
  234. package/dist/monitoring/DurableVaultSession.js.map +1 -1
  235. package/dist/monitoring/ExternalHogSentinel.d.ts +2 -0
  236. package/dist/monitoring/ExternalHogSentinel.d.ts.map +1 -1
  237. package/dist/monitoring/ExternalHogSentinel.js +27 -1
  238. package/dist/monitoring/ExternalHogSentinel.js.map +1 -1
  239. package/dist/monitoring/FailureLedger.d.ts.map +1 -1
  240. package/dist/monitoring/FailureLedger.js +38 -1
  241. package/dist/monitoring/FailureLedger.js.map +1 -1
  242. package/dist/monitoring/FeatureEvidenceLog.d.ts +5 -0
  243. package/dist/monitoring/FeatureEvidenceLog.d.ts.map +1 -1
  244. package/dist/monitoring/FeatureEvidenceLog.js +25 -0
  245. package/dist/monitoring/FeatureEvidenceLog.js.map +1 -1
  246. package/dist/monitoring/GeminiCapacityEscalationMonitor.d.ts.map +1 -1
  247. package/dist/monitoring/GeminiCapacityEscalationMonitor.js +20 -2
  248. package/dist/monitoring/GeminiCapacityEscalationMonitor.js.map +1 -1
  249. package/dist/monitoring/GeminiLoopRunner.d.ts.map +1 -1
  250. package/dist/monitoring/GeminiLoopRunner.js +11 -1
  251. package/dist/monitoring/GeminiLoopRunner.js.map +1 -1
  252. package/dist/monitoring/GreenPrAutoMerger.d.ts.map +1 -1
  253. package/dist/monitoring/GreenPrAutoMerger.js +11 -0
  254. package/dist/monitoring/GreenPrAutoMerger.js.map +1 -1
  255. package/dist/monitoring/GrowthDigestPublisher.d.ts.map +1 -1
  256. package/dist/monitoring/GrowthDigestPublisher.js +16 -0
  257. package/dist/monitoring/GrowthDigestPublisher.js.map +1 -1
  258. package/dist/monitoring/GrowthMilestoneAnalyst.d.ts +3 -0
  259. package/dist/monitoring/GrowthMilestoneAnalyst.d.ts.map +1 -1
  260. package/dist/monitoring/GrowthMilestoneAnalyst.js +45 -1
  261. package/dist/monitoring/GrowthMilestoneAnalyst.js.map +1 -1
  262. package/dist/monitoring/McpProcessReaper.d.ts +2 -0
  263. package/dist/monitoring/McpProcessReaper.d.ts.map +1 -1
  264. package/dist/monitoring/McpProcessReaper.js +32 -0
  265. package/dist/monitoring/McpProcessReaper.js.map +1 -1
  266. package/dist/monitoring/MissingLoginSessionDetector.d.ts +2 -1
  267. package/dist/monitoring/MissingLoginSessionDetector.d.ts.map +1 -1
  268. package/dist/monitoring/MissingLoginSessionDetector.js +23 -0
  269. package/dist/monitoring/MissingLoginSessionDetector.js.map +1 -1
  270. package/dist/monitoring/OrchestratorPoller.d.ts +1 -0
  271. package/dist/monitoring/OrchestratorPoller.d.ts.map +1 -1
  272. package/dist/monitoring/OrchestratorPoller.js +13 -0
  273. package/dist/monitoring/OrchestratorPoller.js.map +1 -1
  274. package/dist/monitoring/OrphanedWorkSentinel.d.ts.map +1 -1
  275. package/dist/monitoring/OrphanedWorkSentinel.js +7 -0
  276. package/dist/monitoring/OrphanedWorkSentinel.js.map +1 -1
  277. package/dist/monitoring/PresenceProxy.d.ts.map +1 -1
  278. package/dist/monitoring/PresenceProxy.js +9 -1
  279. package/dist/monitoring/PresenceProxy.js.map +1 -1
  280. package/dist/monitoring/ProcessFootprintMonitor.d.ts.map +1 -1
  281. package/dist/monitoring/ProcessFootprintMonitor.js +20 -2
  282. package/dist/monitoring/ProcessFootprintMonitor.js.map +1 -1
  283. package/dist/monitoring/PromiseBeacon.d.ts.map +1 -1
  284. package/dist/monitoring/PromiseBeacon.js +20 -0
  285. package/dist/monitoring/PromiseBeacon.js.map +1 -1
  286. package/dist/monitoring/ReleaseReadinessSentinel.d.ts +2 -0
  287. package/dist/monitoring/ReleaseReadinessSentinel.d.ts.map +1 -1
  288. package/dist/monitoring/ReleaseReadinessSentinel.js +26 -0
  289. package/dist/monitoring/ReleaseReadinessSentinel.js.map +1 -1
  290. package/dist/monitoring/RopeHealthMonitor.d.ts.map +1 -1
  291. package/dist/monitoring/RopeHealthMonitor.js +35 -1
  292. package/dist/monitoring/RopeHealthMonitor.js.map +1 -1
  293. package/dist/monitoring/SentinelNotifier.d.ts.map +1 -1
  294. package/dist/monitoring/SentinelNotifier.js +16 -0
  295. package/dist/monitoring/SentinelNotifier.js.map +1 -1
  296. package/dist/monitoring/SessionReaper.d.ts.map +1 -1
  297. package/dist/monitoring/SessionReaper.js +11 -2
  298. package/dist/monitoring/SessionReaper.js.map +1 -1
  299. package/dist/monitoring/SingleMachineFailoverGapDetector.d.ts +2 -0
  300. package/dist/monitoring/SingleMachineFailoverGapDetector.d.ts.map +1 -1
  301. package/dist/monitoring/SingleMachineFailoverGapDetector.js +20 -0
  302. package/dist/monitoring/SingleMachineFailoverGapDetector.js.map +1 -1
  303. package/dist/monitoring/SpeakerElection.d.ts.map +1 -1
  304. package/dist/monitoring/SpeakerElection.js +8 -0
  305. package/dist/monitoring/SpeakerElection.js.map +1 -1
  306. package/dist/monitoring/StrandedTopicSentinel.d.ts +3 -0
  307. package/dist/monitoring/StrandedTopicSentinel.d.ts.map +1 -1
  308. package/dist/monitoring/StrandedTopicSentinel.js +33 -0
  309. package/dist/monitoring/StrandedTopicSentinel.js.map +1 -1
  310. package/dist/native/InstarWedgeCanary.app/Contents/MacOS/InstarWedgeCanary +0 -0
  311. package/dist/native/instar-desktop-host +0 -0
  312. package/dist/providers/adapters/anthropic-headless/transport/oneShotCompletion.d.ts.map +1 -1
  313. package/dist/providers/adapters/anthropic-headless/transport/oneShotCompletion.js +5 -2
  314. package/dist/providers/adapters/anthropic-headless/transport/oneShotCompletion.js.map +1 -1
  315. package/dist/recommended/RecommendedServicesLedger.d.ts +91 -0
  316. package/dist/recommended/RecommendedServicesLedger.d.ts.map +1 -0
  317. package/dist/recommended/RecommendedServicesLedger.js +193 -0
  318. package/dist/recommended/RecommendedServicesLedger.js.map +1 -0
  319. package/dist/recommended/RecommendedServicesReplicatedStore.d.ts +14 -0
  320. package/dist/recommended/RecommendedServicesReplicatedStore.d.ts.map +1 -0
  321. package/dist/recommended/RecommendedServicesReplicatedStore.js +34 -0
  322. package/dist/recommended/RecommendedServicesReplicatedStore.js.map +1 -0
  323. package/dist/recommended/legacyDeclines.d.ts +11 -0
  324. package/dist/recommended/legacyDeclines.d.ts.map +1 -0
  325. package/dist/recommended/legacyDeclines.js +17 -0
  326. package/dist/recommended/legacyDeclines.js.map +1 -0
  327. package/dist/recommended/serviceIds.d.ts +3 -0
  328. package/dist/recommended/serviceIds.d.ts.map +1 -0
  329. package/dist/recommended/serviceIds.js +6 -0
  330. package/dist/recommended/serviceIds.js.map +1 -0
  331. package/dist/scaffold/templates.d.ts +2 -0
  332. package/dist/scaffold/templates.d.ts.map +1 -1
  333. package/dist/scaffold/templates.js +8 -0
  334. package/dist/scaffold/templates.js.map +1 -1
  335. package/dist/scheduler/JobResultTriage.d.ts.map +1 -1
  336. package/dist/scheduler/JobResultTriage.js +10 -0
  337. package/dist/scheduler/JobResultTriage.js.map +1 -1
  338. package/dist/scheduler/JobScheduler.d.ts.map +1 -1
  339. package/dist/scheduler/JobScheduler.js +12 -0
  340. package/dist/scheduler/JobScheduler.js.map +1 -1
  341. package/dist/scheduler/MentorOnboardingRunner.d.ts +3 -0
  342. package/dist/scheduler/MentorOnboardingRunner.d.ts.map +1 -1
  343. package/dist/scheduler/MentorOnboardingRunner.js +24 -2
  344. package/dist/scheduler/MentorOnboardingRunner.js.map +1 -1
  345. package/dist/server/AgentServer.d.ts +2 -0
  346. package/dist/server/AgentServer.d.ts.map +1 -1
  347. package/dist/server/AgentServer.js +76 -15
  348. package/dist/server/AgentServer.js.map +1 -1
  349. package/dist/server/BootHealthBeacon.d.ts +3 -0
  350. package/dist/server/BootHealthBeacon.d.ts.map +1 -1
  351. package/dist/server/BootHealthBeacon.js +9 -0
  352. package/dist/server/BootHealthBeacon.js.map +1 -1
  353. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  354. package/dist/server/CapabilityIndex.js +10 -1
  355. package/dist/server/CapabilityIndex.js.map +1 -1
  356. package/dist/server/LifelineIngressGuard.d.ts.map +1 -1
  357. package/dist/server/LifelineIngressGuard.js +11 -0
  358. package/dist/server/LifelineIngressGuard.js.map +1 -1
  359. package/dist/server/PoolPollCache.d.ts +4 -0
  360. package/dist/server/PoolPollCache.d.ts.map +1 -1
  361. package/dist/server/PoolPollCache.js +33 -0
  362. package/dist/server/PoolPollCache.js.map +1 -1
  363. package/dist/server/machineRoutes.d.ts.map +1 -1
  364. package/dist/server/machineRoutes.js +6 -0
  365. package/dist/server/machineRoutes.js.map +1 -1
  366. package/dist/server/middleware.d.ts.map +1 -1
  367. package/dist/server/middleware.js +6 -0
  368. package/dist/server/middleware.js.map +1 -1
  369. package/dist/server/mobileConsoleTicket.d.ts +113 -0
  370. package/dist/server/mobileConsoleTicket.d.ts.map +1 -0
  371. package/dist/server/mobileConsoleTicket.js +405 -0
  372. package/dist/server/mobileConsoleTicket.js.map +1 -0
  373. package/dist/server/mobileConversationRoutes.d.ts.map +1 -1
  374. package/dist/server/mobileConversationRoutes.js +20 -1
  375. package/dist/server/mobileConversationRoutes.js.map +1 -1
  376. package/dist/server/mobileMediaRoutes.d.ts.map +1 -1
  377. package/dist/server/mobileMediaRoutes.js +3 -0
  378. package/dist/server/mobileMediaRoutes.js.map +1 -1
  379. package/dist/server/mobilePairingRoutes.d.ts +8 -2
  380. package/dist/server/mobilePairingRoutes.d.ts.map +1 -1
  381. package/dist/server/mobilePairingRoutes.js +67 -6
  382. package/dist/server/mobilePairingRoutes.js.map +1 -1
  383. package/dist/server/mobileSessionTerminalRoutes.d.ts +128 -0
  384. package/dist/server/mobileSessionTerminalRoutes.d.ts.map +1 -0
  385. package/dist/server/mobileSessionTerminalRoutes.js +389 -0
  386. package/dist/server/mobileSessionTerminalRoutes.js.map +1 -0
  387. package/dist/server/recommendedServiceRoutes.d.ts +13 -0
  388. package/dist/server/recommendedServiceRoutes.d.ts.map +1 -0
  389. package/dist/server/recommendedServiceRoutes.js +49 -0
  390. package/dist/server/recommendedServiceRoutes.js.map +1 -0
  391. package/dist/server/routes.d.ts +2 -0
  392. package/dist/server/routes.d.ts.map +1 -1
  393. package/dist/server/routes.js +170 -4
  394. package/dist/server/routes.js.map +1 -1
  395. package/dist/testing/selfActionRegistry.d.ts.map +1 -1
  396. package/dist/testing/selfActionRegistry.js +36 -0
  397. package/dist/testing/selfActionRegistry.js.map +1 -1
  398. package/dist/threadline/A2ACheckInProxy.d.ts.map +1 -1
  399. package/dist/threadline/A2ACheckInProxy.js +26 -15
  400. package/dist/threadline/A2ACheckInProxy.js.map +1 -1
  401. package/dist/threadline/AgentTrustManager.d.ts.map +1 -1
  402. package/dist/threadline/AgentTrustManager.js +3 -0
  403. package/dist/threadline/AgentTrustManager.js.map +1 -1
  404. package/dist/threadline/InboundIdLedger.d.ts.map +1 -1
  405. package/dist/threadline/InboundIdLedger.js +18 -1
  406. package/dist/threadline/InboundIdLedger.js.map +1 -1
  407. package/dist/threadline/NegotiatorGate.d.ts.map +1 -1
  408. package/dist/threadline/NegotiatorGate.js +11 -0
  409. package/dist/threadline/NegotiatorGate.js.map +1 -1
  410. package/dist/threadline/PipeSessionSpawner.d.ts.map +1 -1
  411. package/dist/threadline/PipeSessionSpawner.js +8 -0
  412. package/dist/threadline/PipeSessionSpawner.js.map +1 -1
  413. package/dist/threadline/ThreadlineRouter.d.ts.map +1 -1
  414. package/dist/threadline/ThreadlineRouter.js +13 -0
  415. package/dist/threadline/ThreadlineRouter.js.map +1 -1
  416. package/dist/threadline/pairingReplicationWiring.d.ts.map +1 -1
  417. package/dist/threadline/pairingReplicationWiring.js +9 -0
  418. package/dist/threadline/pairingReplicationWiring.js.map +1 -1
  419. package/dist/threadline/relayForward.d.ts.map +1 -1
  420. package/dist/threadline/relayForward.js +13 -2
  421. package/dist/threadline/relayForward.js.map +1 -1
  422. package/dist/threadline/relayUnknownSenderTrust.d.ts +0 -9
  423. package/dist/threadline/relayUnknownSenderTrust.d.ts.map +1 -1
  424. package/dist/threadline/relayUnknownSenderTrust.js +16 -0
  425. package/dist/threadline/relayUnknownSenderTrust.js.map +1 -1
  426. package/package.json +1 -1
  427. package/scripts/check-constitution-pairing.mjs +273 -0
  428. package/scripts/safe-merge.mjs +9 -0
  429. package/src/data/builtin-manifest.json +103 -103
  430. package/src/data/feature-ladders.json +113 -113
  431. package/src/data/stageBCertifiedSet.ts +12 -0
  432. package/src/data/standards-guard-index.json +1 -1
  433. package/src/data/standards-guard-index.meta.json +2 -2
  434. package/src/data/standards-registry.meta.json +1 -1
  435. package/src/data/state-coherence-registry.json +18 -0
  436. package/src/scaffold/templates.ts +9 -0
  437. package/upgrades/1.3.1650.md +105 -0
  438. package/upgrades/mobile-console-device-signin.eli16.md +5 -0
  439. package/upgrades/side-effects/cloud-key-internal-calls.md +116 -0
  440. package/upgrades/side-effects/constitution-alignment.eli16.md +11 -0
  441. package/upgrades/side-effects/constitution-alignment.md +69 -0
  442. package/upgrades/side-effects/feature-evidence-recording.eli16.md +3 -0
  443. package/upgrades/side-effects/feature-evidence-recording.md +66 -0
  444. package/upgrades/side-effects/feedback-reroute-admission-parity.md +77 -0
  445. package/upgrades/side-effects/mobile-console-device-signin.md +102 -0
  446. package/upgrades/side-effects/mobile-native-session-screen.md +88 -0
  447. package/upgrades/side-effects/operator-needs-first-screen.md +87 -0
  448. package/upgrades/side-effects/recommended-services-choices.md +50 -0
  449. package/upgrades/side-effects/rerouted-lifetime-active-process.md +63 -0
  450. package/upgrades/side-effects/undated-resurfacer-e2e-wait.eli16.md +5 -0
  451. package/upgrades/side-effects/undated-resurfacer-e2e-wait.md +9 -0
@@ -3,6 +3,7 @@
3
3
  * the boot-time TCC-protected path detection + /guards row (see the
4
4
  * TccProtectedPathGuard block beside the worktree detector).
5
5
  */
6
+ import { configureClaudeChildAuth, sweepClaudeAuthEnvFiles } from '../core/claudeChildAuth.js';
6
7
  import { slackHistoryLabel } from '../messaging/slack/threadHistoryLabel.js';
7
8
  import { readPairingOwnerName } from '../threadline/pairingOwnerName.js';
8
9
  import { buildThrowawayJobGuard, checkThrowawayExpiry, describeExpiry, takeLastAutoStartRefusal, throwawayStartupDecision } from '../core/ThrowawayAgentGuard.js';
@@ -61,7 +62,7 @@ import { StandDownAudit } from '../core/StandDownAudit.js';
61
62
  import { resolveStandardsRegistry } from '../core/standardsRegistryPath.js';
62
63
  import { chunkLiteralForTmux, buildLiteralSendArgs } from '../core/tmuxLiteralSend.js';
63
64
  import { parseStandardsRegistry } from '../core/StandardsRegistryParser.js';
64
- import { loadConfig, ensureStateDir, detectTmuxPath, detectGeminiPath } from '../core/Config.js';
65
+ import { loadConfig, ensureStateDir, detectTmuxPath, detectGeminiPath, detectClaudePath, readConfiguredAnthropicKey } from '../core/Config.js';
65
66
  import { handleProcessLevelError } from '../core/uncaughtExceptionPolicy.js';
66
67
  import { planInboundLossNotices } from '../core/inboundLossRouting.js';
67
68
  import { heartbeatFreshEnoughToRerecord } from '../core/MachineHeartbeat.js';
@@ -75,6 +76,7 @@ import { SingleInstanceLock, installReleaseHandlers } from '../core/SingleInstan
75
76
  import { resolveDevAgentGate, resolveStateSyncStores } from '../core/devAgentGate.js';
76
77
  import { JOB_LEASE_POOL_AUTHORITY_READY } from '../scheduler/JobLeaseClaimStore.js';
77
78
  import { resolveRelayUnknownSenderTrustMode } from '../threadline/relayUnknownSenderTrust.js';
79
+ import { featureEvidence } from '../monitoring/FeatureEvidenceLog.js';
78
80
  import { resolveEncryptToPinnedMode, encryptToPinnedModeName } from '../threadline/encryptToPinned.js';
79
81
  import { resolveRefuseDowngradeMode } from '../threadline/refuseDowngrade.js';
80
82
  import { MarkedPairingInviteFlow } from '../threadline/PairingPendingAcceptMarkers.js';
@@ -646,6 +648,9 @@ let _singleMachineFailoverGap = null;
646
648
  // `GET /pool/missing-login` can read the detector constructed deep in the mesh
647
649
  // peer-presence wiring. Null when the guard is dark (route 503s).
648
650
  let _missingLoginSession = null;
651
+ // The journal compaction pass runs at boot, before the evidence log is wired by
652
+ // AgentServer; its row is held here and written straight after that construction.
653
+ let _pendingCompactionEvidence = null;
649
654
  // Module-level handle for the SessionPoolFailoverRunner driver (§Rollout, Track H)
650
655
  // so `GET /session-pool/failover-runner` can read its status(). Null when the
651
656
  // runner is dark (dev-gated) — the route 503s. Constructed inside the rollout-gate
@@ -808,6 +813,8 @@ let _pinPlacementMetadata = null;
808
813
  let _ws13SustainedOnline = null;
809
814
  /** Cross-machine secret-sync (spec Phase 4): route-facing handle (push lever + read-only status). */
810
815
  let _secretSyncHandle = null;
816
+ /** The boot-time escrow result, recorded as evidence once the evidence log is wired. Flags only, no key material. */
817
+ let _recoveryEscrowEvidence = null;
811
818
  /** Pool Dashboard Streaming (POOL-DASHBOARD-STREAM-SPEC §2.3): shared single-use
812
819
  * ticket store — minted by the `pool-stream-ticket` mesh verb, consumed by the
813
820
  * WebSocketManager's /pool-stream upgrade. Constructed in the mesh-setup block. */
@@ -1001,6 +1008,7 @@ let _spawnAdmission = null;
1001
1008
  /** Native app conversations (mobile-native-conversations, increment 1) — late-bound for the replication observers. */
1002
1009
  let _appConversationService = null;
1003
1010
  let _ecosystemLedger = null;
1011
+ let _recommendedServicesLedger = null;
1004
1012
  // trustworthy-machine-load C5: one fixed holding notice per topic per overload
1005
1013
  // episode when EVERY machine refuses new work (30-min cooldown; the message
1006
1014
  // itself is already in durable custody, this only tells the user why it waits).
@@ -2484,6 +2492,14 @@ getHubClassifierDeps) {
2484
2492
  modelTier: clsDeps.modelTier,
2485
2493
  });
2486
2494
  const willAct = result.isCommand && !clsDeps.dryRun;
2495
+ // Same scope as the audit below: LLM-engaged verdicts, never the prefilter-skip bulk.
2496
+ if (result.source !== 'prefilter-skip') {
2497
+ featureEvidence.record('threadline.hubIntent', {
2498
+ kind: result.source === 'fail-open' ? 'error' : 'fired',
2499
+ reason: result.source === 'fail-open' ? 'classifier-fail-open' : result.isCommand ? (willAct ? 'swallow' : 'would-swallow') : 'would-pass',
2500
+ context: { topicId, dryRun: clsDeps.dryRun, source: result.source, intent: result.intent ?? null, confidence: result.confidence ?? null, targetTopicId: result.targetTopicId ?? null },
2501
+ });
2502
+ }
2487
2503
  // Audit the soak: log LLM-engaged decisions (a prefilter-skip is the
2488
2504
  // bulk of traffic and always a would-pass — skipping it cuts volume
2489
2505
  // AND the message-preview privacy surface). Never gates the message.
@@ -2528,6 +2544,7 @@ getHubClassifierDeps) {
2528
2544
  }
2529
2545
  catch (err) {
2530
2546
  console.warn(`[telegram] hub-command intercept error (fail-open): ${err instanceof Error ? err.message : err}`);
2547
+ featureEvidence.record('threadline.hubIntent', { kind: 'error', reason: 'intercept-threw-fail-open', context: { errorName: err instanceof Error ? err.name : 'unknown' } });
2531
2548
  }
2532
2549
  }
2533
2550
  // ── Fix commands from notification messages ──────────────────────
@@ -3861,6 +3878,10 @@ export async function startServer(options) {
3861
3878
  watchPaths: ['updates.autoApply', 'sessions.maxSessions', 'monitoring'],
3862
3879
  });
3863
3880
  liveConfig.start();
3881
+ // Every server-side `claude` child gets the configured sign-in key from here, read per call so a
3882
+ // restored key applies at once (spec cloud-key-internal-calls). Off: sessions.claudeChildAuth.enabled.
3883
+ configureClaudeChildAuth(() => liveConfig.get('sessions.claudeChildAuth.enabled', true) === false ? undefined : config.sessions?.anthropicApiKey, () => config.sessions?.anthropicBaseUrl);
3884
+ sweepClaudeAuthEnvFiles(config.stateDir);
3864
3885
  // Threadline → Telegram bridge config — settings surface for the bridge
3865
3886
  // module. Default-OFF auto-create ships from day one;
3866
3887
  // see TelegramBridgeConfig for the policy.
@@ -4075,6 +4096,7 @@ export async function startServer(options) {
4075
4096
  // covers the window on the fleet. D4-verified read-only (localhost-only inbound
4076
4097
  // socket, zero outbound). Belt-and-suspenders, not a boot reorder.
4077
4098
  let bootBeacon;
4099
+ let bootBeaconBindErrorCode = null;
4078
4100
  if (resolveDevAgentGate(config.monitoring?.bootHealthBeacon?.enabled, config)) {
4079
4101
  try {
4080
4102
  bootBeacon = new BootHealthBeacon(config.port);
@@ -4086,6 +4108,7 @@ export async function startServer(options) {
4086
4108
  // failure must NEVER block the server boot (the startupGrace bump still
4087
4109
  // covers the health window). Logged here, not swallowed silently.
4088
4110
  bootBeacon = undefined;
4111
+ bootBeaconBindErrorCode = err?.code ?? 'unknown';
4089
4112
  console.error(' Boot health beacon failed to start (non-fatal):', err instanceof Error ? err.message : err);
4090
4113
  }
4091
4114
  }
@@ -4779,6 +4802,9 @@ export async function startServer(options) {
4779
4802
  // docs/specs/ecosystem-idea-pipeline.md: inert registration; the store is injected below whenever the pipeline is on.
4780
4803
  const { ECOSYSTEM_IDEAS_KIND_REGISTRATION } = await import('../ecosystem/EcosystemIdeasReplicatedStore.js');
4781
4804
  replicatedKindRegistry.register(ECOSYSTEM_IDEAS_KIND_REGISTRATION);
4805
+ // docs/specs/recommended-services.md: a person's choices follow them across machines.
4806
+ const { RECOMMENDED_SERVICES_KIND_REGISTRATION } = await import('../recommended/RecommendedServicesReplicatedStore.js');
4807
+ replicatedKindRegistry.register(RECOMMENDED_SERVICES_KIND_REGISTRATION);
4782
4808
  // mobile-native-conversations §4.8 — the `mobileDeviceKeyLedger` kind (inert registration; on
4783
4809
  // whenever native app conversations are on, so a signed record can be checked on any machine).
4784
4810
  const { DEVICE_KEY_LEDGER_KIND_REGISTRATION } = await import('../core/MobileDeviceKeyLedgerReplicatedStore.js');
@@ -4940,13 +4966,35 @@ export async function startServer(options) {
4940
4966
  const compactionConfig = config.multiMachine?.coherenceJournal?.replication?.compaction;
4941
4967
  if (compactionConfig?.run === true) {
4942
4968
  const { ReplicatedJournalCompactor } = await import('../core/ReplicatedJournalCompactor.js');
4943
- new ReplicatedJournalCompactor({
4944
- stateDir: config.stateDir,
4945
- registry: replicatedKindRegistry,
4946
- enabled: true,
4947
- dryRun: compactionConfig.dryRun ?? true,
4948
- logger: (m) => console.log(pc.dim(` ${m}`)),
4949
- }).run();
4969
+ try {
4970
+ const compaction = new ReplicatedJournalCompactor({
4971
+ stateDir: config.stateDir,
4972
+ registry: replicatedKindRegistry,
4973
+ enabled: true,
4974
+ dryRun: compactionConfig.dryRun ?? true,
4975
+ logger: (m) => console.log(pc.dim(` ${m}`)),
4976
+ }).run();
4977
+ _pendingCompactionEvidence = {
4978
+ kind: 'fired',
4979
+ reason: compaction.dryRun ? 'would-compact' : 'compacted',
4980
+ context: {
4981
+ dryRun: compaction.dryRun,
4982
+ filesCompacted: compaction.filesCompacted,
4983
+ originalRecords: compaction.originalRecords,
4984
+ compactedRecords: compaction.compactedRecords,
4985
+ bytesBefore: compaction.bytesBefore,
4986
+ bytesAfter: compaction.bytesAfter,
4987
+ },
4988
+ };
4989
+ }
4990
+ catch (compactionErr) {
4991
+ _pendingCompactionEvidence = {
4992
+ kind: 'error',
4993
+ reason: 'compaction-failed',
4994
+ context: { dryRun: compactionConfig.dryRun ?? true, errorName: compactionErr instanceof Error ? compactionErr.name : 'unknown' },
4995
+ };
4996
+ throw compactionErr;
4997
+ }
4950
4998
  // A real run replaced streams atomically; rebuild from the committed files.
4951
4999
  }
4952
5000
  coherenceJournal.setReplicatedRecordCommitObserver((kind, entries) => {
@@ -4973,6 +5021,14 @@ export async function startServer(options) {
4973
5021
  for (const e of entries)
4974
5022
  _ecosystemLedger.ingestReplicated(e.data.event);
4975
5023
  }
5024
+ // A person's choices: each row lands only when it verifies under the machine it names.
5025
+ if (kind === 'recommended-service-record' && _recommendedServicesLedger) {
5026
+ for (const e of entries) {
5027
+ const r = _recommendedServicesLedger.ingestReplicated(e.data.row);
5028
+ if (r === 'bad-signature' || r === 'unverifiable')
5029
+ console.warn(` [recommended-services] a replicated row was not accepted (${r})`);
5030
+ }
5031
+ }
4976
5032
  // Device-key ledger rows: each lands only when it verifies under the pinned key of the machine it names.
4977
5033
  if (kind === 'mobile-device-key-ledger-row' && _appConversationService?.deps.keyLedger) {
4978
5034
  const ledger = _appConversationService.deps.keyLedger;
@@ -5088,6 +5144,11 @@ export async function startServer(options) {
5088
5144
  const _appNativeOn = _isMobileNativeEnabled(config);
5089
5145
  const _stateSyncStoresResolved = (() => {
5090
5146
  let s = _stateSyncStoresBase ?? {};
5147
+ // On wherever the journal is live: a yes or no belongs to the person, not one machine
5148
+ // (docs/specs/recommended-services.md). Without the journal there is no applier, so it isn't advertised.
5149
+ const _recommendedServicesOn = !!coherenceJournal && _stateSyncStoresBase?.recommendedServices?.enabled !== false;
5150
+ if (_recommendedServicesOn)
5151
+ s = { ...s, recommendedServices: { enabled: true } };
5091
5152
  if (_appNativeOn)
5092
5153
  s = { ...s, appConversations: { enabled: true }, mobileDeviceKeyLedger: { enabled: true } };
5093
5154
  if (resolveDevAgentGate(config.ecosystemIdeas?.enabled, config))
@@ -5098,7 +5159,7 @@ export async function startServer(options) {
5098
5159
  s = { ...s, topicPins: { enabled: true } };
5099
5160
  if (_staleOwnerReleaseResolved)
5100
5161
  s = { ...s, topicClaimAnnotations: { enabled: true } };
5101
- return _appNativeOn || _accountFollowMeEnabled || _pinReplicateEnabled || _staleOwnerReleaseResolved || _stateSyncStoresBase ? s : _stateSyncStoresBase;
5162
+ return _recommendedServicesOn || _appNativeOn || _accountFollowMeEnabled || _pinReplicateEnabled || _staleOwnerReleaseResolved || _stateSyncStoresBase ? s : _stateSyncStoresBase;
5102
5163
  })();
5103
5164
  // WS2 send-side: the generic journal-backed record emitter (the concrete emitter
5104
5165
  // the per-store managers' emit hooks call). Needs the journal sink, the HLC clock,
@@ -7682,6 +7743,7 @@ export async function startServer(options) {
7682
7743
  // Never let a pauser fault take down the boot path or the interval.
7683
7744
  clpLastError = err instanceof Error ? err.message : String(err);
7684
7745
  console.error(pc.red(` CrashLoopPauser pass failed: ${clpLastError}`));
7746
+ featureEvidence.record('monitoring.crashLoopPauser', { kind: 'error', reason: 'pause pass failed', context: { dryRun: clpDryRun, errorName: err instanceof Error ? err.name : 'unknown' } });
7685
7747
  }
7686
7748
  };
7687
7749
  const clpInitialDelay = clpCfg.initialPassDelayMs ?? 10 * 60_000;
@@ -8808,6 +8870,50 @@ export async function startServer(options) {
8808
8870
  console.warn(` [app-conversations] wiring failed: ${err instanceof Error ? err.message : String(err)}`);
8809
8871
  }
8810
8872
  }
8873
+ // docs/specs/recommended-services.md: built here so its rows replicate; no identity means no ledger, and the routes answer 503.
8874
+ try {
8875
+ const { loadMachineSigner, identityKeyLookup } = await import('../core/AppRecordSignatures.js');
8876
+ const { RecommendedServicesLedger } = await import('../recommended/RecommendedServicesLedger.js');
8877
+ const recRepl = await import('../recommended/RecommendedServicesReplicatedStore.js');
8878
+ const signer = loadMachineSigner(config.stateDir);
8879
+ if (signer) {
8880
+ const ledger = new RecommendedServicesLedger({ stateDir: config.stateDir, signer, keyLookup: identityKeyLookup(config.stateDir) });
8881
+ if (replicatedRecordEmitter) {
8882
+ const emitter = replicatedRecordEmitter;
8883
+ const emitRow = (row) => {
8884
+ const { outcome } = emitter.emit(recRepl.RECOMMENDED_SERVICES_STORE_KEY, recRepl.deriveRecommendedServiceRecordKey(row.eventId), recRepl.buildRecommendedServiceRecordData(row));
8885
+ if (outcome !== 'emitted')
8886
+ console.warn(` [recommended-services] a choice was not replicated yet (${outcome}); it is sent again at next boot`);
8887
+ };
8888
+ ledger.setReplicationHook(emitRow);
8889
+ ledger.setReplicating(_stateSyncStoresResolved?.recommendedServices?.enabled === true && config.multiMachine?.coherenceJournal?.replication?.enabled === true);
8890
+ // Rows written while the journal was off, or dropped by a rate cap, go out now.
8891
+ if (replicatedPeerStreamReader && cjOwnMachineId) {
8892
+ for (const row of ledger.all()) {
8893
+ if (row.machineId !== signer.machineId())
8894
+ continue;
8895
+ const rk = recRepl.deriveRecommendedServiceRecordKey(row.eventId);
8896
+ if (!replicatedPeerStreamReader.loadOriginRecords(recRepl.RECOMMENDED_SERVICES_STORE_KEY, rk).some((o) => o.origin === cjOwnMachineId))
8897
+ emitRow(row);
8898
+ }
8899
+ }
8900
+ }
8901
+ if (replicatedPeerStreamReader && cjOwnMachineId) {
8902
+ const reader = replicatedPeerStreamReader;
8903
+ for (const rk of reader.listRecordKeys(recRepl.RECOMMENDED_SERVICES_STORE_KEY)) {
8904
+ for (const r of reader.loadOriginRecords(recRepl.RECOMMENDED_SERVICES_STORE_KEY, rk)) {
8905
+ if (r.origin !== cjOwnMachineId)
8906
+ ledger.ingestReplicated(r.data.row);
8907
+ }
8908
+ }
8909
+ }
8910
+ _recommendedServicesLedger = ledger;
8911
+ }
8912
+ }
8913
+ catch (err) {
8914
+ // @silent-fallback-ok: reported; the routes answer 503 and nothing else depends on this
8915
+ console.warn(` [recommended-services] ledger wiring failed: ${err instanceof Error ? err.message : String(err)}`);
8916
+ }
8811
8917
  // docs/specs/ecosystem-idea-pipeline.md: the ledger is built here so its events replicate; AgentServer builds the service.
8812
8918
  if (resolveDevAgentGate(config.ecosystemIdeas?.enabled, config)) {
8813
8919
  try {
@@ -14068,9 +14174,26 @@ export async function startServer(options) {
14068
14174
  if (replicatedRecordEmitter && _accountFollowMeEnabled) {
14069
14175
  const emitter = replicatedRecordEmitter;
14070
14176
  const { SUBSCRIPTION_ACCOUNT_META_STORE_KEY, deriveSubscriptionAccountMetaRecordKey, buildSubscriptionAccountMetaData, buildSubscriptionAccountMetaTombstoneData, } = await import('../core/SubscriptionAccountMetaReplicatedStore.js');
14177
+ // Every quota change re-projects an account, so one row per op and outcome per ten minutes. No account ids.
14178
+ const followMeEvidence = (op, outcome) => {
14179
+ const failed = outcome === 'error' || outcome === 'unconfirmed' || outcome.startsWith('dropped:');
14180
+ featureEvidence.recordAtMostEvery('multiMachine.accountFollowMe', `${op}:${outcome}`, 600_000, {
14181
+ kind: outcome === 'emitted' ? 'fired' : failed ? 'error' : 'held',
14182
+ reason: `account-meta-${op}:${outcome}`,
14183
+ context: { op, outcome },
14184
+ });
14185
+ };
14071
14186
  subscriptionPool.setMetaReplicationEmitter({
14072
- emitPut: (acct) => emitter.emit(SUBSCRIPTION_ACCOUNT_META_STORE_KEY, deriveSubscriptionAccountMetaRecordKey(acct.id), (hlc, origin, observed) => buildSubscriptionAccountMetaData({ account: acct, hlc, origin, observed })),
14073
- emitDelete: (accountId, deletedAt) => emitter.emit(SUBSCRIPTION_ACCOUNT_META_STORE_KEY, deriveSubscriptionAccountMetaRecordKey(accountId), (hlc, origin, observed) => buildSubscriptionAccountMetaTombstoneData({ accountId, hlc, origin, deletedAt, observed })),
14187
+ emitPut: (acct) => {
14188
+ const projected = emitter.emit(SUBSCRIPTION_ACCOUNT_META_STORE_KEY, deriveSubscriptionAccountMetaRecordKey(acct.id), (hlc, origin, observed) => buildSubscriptionAccountMetaData({ account: acct, hlc, origin, observed }));
14189
+ followMeEvidence('put', projected.outcome);
14190
+ return projected;
14191
+ },
14192
+ emitDelete: (accountId, deletedAt) => {
14193
+ const projected = emitter.emit(SUBSCRIPTION_ACCOUNT_META_STORE_KEY, deriveSubscriptionAccountMetaRecordKey(accountId), (hlc, origin, observed) => buildSubscriptionAccountMetaTombstoneData({ accountId, hlc, origin, deletedAt, observed }));
14194
+ followMeEvidence('delete', projected.outcome);
14195
+ return projected;
14196
+ },
14074
14197
  });
14075
14198
  }
14076
14199
  // POOL-AWARE QUOTA THROTTLE wiring (docs/specs/POOL-AWARE-QUOTA-THROTTLE-SPEC.md):
@@ -16350,6 +16473,23 @@ export async function startServer(options) {
16350
16473
  externalBlockSweepMs: aoftRawCfg.externalBlockSweepMs,
16351
16474
  holdsLease: () => (leaseCoordinatorRef ? leaseCoordinatorRef.holdsLease() : true),
16352
16475
  });
16476
+ // The aoft.* events have no other reader: keep them, with no message text (ids and reason codes only).
16477
+ for (const [event, kind] of [
16478
+ ['aoft.would-suppress', 'fired'], ['aoft.suppressed', 'fired'],
16479
+ ['aoft.would-reroute-terminal', 'fired'], ['aoft.terminal-rerouted', 'fired'],
16480
+ ['aoft.would-deadletter-external', 'fired'], ['aoft.deadlettered-external', 'fired'],
16481
+ ['aoft.external-block-recorded-internal', 'held'],
16482
+ ['aoft.graveyard-reconciled', 'fired'],
16483
+ ['aoft.beacon-id-leak', 'error'],
16484
+ ]) {
16485
+ promiseBeacon.on(event, (e) => {
16486
+ featureEvidence.record('commitments.agentOwnedFollowthrough', {
16487
+ kind,
16488
+ reason: event.replace('aoft.', '') + (e?.reason ? `: ${e.reason}` : ''),
16489
+ context: { commitmentId: e?.id ?? null, topicId: e?.topicId ?? null, sendKind: e?.kind ?? null, dryRun: event.includes('would-') || e?.dryRun === true, closed: e?.closed ?? null, wouldClose: e?.wouldClose ?? null, leakedTerms: Array.isArray(e?.terms) ? e.terms.length : null },
16490
+ });
16491
+ });
16492
+ }
16353
16493
  promiseBeacon.start();
16354
16494
  globalThis.__instarPromiseBeacon = promiseBeacon;
16355
16495
  // ── AutonomousProgressHeartbeat ──────────────────────────────────
@@ -16467,6 +16607,30 @@ export async function startServer(options) {
16467
16607
  maxHeartbeatsPerRun: ahRawCfg.maxHeartbeatsPerRun,
16468
16608
  recentOutputChangeWindowMs: ahRawCfg.recentOutputChangeWindowMs,
16469
16609
  });
16610
+ // The focus line is a session's own words: never in a row. Suppressions run every tick, so only a change of reason per topic writes one.
16611
+ const ahLastHold = new Map();
16612
+ autonomousHeartbeat.on('would-emit', (e) => {
16613
+ ahLastHold.delete(e.topicId);
16614
+ featureEvidence.record('monitoring.autonomousHeartbeat', { kind: 'fired', reason: 'would emit (dry run)', context: { topicId: e.topicId, minutesSilent: e.minutesSilent, dryRun: true } });
16615
+ });
16616
+ autonomousHeartbeat.on('emitted', (e) => {
16617
+ ahLastHold.delete(e.topicId);
16618
+ featureEvidence.record('monitoring.autonomousHeartbeat', { kind: 'fired', reason: 'emitted', context: { topicId: e.topicId, minutesSilent: e.minutesSilent, dryRun: false } });
16619
+ });
16620
+ autonomousHeartbeat.on('send-error', (e) => {
16621
+ featureEvidence.record('monitoring.autonomousHeartbeat', { kind: 'error', reason: 'send failed', context: { topicId: e.topicId, errorName: e.err instanceof Error ? e.err.name : 'unknown' } });
16622
+ });
16623
+ autonomousHeartbeat.on('tick-error', (err) => {
16624
+ featureEvidence.recordAtMostEvery('monitoring.autonomousHeartbeat', 'tick-error', 60 * 60 * 1000, { kind: 'error', reason: 'tick failed', context: { errorName: err instanceof Error ? err.name : 'unknown' } });
16625
+ });
16626
+ autonomousHeartbeat.on('suppressed', (e) => {
16627
+ if (ahLastHold.get(e.topicId) === e.reason)
16628
+ return;
16629
+ if (ahLastHold.size >= 256)
16630
+ ahLastHold.clear();
16631
+ ahLastHold.set(e.topicId, e.reason);
16632
+ featureEvidence.record('monitoring.autonomousHeartbeat', { kind: 'held', reason: `suppressed: ${e.reason}`, context: { topicId: e.topicId } });
16633
+ });
16470
16634
  autonomousHeartbeat.start();
16471
16635
  globalThis.__instarAutonomousHeartbeat = autonomousHeartbeat;
16472
16636
  guardRegistry.register('monitoring.autonomousHeartbeat.enabled', () => autonomousHeartbeat.guardStatus());
@@ -19599,6 +19763,17 @@ export async function startServer(options) {
19599
19763
  });
19600
19764
  if (featureRegistryReady) {
19601
19765
  featureRegistry.bootstrap(config);
19766
+ // docs/specs/recommended-services.md: old declines carry over before any list is built.
19767
+ if (_recommendedServicesLedger) {
19768
+ try {
19769
+ const { importLegacyDeclines } = await import('../recommended/legacyDeclines.js');
19770
+ importLegacyDeclines(_recommendedServicesLedger, (id) => featureRegistry.getState(id, 'default')?.discoveryState ?? null);
19771
+ }
19772
+ catch (err) {
19773
+ // @silent-fallback-ok: reported; idempotent, so it retries at next boot, and optional work never blocks startup
19774
+ console.warn(` [recommended-services] old declines could not be imported yet: ${err instanceof Error ? err.message : String(err)}`);
19775
+ }
19776
+ }
19602
19777
  }
19603
19778
  {
19604
19779
  const summaries = featureRegistry.getSummaries();
@@ -20474,6 +20649,102 @@ export async function startServer(options) {
20474
20649
  _swapAntiThrashEngine = null;
20475
20650
  _swapWorkGate = null;
20476
20651
  }
20652
+ // A dead sign-in key on a key-only agent: confirmed, told, recovered (spec cloud-key-internal-calls).
20653
+ // Wired here, outside the subscription pool block, because these agents may have no pool.
20654
+ {
20655
+ const { ClaudeKeyHealth, claudeKeyFingerprint, setActiveClaudeKeyHealth } = await import('../core/ClaudeKeyHealth.js');
20656
+ const { buildClaudeKeyProbe } = await import('../core/claudeKeyProbe.js');
20657
+ const { configuredClaudeOauthKey, setClaudeCallOutcomeListener } = await import('../core/claudeChildAuth.js');
20658
+ const keyHealthOn = () => liveConfig.get('sessions.claudeKeyHealth.enabled', true) !== false;
20659
+ const sendToSlackKey = async (routingKey, text) => {
20660
+ const [channelId, threadTs] = routingKey.split(':');
20661
+ await _slackAdapter.sendToChannel(channelId, text, threadTs ? { thread_ts: threadTs } : undefined);
20662
+ };
20663
+ // The disk read covers a topic bound after this server booted, as SessionRefresh does.
20664
+ const topicForSession = (name) => telegram?.getTopicForSession(name) ?? telegram?.resolveTopicForSessionFromDisk?.(name) ?? null;
20665
+ const claudeKeyHealth = new ClaudeKeyHealth({
20666
+ stateFile: path.join(config.stateDir, 'state', 'claude-key-health.json'),
20667
+ currentKey: () => (keyHealthOn() ? configuredClaudeOauthKey() : undefined),
20668
+ currentRawKey: () => config.sessions.anthropicApiKey,
20669
+ readKeyFromDisk: () => (keyHealthOn() ? readConfiguredAnthropicKey(config.stateDir) : undefined),
20670
+ applyKey: (key) => {
20671
+ config.sessions.anthropicApiKey = key ?? undefined;
20672
+ sessionManager.setAnthropicKey(key);
20673
+ },
20674
+ probe: buildClaudeKeyProbe({
20675
+ claudePath: () => resolveFrameworkBinaryPath({
20676
+ framework: 'claude-code',
20677
+ frameworkBinaryPaths: config.sessions.frameworkBinaryPaths,
20678
+ claudePath: config.sessions.claudePath,
20679
+ configuredFramework: config.sessions.framework,
20680
+ }) ?? detectClaudePath(),
20681
+ baseUrl: () => config.sessions.anthropicBaseUrl,
20682
+ }),
20683
+ // Fixed server text straight to the adapters: the model is what is down, and `notify` returns
20684
+ // nothing, so it can't say whether anyone was told.
20685
+ notifyOperator: async (text) => {
20686
+ let delivered = false;
20687
+ const hubTopicId = state.get('agent-attention-topic') ?? 0;
20688
+ if (telegram && hubTopicId) {
20689
+ try {
20690
+ await telegram.sendToTopic(hubTopicId, text);
20691
+ delivered = true;
20692
+ }
20693
+ catch (err) { /* @silent-fallback-ok: `delivered` stays false, which drives the retry and its capped report */
20694
+ console.warn(`[ClaudeKeyHealth] Telegram notice failed: ${err instanceof Error ? err.message : String(err)}`);
20695
+ }
20696
+ }
20697
+ const attentionChannel = state.get('slack-attention-channel');
20698
+ if (_slackAdapter && attentionChannel) {
20699
+ try {
20700
+ await _slackAdapter.sendToChannel(attentionChannel, text);
20701
+ delivered = true;
20702
+ }
20703
+ catch (err) { /* @silent-fallback-ok: `delivered` stays false, which drives the retry and its capped report */
20704
+ console.warn(`[ClaudeKeyHealth] Slack notice failed: ${err instanceof Error ? err.message : String(err)}`);
20705
+ }
20706
+ }
20707
+ return delivered;
20708
+ },
20709
+ notifyPerson: async (sessionName, text) => {
20710
+ const topicId = topicForSession(sessionName);
20711
+ if (topicId !== null) {
20712
+ await telegram.sendToTopic(topicId, text);
20713
+ return true;
20714
+ }
20715
+ const routingKey = _slackAdapter?.getChannelForSession(sessionName) ?? null;
20716
+ if (routingKey !== null) {
20717
+ await sendToSlackKey(routingKey, text);
20718
+ return true;
20719
+ }
20720
+ return false;
20721
+ },
20722
+ listStuckSessions: async () => (await sessionManager.listSessionsAtLoginScreen()).filter((name) => topicForSession(name) !== null || (_slackAdapter?.getChannelForSession(name) ?? null) !== null),
20723
+ sessionLaunchFingerprint: (tmuxSession) => {
20724
+ const launched = sessionManager.sessionLaunchKey(tmuxSession);
20725
+ return launched ? claudeKeyFingerprint(launched) : null;
20726
+ },
20727
+ refresh: async (sessionName, prompt) => {
20728
+ if (!_sessionRefresh)
20729
+ return { ok: false, reason: 'session refresh not available' };
20730
+ const r = await _sessionRefresh.refreshSession({ sessionName, followUpPrompt: prompt, reason: 'claude-key-restored' });
20731
+ return r.ok ? { ok: true, newSessionName: r.newSessionName } : { ok: false, reason: r.code };
20732
+ },
20733
+ clearLoginReports: () => sessionManager.clearInteractiveLoginReports(),
20734
+ report: ({ reason, impact }) => DegradationReporter.getInstance().report({
20735
+ feature: 'ClaudeKeyHealth',
20736
+ primary: 'the configured Claude sign-in key authenticates every model call',
20737
+ fallback: 'the operator is told and stuck conversations wait for a working key',
20738
+ reason,
20739
+ impact,
20740
+ }),
20741
+ logger: { log: (m) => console.log(m), warn: (m) => console.warn(m) },
20742
+ });
20743
+ setActiveClaudeKeyHealth(claudeKeyHealth);
20744
+ setClaudeCallOutcomeListener((outcome) => claudeKeyHealth.noteCallOutcome(outcome));
20745
+ sessionManager.prependInteractiveLoginExpiredSink((signal) => claudeKeyHealth.handle(signal));
20746
+ void claudeKeyHealth.boot().catch((err) => console.warn(`[ClaudeKeyHealth] boot failed: ${err instanceof Error ? err.message : String(err)}`));
20747
+ }
20477
20748
  // SessionRefresh — agent-initiated session respawn. Requires a Telegram
20478
20749
  // adapter (v1 scope: Telegram-bound sessions only). The respawner closure
20479
20750
  // captures `topicMemory` by reference, so even if topicMemory is wired up
@@ -23415,6 +23686,7 @@ export async function startServer(options) {
23415
23686
  // root at already-paired peers remains an explicit operator/PIN step;
23416
23687
  // the bearer recovery path can never become the first root writer.
23417
23688
  const escrow = machineRecoveryKey.ensure(meshSelfId, own.recoveryEpoch ?? 0, own.recoveryPublicKey);
23689
+ _recoveryEscrowEvidence = { minted: !!escrow, recoveryEpoch: own.recoveryEpoch ?? 0, hadRoot: !!own.recoveryPublicKey };
23418
23690
  if (own.recoveryPublicKey && !escrow) {
23419
23691
  try {
23420
23692
  _meshAttentionRaise?.({
@@ -24619,6 +24891,9 @@ export async function startServer(options) {
24619
24891
  // release replicates exactly like the user-move release does. A lost CAS
24620
24892
  // (peer advanced the epoch first) is a no-op here — we never retry/force.
24621
24893
  emitPlacement(sk, r, 'released', prevOwner);
24894
+ featureEvidence.record('multiMachine.ownershipFollowsLiveWork', r.ok
24895
+ ? { kind: 'fired', reason: 'release-on-complete: ownership released', context: { topicId: sk, part: 'release-on-complete', prevOwner: prevOwner ?? null } }
24896
+ : { kind: 'error', reason: 'release-on-complete: compare-and-set refused', context: { topicId: sk, part: 'release-on-complete', prevOwner: prevOwner ?? null } });
24622
24897
  }
24623
24898
  catch {
24624
24899
  // @silent-fallback-ok — release-on-complete is best-effort housekeeping
@@ -27921,6 +28196,11 @@ export async function startServer(options) {
27921
28196
  }
27922
28197
  runMachineCoherenceEffects?.(effects, { telegram: () => tg ?? null });
27923
28198
  };
28199
+ const meshEvidence = (kind, reason) => {
28200
+ featureEvidence.record('monitoring.meshCoherenceLiveCheck', { kind, reason, context: { uptimeSec: Math.round(process.uptime()), emitCap: config.monitoring?.meshCoherenceLiveCheck?.emitCap ?? null } });
28201
+ };
28202
+ const meshFired = (code) => { meshEvidence('fired', `divergence:${code}`); return true; };
28203
+ const meshHeld = (code) => meshEvidence('held', `emit-cap:${code}`);
27924
28204
  const peerPresenceTick = () => {
27925
28205
  void reconcileIdentityActivation().catch((err) => {
27926
28206
  console.warn(`[identity-recovery] periodic activation reconciliation failed: ${err instanceof Error ? err.message : String(err)}`);
@@ -27960,8 +28240,10 @@ export async function startServer(options) {
27960
28240
  if (emitCap === undefined || count < emitCap) { // emitCap is READ here
27961
28241
  console.log(pc.yellow(` ⚠ mesh-live-coherence [${w.code}]: ${w.message}`));
27962
28242
  _meshCoherenceEmitCounts.set(w.code, count + 1);
27963
- firedThisTick = true;
28243
+ firedThisTick = meshFired(w.code);
27964
28244
  }
28245
+ else
28246
+ meshHeld(w.code);
27965
28247
  }
27966
28248
  }
27967
28249
  recorder?.record({ feature: 'mesh-coherence-live', kind: 'event', outcome: firedThisTick ? 'fired' : 'noop' });
@@ -27979,6 +28261,8 @@ export async function startServer(options) {
27979
28261
  _meshCoherenceFailing = true;
27980
28262
  }
27981
28263
  _meshCoherenceConsecFailures += 1;
28264
+ if (_meshCoherenceConsecFailures === 1)
28265
+ meshEvidence('error', 'live-state-read-failed');
27982
28266
  }
27983
28267
  }
27984
28268
  }
@@ -29642,10 +29926,12 @@ export async function startServer(options) {
29642
29926
  console.warn('[instar] Windows desktop bootstrap diagnostic could not be persisted');
29643
29927
  }
29644
29928
  }
29645
- const server = new AgentServer({ config, ecosystemLedger: _ecosystemLedger ?? undefined, singleInstanceLock, agentIdentity: _agentIdentityDeps, terminateSessionAuthority: terminateWithAuthority, subscriptionEmailBinding: credentialLocationLedger, subscriptionEmailBarrier, subscriptionIdentityOracle, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, telegramOrigin: telegramOriginBoot?.runtime, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, jobAnomalySendAutomationReply: sendAutomationReply, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographerRoots: cartographerRoots ?? undefined, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, accountFollowMePeerViews: async () => { const nickById = new Map((_listPoolMachines?.() ?? []).map((m) => [m.machineId, verifiedEntityName(m.machineId, m.nickname) ?? ''])); let peers = (_resolvePeerUrls?.() ?? []).map((p) => ({ machineId: p.machineId, nickname: nickById.get(p.machineId) ?? '', url: p.url })); if (peers.length === 0) {
29929
+ const server = new AgentServer({ config, ecosystemLedger: _ecosystemLedger ?? undefined, recommendedServicesLedger: _recommendedServicesLedger ?? undefined, singleInstanceLock, agentIdentity: _agentIdentityDeps, terminateSessionAuthority: terminateWithAuthority, subscriptionEmailBinding: credentialLocationLedger, subscriptionEmailBarrier, subscriptionIdentityOracle, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, telegramOrigin: telegramOriginBoot?.runtime, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, jobAnomalySendAutomationReply: sendAutomationReply, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographerRoots: cartographerRoots ?? undefined, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, accountFollowMePeerViews: async () => { const nickById = new Map((_listPoolMachines?.() ?? []).map((m) => [m.machineId, verifiedEntityName(m.machineId, m.nickname) ?? ''])); let peers = (_resolvePeerUrls?.() ?? []).map((p) => ({ machineId: p.machineId, nickname: nickById.get(p.machineId) ?? '', url: p.url })); if (peers.length === 0) {
29646
29930
  peers = (_listPoolMachines?.() ?? []).filter((m) => m.machineId !== _meshSelfId && !!m.lastKnownUrl).map((m) => ({ machineId: m.machineId, nickname: verifiedEntityName(m.machineId, m.nickname) ?? '', url: m.lastKnownUrl }));
29647
29931
  } if (peers.length === 0)
29648
- return []; const { fetchPeerSubscriptionViews } = await import('../core/fetchPeerSubscriptionViews.js'); return fetchPeerSubscriptionViews({ peers: () => peers, fetchImpl: fetch, authToken: config.authToken ?? '' }); }, quotaPoller, quotaAwareScheduler: _quotaAwareScheduler ?? undefined, proactiveSwapMonitor: _proactiveSwapMonitor ?? undefined, inUseAccountResolver, enrollmentWizard, accountFollowMeRevocation, credentialRepointing, semanticMemory, activitySentinel, rateLimitSentinel, releaseReadinessSentinel: releaseReadinessSentinel ?? undefined, greenPrAutoMerger: greenPrAutoMerger ?? undefined, localVerify: localVerifyService ?? undefined, localVerifyStatus: localVerifyStatus ?? undefined, guardLatchStore: guardLatchStore ?? undefined, agentStopSurfacer: agentStopSurfacer ?? undefined, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, topicProfile: _topicProfileCtx ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, meshBindActive: coordinator.managers.identityManager.hasIdentity() && config.multiMachine?.meshTransport?.enabled !== false, localSigningKeyPem, leaseTransport, peerEndpointRecorder, getSelfMeshEndpoints, onLeasePullRequest: () => leaseCoordinatorRef?.currentLease() ?? null, liveTailReceiver, handoffWireTransport, onHandoffBegin, onHandoffInitiate: handoffInitiate, handoffInProgress: handoffSentinelInProgress, messageLedger, currentInboundByTopic, replyMarkerTransport, onReplyMarker: messageLedger ? (marker) => { const m = marker; messageLedger.applyRemoteReplyMarker(m.dedupeKey, { platform: m.platform, replyIdempotencyKey: m.replyIdempotencyKey, epoch: m.epoch, topic: m.topic ?? null }); } : undefined, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, conversationRegistry, conversationBindAuth, appConversations: _appConversationService ?? undefined, slackInboundDispatch: () => _slackInboundDispatch, conversationFollowThrough, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, threadLog, threadMessageRecorder, warrantsReplyGate, collaborationSurfacer, peerHomebaseRelay, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, pairingInvites: threadlinePairingInvites, getLastRelayEvent: threadlineGetLastRelayEvent, a2aRelayForward: _a2aRelayForwardCtx ?? undefined, threadlineReplyWaiters, threadlineMcpHttp, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, relayVerdictCounters: threadlineRelayClient ? (() => ({ ...threadlineRelayClient.relayVerdictCounters, expiredMismatchIgnored: a2aDeliveryTracker?.expiredMismatchIgnored ?? 0 })) : undefined, inboundIdLedger: _inboundIdLedger ?? undefined, inboundIdLedgerDaemonDeferred: () => _inboundIdLedgerDaemonDeferred, responseReviewGate, reviewCanaryBattery, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, machinePoolRegistry, ropeHealthMonitor, writeAdmission: writeAdmission ?? undefined, getInboundQueue: () => _inboundQueue, getMachineCoherence: () => _machineCoherenceSentinel, getSingleMachineFailoverGap: () => _singleMachineFailoverGap, getMissingLoginSession: () => _missingLoginSession, getSessionPoolFailoverRunner: () => _sessionPoolFailoverRunnerDriver?.status() ?? null, sessionPoolPromotionActivation: _sessionPoolPromotionActivation, meshRpcDispatcher, deliverA2aToMachine: _deliverA2aToMachine ?? undefined, workingSetPullCoordinator, workingSetArtifactManager, orchestratorPoller, commitmentReplicaStore, preferenceReplicaStore, replicatedRecordEmitter, replicatedStoreReconciler, conflictStore, rollbackUnmerge, droppedOriginRegistry, preferencesUnionReader, jevMemoryPicker, forwardCommitmentMutate, sessionOwnershipRegistry, sendDrain: _sendDrain ?? undefined, claimTopicOwnershipOnSpawn: (topicId) => _claimOwnershipForAutonomousSpawn ? _claimOwnershipForAutonomousSpawn(topicId) : 'unwired', topicPinStore: _topicPinStore ?? undefined, topicPinSkewQuarantine: _topicPinSkewQuarantine ?? undefined, topicPinFoldView: _topicPinFoldView ?? undefined, ownershipReconciler: _ownershipReconciler ?? undefined, staleOwnerEngine: _staleOwnerEngine ?? undefined, duplicateReconciler: _duplicateReconciler ?? undefined, ownerDarkLadder: _ownerDarkLadder ?? undefined, spawnAdmission: _spawnAdmission ?? undefined, judgmentProvenance: _judgmentProvenance ?? undefined, leaseHandback: _leaseHandbackCtx ?? undefined, streamTicketStore: _streamTicketStore ?? undefined, poolStreamAllowRemoteInput: config.dashboard?.poolStream?.allowRemoteInput ?? false, poolStreamConnector: _poolStreamConnector ?? undefined, secretSync: _secretSyncHandle ?? undefined, meshSelfId: _meshSelfId ?? undefined, resolveRouterUrl: _resolveRouterUrl ?? undefined, resolvePeerUrls: _resolvePeerUrls ?? undefined, recordRopeResult: _recordRopeResult ?? undefined, guardRegistry, listPoolMachines: _listPoolMachines ?? undefined, deliverMandateToMachine: _deliverMandateToMachine ?? undefined, passkeyRevokeOutbox: _passkeyRevokeOutbox ? () => _passkeyRevokeOutbox : undefined, passkeyPeerOnline: _passkeyPeerOnline, passkeyPoolReader: _passkeyPoolReader ? () => _passkeyPoolReader : undefined, passkeyProofBrowser: async (profileDir) => { const { ChromeCdpReloginBrowser } = await import('../core/ChromeCdpReloginBrowser.js'); return new ChromeCdpReloginBrowser({ userDataDir: profileDir, passkeyMode: true, headless: true, launchTimeoutMs: 30_000, operationTimeoutMs: 20_000 }); }, poolLink: _poolLink ?? undefined, poolPollCache: _poolPollCache ?? undefined, sessionPoolE2EResultStore, proxyCoordinator, topicIntentStore, topicIntentArcCheck, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, briefDeps, workingMemory, taskFlowRegistry, threadlineFlowBridge, sessionReaper, agentWorktreeReaper, externalHogSentinel, orphanedWorkSentinel, mcpProcessReaper, codexArmSessionSweeper, geminiLoopRunner, sleepController, agentActivityState, reapLog, resumeQueue, resumeDrainer, autonomousLivenessReconciler, enforcedTerminationStatus: () => enforcedTerminationWatchdog?.guardStatus() ?? null, prHandLease: prHandLease ?? undefined, standDownRegistry: _standDownRegistry ?? undefined, standDownAudit: _standDownAudit ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx }); // Resolve the late-bound topic-operator getter (increment 2e): routing was
29932
+ return []; const { fetchPeerSubscriptionViews } = await import('../core/fetchPeerSubscriptionViews.js'); return fetchPeerSubscriptionViews({ peers: () => peers, fetchImpl: fetch, authToken: config.authToken ?? '' }); }, quotaPoller, quotaAwareScheduler: _quotaAwareScheduler ?? undefined, proactiveSwapMonitor: _proactiveSwapMonitor ?? undefined, inUseAccountResolver, enrollmentWizard, accountFollowMeRevocation, credentialRepointing, semanticMemory, activitySentinel, rateLimitSentinel, releaseReadinessSentinel: releaseReadinessSentinel ?? undefined, greenPrAutoMerger: greenPrAutoMerger ?? undefined, localVerify: localVerifyService ?? undefined, localVerifyStatus: localVerifyStatus ?? undefined, guardLatchStore: guardLatchStore ?? undefined, agentStopSurfacer: agentStopSurfacer ?? undefined, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, topicProfile: _topicProfileCtx ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, meshBindActive: coordinator.managers.identityManager.hasIdentity() && config.multiMachine?.meshTransport?.enabled !== false, localSigningKeyPem, leaseTransport, peerEndpointRecorder, getSelfMeshEndpoints, onLeasePullRequest: () => leaseCoordinatorRef?.currentLease() ?? null, liveTailReceiver, handoffWireTransport, onHandoffBegin, onHandoffInitiate: handoffInitiate, handoffInProgress: handoffSentinelInProgress, messageLedger, currentInboundByTopic, replyMarkerTransport, onReplyMarker: messageLedger ? (marker) => { const m = marker; messageLedger.applyRemoteReplyMarker(m.dedupeKey, { platform: m.platform, replyIdempotencyKey: m.replyIdempotencyKey, epoch: m.epoch, topic: m.topic ?? null }); } : undefined, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, conversationRegistry, conversationBindAuth, appConversations: _appConversationService ?? undefined, slackInboundDispatch: () => _slackInboundDispatch, conversationFollowThrough, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, threadLog, threadMessageRecorder, warrantsReplyGate, collaborationSurfacer, peerHomebaseRelay, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, pairingInvites: threadlinePairingInvites, getLastRelayEvent: threadlineGetLastRelayEvent, a2aRelayForward: _a2aRelayForwardCtx ?? undefined, threadlineReplyWaiters, threadlineMcpHttp, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, relayVerdictCounters: threadlineRelayClient ? (() => ({ ...threadlineRelayClient.relayVerdictCounters, expiredMismatchIgnored: a2aDeliveryTracker?.expiredMismatchIgnored ?? 0 })) : undefined, inboundIdLedger: _inboundIdLedger ?? undefined, inboundIdLedgerDaemonDeferred: () => _inboundIdLedgerDaemonDeferred, responseReviewGate, reviewCanaryBattery, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, machinePoolRegistry, ropeHealthMonitor, writeAdmission: writeAdmission ?? undefined, getInboundQueue: () => _inboundQueue, getMachineCoherence: () => _machineCoherenceSentinel, getSingleMachineFailoverGap: () => _singleMachineFailoverGap, getMissingLoginSession: () => _missingLoginSession, getSessionPoolFailoverRunner: () => _sessionPoolFailoverRunnerDriver?.status() ?? null, sessionPoolPromotionActivation: _sessionPoolPromotionActivation, meshRpcDispatcher, deliverA2aToMachine: _deliverA2aToMachine ?? undefined, workingSetPullCoordinator, workingSetArtifactManager, orchestratorPoller, commitmentReplicaStore, preferenceReplicaStore, replicatedRecordEmitter, replicatedStoreReconciler, conflictStore, rollbackUnmerge, droppedOriginRegistry, preferencesUnionReader, jevMemoryPicker, forwardCommitmentMutate, sessionOwnershipRegistry, sendDrain: _sendDrain ?? undefined, claimTopicOwnershipOnSpawn: (topicId) => _claimOwnershipForAutonomousSpawn ? _claimOwnershipForAutonomousSpawn(topicId) : 'unwired', topicPinStore: _topicPinStore ?? undefined, topicPinSkewQuarantine: _topicPinSkewQuarantine ?? undefined, topicPinFoldView: _topicPinFoldView ?? undefined, ownershipReconciler: _ownershipReconciler ?? undefined, staleOwnerEngine: _staleOwnerEngine ?? undefined, duplicateReconciler: _duplicateReconciler ?? undefined, ownerDarkLadder: _ownerDarkLadder ?? undefined, spawnAdmission: _spawnAdmission ?? undefined, judgmentProvenance: _judgmentProvenance ?? undefined, leaseHandback: _leaseHandbackCtx ?? undefined, streamTicketStore: _streamTicketStore ?? undefined, poolStreamAllowRemoteInput: config.dashboard?.poolStream?.allowRemoteInput ?? false, poolStreamConnector: _poolStreamConnector ?? undefined, secretSync: _secretSyncHandle ?? undefined, meshSelfId: _meshSelfId ?? undefined, resolveRouterUrl: _resolveRouterUrl ?? undefined, resolvePeerUrls: _resolvePeerUrls ?? undefined, recordRopeResult: _recordRopeResult ?? undefined, guardRegistry, listPoolMachines: _listPoolMachines ?? undefined, deliverMandateToMachine: _deliverMandateToMachine ?? undefined, passkeyRevokeOutbox: _passkeyRevokeOutbox ? () => _passkeyRevokeOutbox : undefined, passkeyPeerOnline: _passkeyPeerOnline, passkeyPoolReader: _passkeyPoolReader ? () => _passkeyPoolReader : undefined, passkeyProofBrowser: async (profileDir) => { const { ChromeCdpReloginBrowser } = await import('../core/ChromeCdpReloginBrowser.js'); return new ChromeCdpReloginBrowser({ userDataDir: profileDir, passkeyMode: true, headless: true, launchTimeoutMs: 30_000, operationTimeoutMs: 20_000 }); }, poolLink: _poolLink ?? undefined, poolPollCache: _poolPollCache ?? undefined, sessionPoolE2EResultStore, proxyCoordinator, topicIntentStore, topicIntentArcCheck, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, briefDeps, workingMemory, taskFlowRegistry, threadlineFlowBridge, sessionReaper, agentWorktreeReaper, externalHogSentinel, orphanedWorkSentinel, mcpProcessReaper, codexArmSessionSweeper, geminiLoopRunner, sleepController, agentActivityState, reapLog, resumeQueue, resumeDrainer, autonomousLivenessReconciler, enforcedTerminationStatus: () => enforcedTerminationWatchdog?.guardStatus() ?? null, prHandLease: prHandLease ?? undefined, standDownRegistry: _standDownRegistry ?? undefined, standDownAudit: _standDownAudit ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx });
29933
+ if (_pendingCompactionEvidence)
29934
+ featureEvidence.record('multiMachine.coherenceJournal.replication.compaction', _pendingCompactionEvidence); // Resolve the late-bound topic-operator getter (increment 2e): routing was
29649
29935
  const readIdentityProjectionPeerRows = async () => {
29650
29936
  const peers = _resolvePeerUrls?.() ?? [];
29651
29937
  const extra = config.multiMachine?.peerUrlAllowlist;
@@ -29996,6 +30282,7 @@ export async function startServer(options) {
29996
30282
  subjectMachineId: proposed.machineId, epoch: proposed.recoveryEpoch ?? 0,
29997
30283
  contentHash: operatorGrantMod.recoveryRootDelegationHash(proposed), dryRun,
29998
30284
  });
30285
+ featureEvidence.record('multiMachine.recoveryKeyEscrow', { kind: 'fired', reason: dryRun ? 'would rotate the recovery root from a peer' : 'rotated the recovery root from a peer', context: { machineId: proposed.machineId, recoveryEpoch: proposed.recoveryEpoch ?? 0, dryRun } });
29999
30286
  if (dryRun)
30000
30287
  return 'would-rotate';
30001
30288
  identityStore.apply({
@@ -30590,10 +30877,14 @@ export async function startServer(options) {
30590
30877
  // port (force-closes lingering sockets, awaits 'close') BEFORE listen, so the
30591
30878
  // gap is sub-second and the supervisor never observes a hole. No-op if the
30592
30879
  // beacon was never started (dark) or already failed.
30880
+ // A failed bind happened before the evidence log was wired (at AgentServer construction), so it is kept and written here.
30881
+ if (bootBeaconBindErrorCode)
30882
+ featureEvidence.record('monitoring.bootHealthBeacon', { kind: 'error', reason: 'could not bind during boot', context: { code: bootBeaconBindErrorCode, port: config.port } });
30593
30883
  try {
30594
30884
  await bootBeacon?.stop();
30595
30885
  }
30596
30886
  catch (err) {
30887
+ featureEvidence.record('monitoring.bootHealthBeacon', { kind: 'error', reason: 'handoff failed: stop threw', context: { port: config.port, errorName: err instanceof Error ? err.name : 'unknown' } });
30597
30888
  // @silent-fallback-ok — a beacon stop failure must not stop the real server
30598
30889
  // from binding; logged, and the OS releases the listening socket regardless.
30599
30890
  console.error(' Boot health beacon stop failed (continuing to bind real server):', err instanceof Error ? err.message : err);
@@ -30604,6 +30895,16 @@ export async function startServer(options) {
30604
30895
  // no per-session write admission.
30605
30896
  sessionManager.startMonitoring();
30606
30897
  await server.start();
30898
+ // Boot recovery runs before the evidence log exists, so its verdict is recorded here.
30899
+ if (resolveDevAgentGate(config.multiMachine?.recoveryKeyEscrow?.enabled, config)) {
30900
+ const escrowDryRun = config.multiMachine?.recoveryKeyEscrow?.dryRun !== false;
30901
+ featureEvidence.record('multiMachine.recoveryKeyEscrow', {
30902
+ kind: bootRecoveryOutcome === 'disabled' || (_recoveryEscrowEvidence && !_recoveryEscrowEvidence.minted && _recoveryEscrowEvidence.hadRoot) ? 'error'
30903
+ : bootRecoveryOutcome === 'coherence-held' ? 'held' : 'fired',
30904
+ reason: bootRecoveryOutcome === 'disabled' ? 'boot recovery unavailable' : `boot recovery: ${bootRecoveryOutcome}`,
30905
+ context: { outcome: bootRecoveryOutcome, dryRun: escrowDryRun, minted: _recoveryEscrowEvidence?.minted ?? null, hadRoot: _recoveryEscrowEvidence?.hadRoot ?? null, recoveryEpoch: _recoveryEscrowEvidence?.recoveryEpoch ?? null },
30906
+ });
30907
+ }
30607
30908
  // After listen: a stop's condition usually turns met across a restart onto the
30608
30909
  // fixed version, and the wake brief sends a session straight to a route.
30609
30910
  agentStopSurfacer?.start();