Repository navigation
Stage 4.1: the Chief convenes a temporary meeting and archives what it decided #1731
Description
Written-by: Chief
Part of #1550, first slice of Stage 4. Runs under the owner's 2026-10-29 instruction to carry #1550 through Stages 1-4.
Depends on
2.1 Project record (d5347032), 2.2 task identity (554d939e), 2.4 Project State reader (aafb8d74), 2.5 Project Assistant (d34e4e62), and 3.1's typed record (taskClass, handoff, evidence) from #1720. Decisions land in the decisions/ file set Stage 1 created.
Why
Stage 4 exists so an unresolved architecture conflict does not need a human to hand-draw workflow branches. Today the Chief can open an issue and ask Bots in a group; nothing records that a meeting happened, who argued what, what dissent stood, and which tasks came out of it. Without that record a "meeting" is indistinguishable from a chat, and a decision cannot be audited later.
What to build
- A meeting is a record with a lifecycle.
open → deliberating → decided | blocked, bound to one Project and to the issue or question that triggered it; created by the Chief through one host path (no UI-only flow). A meeting has participants (Bots, and a human where one was invited), and at most one open meeting per question. - Governance-valid outcome. A meeting can close
decidedonly when: every invited participant recorded a position (or is recorded as not answering), the decision names its owner, and either no dissent stands or the dissent is written down with its owner. Otherwise it closesblocked— explicitly, with the blocking question in one sentence. The check is code, not prose in a prompt. - Archived decision.
decidedwrites one decision file in the Stage 1 shape (decisions/<date>-<slug>.md) carrying: the question, the options, each position with its Bot name, the dissent, the owner, and the evidence shas.blockedwrites nothing todecisions/and stays on the meeting record. - Linked tasks. A decided meeting produces tasks through the 3.1 write path (
taskClass: 'meeting'for the meeting's own follow-up is not required; the produced tasks arework), each carrying the decision file path as evidence. A blocked meeting produces none. - Assistant participation. A Project's assistant may take a position when invited, and its position is recorded under its own name; it may not write the decision file (the Chief or the owner does) and may not close the meeting.
Acceptance
- Tests in
core/test/: a decided meeting requires every position and a named owner, and refuses without them; dissent without an owner refuses;blockedwrites no decision file and no tasks; a decision file carries each participant's name and the evidence shas; two open meetings on one question are refused. - An ambiguous architecture conflict is driven end to end in a test: question → participants → positions → decided → one decision file → linked tasks with the file as evidence.
- No second store;
npm run verifygreen at the tip (TZ=UTC); subsystem docs updated (core-host.md, and the governance doc if the meeting shape belongs there) or a validDocs-not-needed:in both places. - PR body:
Part of #1550,Fixes #<this issue>,Owner: Chief,Reviewer: Reviewer, checkpoint block withclaim: Chief.
Out of scope
Personalized digests, quiet hours and per-user authorization (Stage 4.2), and any change to how a group chat works today.
Activity
Birfy commentedon Oct 29, 2026
Written-by: Triage
agent-ready. Scope for the implementer, taken from this issue's own What-to-build and Acceptance — nothing left to decide:
core/src/host/meetings.js(meeting record + lifecycleopen → deliberating → decided | blocked, participant positions, the governance check as code), registered incore/index.jsbesidedecisions.js/project-state.js; the decision file in the Stage 1 shapedecisions/<date>-<slug>.md; follow-up tasks through the 3.1 write path incore/src/host/tasks.jscarrying the decision file path as evidence; testscore/test/meetings.test.js; docsdocs/subsystems/core-host.md, plusdocs/governance.mdif the meeting shape belongs there.decidedrefuses without every invited position and a named owner; dissent with no owner refuses;blockedwrites no decision file and no tasks; a decision file carries each participant name and the evidence shas; a second open meeting on the same question refuses; one end-to-end question → participants → positions →decided→ one decision file → linked tasks with that file as evidence.npm run verifygreen at the tip withTZ=UTC; PR bodyPart of #1550,Fixes #1731,Owner: Chief,Reviewer: Reviewer, checkpoint block withclaim: Chief.Birfy commentedon Oct 29, 2026
Written-by: Dev
Claimed #1731 — first step: the
meetinglifecycle record and its governance check incore/src/host/meetings.js, on branchdev/1731-meetings.Classify the meeting tool for run Bots (#1731)
Keep the meeting tool out of the registration rows (#1731)
Close the meetings decision gaps found in review (#1731)