@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
@@ -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`.
@@ -116,8 +116,11 @@ an issue there with the same three things. A maintainer then writes the full ent
116
116
  defined in the [bundle formats reference](bundle-formats.md), with the parts only a review can produce, such as the
117
117
  pinned commit and each configuration's package digest.
118
118
 
119
- Rig names are unique on the site. If `registry/<your-team>.yaml` already exists, openrig-registry's registry check says the name is taken;
120
- choose a distinct one, for example `<taken-name>-<your-name>`.
119
+ Rig names are unique on the site. If `registry/<your-team>.yaml` already exists, openrig-registry's registry check
120
+ still replies that your submission was received, and says the name is taken; choose a distinct one, for example
121
+ `<taken-name>-<your-name>`. A team whose `rig.yaml` name matches a listed team's, such as an unchanged copy of one,
122
+ passes the checks with a notice for the maintainer about the shared name. Whether it's listed is the maintainer's
123
+ review decision, not the checks'.
121
124
 
122
125
  What happens next:
123
126
  - a maintainer pins your link to an exact commit, runs the same check, and reads everything your bundle gives to an
@@ -0,0 +1,187 @@
1
+ # Getting started
2
+
3
+ OpenRig runs a team of coding agents (Claude Code, Codex and others) on your project, each in its own terminal. You
4
+ talk to one agent, and it hands work to the others. The team keeps its tasks and messages between sessions.
5
+
6
+ Most people let their coding agent set it up. This page explains what happens either way, so nothing is a black
7
+ box, and shows how to do each step by hand if you'd rather.
8
+
9
+ ## How the pieces fit
10
+
11
+ - **`rig`** is the command you and your agents use. It comes from the npm package `@openrig/cli`.
12
+ - **The daemon** is a small background service on your machine. It keeps tasks, messages and state in a local
13
+ database. `rig daemon start` starts it.
14
+ - **tmux** runs each agent in its own terminal session. Agents keep running when you close a window, and one agent
15
+ can type into another's terminal.
16
+ - **The kernel** is OpenRig's own small team, which starts with the daemon. You talk to its **operator**, which
17
+ starts and runs teams for you. Its **advisor** helps you think through what you want.
18
+ - **Your team** (a *rig*) is the set of agents that work on your project, such as `starter`.
19
+ - **The OpenRig view** is a terminal window with the operator and, beside it or on another page, a dashboard of your
20
+ agents.
21
+
22
+ ## What you need
23
+
24
+ - macOS or Linux. On Windows, use WSL2 ([one person's working setup](getting-started.md#wsl2-a-reported-working-setup)).
25
+ - Node.js 22 or 24 (on Apple silicon, Node.js 22) and tmux.
26
+ - Claude Code or Codex, signed in. One is enough to start.
27
+
28
+ If `node --version` does not show a supported version, first check your existing Node installation and PATH.
29
+ Ask your coding agent to help use the toolchain already on your machine. On a Mac, a shared Homebrew installation
30
+ may belong to another user; do not change its ownership to complete this setup. After correcting PATH or installing
31
+ Node, open a new terminal and check `node --version` and `npx --version` before continuing.
32
+
33
+ ## The quick way: let your coding agent do it
34
+
35
+ In your project folder, add OpenRig's `rigs` skill to the agent you use:
36
+
37
+ ```sh
38
+ # Claude Code
39
+ npx skills add https://github.com/mvschwarz/openrig/tree/<release-tag>/skills/rigs --skill rigs --agent claude-code
40
+ # Codex
41
+ npx skills add https://github.com/mvschwarz/openrig/tree/<release-tag>/skills/rigs --skill rigs --agent codex
42
+ ```
43
+
44
+ For a new install, use the latest release's tag, for example `v0.6.14`. If OpenRig is already installed, use the tag
45
+ that matches `rig --version`, or upgrade first. If the command fails with `npx: command not found`, Node.js isn't
46
+ installed or isn't on your PATH yet (see above). Then type `/rigs` in Claude Code, or `$rigs` in Codex, and say what
47
+ you want built.
48
+
49
+ The skill has your agent work through the steps below in order. It says what it will run and change before it runs
50
+ it, and it asks before installing anything on your system. It finishes when you're talking to the operator.
51
+
52
+ ## What happens, step by step
53
+
54
+ Each step shows the command, so you can run it yourself.
55
+
56
+ ### 1. Install the `rig` command
57
+
58
+ ```sh
59
+ npm install -g @openrig/cli
60
+ rig --version
61
+ ```
62
+
63
+ This installs the CLI globally under your npm prefix. `rig --version` prints the version and a commit, such as
64
+ `0.6.12 (9e5382dd)`. With npm 11 or later, an `npm warn install-scripts` line is expected: it means only the
65
+ Node.js and SQLite check was skipped.
66
+
67
+ ### 2. Set up the tools around it
68
+
69
+ ```sh
70
+ rig setup --providers claude # or codex, or both
71
+ ```
72
+
73
+ Add `--dry-run` first to see the plan without changing anything. Setup does four things:
74
+ - it checks Node.js, tmux and your sign-in;
75
+ - it installs a missing tmux (with Homebrew on macOS, if you have it) or the coding agent you chose;
76
+ - it installs Herdr, a terminal workspace app the OpenRig view can use, unless you add `--no-herdr`;
77
+ - it adds an OpenRig block to `~/.tmux.conf` (mouse support and longer scrollback).
78
+
79
+ It doesn't start anything. It ends with a summary of what's done and what still needs you. A missing sign-in shows
80
+ there: run `claude auth login` or `codex login`, then carry on.
81
+
82
+ ### 3. Start OpenRig
83
+
84
+ ```sh
85
+ rig daemon start
86
+ rig status
87
+ rig ps --nodes --rig kernel
88
+ ```
89
+
90
+ The daemon starts and boots the kernel with the coding agents you're signed in to, or both if you're signed in to both.
91
+
92
+ **What starting OpenRig changes, for the coding agents you use** (paths are the usual defaults):
93
+ - **For Codex:** hooks and trust in `~/.codex/config.toml`, when OpenRig or a Codex agent starts.
94
+ - **For Claude Code:** workspace trust in `~/.claude.json`, and activity hooks in the project's
95
+ `.claude/settings.local.json`, plus a status line unless you already have your own.
96
+ - **For both:** small discovery skills in `~/.claude/skills` and `~/.agents/skills`.
97
+ - **Kernel access:** by default the kernel gets broader permissions than a project team gets by default. On Codex
98
+ that's full access with no approval prompts. On Claude Code, its file tools, web fetches and operational commands,
99
+ including reads under your home folder, run without asking. A permission policy, per-agent choice or Codex profile
100
+ changes that.
101
+
102
+ OpenRig doesn't guarantee it can preserve or roll back these files, so back them up first. [Everything OpenRig writes, and why](../../README.md#what-openrig-changes-on-your-machine).
103
+
104
+ Started isn't the same as ready. `rig status` shows a `Kernel:` line, and `rig ps --nodes --rig kernel` shows each
105
+ kernel agent's state. They can take a moment after the daemon is up.
106
+
107
+ ### 4. Open the OpenRig view
108
+
109
+ ```sh
110
+ rig terminal open saved:kernel --window
111
+ ```
112
+
113
+ **What you'll see:**
114
+ - **Where it opens:** a new terminal window or tab. If your agent is already running inside Herdr, it opens a new
115
+ Herdr space instead. It uses Herdr when installed, plain tmux otherwise.
116
+ - **Layout:** in a narrow window, or when the width can't be measured, the operator fills the first page. From 120
117
+ columns, the dashboard and the operator share it. The advisor has its own tab.
118
+ - **On a Mac:** you may be asked to let your terminal app be controlled. Allowing it is fine.
119
+ - **Over SSH or with no display:** the window can't open. The command says why and, where it can, prints a command
120
+ to run in a new terminal. Otherwise your agent works out the exact command to join the operator.
121
+
122
+ You're installed when you're talking to the operator.
123
+
124
+ ### 5. Start your first team
125
+
126
+ Tell the operator what you want built, and in which folder. It recommends one of three teams:
127
+ - `starter`: a builder and a reviewer, for one bounded change;
128
+ - `workshop`: a lead, a builder, QA and a reviewer, for ongoing work in one repository;
129
+ - `factory`: seven agents, for sustained product work.
130
+
131
+ Before it starts one, it tells you what starting a team in your folder changes: managed guidance in `AGENTS.md` or
132
+ `CLAUDE.md`, plus the team's skills. Then it waits for your yes. As shipped, `starter` uses both Claude Code and
133
+ Codex. With only one of them, ask the operator to adapt it.
134
+
135
+ By hand, from your repository:
136
+
137
+ ```sh
138
+ rig up starter --cwd . --plan # check what it would start
139
+ rig up starter --cwd .
140
+ rig ps --nodes --rig starter
141
+ ```
142
+
143
+ If an agent stops at a sign-in, trust or permission prompt, `rig up` reports `Status: partial` and names the prompt.
144
+ Answer it in that agent's terminal, then run the `rig seat continue <seat>` command it prints. The team is ready
145
+ for work once its agents show as ready in `rig ps --nodes --rig starter`.
146
+
147
+ ### 6. Give the team work, and stop it
148
+
149
+ ```sh
150
+ rig send dev-build@starter 'Fix <one useful thing>. Ask dev-review to check it, and record the result and how I can try it.'
151
+ rig queue list --destination dev-build@starter
152
+ ```
153
+
154
+ The builder records the work as a task, so you can follow it with `rig queue`. When you're done, `rig down starter`
155
+ stops that team. `rig daemon stop` stops the background service and leaves agent sessions running.
156
+
157
+ ## The one-command install
158
+
159
+ Instead of steps 1 and 2:
160
+
161
+ ```sh
162
+ curl -fsSL https://openrig.dev/install.sh | sh -s -- --dry-run # shows the plan and changes nothing
163
+ curl -fsSL https://openrig.dev/install.sh | sh
164
+ ```
165
+
166
+ It checks Node.js and npm, installs the latest `@openrig/cli`, then runs `rig setup`. It doesn't know which coding agent
167
+ you use, so it checks and may install both. For just one, use steps 1 and 2. If a sign-in is missing, setup reports
168
+ it as the step to finish: sign in, then continue at step 3.
169
+
170
+ ## What these words mean
171
+
172
+ - **Rig:** a team of agents, started with one command. Your first one is usually `starter`.
173
+ - **Seat:** one agent's role and address in a team, such as `dev-build@starter`.
174
+ - **Harness:** the software around the model that an agent runs in: Claude Code, Codex or Pi.
175
+ - **Kernel:** OpenRig's own small team, which starts with OpenRig. It isn't your project's team.
176
+ - **Operator:** the kernel's agent you talk to first. It recommends a team for your goal and starts it when you say
177
+ yes.
178
+ - **Advisor:** the kernel's agent for thinking through what you want before a team starts. It has its own tab.
179
+ - **OpenRig view:** the terminal view that opens on the operator. In a wide window the dashboard sits beside it;
180
+ otherwise, or when the width can't be measured, the dashboard is on its own page. `saved:kernel` in
181
+ `rig terminal open saved:kernel` is the name of this saved view.
182
+
183
+ ## More
184
+
185
+ - **Every detail of setup:** troubleshooting, permissions, headless and SSH use, and what can stop the view from
186
+ opening. See the [setup reference](getting-started.md).
187
+ - **Stuck?** Run `rig context get help`, or read [Help](help.md).
@@ -125,10 +125,14 @@ reports broken links as gaps rather than following pointers.
125
125
  This automatic hook path is additive to one-shot manual injection through
126
126
  `rig send --context`; neither mode substitutes for the other.
127
127
 
128
- ## The work packet (switched off by default)
128
+ ## The work packet (off by default on every runtime, for now)
129
129
 
130
130
  Set `OPENRIG_REFOCUS_WORK_PACKET=1` in a seat's harness environment so its
131
131
  refocus carries the work it is actually doing as text rather than as pointers.
132
+ `=0` (or `off`, `false`, `no`) turns it off. Unset, each runtime's default
133
+ applies. A runtime's default becomes on only after a native run shows the
134
+ packet reaching the agent and leading to the right next action. No runtime has
135
+ been shown that yet, so today both Claude Code and Codex default to off.
132
136
  With the switch on:
133
137
 
134
138
  - The hook asks `rig queue whoami --work-candidates` for labelled evidence.
@@ -154,6 +158,12 @@ With the switch on:
154
158
  `OPENRIG_REFOCUS_NOTES_MAX_AGE_DAYS` (default 14) is named with its age, the
155
159
  age's source (`updated:` frontmatter, else mtime) and the threshold: a cue
156
160
  for judgment, not a staleness verdict.
161
+ - Each field is bounded on its own, with no total cap. A held or next row's
162
+ summary and continuation are one line each (about 160 characters), with
163
+ `rig queue show <id>` named when one was shortened. At most 20 held and 10
164
+ next rows are shown, with how many there are and the `rig queue list` command
165
+ for the rest. A matched section's body is cut at about 1,500 characters,
166
+ pointing to `--depth full`.
157
167
 
158
168
  `trace-to-root.py --packet --work-candidates <path|->` renders the same packet
159
169
  by hand.
@@ -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
@@ -49,8 +49,22 @@ Authored files contain recommendations, not runtime facts. Extra fields are igno
49
49
  any authored runtime, model or activity. At read time the command joins by exact host self-id
50
50
  and seat. Unmatched or conflicting observations are `unknown`; a seat not reported running is
51
51
  `stale`, with current runtime/model unknown. The configured model is the registry declaration.
52
- The observed native model remains unknown: these commands do not open native histories or verify
53
- what model the provider is running. Activity includes its sample time when the daemon supplies it;
52
+ Daemon node listings, `rig ps --nodes --full` and roster members also carry the full
53
+ `modelObservation`: `status`, `model`, `source`, `observedAt`, `generation` and `reason`.
54
+ Compact JSON uses the smaller shape described below. The configured `model` stays separate; roster's
55
+ `live.observedModel` is the observation's model or null. Human output says **last observed**.
56
+ Claude (`claude-assistant-response`) and Pi (`pi-assistant-response`) name response evidence;
57
+ Codex (`codex-turn-context` or `codex-world-state`) names recorded turn configuration, not a
58
+ verified backend response. The timestamp is the native record's time, never file mtime or inventory
59
+ read time. None promises the model that will answer the next turn.
60
+
61
+ The daemon reuses the current-occupant record selectors and bounded readers used by divergence
62
+ monitoring, sharing a process census. Reporting does not need a configured model or comparator.
63
+ A changed or unverified occupant, a record predating its tenure, missing or invalid record time,
64
+ unreadable or ambiguous records, unsupported runtimes and older daemons report **UNKNOWN** with
65
+ a reason, never the configured value as a fallback. An older record from the same verified occupant
66
+ remains labelled last observed at its original time; this is not a freshness guarantee. No record
67
+ contents, transcript paths or credentials are returned. Activity includes its own sample time;
54
68
  activity and running status do not promise that someone is available for new work.
55
69
 
56
70
  The JSON `observations.readAt` is when the inventory read completed, not a native observation
@@ -59,3 +73,16 @@ valid rosters remain usable; duplicate IDs make `show` report ambiguity instead
59
73
  Non-regular file targets, such as FIFOs and directories, are skipped with a warning; links to
60
74
  regular files remain readable. Inventory uses `ps --no-cleanup` to preserve even stale local
61
75
  daemon state files. Ordinary `rig ps` keeps its existing cleanup behavior unless given that flag.
76
+
77
+ The daemon reuses model facts only while the selected record's identity, size and
78
+ modification time and the occupant generation remain unchanged. Inventory reads
79
+ share two bulk pane snapshots and one process census; identity is checked after
80
+ the final snapshot. A different observation from duplicate host routes makes
81
+ only that observation UNKNOWN, preserving agreed registry fields.
82
+
83
+ `rig ps --nodes --json` keeps an observed model compact as
84
+ `modelObservation: ["literal-model-id", "evidence-source", "native-record-time"]`.
85
+ UNKNOWN is `{ "status": "unknown", "reason": "..." }`; older daemons may yield
86
+ `null`. `--full` and `--fields modelObservation` retain the full object, including
87
+ its status and occupant generation. Human output and roster reports use the full
88
+ labelled observation.