@openrig/cli 0.6.7 → 0.6.9

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 (261) hide show
  1. package/README.md +6 -4
  2. package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +41 -2
  3. package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +18 -4
  4. package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +218 -7
  5. package/daemon/context-packs/help/manifest.yaml +1 -1
  6. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  7. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +40 -13
  8. package/daemon/context-packs/reference/getting-started.md +2 -2
  9. package/daemon/context-packs/reference/instance-layout.md +5 -0
  10. package/daemon/context-packs/reference/manifest.yaml +1 -1
  11. package/daemon/context-packs/reference/rig-spec.md +12 -9
  12. package/daemon/context-packs/reference/whats-new.md +71 -114
  13. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
  14. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
  15. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
  16. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  17. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  18. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  19. package/daemon/context-packs/skills/core/cross-host-rig-commands/SKILL.md +1 -0
  20. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  21. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  22. package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +18 -4
  23. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
  24. package/daemon/context-packs/skills/core/openrig-architect/SKILL.md +3 -0
  25. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  26. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  27. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
  30. package/daemon/context-packs/skills/core/openrig-software-factory/references/worked-example.md +15 -14
  31. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  32. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  34. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  39. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  42. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  43. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  46. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  54. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  55. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  62. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  63. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  64. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  65. package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +218 -7
  66. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  67. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  68. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  69. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
  70. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  71. package/daemon/context-packs/world-public/manifest.yaml +1 -1
  72. package/daemon/dist/build-info.js +3 -3
  73. package/daemon/dist/db/all-migrations.d.ts.map +1 -1
  74. package/daemon/dist/db/all-migrations.js +2 -0
  75. package/daemon/dist/db/all-migrations.js.map +1 -1
  76. package/daemon/dist/db/migrations/098_queue_transitions_qitem_id_order.d.ts +3 -0
  77. package/daemon/dist/db/migrations/098_queue_transitions_qitem_id_order.d.ts.map +1 -0
  78. package/daemon/dist/db/migrations/098_queue_transitions_qitem_id_order.js +12 -0
  79. package/daemon/dist/db/migrations/098_queue_transitions_qitem_id_order.js.map +1 -0
  80. package/daemon/dist/domain/claude-compaction-enforcer.d.ts +23 -2
  81. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  82. package/daemon/dist/domain/claude-compaction-enforcer.js +153 -94
  83. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  84. package/daemon/dist/domain/context-monitor.d.ts +5 -0
  85. package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
  86. package/daemon/dist/domain/context-monitor.js +21 -6
  87. package/daemon/dist/domain/context-monitor.js.map +1 -1
  88. package/daemon/dist/domain/current-work.d.ts +74 -0
  89. package/daemon/dist/domain/current-work.d.ts.map +1 -1
  90. package/daemon/dist/domain/current-work.js +165 -0
  91. package/daemon/dist/domain/current-work.js.map +1 -1
  92. package/daemon/dist/domain/gateway/connections-projection.d.ts +2 -0
  93. package/daemon/dist/domain/gateway/connections-projection.d.ts.map +1 -1
  94. package/daemon/dist/domain/gateway/connections-projection.js +3 -1
  95. package/daemon/dist/domain/gateway/connections-projection.js.map +1 -1
  96. package/daemon/dist/domain/gateway/gateway-subsystem.d.ts +3 -1
  97. package/daemon/dist/domain/gateway/gateway-subsystem.d.ts.map +1 -1
  98. package/daemon/dist/domain/gateway/gateway-subsystem.js +3 -1
  99. package/daemon/dist/domain/gateway/gateway-subsystem.js.map +1 -1
  100. package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
  101. package/daemon/dist/domain/gateway/slack/inbound.js +1 -0
  102. package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
  103. package/daemon/dist/domain/gateway/slack/queue-access.d.ts +5 -0
  104. package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
  105. package/daemon/dist/domain/gateway/slack/queue-access.js +6 -1
  106. package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
  107. package/daemon/dist/domain/gateway/slack/slack-api.d.ts +7 -2
  108. package/daemon/dist/domain/gateway/slack/slack-api.d.ts.map +1 -1
  109. package/daemon/dist/domain/gateway/slack/slack-api.js +35 -3
  110. package/daemon/dist/domain/gateway/slack/slack-api.js.map +1 -1
  111. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +4 -0
  112. package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
  113. package/daemon/dist/domain/gateway/slack/slack-delivery.js +16 -1
  114. package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
  115. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts +17 -0
  116. package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
  117. package/daemon/dist/domain/gateway/slack/slack-subsystem.js +92 -34
  118. package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
  119. package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts +37 -0
  120. package/daemon/dist/domain/gateway/slack/socket-inbound.d.ts.map +1 -1
  121. package/daemon/dist/domain/gateway/slack/socket-inbound.js +281 -38
  122. package/daemon/dist/domain/gateway/slack/socket-inbound.js.map +1 -1
  123. package/daemon/dist/domain/gateway/slack/state-store.d.ts +14 -1
  124. package/daemon/dist/domain/gateway/slack/state-store.d.ts.map +1 -1
  125. package/daemon/dist/domain/gateway/slack/state-store.js +16 -0
  126. package/daemon/dist/domain/gateway/slack/state-store.js.map +1 -1
  127. package/daemon/dist/domain/human-questions.d.ts +12 -3
  128. package/daemon/dist/domain/human-questions.d.ts.map +1 -1
  129. package/daemon/dist/domain/human-questions.js +10 -5
  130. package/daemon/dist/domain/human-questions.js.map +1 -1
  131. package/daemon/dist/domain/kernel-boot-tracker.d.ts +20 -1
  132. package/daemon/dist/domain/kernel-boot-tracker.d.ts.map +1 -1
  133. package/daemon/dist/domain/kernel-boot-tracker.js +66 -14
  134. package/daemon/dist/domain/kernel-boot-tracker.js.map +1 -1
  135. package/daemon/dist/domain/kernel-boot.d.ts +4 -0
  136. package/daemon/dist/domain/kernel-boot.d.ts.map +1 -1
  137. package/daemon/dist/domain/kernel-boot.js +26 -1
  138. package/daemon/dist/domain/kernel-boot.js.map +1 -1
  139. package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
  140. package/daemon/dist/domain/native-process-lineage.js +44 -9
  141. package/daemon/dist/domain/native-process-lineage.js.map +1 -1
  142. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  143. package/daemon/dist/domain/profile-resolver.js +54 -15
  144. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  145. package/daemon/dist/domain/queue-nudge-text.d.ts +4 -0
  146. package/daemon/dist/domain/queue-nudge-text.d.ts.map +1 -0
  147. package/daemon/dist/domain/queue-nudge-text.js +35 -0
  148. package/daemon/dist/domain/queue-nudge-text.js.map +1 -0
  149. package/daemon/dist/domain/queue-repository.d.ts +17 -0
  150. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  151. package/daemon/dist/domain/queue-repository.js +58 -7
  152. package/daemon/dist/domain/queue-repository.js.map +1 -1
  153. package/daemon/dist/domain/queue-transition-log.d.ts +12 -4
  154. package/daemon/dist/domain/queue-transition-log.d.ts.map +1 -1
  155. package/daemon/dist/domain/queue-transition-log.js +24 -0
  156. package/daemon/dist/domain/queue-transition-log.js.map +1 -1
  157. package/daemon/dist/domain/restore-orchestrator.d.ts +1 -0
  158. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  159. package/daemon/dist/domain/restore-orchestrator.js +17 -11
  160. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  161. package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
  162. package/daemon/dist/domain/rig-teardown.js +6 -0
  163. package/daemon/dist/domain/rig-teardown.js.map +1 -1
  164. package/daemon/dist/domain/scope/scope-approve.d.ts +21 -0
  165. package/daemon/dist/domain/scope/scope-approve.d.ts.map +1 -1
  166. package/daemon/dist/domain/scope/scope-approve.js +48 -4
  167. package/daemon/dist/domain/scope/scope-approve.js.map +1 -1
  168. package/daemon/dist/domain/session-transport.d.ts +12 -1
  169. package/daemon/dist/domain/session-transport.d.ts.map +1 -1
  170. package/daemon/dist/domain/session-transport.js +33 -7
  171. package/daemon/dist/domain/session-transport.js.map +1 -1
  172. package/daemon/dist/domain/skill-catalog.d.ts +11 -0
  173. package/daemon/dist/domain/skill-catalog.d.ts.map +1 -1
  174. package/daemon/dist/domain/skill-catalog.js +136 -12
  175. package/daemon/dist/domain/skill-catalog.js.map +1 -1
  176. package/daemon/dist/domain/workflow-validator.d.ts.map +1 -1
  177. package/daemon/dist/domain/workflow-validator.js +22 -1
  178. package/daemon/dist/domain/workflow-validator.js.map +1 -1
  179. package/daemon/dist/routes/gateway.d.ts.map +1 -1
  180. package/daemon/dist/routes/gateway.js +2 -0
  181. package/daemon/dist/routes/gateway.js.map +1 -1
  182. package/daemon/dist/routes/kernel-status.js +3 -1
  183. package/daemon/dist/routes/kernel-status.js.map +1 -1
  184. package/daemon/dist/routes/queue.d.ts.map +1 -1
  185. package/daemon/dist/routes/queue.js +17 -2
  186. package/daemon/dist/routes/queue.js.map +1 -1
  187. package/daemon/dist/routes/scope-approve.d.ts.map +1 -1
  188. package/daemon/dist/routes/scope-approve.js +3 -0
  189. package/daemon/dist/routes/scope-approve.js.map +1 -1
  190. package/daemon/dist/routes/sessions.js +1 -1
  191. package/daemon/dist/routes/sessions.js.map +1 -1
  192. package/daemon/docs/reference/agent-startup-guide.md +1 -1
  193. package/daemon/docs/reference/bundle-formats.md +1 -1
  194. package/daemon/docs/reference/getting-started.md +2 -2
  195. package/daemon/docs/reference/instance-layout.md +5 -0
  196. package/daemon/docs/reference/publishing-a-rig-bundle.md +4 -2
  197. package/daemon/docs/reference/refocus-channel.md +33 -0
  198. package/daemon/docs/reference/rig-spec.md +12 -9
  199. package/daemon/docs/reference/slack-app-setup.md +18 -1
  200. package/daemon/docs/reference/topology-naming.md +74 -0
  201. package/daemon/docs/reference/whats-new.md +71 -114
  202. package/daemon/specs/agents/shared/skills/core/cross-host-rig-commands/SKILL.md +1 -0
  203. package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +18 -4
  204. package/daemon/specs/agents/shared/skills/core/openrig-architect/SKILL.md +3 -0
  205. package/daemon/specs/agents/shared/skills/core/openrig-software-factory/references/worked-example.md +15 -14
  206. package/dist/build-info.js +3 -3
  207. package/dist/commands/chatroom.d.ts.map +1 -1
  208. package/dist/commands/chatroom.js +25 -5
  209. package/dist/commands/chatroom.js.map +1 -1
  210. package/dist/commands/context.d.ts.map +1 -1
  211. package/dist/commands/context.js +8 -0
  212. package/dist/commands/context.js.map +1 -1
  213. package/dist/commands/launch.d.ts.map +1 -1
  214. package/dist/commands/launch.js +114 -8
  215. package/dist/commands/launch.js.map +1 -1
  216. package/dist/commands/proof.js +1 -1
  217. package/dist/commands/proof.js.map +1 -1
  218. package/dist/commands/queue.d.ts.map +1 -1
  219. package/dist/commands/queue.js +3 -0
  220. package/dist/commands/queue.js.map +1 -1
  221. package/dist/commands/scope.d.ts.map +1 -1
  222. package/dist/commands/scope.js +11 -2
  223. package/dist/commands/scope.js.map +1 -1
  224. package/dist/commands/send.d.ts.map +1 -1
  225. package/dist/commands/send.js +23 -5
  226. package/dist/commands/send.js.map +1 -1
  227. package/dist/commands/skill.d.ts.map +1 -1
  228. package/dist/commands/skill.js +6 -0
  229. package/dist/commands/skill.js.map +1 -1
  230. package/dist/commands/slack.d.ts +17 -0
  231. package/dist/commands/slack.d.ts.map +1 -1
  232. package/dist/commands/slack.js +41 -0
  233. package/dist/commands/slack.js.map +1 -1
  234. package/dist/commands/status.d.ts.map +1 -1
  235. package/dist/commands/status.js +5 -0
  236. package/dist/commands/status.js.map +1 -1
  237. package/dist/cross-host-types.d.ts +1 -1
  238. package/dist/cross-host-types.d.ts.map +1 -1
  239. package/dist/launch-plan-guard.d.ts +27 -0
  240. package/dist/launch-plan-guard.d.ts.map +1 -0
  241. package/dist/launch-plan-guard.js +73 -0
  242. package/dist/launch-plan-guard.js.map +1 -0
  243. package/dist/lib/scope/scope-fs.d.ts +13 -0
  244. package/dist/lib/scope/scope-fs.d.ts.map +1 -1
  245. package/dist/lib/scope/scope-fs.js +28 -4
  246. package/dist/lib/scope/scope-fs.js.map +1 -1
  247. package/dist/remote-host-ops.d.ts +4 -0
  248. package/dist/remote-host-ops.d.ts.map +1 -1
  249. package/dist/remote-host-ops.js +20 -2
  250. package/dist/remote-host-ops.js.map +1 -1
  251. package/package.json +2 -2
  252. package/tui/dist/commands/registry.js +1 -1
  253. package/tui/dist/connections/connections-model.d.ts +5 -0
  254. package/tui/dist/connections/connections-model.d.ts.map +1 -1
  255. package/tui/dist/connections/connections-model.js +16 -1
  256. package/tui/dist/connections/connections-model.js.map +1 -1
  257. package/tui/dist/main.js +16 -4
  258. package/tui/dist/main.js.map +1 -1
  259. package/tui/dist/render.js +1 -1
  260. package/tui/dist/scopes/scopes-model.js +4 -4
  261. package/tui/dist/types.d.ts +1 -1
@@ -89,6 +89,39 @@ reports broken links as gaps rather than following pointers.
89
89
  This automatic hook path is additive to one-shot manual injection through
90
90
  `rig send --context`; neither mode substitutes for the other.
91
91
 
92
+ ## The work packet (switched off by default)
93
+
94
+ Set `OPENRIG_REFOCUS_WORK_PACKET=1` in a seat's harness environment so its
95
+ refocus carries the work it is actually doing as text rather than as pointers.
96
+ With the switch on:
97
+
98
+ - The hook asks `rig queue whoami --work-candidates` for labelled evidence.
99
+ That is each in-progress row's own `mission:` tag (a slice tag is optional),
100
+ or for an untagged row the nearest local handoff ancestor's mission, plus
101
+ blocked rows as held work and pending rows as possible next work. The
102
+ strict `currentWork` derivation is unchanged.
103
+ - One direct, resolved tag is shown as the work, labelled with its source so
104
+ the agent can correct a stale tag. Anything less certain lists every
105
+ candidate's one-line intent and asks the agent to name its mission (or to say
106
+ it has no current work), giving the `--work-start` route that then shows
107
+ that mission's intent as text. The project-level chain appears only as
108
+ labelled orientation.
109
+ - A tag that does not resolve on this host is named, never replaced. A
110
+ retargeted handoff or a remote ancestor gives no assumed mission. A mission
111
+ named only in body text is not evidence.
112
+ - The seat's `LEARNED.md` contributes its `MY JOB HERE` and `STANDING DUTIES`
113
+ sections, and notes and each node's `PROGRESS.md` contribute their
114
+ `Current state` section. When a file has
115
+ no such heading, the packet says so and shows a bounded excerpt. No heading
116
+ is required.
117
+ - A notes or `LEARNED.md` file older than
118
+ `OPENRIG_REFOCUS_NOTES_MAX_AGE_DAYS` (default 14) is named with its age, the
119
+ age's source (`updated:` frontmatter, else mtime) and the threshold: a cue
120
+ for judgment, not a staleness verdict.
121
+
122
+ `trace-to-root.py --packet --work-candidates <path|->` renders the same packet
123
+ by hand.
124
+
92
125
  ## Relation to chain files
93
126
 
94
127
  The chain files are the durable, altitude-addressed home of orientation
@@ -8,6 +8,9 @@ This is the canonical reference for the pod-aware RigSpec YAML format. Every fie
8
8
 
9
9
  ---
10
10
 
11
+ For choosing IDs, see [naming rigs, pods and seats](topology-naming.md). Keep the same
12
+ logical names in edges, startup instructions, workflow targets and runtime presets.
13
+
11
14
  ## Minimal Valid Example
12
15
 
13
16
  ```yaml
@@ -18,7 +21,7 @@ pods:
18
21
  - id: dev
19
22
  label: Development
20
23
  members:
21
- - id: impl
24
+ - id: build
22
25
  agent_ref: "local:agents/impl"
23
26
  profile: default
24
27
  runtime: claude-code
@@ -105,7 +108,7 @@ pods:
105
108
  required: true
106
109
  actions: []
107
110
  members:
108
- - id: impl
111
+ - id: build
109
112
  agent_ref: "local:agents/impl"
110
113
  profile: default
111
114
  runtime: claude-code
@@ -131,7 +134,7 @@ pods:
131
134
  cwd: "."
132
135
  edges:
133
136
  - kind: delegates_to
134
- from: impl
137
+ from: build
135
138
  to: qa
136
139
 
137
140
  - id: rev
@@ -152,13 +155,13 @@ pods:
152
155
  edges:
153
156
  - kind: delegates_to
154
157
  from: orch.lead
155
- to: dev.impl
158
+ to: dev.build
156
159
  - kind: delegates_to
157
160
  from: orch.peer
158
161
  to: dev.qa
159
162
  - kind: can_observe
160
163
  from: rev.r1
161
- to: dev.impl
164
+ to: dev.build
162
165
  - kind: can_observe
163
166
  from: rev.r2
164
167
  to: dev.qa
@@ -453,7 +456,7 @@ The canonical session name is derived from the pod ID, member ID, and rig name:
453
456
  {podId}-{memberId}@{rigName}
454
457
  ```
455
458
 
456
- Example: pod `dev`, member `impl`, rig `my-team` → session `dev-impl@my-team`
459
+ Example: pod `dev`, member `build`, rig `my-team` → session `dev-build@my-team`
457
460
 
458
461
  Pod and member IDs cannot contain `@` because the first `@` separates their portion
459
462
  of the session address from the rig name. Rig names may still contain `@`.
@@ -482,13 +485,13 @@ Edges within a pod use **unqualified member IDs** (just the member `id`, not `po
482
485
  pods:
483
486
  - id: dev
484
487
  members:
485
- - id: impl
488
+ - id: build
486
489
  # ...
487
490
  - id: qa
488
491
  # ...
489
492
  edges:
490
493
  - kind: delegates_to
491
- from: impl # NOT dev.impl
494
+ from: build # NOT dev.build
492
495
  to: qa # NOT dev.qa
493
496
  ```
494
497
 
@@ -502,7 +505,7 @@ Edges between pods use **fully-qualified `pod.member` IDs**:
502
505
  edges:
503
506
  - kind: delegates_to
504
507
  from: orch.lead # pod.member format
505
- to: dev.impl # pod.member format
508
+ to: dev.build # pod.member format
506
509
  ```
507
510
 
508
511
  Cross-pod edges must reference different pods. An edge where both `from` and `to` are in the same pod is a validation error — use pod-local edges instead.
@@ -99,6 +99,16 @@ clicks arrive over the same socket, so no request URL is needed. An app created
99
99
  manifest has Interactivity off: turn it on under **Interactivity & Shortcuts**, or the buttons
100
100
  will do nothing. A typed reply in the thread still answers the decision either way.
101
101
 
102
+ In the decision's `humanAnswers`, clicked answers remain option-id strings. A whole typed reply
103
+ is stored as `{kind: "typed-reply", text: "…", placement: "first-unanswered", unansweredCount: N}`
104
+ under the first unanswered question. That placement is automatic; it does not mean the person
105
+ selected that question. `N` counts the other question slots still empty in `humanAnswers` after
106
+ that placement. Earlier button answers are preserved; no other questions are filled in.
107
+ Read `text` as the person's words,
108
+ even when it equals an option id. The reply still closes the decision, so `done` is not approval.
109
+ A file-only reply closes the decision without recording a typed answer. If all button answers were
110
+ already recorded, they stay final and the typed reply remains in the correlated reply row.
111
+
102
112
  ## What the connector does with the tokens
103
113
 
104
114
  The tokens stay in the env file you created. The connector reads them from that file and uses them
@@ -140,8 +150,12 @@ rig slack channel-map remove pr@my-rig
140
150
  Without a map, OpenRig records nothing about a post's channel, so if the default channel
141
151
  changes while a post is being retried, the retry goes to the new default channel (as it always
142
152
  has); that also applies to a post first tried before the map was added.
153
+ - **Rate limits on posts.** When Slack rate-limits a post and asks for a pause of 10 seconds or
154
+ less, OpenRig waits that long and retries the post once. A longer pause, or a second refusal,
155
+ is left to the retry of retained posts.
143
156
  - **Replies and new messages.** A reply in an item's thread reaches that item's seat, in any
144
- channel. A message the human starts (or a reply in a thread OpenRig does not know) goes to
157
+ channel. To answer it in the same thread, the seat sends `rig queue create --human-intent update
158
+ --reply-to <the inbound reply's row>`. A message the human starts (or a reply in a thread OpenRig does not know) goes to
145
159
  the connector's inbound destination, whichever channel it is in. Missed-message recovery
146
160
  (below) covers the default channel only.
147
161
 
@@ -191,6 +205,9 @@ outside this recovery scope; global chronological order is not promised.
191
205
  snapshot: socket state/generation, last event, recovery interval/state/reason,
192
206
  retry time and accepted/dead-lettered recovery counts since the connector last
193
207
  started (they reset when it is enabled or disabled, and when the daemon restarts).
208
+ It also reports the durable dead-letter backlog: the retained records for inbound messages,
209
+ reactions and click answers that await retry, counted from both dead-letter files so the number
210
+ survives a restart, and shown as unknown with a reason (and no count) when a file cannot be read.
194
211
  Human-readable coverage and pending bounds use ISO timestamps; JSON keeps Slack timestamps.
195
212
  The status read calls no Slack API and starts no scan. If the daemon cannot be
196
213
  observed, local configuration remains visible and live state is unknown. A
@@ -0,0 +1,74 @@
1
+ # Naming rigs, pods and seats
2
+
3
+ Names tell people and agents what a team does and who does each part. Use the
4
+ team's purpose for the rig, a domain for each pod, and a role for each seat.
5
+ These are authoring conventions, not additional parser restrictions.
6
+
7
+ ## What each name means
8
+
9
+ | Level | Meaning | Example |
10
+ | --- | --- | --- |
11
+ | Fleet | A group of OpenRig instances | Your development fleet |
12
+ | Instance | One daemon and its rigs; several instances can share a machine | The instance selected by a registered host route |
13
+ | Rig | A team or project purpose | `starter`, `workshop`, `factory`, or your project's name |
14
+ | Pod | A domain or shared context | `orch`, `dev`, `review`, `research`, `sre` |
15
+ | Seat (member) | A role within that pod | `lead`, `advisor`, `build`, `qa`, `design`, `review` |
16
+
17
+ The logical seat ID is `pod.member`: `dev.build`. Its session address is
18
+ `pod-member@rig`: `dev-build@workshop`. A cross-instance command also selects the
19
+ registered host route; a display label is not a route. Discover actual addresses
20
+ with `rig ps --nodes` and host routes with `rig host list` before sending work.
21
+
22
+ Runtime, model and account belong in configuration. Changing a provider does not
23
+ change the role's name. Keep machine and instance identifiers stable rather than
24
+ renaming them whenever their workload changes.
25
+
26
+ ## How the software teams grow
27
+
28
+ | Team | Logical seats |
29
+ | --- | --- |
30
+ | Starter | `dev.build`, `dev.review` |
31
+ | Workshop | `orch.lead`, `dev.build`, `dev.qa`, `dev.review` |
32
+ | Factory | `orch.lead`, `orch.advisor`, `dev.build`, `dev.qa`, `dev.design`, `review.r1`, `review.r2` |
33
+
34
+ Starter and Factory are built-in teams. Workshop is a
35
+ [bundle](https://github.com/mvschwarz/openrig-world/tree/main/rigs/workshop).
36
+ The built-in specs live under `packages/daemon/specs/rigs/launch/` in the product
37
+ source. Runtime presets keep these logical names.
38
+
39
+ Workshop's one code reviewer is `dev.review`; Factory has an independent review
40
+ pod with `review.r1` and `review.r2`. Both are intentional. A small team does not
41
+ need every pod or role from a larger one.
42
+
43
+ ## Name a new team
44
+
45
+ Start with the outcome, then group its work by domain. For a team studying a
46
+ dataset, `research.analyst` and `research.synthesizer` describe useful roles.
47
+ For operating a service, `sre.admin` describes the domain and responsibility.
48
+ Use a project-specific rig name when that helps distinguish two teams.
49
+
50
+ Avoid a generic operation such as `check` as the pod name: it does not say whether
51
+ the team owns software quality, research validation or service health. Put the
52
+ role in its domain, such as `dev.qa`. This is a rule for choosing new names, not a
53
+ word blacklist or a demand that all teams share one roster.
54
+
55
+ Use the same IDs in the rig spec, edges, workflow targets, configuration presets,
56
+ startup instructions and terminal views. Validate those references together.
57
+ See [RigSpec](rig-spec.md) and [publishing a bundle](publishing-a-rig-bundle.md).
58
+
59
+ ## Existing identities and retained references
60
+
61
+ An existing team's address remains its actual address until it is deliberately
62
+ migrated. Changing a label does not rename a seat or move its conversation, queue
63
+ or work. Preserve those records and verify the new routes when doing a migration;
64
+ do not edit a database or restart a team just to make a display match an example.
65
+
66
+ `first-project` is the compatibility name for Starter; it is not a second team
67
+ template. Existing-name safeguards still apply. See
68
+ [getting started](getting-started.md) before using the alias.
69
+
70
+ The `factory-rsi` bundle is a retained reference with original workflow-bound
71
+ addresses, including `build.implementer` and `check.qa`. It is distinct from the
72
+ current built-in Factory and is not the naming template for a new team. Old
73
+ release notes, pinned bundles, run records and compatibility tests keep the
74
+ identities they describe.
@@ -1,128 +1,85 @@
1
- # What changed in OpenRig 0.6.7
1
+ # What changed in OpenRig 0.6.9
2
2
 
3
- This note is for an agent on an install that was just upgraded to 0.6.7. It lists only what behaves differently from
4
- 0.6.6 and what to do about it. For everything OpenRig can do, read the capability map:
3
+ This note is for an agent on an install that was just upgraded to 0.6.9. It lists only what behaves differently from
4
+ 0.6.8 and what to do about it. For everything OpenRig can do, read the capability map:
5
5
  `rig context get onboarding-width/public-what-you-can-do.md`. Each release replaces this file, so
6
6
  `rig context get reference/whats-new.md` describes the installed version once the upgraded daemon is running. Without
7
7
  a running daemon, read `$OPENRIG_HOME/reference/whats-new.md`. The daemon refreshes that copy when it starts, so right
8
8
  after an upgrade it can still hold the previous version's note.
9
9
 
10
- ## The OpenRig view is now the handoff
11
-
12
- - **Open the view as the step after install or start; don't wait to be asked.** Say you're opening it, run
13
- `rig terminal open saved:kernel --window`, then tell the person where it opened. Don't ask "Open the OpenRig view
14
- now?", don't wait for a phrase like "show me my agents", and don't finish by printing a command for them to copy. The
15
- same command brings their agents back later.
16
- - **The layout follows the person's terminal width.** On a narrow terminal the operator gets the first tab. On a wide
17
- one the dashboard and operator sit side by side and the advisor has its own tab. Inside herdr it opens a focused
18
- `openrig kernel` space. A `kernel` view the person saved themselves still wins.
19
- - **It opens where the caller is.** Terminal gets a window and Ghostty a tab. From Claude Desktop, iTerm or VS Code on a
20
- Mac it opens a new Ghostty or Terminal window, and macOS may ask to allow it: mention that clicking Allow is fine only
21
- in that case. Over SSH, in CI or with no display, it returns a definite no-window result with the reason. Relay the
22
- `run:` command it prints exactly, or give `env -u TMUX tmux attach-session -t '=<canonicalSessionName>'` for the
23
- operator.
24
- - **`rig terminal open <view>` opens a window by default.** Pass `--provider herdr` or `--provider cmux` only to add
25
- tiles to a workspace that's already visible. With `--json`, `reusedWorkspace` and `opened: []` mean an existing view
26
- was reused, which is success.
27
- - **The TUI's action is now "Open terminals ▸"** (it was `term ▸`). It opens a desktop window through the same
28
- launcher, so the TUI must run on the daemon's desktop.
29
- - **The `rigs` skill is installed for the person's own agent.** The daemon writes it to `~/.claude/skills/rigs` and
30
- `~/.agents/skills/rigs` and refreshes it on every upgrade. It now triggers on any mention of OpenRig, rigs or a team
31
- of coding agents. A copy added earlier with skills.sh is left alone and never refreshed.
32
-
33
- ## Installing and setting up
34
-
35
- - **Show the install preview first.** The published install command has a `--dry-run` preview
36
- (`rig context get reference/getting-started.md` has both forms). Run the install when the person agrees. If the only
37
- failures left are provider sign-ins, have them sign in and continue at "Start the kernel".
38
- - **If your own harness refuses a tool call while installing,** say so and show the refusal: Claude Code's auto mode can
39
- deny calls as well as approve them. Let the person review it in their harness or run that step themselves. A refused
40
- call doesn't prove the OpenRig command failed.
41
- - **`rig setup` installs herdr by default** on macOS and Linux; `--no-herdr` declines it. On a Mac, ask once about
42
- Ghostty and on yes rerun `rig setup --ghostty`, keeping `--no-herdr` if it was chosen. Setup no longer installs cmux,
43
- and an existing cmux still works. In `--json` output the `cmux_install` step is gone and `herdr_install` and
44
- `ghostty_install` appear.
45
- - **`rig doctor` checks Claude and Codex installs, and a login or configured provider credential,** the way setup does.
46
- It exits 1 when either harness is missing or has neither, including one the person doesn't use, so ignore a failure
47
- on an unused harness. A pass means a login or configured provider credential is available locally, not that a
48
- provider accepts the credential or that an agent can work; no provider request or agent work is tested.
49
- - **When setting up permissions,** recommend keeping the team default and offer remembered allowances only if the
50
- person wants fewer prompts. People slowed by prompts can be pointed to the workshop listing.
51
- - **Windows users go through WSL2.** For Pi seats there, offer either credential route; a global Pi login still isn't
52
- shared with managed seats.
53
-
54
- ## Fewer prompts
55
-
56
- - **In Claude team seats, help on lifecycle commands runs without a prompt.** `rig down --help` and `-h` forms run;
57
- the lifecycle actions themselves still ask. Pipelines, command substitutions, redirects and heredocs aren't allowed
58
- automatically.
59
- - **The kernel operator's Claude session runs routine inspection without prompts:** Python, command lookup, `cd`, text
60
- helpers and WebFetch. Compound commands and redirects still go to Claude's own permission check.
61
- - **Managed Codex seats no longer stop at the update menu on start.** Updating Codex is the operator's job: if a Codex
62
- seat says its model needs a newer Codex, offer to update Codex and restart that seat, without stopping the team. If a
63
- Codex seat shows a model-switch menu near a rate limit, ask the person; don't change the team's model.
64
-
65
- ## Messages, wakes and Slack
66
-
67
- - **A send or wake no longer answers a question that's waiting for a person.** It's refused with
68
- `target_needs_input`, and the reason ends `; latest hook, pane unrecognized` when the screen can't be read, even if
69
- the hook is minutes old. Read the seat with `rig capture` and get the question answered by whoever should answer it.
70
- Don't retry the send.
71
- - **Slack can post to a channel per rig or seat:** `rig slack channel-map list`, `set <match> <channel>` and
72
- `remove <match>`. After a change, invite the app to each channel, run `rig slack verify`, then `rig slack disable`
73
- and `rig slack enable` (or restart the daemon). Thread replies still reach the seat in any channel.
74
- - **A reaction on any part of a Slack ask reaches the seat that asked,** as a task tagged `human-reaction`. Treat it as
75
- a signal to interpret, not an answer; the ask stays open. An existing app needs the `reactions:read` scope, the
76
- `reaction_added` event and a reinstall, and `rig slack verify` warns when the scope is missing.
77
- - **A long Slack ask is posted in parts.** If it still can't be posted, you get a task `<ask id>-undeliverable`, tagged
78
- `slack-undeliverable`: shorten the ask or link a file for the long part, and send it as a new ask.
79
- - **Replies sent with "Also send to #channel" now arrive** at the seat that asked, like any other thread reply.
80
-
81
- ## Running teams
82
-
83
- - **`rig down` prints what each agent seemed to be doing before it stops them,** on one stderr line, or "unknown". It's
84
- a best-effort snapshot, not a record of what was interrupted. `rig down --host` now exits 2 when the remote teardown
85
- reports errors.
86
- - **Before a handover or compaction, write the seat's recap** with
87
- `rig context recap-write --rig <rig> --seat <seat> --file <draft.md>`, not a file tool, so earlier recaps are kept.
88
- `rig seat handover <seat>` now works on the same seat again and again; a seat left half-handed-over recovers by
89
- running it again.
90
- - **After a managed compaction, read the `refocusing` skill and consume the current topology and work traces
91
- delivered with the restore.** Don't rerun them just to duplicate the delivery; name a missing trace. For a new trace
92
- outside that context, use the skill's one-command form. The daemon now installs the skill globally.
93
- - **The built-in starter and factory leads publish their team's roster** at first start, so `rig roster list` and
94
- `rig roster find <topic>` know those teams.
95
- - **Claiming a parked queue item clears its `blocked_on`.** To park it again on the same gate, run
96
- `rig queue update <id> --state blocked` without `--blocked-on`: it reuses the previous gate. Add the usual wake when
97
- one is required.
98
- - **A periodic reminder first fires one interval after you register it,** not immediately.
99
- - **Workflows:** `rig workflow run` and `rig workflow watch` exit 3 for an aborted instance. When a step that was sent
100
- back completes again, the steps that depend on it run again too, including ones that had passed.
101
- - **Sharing teams:** `rig bundle create` and `rig up <link>` name the bundle after `rig.yaml`'s `name`, and
102
- `rig bundle check` names the file in each finding. Submissions go to `mvschwarz/openrig-registry`. The bundle safety
103
- check always runs, even with `--skip-version-check --force`.
104
- - **`rig context add <url> --git` retrieves shallowly by default:** the initial retrieval fetches only the current
105
- commit, and a server that refuses shallow retrieval falls back to a full clone with a warning. Use
106
- `rig context source update` for later revisions.
107
- - **Values that used to fail quietly are refused:** a bad `rig chatroom history --since` (fix the value; the room isn't
108
- empty) and a `--wake-after` such as `7d` (use hours, for example `168h`).
109
- - **Pi seats print a `[pi-runner] seat …:` line at start** saying whether a credential was found and, if not, how to
110
- fix it. A MiniMax model gets `MINIMAX_API_KEY` when that name is in `recovery.provider_auth_env_allowlist`.
111
- - **`agents.advisor_session` defaults to the kernel's advisor seat.**
10
+ ## Slack
11
+
12
+ - **A typed reply to a decision with structured questions is kept.** It's recorded on the row in `humanAnswers` as a
13
+ tagged entry (`kind: "typed-reply"`), placed under the first unanswered question, with the count of questions still
14
+ unanswered. A clicked answer is still the option's ID. Typed text that matches an option's ID is never read as clicking
15
+ it. The decision still closes, and closing doesn't mean approval: read the reply and its placement before acting. The
16
+ `messaging-the-human` skill says how.
17
+ - **`rig slack status` shows the inbound retry backlog:** how many retained records for inbound messages, reactions
18
+ and click answers are waiting to be retried, kept across restarts. This counts records, not distinct messages.
19
+ If the records can't be read, the line says the count is unknown and why; it never reads as an empty backlog.
20
+ - **An alert retried after its row closed isn't posted.** A Slack post that failed is kept and retried when the gateway
21
+ next starts. If the row has left the active states by then, the alert is dropped and the row records
22
+ `slack-owner-notification-dropped … reason=row-not-active`. Alerts for rows still open, decision-resolved notices and
23
+ digests still post. `rig slack enable` says how many earlier undelivered posts wait to be retried.
24
+ - **"Connected" is no longer the only word about the Slack connection.** OpenRig now notices a connection that stays
25
+ open while Slack stops delivering events to it, and replaces it: a new connection opens first, then the old one
26
+ closes. Two signals catch it, each counted only once the connection has shown it: Slack's server pings stopping for
27
+ 30 seconds, and two of OpenRig's own posts not coming back as events within a minute. Automatic replacements are at
28
+ most one every 5 minutes; Slack's own refresh requests are exempt.
29
+ - **Read delivery beside the socket state.** `rig slack status` adds a `Delivery:` line (`delivering`, `not yet
30
+ confirmed`, `events missing since …`, `no server pings since …`, or Socket Mode disabled), the last automatic
31
+ reconnect and why, a held-back reconnect and until when, and Slack's connection count when it's more than ours. The
32
+ connections view shows `connected; delivering` or `connected; delivery not yet confirmed`. Report "not yet
33
+ confirmed" as that, never as working.
34
+
35
+ ## Sends and waits
36
+
37
+ - **A cross-host send that may have arrived reads as unconfirmed, not failed.** `rig send <session> --host <id>` to an
38
+ http-registered host now has a 30-second request budget, plus any `--wait-for-idle` time. When the answer doesn't come back, or the connection drops after the
39
+ request went out, the send exits 1 with `failedStep: "remote-outcome-unknown"` and "Delivery UNCONFIRMED". **Check the
40
+ target with `rig capture <session> --host <id>` before any resend**; a blind resend can deliver twice. Only a host
41
+ that was never reached reads as unreachable.
42
+ - **`rig chatroom wait` keeps waiting through a slow or restarting daemon.** Poll timeouts, connection refusals, and
43
+ reset or closed connections are retried until your `--timeout`; the first failure in a run prints a line on stderr.
44
+ Other errors, including an error answer from the daemon such as a removed rig, still end the wait. If the last
45
+ recorded poll failure remains unresolved at the deadline, the timeout says new messages may have arrived unseen.
46
+
47
+ ## Kernel status
48
+
49
+ - **A kernel that recovered from a failed start reads ready.** When every declared kernel seat reports ready, for
50
+ example after `rig seat continue`, `rig status` says so and adds an indented line naming the earlier failure and
51
+ when it happened. `GET /api/kernel/status` returns that as `last_boot_failure`. The kernel's agent list shows each
52
+ seat once, with its runtime.
53
+
54
+ ## Scope approval
55
+
56
+ - **`rig scope <tier> approve --workspace <path>` stamps the work tree you named.** Before, it reported success while
57
+ the stamp landed in the daemon's own work tree. A named workspace with no `missions/` folder is now refused instead
58
+ of falling back to the configured one. The approval record names the root it wrote under.
59
+
60
+ ## Claude seats on NixOS
61
+
62
+ - **A Claude Code installed from nixpkgs is recognised as the seat's runtime,** so its seats read `running` and sends
63
+ no longer warn that the runtime couldn't be established. A seat that still carries an attention marker from an
64
+ earlier failed launch keeps it: clear it with `rig seat clear-attention <seat>`.
65
+
66
+ ## A correction to the 0.6.8 note
67
+
68
+ - **`rig launch` takes a rig ID, not a rig name.** The 0.6.8 note wrote `rig launch <rig> <seat> --plan`. Read the ID
69
+ from `rig ps --json`; a name gives `rig_not_found`.
112
70
 
113
71
  ## What to stop doing
114
72
 
115
- - **Stop asking whether to open the OpenRig view, or waiting for a phrase.** Open it after install or start.
116
- - **Stop using `--provider herdr` for the first view,** and stop pre-warning about macOS prompts from Terminal or
117
- Ghostty.
118
- - **Stop suggesting `--skip-version-check --force` to get past a bundle pre-check failure.** The check always runs.
119
- - **Stop retrying a send refused with `target_needs_input`.** Get the question answered instead.
120
- - **Stop telling people to untick "Also send to #channel" when they answer in Slack.** Those replies now arrive.
73
+ - **Stop resending a cross-host message after a timeout.** Check the target first; the first send may have arrived.
74
+ - **Stop restarting a kernel whose status read `bootstrap_failed` after its seats recovered.** Read `rig status`
75
+ again on 0.6.9; a recovered kernel reads ready.
76
+ - **Stop passing a rig's name to `rig launch`.** Pass its ID.
121
77
 
122
- ## Known gaps in 0.6.7
78
+ ## Known gaps in 0.6.9
123
79
 
124
- - **Not yet checked on a real machine:** opening the view from Claude Desktop, and the plain-tmux layout without herdr.
125
- The full first install from nothing and a Linux run come after this release.
80
+ - **The latest first-install check used 0.6.8 on a fresh Mac account in Terminal,** with assistance to install the
81
+ candidate. It reached setup, the kernel window and a team plan; team launch and work weren't exercised.
82
+ Linux and Windows first installs remain unchecked in the evidence behind this note.
126
83
  - **Only one selected lifecycle-help command has been checked in a live Claude session;** source and parser coverage
127
84
  is broader. If a help command still asks, report it.
128
85
  - **Codex team seats aren't asked before lifecycle commands yet.**
@@ -85,6 +85,7 @@ A local success message alone does not establish remote persistence or pickup.
85
85
  | ssh-unreachable | SSH connection, target and transport diagnostics |
86
86
  | permission-gate | The configured SSH or HTTP credentials and target policy |
87
87
  | remote-daemon-unreachable | Target listener and actual running daemon identity |
88
+ | remote-outcome-unknown | The request may have arrived (timeout, dropped connection, unreadable reply): check its effect, for a send the target pane, before any retry |
88
89
  | remote-command-not-found | Remote CLI installation and executable lookup |
89
90
  | remote-command-failed | The remote operation's own status and error |
90
91
 
@@ -92,16 +92,30 @@ the human (a pending human decision, or a row parked on the human), since a
92
92
  reply in that thread would answer the decision. In every such case the
93
93
  `--verify` result says `threaded: false` with the reason.
94
94
 
95
+ To answer a reply the human typed inside one of your threads, `--reply-to` the
96
+ row their reply landed as. The update posts in that thread unless one of the
97
+ cases above applies, and `--verify` reports it the same way. A message the
98
+ human started at the top level of the channel has no thread yet, so the answer
99
+ posts as a new message.
100
+
95
101
  A **decision** with a few clear choices can carry `--human-questions-file <path>`:
96
102
  a JSON array of 1–4 questions, each
97
103
  `{"id", "question", "options": [{"id", "label", "recommended"?}]}` with 2–4
98
104
  options (labels up to 75 characters, at most one recommended). Slack shows each
99
105
  question as a row of buttons. Each click records that answer on the item, and
100
106
  the decision resolves once every question has one. You then receive one reply
101
- row listing the answers, and the item's `humanAnswers` holds the option ids. The
102
- human may instead type a reply in the thread; that resolves the decision as
103
- usual, so read the reply rather than assuming an option was picked. Keep the
104
- brief complete: the questions add buttons, they do not replace the explanation.
107
+ row listing the answers. In `humanAnswers`, clicked answers are option-id strings.
108
+ A whole typed reply is an object:
109
+ `{kind: "typed-reply", text: "…", placement: "first-unanswered", unansweredCount: N}`.
110
+ It is placed automatically under the first unanswered question; the person did
111
+ not select that question. `N` counts the other question slots still empty in
112
+ `humanAnswers` after that placement.
113
+ Earlier button answers stay intact. Read `text` as the person's words, never as
114
+ an option id even if the strings match. The typed reply still closes the decision
115
+ with the other questions unanswered; `done` is not approval. If every button
116
+ answer was already recorded, that final answer set stays intact and the typed
117
+ reply remains in its correlated reply row. Keep the brief complete: the questions
118
+ add buttons, they do not replace the explanation.
105
119
 
106
120
  If an existing agent-owned row must wait for a **decision**, block it on the **new live qitem ID**
107
121
  (`rig queue block <work-id> --on <human-qitem-id> ...`), not on the human address.
@@ -39,6 +39,9 @@ the format you will author. Load the selected paths from public onboarding;
39
39
  consult additional skills when their triggers apply. A design task does not
40
40
  require reading the whole command library.
41
41
 
42
+ - Read `topology-naming.md` before choosing new identities: rig = purpose, pod =
43
+ domain, member = role. Keep names stable across runtime choices and match every
44
+ edge, preset and workflow target to the declared IDs.
42
45
  - Read the relevant sections of `rig-spec.md` and `agent-spec.md` before writing
43
46
  those declarations. Consult `agent-startup-guide.md` for startup/loadout work
44
47
  and `edge-types.md` when selecting relationships. Resolve the installed
@@ -120,25 +120,26 @@ rig grow --help
120
120
 
121
121
  Set `RIG_ID` to the `rigId` for the running `starter`, and `PROJECT_ROOT`
122
122
  to the absolute code repository. Verify its existing `dev` pod and choose unused
123
- member names. When the user has authorized the added capacity and cost, run:
123
+ member names. Here `parser` owns CSV parsing and `cli` owns the command interface.
124
+ When the user has authorized the added capacity and cost, run:
124
125
 
125
126
  ```sh
126
- rig grow "$RIG_ID" a b --pod dev --runtime codex --cwd "$PROJECT_ROOT" --json
127
+ rig grow "$RIG_ID" parser cli --pod dev --runtime codex --cwd "$PROJECT_ROOT" --json
127
128
  rig ps --nodes --rig starter --json
128
129
  ```
129
130
 
130
- For one builder, omit `b`. The expected new logical IDs are `dev.a` and `dev.b`,
131
- with addresses `dev-a@starter` and `dev-b@starter`; use the actual
131
+ For one builder, omit `cli`. The expected new logical IDs are `dev.parser` and `dev.cli`,
132
+ with addresses `dev-parser@starter` and `dev-cli@starter`; use the actual
132
133
  returned identities. The command adds and launches the named seats.
133
134
 
134
135
  To put those seats in a **new** pod instead, choose this alternative once, with an
135
- unused pod ID; do not run both examples for the same desired capacity:
136
+ unused domain pod such as `data`; do not run both examples for the same desired capacity:
136
137
 
137
138
  ```sh
138
- rig grow "$RIG_ID" a b --new-pod build --runtime codex --cwd "$PROJECT_ROOT" --json
139
+ rig grow "$RIG_ID" parser cli --new-pod data --runtime codex --cwd "$PROJECT_ROOT" --json
139
140
  ```
140
141
 
141
- That alternative produces `build.a`/`build.b` and corresponding `build-...`
142
+ That alternative produces `data.parser`/`data.cli` and corresponding `data-...`
142
143
  addresses. `--pod` and `--new-pod` are mutually exclusive. With one existing pod,
143
144
  `--pod` can be inferred; select it explicitly when the intended target matters.
144
145
  The runtime defaults to `claude-code` and cwd defaults to the caller's current
@@ -153,7 +154,7 @@ agent specs, use the optional Architect path below and `rig expand --help`.
153
154
  Inspect each node's status/error and native pane. Confirm existing seats and work
154
155
  remain present; a created node is not readiness. Partial results can leave nodes
155
156
  persisted. After a timeout, reconcile topology before retrying. Fix the reported
156
- cause, then use `rig launch "$RIG_ID" dev.a` only for an already-created seat that
157
+ cause, then use `rig launch "$RIG_ID" dev.parser` only for an already-created seat that
157
158
  failed to start. That command does not create a missing seat.
158
159
 
159
160
  New seats do not inherit the owner's conversation or task. Record the agreed
@@ -163,8 +164,8 @@ checks, next owner and stopping condition. Then deliver the context instruction,
163
164
  for example for the first builder:
164
165
 
165
166
  ```sh
166
- rig send dev-a@starter "Read $PROJECT_ROOT/SPEC.md and the addressed sources in $PROJECT_ROOT/.openrig/factory/TASK-A.md. Run rig whoami --json and rig queue list --owned --json in your own seat; report your identity, scope and any native readiness/permission blocker. Await the bounded queue assignment."
167
- rig capture dev-a@starter
167
+ rig send dev-parser@starter "Read $PROJECT_ROOT/SPEC.md and the addressed sources in $PROJECT_ROOT/.openrig/factory/TASK-A.md. Run rig whoami --json and rig queue list --owned --json in your own seat; report your identity, scope and any native readiness/permission blocker. Await the bounded queue assignment."
168
+ rig capture dev-parser@starter
168
169
  ```
169
170
 
170
171
  Read the actual reply and pane; resolve startup/login/permission prompts under the
@@ -174,7 +175,7 @@ the coordinator creates the distinct agreed task (or hands off an existing owned
174
175
  task instead of duplicating it):
175
176
 
176
177
  ```sh
177
- rig queue create --destination dev-a@starter \
178
+ rig queue create --destination dev-parser@starter \
178
179
  --body-file "$PROJECT_ROOT/.openrig/factory/TASK-A.md" \
179
180
  --summary 'Implement the agreed independent change A' --json
180
181
  ```
@@ -191,7 +192,7 @@ working agreement and assigned work, not the seat's name or default agent label.
191
192
  | Seat in this example | Deliberately agreed responsibility |
192
193
  | --- | --- |
193
194
  | `dev-build@starter` | Initially implements and coordinates; can become the dedicated orchestrator, selecting outcomes, separating tasks, owning integration and retaining next-work custody. |
194
- | `dev-a@starter`, `dev-b@starter` | Implement distinct authorized tasks and return exact candidates/evidence. Neither silently edits the other's files or folds both candidates without integration ownership. |
195
+ | `dev-parser@starter`, `dev-cli@starter` | Implement distinct authorized tasks and return exact candidates/evidence. Neither silently edits the other's files or folds both candidates without integration ownership. |
195
196
  | `dev-review@starter` | Retains independent judgment under the project's review policy. The implementer does not count its own check as independent review. |
196
197
 
197
198
  This is one progression, not a required four-seat layout. One extra builder may
@@ -240,8 +241,8 @@ YAML authoring is optional; ordinary growth uses the commands above.
240
241
  ### Remove capacity deliberately
241
242
 
242
243
  When a seat is no longer needed, preserve its work and next owner first.
243
- `rig remove "$RIG_ID" dev.a` removes that seat; `rig shrink "$RIG_ID" build`
244
- removes the whole optional build pod. These end the affected sessions. Removal
244
+ `rig remove "$RIG_ID" dev.parser` removes that seat; `rig shrink "$RIG_ID" data`
245
+ removes the whole optional data pod. These end the affected sessions. Removal
245
246
  refuses active work unless you explicitly select a live `--fallback <live-seat>`
246
247
  to receive it. Check the exact targets, handoff and returned outcomes; do not use
247
248
  fallback to discard an obligation or remove seats merely because they look idle.
@@ -1,9 +1,9 @@
1
1
  // GENERATED by scripts/build-package.sh — the packaged build-identity stamp.
2
2
  export const BUILD_INFO = {
3
- semver: "0.6.7",
4
- commit: "b3c3c8575f2a646c07ecc49bbf07927473effc9d",
3
+ semver: "0.6.9",
4
+ commit: "4b48ca21a9bd072aa05a08b3da6d9c0708e093c5",
5
5
  dirty: false,
6
- builtAt: "2026-10-08T11:56:22Z",
6
+ builtAt: "2026-10-09T08:59:39Z",
7
7
  };
8
8
  export function stampFields(info = BUILD_INFO) {
9
9
  if (!info.commit) return {};