paseo-room 0.4.0 → 0.5.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 (38) hide show
  1. package/README.md +122 -70
  2. package/dist/index.js +345 -212
  3. package/dist/index.js.map +1 -1
  4. package/dist/prompts/contract/lead.md +152 -0
  5. package/dist/prompts/contract/peer.md +62 -0
  6. package/dist/prompts/contract/shared-authority.md +33 -0
  7. package/dist/prompts/contract/shared-seat-identity.md +18 -0
  8. package/dist/prompts/contract/supervisor.md +89 -0
  9. package/dist/skills/paseo-project-onboarding/SKILL.md +122 -0
  10. package/dist/skills/paseo-project-onboarding/references/workspace-protocol-template.md +56 -0
  11. package/package.json +2 -2
  12. package/dist/prompts/contract/lead/complete-peer-brief.md +0 -32
  13. package/dist/prompts/contract/lead/independent-review.md +0 -9
  14. package/dist/prompts/contract/lead/moving-write-ownership.md +0 -13
  15. package/dist/prompts/contract/lead/peer-seat-lifecycle.md +0 -39
  16. package/dist/prompts/contract/lead/project-technical-ownership.md +0 -12
  17. package/dist/prompts/contract/lead/technical-acceptance.md +0 -6
  18. package/dist/prompts/contract/peer/assignment-scope.md +0 -10
  19. package/dist/prompts/contract/peer/bounded-outcome.md +0 -13
  20. package/dist/prompts/contract/peer/independent-judgment.md +0 -11
  21. package/dist/prompts/contract/peer/no-orchestration.md +0 -5
  22. package/dist/prompts/contract/peer/no-self-acceptance.md +0 -5
  23. package/dist/prompts/contract/peer/reproducible-handoff.md +0 -17
  24. package/dist/prompts/contract/shared/evidence-and-event-waiting.md +0 -7
  25. package/dist/prompts/contract/shared/human-authority.md +0 -8
  26. package/dist/prompts/contract/shared/scope-and-unrelated-work.md +0 -4
  27. package/dist/prompts/contract/shared-supervisor-lead/workspace-protocol-precedence.md +0 -18
  28. package/dist/prompts/contract/supervisor/directive-integrity.md +0 -5
  29. package/dist/prompts/contract/supervisor/escalation-boundaries.md +0 -5
  30. package/dist/prompts/contract/supervisor/lead-discovery-and-recovery.md +0 -52
  31. package/dist/prompts/contract/supervisor/observation-and-advice.md +0 -13
  32. package/dist/prompts/contract/supervisor/technical-non-interference.md +0 -8
  33. package/dist/prompts/documents/workspace.md +0 -6
  34. package/dist/prompts/workspace/repository-conventions.md +0 -7
  35. package/dist/prompts/workspace/review.md +0 -4
  36. package/dist/prompts/workspace/topology.md +0 -13
  37. package/dist/prompts/workspace/verification.md +0 -10
  38. /package/dist/prompts/contract/{shared-lead-peer/challenge-signals.md → challenge-signals.md} +0 -0
package/README.md CHANGED
@@ -89,7 +89,9 @@ starts, its exit code is preserved; a signal is returned using the conventional
89
89
  ~/.paseo-room/
90
90
  room.json # what this CLI created; verify and remove read it
91
91
  AUTHENTICATION.md # exact per-role login commands; contains no secrets
92
- room/WORKSPACE_PROTOCOL.md # the default protocol Lead and Supervisor carry, as one readable file
92
+ room/skills/paseo-project-onboarding/ # Lead-only Agent Skill: draft a repository protocol
93
+ SKILL.md, references/ # procedure plus a scaffold loaded only when the skill runs
94
+ room/skill-projections/<agent>/lead/ # exact Lead skill aggregate for each seated agent
93
95
  plugin/ # Claude only: trusted creation-time system-prompt append carrier
94
96
  paseo-plugin.json # accepts Paseo >=0.8.0 <0.9.0
95
97
  index.server.ts, server/ # exact provider map + generated role contracts
@@ -98,20 +100,20 @@ starts, its exit code is preserved; a signal is returned using the conventional
98
100
  role-instructions.md # readable copy of what this seat was told
99
101
  model-catalog.json # generated copy of your catalog, native multi-agent metadata removed
100
102
  auth.json # created and owned by Codex after role login, if file-backed
101
- AGENTS.md, skills, plugins, hooks.json → symlinks into ~/.codex when present (Peer: see below)
103
+ AGENTS.md, skills, plugins, hooks.json → shared resources (Lead/Peer: see below)
102
104
  roles/claude/<role>/
103
105
  CLAUDE.md # your global memory + role instructions (contract omitted with --no-claude-memory-contract)
104
- settings.json # your settings.json + PASEO_ROOM_ROLE
106
+ settings.json # minimal room-owned env, deny and control-plane policy
105
107
  .claude.json # seeded once from yours, then owned by Claude
106
108
  .credentials.json # created and owned by Claude after role login, if file-backed
107
109
  skills, plugins, commands, hooks, rules, output-styles,
108
- keybindings.json, themes → symlinks into ~/.claude when present (Peer: see below)
110
+ keybindings.json, themes → shared resources (Lead/Peer: see below)
109
111
  roles/pi/<role>/
110
112
  settings.json # your settings minus package/extension declarations
111
113
  APPEND_SYSTEM.md # your append + style/runtime capsules + role instructions
112
114
  auth.json # created and owned by Pi after role login, if used
113
115
  models.json, AGENTS.md, skills, prompts, themes,
114
- keybindings.json, mcp.json → symlinks into ~/.pi/agent when present (Peer: see below)
116
+ keybindings.json, mcp.json → shared resources (Lead/Peer: see below)
115
117
  ```
116
118
 
117
119
  Each seat gets its own file-backed credential path, sessions, history and projects inside its
@@ -125,7 +127,14 @@ file. Anything else at a managed path — a directory where a file belongs, an u
125
127
  symlink — makes setup stop and name the path for you to move aside. Nothing is deleted
126
128
  recursively on your behalf.
127
129
 
128
- ### What Peer does not receive
130
+ ### How Lead and Peer receive skills
131
+
132
+ Lead's `skills` remains a symlink, but now points to a room-owned managed aggregate containing
133
+ links to every noncolliding operator skill plus the room-owned `paseo-project-onboarding` skill.
134
+ This adds the room skill without writing into your agent home, while keeping the role path
135
+ replaceable by an older package during rollback. An operator skill whose name collides
136
+ case-insensitively remains untouched but is shadowed in the aggregate by the room-owned copy,
137
+ avoiding duplicate names on case-insensitive filesystems.
129
138
 
130
139
  Peer has no room tools, so the room also stops handing it orchestration surfaces:
131
140
 
@@ -138,9 +147,9 @@ Peer has no room tools, so the room also stops handing it orchestration surfaces
138
147
  removing one of your skills is drift `verify` reports and `setup --apply` reconciles.
139
148
 
140
149
  Your own skills directory is never modified: `paseo*` skills stay exactly where they are.
141
- An existing room upgrades its one legacy Peer `skills` symlink to that projection on the next
142
- `setup --apply`; setup only unlinks the alias, never your skills, and stops with an actionable
143
- message if that path has become something it does not recognize.
150
+ On the next `setup --apply`, an existing Lead `skills` symlink is retargeted to its room aggregate,
151
+ while a legacy Peer symlink becomes its managed directory. Setup only replaces or unlinks those
152
+ aliases, never your skills, and stops with an actionable message for an unrecognized Peer shape.
144
153
 
145
154
  This is capability hygiene, not a sandbox. Peer still has shell access.
146
155
 
@@ -170,8 +179,8 @@ and environment-variable names. They never read credential contents, query a key
170
179
  a token over the network, or claim OAuth freshness. Authentication findings are warnings and
171
180
  do not turn an otherwise valid setup or verify into a failure:
172
181
 
173
- - **configured structurally** — a regular role credential file or supported auth configuration
174
- name exists; validity and freshness were not checked;
182
+ - **configured structurally** — a regular role credential file exists; validity and freshness
183
+ were not checked;
175
184
  - **login-required** — no role credential artifact or safely recognizable alternative exists;
176
185
  - **legacy-shared-risk** — an older room has a credential symlink, including one whose target
177
186
  may now be missing; only its stored link text is read, it is preserved, and the output gives
@@ -206,12 +215,12 @@ argv. No login path reads, copies, links, replaces, validates, or deletes a cred
206
215
 
207
216
  Codex diagnostics recognize an explicit `cli_auth_credentials_store` of `file`, `ephemeral`,
208
217
  `auto`, or `keyring`. An `OPENAI_API_KEY` name in the setup shell does not count as stored role
209
- auth; Codex's API-key login must create that role's native store. Claude recognizes the
210
- documented cloud selectors, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_API_KEY`,
211
- `CLAUDE_CODE_OAUTH_TOKEN`, and `apiKeyHelper` by name. Pi recognizes a bounded list of built-in
212
- provider API-key environment names. Names found only in the setup process are ambient and
213
- unverifiable because their values are not copied into Paseo providers; other ambient provider
214
- authentication may exist but is not validated.
218
+ auth; Codex's API-key login must create that role's native store. Claude role settings do not
219
+ import operator auth helpers; diagnostics recognize only ambient documented cloud selectors,
220
+ `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_API_KEY`, and `CLAUDE_CODE_OAUTH_TOKEN` by name. Pi recognizes a
221
+ bounded list of built-in provider API-key environment names. Names found only in the setup process
222
+ are ambient and unverifiable because their values are not copied into Paseo providers; other
223
+ ambient provider authentication may exist but is not validated.
215
224
 
216
225
  ## What the room changes
217
226
 
@@ -286,13 +295,13 @@ attribute `/mcp` to `source: "extension"` at that same canonical path. Missing,
286
295
  path-escaped or wrongly attributed adapters fail closed. The probe and setup do not write the
287
296
  operator or planned role homes.
288
297
 
289
- Each seat is also pinned at the Paseo provider level, because a provider entry outranks the
290
- agent's own configuration:
298
+ Each seat combines generated agent configuration with Paseo provider pins. Provider fields are
299
+ still required where Paseo launch state outranks the agent's own configuration:
291
300
 
292
301
  | Pin | Applies to | Why |
293
302
  |---|---|---|
294
303
  | `params: {sandbox_mode, approval_policy}` | Codex | Without it Paseo sends its own mode preset (default `auto-review`) to the Codex app-server, and that outranks the generated `config.toml`. |
295
- | `disallowedTools` for `Task`, `Agent`, `Workflow`, coordination, task-list, cron and team tools | Claude | Blocks legacy/current subagents, dynamic workflows, cross-session coordination and agent teams. |
304
+ | provider `disallowedTools` + role `permissions.deny` for `Task`, `Agent`, `Workflow`, coordination, task-list, cron and team tools | Claude | Blocks legacy/current subagents, dynamic workflows, cross-session coordination and agent teams at both Paseo and Claude's role settings. |
296
305
  | `disableAgentView: true` + `CLAUDE_CODE_DISABLE_AGENT_VIEW=1` | Claude | Disables Claude's separate background-agent control plane across settings scopes and at launch. |
297
306
  | `disableWorkflows: true` + `CLAUDE_CODE_DISABLE_WORKFLOWS=1` | Claude | Disables dynamic workflows through every entry point, beyond denying the `Workflow` tool. |
298
307
  | `crossSessionInbound: "refuse"` | Claude | Prevents another Claude session from injecting a turn into a room seat. |
@@ -302,7 +311,8 @@ agent's own configuration:
302
311
  `verify` compares each provider's `command`, `env`, `paseoTools` and pins against what the
303
312
  room would write, and fails if one has been dropped — a pin that can be silently removed is
304
313
  not a guarantee. The `env` map is compared whole rather than as a subset, because an added key
305
- can re-enable exactly what a pin closes. Unrelated top-level provider fields stay yours.
314
+ can re-enable exactly what a pin closes. Unrelated top-level provider fields stay yours. Claude
315
+ role `settings.json` is compared separately as a managed file, including `permissions.deny`.
306
316
 
307
317
  It also saves one **agent profile** per seat, which is what the Paseo picker lists under
308
318
  Profiles. A profile is a preset, not a constraint: it decides where a seat *starts*.
@@ -332,10 +342,12 @@ stale room-owned value from an existing Pi profile. Pi has no sandbox or approva
332
342
  its permissive runtime is necessary for headless operation but grants no additional authority.
333
343
 
334
344
  Claude starts in Paseo's `bypassPermissions` mode, while Codex starts in its equivalent
335
- `full-access` mode. Claude deny rules still apply in bypass mode, so native orchestration
336
- stays unavailable. The room does not write `permissions.defaultMode` to `settings.json`:
337
- Paseo passes the profile's mode as a command-line session setting, which outranks that file.
338
- The two Claude disable environment keys are pinned in both the provider and generated
345
+ `full-access` mode. Claude deny rules still apply in bypass mode, so the canonical native-tool
346
+ list is written to both provider `disallowedTools` and every role's `settings.json` under
347
+ `permissions.deny`. The role file is minimal, deterministic room policy: it does not copy operator
348
+ env, hooks, permissions, or auth helpers. The room does not write `permissions.defaultMode`:
349
+ Paseo passes the profile's mode as a command-line session setting, which outranks that file. The two
350
+ Claude disable environment keys are likewise pinned in both the provider and generated
339
351
  `settings.json`, because Claude applies settings-file environment values after launch values.
340
352
  The generated top-level `disableAgentView` and `disableWorkflows` settings are also forced to
341
353
  `true`; their restrictive value cannot be weakened by another ordinary settings scope.
@@ -349,18 +361,18 @@ the operator.
349
361
  Names are not identity. A matching cwd, title, or provider label does not make an existing
350
362
  agent a room Lead or Peer. The exact eligibility procedure is model-facing wording and lives
351
363
  in the contract itself —
352
- [Lead Discovery and Recovery](src/room/prompts/contract/supervisor/lead-discovery-and-recovery.md)
353
- for Supervisor and
354
- [Peer Seat Lifecycle](src/room/prompts/contract/lead/peer-seat-lifecycle.md) for Lead — rather
355
- than being restated here. In outline: the seat's evidence is the current live configuration.
356
- Supervisor reads the exact current `room-<agent>-lead` profile from `list_profiles` and
357
- materializes every field it defines (agent creation takes no profile id), uses `list_agents(cwd)`
358
- only to find candidates, then inspects each one's full status for the profile's provider, the
359
- intended workspace and its mode. For `room-<agent>-peer`, Lead copies provider, mode and
360
- features exactly, keeps the profile's model unless the root workspace protocol routes models,
361
- chooses the thinking effort for the brief, and additionally
362
- requires the live seat's daemon-added `paseo.parent-agent-id` to name itself. Ownership must be
363
- corroborated by parentage or known Human-opened history; an ambiguous candidate goes to
364
+ the shared [Room Seat Identity](src/room/prompts/contract/shared-seat-identity.md) evidence,
365
+ with the role-specific procedures in
366
+ [the Supervisor contract](src/room/prompts/contract/supervisor.md) and
367
+ [the Lead contract](src/room/prompts/contract/lead.md) — rather than being restated here. In
368
+ outline: the seat's evidence is the current live configuration. Both seats read the exact current
369
+ `room-<agent>-<role>` profile from `list_profiles`, materialize every field it defines (agent
370
+ creation takes no profile id), then inspect the live seat's provider, workspace and mode.
371
+ Supervisor additionally uses `list_agents(cwd)` for discovery and corroborates Lead ownership by
372
+ parentage or known Human-opened history. For `room-<agent>-peer`, Lead copies provider, mode and
373
+ features exactly, keeps the profile's model unless a repository protocol routes models,
374
+ chooses the thinking effort under that repository protocol's policy, and requires the live seat's
375
+ daemon-added `paseo.parent-agent-id` to name itself. An ambiguous Lead candidate goes to
364
376
  duplicate recovery and Human escalation instead of being adopted.
365
377
 
366
378
  Current Paseo agent sessions do not retain `profileId`. A direct launch with the exact
@@ -370,9 +382,10 @@ provider ids or claim that the daemon enforces this procedural eligibility check
370
382
 
371
383
  ## Keeping the room current
372
384
 
373
- Role homes are generated once, at `setup` time. After you edit `~/.codex/config.toml`,
374
- `~/.claude/settings.json`, or Pi's `settings.json` / `APPEND_SYSTEM.md`, run setup again to
375
- fold the change into every seat. The same applies after upgrading `paseo-room`; a release
385
+ Role homes are generated once, at `setup` time. After you edit `~/.codex/config.toml` or Pi's
386
+ `settings.json` / `APPEND_SYSTEM.md`, run setup again to fold the change into every seat. Claude's
387
+ operator `settings.json` is not an input to its minimal room settings. The same applies after
388
+ upgrading `paseo-room`; a release
376
389
  that changes generated headings or prompt assets produces expected one-time managed-file
377
390
  drift.
378
391
 
@@ -392,16 +405,20 @@ seat after the apply; sending another turn to an already-running seat is not a r
392
405
  context reloaded them. Only a newly launched seat context is expected to ingest the
393
406
  regenerated instructions.
394
407
 
395
- `room.json` records a short `contract` digest of the role documents and workspace protocol
396
- this room was installed from. When it differs from what the installed package renders — or is
397
- absent, because the room predates the field — setup and verify warn that the seats are holding
398
- older text and ask for `setup --apply` plus a restart. It is provenance you compare by eye, not
399
- a security claim. Rooms written before the field still parse.
408
+ `room.json` records a short `contract` digest of the three rendered role documents this room
409
+ was installed from. When it differs from what the installed package renders — or is absent,
410
+ because the room predates the field — setup and verify warn that the seats are holding older
411
+ text and ask for `setup --apply` plus a restart. It is provenance you compare by eye, not a
412
+ security claim. Rooms written before the field still parse.
413
+
414
+ The room-owned skill files are live managed entries instead: `verify` compares their exact bytes,
415
+ so a skill update is not reported as stale seat instructions.
400
416
 
401
- One migration happens on the first upgraded apply: an existing Peer `skills` symlink becomes
402
- the room-owned projection described above. Only the alias is unlinked, never your skills, and
403
- setup stops with an actionable message rather than guessing if that path has become something
404
- it does not recognize.
417
+ On the first upgraded apply, each Lead `skills` symlink is retargeted to its room-owned aggregate
418
+ and an existing Peer `skills` symlink becomes the room-owned projection described above. Only
419
+ aliases are replaced or unlinked, never your skills. Lead retains the symlink shape the prior
420
+ package expects, so package-level rollback can retarget it without a reverse migration; setup
421
+ still stops rather than guessing if the Peer path has become something it does not recognize.
405
422
 
406
423
  To roll back, run the prior package version with the same agent selection and `setup --apply`,
407
424
  then restart the affected seats again:
@@ -422,8 +439,7 @@ There are three separate evidence boundaries:
422
439
  - `setup --apply` and `verify`, backed by regression tests, prove the generated/live
423
440
  configuration chain: each room profile points to its exact role provider and owned mode,
424
441
  each provider points to the exact role home, and each provider-selected role home carries
425
- the exact prompt input with the applicable role contract and default workspace-protocol
426
- sections.
442
+ the exact prompt input with the applicable role contract.
427
443
  - Delivery of those files and arguments into a newly launched model context relies on the
428
444
  documented Codex, Claude Code and Pi configuration contracts for
429
445
  `developer_instructions`, `CLAUDE.md`, and `--append-system-prompt`.
@@ -446,8 +462,10 @@ command again.
446
462
  ## The role contract
447
463
 
448
464
  The exact model-facing wording every seat reads lives in the canonical Markdown under
449
- [`src/room/prompts/`](src/room/prompts/). TypeScript selects those semantic sections with
450
- `instructionKeys()` and `protocolKeys()`; it does not duplicate their prose. In short:
465
+ [`src/room/prompts/`](src/room/prompts/), organised by who reads it: one shared authority body
466
+ for every role, shared room-seat identity evidence for Supervisor and Lead, the shared challenge
467
+ vocabulary for Lead and Peer, and exactly one body per role. TypeScript selects those layers with
468
+ `instructionKeys()`; it does not duplicate their prose. In short:
451
469
 
452
470
  - **Supervisor** routes Human directives to Lead and observes. Before opening a seat it checks
453
471
  for and reuses the project's existing Lead, including an idle or resumable Lead. It observes
@@ -457,8 +475,9 @@ The exact model-facing wording every seat reads lives in the canonical Markdown
457
475
  - **Lead** is the durable owner of one project across turns. It owns framing, decomposition,
458
476
  routing, integration and technical acceptance. A brief states the outcome and the evidence
459
477
  that settles it rather than pre-solving the work; any plan or file list in it is provisional.
460
- One moving write scope has exactly one owner, and at most one Peer is writable at a time.
461
- Room tools: on.
478
+ One moving write scope has exactly one owner, and at most one Peer is writable at a time. It
479
+ explicitly requests native Paseo completion/error/permission notification for Peer creation and
480
+ every background follow-up, then waits for events rather than polling. Room tools: on.
462
481
  - **Peer** owns one bounded assignment — writable inside an assigned scope, or read-only
463
482
  against a named candidate, question or area — under exactly one disposition Lead names in the
464
483
  brief (Engineer, Architect, Reviewer or Scout), forms its own technical position from the code
@@ -485,24 +504,57 @@ Two further limits are deliberately conservative. **One writable Peer per projec
485
504
  per moving scope: the room gives you no writer isolation, so separate scopes are not evidence
486
505
  of separate working trees, and no workspace protocol relaxes the limit. Concurrent writable
487
506
  Peers in isolated worktrees are a deferred decision, not an oversight. And a seat's **model and
488
- reasoning effort are not one knob**: the model stays the profile's default unless the root
489
- `WORKSPACE_PROTOCOL.md` explicitly supplies model routing, while the thinking effort is Lead's
507
+ reasoning effort are not one knob**: the model stays the profile's default unless a repository
508
+ protocol explicitly supplies model routing, while the thinking effort is Lead's
490
509
  per-brief choice on task risk, uncertainty, context size and verification burden — lowest that
491
510
  reliably answers the task, higher for architecture-sensitive or weakly observable work, only an
492
511
  option the live Paseo and provider context establishes as supported, and never up to a tier
493
512
  advertising automatic delegation. Provider, mode, workspace, parent and feature values are
494
513
  eligibility evidence and copied exactly.
495
514
 
496
- Every seat that owns workflow also carries a **default workspace protocol** — topology by
497
- difficulty, verification, review, repository conventions — so a project has that layer without
498
- doing anything. It goes to Lead and Supervisor, not to Peer: Lead reads the protocol and quotes
499
- what bears on an assignment into the brief, including the exact verification command, so a Peer
500
- spends its attention on one brief rather than on deciding which repository rules apply. A
501
- repository that needs different rules writes `WORKSPACE_PROTOCOL.md` at its root, which wins
502
- wherever it speaks while the default holds wherever it is silent — the root, because it is
503
- agent guidance rather than project documentation. `~/.paseo-room/room/WORKSPACE_PROTOCOL.md` is
504
- the whole default as one file, so you can read what is in force and start from it. The CLI
505
- never writes into a repository.
515
+ The room ships **no default workspace protocol**. A repository's root `WORKSPACE_PROTOCOL.md`
516
+ is optional, and when it exists it is that repository's complete workflow policy — there is no
517
+ hidden room document behind it to reconcile point by point, and no unstated rule survives where
518
+ it is silent. It stays subordinate to the authority floor: repository workflow directs how work
519
+ is done and can never enlarge or weaken role authority. The file lives at the repository root
520
+ because it is agent guidance rather than project documentation. The CLI never writes into a
521
+ repository.
522
+
523
+ Reading it goes to **Lead alone**, the only standing reader of workflow policy: Lead resolves
524
+ the repository root, reads the file in full when the repository ships one, and quotes what bears
525
+ on an assignment into the brief, including the exact verification command. Supervisor reads a
526
+ repository's protocol only under an explicit Human audit, update or maintenance mandate;
527
+ ordinary routing and observation need none of it, and it may propose a change with causal
528
+ evidence but never impose one. Peer is never told the filename at all, so it spends its attention
529
+ on one brief rather than on deciding which repository rules apply — what it needs unconditionally
530
+ is in its own contract, including the floor that no repository or workspace instruction can
531
+ enlarge or weaken its authority, with conflicts routed to Lead.
532
+
533
+ Lead's own contract carries a short, visible **operating baseline**, not another workspace
534
+ policy: compact Engineer/Architect/Reviewer/Scout assignment vocabulary; exact profile model and
535
+ thinking defaults absent explicit repository routing; the obligation to name and run the
536
+ repository's own verification gate; and fresh read-only review when Human or a repository
537
+ protocol requires it, or when Lead sees material technical risk. These stated contract rules
538
+ remain visible when a repository protocol is silent; no generic topology matrix, anti-pattern
539
+ catalog, or protocol-evolution policy survives in any prompt.
540
+
541
+ To write a protocol, Lead has one room-owned **Agent Skill**, `paseo-project-onboarding`,
542
+ delivered to Lead's `skills` directory from `~/.paseo-room/room/skills/` and to no other seat.
543
+ It inspects what the repository actually contains — agent instructions, README/CONTRIBUTING,
544
+ build manifests and scripts, CI, test configuration, architecture and operations docs — and
545
+ returns an evidence map, one standalone complete draft, and the decisions Human still owns,
546
+ separating observed facts from proposals rather than guessing. It is proposal-first: it writes
547
+ nothing by default, and writes the repository's root `WORKSPACE_PROTOCOL.md` only under an
548
+ explicit Human instruction to apply the draft, refusing any non-regular shape at that path and
549
+ leaving unrelated work alone. It cannot change authority, tool policy, the writer limit,
550
+ provider identity or credentials, and cannot make Peer a protocol reader. Its bundled template
551
+ is a scaffold loaded while the skill runs, never appended to a session.
552
+
553
+ Lead's visible skill inventory is therefore an exact room-owned aggregate behind the role-home
554
+ symlink: one link per skill in your own agent home, plus a link to the room's skill. Your own home
555
+ is never modified, and an operator skill whose name matches `paseo-project-onboarding` under a
556
+ case-insensitive comparison is left exactly where it is — the room-owned copy owns that name
557
+ inside the aggregate only.
506
558
 
507
559
  ## Working the room
508
560
 
@@ -541,9 +593,9 @@ that review; Supervisor must route the request to Lead rather than opening a fre
541
593
 
542
594
  ## Documentation
543
595
 
544
- - [docs/orchestration-model.md](docs/orchestration-model.md) — the reference model this
545
- tool implements: roles, authority, instruction layers, invariants, anti-patterns and
546
- operating checklists. Tool-agnostic; useful on its own.
596
+ - [docs/demonthorn-agent-orchestration-deep-dive.md](docs/demonthorn-agent-orchestration-deep-dive.md)
597
+ — the reference model this tool implements: roles, authority, instruction layers, invariants,
598
+ anti-patterns and operating checklists. Tool-agnostic; useful on its own.
547
599
  - [docs/design.md](docs/design.md) — how and why this tool implements that model, and what
548
600
  it deliberately does not do. Read this before changing an override.
549
601
  - [AGENTS.md](AGENTS.md) — working rules for contributors and coding agents.