@openrig/cli 0.6.12 → 0.6.13

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 (432) hide show
  1. package/README.md +19 -12
  2. package/daemon/assets/plugins/openrig-core/.claude-plugin/plugin.json +1 -1
  3. package/daemon/assets/plugins/openrig-core/.codex-plugin/plugin.json +1 -1
  4. package/daemon/assets/plugins/openrig-core/README.md +9 -2
  5. package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +25 -9
  6. package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +7 -4
  7. package/daemon/assets/plugins/openrig-core/skills/mission-slice-sop/SKILL.md +5 -0
  8. package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +61 -16
  9. package/daemon/assets/skills/rigs/SKILL.md +8 -4
  10. package/daemon/context-packs/help/manifest.yaml +1 -1
  11. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  12. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +60 -12
  13. package/daemon/context-packs/reference/getting-started.md +44 -14
  14. package/daemon/context-packs/reference/manifest.yaml +1 -1
  15. package/daemon/context-packs/reference/rig-spec.md +5 -5
  16. package/daemon/context-packs/reference/whats-new.md +90 -163
  17. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
  18. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
  19. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
  20. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  21. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  22. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  23. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  24. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  25. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
  26. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  27. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  30. package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
  31. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  32. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  34. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/mission-slice-sop/SKILL.md +5 -0
  42. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  43. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  46. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  54. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  55. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  63. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  64. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  65. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  66. package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +61 -16
  67. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  68. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  69. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  70. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
  71. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  72. package/daemon/context-packs/world-public/manifest.yaml +1 -1
  73. package/daemon/dist/adapters/claude-code-adapter.d.ts +9 -1
  74. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  75. package/daemon/dist/adapters/claude-code-adapter.js +110 -52
  76. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  77. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  78. package/daemon/dist/adapters/codex-runtime-adapter.js +47 -6
  79. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  80. package/daemon/dist/adapters/pi-resume.d.ts +1 -1
  81. package/daemon/dist/adapters/pi-resume.d.ts.map +1 -1
  82. package/daemon/dist/adapters/pi-resume.js +4 -1
  83. package/daemon/dist/adapters/pi-resume.js.map +1 -1
  84. package/daemon/dist/adapters/pi-runner-protocol.d.ts +9 -0
  85. package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -1
  86. package/daemon/dist/adapters/pi-runner-protocol.js +16 -0
  87. package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -1
  88. package/daemon/dist/adapters/pi-runner.d.ts +5 -2
  89. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
  90. package/daemon/dist/adapters/pi-runner.js +72 -15
  91. package/daemon/dist/adapters/pi-runner.js.map +1 -1
  92. package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -1
  93. package/daemon/dist/adapters/pi-runtime-adapter.js +2 -0
  94. package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
  95. package/daemon/dist/adapters/stub-compaction.d.ts +1 -0
  96. package/daemon/dist/adapters/stub-compaction.d.ts.map +1 -1
  97. package/daemon/dist/adapters/stub-compaction.js +2 -0
  98. package/daemon/dist/adapters/stub-compaction.js.map +1 -1
  99. package/daemon/dist/adapters/stub-refocus.d.ts +6 -0
  100. package/daemon/dist/adapters/stub-refocus.d.ts.map +1 -0
  101. package/daemon/dist/adapters/stub-refocus.js +22 -0
  102. package/daemon/dist/adapters/stub-refocus.js.map +1 -0
  103. package/daemon/dist/adapters/stub-runner.d.ts +6 -0
  104. package/daemon/dist/adapters/stub-runner.d.ts.map +1 -1
  105. package/daemon/dist/adapters/stub-runner.js +18 -1
  106. package/daemon/dist/adapters/stub-runner.js.map +1 -1
  107. package/daemon/dist/adapters/stub-script.d.ts +2 -2
  108. package/daemon/dist/adapters/stub-script.d.ts.map +1 -1
  109. package/daemon/dist/adapters/stub-script.js +2 -2
  110. package/daemon/dist/adapters/stub-script.js.map +1 -1
  111. package/daemon/dist/build-info.js +3 -3
  112. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  113. package/daemon/dist/db/all-migrations.js +2 -0
  114. package/daemon/dist/db/all-migrations.js.map +1 -1
  115. package/daemon/dist/db/migrations/117_provider_account_readings.d.ts +3 -0
  116. package/daemon/dist/db/migrations/117_provider_account_readings.d.ts.map +1 -0
  117. package/daemon/dist/db/migrations/117_provider_account_readings.js +32 -0
  118. package/daemon/dist/db/migrations/117_provider_account_readings.js.map +1 -0
  119. package/daemon/dist/domain/claude-activity-hooks.d.ts +6 -0
  120. package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -1
  121. package/daemon/dist/domain/claude-activity-hooks.js +19 -1
  122. package/daemon/dist/domain/claude-activity-hooks.js.map +1 -1
  123. package/daemon/dist/domain/claude-core-plugin-env.d.ts +2 -0
  124. package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
  125. package/daemon/dist/domain/claude-core-plugin-env.js +6 -2
  126. package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
  127. package/daemon/dist/domain/claude-managed-launch.d.ts +5 -0
  128. package/daemon/dist/domain/claude-managed-launch.d.ts.map +1 -1
  129. package/daemon/dist/domain/claude-managed-launch.js +48 -7
  130. package/daemon/dist/domain/claude-managed-launch.js.map +1 -1
  131. package/daemon/dist/domain/claude-mcp-menu.d.ts +5 -0
  132. package/daemon/dist/domain/claude-mcp-menu.d.ts.map +1 -0
  133. package/daemon/dist/domain/claude-mcp-menu.js +25 -0
  134. package/daemon/dist/domain/claude-mcp-menu.js.map +1 -0
  135. package/daemon/dist/domain/fresh-occupant-relation.d.ts +7 -0
  136. package/daemon/dist/domain/fresh-occupant-relation.d.ts.map +1 -1
  137. package/daemon/dist/domain/fresh-occupant-relation.js +44 -0
  138. package/daemon/dist/domain/fresh-occupant-relation.js.map +1 -1
  139. package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts +14 -2
  140. package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts.map +1 -1
  141. package/daemon/dist/domain/gateway/slack/channel-recovery.js +128 -89
  142. package/daemon/dist/domain/gateway/slack/channel-recovery.js.map +1 -1
  143. package/daemon/dist/domain/gateway/slack/inbound.d.ts +4 -0
  144. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  145. package/daemon/dist/domain/gateway/slack/inbound.js +5 -3
  146. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  147. package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts +24 -0
  148. package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts.map +1 -0
  149. package/daemon/dist/domain/gateway/slack/recovery-budget.js +18 -0
  150. package/daemon/dist/domain/gateway/slack/recovery-budget.js.map +1 -0
  151. package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts +104 -0
  152. package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts.map +1 -0
  153. package/daemon/dist/domain/gateway/slack/slack-recovery.js +236 -0
  154. package/daemon/dist/domain/gateway/slack/slack-recovery.js.map +1 -0
  155. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  156. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +29 -6
  157. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  158. package/daemon/dist/domain/gateway/slack/state-store.d.ts +34 -0
  159. package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -1
  160. package/daemon/dist/domain/gateway/slack/state-store.js +67 -0
  161. package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -1
  162. package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts +37 -0
  163. package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts.map +1 -0
  164. package/daemon/dist/domain/gateway/slack/thread-recovery.js +173 -0
  165. package/daemon/dist/domain/gateway/slack/thread-recovery.js.map +1 -0
  166. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +8 -0
  167. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -1
  168. package/daemon/dist/domain/gateway/slack/thread-seat-map.js +11 -0
  169. package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -1
  170. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +6 -1
  171. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -1
  172. package/daemon/dist/domain/model-divergence/current-generation-record.js +4 -1
  173. package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -1
  174. package/daemon/dist/domain/model-divergence/current-model-reader.d.ts +74 -0
  175. package/daemon/dist/domain/model-divergence/current-model-reader.d.ts.map +1 -0
  176. package/daemon/dist/domain/model-divergence/current-model-reader.js +246 -0
  177. package/daemon/dist/domain/model-divergence/current-model-reader.js.map +1 -0
  178. package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts +18 -0
  179. package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts.map +1 -1
  180. package/daemon/dist/domain/model-divergence/effective-model-readers.js +24 -8
  181. package/daemon/dist/domain/model-divergence/effective-model-readers.js.map +1 -1
  182. package/daemon/dist/domain/native-process-lineage.d.ts +8 -1
  183. package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
  184. package/daemon/dist/domain/native-process-lineage.js +40 -26
  185. package/daemon/dist/domain/native-process-lineage.js.map +1 -1
  186. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
  187. package/daemon/dist/domain/native-resume-probe.js +34 -8
  188. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  189. package/daemon/dist/domain/node-inventory.d.ts +1 -1
  190. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  191. package/daemon/dist/domain/node-inventory.js +84 -18
  192. package/daemon/dist/domain/node-inventory.js.map +1 -1
  193. package/daemon/dist/domain/process-census.d.ts +1 -1
  194. package/daemon/dist/domain/process-census.d.ts.map +1 -1
  195. package/daemon/dist/domain/process-table.d.ts +26 -0
  196. package/daemon/dist/domain/process-table.d.ts.map +1 -0
  197. package/daemon/dist/domain/process-table.js +185 -0
  198. package/daemon/dist/domain/process-table.js.map +1 -0
  199. package/daemon/dist/domain/profile-resolver.d.ts +8 -0
  200. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  201. package/daemon/dist/domain/profile-resolver.js +11 -0
  202. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  203. package/daemon/dist/domain/projection-planner.js +1 -1
  204. package/daemon/dist/domain/projection-planner.js.map +1 -1
  205. package/daemon/dist/domain/provider/claude-usage-windows.d.ts +3 -1
  206. package/daemon/dist/domain/provider/claude-usage-windows.d.ts.map +1 -1
  207. package/daemon/dist/domain/provider/claude-usage-windows.js +48 -3
  208. package/daemon/dist/domain/provider/claude-usage-windows.js.map +1 -1
  209. package/daemon/dist/domain/provider/codex-usage-reader.d.ts +4 -1
  210. package/daemon/dist/domain/provider/codex-usage-reader.d.ts.map +1 -1
  211. package/daemon/dist/domain/provider/codex-usage-reader.js +3 -0
  212. package/daemon/dist/domain/provider/codex-usage-reader.js.map +1 -1
  213. package/daemon/dist/domain/provider/codex-usage-windows.d.ts +3 -1
  214. package/daemon/dist/domain/provider/codex-usage-windows.d.ts.map +1 -1
  215. package/daemon/dist/domain/provider/codex-usage-windows.js +1 -0
  216. package/daemon/dist/domain/provider/codex-usage-windows.js.map +1 -1
  217. package/daemon/dist/domain/provider/provider-account-readings.d.ts +42 -0
  218. package/daemon/dist/domain/provider/provider-account-readings.d.ts.map +1 -0
  219. package/daemon/dist/domain/provider/provider-account-readings.js +132 -0
  220. package/daemon/dist/domain/provider/provider-account-readings.js.map +1 -0
  221. package/daemon/dist/domain/provider/provider-types.d.ts +29 -0
  222. package/daemon/dist/domain/provider/provider-types.d.ts.map +1 -1
  223. package/daemon/dist/domain/provider/usage-across-hosts.d.ts.map +1 -1
  224. package/daemon/dist/domain/provider/usage-across-hosts.js +6 -0
  225. package/daemon/dist/domain/provider/usage-across-hosts.js.map +1 -1
  226. package/daemon/dist/domain/provider/usage-windows.d.ts +25 -0
  227. package/daemon/dist/domain/provider/usage-windows.d.ts.map +1 -1
  228. package/daemon/dist/domain/provider/usage-windows.js +100 -4
  229. package/daemon/dist/domain/provider/usage-windows.js.map +1 -1
  230. package/daemon/dist/domain/queue-repository.d.ts +23 -0
  231. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  232. package/daemon/dist/domain/queue-repository.js +59 -1
  233. package/daemon/dist/domain/queue-repository.js.map +1 -1
  234. package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
  235. package/daemon/dist/domain/queue-stuck-sweep.js +47 -4
  236. package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
  237. package/daemon/dist/domain/restore-check-service.d.ts +10 -0
  238. package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
  239. package/daemon/dist/domain/restore-check-service.js +73 -10
  240. package/daemon/dist/domain/restore-check-service.js.map +1 -1
  241. package/daemon/dist/domain/restore-guidance.d.ts +6 -0
  242. package/daemon/dist/domain/restore-guidance.d.ts.map +1 -1
  243. package/daemon/dist/domain/restore-guidance.js +21 -5
  244. package/daemon/dist/domain/restore-guidance.js.map +1 -1
  245. package/daemon/dist/domain/restore-orchestrator.js +1 -1
  246. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  247. package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
  248. package/daemon/dist/domain/resume-metadata-refresher.js +6 -29
  249. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  250. package/daemon/dist/domain/rig-repository.d.ts +3 -0
  251. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  252. package/daemon/dist/domain/rig-repository.js +6 -0
  253. package/daemon/dist/domain/rig-repository.js.map +1 -1
  254. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  255. package/daemon/dist/domain/rigspec-instantiator.js +4 -2
  256. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  257. package/daemon/dist/domain/rigspec-preflight.d.ts +4 -0
  258. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  259. package/daemon/dist/domain/rigspec-preflight.js +12 -2
  260. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  261. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  262. package/daemon/dist/domain/rigspec-schema.js +11 -0
  263. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  264. package/daemon/dist/domain/runtime-adapter.d.ts +13 -0
  265. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  266. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  267. package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  268. package/daemon/dist/domain/seat-attention-reconciler.js +15 -1
  269. package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  270. package/daemon/dist/domain/seat-cwd-preparation.d.ts +22 -0
  271. package/daemon/dist/domain/seat-cwd-preparation.d.ts.map +1 -0
  272. package/daemon/dist/domain/seat-cwd-preparation.js +107 -0
  273. package/daemon/dist/domain/seat-cwd-preparation.js.map +1 -0
  274. package/daemon/dist/domain/seat-effort.d.ts +4 -3
  275. package/daemon/dist/domain/seat-effort.d.ts.map +1 -1
  276. package/daemon/dist/domain/seat-effort.js +21 -3
  277. package/daemon/dist/domain/seat-effort.js.map +1 -1
  278. package/daemon/dist/domain/seat-lifecycle-service.d.ts +36 -2
  279. package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
  280. package/daemon/dist/domain/seat-lifecycle-service.js +206 -15
  281. package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
  282. package/daemon/dist/domain/seat-restart-in-place.d.ts +14 -0
  283. package/daemon/dist/domain/seat-restart-in-place.d.ts.map +1 -1
  284. package/daemon/dist/domain/seat-restart-in-place.js +59 -3
  285. package/daemon/dist/domain/seat-restart-in-place.js.map +1 -1
  286. package/daemon/dist/domain/seat-status-service.d.ts +2 -0
  287. package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
  288. package/daemon/dist/domain/seat-status-service.js +1 -0
  289. package/daemon/dist/domain/seat-status-service.js.map +1 -1
  290. package/daemon/dist/domain/seat-structural-activity-service.d.ts +7 -1
  291. package/daemon/dist/domain/seat-structural-activity-service.d.ts.map +1 -1
  292. package/daemon/dist/domain/seat-structural-activity-service.js +9 -3
  293. package/daemon/dist/domain/seat-structural-activity-service.js.map +1 -1
  294. package/daemon/dist/domain/session-name.d.ts +8 -0
  295. package/daemon/dist/domain/session-name.d.ts.map +1 -1
  296. package/daemon/dist/domain/session-name.js +12 -0
  297. package/daemon/dist/domain/session-name.js.map +1 -1
  298. package/daemon/dist/domain/session-transport.d.ts +78 -3
  299. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  300. package/daemon/dist/domain/session-transport.js +306 -15
  301. package/daemon/dist/domain/session-transport.js.map +1 -1
  302. package/daemon/dist/domain/successor-session-launcher.js +1 -1
  303. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  304. package/daemon/dist/domain/types.d.ts +14 -0
  305. package/daemon/dist/domain/types.d.ts.map +1 -1
  306. package/daemon/dist/domain/types.js.map +1 -1
  307. package/daemon/dist/domain/watchdog-delivery.d.ts +29 -0
  308. package/daemon/dist/domain/watchdog-delivery.d.ts.map +1 -0
  309. package/daemon/dist/domain/watchdog-delivery.js +113 -0
  310. package/daemon/dist/domain/watchdog-delivery.js.map +1 -0
  311. package/daemon/dist/domain/watchdog-policy-engine.d.ts +60 -1
  312. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  313. package/daemon/dist/domain/watchdog-policy-engine.js +154 -28
  314. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  315. package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -1
  316. package/daemon/dist/domain/watchdog-scheduler.js +6 -1
  317. package/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
  318. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
  319. package/daemon/dist/domain/workflow-instance-store.js +6 -2
  320. package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
  321. package/daemon/dist/routes/attention.d.ts.map +1 -1
  322. package/daemon/dist/routes/attention.js +41 -1
  323. package/daemon/dist/routes/attention.js.map +1 -1
  324. package/daemon/dist/routes/compaction.js +1 -1
  325. package/daemon/dist/routes/compaction.js.map +1 -1
  326. package/daemon/dist/routes/queue.d.ts.map +1 -1
  327. package/daemon/dist/routes/queue.js +3 -1
  328. package/daemon/dist/routes/queue.js.map +1 -1
  329. package/daemon/dist/routes/restore-check.d.ts.map +1 -1
  330. package/daemon/dist/routes/restore-check.js +19 -1
  331. package/daemon/dist/routes/restore-check.js.map +1 -1
  332. package/daemon/dist/routes/seat.d.ts.map +1 -1
  333. package/daemon/dist/routes/seat.js +15 -2
  334. package/daemon/dist/routes/seat.js.map +1 -1
  335. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  336. package/daemon/dist/routes/sessions.js +7 -1
  337. package/daemon/dist/routes/sessions.js.map +1 -1
  338. package/daemon/dist/routes/transport.d.ts.map +1 -1
  339. package/daemon/dist/routes/transport.js +13 -2
  340. package/daemon/dist/routes/transport.js.map +1 -1
  341. package/daemon/dist/server.d.ts +1 -0
  342. package/daemon/dist/server.d.ts.map +1 -1
  343. package/daemon/dist/server.js +1 -0
  344. package/daemon/dist/server.js.map +1 -1
  345. package/daemon/dist/startup.d.ts.map +1 -1
  346. package/daemon/dist/startup.js +39 -113
  347. package/daemon/dist/startup.js.map +1 -1
  348. package/daemon/docs/reference/agent-spec.md +1 -1
  349. package/daemon/docs/reference/agent-startup-guide.md +84 -0
  350. package/daemon/docs/reference/getting-started.md +44 -14
  351. package/daemon/docs/reference/publishing-a-rig-bundle.md +5 -2
  352. package/daemon/docs/reference/refocus-channel.md +11 -1
  353. package/daemon/docs/reference/rig-spec.md +5 -5
  354. package/daemon/docs/reference/rosters.md +29 -2
  355. package/daemon/docs/reference/slack-app-setup.md +47 -17
  356. package/daemon/docs/reference/whats-new.md +90 -163
  357. package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -0
  358. package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -0
  359. package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -0
  360. package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -0
  361. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -0
  362. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -0
  363. package/daemon/specs/agents/development/implementer/agent.yaml +1 -0
  364. package/daemon/specs/agents/development/qa/agent.yaml +1 -0
  365. package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +1 -0
  366. package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +1 -0
  367. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -0
  368. package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
  369. package/daemon/specs/agents/research/analyst/agent.yaml +1 -0
  370. package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -0
  371. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -0
  372. package/dist/build-info.js +3 -3
  373. package/dist/commands/capture.d.ts.map +1 -1
  374. package/dist/commands/capture.js +14 -0
  375. package/dist/commands/capture.js.map +1 -1
  376. package/dist/commands/config.d.ts.map +1 -1
  377. package/dist/commands/config.js +3 -2
  378. package/dist/commands/config.js.map +1 -1
  379. package/dist/commands/doctor.d.ts.map +1 -1
  380. package/dist/commands/doctor.js +8 -7
  381. package/dist/commands/doctor.js.map +1 -1
  382. package/dist/commands/grow.d.ts.map +1 -1
  383. package/dist/commands/grow.js +24 -7
  384. package/dist/commands/grow.js.map +1 -1
  385. package/dist/commands/provider.d.ts.map +1 -1
  386. package/dist/commands/provider.js +43 -7
  387. package/dist/commands/provider.js.map +1 -1
  388. package/dist/commands/ps.d.ts +2 -0
  389. package/dist/commands/ps.d.ts.map +1 -1
  390. package/dist/commands/ps.js +12 -1
  391. package/dist/commands/ps.js.map +1 -1
  392. package/dist/commands/remove.d.ts.map +1 -1
  393. package/dist/commands/remove.js +20 -1
  394. package/dist/commands/remove.js.map +1 -1
  395. package/dist/commands/roster.d.ts +2 -1
  396. package/dist/commands/roster.d.ts.map +1 -1
  397. package/dist/commands/roster.js +10 -5
  398. package/dist/commands/roster.js.map +1 -1
  399. package/dist/commands/scope.js +1 -1
  400. package/dist/commands/scope.js.map +1 -1
  401. package/dist/commands/seat.d.ts.map +1 -1
  402. package/dist/commands/seat.js +75 -8
  403. package/dist/commands/seat.js.map +1 -1
  404. package/dist/commands/slack.d.ts.map +1 -1
  405. package/dist/commands/slack.js +14 -1
  406. package/dist/commands/slack.js.map +1 -1
  407. package/dist/commands/usage.d.ts.map +1 -1
  408. package/dist/commands/usage.js +4 -3
  409. package/dist/commands/usage.js.map +1 -1
  410. package/dist/lib/model-observation.d.ts +13 -0
  411. package/dist/lib/model-observation.d.ts.map +1 -0
  412. package/dist/lib/model-observation.js +25 -0
  413. package/dist/lib/model-observation.js.map +1 -0
  414. package/dist/mcp-server.d.ts.map +1 -1
  415. package/dist/mcp-server.js +1 -0
  416. package/dist/mcp-server.js.map +1 -1
  417. package/package.json +1 -1
  418. package/tui/dist/attention/attention-model.js +6 -5
  419. package/tui/dist/attention/attention-model.js.map +1 -1
  420. package/tui/dist/attention/source-continuity.d.ts.map +1 -1
  421. package/tui/dist/attention/source-continuity.js +2 -0
  422. package/tui/dist/attention/source-continuity.js.map +1 -1
  423. package/tui/dist/terminals/open-window.d.ts +11 -1
  424. package/tui/dist/terminals/open-window.d.ts.map +1 -1
  425. package/tui/dist/terminals/open-window.js +47 -2
  426. package/tui/dist/terminals/open-window.js.map +1 -1
  427. package/tui/dist/usage/usage-model.d.ts +2 -0
  428. package/tui/dist/usage/usage-model.d.ts.map +1 -1
  429. package/tui/dist/usage/usage-model.js +38 -3
  430. package/tui/dist/usage/usage-model.js.map +1 -1
  431. package/ui/dist/assets/{index-Cfbtfd9G.js → index-CVgod3Pm.js} +1 -1
  432. package/ui/dist/index.html +1 -1
package/README.md CHANGED
@@ -20,16 +20,16 @@ Not setting this up today? Get the next walkthrough and occasional OpenRig updat
20
20
 
21
21
  ## Install and first run
22
22
 
23
- Requires Node.js 22 or 24 and tmux, on macOS or Linux. On Linux, the distribution's own Node.js can be older (Ubuntu 24.04's is 18); install a supported version with [nvm](https://github.com/nvm-sh/nvm) (`nvm install 22`) or NodeSource. On a Mac with Apple silicon, use Node.js 22 ([compatibility history](docs/releases/v0.5.15.md#known-compatibility-limitation)). On Windows, use WSL2, the Windows route OpenRig supports; native Windows isn't supported. OpenRig's automated tests don't run on WSL2 yet; see [one user's working setup](docs/reference/getting-started.md#wsl2-a-reported-working-setup). Launching a rig writes provider hooks and workspace trust settings. Before running the commands below, read [what OpenRig changes on your machine](#what-openrig-changes-on-your-machine) and back up the relevant files.
23
+ Requires Node.js 22 or 24 and tmux, on macOS or Linux, and one working Claude Code or Codex account: one is enough, since the kernel operator adapts the shipped `starter` team to whichever you have. On Linux, the distribution's own Node.js can be older (Ubuntu 24.04's is 18); install a supported version with [nvm](https://github.com/nvm-sh/nvm) (`nvm install 22`) or NodeSource. On a Mac with Apple silicon, use Node.js 22 ([compatibility history](docs/releases/v0.5.15.md#known-compatibility-limitation)). On a Mac where you aren't an administrator, or where Homebrew belongs to another account (its `brew install` is refused), install Node.js in your own home folder with [nvm](https://github.com/nvm-sh/nvm): run `touch ~/.zshrc` (a new Mac account has none, and nvm's installer only adds itself to a profile file that already exists), then the install command on nvm's page, open a new terminal, and run `nvm install 22`. That needs no administrator password, and `npm install -g` then installs into your nvm folder. On Windows, use WSL2, the Windows route OpenRig supports; native Windows isn't supported. OpenRig's automated tests don't run on WSL2 yet; see [one user's working setup](docs/reference/getting-started.md#wsl2-a-reported-working-setup). Launching a rig writes provider hooks and workspace trust settings. Before running the commands below, read [what OpenRig changes on your machine](#what-openrig-changes-on-your-machine) and back up the relevant files.
24
24
 
25
- **One command.** This runs OpenRig's install script from the `v0.6.12` release. It checks Node.js and npm, installs the latest published `@openrig/cli` with `npm install -g`, runs the Node.js and SQLite check, then runs `rig setup --dry-run` and `rig setup`. The first line prints that plan and changes nothing:
25
+ **One command.** This runs OpenRig's install script from the `v0.6.13` release. It checks Node.js and npm, installs the latest published `@openrig/cli` with `npm install -g`, runs the Node.js and SQLite check, then runs `rig setup --dry-run` and `rig setup`. The first line prints that plan and changes nothing:
26
26
 
27
27
  ```bash
28
- curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.12/scripts/install.sh | sh -s -- --dry-run
29
- curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.12/scripts/install.sh | sh
28
+ curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.13/scripts/install.sh | sh -s -- --dry-run
29
+ curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.13/scripts/install.sh | sh
30
30
  ```
31
31
 
32
- If a provider isn't signed in yet, the last step reports `FAILED [4/4]`, and `rig setup` lists the sign-in under "Some steps need attention". If the only remaining failures are provider sign-ins, the install steps finished; sign in to each selected provider as below and continue.
32
+ If `rig setup` doesn't finish ready, for example because a provider isn't signed in yet, the script ends with `INSTALLED, SETUP NOT COMPLETE`: the CLI is installed, and `rig setup` lists what's left under "Some steps need attention". If the only items left are provider sign-ins, sign in to each selected provider as below and continue; run `rig setup` again rather than reinstalling the CLI.
33
33
 
34
34
  **Or step by step:**
35
35
 
@@ -161,7 +161,7 @@ using a published package, since repository guidance can be ahead of npm.
161
161
  | --- | --- |
162
162
  | **npm installation** | Installs the CLI (`rig` and `openrig-tui`), bundled components and dependencies under your npm prefix (with Bun, under Bun's global directory). OpenRig's postinstall checks the Node.js version and that the SQLite module loads; Bun may block this script. It does not run daemon or provider setup. |
163
163
  | **`rig setup`** | Attempts missing tools and writes an OpenRig block in `~/.tmux.conf` for mouse support and scrollback. Installs herdr by default on macOS and Linux unless declined with `--no-herdr`; an unavailable herdr install is a warning. On macOS the installing agent offers Ghostty, and `--ghostty` attempts it after acceptance. Existing cmux settings are left unchanged. `--full` adds workstation tools. `--dry-run` shows setup's plan without applying it. |
164
- | **Daemon startup** | Creates/updates instance state under `OPENRIG_HOME` (normally `~/.openrig`), including its database and managed plugin resources. Seeds the `openrig-skills` discovery skill, the `refocusing` skill and the person-facing `rigs` skill in `~/.claude/skills` and `~/.agents/skills`, subject to existing version ownership. With `runtime.codex.hooks_enabled` enabled (the default), writes Codex hook configuration and trust records as described below—even before a rig launches. |
164
+ | **Daemon startup** | Creates/updates instance state under `OPENRIG_HOME` (normally `~/.openrig`), including its database and managed plugin resources. Seeds the `openrig-skills` discovery skill, the `refocusing` skill and the person-facing `rigs` skill in `~/.claude/skills` and `~/.agents/skills`, subject to existing version ownership. When a Codex seat is already recorded and `runtime.codex.hooks_enabled` is enabled (the default), ensures its hook configuration and trust records as described below. With no recorded Codex seat, enabled hooks wait for its first launch; disabled hooks still remove a stale OpenRig-managed hook block, if present. |
165
165
  | **Rig/seat launch and attachment** | Creates tmux sessions, supplies seat identity and daemon connection environment, and projects selected guidance, skills, plugins and runtime resources into the workspace. Managed startup pre-trusts the workspace. Claude context collection can also be provisioned for attached sessions and refreshed during monitoring. In a Git repository, newly created files under `.codex/plugins/shared:openrig-core/` (or the unqualified `.codex/plugins/openrig-core/`) are added to the repository's Git `info/exclude` inside an `# BEGIN OpenRig generated files` block; new `AGENTS.md`, `CLAUDE.md` and `CLAUDE.local.md` files stay visible with a warning. |
166
166
  | **Bundle install** (`rig bundle install`, or `rig up` with a `.rigbundle` or GitHub link) | Writes the bundle's files into the install target: `--target`, or the current directory for `rig up` and for a GitHub link. `rig bundle install` with a local archive needs `--target`. Routes its declared skills, plugins and context packs into your libraries. A GitHub link's archive is kept under `OPENRIG_HOME/bundle-imports/`, and installs are recorded in `OPENRIG_HOME/bundle-audit.jsonl`. A bundle that carries a project creates it under `workspace.projects_root` and records it, with the rig's association, in the workspace catalog. |
167
167
  | **Explicit permission configuration** | The built-in bootstrap does **not** add `rig` command allow rules to your settings files; a team seat with no permission policy, per-seat choice or (for Codex) named profile gets the per-launch [team default](docs/reference/rig-spec.md#team-launch-defaults) instead. Agent-guided setup recommends keeping it and requires your actual answer before the agent [adds remembered rules at your chosen scope](docs/reference/getting-started.md#have-your-agent-configure-permissions). No/no answer keeps the team default and preserves settings; existing choices and stricter rules remain relevant. Broader access is separate. |
@@ -175,7 +175,9 @@ user's home; changing `OPENRIG_HOME` alone does not isolate provider configurati
175
175
  writes `HOME/.claude.json`, and also `<CLAUDE_CONFIG_DIR>/.claude.json` when the
176
176
  daemon has that variable set. In the workspace, `.claude/settings.local.json` receives
177
177
  the context collector's `statusLine` command and selected activity hooks;
178
- the collector script lives under `.openrig/`, and the activity-hook relay under
178
+ a user's own status-line command is preserved, so it can prevent collector
179
+ installation. Selected settings resources can still replace overlapping keys.
180
+ The collector script lives under `.openrig/`, and the activity-hook relay under
179
181
  the instance's `state/claude-activity-hooks/`. Selected settings/MCP resources can also
180
182
  change that settings file and `.mcp.json`. The shared settings resource sets
181
183
  `permissions.defaultMode` to `acceptEdits` and enables Exa/Context7 MCP entries;
@@ -185,8 +187,10 @@ user's home; changing `OPENRIG_HOME` alone does not isolate provider configurati
185
187
  To keep your own status line alongside the collector, see
186
188
  [Custom Claude status line](docs/reference/claude-status-line.md).
187
189
  - **Codex:** writes the daemon's `CODEX_HOME/config.toml` (normally
188
- `~/.codex/config.toml`). Startup enables hooks, adds the OpenRig activity relay
189
- commands and pre-writes trust hashes for those commands. Seat startup adds
190
+ `~/.codex/config.toml`). With hooks enabled, daemon startup ensures the OpenRig
191
+ activity relay commands and their trust hashes when a Codex seat is already
192
+ recorded; otherwise the first Codex launch does so. With hooks disabled, startup
193
+ can remove a stale OpenRig-managed hook block even without a Codex seat. Seat startup adds
190
194
  `trust_level = "trusted"` for the workspace; selected config resources can
191
195
  add MCP settings. Managed launches pass `-c check_for_update_on_startup=false`,
192
196
  which writes no config; a recognized update notice that still appears can be
@@ -252,9 +256,12 @@ separates the desired selection from the last launch arguments; neither proves
252
256
  native enforcement. See the [permission guide](docs/reference/getting-started.md#per-seat-permission-mode).
253
257
 
254
258
  Managed hook blocks target OpenRig's entries and retain unrelated hooks, but
255
- trust entries, selected resource keys and Claude's existing status-line command
256
- can be replaced. Some writers recover unreadable settings as empty objects;
257
- this is not a complete preservation or rollback guarantee. Back up relevant
259
+ trust entries and selected resource keys can be replaced. Claude's collector,
260
+ activity-hook and JSON resource writers leave unreadable or malformed settings
261
+ untouched; this is not a product-wide preservation guarantee. Codex's workspace
262
+ trust writer can treat an unreadable `config.toml` as empty and write a new trust
263
+ configuration. Read-modify-write operations can also race other writers; there
264
+ is no complete preservation or rollback guarantee. Back up relevant
258
265
  files before first use. Daemon/bootstrap writes are automatic and do not each
259
266
  have an interactive preview; `rig setup --dry-run` does not preview every later
260
267
  startup effect.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openrig-core",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "OpenRig canonical skills and hooks for cross-runtime agent topology coordination, continuity, and operating discipline.",
5
5
  "author": {
6
6
  "name": "Mike Schwarz",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openrig-core",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "OpenRig canonical skills and hooks for cross-runtime agent topology coordination, continuity, and operating discipline.",
5
5
  "author": {
6
6
  "name": "Mike Schwarz",
@@ -26,8 +26,9 @@ This plugin ships dual-manifest packaging — both `.claude-plugin/` and `.codex
26
26
  A seat that has OpenRig's activity relay in its own `settings.local.json` (the `claude-activity-hooks` runtime resource)
27
27
  already reports activity from there, so the plugin's `activity-relay.cjs` (which the manifest starts with `--from-plugin`)
28
28
  exits for an event the seat's settings register it for. It does so only when the entry is exactly the one OpenRig writes
29
- (`node` and one quoted path to `state/claude-activity-hooks/activity-relay.cjs`) and the script at that path is this same
30
- script, so a missing script, a different one at that path, or a wrapper around it never silences the plugin. A seat without
29
+ (legacy `node` or a quoted absolute Node executable, then one quoted path to
30
+ `state/claude-activity-hooks/activity-relay.cjs`), the interpreter is executable, and the script at that path is this same
31
+ script. A missing interpreter/script, a different script, or a wrapper around it never silences the plugin. A seat without
31
32
  that resource, and a plugin installed outside OpenRig, report through the plugin's relay, so each event is reported once.
32
33
  A relay entry written by an older install (a different path or quoting) doesn't match, so until the seat is relaunched and
33
34
  its entry refreshed, both relays report and its events come twice. The plugin is not a Claude marketplace entry, so
@@ -43,6 +44,12 @@ This plugin ships dual-manifest packaging — both `.claude-plugin/` and `.codex
43
44
  - **Codex CLI** — Codex has no directory option for plugins, so it does not load this plugin. A Codex seat gets only the hooks
44
45
  the daemon writes into Codex's `config.toml` (the activity relay); `hooks/codex.json` is not read.
45
46
 
47
+ Generated Claude settings commands for the activity relay and context collector use the daemon's absolute Node
48
+ executable when its name is recognized (`node` or `node.exe`); other names keep the legacy bare `node` command and
49
+ its PATH requirement. Pinned commands do not require Node on the Claude process's inherited PATH. The executable must
50
+ remain installed; removing or moving it requires normal command refresh from a healthy runtime. This does not change the static plugin
51
+ manifest commands, which still use `node`, or prove that an already-running Claude reloaded changed settings.
52
+
46
53
  One skill targets Claude Code's compaction behavior specifically:
47
54
  - `claude-compaction-restore` — used to rebuild a Claude Code agent's working mental model after `/compact`, from JSONL transcripts and touched files
48
55
 
@@ -214,15 +214,30 @@ function uid() {
214
214
  // each event once either way. Anything unreadable, missing or different counts as "not registered": a seat is never silent.
215
215
  const SETTINGS_RELAY_TAIL = "state/claude-activity-hooks/activity-relay.cjs";
216
216
 
217
- // The adapter's own test for the entry it writes (isOwnedRelayCommand): `node` and one single-quoted token, in the form
218
- // shellQuote produces, naming the relay copy. A wrapper that only mentions the path is not that entry. Returns the path.
217
+ // Keep this finite generated-command grammar in parity with parseManagedClaudeNodeCommand.
218
+ // Bare-node legacy commands and a canonical quoted absolute Node path are recognised;
219
+ // extra arguments and user wrappers are not the settings relay.
219
220
  function settingsRelayPath(command) {
220
- const m = /^node\s+(.+)$/.exec(command.trim());
221
- const arg = m && m[1];
222
- if (!arg || arg.length < 2 || !arg.startsWith("'") || !arg.endsWith("'")) return null;
223
- const decoded = arg.slice(1, -1).split(`'"'"'`).join("'");
224
- if ("'" + decoded.replace(/'/g, `'"'"'`) + "'" !== arg) return null;
225
- return path.isAbsolute(decoded) && decoded.endsWith(`/${SETTINGS_RELAY_TAIL}`) ? decoded : null;
221
+ if (/[\r\n]/.test(command)) return null;
222
+ const m = /^(node|'(?:[^']|'"'"')*')[ \t]+('(?:[^']|'"'"')*')$/.exec(command.trim());
223
+ if (!m) return null;
224
+ const decode = token => token.slice(1, -1).split(`'"'"'`).join("'");
225
+ const quote = value => "'" + value.replace(/'/g, `'"'"'`) + "'";
226
+ const executable = m[1] === "node" ? "node" : decode(m[1]);
227
+ const relay = decode(m[2]);
228
+ if (quote(relay) !== m[2] || !path.isAbsolute(relay) || !relay.endsWith(`/${SETTINGS_RELAY_TAIL}`)) return null;
229
+ if (m[1] !== "node" && (quote(executable) !== m[1] || !path.isAbsolute(executable) || !/^node(?:\.exe)?$/i.test(path.basename(executable)))) return null;
230
+ return { executable, relay };
231
+ }
232
+
233
+ function interpreterAvailable(executable, env) {
234
+ const candidates = executable === "node"
235
+ ? typeof env.PATH === "string" ? env.PATH.split(path.delimiter).map(dir => path.resolve(dir || ".", "node")) : []
236
+ : [executable];
237
+ return candidates.some(candidate => {
238
+ try { fs.accessSync(candidate, fs.constants.X_OK); return fs.statSync(candidate).isFile(); }
239
+ catch { return false; }
240
+ });
226
241
  }
227
242
 
228
243
  // A settings entry only silences this run if it would really report: the file it names is there and is this very script.
@@ -243,7 +258,7 @@ function settingsRelayReports(hookEvent, providerPayload, env = process.env) {
243
258
  return Array.isArray(groups) && groups.some((group) => group && unrestricted(group) && Array.isArray(group.hooks)
244
259
  && group.hooks.some((hook) => {
245
260
  const relay = hook && typeof hook.command === "string" ? settingsRelayPath(hook.command) : null;
246
- return relay !== null && isThisScript(relay);
261
+ return relay !== null && interpreterAvailable(relay.executable, env) && isThisScript(relay.relay);
247
262
  }));
248
263
  } catch {
249
264
  return false;
@@ -306,4 +321,5 @@ module.exports = {
306
321
  resolveEndpoint,
307
322
  pluginRunIsRedundant,
308
323
  settingsRelayReports,
324
+ settingsRelayPath,
309
325
  };
@@ -125,11 +125,14 @@ function readConfiguredContent(home) {
125
125
  // current work, its basis travels to the trace script, which alone decides how to render it;
126
126
  // a failed or unreadable answer is passed as UNKNOWN. Never guess a work node here: a guess
127
127
  // would silently re-point the whole trace.
128
- // OPR.0.7.0.12 — the work packet, switched off by default: the trace receives the daemon's
129
- // labelled work candidates and carries duties and notes as text. With it off, every path below
130
- // is unchanged.
128
+ // OPR.0.7.0.12 — the work packet: the trace receives the daemon's labelled work candidates and
129
+ // carries duties and notes as text. OPENRIG_REFOCUS_WORK_PACKET=1 turns it on and =0 off; unset, each
130
+ // runtime's default below applies. A runtime defaults on only once a native run has shown the packet
131
+ // reaching the agent and leading to the right next action; neither has yet. With it off, every path
132
+ // below is unchanged.
133
+ const WORK_PACKET_DEFAULT = { claude: false, codex: false };
131
134
  function workPacketEnabled() {
132
- return enabled(process.env.OPENRIG_REFOCUS_WORK_PACKET, false);
135
+ return enabled(process.env.OPENRIG_REFOCUS_WORK_PACKET, WORK_PACKET_DEFAULT[runtime()] === true);
133
136
  }
134
137
 
135
138
  function readQueueWhoami(timeout = lookupTimeout()) {
@@ -109,6 +109,11 @@ When you `rig capture` a pane, **greyed / ghost autocomplete suggestions are NOT
109
109
 
110
110
  **Rule:** ignore ghost/autosuggest text entirely. Only *committed/rendered* pane output is real. When it matters, verify at source (git, the queue, the actual event) — never off a capture's ghost line.
111
111
 
112
+ A plain capture loses the grey, so `rig capture` reads it for you. For a Claude Code or Codex seat, a
113
+ `[rig capture: <seat>: input box: ...]` note on stderr (and `inputBox` in `--json`) says whether the input box's text
114
+ is likely a harness suggestion or typed, from where the cursor is and whether the text is drawn faint. Don't act on
115
+ `likely-suggestion` text as anyone's intent, and treat `unknown` as unknown: verify at source.
116
+
112
117
  ## Moment-of-truth checklist
113
118
 
114
119
  - **Starting a slice?** → do you know what it's for and what done looks like? mockups attached (UI slices)? **Are you on the light path?** (You are, unless the mission owner assigned the overlay.)
@@ -157,6 +157,27 @@ DUTY_HEADINGS = ("my job here", "standing duties")
157
157
  NOTES_STATE_HEADINGS = ("current state",)
158
158
  HEADING = re.compile(r"^(#{1,6})\s+(.*?)\s*#*\s*$")
159
159
  DEFAULT_NOTES_MAX_AGE_DAYS = 14
160
+ # Each packet field is bounded on its own; there is no total cap. A row's summary and continuation are one line each,
161
+ # the held and next lists show their newest rows with the full count, and a matched section's body is cut at a line.
162
+ FIELD_CHARS = 160
163
+ HELD_SHOWN = 20
164
+ NEXT_SHOWN = 10
165
+ SECTION_CHARS = 1500
166
+
167
+
168
+ def one_line(text):
169
+ """(text as one line, cut to FIELD_CHARS, whether it was shortened)."""
170
+ flat = " ".join(str(text).split())
171
+ if len(flat) <= FIELD_CHARS:
172
+ return flat, flat != str(text).strip()
173
+ return flat[:FIELD_CHARS - 1].rstrip() + "…", True
174
+
175
+
176
+ def bounded_section(body):
177
+ if len(body) <= SECTION_CHARS:
178
+ return body
179
+ boundary = body.rfind("\n", 0, SECTION_CHARS)
180
+ return body[:boundary if boundary > 0 else SECTION_CHARS].rstrip() + "\n[… use --depth full for the rest]"
160
181
 
161
182
 
162
183
  def heading_sections(text, wanted):
@@ -180,7 +201,7 @@ def heading_sections(text, wanted):
180
201
 
181
202
  def by_section(text, wanted, path):
182
203
  found = heading_sections(text, wanted)
183
- shown = "\n\n".join(f"{title}\n{body}" if body else title for title, body in found)
204
+ shown = "\n\n".join(f"{title}\n{bounded_section(body)}" if body else title for title, body in found)
184
205
  missing = [phrase for phrase in wanted if not any(title.lower().startswith(phrase) for title, _ in found)]
185
206
  if not missing:
186
207
  return shown
@@ -335,28 +356,51 @@ def candidate_line(candidate):
335
356
  return line
336
357
 
337
358
 
359
+ def row_fields(row, *fields):
360
+ """Each named field as one bounded line, and a pointer to the whole row when any was shortened."""
361
+ values, cut = [], False
362
+ for field, missing in fields:
363
+ value, shortened = one_line(row.get(field) or missing)
364
+ values.append(value)
365
+ cut = cut or shortened
366
+ pointer = f" — full row: rig queue show {row['qitemId']}" if cut and row.get("qitemId") else ""
367
+ return values, pointer
368
+
369
+
370
+ def cut_notice(name, state, rows, shown, daemon_cut):
371
+ """The list's notice when it was cut here or by the daemon: how many are shown, of how many."""
372
+ if not daemon_cut and len(rows) <= shown:
373
+ return None
374
+ total = f"more than {len(rows)}" if daemon_cut else str(len(rows))
375
+ return (f"(the {name} list was cut: {min(len(rows), shown)} of {total} shown; "
376
+ f"`rig queue list --owned --state {state}` has the rest)")
377
+
378
+
338
379
  def render_held_and_next(evidence):
339
380
  output = []
381
+ per_list = "heldTruncated" in evidence or "nextTruncated" in evidence
340
382
  held = evidence.get("held") or []
341
383
  if held:
342
384
  output.append("HELD WORK (blocked; this is not next):")
343
- for row in held:
344
- output.append(f"- {row.get('qitemId') or 'a row'} — {row.get('summary') or 'no summary'} — "
345
- f"blocked on {row.get('blockedOn') or 'unknown'} — "
346
- f"continuation: {row.get('continuation') or 'none recorded'}")
385
+ for row in held[:HELD_SHOWN]:
386
+ (summary, blocked_on, continuation), pointer = row_fields(
387
+ row, ("summary", "no summary"), ("blockedOn", "unknown"), ("continuation", "none recorded"))
388
+ output.append(f"- {row.get('qitemId') or 'a row'} — {summary} — blocked on {blocked_on} — "
389
+ f"continuation: {continuation}{pointer}")
347
390
  following = evidence.get("next") or []
348
391
  if following:
349
392
  output.append("POSSIBLE NEXT WORK (pending; no order implied):")
350
- for row in following:
393
+ for row in following[:NEXT_SHOWN]:
351
394
  missions = ", ".join(row.get("missions") or [])
352
- output.append(f"- {row.get('qitemId') or 'a row'} — {row.get('summary') or 'no summary'}"
353
- + (f" [mission: {missions}]" if missions else ""))
354
- if "heldTruncated" in evidence or "nextTruncated" in evidence:
355
- if evidence.get("heldTruncated"):
356
- output.append("(the held list was cut; `rig queue list --owned --state blocked` has the rest)")
357
- if evidence.get("nextTruncated"):
358
- output.append("(the next list was cut; `rig queue list --owned --state pending` has the rest)")
359
- elif evidence.get("heldAndNextTruncated"):
395
+ (summary,), pointer = row_fields(row, ("summary", "no summary"))
396
+ output.append(f"- {row.get('qitemId') or 'a row'} — {summary}"
397
+ + (f" [mission: {missions}]" if missions else "") + pointer)
398
+ notices = [
399
+ cut_notice("held", "blocked", held, HELD_SHOWN, per_list and bool(evidence.get("heldTruncated"))),
400
+ cut_notice("next", "pending", following, NEXT_SHOWN, per_list and bool(evidence.get("nextTruncated"))),
401
+ ]
402
+ output.extend(notice for notice in notices if notice)
403
+ if not per_list and evidence.get("heldAndNextTruncated"):
360
404
  output.append("(held and next lists were cut; `rig queue list` has the rest)")
361
405
  return "\n".join(output)
362
406
 
@@ -390,8 +434,9 @@ def render_candidates(evidence, root, depth, failures):
390
434
  output.extend(candidate_line(candidate) for candidate in candidates)
391
435
  if unknown:
392
436
  output.append("In-progress rows the queue cannot place:")
393
- output.extend(f"- {row.get('qitemId') or 'a row'} — {row.get('summary') or 'no summary'}: {row.get('reason')}"
394
- for row in unknown)
437
+ for row in unknown:
438
+ (summary,), pointer = row_fields(row, ("summary", "no summary"))
439
+ output.append(f"- {row.get('qitemId') or 'a row'} — {summary}: {row.get('reason')}{pointer}")
395
440
  if not candidates:
396
441
  names = evidence.get("missionsOnHost") or []
397
442
  if names:
@@ -15,9 +15,13 @@ building it yourself.
15
15
 
16
16
  Tell the person what you're about to run and why before you run it. Don't install system packages or change their
17
17
  machine without a yes. Starting OpenRig and a team writes files: Codex hooks and settings in
18
- `~/.codex/config.toml`, a discovery skill in `~/.claude/skills` and `~/.agents/skills`, and, in the repository, managed
19
- guidance in `AGENTS.md` or `CLAUDE.md` plus the team's skills and plugins. Say so before you start OpenRig
20
- ([the full list](https://github.com/mvschwarz/openrig#what-openrig-changes-on-your-machine)).
18
+ `~/.codex/config.toml`, Claude Code workspace trust in `~/.claude.json`, discovery skills in `~/.claude/skills` and
19
+ `~/.agents/skills`, and, in the repository, managed guidance in `AGENTS.md` or `CLAUDE.md`, activity hooks in
20
+ `.claude/settings.local.json` and a status line there unless the project already has its own, plus the team's skills
21
+ and plugins. Unless a permission policy, a per-seat choice or (for Codex) a named profile applies, the kernel's own
22
+ seats run with an operational default: Codex with `-s danger-full-access -a never`, and Claude Code with its file
23
+ tools, web fetches and operational commands, including reads under the home folder, allowed without asking. Say so
24
+ before you start OpenRig ([the full list](https://github.com/mvschwarz/openrig#what-openrig-changes-on-your-machine)).
21
25
 
22
26
  ## 1. Install OpenRig, if it isn't installed
23
27
 
@@ -178,4 +182,4 @@ offer, so the person sees the real file, not a placeholder:
178
182
  - **Everything in the library:** `rig context list`.
179
183
  - **Exact syntax:** `rig <command> --help` is always current for the installed version.
180
184
 
181
- Written for OpenRig 0.6.7. When something here and `--help` disagree, `--help` wins.
185
+ When something here and `rig <command> --help` disagree, `--help` wins.
@@ -1,6 +1,6 @@
1
1
  # Agent help: the single troubleshooting and escalation guide (docs/reference/help.md).
2
2
  name: help
3
- version: "0.6.12"
3
+ version: "0.6.13"
4
4
  taxonomy: world
5
5
  purpose: "What an agent does when its user says OpenRig isn't working: diagnose, fix within permissions, verify, and escalate to OpenRig support."
6
6
  files:
@@ -1,6 +1,6 @@
1
1
  # Public capability and source-map width for the default onboarding walk.
2
2
  name: onboarding-width
3
- version: "0.6.12"
3
+ version: "0.6.13"
4
4
  taxonomy: world
5
5
  purpose: "The public capability map and source map referenced by the default onboarding walk."
6
6
  files:
@@ -11,7 +11,7 @@ not know exists.** So the point of what follows is not skill. It is recognition:
11
11
  lands, something rhymes, and you go check instead of building.
12
12
 
13
13
  Eighty-eight top-level verbs ship (capability canon refreshed through
14
- `capability-delta-v0.6.12`). This marker describes the pack's teaching, not publication or live
14
+ `capability-delta-v0.6.13`). This marker describes the pack's teaching, not publication or live
15
15
  adoption. Read this once for shape, and let it make you suspicious that a thing already exists.
16
16
  Model-divergence proclamations are live product (trust them; pins use canonical
17
17
  model IDs).
@@ -32,6 +32,11 @@ one command away. Your memory of the fleet is a claim about the past.
32
32
  filters to running and **hides detached, exited and attention states** — which are exactly the
33
33
  cells you were scanning for. A seat whose tmux session is confirmed gone reads `detached`
34
34
  (activity reason `session_missing`), and `rig ps --nodes` says to restore or relaunch it.
35
+ `rig ps --nodes` also shows the model each seat was last seen using (`modelObservation`, with its
36
+ source and time), or unknown; it never shows the configured model in its place. A Claude seat at
37
+ Claude Code's MCP-server approval menu reads as needing input (`mcp_gate`), a Codex seat at its
38
+ folder-trust panel reads `trust_gate`, and an OMP seat whose turn ended with a typed transient
39
+ provider failure reads idle and takes an ordinary retry.
35
40
  **`rig ps --resources`** shows this host's load and transcript capture cost.
36
41
  - **`rig ps --all-hosts --nodes -A`** — the same across every registered machine. Rollup-only
37
42
  unless you ask for nodes.
@@ -74,7 +79,7 @@ one command away. Your memory of the fleet is a claim about the past.
74
79
  - **`rig roster list` / `show` / `find`** — who across your rigs and hosts is recommended for a
75
80
  kind of work, from JSON rosters in `<workspace.root>/rosters`. Read-only: it dispatches nothing
76
81
  and does not claim anyone is available. The built-in starter and factory leads publish their
77
- team's roster at first start.
82
+ team's roster at first start. `show` and `find` include each seat's last observed model.
78
83
  - **`rig telemetry events` / `transitions` / `tenures <node-id>`** — past events, queue
79
84
  transitions and a seat's occupants, one bounded page at a time with gaps reported. Reach for it
80
85
  before querying the database yourself.
@@ -98,7 +103,9 @@ unseen — which makes messages the one delivery channel that never gets skipped
98
103
  that seat aren't held behind it; N is a deadline from the start of the wait.
99
104
  Over `--host` to an http-registered host, a send that may have reached the remote reads
100
105
  `remote-outcome-unknown` ("Delivery UNCONFIRMED"): check the target with `rig capture <session>
101
- --host <id>` before any resend. Only a host that was never reached reads as unreachable.
106
+ --host <id>` before any resend. Only a host that was never reached reads as unreachable. A send
107
+ whose caller goes away (Ctrl-C, or its own timeout) before input starts is refused with
108
+ `caller_cancelled` and never types later.
102
109
  - **`rig send --raw`** — send exact text or keystrokes without the From/To envelope;
103
110
  the interactive-prompt guard still applies. To deliberately drive an interactive prompt,
104
111
  **`--dangerously-interact --reason "<why>"`** is the explicit override and implies raw text.
@@ -116,7 +123,9 @@ unseen — which makes messages the one delivery channel that never gets skipped
116
123
  every seat in one call. `--lines N` is the last N lines (stderr says how many earlier lines were
117
124
  cut); `--history-plus-pane` gives the older N history lines plus the whole pane. A short capture
118
125
  doesn't prove a seat is idle: a capture that cut lines says activity is unknown (`activity:
119
- "unknown"` in `--json`), so read `rig ps --nodes` for it.
126
+ "unknown"` in `--json`), so read `rig ps --nodes` for it. For a Claude Code or Codex seat, stderr
127
+ notes whether the input box's text looks typed or like a faint harness suggestion (`inputBox` in
128
+ `--json`); it's a heuristic, and `unknown` means unknown.
120
129
  - **`rig transcript <seat>`** — what has been *said* in a seat, and **seat-scoped rather than
121
130
  session-scoped**: one file spanning every agent generation that has occupied it, so it reaches
122
131
  back through handovers. Capped (`transcripts.lines`, default 1000 — raise it for depth), and
@@ -170,7 +179,10 @@ unseen — which makes messages the one delivery channel that never gets skipped
170
179
  - **`rig slack`** — inspect and manage one connector implementation. Use registered-human
171
180
  readiness for the delivery decision and `queue create --verify` for its receipt; connector
172
181
  setup or verification is not an outbound human message. After a connection gap the daemon
173
- catches up on missed channel messages and marks them late; `rig slack status` shows the
182
+ catches up on missed messages in the channels this machine owns (its default channel, its
183
+ channel map's, and on a relayed machine each channel the hub has relayed to it) and on replies
184
+ in tracked threads whose root or close is within seven days; recovered replies are marked late
185
+ and never answer a decision. `rig slack status` shows the
174
186
  connection, the catch-up state, and the count of retained retry records for inbound messages,
175
187
  reactions and click answers (kept across restarts, not a distinct-message count). A retained alert whose row closed before its retry isn't
176
188
  posted; the row says why. Its `Delivery:` line says whether events are confirmed arriving;
@@ -389,7 +401,8 @@ not have to tear one down to change it, and you rarely have to start from nothin
389
401
  - **`rig up <source>`** — make a whole rig exist and run: from a spec you wrote, a shipped starter
390
402
  by name, a bundle someone handed you, a GitHub folder link (pinned to one commit), or a stopped
391
403
  rig. `rig up` with a pod-aware spec on a stopped team's name replaces that team (the earlier one
392
- is archived), so check `rig ps --nodes` first. Launch-created `AGENTS.md` or `CLAUDE` files now show in `git status`.
404
+ is archived), so check `rig ps --nodes` first. A rig name containing a dot is refused before
405
+ launch, because tmux would rename its sessions. Launch-created `AGENTS.md` or `CLAUDE` files now show in `git status`.
393
406
  `rig up <rig> --existing` puts back the OpenRig guidance blocks `rig down` removed before a
394
407
  resumed seat starts. A seat still missing one makes the rig `partially_restored` (its node lists
395
408
  `guidanceGaps`) and `rig up` exits 1. A seat that wasn't running at the snapshot, but whose
@@ -426,8 +439,13 @@ not have to tear one down to change it, and you rarely have to start from nothin
426
439
  <account>` reports `moved` only when a tool turn has completed in the same conversation since
427
440
  the restart and Codex's status names that account. Linux only: on macOS a
428
441
  request that reaches the running-process check refuses before stopping the seat.
442
+ An adopted seat (one OpenRig didn't launch) refuses with `claimed_session`. "A conversation it
443
+ can prove" means the stored conversation matches the one the running Codex's command line names
444
+ (or, when it names none, the only one Codex has logged since it started); OpenRig can't tell
445
+ which conversation Codex is on now. If the conversation was changed inside the running Codex,
446
+ the restart may refuse or resume the earlier one, so look at the pane (`rig capture <seat>`) first.
429
447
  - **`rig add`** / **`rig expand`** — graft one more member, or a whole new pod, onto a rig that is
430
- already running. `rig add` takes the rig's name or ID; a name two active rigs share is refused
448
+ already running. `rig add`, `rig grow` and `rig remove` take the rig's name or ID; a name two active rigs share is refused
431
449
  with `rig_ambiguous` and the candidates. `rig grow --new-pod` and `rig expand` are one ingress; choose by input shape.
432
450
  - **`rig remove`** / **`rig shrink`** — take a seat, or an entire pod, out of a running topology.
433
451
  If it holds active work, pass `--fallback <live-seat>` to reroute before mutation; without a
@@ -543,6 +561,16 @@ version, from checking the environment to a useful report to the OpenRig team.
543
561
  Effective-model detection follows the identity-verified current occupant, not a retained
544
562
  predecessor; a `<synthetic>` transcript record is skipped, so a PENDING model check is not a
545
563
  divergence.
564
+ - **`rig seat set-cwd <seat> --cwd <absolute-path> --reason <text>`** — save an existing seat's
565
+ launch directory, audited, for its next fresh launch or rebuild handover. Its node, address, queue
566
+ and history stay intact. It creates the folder (on the daemon's host) and writes nothing else there: launch writes the
567
+ startup files, as today. Its preflight policy refuses, naming the paths, when the new directory
568
+ holds an edited, unrecorded-and-different or doubly sourced copy that launch would place. The
569
+ running process keeps its directory: adopt the new one with `rig seat launch <seat> --fresh
570
+ --stop --reason <text>` or a rebuild handover, promptly (background work, such as a Claude seat's
571
+ managed compaction, can use the saved directory before then; that's guidance, not a guard), and
572
+ before any `rig down`/`rig up` or fork handover. In-place Codex restart isn't adoption. `rig seat status` shows the
573
+ saved `launch_cwd`. Old-directory files are left.
546
574
  - **`rig seat set-permissions <seat> --mode <mode> --reason <text>`** — select one seat's native
547
575
  permission mode for its future managed launches; it relaunches nothing, and `inherit` clears the
548
576
  selection. `rig seat status` reports the selection, but a status read does not prove the
@@ -551,7 +579,7 @@ version, from checking the environment to a useful report to the OpenRig team.
551
579
  reasoning effort for its next launch, restore, handover or in-place Codex restart without
552
580
  touching its spec or its peers; nothing restarts. **`rig seat effort <seat>`** reports what was
553
581
  requested, what's saved, what the running process was launched with and what the session
554
- recorded (NOT VERIFIED until the seat takes a turn).
582
+ recorded (NOT VERIFIED until the seat takes a turn). It works for Pi seats too, sent as `--thinking`.
555
583
  - **`rig seat set-typing-guard <seat> --mode off|draft-aware|hold --reason <text>`** — choose
556
584
  ordinary automatic delivery, immediate retention when input is busy/unreadable, or holding all automatic
557
585
  input. `--enabled true|false` remains compatible: true selects hold, false selects off.
@@ -572,6 +600,8 @@ version, from checking the environment to a useful report to the OpenRig team.
572
600
  `submitted, unconfirmed` (it reached the seat, not proof compaction ran), `uncertain` (not
573
601
  replayed) or `not sent`, so confirm by effect. Claude seats that select `openrig-core` load its
574
602
  hooks; a seat can give a slow refocus more time with `OPENRIG_REFOCUS_BUDGET_MS` (4500 to 52000).
603
+ The refocus work packet stays off by default for Claude Code and Codex;
604
+ `OPENRIG_REFOCUS_WORK_PACKET=1` turns it on, with each field bounded.
575
605
  - **Know what compaction costs before you reach for it.** On some runtimes what comes back has
576
606
  enough context left to believe it knows everything and not enough to actually know anything — and
577
607
  **the compacted agent is the only one who knows it happened**, while every other seat keeps
@@ -848,9 +878,9 @@ your circumstances is configuration, and the ones that are not, another agent ca
848
878
  permission policy: an explicit flag wins over it, and it wins over the operator default
849
879
  `launch.non_interruptive`. The before-install view shows it as
850
880
  `posture[].nonInterruptiveDefault`.
851
- - **Smaller settings worth knowing:** per-seat `effort`, passed to Claude as `--effort` and to
852
- Codex as `model_reasoning_effort` (`rig seat set-effort` overrides it for one seat); and
853
- `runtime.readiness_timeout_seconds` for seats that start slowly.
881
+ - **Smaller settings worth knowing:** per-seat `effort`, passed to Claude as `--effort`, to
882
+ Codex as `model_reasoning_effort` and to Pi as `--thinking` (`rig seat set-effort` overrides it for
883
+ one seat); and `runtime.readiness_timeout_seconds` for seats that start slowly.
854
884
  - **`rig policy cite` / `defaults`** — what posture the operator is in: how autonomous to be, how
855
885
  loudly to report, whether to batch permission questions or block on them. **This declares a
856
886
  posture; it does not grant or deny permissions** — the harness's own settings are the control
@@ -879,7 +909,12 @@ your circumstances is configuration, and the ones that are not, another agent ca
879
909
  windows, listed once per allowance and never added up; `--refresh` (optionally `--provider
880
910
  codex|claude`) reads the logins now. A Claude account's current availability reads `unknown`,
881
911
  because nothing links a seat's reading to the login it used: read each window as that seat's
882
- reading, and don't tell a person an account has room from it. With `provider.subscription_moves`
912
+ reading, and don't tell a person an account has room from it. Each account row also carries a
913
+ sign-in fact (`usable`, `needs sign-in` or `unknown`); a signed-in Claude login never reads
914
+ better than `unknown`. A Codex account's last reading, its reset and its last observed exhaustion
915
+ survive a daemon restart as history (`retained: "before_restart"`), never a current reading; a
916
+ window whose reset has passed shows an `expectation`, which is planning, not a reading. Run `rig provider status --refresh`
917
+ before telling anyone an account has room. With `provider.subscription_moves`
883
918
  on (off by default), `rig provider moves` records and lists moves of a Codex home's seats between
884
919
  subscriptions.
885
920
  - **Codex configuration fragments** — a `codex_config_fragment` must open with a table header and
@@ -893,6 +928,19 @@ your circumstances is configuration, and the ones that are not, another agent ca
893
928
  `both` sets which harnesses it installs and checks; one not chosen reads `skipped`, never failed.
894
929
  - **`rig usage series`** — what a seat's token curve has looked like over time: climbing steadily,
895
930
  reset, or stopped reporting entirely. The last one is a signal, not a gap.
931
+ - **`rig usage top`** — which of this machine's seats used the most tokens over a window (`--window
932
+ 90m`, `1h`, `2d`; `--top <n>` caps the list). Each ranked seat shows its token delta and samples;
933
+ a seat that has reported usage before but has no usable samples in the window is listed as
934
+ unknown with its reason, never as zero.
935
+ To compare machines, run it on each machine, or against each machine's daemon with
936
+ `OPENRIG_URL=<that daemon's URL>`, back to back, with the same `--window`, no `--top`, and `--json`.
937
+ Show the results side by side in tokens. For each machine, give its host, the window and its
938
+ `sinceIso` (each daemon counts from its own clock), how many seats were ranked and over what span,
939
+ the unknown seats and their reasons, and each seat's runtime, declared `model` and last observed
940
+ model (`modelObservation`: model, source, time) from `rig ps --nodes -A --json` on that machine.
941
+ A seat that has never reported usage is in neither list: name each seat that `rig ps --nodes -A
942
+ --json` shows and `rig usage top` doesn't as not covered. Don't add machines into one total unless
943
+ they cover the same seats over the same span; where coverage differs, say so instead.
896
944
  - **`rig usage cost [--seat <session>]`** — what each seat's harness reports it costs, beside its
897
945
  tokens: Claude's own client-side estimate (not an invoice) and Codex's tokens with a note that it
898
946
  reports no cost. A missing figure reads missing, never $0, and no setting gates it. With