LIGHT PASS (owner-ruled, no full council) bringing the pre-master-plan place-party-pages.html mockup into the journey system. Data layer is LIVE on dev (doc-17 Part A: parties collection 80 rows + aliases, Official.partyId, party profile endpoint) and a Flutter v1 is sim-verified — these frames are the BINDING chrome for that build + the Part B (org/branch/claim) teaser. The party page is a PUSHED page (S13 chrome, R1), the roster is 100% auto-derived from officials.partyId (zero manual upkeep), and per spec parties get NO geo broadcast — a claimed unit posts to its FOLLOWERS only; village fan-out stays exclusively with claimed officials. Numbers are live dev data: BJP Bihar 87 MLAs · 12 MPs (R4). EN-only frames per DECISIONS #8; hi reference = S15·E.
Derived 100% from parties + officials (Part A, live on dev): hero tint + chips read party.color (R5 — single source; s4's hardcoded chip hexes were stand-ins), identity chips from seed data (eciStatus · symbol · founded). R1: old mockup's floating icons → the S13 pushed-page app bar. R2: EN-only identity line (DECISIONS #8; nameHi → S15·E). R3: 🪷 emoji → monogram tile (F24; build = party.logoUrl, abbr fallback). R4: live dev numbers — 87 MLAs · 12 MPs · 99 linked, Bihar pre-selected from the user's place (state of placePath), "All states" honest. Roster rows = the S4 .off pattern: seat in the role line + Vidhansabha/Lok Sabha chip (B12 names), ✓ ONLY on claimed officials (B6), row tap → the official's S13 authority page. Follow = normal follow (audience for Part B). 🚫 NO broadcast affordance anywhere — geo fan-out is officials-only per spec. Unclaimed page carries the E16-tier community-record line.
The S4 .pty chip grows a caret and a tap target (.s15-pchip — same metrics, party.color tint per R5) wherever an official renders with a linked partyId: ① the place Overview directory (S4 offgrp) ② the S13 authority-page occupant row. Tap → push the party page. Render guard (carried from the v1 mockup): chip ONLY when partyId is present and ≠ party_unknown — the unlinked Mukhiya stays plain text; administrative roles (SHO/CO/BDO) never carry a chip (B7 + prior-locked elected-only). partyColor is already returned by the reps/people API (additive). All other row anatomy (B6 trust tiers, B8 call, B10 attribution) is untouched — this is ONE new affordance, not a new row.
State pre-selection = the state of the user's placePath (Bihar for Bheldi) — never a bare national dump. ① MPs toggle: same .off rows, Lok Sabha chip, count flips to 12 seats. ② State switcher: chips scroll; tapping a state the data hasn't reached yet renders the no-data state — a dashed empty that names the gap, never a fake zero-list. ③ "All states" stays HONEST (R4): Bihar is the only seeded state today, so All-states says exactly that instead of inventing an all-India number (the old mockup's "2,941 all-India" is dead). When more states land, this tile silently becomes the real grouped list — copy is server-driven off the seeded-states count, no release needed.
Officials data is rolling out state by state — Bihar is live. Kerala lands with its constituency mapping.
⏳ Part B is NOT in the v1 build — this frame fixes the target so v1 lays no wrong rails. The claimed page is the BJP Bihar STATE UNIT (doc-12 branch pattern: org-kind entity, parentOrgId → the national page; claims are PER UNIT, by the party's state media cell). Claim machinery = the S13 pattern verbatim (#14): admin-reviewed evidence, never automatic, claim bar in the same gold voice. Verification unlocks exactly ONE power: posting as the unit (a Posts tab appears; the post card = the REAL UserPostWidget 1:1, DECISIONS #11). 🚫 NO geo broadcast — a party post reaches its followers only; village fan-out + push stay exclusively with claimed OFFICIALS (spec §Part B). The roster stays auto-derived and community-owned — claiming the unit does NOT hand the party its own roster edits. Karyakarta/member affiliation on user profiles stays deferred (politically sensitive).
DECISIONS #8: ONE language per screen via i18n — this frame renders S15·A end-to-end in hi. This is where parties.nameHi earns its seed column: the title becomes भारतीय जनता पार्टी (the EN frame never shows it, R2). Chips राष्ट्रीय पार्टी / चुनाव चिह्न · कमल / स्थापना 1980, stats विधायक · बिहार / सांसद / जुड़े पदाधिकारी, toggle विधायक / सांसद, CTA फ़ॉलो करें, roster header विधायक · बिहार with B12's विधान सभा chips, auto-note "रोस्टर अपने-आप बनता है". Officials' names from the SSOT's native-script field (Location-Haiku pipeline: 1 native script per place/person). Numerals, the abbr "BJP" monogram and "Nyburs" stay Latin. Devanagari line metrics run taller — the dense modifier absorbs it; layout, components and ordering identical to S15·A.
Journey position: S15 = the party lens over the S13 civic graph — citizens reach a party page from any rep row's party chip (S4 directory, S13 occupant field); the roster links back to S13 authority pages. v1 ships S15·A–C on the LIVE Part A layer (parties collection 80 rows + aliases, Official.partyId, GET /places/parties/:partyId/profile — all on dev; Flutter v1 sim-verified, these frames are its binding chrome). Part B (S15·D) is build-pending: org-kind entity (plan §23 political_party, no placePath) + doc-12 branch units (parentOrgId, BJP → BJP Bihar) + per-unit S13-pattern claim = posting rights only. Hard guards: 🚫 NO geo broadcast for parties — village fan-out + constituency push remain exclusive to claimed officials; party posts reach followers only · party chip renders ONLY for partyId present ≠ party_unknown, NEVER on administrative roles (B7 + prior-locked elected-only) · roster stays community-owned after claim (no party self-edits outside the steward flow) · member/karyakarta affiliation on user profiles DEFERRED. Ruling notes vs the old mockup (place-party-pages.html, pre-header-diet): R1 floating hero icons → S13 pushed-page app bar · R2 dual-language identity → EN-only + hi frame (DECISIONS #8) · R3 emoji lotus → monogram tile, build = party.logoUrl (F24) · R4 invented counts (84 / "2,941 all-India") → live dev numbers 87/12/99 + honest All-states · R5 party.color = single source (s4's hardcoded chip hexes converge to the API value; light-theme ink = darkened pc, here mirrored per-party). Build notes: party-color tint/line via color-mix over one hex; rows reuse the S4 .off widget verbatim (one new tappable chip); state pre-selection = state of the viewer's placePath; All-states copy server-driven off seeded-states count. Events: party_page_viewed{partyId,source} · party_chip_tapped{context} · party_followed · party_roster_filtered{role,state} · party_roster_row_tapped. For the gate: ① Follow on the v1 read-only page = recommended KEEP (audience compounds before Part B; spec lists follow under Part B — flag if the lead wants it deferred) ② built Flutter v1 should be re-checked against R1/R2/R4 chrome (it predates these frames) ③ roster sort locked A→Z by seat — revisit only with evidence.