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

A group with no members can decide nothing, and the app says so before somebody proposes into silence #54

open not picked up yet opened this
opened this

tally measures a majority against the roster, so with an empty roster every proposal needs one vote from a group of nobody and can never be decided. The roster starts empty — production's is empty right now — and nothing anywhere says it. The first person to use this app opens a proposal, waits, and learns from nothing at all that no vote could ever have landed.

What done looks like

  • [ ] One place computes it: a small rosterState(db) beside the other roster actions returning how many members there are and whether the group can decide anything — not four pages each counting rows.
  • [ ] / says it above the list, in one sentence, whenever the roster is empty: the group has no members yet, so nothing can be decided until an admin adds some, with a link to /group. It is a plain line in the page's own voice, not a red alarm.
  • [ ] The propose form says the same thing at the moment it matters — next to the rule chooser, where a person is picking how their proposal will be decided.
  • [ ] /p/:id on an open proposal with an empty roster says it where the tally would be, instead of showing a threshold that cannot be reached.
  • [ ] An admin sees the one action that fixes it ("Add yourself to the group"); a user sees who to ask; a guest sees the plain statement and nothing to do.
  • [ ] /api/health reports members alongside schemaVersion, so an operator can see a group that cannot decide without opening a page. It is a count, never a list of names.
  • [ ] MCP's health and the terminal's header carry it too, in the same words — an agent that proposes into an empty group should be told the same thing a person is.
  • [ ] A named: rule is the exception and must not be mis-warned: it is measured against its own names, so a proposal under named:alice,bob:2 can decide with an empty roster. The warning does not appear on that proposal's page, and there is a test for exactly that.
  • [ ] Tests: the line appears on /, the propose form and /p/:id with no members and is absent with one; the named: exception; /api/health carries the count; the admin, user and guest each see their own version.
  • [ ] bun test is green.

Files I expect to change: src/actions.ts, src/actions.test.ts, src/pages/home.ts, src/pages/proposal.ts, src/pages/group.ts, src/routes.ts, src/mcp.ts, src/tty.ts, src/server.test.ts.

Risks: this is a sentence in five places and the failure is five slightly different sentences — write it once, export it, and let every door print the same string. Do not refuse a proposal into an empty roster: proposing before the group exists is reasonable, and a refusal here would be the app deciding something it has no business deciding. If #28 has not landed, the link to /group is a link to a page that does not exist — depend on it rather than inventing a placeholder page.

Fit: Hearth — the app saying the one thing a newcomer cannot deduce. A person assigns; I do not.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs