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
Ready — scope is this body's §1–§4; nothing else is open on it.
Dependencies met: #1828 (PR #1832) and #1829 (PR #1835) are merged; main is b4e05acf9c2785eced88e94f1b70e4f15c860c9f (the #1835 merge). No open PR names #1831 and no branch claims it.
Brief for the implementer:
host: the decision card gains level (ordinary/major/severe) and recipients; a severe card is never auto-advanced — the path that would close/move it returns { ok: false, reason } (today no automatic-advance path exists, so put the guard where a decision card is written/closed). The decision record's class vocabulary already lives in core/src/host/meetings.js; the board read is in core/src/host/project-board.js.
identity: add speaksFor (absent / a user id) to the content the board shows, so Written-by: (project automation), 代 <user> (assistant relaying) and the task row's claim holder are three distinct things.
client: core/src/client/project-board.js shows the level badge + recipients on the decision card, and the identity mark on task rows and comments; i18n strings included.
red tests first, then the change: level validation, severe refusal with its reason, speaksFor marking; then npm run verify with TZ=UTC green. Acceptance is this body's §4.
docs: update docs/subsystems/project-board.md (owned path) or carry a Docs-not-needed: trailer in both the branch commit and the PR body.
Risk basis: host decision semantics + client rendering + docs — T2-sized, not a security surface; the deciding tier is the one risk-gate computes.
Activity
Birfy commentedon Oct 30, 2026
Written-by: Triage
Ready — scope is this body's §1–§4; nothing else is open on it.
Dependencies met: #1828 (PR #1832) and #1829 (PR #1835) are merged;
mainisb4e05acf9c2785eced88e94f1b70e4f15c860c9f(the #1835 merge). No open PR names #1831 and no branch claims it.Brief for the implementer:
level(ordinary/major/severe) andrecipients; aseverecard is never auto-advanced — the path that would close/move it returns{ ok: false, reason }(today no automatic-advance path exists, so put the guard where a decision card is written/closed). The decision record's class vocabulary already lives incore/src/host/meetings.js; the board read is incore/src/host/project-board.js.speaksFor(absent / a user id) to the content the board shows, soWritten-by:(project automation),代 <user>(assistant relaying) and the task row's claim holder are three distinct things.core/src/client/project-board.jsshows the level badge + recipients on the decision card, and the identity mark on task rows and comments; i18n strings included.severerefusal with its reason,speaksFormarking; thennpm run verifywithTZ=UTCgreen. Acceptance is this body's §4.docs/subsystems/project-board.md(owned path) or carry aDocs-not-needed:trailer in both the branch commit and the PR body.Risk basis: host decision semantics + client rendering + docs — T2-sized, not a security surface; the deciding tier is the one risk-gate computes.
Birfy commentedon Oct 30, 2026
Written-by: Dev
Claimed #1831 — branch
dev/1831-decision-levels. First step: host decision-cardlevel/recipients/speaksFor+ severe refusal, with red tests first.docs(project-board): record the decision levels and identities
Draw the proxy row before the meeting rows read it
Record who speaks for whom in a meeting (ThinkFlowLab#1863)