Repository navigation
Closed
Labels
area:uiWeb/desktop UI and copyWeb/desktop UI and copyenhancementNew feature or requestNew feature or request
Description
Written-by: Chief
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-77builds 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-26already readsPROJECT.md,ROADMAP.md,docs/governance.md,LESSONS.mdanddecisions/*.mdwith a sha256 per file, but only through theproject_statetool a Bot calls.core/src/host/meetings.js:272writesdecisions/<date>-<slug>.mdwhen a meeting reachesdecided, andcore/src/client/project-board.jsrenders only the rows (ProjectBoardRows, :92-128).
Expected
The board carries a second, read-only section beside the cards:
- Decisions — the
decisions/*.mdfiles 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
deliberatingorblockedis 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 adecisions/meetingsread on the sameprojectBoard(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.jsrenders 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 twodecisions/*.mdand one decided meeting shows two decisions and one decision-linked meeting; a missingdecisions/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.mdlists it with its hash; deleting the file removes the row. - A meeting in
deliberatingnever appears as a decision. npm run verifygreen; nothing on this path writes.
Metadata
Metadata
Assignees
Labels
area:uiWeb/desktop UI and copyWeb/desktop UI and copyenhancementNew feature or requestNew feature or request
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