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
@@ -6,6 +6,7 @@
6
6
  * and can be monitored/reaped by the server.
7
7
  */
8
8
  import { isCredentialEnvName, CLAUDE_CONFINED_PERMISSION_ARGS } from './credentialEnvNames.js';
9
+ import { featureEvidence } from '../monitoring/FeatureEvidenceLog.js';
9
10
  import { execFileSync, execFile } from 'node:child_process';
10
11
  import { isInstarSourceTree } from './SourceTreeGuard.js';
11
12
  import { AdmissionRefusedError } from './workAdmission.js';
@@ -44,6 +45,7 @@ import { detectRateLimited, nextIdleThrottleAction, RATE_LIMIT_SETTLED_CAPTURE_L
44
45
  import { classifyIdleError } from './IdleErrorClassifier.js';
45
46
  import { classifyLoginExpired } from './LoginExpiredSignature.js';
46
47
  import { liveTail } from './paneTail.js';
48
+ import { claudeAuthExecPrefix, removeClaudeAuthEnvFile, writeClaudeAuthEnvFile } from './claudeChildAuth.js';
47
49
  import { resolveIdleSinceSeed } from './idleSincePersistence.js';
48
50
  import { toPaneTailLines, RESOLVER_PREGATE_RE } from '../monitoring/PermissionPromptAutoResolver.js';
49
51
  const execFileAsync = promisify(execFile);
@@ -88,6 +90,7 @@ const ageKillGov = governor.for('age-kill-backoff');
88
90
  * the lease-holder boundary unchanged.
89
91
  */
90
92
  const LOCAL_AGE_LIMIT_REAP_CAPABILITY = Symbol('local-age-limit-reap-capability');
93
+ const REROUTED_LIFETIME_REAP_CAPABILITY = Symbol('rerouted-lifetime-reap-capability');
91
94
  /**
92
95
  * How long a confirmed-move assertion stays valid. A CODE CONSTANT, never config:
93
96
  * a safety bound in config is a safety bound an emergency edit can silently remove
@@ -1242,6 +1245,13 @@ export class SessionManager extends EventEmitter {
1242
1245
  // guard counts the degraded-call signal distinctly from a generic error.
1243
1246
  const killed = e.killed === true || e.signal === 'SIGKILL' || /SIGKILL/.test(msg);
1244
1247
  this.degradedTmuxGuard?.observeTmuxCall(Date.now() - t0, killed ? 'killed-client' : 'indeterminate');
1248
+ if (this.tmuxAsyncEnabled) {
1249
+ featureEvidence.recordAtMostEvery('monitoring.tmuxResilience.asyncHotPath', killed ? 'timeout' : 'indeterminate', 300_000, {
1250
+ kind: killed ? 'fired' : 'error',
1251
+ reason: killed ? 'bounded-call-timed-out-and-killed' : 'tmux-call-failed-indeterminate',
1252
+ context: { op: args[0] ?? 'unknown', elapsedMs: Date.now() - t0, timeoutMs: timeout, inFlight: this.tmuxInflightCount },
1253
+ });
1254
+ }
1245
1255
  return { state: 'indeterminate', reason: msg.slice(0, 120) };
1246
1256
  }
1247
1257
  }
@@ -1734,6 +1744,51 @@ rm() { "${shimRunner}" rm "$@"; }
1734
1744
  setInteractiveLoginExpiredSink(fn) {
1735
1745
  this.interactiveLoginExpiredSink = fn;
1736
1746
  }
1747
+ /** Put a handler ahead of the sink. When it returns true the signal is handled and goes no further. */
1748
+ prependInteractiveLoginExpiredSink(first) {
1749
+ const rest = this.interactiveLoginExpiredSink;
1750
+ this.interactiveLoginExpiredSink = async (input) => {
1751
+ if (await first(input))
1752
+ return;
1753
+ await rest?.(input);
1754
+ };
1755
+ }
1756
+ /** A restored sign-in key for every later launch. `config` here is a copy, so server code can't reach it. */
1757
+ setAnthropicKey(key) {
1758
+ this.config.anthropicApiKey = key ?? undefined;
1759
+ }
1760
+ /** Forget which sessions were already reported, so a stuck one is offered again on the next check. */
1761
+ clearInteractiveLoginReports() {
1762
+ this.interactiveLoginReportedAt.clear();
1763
+ }
1764
+ /** Unprotected topic sessions showing Claude Code's own login frame right now. */
1765
+ async listSessionsAtLoginScreen() {
1766
+ const stuck = [];
1767
+ for (const session of this.listRunningSessions()) {
1768
+ if ((session.framework ?? 'claude-code') !== 'claude-code' || session.jobSlug)
1769
+ continue;
1770
+ if (this.config.protectedSessions.includes(session.tmuxSession))
1771
+ continue;
1772
+ const pane = (await this.captureOutputMaybeAsync(session.tmuxSession, 40)) || '';
1773
+ const verdict = classifyLoginExpired(pane);
1774
+ if (verdict.loginExpired && verdict.messageLed)
1775
+ stuck.push(session.tmuxSession);
1776
+ }
1777
+ return stuck;
1778
+ }
1779
+ /** The key a session was launched with, as tmux holds it. Read for comparison only: never log it. */
1780
+ sessionLaunchKey(tmuxSession) {
1781
+ try {
1782
+ const line = withSyncOp(() => execFileSync(this.config.tmuxPath, ['show-environment', '-t', `=${tmuxSession}:`, 'CLAUDE_CODE_OAUTH_TOKEN'], {
1783
+ encoding: 'utf-8', timeout: 5000, stdio: ['ignore', 'pipe', 'ignore'],
1784
+ })).trim();
1785
+ const value = line.startsWith('CLAUDE_CODE_OAUTH_TOKEN=') ? line.slice('CLAUDE_CODE_OAUTH_TOKEN='.length) : '';
1786
+ return value || null;
1787
+ }
1788
+ catch {
1789
+ return null;
1790
+ } // @silent-fallback-ok: unset or unreadable means no launch key, and no key means no refresh
1791
+ }
1737
1792
  setCodexSigninTriggerSink(fn) {
1738
1793
  this.codexSigninTriggerSink = fn;
1739
1794
  }
@@ -2063,6 +2118,15 @@ rm() { "${shimRunner}" rm "$@"; }
2063
2118
  }
2064
2119
  const isAuthorizedTopicMovedCloseout = reason.startsWith('topic moved')
2065
2120
  && opts?.localPostTransferCloseout === true;
2121
+ const isAuthorizedReroutedLifetime = reason === 'rerouted-lifetime'
2122
+ && opts?.reroutedLifetimeReapCapability === REROUTED_LIFETIME_REAP_CAPABILITY
2123
+ && session.launchLane === 'rerouted-interactive'
2124
+ && session.completionMode === 'pattern'
2125
+ && typeof session.maxLifetimeMinutes === 'number'
2126
+ && Number.isFinite(session.maxLifetimeMinutes)
2127
+ && session.maxLifetimeMinutes > 0
2128
+ && !!session.startedAt
2129
+ && Date.now() - Date.parse(session.startedAt) > session.maxLifetimeMinutes * 60_000;
2066
2130
  const authorityScope = origin === 'operator'
2067
2131
  ? 'operator'
2068
2132
  : holdsServingLease
@@ -2127,6 +2191,14 @@ rm() { "${shimRunner}" rm "$@"; }
2127
2191
  bypassedReasons.push('recovery-in-flight');
2128
2192
  if (opts?.bypassActiveProcessKeep)
2129
2193
  bypassedReasons.push('active-process');
2194
+ // A rerouted one-shot is an interactive REPL, so a live child process can
2195
+ // remain after its hard deadline. The monitor's private capability and
2196
+ // this second expiry check let the hard cap bypass only process-activity
2197
+ // evidence. Protected sessions, user activity, commitments and other
2198
+ // KEEP reasons still veto termination.
2199
+ if (isAuthorizedReroutedLifetime) {
2200
+ bypassedReasons.push('active-process', 'main-process-active', 'process-uninspectable');
2201
+ }
2130
2202
  if (opts?.bypassRecentUserMessageForConfirmedMove || opts?.topicTransferClose === true) {
2131
2203
  bypassedReasons.push('recent-user-message');
2132
2204
  }
@@ -2608,6 +2680,13 @@ rm() { "${shimRunner}" rm "$@"; }
2608
2680
  // (A) tri-state: ONLY a definitive `false` (dead) marks the session
2609
2681
  // completed. `'indeterminate'` (slow/timed-out tmux) does NOT — it falls
2610
2682
  // through to be re-checked next tick rather than reaping a live session.
2683
+ if (alive === 'indeterminate') {
2684
+ featureEvidence.recordAtMostEvery('monitoring.tmuxResilience.asyncHotPath', `kept:${session.tmuxSession}`, 300_000, { kind: 'held', reason: 'indeterminate-probe-kept-session', context: { session: session.tmuxSession } });
2685
+ }
2686
+ if (alive === false && this.tmuxAsyncEnabled) {
2687
+ // A definitive-dead verdict is the one a spurious reap would come from; the review grades these rows.
2688
+ featureEvidence.record('monitoring.tmuxResilience.asyncHotPath', { kind: 'fired', reason: 'probe-classified-session-dead', context: { session: session.tmuxSession } });
2689
+ }
2611
2690
  if (alive === false) {
2612
2691
  // CAS re-read after the await: an operator kill (or another killer)
2613
2692
  // can land mid-probe, so re-read the live record before mutating it —
@@ -2718,12 +2797,14 @@ rm() { "${shimRunner}" rm "$@"; }
2718
2797
  if (lifeElapsedMin > session.maxLifetimeMinutes &&
2719
2798
  !this.config.protectedSessions.includes(session.tmuxSession) &&
2720
2799
  !this.isStandingSession(session.tmuxSession)) {
2721
- console.warn(`[SessionManager] Rerouted session "${session.name}" exceeded its hard lifetime (${Math.round(lifeElapsedMin)}m > ${session.maxLifetimeMinutes}m) without a completion sentinel. Killing (timeout).`);
2722
- const killed = await this.terminateSession(session.id, 'rerouted-lifetime', {
2800
+ const killed = await this.#terminateSessionInternal(session.id, 'rerouted-lifetime', {
2723
2801
  finalStatus: 'killed',
2724
2802
  disposition: 'terminal',
2803
+ origin: 'autonomous',
2804
+ reroutedLifetimeReapCapability: REROUTED_LIFETIME_REAP_CAPABILITY,
2725
2805
  });
2726
2806
  if (killed.terminated) {
2807
+ console.warn(`[SessionManager] Rerouted session "${session.name}" exceeded its hard lifetime (${Math.round(lifeElapsedMin)}m > ${session.maxLifetimeMinutes}m) without a completion sentinel. Killed (timeout).`);
2727
2808
  DegradationReporter.getInstance().report({
2728
2809
  feature: 'SessionManager.monitorTick.reroutedLifetime',
2729
2810
  primary: 'rerouted-interactive session completes via its sentinel within the lifetime cap',
@@ -2997,11 +3078,15 @@ rm() { "${shimRunner}" rm "$@"; }
2997
3078
  const settledSnapshot = await this.captureOutputMaybeAsync(session.tmuxSession, RATE_LIMIT_SETTLED_CAPTURE_LINES);
2998
3079
  const { action, nextState } = nextIdleThrottleAction(settledSnapshot, this.idleThrottleSettle.get(session.tmuxSession), now);
2999
3080
  if (action === 'emit') {
3081
+ featureEvidence.record('monitoring.idleThrottleSettleGate', { kind: 'fired', reason: 'settled-handed-to-rate-limit-sentinel', context: { session: session.tmuxSession, snapshotRead: settledSnapshot != null } });
3000
3082
  this.idleThrottleSettle.delete(session.tmuxSession);
3001
3083
  this.emit('rateLimitedAtIdle', session.tmuxSession);
3002
3084
  continue; // Settled → sentinel owns recovery.
3003
3085
  }
3004
3086
  if (action === 'wait') {
3087
+ if (!this.idleThrottleSettle.has(session.tmuxSession)) {
3088
+ featureEvidence.record('monitoring.idleThrottleSettleGate', { kind: 'held', reason: 'throttle-seen-waiting-to-settle', context: { session: session.tmuxSession } });
3089
+ }
3005
3090
  if (nextState)
3006
3091
  this.idleThrottleSettle.set(session.tmuxSession, nextState);
3007
3092
  continue; // Not settled yet — re-sample next idle tick; do NOT emit, and
@@ -3010,6 +3095,15 @@ rm() { "${shimRunner}" rm "$@"; }
3010
3095
  }
3011
3096
  // 'fall-through': no current throttle in the settled window (a stale buffer
3012
3097
  // line) → clear tracking and proceed to the normal idle machinery below.
3098
+ if (this.idleThrottleSettle.has(session.tmuxSession) || settledSnapshot == null) {
3099
+ // The row the gate exists for: a throttle string that never settled gets no hand-off.
3100
+ if (settledSnapshot == null) {
3101
+ featureEvidence.recordAtMostEvery('monitoring.idleThrottleSettleGate', `read-failed:${session.tmuxSession}`, 3_600_000, { kind: 'error', reason: 'pane-read-failed', context: { session: session.tmuxSession } });
3102
+ }
3103
+ else {
3104
+ featureEvidence.record('monitoring.idleThrottleSettleGate', { kind: 'held', reason: 'throttle-gone-before-settle-no-handoff', context: { session: session.tmuxSession } });
3105
+ }
3106
+ }
3013
3107
  this.idleThrottleSettle.delete(session.tmuxSession);
3014
3108
  }
3015
3109
  if (!this.idlePromptSince.has(session.id)) {
@@ -3924,25 +4018,29 @@ rm() { "${shimRunner}" rm "$@"; }
3924
4018
  confinedRerouteCapacity() {
3925
4019
  const pressure = this.currentMemoryPressure();
3926
4020
  const running = this.listRunningSessions();
3927
- if (running.length + this.pendingHeadlessSpawns >= this.config.maxSessions
3928
- && !this.scheduledOverflowAvailable(running, pressure))
4021
+ // Feedback canaries/builds are not scheduler-proven spawns. The early check
4022
+ // must use their actual gate, not the scheduler's reserved global slot.
4023
+ if (running.length + this.pendingHeadlessSpawns >= this.config.maxSessions)
3929
4024
  return 'saturated';
3930
4025
  if ((this.config.subscriptionPathMode ?? 'off') !== 'force')
3931
4026
  return 'not-rerouted';
3932
- const maxRerouted = this.config.subscriptionMaxRerouted ?? 3;
3933
- return this.countReroutedInteractiveSessions() >= maxRerouted
4027
+ return this.countReroutedInteractiveSessions() >= this.rerouteAdmissionCap(false)
3934
4028
  || pressure === 'high' || pressure === 'critical' ? 'saturated' : 'available';
3935
4029
  }
4030
+ rerouteAdmissionCap(scheduledJob) {
4031
+ const maxRerouted = this.config.subscriptionMaxRerouted ?? 3;
4032
+ // A one-slot host cannot reserve without blocking all conversations.
4033
+ return !scheduledJob && maxRerouted > 1 ? maxRerouted - 1 : maxRerouted;
4034
+ }
3936
4035
  evaluateRerouteGate(spawnName, scheduledJob = false) {
3937
4036
  const mode = this.config.subscriptionPathMode ?? 'off';
3938
- const maxRerouted = this.config.subscriptionMaxRerouted ?? 3;
3939
4037
  const reroutedCount = this.countReroutedInteractiveSessions();
3940
4038
  const pressure = this.currentMemoryPressure();
3941
4039
  const pressureElevated = pressure === 'high' || pressure === 'critical';
3942
4040
  // Keep one of the existing memory-bounded slots for scheduled jobs when
3943
4041
  // conversations would otherwise fill the entire lane. A one-slot host
3944
4042
  // cannot reserve without blocking all conversations, so retain its cap.
3945
- const admissionCap = !scheduledJob && maxRerouted > 1 ? maxRerouted - 1 : maxRerouted;
4043
+ const admissionCap = this.rerouteAdmissionCap(scheduledJob);
3946
4044
  if (reroutedCount < admissionCap && !pressureElevated) {
3947
4045
  return { allow: true };
3948
4046
  }
@@ -5641,6 +5739,7 @@ rm() { "${shimRunner}" rm "$@"; }
5641
5739
  }
5642
5740
  catch (err) {
5643
5741
  console.warn(`[SessionManager] Failed to record build context for "${tmuxSession}": ${err instanceof Error ? err.message : String(err)}`);
5742
+ featureEvidence.recordAtMostEvery('sessions.respawnBuildContext', `capture-failed|${tmuxSession}`, 60 * 60 * 1000, { kind: 'error', reason: 'capture-failed', context: { tmuxSession, errorName: err instanceof Error ? err.name : 'unknown' } });
5644
5743
  }
5645
5744
  }
5646
5745
  /** Async twin of recordBuildContext — async cwd probe, SAME persistence. */
@@ -5655,15 +5754,19 @@ rm() { "${shimRunner}" rm "$@"; }
5655
5754
  }
5656
5755
  catch (err) {
5657
5756
  console.warn(`[SessionManager] Failed to record build context for "${tmuxSession}": ${err instanceof Error ? err.message : String(err)}`);
5757
+ featureEvidence.recordAtMostEvery('sessions.respawnBuildContext', `capture-failed|${tmuxSession}`, 60 * 60 * 1000, { kind: 'error', reason: 'capture-failed', context: { tmuxSession, errorName: err instanceof Error ? err.name : 'unknown' } });
5658
5758
  }
5659
5759
  }
5660
5760
  withBuildContextRestoreNote(tmuxSession, initialMessage, resumeSessionId) {
5661
5761
  if (!resumeSessionId || !this.buildContextStore)
5662
5762
  return initialMessage;
5663
5763
  const restore = this.buildContextStore.getRestore(tmuxSession);
5664
- if (!restore)
5764
+ if (!restore) {
5765
+ featureEvidence.record('sessions.respawnBuildContext', { kind: 'held', reason: 'no-usable-context-on-resume', context: { tmuxSession } });
5665
5766
  return initialMessage;
5767
+ }
5666
5768
  console.log(`[SessionManager] Restoring build context for "${tmuxSession}" from ${restore.entry.currentCwd}`);
5769
+ featureEvidence.record('sessions.respawnBuildContext', { kind: 'fired', reason: 'context-restored-on-resume', context: { tmuxSession, contextAgeMs: Date.now() - restore.entry.updatedAt } });
5667
5770
  return [restore.note, initialMessage].filter(Boolean).join('\n\n');
5668
5771
  }
5669
5772
  /**
@@ -7246,6 +7349,8 @@ rm() { "${shimRunner}" rm "$@"; }
7246
7349
  this.linkAgentOwnedMemory('claude-code', {}, this.config.projectDir);
7247
7350
  // Planned once the triage binary is resolved (below); the env slot needs it first.
7248
7351
  let triageThreadline = { transport: 'stdio', reason: 'not-wired', secretEnvFlags: [] };
7352
+ let triageCredentialSource = 'store';
7353
+ let triageAuthFile = null;
7249
7354
  const triageBinaryForPlan = resolveFrameworkBinaryPath({
7250
7355
  framework: 'claude-code',
7251
7356
  frameworkBinaryPaths: this.config.frameworkBinaryPaths,
@@ -7324,6 +7429,12 @@ rm() { "${shimRunner}" rm "$@"; }
7324
7429
  `${this.config.framework ?? 'unset'}). Refusing rather than ` +
7325
7430
  'spawning another framework\'s binary with Claude flags.');
7326
7431
  }
7432
+ // A key-only agent has no stored login, so triage answered "Not logged in". The key arrives
7433
+ // through a private file, not `-e`, so it stays out of argv (spec cloud-key-internal-calls).
7434
+ triageAuthFile = writeClaudeAuthEnvFile(path.join(this.config.projectDir, '.instar'));
7435
+ triageCredentialSource = triageAuthFile ? 'env' : 'store';
7436
+ if (triageAuthFile)
7437
+ tmuxArgs.push(...claudeAuthExecPrefix(triageAuthFile));
7327
7438
  // CMT-798: triage panes are claude-code sessions too — retained copy.
7328
7439
  tmuxArgs.push(this.resolveLaunchBinary('claude-code', triageBinary));
7329
7440
  // Scoped permissions: allowedTools + permissionMode (NOT --dangerously-skip-permissions)
@@ -7351,6 +7462,7 @@ rm() { "${shimRunner}" rm "$@"; }
7351
7462
  }
7352
7463
  }
7353
7464
  catch (err) {
7465
+ removeClaudeAuthEnvFile(triageAuthFile);
7354
7466
  this.revokeOriginSession(triageSessionId);
7355
7467
  throw new Error(`Failed to create triage tmux session: ${this.originSpawnError(err)}`);
7356
7468
  }
@@ -7362,11 +7474,10 @@ rm() { "${shimRunner}" rm "$@"; }
7362
7474
  tmuxSession,
7363
7475
  startedAt: new Date().toISOString(),
7364
7476
  maxDurationMinutes: 10,
7365
- // §2.10 provenance — the triage lane hardcodes an EMPTY `ANTHROPIC_API_KEY=` above
7366
- // (it always reads the per-CLAUDE_CONFIG_DIR store, never an env token), so 'store' is
7367
- // the deterministic provenance here. Set explicitly so no claude-code spawn record is
7368
- // provenance-blind (an env-token lane that forgot the flag would be a lint-caught bug).
7369
- credentialSource: 'store',
7477
+ // §2.10 provenance — 'env' when the configured sign-in key was handed over above, 'store'
7478
+ // otherwise. Set explicitly so no claude-code spawn record is provenance-blind (an env-token
7479
+ // lane that forgot the flag would be a lint-caught bug).
7480
+ credentialSource: triageCredentialSource,
7370
7481
  ...this.threadlineTransportTag(triageThreadline),
7371
7482
  };
7372
7483
  this.state.saveSession(session);