paseo-room 0.2.0 → 0.3.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 CHANGED
@@ -88,7 +88,7 @@ starts, its exit code is preserved; a signal is returned using the conventional
88
88
  ~/.paseo-room/
89
89
  room.json # what this CLI created; verify and remove read it
90
90
  AUTHENTICATION.md # exact per-role login commands; contains no secrets
91
- room/WORKSPACE_PROTOCOL.md # the default protocol every seat carries, as one readable file
91
+ room/WORKSPACE_PROTOCOL.md # the default protocol Lead and Supervisor carry, as one readable file
92
92
  plugin/ # Claude only: trusted creation-time system-prompt append carrier
93
93
  paseo-plugin.json # accepts Paseo >=0.8.0 <0.9.0
94
94
  index.server.ts, server/ # exact provider map + generated role contracts
@@ -348,7 +348,8 @@ Supervisor reads the exact current `room-<agent>-lead` profile from `list_profil
348
348
  materializes every field it defines (agent creation takes no profile id), uses `list_agents(cwd)`
349
349
  only to find candidates, then inspects each one's full status for the profile's provider, the
350
350
  intended workspace and its mode. For `room-<agent>-peer`, Lead copies provider, mode and
351
- features exactly, treats model and thinking as protocol-governed defaults, and additionally
351
+ features exactly, keeps the profile's model unless the root workspace protocol routes models,
352
+ chooses the thinking effort for the brief, and additionally
352
353
  requires the live seat's daemon-added `paseo.parent-agent-id` to name itself. Ownership must be
353
354
  corroborated by parentage or known Human-opened history; an ambiguous candidate goes to
354
355
  duplicate recovery and Human escalation instead of being adopted.
@@ -449,10 +450,12 @@ The exact model-facing wording every seat reads lives in the canonical Markdown
449
450
  that settles it rather than pre-solving the work; any plan or file list in it is provisional.
450
451
  One moving write scope has exactly one owner, and at most one Peer is writable at a time.
451
452
  Room tools: on.
452
- - **Peer** owns one bounded outcome, forms its own technical position from the code and its own
453
- verification, may challenge a failed premise with
454
- `REOPEN_REQUEST` / `DEPENDENCY_REQUEST` / `BLOCKED`, hands back a reproducible candidate,
455
- and never accepts its own difficult change. Room tools: off.
453
+ - **Peer** owns one bounded assignment — writable inside an assigned scope, or read-only
454
+ against a named candidate, question or area — under exactly one disposition Lead names in the
455
+ brief (Engineer, Architect, Reviewer or Scout), forms its own technical position from the code
456
+ and its own verification, may challenge a failed premise with
457
+ `REOPEN_REQUEST` / `DEPENDENCY_REQUEST` / `BLOCKED`, hands back reproducible evidence either
458
+ way, and never accepts its own difficult change. Room tools: off.
456
459
 
457
460
  Human keeps product goals, priority, material cost, external effects and irreversible risk.
458
461
 
@@ -473,18 +476,24 @@ Two further limits are deliberately conservative. **One writable Peer per projec
473
476
  per moving scope: the room gives you no writer isolation, so separate scopes are not evidence
474
477
  of separate working trees, and no workspace protocol relaxes the limit. Concurrent writable
475
478
  Peers in isolated worktrees are a deferred decision, not an oversight. And a seat's **model and
476
- reasoning effort are defaults**: Lead varies them for a brief only where the repository's
477
- workspace protocol supplies an explicit task-risk policy, and never up to a tier advertising
478
- automatic delegation. Provider, mode, workspace, parent and feature values are eligibility
479
- evidence and copied exactly.
480
-
481
- Every seat also carries a **default workspace protocol** — topology by difficulty,
482
- verification, review, repository conventions — so a project has that layer without doing
483
- anything. Each seat gets the sections that bear on its own work; topology goes to Lead and
484
- Supervisor, not to Peer. A repository that needs different rules writes
485
- `docs/WORKSPACE_PROTOCOL.md`, which wins wherever it speaks while the default holds
486
- wherever it is silent. `~/.paseo-room/room/WORKSPACE_PROTOCOL.md` is the whole default as
487
- one file, so you can read what is in force and start from it.
479
+ reasoning effort are not one knob**: the model stays the profile's default unless the root
480
+ `WORKSPACE_PROTOCOL.md` explicitly supplies model routing, while the thinking effort is Lead's
481
+ per-brief choice on task risk, uncertainty, context size and verification burden — lowest that
482
+ reliably answers the task, higher for architecture-sensitive or weakly observable work, only an
483
+ option the live Paseo and provider context establishes as supported, and never up to a tier
484
+ advertising automatic delegation. Provider, mode, workspace, parent and feature values are
485
+ eligibility evidence and copied exactly.
486
+
487
+ Every seat that owns workflow also carries a **default workspace protocol** — topology by
488
+ difficulty, verification, review, repository conventions — so a project has that layer without
489
+ doing anything. It goes to Lead and Supervisor, not to Peer: Lead reads the protocol and quotes
490
+ what bears on an assignment into the brief, including the exact verification command, so a Peer
491
+ spends its attention on one brief rather than on deciding which repository rules apply. A
492
+ repository that needs different rules writes `WORKSPACE_PROTOCOL.md` at its root, which wins
493
+ wherever it speaks while the default holds wherever it is silent — the root, because it is
494
+ agent guidance rather than project documentation. `~/.paseo-room/room/WORKSPACE_PROTOCOL.md` is
495
+ the whole default as one file, so you can read what is in force and start from it. The CLI
496
+ never writes into a repository.
488
497
 
489
498
  ## Working the room
490
499
 
package/dist/index.js CHANGED
@@ -15,7 +15,7 @@ var init_package = __esm({
15
15
  "package.json"() {
16
16
  package_default = {
17
17
  name: "paseo-room",
18
- version: "0.2.0",
18
+ version: "0.3.0",
19
19
  description: "One CLI that configures Codex, Claude Code, and Pi role homes in $HOME and registers them with your local Paseo daemon.",
20
20
  keywords: [
21
21
  "paseo",
@@ -799,7 +799,7 @@ var init_prompts = __esm({
799
799
  },
800
800
  contract: {
801
801
  humanAuthority: { path: "contract/shared/human-authority.md", kind: "section" },
802
- workspaceProtocolPrecedence: { path: "contract/shared/workspace-protocol-precedence.md", kind: "section" },
802
+ workspaceProtocolPrecedence: { path: "contract/shared-supervisor-lead/workspace-protocol-precedence.md", kind: "section" },
803
803
  evidenceAndEventWaiting: { path: "contract/shared/evidence-and-event-waiting.md", kind: "section" },
804
804
  scopeAndUnrelatedWork: { path: "contract/shared/scope-and-unrelated-work.md", kind: "section" },
805
805
  directiveIntegrity: { path: "contract/supervisor/directive-integrity.md", kind: "section" },
@@ -816,7 +816,7 @@ var init_prompts = __esm({
816
816
  peerSeatLifecycle: { path: "contract/lead/peer-seat-lifecycle.md", kind: "section" },
817
817
  boundedOutcome: { path: "contract/peer/bounded-outcome.md", kind: "section" },
818
818
  independentJudgment: { path: "contract/peer/independent-judgment.md", kind: "section" },
819
- writingAndReviewScope: { path: "contract/peer/writing-and-review-scope.md", kind: "section" },
819
+ assignmentScope: { path: "contract/peer/assignment-scope.md", kind: "section" },
820
820
  noOrchestration: { path: "contract/peer/no-orchestration.md", kind: "section" },
821
821
  reproducibleHandoff: { path: "contract/peer/reproducible-handoff.md", kind: "section" },
822
822
  noSelfAcceptance: { path: "contract/peer/no-self-acceptance.md", kind: "section" }
@@ -849,12 +849,13 @@ var init_prompts = __esm({
849
849
  // src/room/instructions.ts
850
850
  import { createHash } from "crypto";
851
851
  function instructionKeys(role) {
852
- return [...SHARED_KEYS, ...ROLE_KEYS[role]];
852
+ return [...SHARED_KEYS[role], ...ROLE_KEYS[role]];
853
853
  }
854
854
  function protocolKeys(role) {
855
855
  return PROTOCOL_KEYS[role];
856
856
  }
857
857
  function protocol(keys) {
858
+ if (keys.length === 0) return [];
858
859
  return [
859
860
  loadPromptAsset("documents", "workspace"),
860
861
  ...keys.map((key) => loadPromptAsset("workspace", key))
@@ -873,18 +874,28 @@ function contractDigest() {
873
874
  for (const kind of INSTRUCTION_KINDS) hash.update(`${kind}\0${renderInstructions(kind)}\0`);
874
875
  return `sha256:${hash.digest("hex").slice(0, 16)}`;
875
876
  }
876
- var SHARED_KEYS, ROLE_KEYS, ALL_PROTOCOL_KEYS, PROTOCOL_KEYS, INSTRUCTION_KINDS;
877
+ var AUTHORITY_KEYS, PROTOCOL_READER_KEYS, SHARED_KEYS, ROLE_KEYS, ALL_PROTOCOL_KEYS, PROTOCOL_KEYS, INSTRUCTION_KINDS;
877
878
  var init_instructions = __esm({
878
879
  "src/room/instructions.ts"() {
879
880
  "use strict";
880
881
  init_roles();
881
882
  init_prompts();
882
- SHARED_KEYS = [
883
+ AUTHORITY_KEYS = [
884
+ "humanAuthority",
885
+ "evidenceAndEventWaiting",
886
+ "scopeAndUnrelatedWork"
887
+ ];
888
+ PROTOCOL_READER_KEYS = [
883
889
  "humanAuthority",
884
890
  "workspaceProtocolPrecedence",
885
891
  "evidenceAndEventWaiting",
886
892
  "scopeAndUnrelatedWork"
887
893
  ];
894
+ SHARED_KEYS = {
895
+ supervisor: PROTOCOL_READER_KEYS,
896
+ lead: PROTOCOL_READER_KEYS,
897
+ peer: AUTHORITY_KEYS
898
+ };
888
899
  ROLE_KEYS = {
889
900
  supervisor: [
890
901
  "directiveIntegrity",
@@ -907,7 +918,7 @@ var init_instructions = __esm({
907
918
  "challengeSignals",
908
919
  "boundedOutcome",
909
920
  "independentJudgment",
910
- "writingAndReviewScope",
921
+ "assignmentScope",
911
922
  "noOrchestration",
912
923
  "reproducibleHandoff",
913
924
  "noSelfAcceptance"
@@ -922,7 +933,7 @@ var init_instructions = __esm({
922
933
  PROTOCOL_KEYS = {
923
934
  supervisor: ALL_PROTOCOL_KEYS,
924
935
  lead: ALL_PROTOCOL_KEYS,
925
- peer: ["verification", "review", "repositoryConventions"]
936
+ peer: []
926
937
  };
927
938
  INSTRUCTION_KINDS = [...ROLES, "workspace"];
928
939
  }