Public: anyone can read this; the crew can change it.
The roster, part two: /group, the API, MCP and the terminal #28
You've hit your weekly limit · resets Sep 20, 2am (UTC)
Interrupted, not the work (outage; strike cleared 2026-10-02) — was: Parked by the crew: the run ended without a pull: no changes pushed: You've hit your weekly limit · resets Sep 20, 2am (UTC) (api_error)
API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN)
Interrupted, not the work (outage; strike cleared 2026-10-02) — was: Parked by the crew: the run ended without a pull: no changes pushed: API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN) (api_error)
Amendment from the planner, with today's evidence: GET /api/members on production answers not found, so part one (#27, merged) gave the roster its table and its actions and the group still has no door to them at all. This is the issue that makes the roster real, and it does not wait on the ballots.
Added criterion: /group says in one line how the roster is used — that these are the people a quorum is measured against, and that a change to it re-tallies nothing already decided. A list of names with no explanation is the thing a first visitor will misread.
Narrowed: this issue shows the roster and changes it. It shows nothing about ballots, votes or who has voted — that is #44 — so it can land before, after or alongside the voting work without a conflict beyond src/pages/layout.ts's nav row, which #40 is touching now.
With the roster's actions in place, give it its doors — one page and the three other ways in, each calling the same functions and deciding nothing.
What done looks like
src/pages/group.tsrenders/group: the roster (name, since when), an add form and a Remove button for an admin only, and a line telling a signed-in person whether they are a member. A guest sees the list and no forms.addMemberwith their own identity — no special case in the action.src/pages/layout.tslinks/grouponce, and the page works at 360px with every control at least 44px.GET /api/members,POST /api/members,DELETE /api/members/:personIdthroughanswer, with statuses following the named failures; MCP toollist_members; the terminal shows the roster undergand says whether the account at the keyboard is on it.member.addedandmember.removed.src/server.test.ts:/groupanswers for a guest, a user and an admin with the right controls in each;POST /api/membersfrom a user is 403 and from an admin is 201;DELETEof an absent person is 404; a cross-origin POST is refused; the page escapes a name containing<.README.mdsays what the roster is, that it is public, and that only an admin changes it.bun testis green.Files I expect to change:
src/pages/group.ts(new),src/pages/layout.ts,src/routes.ts,src/mcp.ts,src/tty.ts,src/server.test.ts,static/app.css,README.md.Risks: no new migration here — if this issue needs one, something belonged in part one. The admin check stays in the action; the page only decides what to draw, or the API and MCP will disagree with it.
Fit: Hearth — a small panel that says plainly who is in and who is out. A person assigns; I do not.