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.
Files changed (36) hide show
  1. package/README.md +220 -41
  2. package/dist/index.js +1107 -466
  3. package/dist/index.js.map +1 -1
  4. package/dist/prompts/contract/lead/complete-peer-brief.md +10 -0
  5. package/dist/prompts/contract/lead/independent-review.md +9 -0
  6. package/dist/prompts/contract/lead/moving-write-ownership.md +13 -0
  7. package/dist/prompts/contract/lead/peer-seat-lifecycle.md +30 -0
  8. package/dist/prompts/contract/lead/project-technical-ownership.md +12 -0
  9. package/dist/prompts/contract/lead/technical-acceptance.md +6 -0
  10. package/dist/prompts/contract/peer/bounded-outcome.md +5 -0
  11. package/dist/prompts/contract/peer/independent-judgment.md +11 -0
  12. package/dist/prompts/contract/peer/no-orchestration.md +5 -0
  13. package/dist/prompts/contract/peer/no-self-acceptance.md +5 -0
  14. package/dist/prompts/contract/peer/reproducible-handoff.md +5 -0
  15. package/dist/prompts/contract/peer/writing-and-review-scope.md +5 -0
  16. package/dist/prompts/contract/shared/evidence-and-event-waiting.md +7 -0
  17. package/dist/prompts/contract/shared/human-authority.md +8 -0
  18. package/dist/prompts/contract/shared/scope-and-unrelated-work.md +4 -0
  19. package/dist/prompts/contract/shared/workspace-protocol-precedence.md +15 -0
  20. package/dist/prompts/contract/shared-lead-peer/challenge-signals.md +9 -0
  21. package/dist/prompts/contract/supervisor/directive-integrity.md +5 -0
  22. package/dist/prompts/contract/supervisor/escalation-boundaries.md +5 -0
  23. package/dist/prompts/contract/supervisor/lead-discovery-and-recovery.md +52 -0
  24. package/dist/prompts/contract/supervisor/observation-and-advice.md +13 -0
  25. package/dist/prompts/contract/supervisor/technical-non-interference.md +8 -0
  26. package/dist/prompts/documents/lead.md +3 -0
  27. package/dist/prompts/documents/peer.md +3 -0
  28. package/dist/prompts/documents/supervisor.md +3 -0
  29. package/dist/prompts/documents/workspace.md +5 -0
  30. package/dist/prompts/pi/communication-style.md +5 -0
  31. package/dist/prompts/pi/runtime.md +7 -0
  32. package/dist/prompts/workspace/repository-conventions.md +7 -0
  33. package/dist/prompts/workspace/review.md +4 -0
  34. package/dist/prompts/workspace/topology.md +13 -0
  35. package/dist/prompts/workspace/verification.md +8 -0
  36. 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, plugins and other supported resources may be symlinked.
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 the changes. |
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 with native multi-agent metadata removed
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
- Authenticate each role manually when its diagnostic asks:
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
- CODEX_HOME=<role-home> codex login
134
- CODEX_HOME=<role-home> codex login status
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. Skipped, with a warning, if your Codex cannot produce a catalog. |
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`, the same sandbox and approval overrides are written
167
- into that profile too, because a profile outranks the top-level keys. Your model, reasoning
168
- effort, MCP servers, trusted projects and every other key are copied through untouched.
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 `setup --apply`
251
- again to fold the change into every seat.
252
- `verify` reports the drift in the meantime, and re-running `setup` is safe: it rewrites only
253
- managed configuration that differs and never replaces role credential paths.
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 [`src/room/clauses.ts`](src/room/clauses.ts).
268
- In short:
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 does
272
- not edit project work, run validation, direct Peer, or decide technical acceptance. Room
273
- tools: on.
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. One moving write scope has exactly one
276
- owner, and at most one Peer is writable at a time. Room tools: on.
277
- - **Peer** owns one bounded outcome, may challenge a failed premise with
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 it, while
285
- Lead alone opens Peer seats.** A completed turn, idle state, pending permission, or resumable
286
- closed session is not an absent Lead. Fresh independent review means that existing Lead opens
287
- a fresh read-only Peer; it never means Supervisor opens another Lead.
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