The full end-to-end funnel of an office seat on Nyburs, told in order: a citizen reaches the seat from the place Overview "Your representatives" row, follows the seat before anyone has claimed it (it survives elections), the real official arrives and claims the office with documents, an admin approves the claim in the CMS back-office, a claim_approved notification fires, the office is added to the official's profile (the S12 verified-office banner), the page upgrades to its verified state with the broadcast block unlocked, and the official finally broadcasts to the whole constituency — to the audience that was already waiting. A design preview for owner validation. Both dark & light themes are supported — toggle top-right.
A citizen scrolling their place Overview sees their MLA's name in the "Your representatives" row and taps it. That opens this office page — a pushed page (app bar + back chevron), not a place tab. It already carries both states: the verified seat above and the dataOnly / unclaimed delta strip below (community record + "Claim it"). From here the citizen can read what the seat has done — and, crucially, follow it. This is the first touch of the whole funnel.
G19: the citizen follows the SEAT, not a person — so the follow survives elections and works even while the office is still a community record with nobody claiming it. This is what fills the audience before the official ever arrives. The button flips to its Following state and a count appears: 1,240 already follow this seat. When the real official claims and broadcasts (stage 9), these 1,240 are already there.
The real MLA arrives, taps "This is your seat? Claim it" on the dataOnly page, and enters the claim flow. The pitch names the carrot honestly — 12 issues await, 8,400 constituents, broadcast power. Then they say who is claiming (official vs office staff), and submit documents: a gov-domain email, the ECI winner-list, or simply a photo of their official ID. The honest clock is set, never "24 hours". From here the request leaves the app and lands in the admin queue.
The claim is in. The official sees a single honest, read-only status: MLA/MP claims take 3–7 working days, nothing else to do but optionally add more documents (which never restarts the clock). Behind the scenes, the request now sits in the admin queue — which is where the next stage picks it up.
This is the net-new CMS page — a back-office web panel, not an app screen. An admin opens the claim, sees the claimant and their evidence documents side by side, and makes the call: Approve or Reject (with a reason). The approve/reject API already exists and is admin-gated (🔴 P0 #1 lands the AdminGuard before this ships). Verification is human, never automatic. Approve → the next four stages all fire.
The instant the admin taps Approve, claim_approved fires a push to the official's phone: "You're verified ✓ — your office desk and broadcast are unlocked." This is the moment the whole funnel pays off for the official, and it's the trigger for the next two changes: the office gets added to their profile, and the page upgrades to verified.
The approved claim is a verified, term-bound link between the office entity and the person's normal account — so the S12 profile now carries a verified-office banner. The banner is a tappable shortcut: it opens the official's office page, where compose + broadcast history live (the broadcasts belong to the SEAT, not the profile). It also carries a quick "✏ Broadcast" action straight to the composer. The page is the seat; the person stays a normal account, now badged.
The claimed state is the payoff for everyone. The page drops the "community record" disclaimer (the verified badge is now the signal), shows the live responsiveness stats, and surfaces the broadcast block. For the official it adds an action row — [✏ Broadcast] + [📥 Office desk] — and a "See all →" on "Latest from this seat" that opens the full broadcast history (next stage). And the audience that followed pre-claim — the 1,240 from stage 2 — is already there.
Tapping "See all" opens the full history — and this list belongs to the SEAT, not the person, so it survives elections: every holder's broadcasts stack up on the same office page. Citizens see it read-only; the claimed official sees the same list plus the compose entry and per-item status (SENT, UNDER REVIEW after resident flags, PAUSED · MCC, ON HOLD). This is the office-page home for compose + history — the profile banner and the office-page action row are just the shortcuts in.
The end of the funnel: the verified official posts as the seat — "Broadcasting as: MLA · Marhaura" — and reaches approx 8,400 residents (VCM village population, never a user count). It lands as a constituent feed card with the verified badge, comments stay open, and the audience that followed the seat before anyone claimed is already there. Citizen → official → admin → back to the citizens, answered.
The journey in one line: a citizen reaches the seat from the place Overview → follows the seat before anyone has claimed it (G19, survives elections) → the real official claims with documents (F18 pitch + A2 evidence + honest 3–7 day SLA) → an admin approves in the net-new CMS back-office (🔴 P0 #1 AdminGuard gates this) → claim_approved fires a push → the office links to the S12 profile (DECISIONS #14 term-bound link) → the office page upgrades to its verified state with broadcast unlocked → the official broadcasts to ≈8,400 residents (VCM population) with comments open — to the audience that was already waiting. This is a design preview reusing the S13 component system verbatim; all net-new chrome (.s13j-*) uses var() tokens so dark & light both render correctly.