@openrig/cli 0.6.12 → 0.6.14

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 (494) hide show
  1. package/README.md +69 -14
  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/openrig-user/SKILL.md +11 -3
  9. package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +73 -48
  10. package/daemon/assets/skills/rigs/SKILL.md +8 -4
  11. package/daemon/context-packs/help/manifest.yaml +1 -1
  12. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  13. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +76 -16
  14. package/daemon/context-packs/reference/getting-started.md +135 -28
  15. package/daemon/context-packs/reference/manifest.yaml +1 -1
  16. package/daemon/context-packs/reference/rig-spec.md +5 -5
  17. package/daemon/context-packs/reference/whats-new.md +65 -167
  18. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
  19. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
  20. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
  21. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  22. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  23. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  24. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  25. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  26. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
  27. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  30. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  31. package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
  32. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  34. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  42. package/daemon/context-packs/skills/mission-slice-sop/SKILL.md +5 -0
  43. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/openrig-user/SKILL.md +11 -3
  46. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  54. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  55. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  63. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  64. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  65. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  66. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  67. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  68. package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +73 -48
  69. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  70. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  71. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  72. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
  73. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  74. package/daemon/context-packs/world-public/manifest.yaml +1 -1
  75. package/daemon/dist/adapters/claude-code-adapter.d.ts +9 -1
  76. package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
  77. package/daemon/dist/adapters/claude-code-adapter.js +110 -52
  78. package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
  79. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  80. package/daemon/dist/adapters/codex-runtime-adapter.js +47 -6
  81. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  82. package/daemon/dist/adapters/pi-resume.d.ts +1 -1
  83. package/daemon/dist/adapters/pi-resume.d.ts.map +1 -1
  84. package/daemon/dist/adapters/pi-resume.js +4 -1
  85. package/daemon/dist/adapters/pi-resume.js.map +1 -1
  86. package/daemon/dist/adapters/pi-runner-protocol.d.ts +9 -0
  87. package/daemon/dist/adapters/pi-runner-protocol.d.ts.map +1 -1
  88. package/daemon/dist/adapters/pi-runner-protocol.js +16 -0
  89. package/daemon/dist/adapters/pi-runner-protocol.js.map +1 -1
  90. package/daemon/dist/adapters/pi-runner.d.ts +5 -2
  91. package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
  92. package/daemon/dist/adapters/pi-runner.js +72 -15
  93. package/daemon/dist/adapters/pi-runner.js.map +1 -1
  94. package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -1
  95. package/daemon/dist/adapters/pi-runtime-adapter.js +2 -0
  96. package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
  97. package/daemon/dist/adapters/stub-compaction.d.ts +1 -0
  98. package/daemon/dist/adapters/stub-compaction.d.ts.map +1 -1
  99. package/daemon/dist/adapters/stub-compaction.js +2 -0
  100. package/daemon/dist/adapters/stub-compaction.js.map +1 -1
  101. package/daemon/dist/adapters/stub-refocus.d.ts +6 -0
  102. package/daemon/dist/adapters/stub-refocus.d.ts.map +1 -0
  103. package/daemon/dist/adapters/stub-refocus.js +22 -0
  104. package/daemon/dist/adapters/stub-refocus.js.map +1 -0
  105. package/daemon/dist/adapters/stub-runner.d.ts +6 -0
  106. package/daemon/dist/adapters/stub-runner.d.ts.map +1 -1
  107. package/daemon/dist/adapters/stub-runner.js +18 -1
  108. package/daemon/dist/adapters/stub-runner.js.map +1 -1
  109. package/daemon/dist/adapters/stub-script.d.ts +2 -2
  110. package/daemon/dist/adapters/stub-script.d.ts.map +1 -1
  111. package/daemon/dist/adapters/stub-script.js +2 -2
  112. package/daemon/dist/adapters/stub-script.js.map +1 -1
  113. package/daemon/dist/adapters/tmux.js +1 -1
  114. package/daemon/dist/adapters/tmux.js.map +1 -1
  115. package/daemon/dist/build-info.js +3 -3
  116. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  117. package/daemon/dist/db/all-migrations.js +2 -0
  118. package/daemon/dist/db/all-migrations.js.map +1 -1
  119. package/daemon/dist/db/migrations/117_provider_account_readings.d.ts +3 -0
  120. package/daemon/dist/db/migrations/117_provider_account_readings.d.ts.map +1 -0
  121. package/daemon/dist/db/migrations/117_provider_account_readings.js +32 -0
  122. package/daemon/dist/db/migrations/117_provider_account_readings.js.map +1 -0
  123. package/daemon/dist/domain/claim-service.d.ts +9 -18
  124. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  125. package/daemon/dist/domain/claim-service.js +83 -0
  126. package/daemon/dist/domain/claim-service.js.map +1 -1
  127. package/daemon/dist/domain/claude-activity-hooks.d.ts +6 -0
  128. package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -1
  129. package/daemon/dist/domain/claude-activity-hooks.js +19 -1
  130. package/daemon/dist/domain/claude-activity-hooks.js.map +1 -1
  131. package/daemon/dist/domain/claude-compaction-enforcer.d.ts +2 -2
  132. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  133. package/daemon/dist/domain/claude-compaction-enforcer.js +20 -14
  134. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  135. package/daemon/dist/domain/claude-core-plugin-env.d.ts +2 -0
  136. package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
  137. package/daemon/dist/domain/claude-core-plugin-env.js +6 -2
  138. package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
  139. package/daemon/dist/domain/claude-managed-launch.d.ts +5 -0
  140. package/daemon/dist/domain/claude-managed-launch.d.ts.map +1 -1
  141. package/daemon/dist/domain/claude-managed-launch.js +48 -7
  142. package/daemon/dist/domain/claude-managed-launch.js.map +1 -1
  143. package/daemon/dist/domain/claude-mcp-menu.d.ts +5 -0
  144. package/daemon/dist/domain/claude-mcp-menu.d.ts.map +1 -0
  145. package/daemon/dist/domain/claude-mcp-menu.js +25 -0
  146. package/daemon/dist/domain/claude-mcp-menu.js.map +1 -0
  147. package/daemon/dist/domain/fresh-occupant-relation.d.ts +7 -0
  148. package/daemon/dist/domain/fresh-occupant-relation.d.ts.map +1 -1
  149. package/daemon/dist/domain/fresh-occupant-relation.js +45 -0
  150. package/daemon/dist/domain/fresh-occupant-relation.js.map +1 -1
  151. package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts +14 -2
  152. package/daemon/dist/domain/gateway/slack/channel-recovery.d.ts.map +1 -1
  153. package/daemon/dist/domain/gateway/slack/channel-recovery.js +128 -89
  154. package/daemon/dist/domain/gateway/slack/channel-recovery.js.map +1 -1
  155. package/daemon/dist/domain/gateway/slack/inbound.d.ts +4 -0
  156. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  157. package/daemon/dist/domain/gateway/slack/inbound.js +5 -3
  158. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  159. package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts +24 -0
  160. package/daemon/dist/domain/gateway/slack/recovery-budget.d.ts.map +1 -0
  161. package/daemon/dist/domain/gateway/slack/recovery-budget.js +18 -0
  162. package/daemon/dist/domain/gateway/slack/recovery-budget.js.map +1 -0
  163. package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts +104 -0
  164. package/daemon/dist/domain/gateway/slack/slack-recovery.d.ts.map +1 -0
  165. package/daemon/dist/domain/gateway/slack/slack-recovery.js +236 -0
  166. package/daemon/dist/domain/gateway/slack/slack-recovery.js.map +1 -0
  167. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  168. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +29 -6
  169. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  170. package/daemon/dist/domain/gateway/slack/state-store.d.ts +34 -0
  171. package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -1
  172. package/daemon/dist/domain/gateway/slack/state-store.js +67 -0
  173. package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -1
  174. package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts +37 -0
  175. package/daemon/dist/domain/gateway/slack/thread-recovery.d.ts.map +1 -0
  176. package/daemon/dist/domain/gateway/slack/thread-recovery.js +173 -0
  177. package/daemon/dist/domain/gateway/slack/thread-recovery.js.map +1 -0
  178. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts +8 -0
  179. package/daemon/dist/domain/gateway/slack/thread-seat-map.d.ts.map +1 -1
  180. package/daemon/dist/domain/gateway/slack/thread-seat-map.js +11 -0
  181. package/daemon/dist/domain/gateway/slack/thread-seat-map.js.map +1 -1
  182. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts +6 -1
  183. package/daemon/dist/domain/model-divergence/current-generation-record.d.ts.map +1 -1
  184. package/daemon/dist/domain/model-divergence/current-generation-record.js +4 -1
  185. package/daemon/dist/domain/model-divergence/current-generation-record.js.map +1 -1
  186. package/daemon/dist/domain/model-divergence/current-model-reader.d.ts +74 -0
  187. package/daemon/dist/domain/model-divergence/current-model-reader.d.ts.map +1 -0
  188. package/daemon/dist/domain/model-divergence/current-model-reader.js +246 -0
  189. package/daemon/dist/domain/model-divergence/current-model-reader.js.map +1 -0
  190. package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts +18 -0
  191. package/daemon/dist/domain/model-divergence/effective-model-readers.d.ts.map +1 -1
  192. package/daemon/dist/domain/model-divergence/effective-model-readers.js +24 -8
  193. package/daemon/dist/domain/model-divergence/effective-model-readers.js.map +1 -1
  194. package/daemon/dist/domain/native-process-lineage.d.ts +8 -1
  195. package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
  196. package/daemon/dist/domain/native-process-lineage.js +40 -26
  197. package/daemon/dist/domain/native-process-lineage.js.map +1 -1
  198. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
  199. package/daemon/dist/domain/native-resume-probe.js +34 -8
  200. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  201. package/daemon/dist/domain/node-inventory.d.ts +1 -1
  202. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  203. package/daemon/dist/domain/node-inventory.js +84 -18
  204. package/daemon/dist/domain/node-inventory.js.map +1 -1
  205. package/daemon/dist/domain/process-census.d.ts +1 -1
  206. package/daemon/dist/domain/process-census.d.ts.map +1 -1
  207. package/daemon/dist/domain/process-table.d.ts +26 -0
  208. package/daemon/dist/domain/process-table.d.ts.map +1 -0
  209. package/daemon/dist/domain/process-table.js +185 -0
  210. package/daemon/dist/domain/process-table.js.map +1 -0
  211. package/daemon/dist/domain/profile-resolver.d.ts +8 -0
  212. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  213. package/daemon/dist/domain/profile-resolver.js +11 -0
  214. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  215. package/daemon/dist/domain/projection-planner.js +1 -1
  216. package/daemon/dist/domain/projection-planner.js.map +1 -1
  217. package/daemon/dist/domain/provider/claude-usage-windows.d.ts +3 -1
  218. package/daemon/dist/domain/provider/claude-usage-windows.d.ts.map +1 -1
  219. package/daemon/dist/domain/provider/claude-usage-windows.js +48 -3
  220. package/daemon/dist/domain/provider/claude-usage-windows.js.map +1 -1
  221. package/daemon/dist/domain/provider/codex-usage-reader.d.ts +4 -1
  222. package/daemon/dist/domain/provider/codex-usage-reader.d.ts.map +1 -1
  223. package/daemon/dist/domain/provider/codex-usage-reader.js +3 -0
  224. package/daemon/dist/domain/provider/codex-usage-reader.js.map +1 -1
  225. package/daemon/dist/domain/provider/codex-usage-windows.d.ts +3 -1
  226. package/daemon/dist/domain/provider/codex-usage-windows.d.ts.map +1 -1
  227. package/daemon/dist/domain/provider/codex-usage-windows.js +1 -0
  228. package/daemon/dist/domain/provider/codex-usage-windows.js.map +1 -1
  229. package/daemon/dist/domain/provider/provider-account-readings.d.ts +42 -0
  230. package/daemon/dist/domain/provider/provider-account-readings.d.ts.map +1 -0
  231. package/daemon/dist/domain/provider/provider-account-readings.js +132 -0
  232. package/daemon/dist/domain/provider/provider-account-readings.js.map +1 -0
  233. package/daemon/dist/domain/provider/provider-types.d.ts +29 -0
  234. package/daemon/dist/domain/provider/provider-types.d.ts.map +1 -1
  235. package/daemon/dist/domain/provider/usage-across-hosts.d.ts.map +1 -1
  236. package/daemon/dist/domain/provider/usage-across-hosts.js +6 -0
  237. package/daemon/dist/domain/provider/usage-across-hosts.js.map +1 -1
  238. package/daemon/dist/domain/provider/usage-windows.d.ts +25 -0
  239. package/daemon/dist/domain/provider/usage-windows.d.ts.map +1 -1
  240. package/daemon/dist/domain/provider/usage-windows.js +100 -4
  241. package/daemon/dist/domain/provider/usage-windows.js.map +1 -1
  242. package/daemon/dist/domain/queue-repository.d.ts +23 -0
  243. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  244. package/daemon/dist/domain/queue-repository.js +59 -1
  245. package/daemon/dist/domain/queue-repository.js.map +1 -1
  246. package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
  247. package/daemon/dist/domain/queue-stuck-sweep.js +47 -4
  248. package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
  249. package/daemon/dist/domain/restore-check-service.d.ts +10 -0
  250. package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
  251. package/daemon/dist/domain/restore-check-service.js +73 -10
  252. package/daemon/dist/domain/restore-check-service.js.map +1 -1
  253. package/daemon/dist/domain/restore-guidance.d.ts +6 -0
  254. package/daemon/dist/domain/restore-guidance.d.ts.map +1 -1
  255. package/daemon/dist/domain/restore-guidance.js +21 -5
  256. package/daemon/dist/domain/restore-guidance.js.map +1 -1
  257. package/daemon/dist/domain/restore-orchestrator.js +1 -1
  258. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  259. package/daemon/dist/domain/resume-metadata-refresher.d.ts.map +1 -1
  260. package/daemon/dist/domain/resume-metadata-refresher.js +6 -29
  261. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  262. package/daemon/dist/domain/rig-repository.d.ts +3 -0
  263. package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
  264. package/daemon/dist/domain/rig-repository.js +6 -0
  265. package/daemon/dist/domain/rig-repository.js.map +1 -1
  266. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  267. package/daemon/dist/domain/rigspec-instantiator.js +4 -2
  268. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  269. package/daemon/dist/domain/rigspec-preflight.d.ts +4 -0
  270. package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
  271. package/daemon/dist/domain/rigspec-preflight.js +12 -2
  272. package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
  273. package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
  274. package/daemon/dist/domain/rigspec-schema.js +11 -0
  275. package/daemon/dist/domain/rigspec-schema.js.map +1 -1
  276. package/daemon/dist/domain/runtime-adapter.d.ts +13 -0
  277. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  278. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  279. package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  280. package/daemon/dist/domain/seat-attention-reconciler.js +15 -1
  281. package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  282. package/daemon/dist/domain/seat-cwd-preparation.d.ts +22 -0
  283. package/daemon/dist/domain/seat-cwd-preparation.d.ts.map +1 -0
  284. package/daemon/dist/domain/seat-cwd-preparation.js +107 -0
  285. package/daemon/dist/domain/seat-cwd-preparation.js.map +1 -0
  286. package/daemon/dist/domain/seat-effort.d.ts +4 -3
  287. package/daemon/dist/domain/seat-effort.d.ts.map +1 -1
  288. package/daemon/dist/domain/seat-effort.js +21 -3
  289. package/daemon/dist/domain/seat-effort.js.map +1 -1
  290. package/daemon/dist/domain/seat-lifecycle-service.d.ts +36 -2
  291. package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
  292. package/daemon/dist/domain/seat-lifecycle-service.js +206 -15
  293. package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
  294. package/daemon/dist/domain/seat-restart-in-place.d.ts +14 -0
  295. package/daemon/dist/domain/seat-restart-in-place.d.ts.map +1 -1
  296. package/daemon/dist/domain/seat-restart-in-place.js +59 -3
  297. package/daemon/dist/domain/seat-restart-in-place.js.map +1 -1
  298. package/daemon/dist/domain/seat-status-service.d.ts +2 -0
  299. package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
  300. package/daemon/dist/domain/seat-status-service.js +1 -0
  301. package/daemon/dist/domain/seat-status-service.js.map +1 -1
  302. package/daemon/dist/domain/seat-structural-activity-service.d.ts +7 -1
  303. package/daemon/dist/domain/seat-structural-activity-service.d.ts.map +1 -1
  304. package/daemon/dist/domain/seat-structural-activity-service.js +9 -3
  305. package/daemon/dist/domain/seat-structural-activity-service.js.map +1 -1
  306. package/daemon/dist/domain/session-name.d.ts +8 -0
  307. package/daemon/dist/domain/session-name.d.ts.map +1 -1
  308. package/daemon/dist/domain/session-name.js +12 -0
  309. package/daemon/dist/domain/session-name.js.map +1 -1
  310. package/daemon/dist/domain/session-transport.d.ts +78 -3
  311. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  312. package/daemon/dist/domain/session-transport.js +306 -15
  313. package/daemon/dist/domain/session-transport.js.map +1 -1
  314. package/daemon/dist/domain/successor-session-launcher.js +1 -1
  315. package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
  316. package/daemon/dist/domain/topology-converge.d.ts +1 -0
  317. package/daemon/dist/domain/topology-converge.d.ts.map +1 -1
  318. package/daemon/dist/domain/topology-converge.js +1 -0
  319. package/daemon/dist/domain/topology-converge.js.map +1 -1
  320. package/daemon/dist/domain/types.d.ts +14 -0
  321. package/daemon/dist/domain/types.d.ts.map +1 -1
  322. package/daemon/dist/domain/types.js.map +1 -1
  323. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  324. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  325. package/daemon/dist/domain/user-settings/settings-store.js +4 -0
  326. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  327. package/daemon/dist/domain/wake-resolve-service.d.ts +1 -0
  328. package/daemon/dist/domain/wake-resolve-service.d.ts.map +1 -1
  329. package/daemon/dist/domain/wake-resolve-service.js +10 -0
  330. package/daemon/dist/domain/wake-resolve-service.js.map +1 -1
  331. package/daemon/dist/domain/wake-resolver.d.ts.map +1 -1
  332. package/daemon/dist/domain/wake-resolver.js +7 -0
  333. package/daemon/dist/domain/wake-resolver.js.map +1 -1
  334. package/daemon/dist/domain/watchdog-delivery.d.ts +29 -0
  335. package/daemon/dist/domain/watchdog-delivery.d.ts.map +1 -0
  336. package/daemon/dist/domain/watchdog-delivery.js +113 -0
  337. package/daemon/dist/domain/watchdog-delivery.js.map +1 -0
  338. package/daemon/dist/domain/watchdog-policy-engine.d.ts +60 -1
  339. package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
  340. package/daemon/dist/domain/watchdog-policy-engine.js +154 -28
  341. package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
  342. package/daemon/dist/domain/watchdog-scheduler.d.ts.map +1 -1
  343. package/daemon/dist/domain/watchdog-scheduler.js +6 -1
  344. package/daemon/dist/domain/watchdog-scheduler.js.map +1 -1
  345. package/daemon/dist/domain/workflow-instance-store.d.ts.map +1 -1
  346. package/daemon/dist/domain/workflow-instance-store.js +6 -2
  347. package/daemon/dist/domain/workflow-instance-store.js.map +1 -1
  348. package/daemon/dist/routes/attention.d.ts.map +1 -1
  349. package/daemon/dist/routes/attention.js +41 -1
  350. package/daemon/dist/routes/attention.js.map +1 -1
  351. package/daemon/dist/routes/compaction.js +1 -1
  352. package/daemon/dist/routes/compaction.js.map +1 -1
  353. package/daemon/dist/routes/queue.d.ts.map +1 -1
  354. package/daemon/dist/routes/queue.js +3 -1
  355. package/daemon/dist/routes/queue.js.map +1 -1
  356. package/daemon/dist/routes/restore-check.d.ts.map +1 -1
  357. package/daemon/dist/routes/restore-check.js +19 -1
  358. package/daemon/dist/routes/restore-check.js.map +1 -1
  359. package/daemon/dist/routes/seat.d.ts.map +1 -1
  360. package/daemon/dist/routes/seat.js +15 -2
  361. package/daemon/dist/routes/seat.js.map +1 -1
  362. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  363. package/daemon/dist/routes/sessions.js +42 -1
  364. package/daemon/dist/routes/sessions.js.map +1 -1
  365. package/daemon/dist/routes/transport.d.ts.map +1 -1
  366. package/daemon/dist/routes/transport.js +13 -2
  367. package/daemon/dist/routes/transport.js.map +1 -1
  368. package/daemon/dist/server.d.ts +1 -0
  369. package/daemon/dist/server.d.ts.map +1 -1
  370. package/daemon/dist/server.js +7 -4
  371. package/daemon/dist/server.js.map +1 -1
  372. package/daemon/dist/startup.d.ts.map +1 -1
  373. package/daemon/dist/startup.js +41 -118
  374. package/daemon/dist/startup.js.map +1 -1
  375. package/daemon/docs/reference/agent-spec.md +1 -1
  376. package/daemon/docs/reference/agent-startup-guide.md +84 -0
  377. package/daemon/docs/reference/getting-started.md +135 -28
  378. package/daemon/docs/reference/publishing-a-rig-bundle.md +5 -2
  379. package/daemon/docs/reference/quickstart.md +187 -0
  380. package/daemon/docs/reference/refocus-channel.md +11 -1
  381. package/daemon/docs/reference/rig-spec.md +5 -5
  382. package/daemon/docs/reference/rosters.md +29 -2
  383. package/daemon/docs/reference/slack-app-setup.md +47 -17
  384. package/daemon/docs/reference/whats-new.md +65 -167
  385. package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -0
  386. package/daemon/specs/agents/conveyor/builder/agent.yaml +1 -0
  387. package/daemon/specs/agents/conveyor/lead/agent.yaml +1 -0
  388. package/daemon/specs/agents/conveyor/planner/agent.yaml +1 -0
  389. package/daemon/specs/agents/conveyor/reviewer/agent.yaml +1 -0
  390. package/daemon/specs/agents/design/product-designer/agent.yaml +1 -0
  391. package/daemon/specs/agents/development/implementer/agent.yaml +1 -0
  392. package/daemon/specs/agents/development/qa/agent.yaml +1 -0
  393. package/daemon/specs/agents/factory-rsi/dogfood/agent.yaml +1 -0
  394. package/daemon/specs/agents/factory-rsi/release-manager/agent.yaml +1 -0
  395. package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -0
  396. package/daemon/specs/agents/product-management/pm/agent.yaml +1 -0
  397. package/daemon/specs/agents/research/analyst/agent.yaml +1 -0
  398. package/daemon/specs/agents/research/synthesizer/agent.yaml +1 -0
  399. package/daemon/specs/agents/review/independent-reviewer/agent.yaml +1 -0
  400. package/dist/build-info.js +3 -3
  401. package/dist/client.d.ts +7 -1
  402. package/dist/client.d.ts.map +1 -1
  403. package/dist/client.js +28 -0
  404. package/dist/client.js.map +1 -1
  405. package/dist/commands/ask.d.ts.map +1 -1
  406. package/dist/commands/ask.js +13 -3
  407. package/dist/commands/ask.js.map +1 -1
  408. package/dist/commands/capture.d.ts.map +1 -1
  409. package/dist/commands/capture.js +14 -0
  410. package/dist/commands/capture.js.map +1 -1
  411. package/dist/commands/chatroom.d.ts.map +1 -1
  412. package/dist/commands/chatroom.js +1 -0
  413. package/dist/commands/chatroom.js.map +1 -1
  414. package/dist/commands/compact.d.ts.map +1 -1
  415. package/dist/commands/compact.js +5 -4
  416. package/dist/commands/compact.js.map +1 -1
  417. package/dist/commands/config.d.ts.map +1 -1
  418. package/dist/commands/config.js +4 -2
  419. package/dist/commands/config.js.map +1 -1
  420. package/dist/commands/doctor.d.ts +3 -0
  421. package/dist/commands/doctor.d.ts.map +1 -1
  422. package/dist/commands/doctor.js +47 -23
  423. package/dist/commands/doctor.js.map +1 -1
  424. package/dist/commands/grow.d.ts.map +1 -1
  425. package/dist/commands/grow.js +24 -7
  426. package/dist/commands/grow.js.map +1 -1
  427. package/dist/commands/provider.d.ts.map +1 -1
  428. package/dist/commands/provider.js +43 -7
  429. package/dist/commands/provider.js.map +1 -1
  430. package/dist/commands/ps.d.ts +2 -0
  431. package/dist/commands/ps.d.ts.map +1 -1
  432. package/dist/commands/ps.js +12 -1
  433. package/dist/commands/ps.js.map +1 -1
  434. package/dist/commands/reconcile-session.d.ts.map +1 -1
  435. package/dist/commands/reconcile-session.js +25 -4
  436. package/dist/commands/reconcile-session.js.map +1 -1
  437. package/dist/commands/remove.d.ts.map +1 -1
  438. package/dist/commands/remove.js +20 -1
  439. package/dist/commands/remove.js.map +1 -1
  440. package/dist/commands/roster.d.ts +2 -1
  441. package/dist/commands/roster.d.ts.map +1 -1
  442. package/dist/commands/roster.js +10 -5
  443. package/dist/commands/roster.js.map +1 -1
  444. package/dist/commands/scope.js +1 -1
  445. package/dist/commands/scope.js.map +1 -1
  446. package/dist/commands/seat.d.ts.map +1 -1
  447. package/dist/commands/seat.js +75 -8
  448. package/dist/commands/seat.js.map +1 -1
  449. package/dist/commands/slack.d.ts.map +1 -1
  450. package/dist/commands/slack.js +14 -1
  451. package/dist/commands/slack.js.map +1 -1
  452. package/dist/commands/ui.d.ts.map +1 -1
  453. package/dist/commands/ui.js +8 -1
  454. package/dist/commands/ui.js.map +1 -1
  455. package/dist/commands/usage.d.ts.map +1 -1
  456. package/dist/commands/usage.js +4 -3
  457. package/dist/commands/usage.js.map +1 -1
  458. package/dist/config-store.d.ts +2 -1
  459. package/dist/config-store.d.ts.map +1 -1
  460. package/dist/config-store.js +5 -0
  461. package/dist/config-store.js.map +1 -1
  462. package/dist/daemon-lifecycle.d.ts.map +1 -1
  463. package/dist/daemon-lifecycle.js +11 -3
  464. package/dist/daemon-lifecycle.js.map +1 -1
  465. package/dist/front-door.d.ts.map +1 -1
  466. package/dist/front-door.js +3 -1
  467. package/dist/front-door.js.map +1 -1
  468. package/dist/lib/model-observation.d.ts +13 -0
  469. package/dist/lib/model-observation.d.ts.map +1 -0
  470. package/dist/lib/model-observation.js +25 -0
  471. package/dist/lib/model-observation.js.map +1 -0
  472. package/dist/local-daemon-owner.d.ts +28 -0
  473. package/dist/local-daemon-owner.d.ts.map +1 -0
  474. package/dist/local-daemon-owner.js +98 -0
  475. package/dist/local-daemon-owner.js.map +1 -0
  476. package/dist/mcp-server.d.ts.map +1 -1
  477. package/dist/mcp-server.js +1 -0
  478. package/dist/mcp-server.js.map +1 -1
  479. package/package.json +1 -1
  480. package/tui/dist/attention/attention-model.js +6 -5
  481. package/tui/dist/attention/attention-model.js.map +1 -1
  482. package/tui/dist/attention/source-continuity.d.ts.map +1 -1
  483. package/tui/dist/attention/source-continuity.js +2 -0
  484. package/tui/dist/attention/source-continuity.js.map +1 -1
  485. package/tui/dist/terminals/open-window.d.ts +11 -1
  486. package/tui/dist/terminals/open-window.d.ts.map +1 -1
  487. package/tui/dist/terminals/open-window.js +47 -2
  488. package/tui/dist/terminals/open-window.js.map +1 -1
  489. package/tui/dist/usage/usage-model.d.ts +2 -0
  490. package/tui/dist/usage/usage-model.d.ts.map +1 -1
  491. package/tui/dist/usage/usage-model.js +38 -3
  492. package/tui/dist/usage/usage-model.js.map +1 -1
  493. package/ui/dist/assets/{index-Cfbtfd9G.js → index-CVgod3Pm.js} +1 -1
  494. package/ui/dist/index.html +1 -1
@@ -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.14`). 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
@@ -126,7 +135,8 @@ unseen — which makes messages the one delivery channel that never gets skipped
126
135
  read something, do not ask it. Look.**
127
136
  - **`rig ask`** — search what was said or decided, across *every generation that ever sat in a
128
137
  seat*. It reaches back past a handover that erased your predecessor's context, and costs no
129
- runtime tokens.
138
+ runtime tokens. `--wake` asks a Claude or Codex seat itself; any other runtime (Pi, custom, or
139
+ none recorded) is refused before a wake starts.
130
140
  - **`rig chatroom wait`** — block until a peer actually says something, instead of polling
131
141
  `capture` in a loop. Also `history`, `watch`, `topic` for a named thread that stays retrievable.
132
142
  Its `--timeout` is in seconds and ignores a suffix, so `2m` means 2 seconds. Poll timeouts,
@@ -170,7 +180,10 @@ unseen — which makes messages the one delivery channel that never gets skipped
170
180
  - **`rig slack`** — inspect and manage one connector implementation. Use registered-human
171
181
  readiness for the delivery decision and `queue create --verify` for its receipt; connector
172
182
  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
183
+ catches up on missed messages in the channels this machine owns (its default channel, its
184
+ channel map's, and on a relayed machine each channel the hub has relayed to it) and on replies
185
+ in tracked threads whose root or close is within seven days; recovered replies are marked late
186
+ and never answer a decision. `rig slack status` shows the
174
187
  connection, the catch-up state, and the count of retained retry records for inbound messages,
175
188
  reactions and click answers (kept across restarts, not a distinct-message count). A retained alert whose row closed before its retry isn't
176
189
  posted; the row says why. Its `Delivery:` line says whether events are confirmed arriving;
@@ -389,7 +402,8 @@ not have to tear one down to change it, and you rarely have to start from nothin
389
402
  - **`rig up <source>`** — make a whole rig exist and run: from a spec you wrote, a shipped starter
390
403
  by name, a bundle someone handed you, a GitHub folder link (pinned to one commit), or a stopped
391
404
  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`.
405
+ is archived), so check `rig ps --nodes` first. A rig name containing a dot is refused before
406
+ launch, because tmux would rename its sessions. Launch-created `AGENTS.md` or `CLAUDE` files now show in `git status`.
393
407
  `rig up <rig> --existing` puts back the OpenRig guidance blocks `rig down` removed before a
394
408
  resumed seat starts. A seat still missing one makes the rig `partially_restored` (its node lists
395
409
  `guidanceGaps`) and `rig up` exits 1. A seat that wasn't running at the snapshot, but whose
@@ -426,8 +440,13 @@ not have to tear one down to change it, and you rarely have to start from nothin
426
440
  <account>` reports `moved` only when a tool turn has completed in the same conversation since
427
441
  the restart and Codex's status names that account. Linux only: on macOS a
428
442
  request that reaches the running-process check refuses before stopping the seat.
443
+ An adopted seat (one OpenRig didn't launch) refuses with `claimed_session`. "A conversation it
444
+ can prove" means the stored conversation matches the one the running Codex's command line names
445
+ (or, when it names none, the only one Codex has logged since it started); OpenRig can't tell
446
+ which conversation Codex is on now. If the conversation was changed inside the running Codex,
447
+ the restart may refuse or resume the earlier one, so look at the pane (`rig capture <seat>`) first.
429
448
  - **`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
449
+ 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
450
  with `rig_ambiguous` and the candidates. `rig grow --new-pod` and `rig expand` are one ingress; choose by input shape.
432
451
  - **`rig remove`** / **`rig shrink`** — take a seat, or an entire pod, out of a running topology.
433
452
  If it holds active work, pass `--fallback <live-seat>` to reroute before mutation; without a
@@ -442,7 +461,12 @@ not have to tear one down to change it, and you rarely have to start from nothin
442
461
  to a node. **`rig adopt`** does the whole thing at once: create the structure and bind the
443
462
  running sessions into it.
444
463
  - **`rig reconcile-session`** — you resumed a seat by hand and the daemon still shows it down; make
445
- the system see the live process **without launching anything**.
464
+ the system see the live process **without launching anything**. A running seat that refuses every
465
+ send because its tmux pane was never recorded (one launched by an older OpenRig) takes
466
+ `rig reconcile-session <seat> --repair-missing-pane --no-launch`: it fills only the missing pane,
467
+ keeps the session and resume token, never adopts, and refuses while typing protection is on.
468
+ Plain reconcile adopts the seat into a new session without its resume token; use the repair even
469
+ where a protected seat's compaction refusal still suggests plain reconcile.
446
470
  - **`rig unclaim` / `rig release`** — stop managing one adopted session, or all of them,
447
471
  **without killing the process or the agent inside it**. Handing something back to its human is a
448
472
  first-class move, not an abandonment.
@@ -469,6 +493,7 @@ version, from checking the environment to a useful report to the OpenRig team.
469
493
  Stop distinguishes process/listener exit from a clean asynchronous drain: inspect the matching
470
494
  `daemon-shutdown.json` and log when completion is incomplete or unverified. No target is a
471
495
  distinct no-op, and a timeout never proves down. Use command help for exact limits and recovery.
496
+ `/healthz` reports the daemon's effective UID as `euid`, beside `pid`.
472
497
  - **`rig doctor`** — is the *installation* wired up correctly, or are you chasing a bug that is
473
498
  really a broken install. It checks Claude and Codex installs, and a login or configured provider
474
499
  credential, the way setup does; it fails for a harness the person doesn't use, which they can
@@ -543,6 +568,16 @@ version, from checking the environment to a useful report to the OpenRig team.
543
568
  Effective-model detection follows the identity-verified current occupant, not a retained
544
569
  predecessor; a `<synthetic>` transcript record is skipped, so a PENDING model check is not a
545
570
  divergence.
571
+ - **`rig seat set-cwd <seat> --cwd <absolute-path> --reason <text>`** — save an existing seat's
572
+ launch directory, audited, for its next fresh launch or rebuild handover. Its node, address, queue
573
+ and history stay intact. It creates the folder (on the daemon's host) and writes nothing else there: launch writes the
574
+ startup files, as today. Its preflight policy refuses, naming the paths, when the new directory
575
+ holds an edited, unrecorded-and-different or doubly sourced copy that launch would place. The
576
+ running process keeps its directory: adopt the new one with `rig seat launch <seat> --fresh
577
+ --stop --reason <text>` or a rebuild handover, promptly (background work, such as a Claude seat's
578
+ managed compaction, can use the saved directory before then; that's guidance, not a guard), and
579
+ before any `rig down`/`rig up` or fork handover. In-place Codex restart isn't adoption. `rig seat status` shows the
580
+ saved `launch_cwd`. Old-directory files are left.
546
581
  - **`rig seat set-permissions <seat> --mode <mode> --reason <text>`** — select one seat's native
547
582
  permission mode for its future managed launches; it relaunches nothing, and `inherit` clears the
548
583
  selection. `rig seat status` reports the selection, but a status read does not prove the
@@ -551,7 +586,7 @@ version, from checking the environment to a useful report to the OpenRig team.
551
586
  reasoning effort for its next launch, restore, handover or in-place Codex restart without
552
587
  touching its spec or its peers; nothing restarts. **`rig seat effort <seat>`** reports what was
553
588
  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).
589
+ recorded (NOT VERIFIED until the seat takes a turn). It works for Pi seats too, sent as `--thinking`.
555
590
  - **`rig seat set-typing-guard <seat> --mode off|draft-aware|hold --reason <text>`** — choose
556
591
  ordinary automatic delivery, immediate retention when input is busy/unreadable, or holding all automatic
557
592
  input. `--enabled true|false` remains compatible: true selects hold, false selects off.
@@ -562,7 +597,9 @@ version, from checking the environment to a useful report to the OpenRig team.
562
597
  - **`rig compact-plan`** → **`rig compact`** — who is near the context wall, then act on it.
563
598
  **Ordering matters: running `compact` without the plan is guessing which seat needed it.**
564
599
  Managed compaction waits for the seat's restore map before compacting; `rig compact --state`,
565
- `--cancel` and `--skip-map` inspect, stop or skip that wait. The `claude-compaction-restore`
600
+ `--cancel` and `--skip-map` inspect, stop or skip that wait. If preparation stops at an ordinary
601
+ approval, a manual `rig compact` keeps waiting for someone to answer it, within its 180-second
602
+ budget; OpenRig never answers it, and the request times out after 240 seconds. The `claude-compaction-restore`
566
603
  skill covers writing and reading the map; `claude-compact-in-place` no longer ships. After a
567
604
  managed compaction, refocus waits for the restore request, which names the `refocusing` skill
568
605
  (the daemon installs it globally); three failed refocus attempts in a row for one occupant post
@@ -572,6 +609,8 @@ version, from checking the environment to a useful report to the OpenRig team.
572
609
  `submitted, unconfirmed` (it reached the seat, not proof compaction ran), `uncertain` (not
573
610
  replayed) or `not sent`, so confirm by effect. Claude seats that select `openrig-core` load its
574
611
  hooks; a seat can give a slow refocus more time with `OPENRIG_REFOCUS_BUDGET_MS` (4500 to 52000).
612
+ The refocus work packet stays off by default for Claude Code and Codex;
613
+ `OPENRIG_REFOCUS_WORK_PACKET=1` turns it on, with each field bounded.
575
614
  - **Know what compaction costs before you reach for it.** On some runtimes what comes back has
576
615
  enough context left to believe it knows everything and not enough to actually know anything — and
577
616
  **the compacted agent is the only one who knows it happened**, while every other seat keeps
@@ -810,7 +849,10 @@ your circumstances is configuration, and the ones that are not, another agent ca
810
849
  - **`rig config get` / `reset` / `init-workspace`** — read one value, change a system-wide setting
811
850
  and put it back exactly as it was, or additively lay down the canonical project scaffold on a
812
851
  box that has none. Instance startup uses the same additive initializer for the surrounding
813
- `state`, `context`, `skills`, `topology`, and operational roots.
852
+ `state`, `context`, `skills`, `topology`, and operational roots. With `transport.local_user_guard`
853
+ on (off by default; `rig config set transport.local_user_guard true`), a Mac's local `rig` requests
854
+ stop only when the daemon's reported, `ps`-corroborated user differs from yours; unknown evidence
855
+ lets the call through. It isn't authentication or isolation.
814
856
  - **`rig policy permissions list` / `show` / `current` / `apply`** — what permission policy is
815
857
  actually in effect: discovers custom policy specs, validates refs (malformed can never read as
816
858
  valid OR absent), shows what would apply. The older `rig policy list|show|current|apply` forms
@@ -848,9 +890,9 @@ your circumstances is configuration, and the ones that are not, another agent ca
848
890
  permission policy: an explicit flag wins over it, and it wins over the operator default
849
891
  `launch.non_interruptive`. The before-install view shows it as
850
892
  `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.
893
+ - **Smaller settings worth knowing:** per-seat `effort`, passed to Claude as `--effort`, to
894
+ Codex as `model_reasoning_effort` and to Pi as `--thinking` (`rig seat set-effort` overrides it for
895
+ one seat); and `runtime.readiness_timeout_seconds` for seats that start slowly.
854
896
  - **`rig policy cite` / `defaults`** — what posture the operator is in: how autonomous to be, how
855
897
  loudly to report, whether to batch permission questions or block on them. **This declares a
856
898
  posture; it does not grant or deny permissions** — the harness's own settings are the control
@@ -879,7 +921,12 @@ your circumstances is configuration, and the ones that are not, another agent ca
879
921
  windows, listed once per allowance and never added up; `--refresh` (optionally `--provider
880
922
  codex|claude`) reads the logins now. A Claude account's current availability reads `unknown`,
881
923
  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`
924
+ reading, and don't tell a person an account has room from it. Each account row also carries a
925
+ sign-in fact (`usable`, `needs sign-in` or `unknown`); a signed-in Claude login never reads
926
+ better than `unknown`. A Codex account's last reading, its reset and its last observed exhaustion
927
+ survive a daemon restart as history (`retained: "before_restart"`), never a current reading; a
928
+ window whose reset has passed shows an `expectation`, which is planning, not a reading. Run `rig provider status --refresh`
929
+ before telling anyone an account has room. With `provider.subscription_moves`
883
930
  on (off by default), `rig provider moves` records and lists moves of a Codex home's seats between
884
931
  subscriptions.
885
932
  - **Codex configuration fragments** — a `codex_config_fragment` must open with a table header and
@@ -893,6 +940,19 @@ your circumstances is configuration, and the ones that are not, another agent ca
893
940
  `both` sets which harnesses it installs and checks; one not chosen reads `skipped`, never failed.
894
941
  - **`rig usage series`** — what a seat's token curve has looked like over time: climbing steadily,
895
942
  reset, or stopped reporting entirely. The last one is a signal, not a gap.
943
+ - **`rig usage top`** — which of this machine's seats used the most tokens over a window (`--window
944
+ 90m`, `1h`, `2d`; `--top <n>` caps the list). Each ranked seat shows its token delta and samples;
945
+ a seat that has reported usage before but has no usable samples in the window is listed as
946
+ unknown with its reason, never as zero.
947
+ To compare machines, run it on each machine, or against each machine's daemon with
948
+ `OPENRIG_URL=<that daemon's URL>`, back to back, with the same `--window`, no `--top`, and `--json`.
949
+ Show the results side by side in tokens. For each machine, give its host, the window and its
950
+ `sinceIso` (each daemon counts from its own clock), how many seats were ranked and over what span,
951
+ the unknown seats and their reasons, and each seat's runtime, declared `model` and last observed
952
+ model (`modelObservation`: model, source, time) from `rig ps --nodes -A --json` on that machine.
953
+ A seat that has never reported usage is in neither list: name each seat that `rig ps --nodes -A
954
+ --json` shows and `rig usage top` doesn't as not covered. Don't add machines into one total unless
955
+ they cover the same seats over the same span; where coverage differs, say so instead.
896
956
  - **`rig usage cost [--seat <session>]`** — what each seat's harness reports it costs, beside its
897
957
  tokens: Claude's own client-side estimate (not an invoice) and Codex's tokens with a note that it
898
958
  reports no cost. A missing figure reads missing, never $0, and no setting gates it. With
@@ -1,26 +1,80 @@
1
- # Getting started: meet the kernel, then make one useful change
2
-
3
- Install OpenRig, use a working provider login, and meet the kernel operator with
4
- the advisor and TUI beside it. No starter team is needed to reach that view.
5
- Tell the operator what you want to do, then choose a project team for a bounded
6
- change you can exercise. Reuse the accounts and terminal tools you already have.
7
-
8
- After installation and sign-in, your agent opens the **OpenRig TUI and operator** for you. The path is `rig daemon start` (if stopped),
9
- then `rig terminal open saved:kernel --window`. The second command opens the
10
- desktop window itself. An agent can run it from its shell on the daemon's
11
- desktop; it does not need to type into your current terminal. See
12
- [Open the kernel conversations](#open-the-kernel-conversations).
13
- `rig tui` is the team dashboard; installation ends when you are talking to the
14
- operator in the OpenRig view.
1
+ # OpenRig setup reference
2
+
3
+ This is the full reference for installing and running OpenRig, written for the agent doing the setup and for anyone
4
+ who wants the detail. The short version for people is [Getting started](quickstart.md).
5
+
6
+ ## For the agent doing the setup
7
+
8
+ The `rigs` skill is the procedure: follow it in order. This page is what it looks things up in.
9
+
10
+ - **Done** means the person is talking to the operator in a visible OpenRig view. A healthy daemon, a started kernel
11
+ or an opened window isn't done on its own. If they'd rather talk later, the handoff is still pending: say so, and
12
+ leave them the exact command.
13
+ - **Read readiness; don't assume it:**
14
+ - **The kernel:** the `Kernel:` line in `rig status`, and `rig ps --nodes --rig kernel`.
15
+ - **A team:** `rig ps --nodes --rig <team>`.
16
+ - A missing or unknown signal isn't ready.
17
+ - `rig up` exiting 1 with `Status: partial` and `Startup attention` means a seat is waiting at a prompt. Answer it,
18
+ or ask the person to, then run the `rig seat continue <seat>` it names.
19
+ - **Prerequisites:** check the person's existing toolchain first (mise, nvm, Homebrew or the nodejs.org installer)
20
+ and the PATH. Use what's there. Don't change a shared Homebrew's ownership, and don't make a local workaround the
21
+ standard route. If Node.js is installed after your session started, check that new shells and the session's hooks
22
+ can find it. In one published-0.6.11 Mac run, OpenRig's Claude hooks reported `node: command not found` until the
23
+ PATH was fixed.
24
+ - **Ask once, then reuse the answer:** the provider (Claude Code, Codex or both), Herdr, Ghostty on macOS,
25
+ remembered command allowances, and the team.
26
+ - **Before changing their machine:** say what applies to their route, then wait for a yes. See
27
+ [what OpenRig changes on your machine](../../README.md#what-openrig-changes-on-your-machine).
28
+ - **When something stops:**
29
+ - [Incomplete setup and restart](#incomplete-setup-and-restart) maps what you see to the next action.
30
+ - [What can interrupt installation and the OpenRig view](#what-can-interrupt-installation-and-the-openrig-view)
31
+ covers the view.
32
+ - [Headless or SSH handoff](#headless-or-ssh-handoff) covers no-display cases.
33
+ - A timed-out command may still have taken effect. Read `rig ps` or `rig seat status <seat>` before you run it
34
+ again.
35
+ - **Don't:**
36
+ - relaunch a team to reopen its view;
37
+ - start another seat to clear a prompt;
38
+ - build the person's project yourself. Give the goal to the operator.
15
39
 
16
40
  ## Before you start
17
41
 
18
- You need Node.js 22 or 24 and tmux, on macOS or Linux. On Linux, the
19
- distribution's own Node.js can be older (Ubuntu 24.04's is 18); install a
20
- supported version with [nvm](https://github.com/nvm-sh/nvm) (`nvm install 22`)
21
- or NodeSource. On a Mac with Apple
22
- silicon, use Node.js 22 (see the [compatibility
23
- history](../releases/v0.5.15.md#known-compatibility-limitation)). Native
42
+ > **What OpenRig changes on your machine**
43
+ > - **Install:** `@openrig/cli` goes in globally with npm.
44
+ > - **Setup:** `rig setup` adds an OpenRig block to `~/.tmux.conf`. It can install tmux (with Homebrew on macOS), and
45
+ > Herdr unless you pass `--no-herdr`. Plain `rig setup`, which is what the one-command install runs, checks both
46
+ > Claude Code and Codex and may install a missing one; `rig setup --providers claude` (or `codex`) limits it to
47
+ > yours.
48
+ > - **Starting OpenRig, for the coding agent you use** (paths are the usual defaults):
49
+ > - Codex: hooks and trust in `~/.codex/config.toml`.
50
+ > - Claude Code: workspace trust in `~/.claude.json`, and activity hooks in the project's
51
+ > `.claude/settings.local.json`, plus a status line unless you already have your own.
52
+ > - Discovery skills go in `~/.claude/skills` and `~/.agents/skills`.
53
+ > - **Starting a team in your project:** adds managed guidance to `AGENTS.md` or `CLAUDE.md`, plus the team's skills
54
+ > and plugins.
55
+ > - **Permissions:** by default, OpenRig's own kernel gets broader permissions than a project team gets by default.
56
+ > On Codex that's full access with no approval prompts (`-s danger-full-access -a never`). On Claude Code, its file
57
+ > tools, web fetches and operational commands, including reads under your home folder, run without asking. A
58
+ > permission policy, per-agent choice or Codex profile changes that. What your team can do depends on the team you
59
+ > choose and your settings; `workshop`, for example, ships with broad access.
60
+ > - **Backups:** OpenRig doesn't guarantee it can preserve or roll back these files, so back them up first.
61
+ >
62
+ > [Everything OpenRig writes, and why →](https://github.com/mvschwarz/openrig#what-openrig-changes-on-your-machine)
63
+
64
+ You need Node.js 22 or 24 and tmux, on macOS or Linux, and one working Claude
65
+ Code or Codex account: one is enough, since the kernel operator adapts the
66
+ shipped `starter` team to whichever you have. On Linux, the distribution's own
67
+ Node.js can be older (Ubuntu 24.04's is 18); install a supported version with
68
+ [nvm](https://github.com/nvm-sh/nvm) (`nvm install 22`) or NodeSource. On a Mac
69
+ with Apple silicon, use Node.js 22 (see the [compatibility
70
+ history](../releases/v0.5.15.md#known-compatibility-limitation)). On a Mac where
71
+ you aren't an administrator, or where Homebrew belongs to another account (its
72
+ `brew install` is refused), install Node.js in your own home folder with
73
+ [nvm](https://github.com/nvm-sh/nvm): run `touch ~/.zshrc` (a new Mac account
74
+ has none, and nvm's installer only adds itself to a profile file that already
75
+ exists), then the install command on nvm's page, open a new terminal, and run
76
+ `nvm install 22`. That needs no administrator password, and `npm install -g`
77
+ then installs into your nvm folder. Native
24
78
  Windows isn't supported. On Windows, use WSL2: it's the Windows route OpenRig
25
79
  supports, though OpenRig's automated tests don't run on it yet. One user's
26
80
  [working setup](#wsl2-a-reported-working-setup) is below. Node 20 and
@@ -123,19 +177,20 @@ You can also read [`skills/rigs/SKILL.md`](../../skills/rigs/SKILL.md) directly.
123
177
  script will do and changes nothing:
124
178
 
125
179
  ```sh
126
- curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.12/scripts/install.sh | sh -s -- --dry-run
180
+ curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.14/scripts/install.sh | sh -s -- --dry-run
127
181
  ```
128
182
 
129
183
  The same command without `--dry-run`,
130
- `curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.12/scripts/install.sh | sh`, installs the
184
+ `curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.14/scripts/install.sh | sh`, installs the
131
185
  latest published `@openrig/cli` with `npm install -g`,
132
186
  runs the Node.js and SQLite check, then `rig setup --dry-run` and `rig setup`. `rig setup` checks both Claude Code and
133
- Codex and may install a missing one, as described below. A failed step prints
134
- `FAILED [n/4] <command or check> (exit <code>)`. Where a provider isn't signed in yet, step 4 ends that way and
135
- `rig setup` lists each sign-in under "Some steps need attention". If the only remaining failures are provider
136
- sign-ins, the install steps finished: sign in to each selected provider as below, then continue at
137
- [Start the kernel](#start-the-kernel-and-check-its-state). To install only what the selected providers need, go step
138
- by step instead:
187
+ Codex and may install a missing one, as described below. A failed step among the first three prints
188
+ `FAILED [n/4] <command or check> (exit <code>)`. When `rig setup` (step 4) doesn't finish ready, for example because a
189
+ provider isn't signed in yet, the script ends with `INSTALLED, SETUP NOT COMPLETE (exit <code>)`: the CLI is
190
+ installed, and `rig setup` lists what's left under "Some steps need attention". If the only items left are provider
191
+ sign-ins, sign in to each selected provider as below, then continue at
192
+ [Start the kernel](#start-the-kernel-and-check-its-state); run `rig setup` again rather than reinstalling the CLI. To
193
+ install only what the selected providers need, go step by step instead:
139
194
 
140
195
  ### Choose your providers
141
196
 
@@ -249,6 +304,17 @@ same view and plan, or creates one if none matches, preserving its config and ex
249
304
  caller's Herdr endpoint must match the daemon's endpoint; a mismatch is reported
250
305
  without opening a window or putting the view in another session.
251
306
 
307
+ The shared TUI (`rig tui --shared`) runs in the daemon's tmux server, so its own environment never
308
+ carries the Herdr you are looking at; the markers are on the tmux client attached to it. When you
309
+ open a terminal view from it on Linux, the TUI passes the markers of the client that was active last
310
+ (normally the one that pressed the key) to the command, which then opens the view in that Herdr. The
311
+ chosen client may belong to a different viewer: tmux only counts keys a client types, so a key sent
312
+ by an agent (`send-keys`) or by a control-mode client doesn't count as any client's activity, and the
313
+ view opens in the Herdr of the interactive client that typed last, however long ago. With no client
314
+ attached, more than one client active in the same second, or a client that isn't in Herdr or can't be
315
+ read, nothing is passed and the result is what it was before. Other platforms, and every other way of
316
+ running `rig terminal open`, keep the previous result too.
317
+
252
318
  On Linux, a local graphical display and a supported hosting terminal are required
253
319
  (Ghostty, GNOME Terminal, Konsole or xterm). Linux reports a window request; verify
254
320
  what actually appeared. SSH, headless, CI and unsupported Linux hosts get a
@@ -544,6 +610,16 @@ views. If the provider cannot open, each labelled fallback command joins a diffe
544
610
  seat. Keep all returned commands
545
611
  complete when sharing them; a created workspace alone does not confirm visibility.
546
612
 
613
+ ### Built by the community
614
+
615
+ Tools built around OpenRig are maintained by their authors. We have not tested them;
616
+ this list does not promise support or compatibility with your OpenRig version.
617
+
618
+ - **[Rig HQ](https://github.com/dmelo/rig-hq)**, by [dmelo](https://github.com/dmelo):
619
+ a read-only pixel-office viewer for rigs, seats, attention and queue handoffs, as
620
+ described in the [author's introduction](https://github.com/mvschwarz/openrig/discussions/879).
621
+ The author reports testing it with OpenRig 0.6.5. See its repository for setup and support.
622
+
547
623
  ## Continue real project work
548
624
 
549
625
  Return to the same owner with the next outcome, citing the earlier result.
@@ -965,6 +1041,37 @@ same-seat stop/resume path after checking its retained policy; do not erase the
965
1041
  rig or start a duplicate to reset permissions. A resume can reapply the stored
966
1042
  launch mode, so verify the native mode again before continuing work.
967
1043
 
1044
+ ## Optional Mac local-user check
1045
+
1046
+ On a Mac shared by multiple OS accounts, `transport.local_user_guard` can reduce
1047
+ accidental CLI routing to another account's local daemon. It is **off by default**.
1048
+ Enable it with `rig config set transport.local_user_guard true`, or set
1049
+ `OPENRIG_TRANSPORT_LOCAL_USER_GUARD=true` in the CLI's environment. Set it to
1050
+ `false` to turn it off; no daemon restart is needed for the CLI check.
1051
+
1052
+ When enabled, automatic local CLI data requests compare the daemon's reported
1053
+ `/healthz` PID and effective UID (`euid`) with two `ps` UID/start observations and
1054
+ a second health response, with at most one second of observation per check.
1055
+ Only stable agreement on a foreign effective UID stops the request. This does
1056
+ not require visibility into another user's socket descriptors. It does not
1057
+ stop the daemon, choose another port or retry. Diagnostic health/status checks
1058
+ remain available. Older daemons without `euid` remain unknown and are permitted.
1059
+ `sudo rig …` uses the caller's **effective** UID, so an enabled check against a
1060
+ user-owned daemon refuses when its reported/observed UID differs from root.
1061
+
1062
+ Explicit `OPENRIG_URL`/`RIGGED_URL` targets and registered remote hosts retain
1063
+ their selected routing, including tunnels. An internally resolved local URL is
1064
+ still checked. Default UI and TUI openings are checked before launch; this does
1065
+ not police later browser or TUI connections.
1066
+
1067
+ Missing, disagreeing, restricted or timed-out evidence **continues today's
1068
+ behavior**. This is a partial accidental-routing check, not authenticated user
1069
+ isolation: it trusts the daemon's PID/UID report and corroborates that process;
1070
+ it does not establish the socket's owner. Identity can change between observation
1071
+ and connection, and equal UIDs do not distinguish separate instances belonging
1072
+ to one account. The check
1073
+ does not add authentication to the daemon or protect direct HTTP clients.
1074
+
968
1075
  ## Custom settings and precedence
969
1076
 
970
1077
  - **OpenRig:** member `permission_policy` overrides rig `permission_policy`.
@@ -1,7 +1,7 @@
1
1
  # Reference guides the help pack links to, loaded one file or section at a time by address
2
2
  # (rig context get reference/<file>#<section>). Each file is a symlink to docs/reference/.
3
3
  name: reference
4
- version: "0.6.12"
4
+ version: "0.6.14"
5
5
  taxonomy: world
6
6
  purpose: "Version-matched reference guides the help guide links to. Load a single file or section by address; don't load the whole pack."
7
7
  files:
@@ -361,7 +361,7 @@ pods:
361
361
  **Where the declared names reach, by runtime.** Declared values are handed to the seat's terminal as tmux environment, so most seats take them as given:
362
362
 
363
363
  - Plain Claude Code (no permission mode selected), Codex and terminal seats take a spec `HOME`, `PATH` or `CLAUDE_CONFIG_DIR` as given.
364
- - The cleared environment (`env -i`) belongs only to a managed Claude launch, which is the one used when a permission mode is selected for the seat (for example `permission_policy: builtin:auto`). It forwards the declared names through the cleared environment, except `PATH`, `HOME` and `CLAUDE_CONFIG_DIR`, which OpenRig sets for that launch itself, and `CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN`, for which it sets its own renderer setting. A spec value for any of those four is not forwarded. A seat that selected the shipped `openrig-core` plugin also has `CLAUDE_CODE_PLUGIN_DIRS` (the vendored plugin, added after a list the seat declares itself) among its declared names, so it is forwarded like the others and the plugin's hooks load in a seat with a permission mode as in one without; a seat that didn't select the plugin has no such name added.
364
+ - The cleared environment (`env -i`) belongs only to a managed Claude launch, which is the one used when a permission mode is selected for the seat (for example `permission_policy: builtin:auto`). It forwards the declared names through the cleared environment, except `PATH`, `HOME` and `CLAUDE_CONFIG_DIR`, which OpenRig sets for that launch itself, and `CLAUDE_CODE_DISABLE_ALTERNATE_SCREEN`, for which it sets its own renderer setting. A spec value for any of those four is not forwarded. A seat that selected the shipped `openrig-core` plugin also has `CLAUDE_CODE_PLUGIN_DIRS` (the vendored plugin, added after a list the seat declares itself) among its declared names, so it is forwarded like the others and the plugin's hooks load in a seat with a permission mode as in one without; a seat that didn't select the plugin has no such name added. Beyond the declared names, the launch also forwards, by name and only when the seat's terminal has them set, the terminal and locale variables (`TERM`, `COLORTERM`, `TERM_PROGRAM`, `TERM_PROGRAM_VERSION`, `LANG` and the `LC_*` names) and the person's editor and display session: `EDITOR`, `VISUAL`, `DISPLAY`, `XAUTHORITY` and `WAYLAND_DISPLAY`. They let Claude's external-editor action open the person's editor and let image paste reach the clipboard, without a value in a spec. `WAYLAND_DISPLAY` is passed as an absolute path: an absolute value is kept, and a relative one is joined to the terminal's `XDG_RUNTIME_DIR`; if the terminal has no `XDG_RUNTIME_DIR` for it, the name is left out. `XDG_RUNTIME_DIR` itself is not forwarded, because D-Bus clients look for the session bus at `$XDG_RUNTIME_DIR/bus` and would reach the keyring and `systemctl --user`. `DBUS_SESSION_BUS_ADDRESS`, `XDG_SESSION_TYPE`, `XDG_CURRENT_DESKTOP` and `SSH_AUTH_SOCK` are not forwarded either. A running seat picks the names up at its next managed Claude launch, not before: `rig seat launch <seat> --fresh --stop --reason "<why>"` for that seat alone (a new conversation), or a restore of the whole rig (`rig down <rig>`, then `rig up <rig> --existing`, which resumes each conversation but restarts every seat in the rig), or a handover. A seat that is up keeps the environment it started with.
365
365
  - Codex seats run OpenRig's own Codex executable whatever a spec `PATH` says, and use the daemon's `CODEX_HOME` when the daemon has one.
366
366
  - On Pi and OMP seats the values reach the terminal. The agent process gets only what the runner passes on, so a spec or one-off value reaches it only for the names the runner always passes: `PATH`, `HOME`, `USER`, `LOGNAME`, `TERM`, `LANG`, `LC_ALL`, `SHELL` and `TMPDIR`. Pi's agent process receives the runner's `HOME`, so a spec or one-off `HOME` value that reaches the runner is passed to Pi; OMP's agent process gets its seat state directory (`$OPENRIG_HOME/state/omp/<seat>`, see Oh My Pi below) as `HOME`, so a `HOME` value does not reach it. The selected provider's variables are passed separately, as described under each runtime.
367
367
 
@@ -436,10 +436,10 @@ directory's `CLAUDE.md`, including blocks written by other rigs.
436
436
  | `profile` | string | yes | — | Profile name from the referenced AgentSpec. Use `default` for the default profile. Exception: `none` for terminal nodes. |
437
437
  | `codex_config_profile` | string | no | — | Codex-only native profile passed as `-p <name>`; letters, numbers, `_`, `.`, `-`. Separate from the AgentSpec `profile`. With the normal launch mode, this replaces OpenRig's explicit workspace-write sandbox flag. A full-bypass policy instead emits danger-full-access and omits this profile argument. |
438
438
  | `runtime` | string | yes | — | Agent runtime. Current supported values: `claude-code`, `codex`, `pi`, `omp`, `terminal`, `stub`. `stub` is a deterministic test harness, not an agent: a Node runner in the seat's tmux pane goes through the normal launch, skill projection, startup-file and readiness path, follows `<cwd>/.openrig/stub/script.json` when present, and calls no model. See "What a stub can and cannot prove" in `docs/as-built/test-layers.md`. |
439
- | `cwd` | string | yes | — | Working directory for the agent. A relative path resolves against the rig root (the directory containing the rig spec). If that path exists as written, it is used. Otherwise a leading `~` or `~/` expands to the home directory (`~user` does not) and `$VAR` / `${VAR}` expand from the daemon host's environment; a relative result still resolves against the rig root. A reference to an unset variable stays as written, so the cwd is that literal path and works only if it exists. Use `"."` for the rig root itself. Can be overridden at launch time with `rig up --cwd`. A cwd inside the OpenRig installation fails preflight unless `--cwd` is given. |
439
+ | `cwd` | string | yes | — | Working directory for the agent. A relative path resolves against the rig root (the directory containing the rig spec). If that path exists as written, it is used. Otherwise a leading `~` or `~/` expands to the home directory (`~user` does not) and `$VAR` / `${VAR}` expand from the daemon host's environment; a relative result still resolves against the rig root. A reference to an unset variable stays as written, so the cwd is that literal path and works only if it exists. Use `"."` for the rig root itself. Can be overridden at launch time with `rig up --cwd`. A cwd inside the OpenRig installation fails preflight unless `--cwd` is given. Editing this declaration does not update an existing seat; use [`rig seat set-cwd`](agent-startup-guide.md#change-an-existing-seats-working-directory) to save its future launch directory. |
440
440
  | `label` | string | no | — | Human-readable member name. Shown in UI when present. |
441
441
  | `model` | string | no | — | Model override. Runtime-specific (e.g., `claude-opus-4-6` for Claude Code). |
442
- | `effort` | string | no | — | Reasoning effort override, trimmed. A non-string value is ignored with an advisory. |
442
+ | `effort` | string | no | — | Reasoning effort override, trimmed. Claude gets `--effort`, Codex `-c model_reasoning_effort=…`, Pi `--thinking` (see "Pi" below). A non-string value is ignored with an advisory. |
443
443
  | `permission_policy` | string | no | — | Member-level permission policy; overrides the rig's. Not valid on terminal members. |
444
444
  | `env` | map | no | — | Launch environment for this seat, laid over the rig's `env`. Same rules as the rig-level field. Valid on terminal members too. See "Launch environment" below. |
445
445
  | `role` | string | no | — | The seat's role, letters, digits, `_`, `.` and `-`. Not valid on terminal members. |
@@ -455,7 +455,7 @@ directory's `CLAUDE.md`, including blocks written by other rigs.
455
455
  `runtime: pi` launches the Pi coding agent (`pi --mode rpc`) through OpenRig's RPC runner.
456
456
 
457
457
  - **State:** Each seat uses `$OPENRIG_HOME/state/pi/<session>/agent` as its Pi agent directory, with `sessions/` beside it, instead of your default `~/.pi/agent`. The runner sets `PI_CODING_AGENT_DIR` to that directory. `<session>` is the seat's session name, unchanged; for a pod member it is `{podId}-{memberId}@{rigName}`. `$OPENRIG_HOME` defaults to `~/.openrig`. OpenRig creates these directories at launch and does not copy anything from `~/.pi/agent`.
458
- - **Thinking level:** OpenRig does not pass a node's `effort` to Pi. To set Pi's thinking level, add it to the model as a suffix, for example `model: openrouter/x-ai/grok-4:high`. Pi accepts `off`, `minimal`, `low`, `medium`, `high`, `xhigh` and `max`. Pi first looks for a model whose id is the whole pin, and uses it when there is one, suffix included. Only when there is none does Pi read the suffix as the level and record the model without it. Any other suffix, such as OpenRouter's `:free`, stays part of the model id. The model-divergence check reads the pin literally when the seat's `models.json` defines a model with that exact id; otherwise it accepts the model with or without the suffix. If the seat's `models.json` can't be read, a pin with a suffix stays unchecked, with the usual warning, when the recorded model matches the whole pin or the pin without its suffix. A record that matches neither is reported.
458
+ - **Thinking level:** A Pi seat's effort (the choice saved with `rig seat set-effort`, else the spec's `effort`) is sent to Pi as `--thinking <level>` on every managed launch and resume: fresh launch, successor and restore. Pi accepts `off`, `minimal`, `low`, `medium`, `high`, `xhigh` and `max`; OpenRig passes the value as written and does not translate it, so Codex's `none` is not mapped to `off`. Only a value of the shape `set-effort` accepts (a letter, then up to 31 letters, digits, `-` or `_`) is sent; any other spec value, such as one with a space or one that starts with `--`, is left out, and `rig seat effort` says so. An unfamiliar level gets an advisory (a warning from `set-effort`), never a refusal, and Pi itself ignores an unknown level with a warning and keeps the level it would use without the flag: a model suffix, the resumed session's level, or its default. With no effort resolved, no flag is sent. The effort wins over a model suffix, and the model string is never changed. `rig seat effort` reports the level sent at launch and, on Pi 0.99.0 or later, the `thinkingLevel` Pi records on this launch's latest successful assistant turn (error and aborted turns are skipped); that is the session's level after Pi's own cap, not proof the provider applied it, and it is shown apart from the level sent when they differ. On older Pi it is NOT VERIFIED. Without an effort, you can still set the level as a model suffix, for example `model: openrouter/x-ai/grok-4:high`. Pi first looks for a model whose id is the whole pin, and uses it when there is one, suffix included. Only when there is none does Pi read the suffix as the level and record the model without it. Any other suffix, such as OpenRouter's `:free`, stays part of the model id. The model-divergence check reads the pin literally when the seat's `models.json` defines a model with that exact id; otherwise it accepts the model with or without the suffix. If the seat's `models.json` can't be read, a pin with a suffix stays unchecked, with the usual warning, when the recorded model matches the whole pin or the pin without its suffix. A record that matches neither is reported.
459
459
  - **Custom models:** Pi reads `models.json` from its agent directory, so a seat reads `$OPENRIG_HOME/state/pi/<session>/agent/models.json`, not `~/.pi/agent/models.json`. Custom provider and model definitions for a seat go in that file. A seat that uses only providers Pi already includes does not need one. OpenRig does not create or write `models.json`.
460
460
  - **Credentials:** The Pi process receives only `PATH`, `HOME`, `USER`, `LOGNAME`, `TERM`, `LANG`, `LC_ALL`, `SHELL`, `TMPDIR`, a fixed set of OpenRig seat and instance variables, `PI_CODING_AGENT_DIR`, `PI_CODING_AGENT_SESSION_DIR`, and at most one provider key. That key is `OPENROUTER_API_KEY`, `ZAI_API_KEY`, `KIMI_API_KEY` or `MINIMAX_API_KEY`, passed only when it is set in the seat's environment and the seat's `model` is written as `openrouter/<id>`, `zai/<id>`, `kimi-coding/<id>` or `minimax/<id>`. Naming that variable in `recovery.provider_auth_env_allowlist` (empty by default) makes the daemon add it, when set in the daemon's environment, to the seat's launch environment. No other variable reaches Pi, including other providers' keys and a custom provider's own key variable.
461
461
 
@@ -466,7 +466,7 @@ directory's `CLAUDE.md`, including blocks written by other rigs.
466
466
  - **State:** Each seat uses `$OPENRIG_HOME/state/omp/<seat>/agent` and `sessions/` instead of your default `~/.omp` profile, and runs with that seat directory as `HOME`. OpenRig does not copy OMP credentials. The runner finds the real `omp` binary before switching `HOME`, so a version-manager shim such as mise on the daemon's `PATH` still works.
467
467
  - **Credentials:** Provision each seat separately, or put the provider's key variable in `recovery.provider_auth_env_allowlist` (for example `ANTHROPIC_API_KEY` or `MISTRAL_API_KEY`). The allowlist accepts the key variable of every provider in OpenRig's OMP provider map, from `anthropic` through `litellm`. A seat receives a key only when its `model` is written as `provider/id`, such as `anthropic/claude-sonnet-4-5`. Short names such as `opus` pass no key. A provider whose key is scoped to one endpoint also accepts that endpoint's variable: `anthropic`, `openai` and `litellm` each take their `<PROVIDER>_BASE_URL` — `ANTHROPIC_BASE_URL`, `OPENAI_BASE_URL`, `LITELLM_BASE_URL`. The allowlist admits each variable on its own, so an endpoint named without its key is admitted too, which suits a keyless local proxy. The launch gate admits these endpoint names for OMP seats; the match against the seat's declared `provider/id` happens at the OMP child, which forwards a matching endpoint already in the runner's environment just as it forwards a key. OMP also reads the launch directory's `.env`, so use a trusted working directory.
468
468
  - **Approval posture:** The default floor is `--approval-mode always-ask`. Because the runner is headless, OMP approval requests are cancelled and the seat stays in needing-attention after the turn ends, until the next agent run starts. A `full_bypass` permission policy selects `--approval-mode yolo`.
469
- - **Model errors:** A rejected prompt, a provider or authentication error during a turn, or exhausted automatic retries is printed in the pane and keeps the seat in needing-attention until the next agent run starts.
469
+ - **Model errors:** Errors are printed in the pane. A completed assistant failure with a numeric `errorStatus` of 408, 429, 500, 502, 503, 504, or 529 returns to idle at terminal `agent_end`, allowing an ordinary retry. Until that terminal boundary it stays in needing-attention. Intermediate `agent_end(isTerminal:false)` events do not release attention. A statusless failed retry summary retains that classification only when its attempt matches an announced retry and its final error exactly matches the latest typed transient assistant failure in that attempt. New assistant/turn boundaries invalidate the previous failure; unmatched summaries remain runtime errors. Rejected prompts, auth/configuration failures, exhausted retries without a typed transient status, and untyped errors (including text such as `529 overloaded`) retain attention until the next agent run starts. The runner does not classify diagnostic text. A transient failure does not clear a denied approval or another unresolved runtime failure in the same turn.
470
470
  - **Restore:** OMP creates its session file after the first persisted turn. A new seat with no persisted turn has no resume token; restoring it requires `rig up --existing <rig> --fresh <seat>`. After that file exists, OpenRig restores that exact session file. If a full rig restore leaves an OMP seat in `attention_required` or `failed`, `rig seat clear-attention` cannot yet reconcile it to `operator_recovered`, even with `--reason`, because restore reconciliation only verifies Claude Code and Codex processes ([#41](https://github.com/mvschwarz/openrig/issues/41)). Relaunch that seat with `rig up --existing <rig> --fresh <seat>`, or restore it manually.
471
471
 
472
472
  ### Terminal Nodes