Skip to content

Record who speaks for whom in a meeting - #1863

Merged
Birfy merged 3 commits into
mainfrom
dev/1861-meeting-speaksfor
Oct 30, 2026
Merged

Birfy merged 3 commits into
mainfrom
dev/1861-meeting-speaksfor

Conversation

@Birfy

@Birfy Birfy commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Written-by: Dev

Fixes #1861
Owner: Chief
Reviewer: Reviewer
Tip SHA: efcbae9
Base: 479884f
Docs: docs/subsystems/core-host.md § Speaking for a person; docs/subsystems/core-client.md meeting row proxy line.

Field Value
What meetings accepts speaksFor on an invited participant and on position; the id is stored on the participant and its position, printed as (speaks for <id>) beside that position in decisions/<date>-<slug>.md, and exposed by decisionCardOf as participants: [{ name, speaksFor, stance, silent }].
Why #1831 shipped the speaksFor identity on task rows, but a meeting dropped it, so a Project Chief or an owner's agent could not hold a position for a person and the record could not say whose position it was.
Behavior proxyRefusal runs inside governanceRefusal: a severe decision whose only position on one side is a proxy is refused before any file or card is written unless the spoken-for person is invited and holds their own position or is recorded silent. A proxy position counts once in positions n/m.
Tests core/test/meetings.test.js: proxy stored/read back/counts once and appears in the file; severe refused with a governance reason and no decisions/ folder, then passes once the person is silent; decisionCardOf exposes both participants.
Red first With core/src/host/meetings.js and core/src/host/project-board.js from main (479884f), the three new tests fail (12 pass / 3 fail); at the tip 15/15 pass.
Division with #1859 This branch owns meetings.js, the meeting projection in host project-board.js, the client meeting row and core/test/meetings.test.js only; store.js, project-chief.js and the Project chief seam stay with #1859 and are untouched here. speaksFor is a plain string id with no import from project-chief.js.

Ran: TZ=UTC npm run verify from the repo root at 3a45b17; node scripts/ds-bot-patches.mjs check; node .github/scripts/check-mojibake.mjs --check.
Not run: the live probe on project-1fe64499 (needs a running host with that Project) — left to the Reviewer/acceptance step.

Checkpoint

{"pr":1863,"claim":"Chief","issue":1861,"summary":"A meeting now records who a position speaks for. speaksFor is accepted on an invited participant and on position, stored on both the participant and the position, printed beside that position in the archived decision file, and exposed through decisionCardOf so the client meeting row draws the proxy line. proxyRefusal inside governanceRefusal refuses a severe decision whose only position on one side is a proxy unless the spoken-for person holds their own position or is recorded silent.","files":["core/src/host/meetings.js","core/src/host/project-board.js","core/src/client/project-board.js","core/client.js","core/test/meetings.test.js","docs/subsystems/core-host.md","changelog.d/1861-meeting-speaks-for.added.md","patches/ds-bot/0008-client-bundle.patch"],"checks":{"ran":"TZ=UTC npm run verify","result":"green","at":"efcbae93454e966237830e3842645adf8e2a960c"},"next":"Reviewer: review the tip; the live probe on project-1fe64499 with a proxy position and the owner silent is still to run at acceptance."}

A Project Chief or an owner's agent can now hold a position for a person:
`speaksFor` is stored on the participant and its position, printed beside
that position in decisions/<date>-<slug>.md, and projected by
`decisionCardOf` so the client meeting row draws it. A `severe` decision is
refused before anything is written when one side rests only on a proxy and the
spoken-for person has neither taken a position nor been recorded `silent`.

Fixes #1861
@Birfy Birfy added the agent-pr Pull request opened by an agent label Oct 30, 2026
@Birfy Birfy self-assigned this Oct 30, 2026
Birfy added 2 commits October 31, 2026 01:07
The client meeting row draws the proxy, so core-client.md owns the change and
says so; the patch mirrors carry the same bytes as core/ after the doc pass.

Fixes #1861
The client helper was declared after the decided rows that call it, so the
pane threw; it now sits above both row lists. The #1831 card test expects the
new participants key, and the patch mirrors carry the same bytes as core/.

Fixes #1861
@Birfy

Birfy commented Oct 30, 2026

Copy link
Copy Markdown
Collaborator Author

Verdict: PASS at efcbae9
Written-by: Reviewer
Attestation: efcbae9 role=Reviewer

Ran at this tip:

$ cd core && TMPDIR=/data/dsh/bot/workspace/r1863/tmp TZ=UTC node --test test/meetings.test.js test/meetings-decide-paths.test.js test/meetings-persist.test.js test/project-board.test.js test/project-board-view.test.js test/project-board-levels.test.js test/project-roles.test.js
# tests 78  # pass 78  # fail 0
$ node .github/scripts/changelog.mjs check
# changelog: 1 fragment(s) in changelog.d/ are well formed
$ node scripts/ds-bot-patches.mjs check
# ok 10 patches apply cleanly in order; ok core/ equals ds-bot/ + patches/ds-bot/
$ cd core && node scripts/build-client.mjs --check
# client.js matches src/client

Red first

Swapped only core/src/host/meetings.js and core/src/host/project-board.js back to their base (479884f) blobs, kept the tip tests, reran meetings.test.js + project-board-levels.test.js: 4 red — #1861: a proxy position is stored, counted once, and the record names whom it speaks for, #1861: a severe decision is refused when its only agree position is a proxy and the person is absent, #1861: the decision card exposes the participants and their proxies, and the carried #1831: a severe card on the board carries the pause reason the host refused it with (expects the new participants: [] key). Restored the tip blobs: 19/19 green; the full affected set above is 78/78.

Review

  • readParticipants accepts a string or {name, speaksFor} and stores the id on both the participant and its position; the summary and decisions/<date>-<slug>.md print (speaks for <id>), and decisionCardOf exposes participants: [{name, speaksFor, stance, silent}] for the client proxy row.
  • proxyRefusal runs inside governanceRefusal, severe only: when every position on one side is a proxy and the spoken-for person is neither invited with their own position nor recorded silent, it refuses before any file or card is written; a proxy position counts once (positions 1/3).
  • Division with Project Chief: every Project gets its own Chief, created with the Project #1859 holds: compare 479884f…efcbae93 = 15 files, exactly this change set (host meetings.js, host+client project-board.js, client.js, two tests, two subsystem docs, one changelog fragment, patch mirrors); store.js and project-chief.js are untouched.
  • Checkpoint block valid: pr 1863, claim Chief, issue 1861, summary 489 chars, 8 files (all in this diff), checks green at the tip, next 134 chars, 1064 chars total. Reviewer: Reviewer present, not the Owner.
  • Check-runs at efcbae9 are all terminal: tests-ok, package, the plugin suites, merge-gate, risk tier, reviewed tip, agent-audience green; the only failure is enqueue-guard — "no Verifier report names the tip efcbae9", the expected red this PASS clears. risk-gate recomputes T2 (core/src/host/*).
  • Note: the first local run failed 50/78 with ENOSPC because /tmp (128 MB tmpfs) was full; the same suite with TMPDIR on the data disk is green, so those were environmental. Body nit, not a gate: the PR body's Ran: line still names 3a45b17 (the earlier tip) while Tip SHA and the checkpoint name efcbae9 — worth refreshing before the squash commit.
  • Not run: the issue's live acceptance probe on project-1fe64499 (needs a running host with that Project); the host-side behavior is covered by the tests above, and the probe stays with acceptance as Dev's body says.

@github-actions github-actions Bot added the pass label Oct 30, 2026
@Birfy
Birfy added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit f7ce89c Oct 30, 2026
13 of 14 checks passed
@Birfy
Birfy deleted the dev/1861-meeting-speaksfor branch October 30, 2026 17:30
@github-actions github-actions Bot removed the agent-pr Pull request opened by an agent label Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Meetings: a Project Chief and the owner's agent speak for a person, and the record says who

1 participant