paseo-room 0.1.0-alpha.5 → 0.1.0
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.
- package/README.md +220 -41
- package/dist/index.js +1107 -466
- package/dist/index.js.map +1 -1
- package/dist/prompts/contract/lead/complete-peer-brief.md +10 -0
- package/dist/prompts/contract/lead/independent-review.md +9 -0
- package/dist/prompts/contract/lead/moving-write-ownership.md +13 -0
- package/dist/prompts/contract/lead/peer-seat-lifecycle.md +30 -0
- package/dist/prompts/contract/lead/project-technical-ownership.md +12 -0
- package/dist/prompts/contract/lead/technical-acceptance.md +6 -0
- package/dist/prompts/contract/peer/bounded-outcome.md +5 -0
- package/dist/prompts/contract/peer/independent-judgment.md +11 -0
- package/dist/prompts/contract/peer/no-orchestration.md +5 -0
- package/dist/prompts/contract/peer/no-self-acceptance.md +5 -0
- package/dist/prompts/contract/peer/reproducible-handoff.md +5 -0
- package/dist/prompts/contract/peer/writing-and-review-scope.md +5 -0
- package/dist/prompts/contract/shared/evidence-and-event-waiting.md +7 -0
- package/dist/prompts/contract/shared/human-authority.md +8 -0
- package/dist/prompts/contract/shared/scope-and-unrelated-work.md +4 -0
- package/dist/prompts/contract/shared/workspace-protocol-precedence.md +15 -0
- package/dist/prompts/contract/shared-lead-peer/challenge-signals.md +9 -0
- package/dist/prompts/contract/supervisor/directive-integrity.md +5 -0
- package/dist/prompts/contract/supervisor/escalation-boundaries.md +5 -0
- package/dist/prompts/contract/supervisor/lead-discovery-and-recovery.md +52 -0
- package/dist/prompts/contract/supervisor/observation-and-advice.md +13 -0
- package/dist/prompts/contract/supervisor/technical-non-interference.md +8 -0
- package/dist/prompts/documents/lead.md +3 -0
- package/dist/prompts/documents/peer.md +3 -0
- package/dist/prompts/documents/supervisor.md +3 -0
- package/dist/prompts/documents/workspace.md +5 -0
- package/dist/prompts/pi/communication-style.md +5 -0
- package/dist/prompts/pi/runtime.md +7 -0
- package/dist/prompts/workspace/repository-conventions.md +7 -0
- package/dist/prompts/workspace/review.md +4 -0
- package/dist/prompts/workspace/topology.md +13 -0
- package/dist/prompts/workspace/verification.md +8 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -7,7 +7,8 @@ It does three things:
|
|
|
7
7
|
|
|
8
8
|
1. Reads your existing Codex / Claude Code / Pi configuration.
|
|
9
9
|
2. Writes one isolated role home per seat under `~/.paseo-room`. Each role owns its mutable
|
|
10
|
-
credentials; read-only skills
|
|
10
|
+
credentials; read-only skills and other supported resources may be symlinked, and Peer
|
|
11
|
+
receives a narrower set than Supervisor and Lead.
|
|
11
12
|
3. Registers those role homes with your running Paseo daemon as providers — room tools on for Supervisor and Lead, off for Peer — and adds one agent profile per seat so opening one is a single pick.
|
|
12
13
|
|
|
13
14
|
Everything it manages lives in `$HOME`, under `~/.paseo-room`. Agent runtimes may later
|
|
@@ -25,18 +26,24 @@ npx paseo-room setup --apply # do it (Codex seats)
|
|
|
25
26
|
npx paseo-room setup --agent codex --agent claude --apply
|
|
26
27
|
npx paseo-room setup --agent pi --apply # Pi seats
|
|
27
28
|
npx paseo-room verify # is the room still intact and compatible?
|
|
29
|
+
npx paseo-room auth login codex lead # interactive login for exactly one role
|
|
30
|
+
npx paseo-room auth login claude peer
|
|
31
|
+
npx paseo-room auth login pi supervisor # minimal Pi login session; run /login, then exit
|
|
28
32
|
npx paseo-room remove --apply # delete ~/.paseo-room (including role credentials) and providers
|
|
29
33
|
```
|
|
30
34
|
|
|
31
35
|
`setup` and `remove` are dry runs unless you pass `--apply`. Running with no arguments in a
|
|
32
36
|
terminal starts a short wizard: pick an action, pick the agents, review the plan, confirm.
|
|
37
|
+
Setup and the wizard never start login. `auth login` is a separate explicit action, requires
|
|
38
|
+
interactive stdin/stdout/stderr, and targets exactly one selected agent and role; it has no
|
|
39
|
+
`--all`, `--apply`, or status form.
|
|
33
40
|
|
|
34
41
|
### Options
|
|
35
42
|
|
|
36
43
|
| Flag | Default | Purpose |
|
|
37
44
|
|---|---|---|
|
|
38
45
|
| `--agent <codex\|claude\|pi>` | `codex` | Which coding agent to seat. Repeat the flag to combine agents. |
|
|
39
|
-
| `--apply` | off | Actually write
|
|
46
|
+
| `--apply` | off | Actually write setup/remove changes; `auth login` does not use it. |
|
|
40
47
|
| `--json` | off | One machine-readable document instead of text. |
|
|
41
48
|
| `--room-home <path>` | `~/.paseo-room` | Where role homes are written. |
|
|
42
49
|
| `--codex-home <path>` | `~/.codex` | Source Codex configuration. |
|
|
@@ -50,7 +57,9 @@ the environment.
|
|
|
50
57
|
|
|
51
58
|
`PASEO_PASSWORD` is used if your daemon requires one, and is redacted from all output.
|
|
52
59
|
|
|
53
|
-
Exit codes: `0` success, `1` a check failed, `2` bad usage.
|
|
60
|
+
Exit codes: `0` success, `1` a paseo-room check failed, `2` bad usage. After a vendor login
|
|
61
|
+
starts, its exit code is preserved; a signal is returned using the conventional
|
|
62
|
+
`128 + signal number` mapping.
|
|
54
63
|
|
|
55
64
|
## Requirements
|
|
56
65
|
|
|
@@ -59,6 +68,8 @@ Exit codes: `0` success, `1` a check failed, `2` bad usage.
|
|
|
59
68
|
**0.8.0-beta.1 or newer**; any selection containing Pi requires **0.8.0 or newer**.
|
|
60
69
|
`paseo-room` checks this before touching anything, and never installs or upgrades Paseo.
|
|
61
70
|
- An initialised Codex home (`~/.codex/config.toml`) and/or Claude Code home (`~/.claude`).
|
|
71
|
+
Codex must be new enough for `codex debug models` to print its JSON model catalog: the room
|
|
72
|
+
seats Codex only if it can generate the scrubbed catalog copy.
|
|
62
73
|
Setup never copies mutable credential stores or runs login. Use supported environment/static
|
|
63
74
|
auth, or log in once in each role after setup. For current Claude runtimes, paseo-room
|
|
64
75
|
pins both `CLAUDE_CONFIG_DIR` and `CLAUDE_SECURESTORAGE_CONFIG_DIR` per role. It does not
|
|
@@ -73,26 +84,27 @@ Exit codes: `0` success, `1` a check failed, `2` bad usage.
|
|
|
73
84
|
```text
|
|
74
85
|
~/.paseo-room/
|
|
75
86
|
room.json # what this CLI created; verify and remove read it
|
|
87
|
+
AUTHENTICATION.md # exact per-role login commands; contains no secrets
|
|
76
88
|
room/WORKSPACE_PROTOCOL.md # the default protocol every seat carries, as one readable file
|
|
77
89
|
roles/codex/<role>/
|
|
78
90
|
config.toml # your config.toml + the room's overrides
|
|
79
91
|
role-instructions.md # readable copy of what this seat was told
|
|
80
|
-
model-catalog.json # your catalog
|
|
92
|
+
model-catalog.json # generated copy of your catalog, native multi-agent metadata removed
|
|
81
93
|
auth.json # created and owned by Codex after role login, if file-backed
|
|
82
|
-
AGENTS.md, skills, plugins, hooks.json → symlinks into ~/.codex when present
|
|
94
|
+
AGENTS.md, skills, plugins, hooks.json → symlinks into ~/.codex when present (Peer: see below)
|
|
83
95
|
roles/claude/<role>/
|
|
84
96
|
CLAUDE.md # your global memory + role instructions
|
|
85
97
|
settings.json # your settings.json + PASEO_ROOM_ROLE
|
|
86
98
|
.claude.json # seeded once from yours, then owned by Claude
|
|
87
99
|
.credentials.json # created and owned by Claude after role login, if file-backed
|
|
88
100
|
skills, plugins, commands, hooks, rules, output-styles,
|
|
89
|
-
keybindings.json, themes → symlinks into ~/.claude when present
|
|
101
|
+
keybindings.json, themes → symlinks into ~/.claude when present (Peer: see below)
|
|
90
102
|
roles/pi/<role>/
|
|
91
103
|
settings.json # your settings minus package/extension declarations
|
|
92
104
|
APPEND_SYSTEM.md # your append + style/runtime capsules + role instructions
|
|
93
105
|
auth.json # created and owned by Pi after role login, if used
|
|
94
106
|
models.json, AGENTS.md, skills, prompts, themes,
|
|
95
|
-
keybindings.json, mcp.json → symlinks into ~/.pi/agent when present
|
|
107
|
+
keybindings.json, mcp.json → symlinks into ~/.pi/agent when present (Peer: see below)
|
|
96
108
|
```
|
|
97
109
|
|
|
98
110
|
Each seat gets its own file-backed credential path, sessions, history and projects inside its
|
|
@@ -100,6 +112,42 @@ role home. Current supported runtimes therefore do not share mutable file-backed
|
|
|
100
112
|
or conversation state; older-runtime Claude Keychain isolation remains unverifiable. Credential
|
|
101
113
|
paths are never managed-entry symlinks: setup and update preserve whatever is already there.
|
|
102
114
|
|
|
115
|
+
A managed file or symlink only ever replaces an absent path or the same shape, and it is
|
|
116
|
+
written to a temporary sibling and renamed into place, so a seat never reads a half-written
|
|
117
|
+
file. Anything else at a managed path — a directory where a file belongs, an unexpected
|
|
118
|
+
symlink — makes setup stop and name the path for you to move aside. Nothing is deleted
|
|
119
|
+
recursively on your behalf.
|
|
120
|
+
|
|
121
|
+
### What Peer does not receive
|
|
122
|
+
|
|
123
|
+
Peer has no room tools, so the room also stops handing it orchestration surfaces:
|
|
124
|
+
|
|
125
|
+
- Resources whose contents execute are not shared with Peer at all — Codex `plugins` and
|
|
126
|
+
`hooks.json`, Claude `plugins`, `commands` and `hooks`, Pi `prompts`. Supervisor and Lead
|
|
127
|
+
still get them.
|
|
128
|
+
- Peer's `skills` is not one symlink to your skills directory. It is a room-owned directory
|
|
129
|
+
of links to each of your skills whose name does not start with `paseo` (any capitalization),
|
|
130
|
+
so orchestration skills are not advertised to the seat that cannot orchestrate. Adding or
|
|
131
|
+
removing one of your skills is drift `verify` reports and `setup --apply` reconciles.
|
|
132
|
+
|
|
133
|
+
Your own skills directory is never modified: `paseo*` skills stay exactly where they are.
|
|
134
|
+
An existing room upgrades its one legacy Peer `skills` symlink to that projection on the next
|
|
135
|
+
`setup --apply`; setup only unlinks the alias, never your skills, and stops with an actionable
|
|
136
|
+
message if that path has become something it does not recognize.
|
|
137
|
+
|
|
138
|
+
This is capability hygiene, not a sandbox. Peer still has shell access.
|
|
139
|
+
|
|
140
|
+
### Paseo MCP servers are refused, never rewritten
|
|
141
|
+
|
|
142
|
+
Paseo is the room's only control plane, so setup and verify read the MCP declarations in your
|
|
143
|
+
Codex `config.toml`, your Claude state, Pi's `mcp.json`, and any already-seeded role
|
|
144
|
+
`.claude.json`, and **fail before applying anything** if a declaration looks Paseo-related.
|
|
145
|
+
Recognition is one bounded rule — `paseo` as a whole identifier or path token, in the server
|
|
146
|
+
name, `command`, `args` or a URL field — and the message quotes the file and the field that
|
|
147
|
+
matched. It is a heuristic, not a scanner: a renamed or obfuscated endpoint passes it. Remove
|
|
148
|
+
or rename the server yourself; `paseo-room` never edits, filters or deletes your MCP
|
|
149
|
+
configuration.
|
|
150
|
+
|
|
103
151
|
Pi role homes deliberately do not link `extensions`, `npm`, `git`, `trust.json`, runtime
|
|
104
152
|
caches or session state. Their copied `settings.json` removes `packages` and `extensions`,
|
|
105
153
|
so startup cannot install configured packages or discover unrelated configured extensions.
|
|
@@ -127,20 +175,28 @@ do not turn an otherwise valid setup or verify into a failure:
|
|
|
127
175
|
Keychain entry. Claude's current secure-storage location is pinned to the role home, but no
|
|
128
176
|
keyring query or token validation is made and older runtime behavior is not assumed.
|
|
129
177
|
|
|
130
|
-
|
|
178
|
+
`setup --apply` writes `~/.paseo-room/AUTHENTICATION.md` with shell-quoted commands using the
|
|
179
|
+
exact executables resolved during that setup. It covers every selected agent and role and is
|
|
180
|
+
regenerated by later setup/update runs. You can either copy a command from that guide or use
|
|
181
|
+
the equivalent helper:
|
|
131
182
|
|
|
132
183
|
```bash
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
CLAUDE_CONFIG_DIR=<role-home> CLAUDE_SECURESTORAGE_CONFIG_DIR=<role-home> claude auth login
|
|
137
|
-
CLAUDE_CONFIG_DIR=<role-home> CLAUDE_SECURESTORAGE_CONFIG_DIR=<role-home> claude auth status
|
|
138
|
-
# If `claude auth login` is unavailable, launch Claude with both directories and run /login.
|
|
139
|
-
|
|
140
|
-
PI_CODING_AGENT_DIR=<role-home> pi
|
|
141
|
-
# Then run /login interactively; no noninteractive Pi login is assumed.
|
|
184
|
+
paseo-room auth login codex <supervisor|lead|peer>
|
|
185
|
+
paseo-room auth login claude <supervisor|lead|peer>
|
|
186
|
+
paseo-room auth login pi <supervisor|lead|peer>
|
|
142
187
|
```
|
|
143
188
|
|
|
189
|
+
The helper validates the room marker and selected seat, resolves the current executable from
|
|
190
|
+
the matching `--codex-bin`, `--claude-bin`, or `--pi-bin` override (or `PATH`), and gives the
|
|
191
|
+
vendor process the terminal unchanged. Codex runs `login` under the role's `CODEX_HOME`;
|
|
192
|
+
Claude runs `auth login` with both role config and secure-storage directories pinned. Pi opens
|
|
193
|
+
a minimal interactive login session in that role's home, isolated from the caller repository, with
|
|
194
|
+
`--no-extensions --no-approve --append-system-prompt ''` and visibly asks you to run `/login`.
|
|
195
|
+
The explicit empty append override suppresses discovery of the generated role
|
|
196
|
+
`APPEND_SYSTEM.md`, including its runtime capsule and role instructions. This direct launch
|
|
197
|
+
does not load `pi-mcp-adapter`, Paseo's integration extension, or the room-equivalent provider
|
|
198
|
+
argv. No login path reads, copies, links, replaces, validates, or deletes a credential store.
|
|
199
|
+
|
|
144
200
|
Codex diagnostics recognize an explicit `cli_auth_credentials_store` of `file`, `ephemeral`,
|
|
145
201
|
`auto`, or `keyring`. An `OPENAI_API_KEY` name in the setup shell does not count as stored role
|
|
146
202
|
auth; Codex's API-key login must create that role's native store. Claude recognizes the
|
|
@@ -159,13 +215,25 @@ For Codex, the generated `config.toml` is a copy of yours with only these keys o
|
|
|
159
215
|
| `sandbox_mode` | `danger-full-access` | A seat that stops to ask for permission cannot be driven headless. |
|
|
160
216
|
| `approval_policy` | `never` | Same. |
|
|
161
217
|
| `developer_instructions` | the role contract | This is the room's whole instruction payload. |
|
|
162
|
-
| `model_catalog_json` | generated catalog | Strips `multi_agent_version` so the seat is not offered native collaboration.
|
|
163
|
-
| `[agents].enabled` | `false` | Paseo owns agent lifecycle. |
|
|
218
|
+
| `model_catalog_json` | generated catalog | Strips `multi_agent_version` so the seat is not offered native collaboration. Setup **fails** if your Codex cannot produce a catalog. |
|
|
219
|
+
| `[agents].enabled` | `false` | Paseo owns agent lifecycle. Top-level only: Codex profiles have no such key. |
|
|
164
220
|
| `features.multi_agent`, `features.multi_agent_v2` | `false` | Same, at the feature-flag level. |
|
|
165
221
|
|
|
166
|
-
If your config has an active `profile`,
|
|
167
|
-
|
|
168
|
-
|
|
222
|
+
If your config has an active `profile`, every one of those keys a profile can also carry —
|
|
223
|
+
sandbox, approval, the catalog path and both multi-agent features — is written into that
|
|
224
|
+
profile too, because a profile outranks the top-level keys. Your model, reasoning effort, MCP
|
|
225
|
+
servers, trusted projects and every other key are copied through untouched.
|
|
226
|
+
|
|
227
|
+
The catalog is a closure, not a nicety, so it fails closed: if `codex debug models` cannot
|
|
228
|
+
run, does not print JSON, or prints JSON that is not a catalog object, no Codex seat is
|
|
229
|
+
planned and the message quotes the exact command it tried. A Codex too old to print that JSON
|
|
230
|
+
catalog cannot be seated.
|
|
231
|
+
|
|
232
|
+
What lands in each role home is a **generated copy** captured at that setup, and it replaces
|
|
233
|
+
Codex's built-in catalog for that seat. New models from a later Codex release therefore do not
|
|
234
|
+
reach a seat until you run `setup --apply` again. `verify` says so explicitly when a drifted
|
|
235
|
+
file is a `model-catalog.json`, because that seat is missing the closure rather than only
|
|
236
|
+
holding older contract text.
|
|
169
237
|
|
|
170
238
|
**The room never replaces an agent's base prompt.** Codex's `model_instructions_file`,
|
|
171
239
|
Claude's `--system-prompt` and Pi's `SYSTEM.md` / `--system-prompt` all *replace* the vendor
|
|
@@ -175,6 +243,13 @@ contract is additive instead: `developer_instructions` for Codex, `CLAUDE.md` fo
|
|
|
175
243
|
and the generated Pi `APPEND_SYSTEM.md` passed with `--append-system-prompt` for Pi. Pi keeps
|
|
176
244
|
normal project `AGENTS.md` / `CLAUDE.md` context loading.
|
|
177
245
|
|
|
246
|
+
Claude's carrier is the weakest of the three, and knowingly so. `CLAUDE.md` is user memory,
|
|
247
|
+
which a project-level `CLAUDE.md` can dilute, and Paseo runs Claude through the Claude Agent
|
|
248
|
+
SDK rather than as a plain CLI process — so there is no provider-owned command line to append
|
|
249
|
+
a stronger prompt through, and no CLI flag is proposed here. The real fix is a
|
|
250
|
+
provider-owned SDK append field in Paseo itself. Until that exists, the room keeps the
|
|
251
|
+
contract short and states the limit instead of implying parity with Codex.
|
|
252
|
+
|
|
178
253
|
Pi providers use a strict command tail:
|
|
179
254
|
|
|
180
255
|
```text
|
|
@@ -207,6 +282,11 @@ agent's own configuration:
|
|
|
207
282
|
| strict argv + `PI_MCP_CONFIG_MODE=exclusive` + additive runtime capsule | Pi | Disables extension discovery and project trust, and restricts adapter config to the role-home `mcp.json`; forbids a second agent control plane without claiming sandboxing. |
|
|
208
283
|
| `paseoTools: {enabled}` | all | Room tools for Supervisor and Lead, never for Peer. |
|
|
209
284
|
|
|
285
|
+
`verify` compares each provider's `command`, `env`, `paseoTools` and pins against what the
|
|
286
|
+
room would write, and fails if one has been dropped — a pin that can be silently removed is
|
|
287
|
+
not a guarantee. The `env` map is compared whole rather than as a subset, because an added key
|
|
288
|
+
can re-enable exactly what a pin closes. Unrelated top-level provider fields stay yours.
|
|
289
|
+
|
|
210
290
|
It also saves one **agent profile** per seat, which is what the Paseo picker lists under
|
|
211
291
|
Profiles. A profile is a preset, not a constraint: it decides where a seat *starts*.
|
|
212
292
|
|
|
@@ -225,7 +305,10 @@ Supervisor starts low because it routes rather than reasons. No seat starts on t
|
|
|
225
305
|
option — Codex's `ultra` and Claude's `ultracode` advertise automatic task delegation, which
|
|
226
306
|
is a second control plane. `setup` restores room-owned identity, appearance and mode fields,
|
|
227
307
|
but leaves your model and reasoning choice alone; profiles you created yourself are never
|
|
228
|
-
touched.
|
|
308
|
+
touched. If you do put a room seat on `ultra` or `ultracode`, setup and verify warn and name
|
|
309
|
+
the seats: the room has not verified whether its closed multi-agent paths actually prevent
|
|
310
|
+
that option from delegating, so it reports the selection rather than rejecting or changing it.
|
|
311
|
+
The warning does not fail the command.
|
|
229
312
|
|
|
230
313
|
Pi exposes no selectable Paseo mode, so its profiles omit `modeId`; setup also removes a
|
|
231
314
|
stale room-owned value from an existing Pi profile. Pi has no sandbox or approval boundary:
|
|
@@ -244,13 +327,91 @@ No default model is pinned. The profile schema supports `model`, but leaving it
|
|
|
244
327
|
each provider use its current default and avoids silently choosing a cost/capability tier for
|
|
245
328
|
the operator.
|
|
246
329
|
|
|
330
|
+
### Recognizing a live room seat
|
|
331
|
+
|
|
332
|
+
Names are not identity. A matching cwd, title, or provider label does not make an existing
|
|
333
|
+
agent a room Lead or Peer. The exact eligibility procedure is model-facing wording and lives
|
|
334
|
+
in the contract itself —
|
|
335
|
+
[Lead Discovery and Recovery](src/room/prompts/contract/supervisor/lead-discovery-and-recovery.md)
|
|
336
|
+
for Supervisor and
|
|
337
|
+
[Peer Seat Lifecycle](src/room/prompts/contract/lead/peer-seat-lifecycle.md) for Lead — rather
|
|
338
|
+
than being restated here. In outline: the seat's evidence is the current live configuration.
|
|
339
|
+
Supervisor reads the exact current `room-<agent>-lead` profile from `list_profiles` and
|
|
340
|
+
materializes every field it defines (agent creation takes no profile id), uses `list_agents(cwd)`
|
|
341
|
+
only to find candidates, then inspects each one's full status for the profile's provider, the
|
|
342
|
+
intended workspace and its mode. For `room-<agent>-peer`, Lead copies provider, mode and
|
|
343
|
+
features exactly, treats model and thinking as protocol-governed defaults, and additionally
|
|
344
|
+
requires the live seat's daemon-added `paseo.parent-agent-id` to name itself. Ownership must be
|
|
345
|
+
corroborated by parentage or known Human-opened history; an ambiguous candidate goes to
|
|
346
|
+
duplicate recovery and Human escalation instead of being adopted.
|
|
347
|
+
|
|
348
|
+
Current Paseo agent sessions do not retain `profileId`. A direct launch with the exact
|
|
349
|
+
profile provider, mode and workspace is therefore **profile-equivalent**, but literal picker
|
|
350
|
+
click provenance cannot be established. The room does not introduce generation-versioned
|
|
351
|
+
provider ids or claim that the daemon enforces this procedural eligibility check.
|
|
352
|
+
|
|
247
353
|
## Keeping the room current
|
|
248
354
|
|
|
249
355
|
Role homes are generated once, at `setup` time. After you edit `~/.codex/config.toml`,
|
|
250
|
-
`~/.claude/settings.json`, or Pi's `settings.json` / `APPEND_SYSTEM.md`, run
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
356
|
+
`~/.claude/settings.json`, or Pi's `settings.json` / `APPEND_SYSTEM.md`, run setup again to
|
|
357
|
+
fold the change into every seat. The same applies after upgrading `paseo-room`; a release
|
|
358
|
+
that changes generated headings or prompt assets produces expected one-time managed-file
|
|
359
|
+
drift.
|
|
360
|
+
|
|
361
|
+
Use the upgraded version with the same repeated `--agent` selection as the installed room:
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
npx paseo-room@<new-version> setup --agent codex --agent claude --agent pi
|
|
365
|
+
npx paseo-room@<new-version> setup --agent codex --agent claude --agent pi --apply
|
|
366
|
+
npx paseo-room@<new-version> verify
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
First inspect the dry run, then apply it. The apply regenerates managed prompt carriers,
|
|
370
|
+
the Codex model catalogs and `AUTHENTICATION.md` from the newly resolved binaries, but
|
|
371
|
+
preserves role credential paths and the operator agent homes. Stop and restart every affected
|
|
372
|
+
seat after the apply; sending another turn to an already-running seat is not a restart.
|
|
373
|
+
`setup` and `verify` prove the files and live Paseo configuration, not that an existing model
|
|
374
|
+
context reloaded them. Only a newly launched seat context is expected to ingest the
|
|
375
|
+
regenerated instructions.
|
|
376
|
+
|
|
377
|
+
`room.json` records a short `contract` digest of the role documents and workspace protocol
|
|
378
|
+
this room was installed from. When it differs from what the installed package renders — or is
|
|
379
|
+
absent, because the room predates the field — setup and verify warn that the seats are holding
|
|
380
|
+
older text and ask for `setup --apply` plus a restart. It is provenance you compare by eye, not
|
|
381
|
+
a security claim. Rooms written before the field still parse.
|
|
382
|
+
|
|
383
|
+
One migration happens on the first upgraded apply: an existing Peer `skills` symlink becomes
|
|
384
|
+
the room-owned projection described above. Only the alias is unlinked, never your skills, and
|
|
385
|
+
setup stops with an actionable message rather than guessing if that path has become something
|
|
386
|
+
it does not recognize.
|
|
387
|
+
|
|
388
|
+
To roll back, run the prior package version with the same agent selection and `setup --apply`,
|
|
389
|
+
then restart the affected seats again:
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
npx paseo-room@<prior-version> setup --agent codex --agent claude --agent pi --apply
|
|
393
|
+
npx paseo-room@<prior-version> verify
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
No reverse data migration is needed; a prior package regenerates its own marker, including
|
|
397
|
+
dropping or restoring the contract digest as its own schema requires. Do not use `remove` for a
|
|
398
|
+
version rollback: it deletes the room home, including role-owned credential files. Re-running
|
|
399
|
+
setup is safe because it rewrites only managed configuration that differs and never replaces
|
|
400
|
+
role credential paths.
|
|
401
|
+
|
|
402
|
+
There are three separate evidence boundaries:
|
|
403
|
+
|
|
404
|
+
- `setup --apply` and `verify`, backed by regression tests, prove the generated/live
|
|
405
|
+
configuration chain: each room profile points to its exact role provider and owned mode,
|
|
406
|
+
each provider points to the exact role home, and each provider-selected role home carries
|
|
407
|
+
the exact prompt input with the applicable role contract and default workspace-protocol
|
|
408
|
+
sections.
|
|
409
|
+
- Delivery of those files and arguments into a newly launched model context relies on the
|
|
410
|
+
documented Codex, Claude Code and Pi configuration contracts for
|
|
411
|
+
`developer_instructions`, `CLAUDE.md`, and `--append-system-prompt`.
|
|
412
|
+
- Neither command proves that an already-running process loaded the latest generation, or
|
|
413
|
+
that a model followed instructions after receiving them. Re-run setup after source-config
|
|
414
|
+
changes and start the seat whose context must ingest the regenerated files.
|
|
254
415
|
|
|
255
416
|
Changing which agents you seat removes their providers and profiles but preserves deselected
|
|
256
417
|
role homes, because they may contain role-owned credentials or runtime state. Remove those
|
|
@@ -260,37 +421,55 @@ homes manually, or use the explicit whole-room removal after reviewing its warni
|
|
|
260
421
|
providers it registered. Its dry run warns before deletion. Native OS keyring entries are not
|
|
261
422
|
inspected or deleted and may remain; operator agent-home credentials are untouched. It refuses
|
|
262
423
|
to run if `--room-home` points at a directory containing your home directory, and it leaves
|
|
263
|
-
unrelated Paseo providers alone.
|
|
424
|
+
unrelated Paseo providers alone. If Paseo cleanup cannot start or complete, removal fails closed:
|
|
425
|
+
the room home and marker remain intact so you can restore Paseo connectivity and run the same
|
|
426
|
+
command again.
|
|
264
427
|
|
|
265
428
|
## The role contract
|
|
266
429
|
|
|
267
|
-
The exact wording every seat reads lives in
|
|
268
|
-
|
|
430
|
+
The exact model-facing wording every seat reads lives in the canonical Markdown under
|
|
431
|
+
[`src/room/prompts/`](src/room/prompts/). TypeScript selects those semantic sections with
|
|
432
|
+
`instructionKeys()` and `protocolKeys()`; it does not duplicate their prose. In short:
|
|
269
433
|
|
|
270
434
|
- **Supervisor** routes Human directives to Lead and observes. Before opening a seat it checks
|
|
271
|
-
for and reuses the project's existing Lead, including an idle or resumable Lead. It
|
|
272
|
-
|
|
273
|
-
|
|
435
|
+
for and reuses the project's existing Lead, including an idle or resumable Lead. It observes
|
|
436
|
+
the Lead–Peer process for named failures and advises with evidence, but advice carries no
|
|
437
|
+
technical authority: it does not edit project work, run validation, direct Peer, or decide
|
|
438
|
+
technical acceptance. Room tools: on.
|
|
274
439
|
- **Lead** is the durable owner of one project across turns. It owns framing, decomposition,
|
|
275
|
-
routing, integration and technical acceptance.
|
|
276
|
-
|
|
277
|
-
|
|
440
|
+
routing, integration and technical acceptance. A brief states the outcome and the evidence
|
|
441
|
+
that settles it rather than pre-solving the work; any plan or file list in it is provisional.
|
|
442
|
+
One moving write scope has exactly one owner, and at most one Peer is writable at a time.
|
|
443
|
+
Room tools: on.
|
|
444
|
+
- **Peer** owns one bounded outcome, forms its own technical position from the code and its own
|
|
445
|
+
verification, may challenge a failed premise with
|
|
278
446
|
`REOPEN_REQUEST` / `DEPENDENCY_REQUEST` / `BLOCKED`, hands back a reproducible candidate,
|
|
279
447
|
and never accepts its own difficult change. Room tools: off.
|
|
280
448
|
|
|
281
449
|
Human keeps product goals, priority, material cost, external effects and irreversible risk.
|
|
282
450
|
|
|
283
451
|
One rule has no runtime enforcement behind it and so is procedural and regression-tested in
|
|
284
|
-
the contract instead: **one Lead owns one project; Supervisor discovers and reuses
|
|
285
|
-
Lead alone opens Peer seats.**
|
|
286
|
-
|
|
287
|
-
|
|
452
|
+
the contract instead: **one Lead owns one project; Supervisor discovers, verifies and reuses
|
|
453
|
+
it, while Lead alone opens verified Peer seats.** The eligibility evidence is summarized
|
|
454
|
+
above and stated exactly in the contract sections linked there. A completed turn, idle state,
|
|
455
|
+
pending permission, or resumable closed session is not an
|
|
456
|
+
absent Lead. Fresh independent review means that existing Lead opens a fresh read-only Peer;
|
|
457
|
+
it never means Supervisor opens another Lead.
|
|
288
458
|
|
|
289
459
|
Paseo takes the seat to open as a plain provider id, so if two Leads nevertheless appear,
|
|
290
460
|
Supervisor stops parallel routing, preserves both histories, keeps the previously established
|
|
291
461
|
healthy owner, and closes the duplicate only after a stable handoff. Ambiguous ownership,
|
|
292
462
|
health, or concurrent writes go back to Human rather than being guessed or merged.
|
|
293
463
|
|
|
464
|
+
Two further limits are deliberately conservative. **One writable Peer per project**, not one
|
|
465
|
+
per moving scope: the room gives you no writer isolation, so separate scopes are not evidence
|
|
466
|
+
of separate working trees, and no workspace protocol relaxes the limit. Concurrent writable
|
|
467
|
+
Peers in isolated worktrees are a deferred decision, not an oversight. And a seat's **model and
|
|
468
|
+
reasoning effort are defaults**: Lead varies them for a brief only where the repository's
|
|
469
|
+
workspace protocol supplies an explicit task-risk policy, and never up to a tier advertising
|
|
470
|
+
automatic delegation. Provider, mode, workspace, parent and feature values are eligibility
|
|
471
|
+
evidence and copied exactly.
|
|
472
|
+
|
|
294
473
|
Every seat also carries a **default workspace protocol** — topology by difficulty,
|
|
295
474
|
verification, review, repository conventions — so a project has that layer without doing
|
|
296
475
|
anything. Each seat gets the sections that bear on its own work; topology goes to Lead and
|
|
@@ -348,7 +527,7 @@ that review; Supervisor must route the request to Lead rather than opening a fre
|
|
|
348
527
|
## Development
|
|
349
528
|
|
|
350
529
|
```bash
|
|
351
|
-
npm run verify # typecheck, lint, test, build — the gate order
|
|
530
|
+
npm run verify # typecheck, lint, test, build, packed-package test — the gate order
|
|
352
531
|
```
|
|
353
532
|
|
|
354
533
|
Releases are published to npm from a GitHub Release; see
|