diff --git a/docs/plans/2026-10-12_m1-chief-of-staff-role.md b/docs/plans/2026-10-12_m1-chief-of-staff-role.md new file mode 100644 index 000000000..dcec39bb1 --- /dev/null +++ b/docs/plans/2026-10-12_m1-chief-of-staff-role.md @@ -0,0 +1,99 @@ +# M1: a role for Jason's main agent (2026-10-12) + +Status: written by Sage, lead. It follows `docs/plans/BRIEF-TEMPLATE.md`. +Jason approved the role as drafted in Q101, recorded as lead decision 104. +The draft was `agents/sage/work/next-target/M1-draft.md` (blob 3b32148f, +commit a3d17005). M1 is the first item of decision 96's M track and +follows S7 in Q97's order; under decision 111 it starts as soon as an +owner is free. Vikunja #154. + +## M1 chief-of-staff role file, contract and tests + +### Problem + +Q94: "my main agentic session (you) capable of running within the Mosaic +Stack deployment." Today Mos is a T3 Claude Code thread with full access. +The stack declares five roles in `roles/` (pm, cto, coder, reviewer, +researcher), and none fits a main agent that talks with Jason, relays his +rulings and asks the PM for work. A managed session can hold only a role +that a role file declares (`packages/business/src/role.mjs`) and the +business file assigns to an instance (`packages/business/README.md:76-81`). + +### Owner and reviewer + +Owner: Rocko. Reviewers: Darkwing and Filbert. Rocko has no Gitea token; +Sage runs the review request as jarvis. The role file is policy: Jason +approved its content in decision 104, and a file that differs from that +approval goes back to him before it lands. + +### Files owned + +- `roles/chief-of-staff.json` +- `roles/chief-of-staff.md` +- `packages/business/tests/role.test.mjs`, or a new + `packages/business/tests/chief-of-staff.test.mjs`, and fixtures under + `packages/business/tests/` +- `packages/business/README.md`, a short section with the instance entry +- `agents/rocko/work/queue-/` + +### What ships + +`roles/chief-of-staff.json`, roleVersion 2, exactly: + +- name `chief-of-staff`, a title, contract `chief-of-staff.md`; +- tools `read`, `grep`, `find`, `ls`, and nothing else; +- network `api-only`; +- authority.withinRole `message.send` only; +- authority.crossRole empty; +- credentials empty. + +Every other action in `packages/business/src/vocabulary.mjs` stays gated, +task.create and role.launch included. + +`roles/chief-of-staff.md`, the contract, in the style of `roles/pm.md`. It +says the holder: + +- sends Jason's requests to the PM as messages and asks the PM for work; +- relays Jason's rulings verbatim; +- never resolves a decision for Jason; +- never holds or imitates human authority, and never routes around a + refusal. + +The persona is Mos (decision 104). The contract names the role, not the +persona. + +Tests, against a fixture business in a temp directory: + +- the role file loads and resolves through `loadBusiness`; +- the resolved record's tools, network, authority and credentials equal + the list above, so a widened file fails the suite; +- a business that grants the instance a gated action through its limits + is refused; +- `classify` returns gated for task.create and role.launch, and within + for message.send; +- an instance with a `launch` block whose `by` is this instance is + refused, since the role has no role.launch. + +The README section shows the exact instance entry for Jason's business +file: definition `chief-of-staff`, holder `mos`, no launch block, no +credential references. The instance id is Jason's to choose (Vikunja +#150), so the entry shows it as a placeholder and the tests use a fixture +name. + +The business node suite passes, and so does every `scripts/test-*.sh`. + +### Out of scope + +Writing Jason's business file, or any file under the config directory; +adding the instance there is Jason's step, or one he names (decision +104). Launching a session in the role. Any write tool, credential or +crossRole action, all of which wait for I4 or another approval from +Jason. M2's thread view. Isolation, which stays as today until I1 is +built. Retiring T3 Mos, which is M3. + +### Gate + +Darkwing and Filbert approve on the row's issue, each naming the +candidate manifest and each confirming that the landed role file matches +decision 104's list. The business node suite and every +`scripts/test-*.sh` pass on Sage's gate rerun.