@openrig/cli 0.6.13 → 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 (151) hide show
  1. package/README.md +54 -6
  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/skills/openrig-user/SKILL.md +11 -3
  5. package/daemon/assets/plugins/openrig-core/skills/refocusing/scripts/trace-to-root.py +12 -32
  6. package/daemon/context-packs/help/manifest.yaml +1 -1
  7. package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
  8. package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +17 -5
  9. package/daemon/context-packs/reference/getting-started.md +93 -16
  10. package/daemon/context-packs/reference/manifest.yaml +1 -1
  11. package/daemon/context-packs/reference/whats-new.md +64 -93
  12. package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
  13. package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
  14. package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
  15. package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
  16. package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
  17. package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
  18. package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
  19. package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
  20. package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
  21. package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
  22. package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
  23. package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
  24. package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
  25. package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
  26. package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
  27. package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
  28. package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
  29. package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
  30. package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
  31. package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
  32. package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
  33. package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
  34. package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
  35. package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
  36. package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
  37. package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
  38. package/daemon/context-packs/skills/openrig-user/SKILL.md +11 -3
  39. package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
  40. package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
  41. package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
  42. package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
  43. package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
  44. package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
  45. package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
  46. package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
  47. package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
  48. package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
  49. package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
  50. package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
  51. package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
  52. package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
  53. package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
  54. package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
  55. package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
  56. package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
  57. package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
  58. package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
  59. package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
  60. package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
  61. package/daemon/context-packs/skills/refocusing/scripts/trace-to-root.py +12 -32
  62. package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
  63. package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
  64. package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
  65. package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
  66. package/daemon/context-packs/world-example/manifest.yaml +1 -1
  67. package/daemon/context-packs/world-public/manifest.yaml +1 -1
  68. package/daemon/dist/adapters/tmux.js +1 -1
  69. package/daemon/dist/adapters/tmux.js.map +1 -1
  70. package/daemon/dist/build-info.js +3 -3
  71. package/daemon/dist/domain/claim-service.d.ts +9 -18
  72. package/daemon/dist/domain/claim-service.d.ts.map +1 -1
  73. package/daemon/dist/domain/claim-service.js +83 -0
  74. package/daemon/dist/domain/claim-service.js.map +1 -1
  75. package/daemon/dist/domain/claude-compaction-enforcer.d.ts +2 -2
  76. package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
  77. package/daemon/dist/domain/claude-compaction-enforcer.js +20 -14
  78. package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
  79. package/daemon/dist/domain/fresh-occupant-relation.d.ts.map +1 -1
  80. package/daemon/dist/domain/fresh-occupant-relation.js +2 -1
  81. package/daemon/dist/domain/fresh-occupant-relation.js.map +1 -1
  82. package/daemon/dist/domain/topology-converge.d.ts +1 -0
  83. package/daemon/dist/domain/topology-converge.d.ts.map +1 -1
  84. package/daemon/dist/domain/topology-converge.js +1 -0
  85. package/daemon/dist/domain/topology-converge.js.map +1 -1
  86. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  87. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  88. package/daemon/dist/domain/user-settings/settings-store.js +4 -0
  89. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  90. package/daemon/dist/domain/wake-resolve-service.d.ts +1 -0
  91. package/daemon/dist/domain/wake-resolve-service.d.ts.map +1 -1
  92. package/daemon/dist/domain/wake-resolve-service.js +10 -0
  93. package/daemon/dist/domain/wake-resolve-service.js.map +1 -1
  94. package/daemon/dist/domain/wake-resolver.d.ts.map +1 -1
  95. package/daemon/dist/domain/wake-resolver.js +7 -0
  96. package/daemon/dist/domain/wake-resolver.js.map +1 -1
  97. package/daemon/dist/routes/compaction.js +1 -1
  98. package/daemon/dist/routes/compaction.js.map +1 -1
  99. package/daemon/dist/routes/sessions.js +35 -0
  100. package/daemon/dist/routes/sessions.js.map +1 -1
  101. package/daemon/dist/server.d.ts.map +1 -1
  102. package/daemon/dist/server.js +6 -4
  103. package/daemon/dist/server.js.map +1 -1
  104. package/daemon/dist/startup.d.ts.map +1 -1
  105. package/daemon/dist/startup.js +2 -5
  106. package/daemon/dist/startup.js.map +1 -1
  107. package/daemon/docs/reference/getting-started.md +93 -16
  108. package/daemon/docs/reference/quickstart.md +187 -0
  109. package/daemon/docs/reference/whats-new.md +64 -93
  110. package/dist/build-info.js +3 -3
  111. package/dist/client.d.ts +7 -1
  112. package/dist/client.d.ts.map +1 -1
  113. package/dist/client.js +28 -0
  114. package/dist/client.js.map +1 -1
  115. package/dist/commands/ask.d.ts.map +1 -1
  116. package/dist/commands/ask.js +13 -3
  117. package/dist/commands/ask.js.map +1 -1
  118. package/dist/commands/chatroom.d.ts.map +1 -1
  119. package/dist/commands/chatroom.js +1 -0
  120. package/dist/commands/chatroom.js.map +1 -1
  121. package/dist/commands/compact.d.ts.map +1 -1
  122. package/dist/commands/compact.js +5 -4
  123. package/dist/commands/compact.js.map +1 -1
  124. package/dist/commands/config.d.ts.map +1 -1
  125. package/dist/commands/config.js +1 -0
  126. package/dist/commands/config.js.map +1 -1
  127. package/dist/commands/doctor.d.ts +3 -0
  128. package/dist/commands/doctor.d.ts.map +1 -1
  129. package/dist/commands/doctor.js +39 -16
  130. package/dist/commands/doctor.js.map +1 -1
  131. package/dist/commands/reconcile-session.d.ts.map +1 -1
  132. package/dist/commands/reconcile-session.js +25 -4
  133. package/dist/commands/reconcile-session.js.map +1 -1
  134. package/dist/commands/ui.d.ts.map +1 -1
  135. package/dist/commands/ui.js +8 -1
  136. package/dist/commands/ui.js.map +1 -1
  137. package/dist/config-store.d.ts +2 -1
  138. package/dist/config-store.d.ts.map +1 -1
  139. package/dist/config-store.js +5 -0
  140. package/dist/config-store.js.map +1 -1
  141. package/dist/daemon-lifecycle.d.ts.map +1 -1
  142. package/dist/daemon-lifecycle.js +11 -3
  143. package/dist/daemon-lifecycle.js.map +1 -1
  144. package/dist/front-door.d.ts.map +1 -1
  145. package/dist/front-door.js +3 -1
  146. package/dist/front-door.js.map +1 -1
  147. package/dist/local-daemon-owner.d.ts +28 -0
  148. package/dist/local-daemon-owner.d.ts.map +1 -0
  149. package/dist/local-daemon-owner.js +98 -0
  150. package/dist/local-daemon-owner.js.map +1 -0
  151. package/package.json +1 -1
package/README.md CHANGED
@@ -8,25 +8,71 @@ OpenRig is open-source software for building and running your own network of age
8
8
 
9
9
  It's the open-source system behind my AI civilization experiments.
10
10
 
11
- **Guide:** [Getting started](docs/reference/getting-started.md) · **Stuck?** [Help](docs/reference/help.md) · **Questions:** [Q&A](https://github.com/mvschwarz/openrig/discussions/92) · **Updates and demos:** [@_feralmachine on X](https://x.com/_feralmachine)
11
+ **Guide:** [Getting started](docs/reference/quickstart.md) · **Stuck?** [Help](docs/reference/help.md) · **Questions:** [Q&A](https://github.com/mvschwarz/openrig/discussions/92) · **Updates and demos:** [@_feralmachine on X](https://x.com/_feralmachine)
12
12
 
13
13
  ## See it running
14
14
 
15
15
  ![The OpenRig TUI: the build rig as a graph, then as a table of seats with runtime, model, context and state, then one seat in detail (real recording, 10 seconds)](assets/readme/openrig-agents-working.gif)
16
16
 
17
- **Start here:** [the guided first-use path](docs/reference/getting-started.md): install, talk to the kernel operator, then choose a team for your first useful change.
17
+ **Start here:** [the guided first-use path](docs/reference/quickstart.md): install, talk to the kernel operator, then choose a team for your first useful change.
18
18
 
19
19
  Not setting this up today? Get the next walkthrough and occasional OpenRig updates → https://openrig.dev/follow
20
20
 
21
21
  ## Install and first run
22
22
 
23
- Requires Node.js 22 or 24 and tmux, on macOS or Linux, and one working Claude Code or Codex account: one is enough, since the kernel operator adapts the shipped `starter` team to whichever you have. On Linux, the distribution's own Node.js can be older (Ubuntu 24.04's is 18); install a supported version with [nvm](https://github.com/nvm-sh/nvm) (`nvm install 22`) or NodeSource. On a Mac with Apple silicon, use Node.js 22 ([compatibility history](docs/releases/v0.5.15.md#known-compatibility-limitation)). On a Mac where you aren't an administrator, or where Homebrew belongs to another account (its `brew install` is refused), install Node.js in your own home folder with [nvm](https://github.com/nvm-sh/nvm): run `touch ~/.zshrc` (a new Mac account has none, and nvm's installer only adds itself to a profile file that already exists), then the install command on nvm's page, open a new terminal, and run `nvm install 22`. That needs no administrator password, and `npm install -g` then installs into your nvm folder. On Windows, use WSL2, the Windows route OpenRig supports; native Windows isn't supported. OpenRig's automated tests don't run on WSL2 yet; see [one user's working setup](docs/reference/getting-started.md#wsl2-a-reported-working-setup). Launching a rig writes provider hooks and workspace trust settings. Before running the commands below, read [what OpenRig changes on your machine](#what-openrig-changes-on-your-machine) and back up the relevant files.
23
+ **Let your coding agent set it up.** First check that `node --version` shows 22 or 24: the command below needs
24
+ Node.js and the `npx` that comes with it. Then, in your project folder, add OpenRig's `rigs` skill to the agent you
25
+ use:
24
26
 
25
- **One command.** This runs OpenRig's install script from the `v0.6.13` release. It checks Node.js and npm, installs the latest published `@openrig/cli` with `npm install -g`, runs the Node.js and SQLite check, then runs `rig setup --dry-run` and `rig setup`. The first line prints that plan and changes nothing:
27
+ ```sh
28
+ # Claude Code
29
+ npx skills add https://github.com/mvschwarz/openrig/tree/v0.6.14/skills/rigs --skill rigs --agent claude-code
30
+ # Codex
31
+ npx skills add https://github.com/mvschwarz/openrig/tree/v0.6.14/skills/rigs --skill rigs --agent codex
32
+ ```
33
+
34
+ Then type `/rigs` in Claude Code, or `$rigs` in Codex, and say what you want built. The skill has your agent tell
35
+ you what it will run and change before it does, install OpenRig, open the OpenRig view and pass your goal to
36
+ OpenRig's operator.
37
+
38
+ You need Node.js 22 or 24 (22 on Apple silicon), tmux, macOS or Linux (WSL2 on Windows), and Claude Code or Codex
39
+ signed in. One provider is enough to start.
40
+
41
+ Already have OpenRig? Use the tag that matches `rig --version`, or upgrade first.
42
+
43
+ Prefer to type the commands yourself? [Install it yourself ↓](#install-it-yourself)
44
+
45
+ Requires Node.js 22 or 24 and tmux, on macOS or Linux, and one working Claude Code or Codex account: one is enough, since the kernel operator adapts the shipped `starter` team to whichever you have. On Linux, the distribution's own Node.js can be older (Ubuntu 24.04's is 18); install a supported version with [nvm](https://github.com/nvm-sh/nvm) (`nvm install 22`) or NodeSource. On a Mac with Apple silicon, use Node.js 22 ([compatibility history](docs/releases/v0.5.15.md#known-compatibility-limitation)). On a Mac where you aren't an administrator, or where Homebrew belongs to another account (its `brew install` is refused), install Node.js in your own home folder with [nvm](https://github.com/nvm-sh/nvm): run `touch ~/.zshrc` (a new Mac account has none, and nvm's installer only adds itself to a profile file that already exists), then the install command on nvm's page, open a new terminal, and run `nvm install 22`. That needs no administrator password, and `npm install -g` then installs into your nvm folder. On Windows, use WSL2, the Windows route OpenRig supports; native Windows isn't supported. OpenRig's automated tests don't run on WSL2 yet; see [one user's working setup](docs/reference/getting-started.md#wsl2-a-reported-working-setup).
46
+
47
+ > **What OpenRig changes on your machine**
48
+ > - **Install:** `@openrig/cli` goes in globally with npm.
49
+ > - **Setup:** `rig setup` adds an OpenRig block to `~/.tmux.conf`. It can install tmux (with Homebrew on macOS), and
50
+ > Herdr unless you pass `--no-herdr`. Plain `rig setup`, which is what the one-command install runs, checks both
51
+ > Claude Code and Codex and may install a missing one; `rig setup --providers claude` (or `codex`) limits it to
52
+ > yours.
53
+ > - **Starting OpenRig, for the coding agent you use** (paths are the usual defaults):
54
+ > - Codex: hooks and trust in `~/.codex/config.toml`.
55
+ > - Claude Code: workspace trust in `~/.claude.json`, and activity hooks in the project's
56
+ > `.claude/settings.local.json`, plus a status line unless you already have your own.
57
+ > - Discovery skills go in `~/.claude/skills` and `~/.agents/skills`.
58
+ > - **Starting a team in your project:** adds managed guidance to `AGENTS.md` or `CLAUDE.md`, plus the team's skills
59
+ > and plugins.
60
+ > - **Permissions:** by default, OpenRig's own kernel gets broader permissions than a project team gets by default.
61
+ > On Codex that's full access with no approval prompts (`-s danger-full-access -a never`). On Claude Code, its file
62
+ > tools, web fetches and operational commands, including reads under your home folder, run without asking. A
63
+ > permission policy, per-agent choice or Codex profile changes that. What your team can do depends on the team you
64
+ > choose and your settings; `workshop`, for example, ships with broad access.
65
+ > - **Backups:** OpenRig doesn't guarantee it can preserve or roll back these files, so back them up first.
66
+ >
67
+ > [Everything OpenRig writes, and why →](https://github.com/mvschwarz/openrig#what-openrig-changes-on-your-machine)
68
+
69
+ ### Install it yourself
70
+
71
+ This runs OpenRig's install script from the `v0.6.14` release. It checks Node.js and npm, installs the latest published `@openrig/cli` with `npm install -g`, runs the Node.js and SQLite check, then runs `rig setup --dry-run` and `rig setup`. The first line prints that plan and changes nothing:
26
72
 
27
73
  ```bash
28
- curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.13/scripts/install.sh | sh -s -- --dry-run
29
- curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.13/scripts/install.sh | sh
74
+ curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.14/scripts/install.sh | sh -s -- --dry-run
75
+ curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.14/scripts/install.sh | sh
30
76
  ```
31
77
 
32
78
  If `rig setup` doesn't finish ready, for example because a provider isn't signed in yet, the script ends with `INSTALLED, SETUP NOT COMPLETE`: the CLI is installed, and `rig setup` lists what's left under "Some steps need attention". If the only items left are provider sign-ins, sign in to each selected provider as below and continue; run `rig setup` again rather than reinstalling the CLI.
@@ -342,6 +388,8 @@ For cmux, use `--provider cmux`. In the TUI, a rig's detail view has an `Open te
342
388
 
343
389
  ## Key Concepts
344
390
 
391
+ The first words you meet, in plain language: [What these words mean](docs/reference/quickstart.md#what-these-words-mean).
392
+
345
393
  - **RigSpec**: Declarative multi-agent harness definition in YAML. Pods, members, edges, continuity policies, culture file.
346
394
  - **AgentSpec**: Reusable agent blueprint with skills, guidance, hooks, profiles, and startup contracts.
347
395
  - **Seat**: A stable role and address in a rig, such as `dev-build@starter`. The conversation occupying it can change while its identity and authored context remain.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openrig-core",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "description": "OpenRig canonical skills and hooks for cross-runtime agent topology coordination, continuity, and operating discipline.",
5
5
  "author": {
6
6
  "name": "Mike Schwarz",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openrig-core",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "description": "OpenRig canonical skills and hooks for cross-runtime agent topology coordination, continuity, and operating discipline.",
5
5
  "author": {
6
6
  "name": "Mike Schwarz",
@@ -384,11 +384,19 @@ rig reconcile-session <session>
384
384
  rig reconcile-session <session> --rig <rigId> --node <logicalId>
385
385
  rig reconcile-session <session> --no-launch
386
386
  rig reconcile-session <session> --json
387
+ rig reconcile-session <session> --repair-missing-pane --no-launch
387
388
  ```
388
389
 
389
- This is a no-launch, no-input adopt. `--rig`/`--node` disambiguate when the
390
- canonical session name does not uniquely resolve. `--no-launch` is accepted
391
- for explicitness (it is the only mode this command has).
390
+ This is a no-launch, no-input adopt: it records a new claimed session row for
391
+ the seat (any running row is superseded); it re-captures the resume token if
392
+ it can, and conversation continuity stays unverified. `--rig`/`--node`
393
+ disambiguate when the canonical session name does not uniquely resolve.
394
+ `--no-launch` is accepted for explicitness.
395
+
396
+ `--repair-missing-pane --no-launch` is different: for a running launched seat
397
+ whose tmux pane was never recorded, it fills in the pane and keeps the
398
+ session, resume token and generation. It never adopts. Both forms refuse
399
+ while the seat's typing protection is on.
392
400
 
393
401
  ### Five-term restore status vocabulary
394
402
 
@@ -75,39 +75,19 @@ def read(path):
75
75
  return None
76
76
 
77
77
 
78
+ # Contract twin of CLI scope-fs.ts and daemon scope/node-file.ts; parity is tested.
79
+ NOTES_FILE_PRECEDENCE = ("NOTES.md", "MISSION_NOTES.md")
80
+
81
+
78
82
  def resolve_notes(node):
79
- try:
80
- result = subprocess.run(
81
- ["rig", "scope", "resolve-notes", str(node), "--json"],
82
- capture_output=True,
83
- text=True,
84
- timeout=10,
85
- check=False,
86
- )
87
- except subprocess.TimeoutExpired:
88
- return None, "resolver command timed out"
89
- except OSError as error:
90
- return None, f"resolver command could not start: {error}"
91
- if result.returncode != 0:
92
- detail = (result.stderr or result.stdout or "").strip().splitlines()
93
- suffix = f": {detail[0]}" if detail else ""
94
- return None, f"resolver command exited {result.returncode}{suffix}"
95
- try:
96
- payload = json.loads(result.stdout)
97
- except (json.JSONDecodeError, TypeError):
98
- return None, "resolver command returned malformed JSON"
99
- if not isinstance(payload, dict) or payload.get("ok") is not True or "resolution" not in payload:
100
- return None, "resolver command returned an invalid success shape"
101
- resolution = payload["resolution"]
102
- if resolution is None:
103
- return None, None
104
- if not isinstance(resolution, dict):
105
- return None, "resolver command returned an invalid resolution shape"
106
- resolved_path = resolution.get("path")
107
- resolved_name = resolution.get("name")
108
- if not isinstance(resolved_path, str) or not isinstance(resolved_name, str):
109
- return None, "resolver command returned an invalid resolution shape"
110
- return (Path(resolved_path), resolved_name), None
83
+ for name in NOTES_FILE_PRECEDENCE:
84
+ candidate = node / name
85
+ try:
86
+ if candidate.is_file() and os.access(candidate, os.R_OK):
87
+ return (candidate, name), None
88
+ except OSError:
89
+ pass
90
+ return None, None
111
91
 
112
92
 
113
93
  def intent(text):
@@ -1,6 +1,6 @@
1
1
  # Agent help: the single troubleshooting and escalation guide (docs/reference/help.md).
2
2
  name: help
3
- version: "0.6.13"
3
+ version: "0.6.14"
4
4
  taxonomy: world
5
5
  purpose: "What an agent does when its user says OpenRig isn't working: diagnose, fix within permissions, verify, and escalate to OpenRig support."
6
6
  files:
@@ -1,6 +1,6 @@
1
1
  # Public capability and source-map width for the default onboarding walk.
2
2
  name: onboarding-width
3
- version: "0.6.13"
3
+ version: "0.6.14"
4
4
  taxonomy: world
5
5
  purpose: "The public capability map and source map referenced by the default onboarding walk."
6
6
  files:
@@ -11,7 +11,7 @@ not know exists.** So the point of what follows is not skill. It is recognition:
11
11
  lands, something rhymes, and you go check instead of building.
12
12
 
13
13
  Eighty-eight top-level verbs ship (capability canon refreshed through
14
- `capability-delta-v0.6.13`). This marker describes the pack's teaching, not publication or live
14
+ `capability-delta-v0.6.14`). This marker describes the pack's teaching, not publication or live
15
15
  adoption. Read this once for shape, and let it make you suspicious that a thing already exists.
16
16
  Model-divergence proclamations are live product (trust them; pins use canonical
17
17
  model IDs).
@@ -135,7 +135,8 @@ unseen — which makes messages the one delivery channel that never gets skipped
135
135
  read something, do not ask it. Look.**
136
136
  - **`rig ask`** — search what was said or decided, across *every generation that ever sat in a
137
137
  seat*. It reaches back past a handover that erased your predecessor's context, and costs no
138
- runtime tokens.
138
+ runtime tokens. `--wake` asks a Claude or Codex seat itself; any other runtime (Pi, custom, or
139
+ none recorded) is refused before a wake starts.
139
140
  - **`rig chatroom wait`** — block until a peer actually says something, instead of polling
140
141
  `capture` in a loop. Also `history`, `watch`, `topic` for a named thread that stays retrievable.
141
142
  Its `--timeout` is in seconds and ignores a suffix, so `2m` means 2 seconds. Poll timeouts,
@@ -460,7 +461,12 @@ not have to tear one down to change it, and you rarely have to start from nothin
460
461
  to a node. **`rig adopt`** does the whole thing at once: create the structure and bind the
461
462
  running sessions into it.
462
463
  - **`rig reconcile-session`** — you resumed a seat by hand and the daemon still shows it down; make
463
- the system see the live process **without launching anything**.
464
+ the system see the live process **without launching anything**. A running seat that refuses every
465
+ send because its tmux pane was never recorded (one launched by an older OpenRig) takes
466
+ `rig reconcile-session <seat> --repair-missing-pane --no-launch`: it fills only the missing pane,
467
+ keeps the session and resume token, never adopts, and refuses while typing protection is on.
468
+ Plain reconcile adopts the seat into a new session without its resume token; use the repair even
469
+ where a protected seat's compaction refusal still suggests plain reconcile.
464
470
  - **`rig unclaim` / `rig release`** — stop managing one adopted session, or all of them,
465
471
  **without killing the process or the agent inside it**. Handing something back to its human is a
466
472
  first-class move, not an abandonment.
@@ -487,6 +493,7 @@ version, from checking the environment to a useful report to the OpenRig team.
487
493
  Stop distinguishes process/listener exit from a clean asynchronous drain: inspect the matching
488
494
  `daemon-shutdown.json` and log when completion is incomplete or unverified. No target is a
489
495
  distinct no-op, and a timeout never proves down. Use command help for exact limits and recovery.
496
+ `/healthz` reports the daemon's effective UID as `euid`, beside `pid`.
490
497
  - **`rig doctor`** — is the *installation* wired up correctly, or are you chasing a bug that is
491
498
  really a broken install. It checks Claude and Codex installs, and a login or configured provider
492
499
  credential, the way setup does; it fails for a harness the person doesn't use, which they can
@@ -590,7 +597,9 @@ version, from checking the environment to a useful report to the OpenRig team.
590
597
  - **`rig compact-plan`** → **`rig compact`** — who is near the context wall, then act on it.
591
598
  **Ordering matters: running `compact` without the plan is guessing which seat needed it.**
592
599
  Managed compaction waits for the seat's restore map before compacting; `rig compact --state`,
593
- `--cancel` and `--skip-map` inspect, stop or skip that wait. The `claude-compaction-restore`
600
+ `--cancel` and `--skip-map` inspect, stop or skip that wait. If preparation stops at an ordinary
601
+ approval, a manual `rig compact` keeps waiting for someone to answer it, within its 180-second
602
+ budget; OpenRig never answers it, and the request times out after 240 seconds. The `claude-compaction-restore`
594
603
  skill covers writing and reading the map; `claude-compact-in-place` no longer ships. After a
595
604
  managed compaction, refocus waits for the restore request, which names the `refocusing` skill
596
605
  (the daemon installs it globally); three failed refocus attempts in a row for one occupant post
@@ -840,7 +849,10 @@ your circumstances is configuration, and the ones that are not, another agent ca
840
849
  - **`rig config get` / `reset` / `init-workspace`** — read one value, change a system-wide setting
841
850
  and put it back exactly as it was, or additively lay down the canonical project scaffold on a
842
851
  box that has none. Instance startup uses the same additive initializer for the surrounding
843
- `state`, `context`, `skills`, `topology`, and operational roots.
852
+ `state`, `context`, `skills`, `topology`, and operational roots. With `transport.local_user_guard`
853
+ on (off by default; `rig config set transport.local_user_guard true`), a Mac's local `rig` requests
854
+ stop only when the daemon's reported, `ps`-corroborated user differs from yours; unknown evidence
855
+ lets the call through. It isn't authentication or isolation.
844
856
  - **`rig policy permissions list` / `show` / `current` / `apply`** — what permission policy is
845
857
  actually in effect: discovers custom policy specs, validates refs (malformed can never read as
846
858
  valid OR absent), shows what would apply. The older `rig policy list|show|current|apply` forms
@@ -1,20 +1,66 @@
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
 
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
+
18
64
  You need Node.js 22 or 24 and tmux, on macOS or Linux, and one working Claude
19
65
  Code or Codex account: one is enough, since the kernel operator adapts the
20
66
  shipped `starter` team to whichever you have. On Linux, the distribution's own
@@ -131,11 +177,11 @@ You can also read [`skills/rigs/SKILL.md`](../../skills/rigs/SKILL.md) directly.
131
177
  script will do and changes nothing:
132
178
 
133
179
  ```sh
134
- curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.13/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
135
181
  ```
136
182
 
137
183
  The same command without `--dry-run`,
138
- `curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.13/scripts/install.sh | sh`, installs the
184
+ `curl -fsSL https://raw.githubusercontent.com/mvschwarz/openrig/v0.6.14/scripts/install.sh | sh`, installs the
139
185
  latest published `@openrig/cli` with `npm install -g`,
140
186
  runs the Node.js and SQLite check, then `rig setup --dry-run` and `rig setup`. `rig setup` checks both Claude Code and
141
187
  Codex and may install a missing one, as described below. A failed step among the first three prints
@@ -995,6 +1041,37 @@ same-seat stop/resume path after checking its retained policy; do not erase the
995
1041
  rig or start a duplicate to reset permissions. A resume can reapply the stored
996
1042
  launch mode, so verify the native mode again before continuing work.
997
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
+
998
1075
  ## Custom settings and precedence
999
1076
 
1000
1077
  - **OpenRig:** member `permission_policy` overrides rig `permission_policy`.
@@ -1,7 +1,7 @@
1
1
  # Reference guides the help pack links to, loaded one file or section at a time by address
2
2
  # (rig context get reference/<file>#<section>). Each file is a symlink to docs/reference/.
3
3
  name: reference
4
- version: "0.6.13"
4
+ version: "0.6.14"
5
5
  taxonomy: world
6
6
  purpose: "Version-matched reference guides the help guide links to. Load a single file or section by address; don't load the whole pack."
7
7
  files:
@@ -1,116 +1,87 @@
1
- # What changed in OpenRig 0.6.13
1
+ # What changed in OpenRig 0.6.14
2
2
 
3
- This note is for an agent on an install that was just upgraded to 0.6.13. It lists only what behaves differently from
4
- 0.6.12 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.14. It lists only what behaves differently from
4
+ 0.6.13 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
- after an upgrade it can still hold the previous version's note.
8
+ after an upgrade it can still hold the previous version's note. Coming from 0.6.12 or earlier, also read 0.6.13's
9
+ release notes: its changes and migration `117` arrive with this upgrade.
9
10
 
10
11
  ## After the upgrade
11
12
 
12
- - **Restart the daemon** (`rig daemon stop`, then `rig daemon start`). Migration `117` runs on every upgrade: it adds
13
- an empty, Codex-only `provider_account_readings` table. It fills only with `provider.usage_windows` on (off by
14
- default), and then keeps each resolved Codex account's readings across a restart. There's no migration `116`.
15
- Coming from 0.6.11 or earlier, 0.6.12's twelve migrations run first.
16
- - **The bundled openrig-core plugin goes from 0.1.13 to 0.1.14.** Generated Claude hook commands in a project's
17
- `.claude/settings.local.json` call the daemon's Node by its absolute path; existing bare-`node` entries refresh on
18
- their own, and a person's wrapper is kept. The plugin's own manifest hooks still call bare `node`.
19
- - **Seats pick up some changes only at their next launch:** a Pi seat's `effort` (sent as `--thinking`), a managed
20
- Claude seat's `EDITOR`, `VISUAL`, `DISPLAY`, `XAUTHORITY` and `WAYLAND_DISPLAY`, and the shipped agent specs' role
21
- file as the seat's role. Use `rig seat launch <seat> --fresh --stop --reason "<why>"` only when the person wants it
22
- now; don't relaunch a working team just to pick these up.
23
- - **Slack recovery's first pass after the upgrade** scans tracked threads inside the seven-day window once from their
24
- root. Replies that already landed aren't delivered twice; recovered ones land as late rows that never answer a
25
- decision.
13
+ - **Restart the daemon** (`rig daemon stop`, then `rig daemon start`). No migration runs. One setting is added,
14
+ `transport.local_user_guard`, off by default (see below).
15
+ - **The bundled openrig-core plugin goes from 0.1.14 to 0.1.15.** Installed copies are replaced and carry refocus's own
16
+ notes lookup.
26
17
 
27
18
  ## Output that changed shape
28
19
 
29
- - **`rig ps --nodes`** prints one line per seat after the table: `Model (<session>): configured <m>; last observed
30
- <model> (<source>; native record <time>)`, or `UNKNOWN (<reason>)`. JSON carries `modelObservation`; compact output
31
- is `[model, source, time]`, `{status: "unknown", reason}`, or `null` from an older daemon. Roster
32
- `live.observedModel` is now filled in.
33
- - **`rig capture`** writes `[rig capture: <seat>: input box: <hint>]` to stderr for a Claude Code or Codex seat; stdout
34
- is unchanged. `--json` and the MCP tool carry `inputBox` (`status`, `confidence`, `cursor`, regions, `evidence`,
35
- `hint`). It's a heuristic: `unknown` means unknown.
36
- - **`rig provider status`** rows carry a sign-in fact (`usable`, `needs sign-in`, `unknown`; JSON `signIn`). A
37
- signed-in Claude login never reads better than `unknown`. A signed-out Codex login reports `not_signed_in`, not
38
- `rpc_error`.
39
- - **`rig provider status`** (with `provider.usage_windows` on) Codex rows keep their last reading across a daemon
40
- restart as history (`retained: "before_restart"`), labelled "kept from before the daemon restarted; not a current
41
- reading", with availability unknown until a fresh read. Rows add `accountHistory` (`linked`, or `unknown`; every
42
- Claude row is `unknown`), `lastObservedExhausted`, `retained` and, on an inactive account, `savedProfile: "not
43
- linked"`. A window whose reset has passed gains `expectation`: planning, not a reading. Run `rig provider status
44
- --refresh` before telling anyone an account has room.
45
- - **`rig send`** can refuse with `caller_cancelled` (HTTP 409, `sent: false`, `inputPhase: "not_reached"`) when its
46
- caller went away before input started.
47
- - **`rig seat restart --keep-conversation`** reports name a Codex startup screen: `Codex startup gate (<kind>): …`, and
48
- JSON gains `codexNoDaemonFlag`, `processMode` (always `unknown` for now) and `account.startupGateKind`.
49
- - **`rig restore-check`**'s hook check can read `ready_with_caveats` where it read green; the exit code is still 0.
50
- - **`GET /api/attention`** adds `queue-update:<qitemId>` items and a `"queue updates"` source.
51
- - **The node-detail API's `targetPath`** names the file a guidance block is really in, or `""`; `declaredTarget` and
52
- `effectiveTarget` are new.
53
- - **`rig grow --json`'s `rigId`** is the resolved id, and `rig grow` and `rig remove` can return `rig_ambiguous`.
54
- - **The one-line installer** ends with `INSTALLED, SETUP NOT COMPLETE (exit N)` when `rig setup` isn't ready.
20
+ - **`rig ask --wake`** on a seat whose runtime isn't Claude or Codex prints `Wake runtime '<runtime>' … is not
21
+ supported. Supported runtimes are claude and codex.` A `member@rig` target exits 2 (the daemon refuses it); a raw-id
22
+ `--runtime` value exits 1 (the CLI refuses it). No wake starts.
23
+ - **`/healthz`** gains `euid`, the daemon's effective user ID, beside `pid`, whether or not the Mac check is on.
24
+ - **`rig compact`** (manual) waits up to 240 seconds for its result, up from 180, because preparation now has 180
25
+ seconds, up from 120.
55
26
 
56
27
  ## Seats and restore
57
28
 
58
- - **A fresh in-place Claude handover** checks a ready result from the old pane's history against the current screen,
59
- so the packet waits for the successor. It can still admit early when the screen, pane or process can't be read or
60
- proven: check that the successor read its packet.
61
- - **A Claude launched through a wrapper script** is proven by its executable path; a restored auto-mode seat resumes
62
- ready.
63
- - **After a failed restore, a ready `rig seat launch --fresh`** clears the old restore warning, and `rig seat
64
- clear-attention` no longer refuses for it.
65
- - **A complete idle Claude Code or Codex screen** reads `idle` through terminal repaints.
66
- - **Claude Code's MCP-server approval menu** reads `mcp_gate` and needs input; a restore doesn't call it ready, and an
67
- ordinary send is refused instead of pasted. A fresh running hook still sends into it.
68
- - **Codex's "Trust this folder?" panel** reads `trust_gate` during launch, resume and restore.
69
- - **A rig name with a dot** is refused at launch, at adding a member and at a first-start retry.
70
-
71
- ## Sends, wakes and the queue
72
-
73
- - **A send whose caller went away** types nothing, then or later, if no input had started.
74
- - **An old numbered menu in a Codex pane's scrollback** no longer blocks a send when a complete empty input box sits
75
- below the status row.
76
- - **An OMP seat** whose turn ended with a typed transient provider failure (408, 429, 500, 502, 503, 504 or 529) can
77
- take an ordinary `rig send` retry; nothing retries on its own.
78
- - **Parked rows for one seat that fall due in the same pass** arrive as one message naming each row.
79
- - **A stuck-item finding on a person's item that an agent closed** goes to that agent, not the person.
80
- - **`rig queue list --state "pending, in-progress"`** matches both states.
29
+ - **A seat that refuses every send with "Managed pane identity unavailable or changed; no input written."** because an
30
+ older OpenRig never recorded its tmux pane can be repaired in place: `rig reconcile-session <seat>
31
+ --repair-missing-pane --no-launch`. It fills only the missing pane and keeps the session, resume token and occupant
32
+ generation; the result names the same session, with continuity unverified. It refuses, writing nothing, with
33
+ `repair_not_applicable` (the binding already has a pane), `pane_ambiguous` (more than one pane or window),
34
+ `pane_missing` (no PID), `guard_target_changed`, `guard_operation_in_progress`, `typing_guard_enabled` or
35
+ `repair_timed_out`. Against an older daemon it reads `repair_missing_pane_unsupported` and never adopts. It records no
36
+ event.
37
+ - **A manual `rig compact` whose preparation stops at an ordinary approval** keeps waiting within its deadline instead
38
+ of giving up. OpenRig never answers the approval: the person, or an agent allowed to, answers it.
39
+ - **Refocus resolves each ancestor's notes file itself** (`NOTES.md`, then `MISSION_NOTES.md`) instead of starting `rig
40
+ scope resolve-notes` per ancestor. Its output, budgets and settings are unchanged.
81
41
 
82
42
  ## New things you can do
83
43
 
84
- - **Move a seat to a new working folder:** `rig seat set-cwd <seat> --cwd <absolute-path> --reason <text>` saves it
85
- for the next fresh launch or rebuild handover; the running agent doesn't move. Switch promptly with `rig seat launch
86
- <seat> --fresh --stop --reason "<why>"` or a rebuild handover, and not after a `rig down`/`rig up` or fork handover.
87
- - **Set a Pi seat's effort:** `rig seat set-effort <seat> --effort <level> --reason "<why>"` and `rig seat effort
88
- <seat>` now work for Pi.
89
- - **See which model a seat was using:** `rig ps --nodes`, `rig roster show`, `rig roster find`.
90
- - **Use a rig name in `rig grow` and `rig remove`.**
91
- - **Slack:** missed messages in mapped channels, recent threads and relayed channels are recovered; `rig slack status`
92
- shows a line per channel and a thread line.
44
+ - **Repair a missing pane without adopting:** `rig reconcile-session <seat> --repair-missing-pane --no-launch`.
45
+ - **Point a person at a page written for them:** `docs/reference/quickstart.md` ("Getting started") is the first-use
46
+ page, with a glossary. `docs/reference/getting-started.md` is now titled "OpenRig setup reference" and opens with what
47
+ the agent doing the setup needs; its sections and anchors are unchanged, so `rig context get
48
+ reference/getting-started.md#…` lookups still work.
93
49
 
94
50
  ## Off by default
95
51
 
96
- - **The refocus work packet** stays off for Claude Code and Codex. With `OPENRIG_REFOCUS_WORK_PACKET=1`, its fields
97
- are bounded (about 160 characters per summary, 20 held and 10 next rows, about 1,500 characters per section).
52
+ - **A Mac local-user check.** On a Mac shared by several accounts, `rig config set transport.local_user_guard true` (or
53
+ `OPENRIG_TRANSPORT_LOCAL_USER_GUARD=true` in the CLI's environment) makes the CLI refuse a local daemon another account
54
+ runs. It compares the PID and effective UID the daemon reports in `/healthz` with two `ps` readings and a second
55
+ health response, and refuses only when they agree on another account; the refusal names `rig daemon start --port
56
+ <unused-port>`. Missing, disagreeing or timed-out evidence, and an older daemon without `euid`, keep today's
57
+ behaviour. No daemon restart is needed. Explicit `OPENRIG_URL` targets and registered remote hosts keep their routing,
58
+ later browser or TUI connections aren't checked, and with it on `sudo rig …` against a user-owned daemon refuses. It
59
+ isn't authentication: it trusts the daemon's own report. Details: `rig context get
60
+ reference/getting-started.md#optional-mac-local-user-check`.
98
61
 
99
62
  ## What to stop doing
100
63
 
101
- - **Don't read `FAILED [4/4]` from the installer as a failed install:** the script now says `INSTALLED, SETUP NOT
102
- COMPLETE`, and the fix is `rig setup` again, not a reinstall.
103
- - **Don't rely on Slack recovery for older open threads:** only threads whose root or close is within seven days are
104
- caught up.
105
-
106
- ## Known gaps in 0.6.13
107
-
64
+ - **Don't use plain `rig reconcile-session` to fix a launched seat's missing pane.** It adopts the seat into a new
65
+ session with no resume token; use `--repair-missing-pane --no-launch`.
66
+ - **Don't abandon a manual `rig compact` because preparation hit an approval.** Answer it, or ask the person to, within
67
+ the 180 seconds.
68
+ - **Don't try `rig ask --wake` on a Pi or custom seat.** Use `rig ask` without `--wake` to search what it said, or send
69
+ to the live seat.
70
+
71
+ ## Known gaps in 0.6.14
72
+
73
+ - **The compaction and refocus fixes** are tested without a native compaction or a loaded machine: confirm a
74
+ compaction by its restore request or the drop in context, and check that a restored seat is really working.
75
+ - **The pane repair refuses while typing protection is on.** The compaction refusal for a protected seat whose pane
76
+ isn't recorded still suggests plain `rig reconcile-session <seat> --no-launch`, which adopts. For a running launched
77
+ seat whose pane was never recorded, use `rig reconcile-session <seat> --repair-missing-pane --no-launch` instead;
78
+ it needs typing protection off, so turn protection off only if the person agrees. A delivery held from before the
79
+ repair can still refuse.
80
+ - **`rig context get reference/quickstart.md` doesn't resolve:** the page isn't in the reference context pack. Read it
81
+ from the package's `docs/reference/` or the repository.
108
82
  - **On a Mac with more than one user account,** a second user's `rig` commands can reach the first user's daemon on
109
- its default port (7433). Running each user's daemon on its own port lets both work but doesn't keep them apart.
110
- - **Managed compaction, refocus after a compaction and snapshot restore** behave as in 0.6.12: confirm a compaction by
111
- its restore request or the drop in context, and check that a restored seat is really working.
112
- - **A fresh in-place Claude handover** can still report ready early when the screen, pane or process can't be read or
113
- proven.
114
- - **One Slack app across machines** hasn't run on two real machines, and Slack recovery doesn't catch up older open
115
- threads.
116
- - **`rig seat set-cwd`** checks the new folder once; switch promptly.
83
+ its default port (7433) unless `transport.local_user_guard` is on. The check trusts the daemon's own report, identity
84
+ can change between the check and the connection, and direct HTTP clients aren't covered.
85
+ - **0.6.13's other known gaps still apply:** a fresh in-place Claude handover can report ready early when the screen,
86
+ pane or process can't be read or proven; one Slack app across machines hasn't run on two real machines, and Slack
87
+ recovery doesn't catch up older open threads; `rig seat set-cwd` checks the new folder once.