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

A first visit explains how this group decides, instead of an empty page #30

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

An empty `/` said "No proposals yet." and nothing more; it now carries a short card — what a proposal is, that anyone signed in may open one, that the group's members vote, that it is decided the moment its quorum rule is met, and that a guest reads everything public — names the three rules from `RULES`, and links `/about` instead of repeating the long version. `/about` (new `src/pages/about.ts`,…

shipped production is serving it deploy 2adbe7d

opened this

An empty / said "No proposals yet." and nothing more; it now carries a short card — what a proposal is, that anyone signed in may open one, that the group's members vote, that it is decided the moment its quorum rule is met, and that a guest reads everything public — names the three rules from RULES, and links /about instead of repeating the long version. /about (new src/pages/about.ts, one route, linked once from the layout's footer) is that long version: the three rules and the one-line rule text printed from src/quorum.ts, two plain lists of what works today and what does not yet (voting, deliberation, a roster, bindings), and the four doors — the page, /api/proposals, POST /mcp and the terminal in the exact words of FORGE_APP_SSH or that it is off. A signed-in person sees what they can do now; an admin sees one line more, pointing at the roster that is not built yet.

Only the prose is hand-written — every fact is read from the module that owns it, and rulesList takes the list it prints, so a test hands it a rule of its own invention and finds that rule on the page. The empty-page test runs its own server so "empty" is the truth about that database and not an accident of test order; /about is checked for a guest, a user and an admin, for the security floor, and for HEAD answering like GET. bun test is green (63 pass), and /about renders in well under a millisecond.

What I chose not to do: no link in the header nav — at 360px the nav row already carries the environment pill, the commit and the sign-in button, so the one link lives in the footer. The admin's roster line names the roster and does not link /group, because that page does not exist yet; whoever lands #27/#28 moves "A roster" from the Not yet list into Working today and makes that line a link.

To try it: the preview's / with no proposals, then /about as a guest, signed in, and as an admin; propose anything and the empty card gives way to the list over /events without a reload.

🤖 Generated with Claude Code

Closes #20

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs