docs(plans): slice 1 brief, rows S0 to S7
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,540 @@
|
|||||||
|
# Slice 1: the first working system (2026-10-04)
|
||||||
|
|
||||||
|
Status: written by Sage, lead, for Jason's acceptance. Each `##` section
|
||||||
|
below is the brief for one queue row, in the shape set by
|
||||||
|
`docs/plans/BRIEF-TEMPLATE.md`. This first section covers what all the
|
||||||
|
rows share.
|
||||||
|
|
||||||
|
## What slice 1 is
|
||||||
|
|
||||||
|
The foundation direction page (`docs/plans/2026-10-04_foundation-direction.md`,
|
||||||
|
lead decisions 43 and 44) describes it. Jason opens `mosaic` in a terminal
|
||||||
|
and talks to the PM role. The PM files a task in Vikunja, linked to a
|
||||||
|
PRD requirement, and assigns it to the coder role. The stack launches
|
||||||
|
that agent with the role's contract, variables and credentials. The agent
|
||||||
|
works. A gated question reaches Jason's inbox, and he answers it in one
|
||||||
|
word. The task is reviewed and closed. The CLI and the WebUI both show
|
||||||
|
the trail, and every step is an event in the bus.
|
||||||
|
|
||||||
|
Acceptance is the PRD's: Jason gives one-sentence requests in the CLI,
|
||||||
|
and Mosaic Stack builds pieces of itself from them, five pieces in a row.
|
||||||
|
For each piece, only gated decisions reach Jason, and every step leaves a
|
||||||
|
trail in the CLI and the WebUI (row S7).
|
||||||
|
|
||||||
|
### Sources
|
||||||
|
|
||||||
|
- PRD: `docs/prd/mosaic-stack.md`, draft 0.4. Every row cites its
|
||||||
|
requirement ids. If an id changes before Jason approves the PRD, Sage
|
||||||
|
updates this brief and re-pins the rows.
|
||||||
|
- Data model: `agents/darkwing/work/slice1-data-model-2026-10-04.md`,
|
||||||
|
plus addendum A and addendum B. Where they disagree, B wins over A,
|
||||||
|
and A wins over the note.
|
||||||
|
- Vikunja facts: `agents/researcher/work/2026-10-04_vikunja-pocketid.md`
|
||||||
|
and `agents/researcher/work/2026-10-04_vikunja-probes.md`.
|
||||||
|
- Harness facts: `agents/filbert/work/meta-harness-survey-2026-10-04.md`.
|
||||||
|
- Schema: `agents/darkwing/work/slice1-proto/schema-v2.sql`, which
|
||||||
|
becomes schema v3 with addendum B section 5 (lead decision 52, B3)
|
||||||
|
before row S2 starts.
|
||||||
|
- Rulings: lead decisions 43 to 53.
|
||||||
|
|
||||||
|
### What is not a wall in slice 1
|
||||||
|
|
||||||
|
Agents run as Jason's OS user (PRD round 3, 3A). Any agent process can
|
||||||
|
read or write anything Jason's user can, including the bus file, the
|
||||||
|
broker's socket and the token files. The broker, the verbs and the hooks
|
||||||
|
are rules a well-behaved agent follows. They don't stop a hostile one. Two
|
||||||
|
things do hold in slice 1:
|
||||||
|
- agents never receive a service token, so a role can act in Gitea or
|
||||||
|
Vikunja only through the broker, which checks its authority map;
|
||||||
|
- the harness's tool limit, on the harnesses where row S0 proves it.
|
||||||
|
|
||||||
|
Containers come after slice 1. No document in this slice may call a hook
|
||||||
|
or a broker check "enforcement" without that qualifier.
|
||||||
|
|
||||||
|
Model-provider login (Claude, the Pi providers) stays as it is today,
|
||||||
|
because slice 1 has no container to isolate it in. REQ-CRED-1 and
|
||||||
|
REQ-CRED-2 cover the service tokens, Gitea and Vikunja.
|
||||||
|
|
||||||
|
### Field table
|
||||||
|
|
||||||
|
From addendum B section 4. The broker's task verbs enforce it (REQ-TASK-1).
|
||||||
|
|
||||||
|
| Field | Writer | Action | Vikunja call |
|
||||||
|
|---|---|---|---|
|
||||||
|
| title, description | pm at create; after assignment only through a resolved `task.scope.change` | `task.create`, `task.scope.change` | `POST /projects/{p}/tasks`; `PATCH /tasks/{t}` |
|
||||||
|
| due date, priority | pm | `task.schedule`, `task.priority.change` | `PATCH /tasks/{t}` |
|
||||||
|
| percent done | the assigned role | `task.update.assigned` | `PATCH /tasks/{t}` |
|
||||||
|
| state (bucket) other than `done` | the assigned role | `task.update.assigned` | `PUT /projects/{p}/views/{k}/buckets/{b}/tasks` |
|
||||||
|
| `done` | pm, after a review verdict | `task.close` | the same move, into the `done` bucket |
|
||||||
|
| assignee | pm | `task.assign`, `task.reassign` | `POST /tasks/{t}/assignees`; `DELETE /tasks/{t}/assignees/{u}` |
|
||||||
|
| labels | pm | `task.create`, `task.schedule` | `POST /tasks/{t}/labels`; `DELETE /tasks/{t}/labels/{l}` |
|
||||||
|
| relations | pm | `task.create`, `task.schedule` | `POST /tasks/{t}/relations`; `DELETE /tasks/{t}/relations/{kind}/{other}` |
|
||||||
|
| comments | any role on the task, append only | `task.update.assigned`, `message.send` | `POST /tasks/{t}/comments` |
|
||||||
|
|
||||||
|
A `PATCH` body carries only `title`, `description`, `due_date`,
|
||||||
|
`priority` and `percent_done`, and only the keys the action owns. Vikunja
|
||||||
|
answers 200 to a `bucket_id` in a `PATCH` and doesn't move the task, so
|
||||||
|
the broker refuses that key before sending. Reopening is a person's act.
|
||||||
|
|
||||||
|
### Rows and order
|
||||||
|
|
||||||
|
| Row | Piece | Owner | Reviewer | After |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| S0 | Harness probe matrix | filbert | darkwing | none |
|
||||||
|
| SR | Install runbook for slice 1 identities | sage | darkwing | none |
|
||||||
|
| S1 | Roles v2, business and project files, variable layers | darkwing | filbert | none |
|
||||||
|
| S2 | The bus and the broker core | rocko | darkwing | schema v3 |
|
||||||
|
| S3 | Tasks: the Vikunja adapter, broker task verbs and sync | darkwing | filbert | S1, S2, SR |
|
||||||
|
| S4 | The `mosaic` CLI: inbox, decide, tasks, agents, trail | rocko | filbert | S2, S3 |
|
||||||
|
| S5 | WebUI: inbox, tasks, agents and trails; CHAT-03 Gate E | dewey | darkwing, filbert | S4 |
|
||||||
|
| S6 | Meta-harness and launching; the PM moves off T3 | filbert | darkwing | S0, S1, S3 |
|
||||||
|
| S7 | Acceptance: five pieces in a row | sage | none | S5, S6 |
|
||||||
|
|
||||||
|
Rows S0, SR and S1 start at once. S2 starts once Darkwing lands schema v3
|
||||||
|
in `slice1-proto/`. Every row's gate is a reviewer's approval on the
|
||||||
|
row's issue plus the named suites green on an index export, and Sage
|
||||||
|
commits. Row S7's gate is Jason's.
|
||||||
|
|
||||||
|
Every row emits the events its steps produce (REQ-EVT-1), using the
|
||||||
|
closed kind list in the schema. A row that needs a new kind changes the
|
||||||
|
schema through row S2's owner and the CTO's review.
|
||||||
|
|
||||||
|
## Slice 1 S0: harness probe matrix (Pi and Claude Code hooks, pinned versions)
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
REQ-HARN-2 says a probe run against the live harnesses must pass before
|
||||||
|
any build relies on a block. Filbert's survey (section 9) checked Pi's
|
||||||
|
`tool_call` block and Claude's hook docs against source and docs, but ran
|
||||||
|
nothing. It also found that Claude command hooks at a mistyped path leave
|
||||||
|
the gate silently off, and that a Codex hook that crashes doesn't block.
|
||||||
|
Row S6 can't choose which layer stops what until these are measured.
|
||||||
|
|
||||||
|
### Owner and reviewer
|
||||||
|
|
||||||
|
- Owner: filbert, who wrote the survey.
|
||||||
|
- Reviewer: darkwing.
|
||||||
|
|
||||||
|
### Files owned
|
||||||
|
|
||||||
|
- `agents/filbert/work/slice1-probes/` (scripts, outputs, the matrix).
|
||||||
|
- Nothing outside it. The probes run in a scratch directory under
|
||||||
|
`$HOME`, not `/tmp`, with no service tokens and no network beyond the
|
||||||
|
model providers the harnesses already use.
|
||||||
|
|
||||||
|
### What ships
|
||||||
|
|
||||||
|
A matrix for Pi 0.85.1 and Claude Code 2.1.289, each at the pinned
|
||||||
|
version, with one row per case:
|
||||||
|
1. a gate that blocks;
|
||||||
|
2. a gate that crashes (throws, or exits nonzero other than the block
|
||||||
|
code);
|
||||||
|
3. a gate at a missing path;
|
||||||
|
4. a gate that times out;
|
||||||
|
5. a `bash` route to the same action as a blocked tool;
|
||||||
|
6. for Claude Code, an Agent SDK callback hook that throws (the survey's
|
||||||
|
"not established").
|
||||||
|
|
||||||
|
Each cell records the command, the exact outcome (tool ran or didn't,
|
||||||
|
the message the model saw) and whether the harness fails closed. The
|
||||||
|
matrix ends with one line per case saying which layer slice 1 can rely on:
|
||||||
|
the tool limit, the hook, or neither. Codex is out of scope until after
|
||||||
|
v1.
|
||||||
|
|
||||||
|
### Out of scope
|
||||||
|
|
||||||
|
- Building the generator or any adapter (row S6).
|
||||||
|
- The Vikunja points still unverified in addendum B section 7. Row S3
|
||||||
|
probes those before relying on them.
|
||||||
|
|
||||||
|
### Gate
|
||||||
|
|
||||||
|
Darkwing approves the matrix on the row's issue. Sage reads the
|
||||||
|
"rely on" lines and copies them into row S6's brief section before S6
|
||||||
|
starts.
|
||||||
|
|
||||||
|
## Slice 1 SR: install runbook for slice 1 identities
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
REQ-CRED-1 (round 3, 1A and 2A) has Jason create each role's tokens by
|
||||||
|
hand. No runbook exists, and the identities are new: four Gitea bot users,
|
||||||
|
four Vikunja `bot-<role>` users and one read-only `bot-<business>-sync`.
|
||||||
|
Vikunja tokens must expire, and Vikunja accepts a past expiry date.
|
||||||
|
Gitea tokens don't expire.
|
||||||
|
|
||||||
|
### Owner and reviewer
|
||||||
|
|
||||||
|
- Owner: sage.
|
||||||
|
- Reviewer: darkwing, for the Vikunja scope map.
|
||||||
|
|
||||||
|
### Files owned
|
||||||
|
|
||||||
|
- `docs/guides/slice-1-identities.md`.
|
||||||
|
- A business file template, `templates/business/mosaic-stack.example.json`,
|
||||||
|
with credential references only, coordinated with row S1's schema.
|
||||||
|
|
||||||
|
### What ships
|
||||||
|
|
||||||
|
A runbook Jason follows in about 20 minutes:
|
||||||
|
- creating pm-bot, cto-bot, coder-bot and reviewer-bot in Gitea, each
|
||||||
|
with a token at the narrowest scope that does that role's work, and
|
||||||
|
each token written to a 0600 file outside the repository;
|
||||||
|
- creating the Vikunja owner account (a deployed bundled instance or an
|
||||||
|
existing one, REQ-TASK-3), the four role bots and the sync bot, the
|
||||||
|
project shares (write for roles, permission 0 for sync), and one token
|
||||||
|
per bot with the scope map from addendum B section 2 and an explicit
|
||||||
|
expiry date;
|
||||||
|
- the business file entries that reference each token file;
|
||||||
|
- how to check each token with `stat` only, and a `mosaic` check that
|
||||||
|
calls the broker's startup scope probe once row S3 exists;
|
||||||
|
- rotation: what to do before a Vikunja token expires, and the Gitea
|
||||||
|
rotation step with a record.
|
||||||
|
|
||||||
|
No token value appears in the runbook, a command line or a URL.
|
||||||
|
|
||||||
|
### Out of scope
|
||||||
|
|
||||||
|
- Any script that creates users or tokens. Minting is out of v1.
|
||||||
|
- Running the runbook. Jason does that, and row S3's live tests wait for
|
||||||
|
it.
|
||||||
|
|
||||||
|
### Gate
|
||||||
|
|
||||||
|
Darkwing approves the scope tables. Jason runs it, and the broker's
|
||||||
|
startup probe passes for every identity.
|
||||||
|
|
||||||
|
## Slice 1 S1: roles v2, business and project files, variable layers
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
`roles/` holds `conductor-policy.json` and `researcher.json` at version
|
||||||
|
1, with tool and network ceilings only. No business roles exist, no
|
||||||
|
authority map, no credential needs, and no variable layers beyond
|
||||||
|
`~/.config/mosaic-dev/config.json`. REQ-ROLE-1 to 4 and REQ-VAR-1 and 2
|
||||||
|
need all of these.
|
||||||
|
|
||||||
|
### Owner and reviewer
|
||||||
|
|
||||||
|
- Owner: darkwing (CTO), who designed them (note sections 1 and 2).
|
||||||
|
- Reviewer: filbert.
|
||||||
|
|
||||||
|
### Files owned
|
||||||
|
|
||||||
|
- `roles/pm.json`, `roles/cto.json`, `roles/coder.json`,
|
||||||
|
`roles/reviewer.json` (new, version 2).
|
||||||
|
- The role validator and `resolve-role` in `scripts/mosaic-task.mjs`, to
|
||||||
|
accept version 2 while version 1 files keep working.
|
||||||
|
- `packages/business/` (new): the business file and project file
|
||||||
|
loaders, the variable key registry (type, allowed layers, merge rule)
|
||||||
|
and the resolver.
|
||||||
|
- `contracts/` only if the note's closed action vocabulary must be
|
||||||
|
image-baked. Darkwing says which in the build packet, and a contract
|
||||||
|
change needs Sage's review.
|
||||||
|
- `docs/TOOLS.md` entries for any new command.
|
||||||
|
|
||||||
|
### What ships
|
||||||
|
|
||||||
|
- The role schema v2: contract, authority map over the closed vocabulary
|
||||||
|
(unlisted means gated), credential needs by service and scope, and the
|
||||||
|
version 1 ceilings kept.
|
||||||
|
- The business file at `~/.config/mosaic-dev/businesses/<id>.json`:
|
||||||
|
role instances (PM held by Sage, CTO by Darkwing, coder, reviewer),
|
||||||
|
arbiters, credential references, business variables, and the `launch`
|
||||||
|
block (lead decision 49). The stack reads it and never writes it. A
|
||||||
|
missing or invalid file fails closed.
|
||||||
|
- The project file at `<project>/.mosaic/project.json`.
|
||||||
|
- The resolver: most specific layer wins for plain values, limits
|
||||||
|
intersect, an unknown key or a key at a layer it isn't allowed in is
|
||||||
|
refused.
|
||||||
|
- Tests in `packages/business/tests/`, plus `test-config.sh` and
|
||||||
|
`test-task.sh` green.
|
||||||
|
|
||||||
|
### Out of scope
|
||||||
|
|
||||||
|
- Role claims and the one-holder rule (row S2, they live in the bus).
|
||||||
|
- Launching anything (row S6).
|
||||||
|
|
||||||
|
### Gate
|
||||||
|
|
||||||
|
Filbert approves on the row's issue. Suites green: `packages/business`
|
||||||
|
tests, `test-config.sh`, `test-task.sh`, `test-conductor.sh`.
|
||||||
|
|
||||||
|
## Slice 1 S2: the bus and the broker core (decisions, messages, role claims, events)
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
Decisions don't exist as objects. Escalations are chat lines, the
|
||||||
|
waiting-on-jason state and "Input needed:" lines. Messages are addressed
|
||||||
|
to T3 thread ids, not roles. REQ-DEC-1 to 3, REQ-MSG-1, REQ-ROLE-2 and
|
||||||
|
REQ-EVT-1 need a store and a single writer.
|
||||||
|
|
||||||
|
### Owner and reviewer
|
||||||
|
|
||||||
|
- Owner: rocko. It needs no credentials: the broker's token handling is
|
||||||
|
built and tested here with fixture tokens, and real tokens arrive in
|
||||||
|
row S3.
|
||||||
|
- Reviewer: darkwing, who wrote the schema and the prototype.
|
||||||
|
|
||||||
|
### Files owned
|
||||||
|
|
||||||
|
- `packages/bus/` (new): the store over `node:sqlite`, the broker
|
||||||
|
process, its local socket protocol, the verbs, tests.
|
||||||
|
- `<dataRoot>/bus/` at runtime, created by the broker on first start,
|
||||||
|
0700.
|
||||||
|
|
||||||
|
### What ships
|
||||||
|
|
||||||
|
- `bus.sqlite` from schema v3, with the open-time digest check, WAL, and
|
||||||
|
every table append-only.
|
||||||
|
- The broker: the only writer. It stamps role and run on every write
|
||||||
|
from the launch record. It holds tokens in memory only, read from the
|
||||||
|
business file's references, and never logs or writes them (REQ-VAR-2).
|
||||||
|
- Verbs: raise, route and resolve a decision; send a message to a role
|
||||||
|
and deliver it to the current holder; claim and release a role
|
||||||
|
instance; emit an event. A verb whose action is gated refuses unless
|
||||||
|
it cites a resolved decision.
|
||||||
|
- Routing by class (REQ-DEC-2): routine and within-role are logged;
|
||||||
|
cross-role goes to the business's arbiter; gated goes to the human.
|
||||||
|
- Human resolution only from a CLI process outside any agent run
|
||||||
|
(REQ-DEC-3). `launch.revoked` and `launch.restored` are written only on
|
||||||
|
that path (lead decision 50).
|
||||||
|
- Tests covering every refusal the prototype shows, plus the broker
|
||||||
|
protocol, on Node 24 and Node 26.
|
||||||
|
|
||||||
|
### Out of scope
|
||||||
|
|
||||||
|
- Vikunja (row S3). The `task_snapshots` table ships in the schema, and
|
||||||
|
row S3 writes it.
|
||||||
|
- Delivery to Discord and the digest (row S4 owns the outbound side).
|
||||||
|
|
||||||
|
### Gate
|
||||||
|
|
||||||
|
Darkwing approves on the row's issue. Suites green: `packages/bus` tests
|
||||||
|
on Node 24 and Node 26, and every `scripts/test-*.sh`.
|
||||||
|
|
||||||
|
## Slice 1 S3: tasks (the Vikunja adapter, broker task verbs, sync)
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
Tasks live in the queue, which is built for agents and has no dates,
|
||||||
|
assignees Jason can see, or UI. REQ-TASK-1 to 4 put tasks in Vikunja
|
||||||
|
through the broker. The probes showed what Vikunja actually does: wrong
|
||||||
|
scope names in addendum A, a cursor that misses column moves and
|
||||||
|
deletions, `If-Match` not enforced, and 401 for both an expired token and
|
||||||
|
one out of scope.
|
||||||
|
|
||||||
|
### Owner and reviewer
|
||||||
|
|
||||||
|
- Owner: darkwing, who ran the probes behind addendum B.
|
||||||
|
- Reviewer: filbert.
|
||||||
|
|
||||||
|
### Files owned
|
||||||
|
|
||||||
|
- `packages/tasks/` (new): the Vikunja v2 client, the broker's task
|
||||||
|
verbs, the poller, the reconcile and the startup checks.
|
||||||
|
- `packages/bus/` only to register the task verbs, coordinated with row
|
||||||
|
S2's owner.
|
||||||
|
- `packages/tasks/deploy/vikunja/`: the bundled option, the unmodified upstream
|
||||||
|
image pinned by digest, bound to 127.0.0.1 (REQ-TASK-3). No Vikunja code
|
||||||
|
enters the repository.
|
||||||
|
|
||||||
|
### What ships
|
||||||
|
|
||||||
|
- Before relying on them, probes of addendum B section 7's open points
|
||||||
|
on a scratch instance, recorded in the build packet. The first is
|
||||||
|
which labels `GET /labels` shows a bot. Until that's answered, the
|
||||||
|
business file lists label ids.
|
||||||
|
- Task verbs that follow the field table, refuse any other `PATCH` key,
|
||||||
|
compare before writing, and write only with the acting role's token.
|
||||||
|
- Sync with the read-only sync bot: every 30 seconds, the open-task
|
||||||
|
kanban listing plus the `updated` cursor; an hourly full reconcile;
|
||||||
|
`task_snapshots` rows for every read and write; `task.changed.external`
|
||||||
|
for a person's edit.
|
||||||
|
- Startup checks: each token's scopes probed against a task id that
|
||||||
|
doesn't exist, `expires_at` checked locally, the kanban view's
|
||||||
|
`done_bucket_id` checked. Any failure fails closed.
|
||||||
|
- A task can't be created without a requirement id (REQ-TASK-1). The
|
||||||
|
queue keeps the agents' lock, review rounds and audit log, and no field
|
||||||
|
syncs both ways (REQ-TASK-4).
|
||||||
|
- Tests against a recorded fake of the v2 routes, plus one live run
|
||||||
|
against the instance from row SR.
|
||||||
|
|
||||||
|
### Out of scope
|
||||||
|
|
||||||
|
- Webhooks. Slice 1 has none.
|
||||||
|
- Pocket ID and SSO (after v1).
|
||||||
|
|
||||||
|
### Gate
|
||||||
|
|
||||||
|
Filbert approves on the row's issue. Suites green: `packages/tasks`
|
||||||
|
tests, `packages/bus` tests, every `scripts/test-*.sh`, and the live run's
|
||||||
|
log in the packet with no token value in it.
|
||||||
|
|
||||||
|
## Slice 1 S4: the `mosaic` CLI (inbox, decide, tasks, agents, trail)
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
Jason has no front door (REQ-CLI-1). `scripts/mosaic` dispatches to
|
||||||
|
`seat` and `queue` only. Blocking gated decisions have no route to him,
|
||||||
|
and nothing sends a digest (REQ-DEC-4).
|
||||||
|
|
||||||
|
### Owner and reviewer
|
||||||
|
|
||||||
|
- Owner: rocko.
|
||||||
|
- Reviewer: filbert.
|
||||||
|
|
||||||
|
### Files owned
|
||||||
|
|
||||||
|
- `scripts/mosaic` (the dispatcher).
|
||||||
|
- `packages/cli/` (new): `mosaic inbox`, `mosaic decide <id> <option>`,
|
||||||
|
`mosaic tasks`, `mosaic agents`, `mosaic trail <task|decision>`.
|
||||||
|
- The outbound side: a blocking gated decision goes to Jason's Discord DM
|
||||||
|
through the existing connector (#1509, round 3, 4A), and a daily digest
|
||||||
|
at 08:00 Central (5A). Changes inside `packages/discord/` need that
|
||||||
|
package's existing review rules.
|
||||||
|
|
||||||
|
### What ships
|
||||||
|
|
||||||
|
- Every command reads through the broker, never the SQLite file
|
||||||
|
directly.
|
||||||
|
- `mosaic decide` works only outside an agent run, and refuses inside
|
||||||
|
one (REQ-DEC-3).
|
||||||
|
- `mosaic trail` shows each event for a task or decision in order:
|
||||||
|
request, decisions, launches, task changes, review, close.
|
||||||
|
- Tests in `packages/cli/tests/`, and the connector suite green.
|
||||||
|
|
||||||
|
### Out of scope
|
||||||
|
|
||||||
|
- `mosaic talk` (row S6, since it needs the launched PM).
|
||||||
|
- The WebUI (row S5).
|
||||||
|
|
||||||
|
### Gate
|
||||||
|
|
||||||
|
Filbert approves on the row's issue. Suites green: `packages/cli`
|
||||||
|
tests, `test-discord.sh`, every `scripts/test-*.sh`.
|
||||||
|
|
||||||
|
## Slice 1 S5: WebUI (inbox, tasks, agents and trails; CHAT-03 Gate E)
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
`packages/webui` shows the control board and, through CHAT-03 I1
|
||||||
|
(243e153c), can drive a sealed Pi against fixtures. It doesn't show
|
||||||
|
decisions, tasks or trails (REQ-WEB-1). Row 5's Gate E demonstration
|
||||||
|
happens in this step (round 3, 7B).
|
||||||
|
|
||||||
|
### Owner and reviewer
|
||||||
|
|
||||||
|
- Owner: dewey, who owns the WebUI and CHAT-03.
|
||||||
|
- Reviewers: darkwing and filbert.
|
||||||
|
|
||||||
|
### Files owned
|
||||||
|
|
||||||
|
- `packages/webui/`, `packages/conversation/` and `packages/control-board/`,
|
||||||
|
within their existing READMEs' rules.
|
||||||
|
- `agents/dewey/work/` for design and evidence.
|
||||||
|
|
||||||
|
### What ships
|
||||||
|
|
||||||
|
- Views for the inbox (read-only in slice 1, resolution stays in the CLI
|
||||||
|
under REQ-DEC-3), tasks, agents and trails, reading the same broker
|
||||||
|
data as the CLI.
|
||||||
|
- Conversations through CHAT-03, with the I3 follow-ups in DEFERRED that
|
||||||
|
the live PM session needs: the seal covering the engine command, and
|
||||||
|
an explicit engine environment.
|
||||||
|
- Gate E: the interactive demonstration with all seats, then Jason's
|
||||||
|
workday ruling. Live cutover still needs its own approval.
|
||||||
|
|
||||||
|
### Out of scope
|
||||||
|
|
||||||
|
- Resolving decisions from the browser. That needs authentication, which
|
||||||
|
comes with Pocket ID after v1.
|
||||||
|
|
||||||
|
### Gate
|
||||||
|
|
||||||
|
Both reviewers approve on the row's issue. Suites green: webui,
|
||||||
|
conversation, control-board, and every `scripts/test-*.sh`. Row 5's Gate
|
||||||
|
E is Jason's.
|
||||||
|
|
||||||
|
## Slice 1 S6: meta-harness and launching (the PM moves off T3)
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
Seats are launched by hand in T3, with prompts and tools set per
|
||||||
|
launcher (`scripts/agent-host-dev.sh`, `agents/rocko/launch.sh`).
|
||||||
|
Nothing generates a session from a role (REQ-HARN-1). The PM can't
|
||||||
|
launch anyone (REQ-LAUNCH-1), and `mosaic` can't talk to a PM the stack
|
||||||
|
owns (REQ-CLI-2).
|
||||||
|
|
||||||
|
### Owner and reviewer
|
||||||
|
|
||||||
|
- Owner: filbert, who wrote the survey and row S0's matrix.
|
||||||
|
- Reviewer: darkwing.
|
||||||
|
|
||||||
|
### Files owned
|
||||||
|
|
||||||
|
- `packages/harness/` (new): the launch bundle generator (prompt, policy,
|
||||||
|
skills, typed tools for the vocabulary actions, manifest).
|
||||||
|
- `adapters/pi/` and a new `adapters/claude/`, under
|
||||||
|
`adapters/README.md`'s contract.
|
||||||
|
- `packages/seat/` for `mosaic launch` and the new `mosaic talk` and
|
||||||
|
`mosaic stop`.
|
||||||
|
- `scripts/agent-host-dev.sh`, to stop passing `--approve` (DEFERRED).
|
||||||
|
|
||||||
|
### What ships
|
||||||
|
|
||||||
|
- Bundles for Pi first, then Claude Code, from the role file and the
|
||||||
|
resolved variables. Each layer the bundle relies on is one row S0
|
||||||
|
proved.
|
||||||
|
- The PM launches role sessions through the broker, within the business
|
||||||
|
file's `launch` block: role instances only, at most 4 Opus and 4
|
||||||
|
Sonnet sessions, every launch logged, one word from Jason stops new
|
||||||
|
launches, and `mosaic stop` ends a running session.
|
||||||
|
- A session that finds only founder credentials stops (REQ-CRED-2).
|
||||||
|
- The named step where the PM moves off T3: the stack launches the PM
|
||||||
|
session without a window, `mosaic talk` reaches it, and Sage's T3
|
||||||
|
thread hands over. After this step the product doesn't depend on T3.
|
||||||
|
|
||||||
|
### Out of scope
|
||||||
|
|
||||||
|
- Codex (after v1).
|
||||||
|
- Containers (after slice 1).
|
||||||
|
|
||||||
|
### Gate
|
||||||
|
|
||||||
|
Darkwing approves on the row's issue. Suites green: `packages/harness`,
|
||||||
|
`packages/seat`, every `scripts/test-*.sh`. A recorded run where the PM
|
||||||
|
launches a coder session and `mosaic agents` shows it.
|
||||||
|
|
||||||
|
## Slice 1 S7: acceptance, five pieces in a row
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
|
||||||
|
The PRD's acceptance can only be shown end to end.
|
||||||
|
|
||||||
|
### Owner and reviewer
|
||||||
|
|
||||||
|
- Owner: sage, as the PM role.
|
||||||
|
- Reviewer: none. Jason is the gate.
|
||||||
|
|
||||||
|
### Files owned
|
||||||
|
|
||||||
|
- `agents/sage/work/slice1-acceptance/` for the run log.
|
||||||
|
- Queue rows and issues the five pieces create.
|
||||||
|
|
||||||
|
### What ships
|
||||||
|
|
||||||
|
Five one-sentence requests from Jason in the CLI, each carried to a
|
||||||
|
closed, reviewed task. For each: the trail in `mosaic trail` and the
|
||||||
|
WebUI, the decisions that reached Jason (gated only), and the event
|
||||||
|
counts from the bus. Those counts are the first measures (REQ-EVT-1).
|
||||||
|
|
||||||
|
### Out of scope
|
||||||
|
|
||||||
|
- Measure targets. Slice 1 produces the first numbers, and targets come
|
||||||
|
after.
|
||||||
|
|
||||||
|
### Gate
|
||||||
|
|
||||||
|
Jason, from the five trails: only gated decisions reached him, and every
|
||||||
|
step left a trail.
|
||||||
Reference in New Issue
Block a user