briefs: M1 chief-of-staff role file, contract and tests (decision 104, Vikunja 154)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-12 13:14:23 -05:00
co-authored by Claude Opus 5.5
parent bf3190acdd
commit ff61135e85
@@ -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-<row>/`
### 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.