prd: version 1.1, the Organization requirements (decision 03130d08, task 19/265)

Squash of the PM's work/vikunja-19-265 branch, net diff 0c3826910..8ae5a1491
(patch sha256 47b34e6054a74eedd8a5b6577e40537a07b2fb8fe5846f309e100146238ef743).
The PRD moves to version 1.1. "Business" becomes "organization" in
REQ-ROLE-3, REQ-ROLE-4 and REQ-LAUNCH-1. REQ-DEC-3 and REQ-DEC-4 name an
authorized human instead of Jason. Non-goal D adds that v1 has no hosted
SaaS, and "Where it runs" says Mosaic Stack stays self-hosted open source.
A new Organizations section adds REQ-ORG-1, REQ-ORG-2, REQ-USER-1,
REQ-THREAD-1, REQ-TPL-1 and REQ-FED-1. packages/tasks/requirements.json
matches at version 1.1 with 30 ids, and the tasks and bus requirements
tests expect 30.

The branch's 010d30cbe (parseRequirementId, task 19/229) is reverted on
the branch and is not part of this squash.

Jason approved the PRD in decision 03130d08 and the merge in decision
f71c73c9 (resolved yes via the CLI, 2026-10-14T16:35:32Z). The stack
reviewer's verdict d3f97f9d approves 8ae5a1491. Sage's gate on 1c9a4910d
plus the patch passed: every package suite and every scripts/test-*.sh.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-14 11:49:36 -05:00
co-authored by Claude Opus 5.5
parent 4bc908991c
commit f7c8537b32
4 changed files with 50 additions and 22 deletions
+33 -11
View File
@@ -1,8 +1,9 @@
# PRD: Mosaic Stack
- Status: approved, version 1.0. Jason approved draft 0.4 unchanged as
1.0 on 2026-10-05 (lead decision 61). It is never edited in place.
Changes are a new version.
- Status: approved, version 1.1. Jason approved draft 0.4 unchanged as
1.0 on 2026-10-05 (lead decision 61). He approved version 1.1, the
Organization requirements, in decision 03130d08-ddce-480d-a601-e59f64744fc3
on 2026-10-14. It is never edited in place. Changes are a new version.
- Owner: Jason. Sage writes it from the PRDY interview.
- Template: PRDY "software" (`v1/packages/prdy/src/templates.ts`), filled
by hand until PRDY is ported.
@@ -54,11 +55,14 @@ off the table (round 1, "all five"):
- A. Spend money without Jason.
- B. Speak externally as Jason without his approval.
- C. Give agents Jason's personal credentials. Each role gets its own.
- D. Become a multi-tenant SaaS in v1.
- D. Become a multi-tenant SaaS in v1. There is no hosted SaaS in v1.
- E. Replace Claude Code, Codex or Pi. It wraps them.
### Where it runs
Mosaic Stack stays self-hosted open source. The licence is open, and Jason
decides it later.
Self-hosted, on Jason's machines and homelab (round 1, "A first"). Cloud
workers aren't ruled out later.
@@ -89,10 +93,10 @@ parent requirement is refused.
takes a lock and logs it, and releasing the role or ending the run frees
it. Revoking a stuck holder is gated, and the revoke cites a resolved
decision.
- **REQ-ROLE-3.** A business file declares the role instances, the
arbiters and the credential references. The user writes it, the stack
- **REQ-ROLE-3.** An organization file declares the role instances,
the arbiters and the credential references. The user writes it, the stack
never writes it, and a missing or invalid file fails closed.
- **REQ-ROLE-4.** The first business is Mosaic Stack, with four role
- **REQ-ROLE-4.** The first organization is Mosaic Stack, with four role
instances:
- PM, held by Sage;
- CTO, held by Darkwing;
@@ -145,11 +149,11 @@ parent requirement is refused.
- routine and within-role decisions are logged;
- cross-role decisions go to the business's arbiter for that domain;
- gated decisions go to the human.
- **REQ-DEC-3.** A human resolution comes only from a `mosaic` CLI session
- **REQ-DEC-3.** A human resolution, by an authorized human, comes only from a `mosaic` CLI session
started outside any agent run. Agents reach the decision store only
through a broker. The broker stamps role and run from the launch record.
- **REQ-DEC-4.** A gated decision that blocks work reaches Jason right
away: in the CLI inbox, plus a Discord DM sent through the existing
- **REQ-DEC-4.** A gated decision that blocks work reaches an authorized human
right away: in the CLI inbox, plus a Discord DM sent through the existing
connector (#1509). Everything else goes into one daily digest at 08:00
Central. (Round 2, answers 2A and 3A; round 3, 4A and 5A.)
@@ -194,7 +198,7 @@ parent requirement is refused.
### Launching
- **REQ-LAUNCH-1.** The PM launches role sessions within limits written in
the business file:
the organization file:
- role instances only;
- at most 4 Opus and 4 Sonnet sessions at once;
- every launch logged;
@@ -229,6 +233,24 @@ parent requirement is refused.
store. Measures are computed from events, never from tagging chat
messages by hand.
### Organizations
Added in version 1.1 (decision 03130d08).
- **REQ-ORG-1.** "Business" is renamed "organization". One install holds
one or more organizations, and each organization has its own bus as the
tenant boundary.
- **REQ-ORG-2.** The data model is install, then organization, then
projects, then threads, so v1 doesn't lock in one human per
organization.
- **REQ-USER-1.** Users and role-based access control exist at install
and organization level. An agent belongs to one organization and
reaches only its allowed projects and threads.
- **REQ-THREAD-1.** Threads live under projects.
- **REQ-TPL-1.** Templates exist for agent roles and for organization
types.
- **REQ-FED-1.** Installs can federate with each other. This is post-v1.
## Acceptance criteria and success measures
v1 is done when Jason gives one-sentence requests in the CLI and Mosaic