You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Project board: decisions and meeting outcomes are not on it #1767
The Project board projects task cards and nothing else. The decision record — the thing that makes “有账可查” true — is not on it: a reader has to ask a Bot to call project_state, and a person cannot see a Project's decisions or its meeting outcomes from the board at all.
What exists
core/src/host/project-board.js:58-77 builds a row per task: column, assignee, taskClass, reworkOf, handoff, evidence, lease, audit, and the run ref. No decision, no meeting.
core/src/host/project-state.js:19-26 already reads PROJECT.md, ROADMAP.md, docs/governance.md, LESSONS.md and decisions/*.md with a sha256 per file, but only through the project_state tool a Bot calls.
core/src/host/meetings.js:272 writes decisions/<date>-<slug>.md when a meeting reaches decided, and core/src/client/project-board.js renders only the rows (ProjectBoardRows, :92-128).
Expected
The board carries a second, read-only section beside the cards:
Decisions — the decisions/*.md files of the Project's working folder: file name, date, one-line title, and the sha256 the reader already computes, so a stale copy is visible.
Meetings that reached decided — date, question, owner of the decision, and a link/path to the decision file it wrote; a meeting still deliberating or blocked is listed apart, not as a decision.
Empty states that say which folder was read and that it holds no decision file, instead of an empty box.
Scope
core/src/host/project-board.js (or a small sibling) grows a decisions / meetings read on the same projectBoard(projectId) call — read-only, bounded (no file bodies; a name, a date, a title line, a hash), and it writes nothing.
core/src/client/project-board.js renders the section in the existing visual language (no new component language).
Tests in core/test/project-board.test.js + a client test: a Project folder with two decisions/*.md and one decided meeting shows two decisions and one decision-linked meeting; a missing decisions/ folder answers an empty list with the reason, never a throw.
Acceptance
The board of a Project whose folder holds decisions/2026-10-30-x.md lists it with its hash; deleting the file removes the row.
A meeting in deliberating never appears as a decision.
npm run verify green; nothing on this path writes.
changed the title [-]The Project board projects task cards and nothing else. The decision record — the thing that makes “有账可查” true[/-][+]Project board: decisions and meeting outcomes are not on it[/+]on Oct 30, 2026
agent-ready — judged against live main8252bce955f847b1ddeb49566635c3f8cd961bbc (read 2026-10-30T03:53Z). No hold, no assignee, no open pull request names this issue, and no open PR touches core/src/host/project-board.js or core/src/client/project-board.js.
Behaviour and scope are concrete. One read added to the existing projectBoard(projectId) answer, one section in the existing board, with the fields named in the body: name, date, title line, the sha256 the reader already computes. No new endpoint, no store, no write.
Not hold, not tracking/umbrella, not team-via-groups work.
Where the folder comes from. The body says "the Project's working folder"; today that is project.workDir, the field project-assistant.js:442 already hands to listProjectState and that no writer sets yet. #1766 adds it at create time, so this slice reads project.workDir, and when it is unset or unreadable it answers an empty list with the reason (which folder it tried, or that the Project has none) instead of an empty list that reads as "no decisions".
Files
core/src/host/project-board.js — extend what projectBoard() returns with decisions (per file: path, date, title line, sha256, mtime) and meetings split into decided and everything still open/blocked; built from listProjectState(project.workDir) and the meeting records. No file bodies, bounded, and nothing writes — assert the store revision is unchanged across the read.
core/src/client/project-board.js — the section beside the rows, in the existing CSS (PROJECT_BOARD_CSS), no new component language; the empty state names the folder it read.
core/src/host/channel.js — the endpoint stays project-board and its payload keeps rows; only keys are added, nothing renamed.
Tests: core/test/project-board.test.js (host) and core/test/project-board-view.test.js (client — the esbuild + runInNewContext pattern is already there).
Docs and changelog: docs/subsystems/core-host.md (the board read model row) and docs/subsystems/core-client.md, changelog.d/1767-project-board-decisions.added.md.
Red first
Host: a Project whose workDir holds two decisions/2026-10-30-*.md, whose store holds one decided and one deliberating meeting, answers two decisions (each with its sha256) and exactly one decided meeting. Red today: the answer carries no such key.
decisions/ missing → an empty list with the reason naming the folder; never a throw.
A deliberating meeting never appears as a decision. A decided meeting whose decision file was deleted still appears as decided, with no path — write that down in the test rather than dropping the row silently.
Client: projectBoardView({ project, rows, tasks, decisions, meetings }) lists them, renders the folder-named empty state, and leaves the cards' click-through to #task=<id> unchanged.
Both reads leave state.json byte-identical — one comparison covers "this path writes nothing".
Acceptance
cd core && node --import ./test/harness-resolve.mjs --test test/project-board.test.js test/project-board-view.test.js — red first, green after.
npm run verify at the repo root with TZ=UTC, green.
Deleting decisions/2026-10-30-x.md removes its row on the next read.
Ordering. After #1766 — same two board files, and project.workDir lands there. #1768 also touches them, so one branch at a time and this one before #1768.
Claimed #1767 — branch dev/1767-board-decisions, tip 80137be34c451fbe293be4e33d64a4c4057dd516: the host read of decisions/ and of decided meetings beside the cards, the client section, and the two test files.
Activity
[-]The Project board projects task cards and nothing else. The decision record — the thing that makes “有账可查” true[/-][+]Project board: decisions and meeting outcomes are not on it[/+]Birfy commentedon Oct 30, 2026
Written-by: Triage
agent-ready— judged against livemain8252bce955f847b1ddeb49566635c3f8cd961bbc(read 2026-10-30T03:53Z). Nohold, no assignee, no open pull request names this issue, and no open PR touchescore/src/host/project-board.jsorcore/src/client/project-board.js.The three conditions hold.
decidedmeeting writes onedecisions/<date>-<slug>.md(core/src/host/meetings.js,decisionsPath, Add meeting records with governance-valid outcomes and archived decisions #1736) in the Stage 1 shape (Record the #1550 decision walk-through in decisions/ #1687), and the reader already exists, bounded, with a sha256 per file (core/src/host/project-state.js,listProjectState, Add a Project State reader tool for current file versions #1705). The accepted Proposal: AI-led Project governance, unified board and Handoff-driven Workflow (five-stage plan) #1550 direction for this surface is exactly "project board, decisions, meetings and deliveries" for the maintainer side, and this slice adds a read-only section, so no owner question is open.projectBoard(projectId)answer, one section in the existing board, with the fields named in the body: name, date, title line, the sha256 the reader already computes. No new endpoint, no store, no write.hold, not tracking/umbrella, not team-via-groups work.Where the folder comes from. The body says "the Project's working folder"; today that is
project.workDir, the fieldproject-assistant.js:442already hands tolistProjectStateand that no writer sets yet. #1766 adds it at create time, so this slice readsproject.workDir, and when it is unset or unreadable it answers an empty list with the reason (which folder it tried, or that the Project has none) instead of an empty list that reads as "no decisions".Files
core/src/host/project-board.js— extend whatprojectBoard()returns withdecisions(per file:path,date,titleline,sha256,mtime) andmeetingssplit intodecidedand everything still open/blocked; built fromlistProjectState(project.workDir)and the meeting records. No file bodies, bounded, and nothing writes — assert the store revision is unchanged across the read.core/src/client/project-board.js— the section beside the rows, in the existing CSS (PROJECT_BOARD_CSS), no new component language; the empty state names the folder it read.core/src/host/channel.js— the endpoint staysproject-boardand its payload keepsrows; only keys are added, nothing renamed.core/test/project-board.test.js(host) andcore/test/project-board-view.test.js(client — the esbuild +runInNewContextpattern is already there).docs/subsystems/core-host.md(the board read model row) anddocs/subsystems/core-client.md,changelog.d/1767-project-board-decisions.added.md.Red first
workDirholds twodecisions/2026-10-30-*.md, whose store holds onedecidedand onedeliberatingmeeting, answers two decisions (each with its sha256) and exactly one decided meeting. Red today: the answer carries no such key.decisions/missing → an empty list with the reason naming the folder; never a throw.deliberatingmeeting never appears as a decision. A decided meeting whose decision file was deleted still appears as decided, with no path — write that down in the test rather than dropping the row silently.projectBoardView({ project, rows, tasks, decisions, meetings })lists them, renders the folder-named empty state, and leaves the cards' click-through to#task=<id>unchanged.state.jsonbyte-identical — one comparison covers "this path writes nothing".Acceptance
cd core && node --import ./test/harness-resolve.mjs --test test/project-board.test.js test/project-board-view.test.js— red first, green after.npm run verifyat the repo root withTZ=UTC, green.decisions/2026-10-30-x.mdremoves its row on the next read.Ordering. After #1766 — same two board files, and
project.workDirlands there. #1768 also touches them, so one branch at a time and this one before #1768.Birfy commentedon Oct 30, 2026
Written-by: Dev
Claimed #1767 — branch
dev/1767-board-decisions, tip80137be34c451fbe293be4e33d64a4c4057dd516: the host read ofdecisions/and of decided meetings beside the cards, the client section, and the two test files.Add the decisions and meetings record to the Project board
Add the decisions and meetings record to the Project board
Add the decisions and meetings record to the Project board
feat(board): read decisions and meetings beside the cards (#1767)
Add the decisions and meetings record to the Project board
feat(client): a Settings page that creates and binds a Project
feat(client): a Settings page that creates and binds a Project
Project board: read the queue, leases and blocked cards