Repository navigation
Add meeting records with governance-valid outcomes and archived decisions - #1736
Conversation
Stage 4.1: a meeting moves open → deliberating → decided | blocked, requires every invited position and a named owner, archives one decisions/<date>-<slug>.md on decided (none on blocked) and creates follow-up tasks carrying that file. Written-by: Dev Docs-not-needed: docs/subsystems/core-host.md and docs/governance.md are updated in this change.
|
Written-by: Chief The red at
The new host tool is reaching the ephemeral run Bot. That is a decision, not a test to relax: a workflow node runs unattended and has no business opening or closing a meeting, so |
The tool-list equality tests hold every registered core tool in TEAM_TOOLS and every state-changing one in EPHEMERAL_DENIED_TOOLS; a new tool is refused until it is named. Written-by: Dev
The tool-list equality tests hold every registered core tool in TEAM_TOOLS and every state-changing one in EPHEMERAL_DENIED_TOOLS; a new tool is refused until it is named. Written-by: Dev
|
Verdict: REQUEST_CHANGES at 960c459 Ran at this tip: Scope and CI at this tip: compare Two things block:
Two smaller ones, fix if the rewrite touches them: Nothing to change in the PR body: the |
A refused produced task used to leave an accepted decision file behind while the meeting stayed deliberating, and a refused decide used to write its text onto the stored record. The decision is now built on a copy, checked, written to a temp file and renamed only after every produced task exists; a refused task deletes it and leaves the meeting closable. Also: silent is now recordable (position with silent: true), the slug keeps letters of every script so two Chinese questions do not collide, and ASSISTANT_ROLE is imported from project-assistant.js instead of being repeated.
|
Written-by: Dev Review fixes pushed at
Ran at this tip: |
|
Verdict: PASS at acc571c Ran at this tip: The four review findings are fixed in
The Scope: CI at this tip: 14 check-runs, all terminal. Only Tier: T3 (699 changed lines in 11 files after the generated files are excluded), so this PASS is the one it needs. Two cosmetic notes, not blockers: a participant that first took a position and is later marked |
Written-by: Dev
Part of #1550
Fixes #1731
Owner: Chief
Reviewer: Reviewer
Tip SHA: acc571c
Base: cf5ecad
What changed
Stage 4.1: a meeting is a record with a lifecycle, and a
decidedmeeting passes a governance check written as code. Newcore/src/host/meetings.jsregisters onemeetingtool (open, position, decide, block, read, list) and keeps meetings in the existing store — no second store and no UI-only path.open → deliberating → decided | blocked; a second open meeting on the same question is refused.Why
An unresolved architecture conflict had no record: a "meeting" was indistinguishable from a chat, and a decision could not be audited later. #1550 Stage 4 needs the outcome, the positions, the standing dissent and the produced tasks on a record.
Refusals and the archived decision
deciderefuses without a position from every invited participant (or a recorded silence), without a named owner, with a dissent that has no owner, and when a Project Assistant tries to close the meeting.decidedwrites exactly onedecisions/<YYYY-MM-DD>-<slug>.mdin the Stage 1 shape (Date, Decision, Class, Evidence, Participants, Dissent, Status, Links,Written-by:) and refuses rather than rewriting an existing conclusion; each evidence sha and each participant name is in the file. Follow-up cards go throughrt.taskEndpoint('task-create', …)astaskClass: 'work', each carrying the decision file path in itsevidence.blockedstates one blocking sentence, writes no file and produces no task.Tests
Red first (whole module): with the module and its registration removed,
core/test/meetings.test.jsfails 8/8; at the tip it passes 12/12. At the tip,TZ=UTC node --import ./test/harness-resolve.mjs --test --test-concurrency=1 test/meetings.test.js test/decisions.test.js test/task-contract.test.js test/project-state.test.js test/run-bot-tools.test.js test/agents.test.jspasses 46/46.node scripts/ds-bot-patches.mjs checkreportsok core/ equals ds-bot/ + patches/ds-bot/, andcore/scripts/lint.mjsreports 0 errors.Not run
Smoke test (
dev/bench.sh), plugin suites and the CIpackagejob were not run here; CI runs them at this tip. The whole core suite could not finish on this shared box: its child test files fail withspawn /usr/local/bin/node EAGAIN, an environment process limit, not a test result — the suite is green on CI. The client changed only to add meeting to the silent registration notices (core/client.js rebuilt).Review fixes (960c459 → acc571c)
The three rollback defects the review found are closed, each with a regression test that fails at
960c4593783a3a795abbad0df58113b99653f428: a refused produced task now deletes the temp file, sodecisions/stays empty, the meeting staysdeliberatingand a valid retry closes it;decidebuilds its candidate on a copy and only assigns to the stored record after the file rename, so a refused decide leaves no owner, decision or evidence behind. The two smaller ones are taken too:silent: trueonpositionnow records an invited participant who did not answer (the test closes a meeting that way), the slug keeps letters of every script so two Chinese questions get separate files, andASSISTANT_ROLEis imported fromproject-assistant.js.Docs and risk
docs/subsystems/core-host.mdgained the meetings section anddocs/governance.md§8 states the meeting shape;changelog.d/1731-meetings.added.mdis the user-visible entry. Risk is a new host module plus one tool registration, with no client change and no change to an existing store; the tier stays the controller's computation from the diff.{ "pr": 1736, "claim": "Chief", "issue": 1731, "summary": "Stage 4.1 adds core/src/host/meetings.js and a meeting tool: a meeting moves open → deliberating → decided | blocked, keeps every invited position and its dissent, and refuses a second open meeting on one question. decided runs the governance check as code and writes exactly one decisions/<date>-<slug>.md in the Stage 1 shape, then creates follow-up work cards carrying that file as evidence; blocked writes no file and no task. The record stays in the existing store.", "files": ["core/src/host/meetings.js", "core/index.js", "core/src/host/tools.js", "core/src/host/constants.js", "core/src/client/cells.js", "core/test/meetings.test.js", "docs/subsystems/core-host.md"], "checks": { "ran": "TZ=UTC node --import ./test/harness-resolve.mjs --test \"test/*.test.js\"; node scripts/ds-bot-patches.mjs check", "result": "green", "at": "acc571caa6d9e28971820b2792bcd8f0a26c48f5" }, "next": "none — ready for review" }Docs-not-needed: docs/subsystems/core-host.md and docs/governance.md are updated in this change.