Starter packs slice SP4 (#1873): preview, apply, board and workflow writes for people. Design: docs/plans/2026-11-12_starter-packs-design.md section 8 SP4, with Jason's 11-12 answers (system types become starter packs; organization.change holders write board styles and workflows with no decision; board styles are labels, order and layout over the five fixed states).
Bus (broker.mjs, runtime.mjs, refusals.mjs): five verbs, packs, pack.preview, pack.apply, board.set and workflow.set, each also in a .console form. Owner only: the console forms need the owner's console cap, the plain forms the organization's human session. A tester gets tester-refused, and a member or an agent gets human-required. PACK_KEYS allowlists the arguments for each verb, so origin, actor and business never reach an op. packOps implements section 3: the merge table (add, same, kept, --as, the removed tombstone keyed on id, origin and project), the plan digest with pack-plan-stale, the held-credential check, hire proposals with pins, and the step id dropped when a pack workflow is copied. Template refs run checkComposition at preview. A saved pack is read only from its own owner.
Rights (org-rights.mjs): packs.console maps to board.read, and the four write console verbs need the owner.
Writer hardening (organization.mjs, definitions.mjs, organization-config.mjs): the generic write() refuses changes to packs, board and workflows, at org and project level, so only applyPack changes them. agentActors names every actor form a root or project agent carries. packs is capped at 256 entries, because each apply appends one. Workflows are capped at 32 per scope: SP7 puts workflow guidance in the prompt, and 300 workflows made a 2.1 MB prompt.
CLI (org.mjs): mosaic org pack list|preview|apply, mosaic org board set and mosaic org workflow set|remove. Every word refuses inside an agent shell before it reads a file.
Console (packs-http.mjs new, serve.mjs, webui/src/cli.mjs): pack, preview, apply, board and workflow routes, root owner only. Writes need --send, the exact origin and same-origin fetch. Bodies are JSON with an exact key allowlist, at most 64 KiB. GET and HEAD /api/board stay the Board read.
Nothing in roles/ or contracts/.
Tests: packs.test.mjs (bus), pack-writes.test.mjs (organization), org-packs.test.mjs (CLI), packs-http.test.mjs (webui), and additions in org-rights, console-decide and request-console. Red before: all four new files fail against the BASE sources. Each review fix was reverted and its test went red. Lane gate on the head: 6049/1. The one failure is the known CHAT-01 jsonschema base red in packages/conversation. Lead check under env -i (459 files): 4848/2, the CHAT-01 red plus a fixture file the Lead's list picked up by mistake (federation-host.mjs, which runs only under its own harness).
Reviews (fresh Opus delegates): build review changes 5, security review changes 4, all fixed. The first security re-check found one P2: the /api/board method split made DELETE /api/orgs/<id>/board answer 403 instead of 405. That and three P3s were fixed. The second re-check approved the head.
Deferred:
cli README and docs/TOOLS.md entries for the new words.
Reserving human in the starter-pack and org definition name checks.
A test pinning which route answers HEAD /api/board. This goes to SP6.
Starter packs slice SP4 (#1873): preview, apply, board and workflow writes for people. Design: `docs/plans/2026-11-12_starter-packs-design.md` section 8 SP4, with Jason's 11-12 answers (system types become starter packs; `organization.change` holders write board styles and workflows with no decision; board styles are labels, order and layout over the five fixed states).
- Bus (`broker.mjs`, `runtime.mjs`, `refusals.mjs`): five verbs, `packs`, `pack.preview`, `pack.apply`, `board.set` and `workflow.set`, each also in a `.console` form. Owner only: the console forms need the owner's console cap, the plain forms the organization's human session. A tester gets `tester-refused`, and a member or an agent gets `human-required`. `PACK_KEYS` allowlists the arguments for each verb, so `origin`, `actor` and `business` never reach an op. `packOps` implements section 3: the merge table (`add`, `same`, `kept`, `--as`, the removed tombstone keyed on id, origin and project), the plan digest with `pack-plan-stale`, the held-credential check, hire proposals with pins, and the step `id` dropped when a pack workflow is copied. Template refs run `checkComposition` at preview. A saved pack is read only from its own owner.
- Rights (`org-rights.mjs`): `packs.console` maps to `board.read`, and the four write console verbs need the owner.
- Writer hardening (`organization.mjs`, `definitions.mjs`, `organization-config.mjs`): the generic `write()` refuses changes to `packs`, `board` and `workflows`, at org and project level, so only `applyPack` changes them. `agentActors` names every actor form a root or project agent carries. `packs` is capped at 256 entries, because each apply appends one. Workflows are capped at 32 per scope: SP7 puts workflow guidance in the prompt, and 300 workflows made a 2.1 MB prompt.
- CLI (`org.mjs`): `mosaic org pack list|preview|apply`, `mosaic org board set` and `mosaic org workflow set|remove`. Every word refuses inside an agent shell before it reads a file.
- Console (`packs-http.mjs` new, `serve.mjs`, `webui/src/cli.mjs`): pack, preview, apply, board and workflow routes, root owner only. Writes need `--send`, the exact origin and same-origin fetch. Bodies are JSON with an exact key allowlist, at most 64 KiB. `GET` and `HEAD /api/board` stay the Board read.
Nothing in `roles/` or `contracts/`.
Tests: `packs.test.mjs` (bus), `pack-writes.test.mjs` (organization), `org-packs.test.mjs` (CLI), `packs-http.test.mjs` (webui), and additions in `org-rights`, `console-decide` and `request-console`. Red before: all four new files fail against the BASE sources. Each review fix was reverted and its test went red. Lane gate on the head: 6049/1. The one failure is the known CHAT-01 jsonschema base red in packages/conversation. Lead check under `env -i` (459 files): 4848/2, the CHAT-01 red plus a fixture file the Lead's list picked up by mistake (`federation-host.mjs`, which runs only under its own harness).
Reviews (fresh Opus delegates): build review changes 5, security review changes 4, all fixed. The first security re-check found one P2: the `/api/board` method split made `DELETE /api/orgs/<id>/board` answer 403 instead of 405. That and three P3s were fixed. The second re-check approved the head.
Deferred:
- cli README and `docs/TOOLS.md` entries for the new words.
- Reserving `human` in the starter-pack and org definition name checks.
- A test pinning which route answers `HEAD /api/board`. This goes to SP6.
Design section 8. The bus answers packs, pack.preview, pack.apply,
board.set and workflow.set to the organization's human, and their
.console forms to the owner's Console cap. The broker runs the section 3
merge, the plan digest (pack-plan-stale on a mismatch) and the held
credential check. The organization writer keeps packs, board and
workflows out of the generic write and refuses definition writes to
every actor name an agent carries, project agents included.
mosaic org pack list|preview|apply, board set and workflow set|remove
go over the organization's bus as its human and refuse inside an agent
shell before any file is read. The Console serves GET /api/orgs/<id>/packs,
packs/preview, packs/apply, board and workflows/<name> (POST and
DELETE) to the root owner's session only, writes under --send only.
- An --as target that lands on another pack item's name refuses invalid-request
(definitions and workflows); the preview no longer shows two adds for one path.
- A workflow step role naming one of the pack's definitions follows its --as rename,
so an inline definition renamed at preview applies.
- GET /api/board stays the Board read; only POST /api/board is the pack board write.
- Tombstones key on pack id, origin and project: a saved template reusing a shipped
id is another pack.
- An apply that adds nothing and proposes what the last apply proposed writes
nothing, so retries do not fill the 256 packs entries.
- mosaic org pack list refuses inside an agent run like the other words.
- Tests pin coder-1's credential lines, skills.notEnabled and the member's
unsuffixed pack.apply and board.set refusals; the CONSOLE_VERBS pins in two bus
tests name the five pack verbs.
- serve.mjs: only GET and HEAD /api/board stay the Board read; every
other method goes to the pack route, so DELETE and PUT answer its 405
again. The owner-only check moves inside packsHTTP after the method
check, so OPTIONS on a root Console stays 405 as before SP4.
- runtime.mjs: a --as rename cannot target the definition name human,
and a human step role never follows a rename. A step whose mapped
roles collide refuses invalid-request at preview, not only at apply.
- The no-op apply skip also needs the same pack sha256, so a changed
pack with nothing to add still records its entry.
- Tests: the --as refusals for human, a step role collision, a pack
defining human, a changed saved pack recording its entry, board by
PUT, a granted session refused owner-only on every pack route, and a
Console without sign-in refused owner-only.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Starter packs slice SP4 (#1873): preview, apply, board and workflow writes for people. Design:
docs/plans/2026-11-12_starter-packs-design.mdsection 8 SP4, with Jason's 11-12 answers (system types become starter packs;organization.changeholders write board styles and workflows with no decision; board styles are labels, order and layout over the five fixed states).broker.mjs,runtime.mjs,refusals.mjs): five verbs,packs,pack.preview,pack.apply,board.setandworkflow.set, each also in a.consoleform. Owner only: the console forms need the owner's console cap, the plain forms the organization's human session. A tester getstester-refused, and a member or an agent getshuman-required.PACK_KEYSallowlists the arguments for each verb, soorigin,actorandbusinessnever reach an op.packOpsimplements section 3: the merge table (add,same,kept,--as, the removed tombstone keyed on id, origin and project), the plan digest withpack-plan-stale, the held-credential check, hire proposals with pins, and the stepiddropped when a pack workflow is copied. Template refs runcheckCompositionat preview. A saved pack is read only from its own owner.org-rights.mjs):packs.consolemaps toboard.read, and the four write console verbs need the owner.organization.mjs,definitions.mjs,organization-config.mjs): the genericwrite()refuses changes topacks,boardandworkflows, at org and project level, so onlyapplyPackchanges them.agentActorsnames every actor form a root or project agent carries.packsis capped at 256 entries, because each apply appends one. Workflows are capped at 32 per scope: SP7 puts workflow guidance in the prompt, and 300 workflows made a 2.1 MB prompt.org.mjs):mosaic org pack list|preview|apply,mosaic org board setandmosaic org workflow set|remove. Every word refuses inside an agent shell before it reads a file.packs-http.mjsnew,serve.mjs,webui/src/cli.mjs): pack, preview, apply, board and workflow routes, root owner only. Writes need--send, the exact origin and same-origin fetch. Bodies are JSON with an exact key allowlist, at most 64 KiB.GETandHEAD /api/boardstay the Board read.Nothing in
roles/orcontracts/.Tests:
packs.test.mjs(bus),pack-writes.test.mjs(organization),org-packs.test.mjs(CLI),packs-http.test.mjs(webui), and additions inorg-rights,console-decideandrequest-console. Red before: all four new files fail against the BASE sources. Each review fix was reverted and its test went red. Lane gate on the head: 6049/1. The one failure is the known CHAT-01 jsonschema base red in packages/conversation. Lead check underenv -i(459 files): 4848/2, the CHAT-01 red plus a fixture file the Lead's list picked up by mistake (federation-host.mjs, which runs only under its own harness).Reviews (fresh Opus delegates): build review changes 5, security review changes 4, all fixed. The first security re-check found one P2: the
/api/boardmethod split madeDELETE /api/orgs/<id>/boardanswer 403 instead of 405. That and three P3s were fixed. The second re-check approved the head.Deferred:
docs/TOOLS.mdentries for the new words.humanin the starter-pack and org definition name checks.HEAD /api/board. This goes to SP6.