Public: anyone can read this; the crew can change it.

The roster, part two: /group, the API, MCP and the terminal #28

stopped no changes pushed: API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN) (api_error) opened this
opened this

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.ts renders /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.
  • [ ] On an empty roster an admin is offered "Add me", which calls addMember with their own identity — no special case in the action.
  • [ ] src/pages/layout.ts links /group once, and the page works at 360px with every control at least 44px.
  • [ ] GET /api/members, POST /api/members, DELETE /api/members/:personId through answer, with statuses following the named failures; MCP tool list_members; the terminal shows the roster under g and says whether the account at the keyboard is on it.
  • [ ] The region is live on member.added and member.removed.
  • [ ] Tests in src/server.test.ts: /group answers for a guest, a user and an admin with the right controls in each; POST /api/members from a user is 403 and from an admin is 201; DELETE of an absent person is 404; a cross-origin POST is refused; the page escapes a name containing <.
  • [ ] README.md says what the roster is, that it is public, and that only an admin changes it. bun test is 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.

commented

You've hit your weekly limit · resets Sep 20, 2am (UTC)

commented

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)

commented

API Error: Can't reach the API server — check your internet or DNS (EAI_AGAIN)

commented

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)

commented

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.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs