Place Journey v2 — master-plan SSOT

Fresh journey mockup, premium component system only. Governed by build/place-pages/master-plan/ — each screen implements its council decision sheet verbatim (✅ rulings only; ⏳/🚫 absent by design). C13-amended / DECISIONS #8: ONE language per screen — the app renders a single locale via i18n (12 locales); frames are English, plus one hi-locale reference frame. Currently: S1 Entry + Set-your-place (5 states + locale check), S2 Intro (the carousel is dead — land on the page, a ~40% sheet does the talking; 3 states + locale check) and S3 Adaptive landing + place header (THE HEADER DIET — top bar → counted ladder → Today strip → sticky tabs, ≈230px vs 510px; identity blocks move into Overview; 5 states + locale check) and S4 Overview tab content (identity blocks first; ONE builder/consumer reorder at 60%; ONE consolidated builder card; directory trust anatomy — checkmark only on claimed, no party on administrative roles, no dead call chips; hybrid local places + POI sheet; 4 states + locale check). Later screens land here as their councils rule.

‹ All screensS5·A Minimal sheetS5·B Expanded detailsS5·B2 Admin officialS5·C Location 3-tierS5·D Map pickerS5·E Publish momentsS5·F hi locale check
S5 · contribute · minimal sheet

"Add your Mukhiya" — two inputs, not seven

Implements B10 progressive disclosure — NAME + PHONE visible (3 elements max incl. the auto-detected area chip); everything else waits behind "Add more details" · B11 role-specific label ("Mukhiya's name", never "Representative"), red asterisk (error token, not literal red) replaces the "required" pill, area chip reframed as a GIFT — "Your area — filled automatically", no lock icon · A3 phone label "Government office number (public)" + permanent amber microcopy "publicly visible — office numbers only" · A9 attribution NAMED by default; the opt-out surfaces AT the moment of fear — the preview line "Will show as: Sunita D. · change" toggles to "a local contributor" per-account (Steward/Founding roles always named) · B13 fear-free trust note: destination-framed ("everyone in Bheldi can see it on the page") + undo comfort — review/pending/steward never appear in the contributor flow · submit carries the live ★ +10 Seva badge (DECISIONS #10 — "karma" never rendered). App-only: A5 place velocity cap · A6 heroPhoto NSFW async gate (Seva fires after pass) · A7 <7-day accounts → held on official contributions · A4 flag-as-incorrect = the shared S4 REPORT kind (no duplicate affordance here).

3:42
••••

Bheldi Village

Home · Resident
BiharSaranGarkhaBheldi
Bheldi's offices1 of 6
Mukhiya · Gram Panchayat
Add your Mukhiya
Add ★ +10 Seva
Add your Mukhiya
Bheldi · Gram Panchayat
Your area — filled automatically
Mukhiya's name *
e.g. Ramnath Singh
Government office number (public)
Office number
publicly visible — office numbers only
Will show as: Sunita D. · change
Everyone in Bheldi can see this on the village page. Made a mistake? You can edit it again on the page.
S5 · contribute · expanded details

"Add more details" open — phone gated, the rest instant

A1: PHONE = HIGH-RISK ALWAYS — any phone number is held regardless of seat/claim status; the field carries the "checked before going live" note while name/party/tenure keep publish-then-patrol (publish instantly) · A2: source-link becomes REQUIRED because a phone is present — "Where did you find this? Link to government website"; optional otherwise; a mobile-looking number additionally gets the soft warning "official numbers are usually landlines — sure?" · B10: expander contents = party PICKER tile (colour dot, alias search, Independent, can't-find — elected only), tenure, seat, source · B14: tenure range 1947–now+1; the year error says "Write the full year, like 2022"; a tenure-END field is absent by design on current-officeholder forms · B12 (admin variant, same system): no party/seat, ONE "In office since" + inline note "Government officials have no party — only elected seats ask".

3:42
••••

Bheldi Village

Home · Resident
BiharSaranGarkhaBheldi
Add your Mukhiya
Bheldi · Gram Panchayat
Your area — filled automatically
Mukhiya's name *
Ramnath Singh
Government office number (public)
06152 233445
publicly visible — office numbers only
The number is checked before going live — everything else publishes instantly
Party
Rashtriya Janata Dal
In office since
2022
Seat
Bheldi Panchayat
Where did you find this? *
Link to government website
needed because you added a phone number
Will show as: Sunita D. · change
S5 · contribute · appointed official

Adding a Panchayat Secretary — no party, no seat

Implements B12 the admin variant of the SAME sheet system: appointed officials (Panchayat Secretary, BDO, CO, SP, Civil Surgeon…) carry NO party picker and NO seat field — the expander degrades to ONE "In office since" field, and an inline note explains it: "Government officials have no party — only elected seats ask" (kills the "which party is the BDO?" confusion). Everything else is identical to S5·A/B — role-specific label ("Panchayat Secretary's name", B11), area-gift chip, the phone A1 gate + amber microcopy, A9 attribution preview, the ★ +10 Seva badge, fear-free framing (B13). The contrast with the elected sheet (S5·B — party dot + seat + tenure) is the whole point: the form asks only what the role actually has.

3:42
••••

Bheldi Village

Home · Resident
BiharSaranGarkhaBheldi
Add the Panchayat Secretary
Bheldi · Gram Panchayat
Your area — filled automatically
Panchayat Secretary's name *
Vinod Kumar
Government office number (public)
Office number
publicly visible — office numbers only
Government officials have no party — only elected seats ask
In office since
2021
Will show as: Sunita D. · change
S5 · contribute · location 3-tier

GPS first, landmark second, map last

C15 3-tier capture: Tier 1 PRIMARY = big "Use my location" GPS button → Tier 2 = landmark text "Where is it? (e.g. behind the school)" → Tier 3 = ghost "Show on map" (opens the S5·D full-screen picker). PlayServices-absent devices simply get tiers 1–2 — the flow never blocks on a map · C17: the Seva split is communicated LIVE at input time — the ladder + submit badge animate as location attaches: +5 name-only · +7 landmark · +10 pin/GPS (shown here in the +10 state after a GPS fix). Coordinates are NEVER displayed — the confirmation is "Location saved ✓", not lat/long · C18: self-undo is OUT for v1 — publish-then-patrol + edit-again covers it (the trust-note comfort from S5·A) · A9 attribution preview rides every sheet. App-only: the optional landmark key + the +7 weighting are server-side.

3:42
••••

Bheldi Village

Home · Resident
Nearest hospital ★ +10 Seva Nearest bank ★ +10 Seva
Add a hospital
Name *
Bheldi PHC
Location more detail, more Seva
Location saved ✓
or
Where is it? (e.g. behind the school)
★ +5name only
★ +7+ landmark
★ +10+ pin / GPS
Will show as: Sunita D. · change
S5 · contribute · map picker

Full-screen route — the map owns the gestures

C15: tier 3 opens a FULL-SCREEN route, not a sheet — map pan/zoom and sheet-drag fight over the same gesture arena. Crosshair + camera-move pin pattern: the pin stays centred, the MAP moves under it; opens centred on the place's stored centroid. Bottom confirm bar = brand "Confirm location" + the "Use my location instead" escape back to tier 1. Per-theme map styling — these tiles are built from theme tokens, so dark and light each get a native map treatment. PlayServices-absent devices never reach this screen (fallback = tiers 1–2) · C16: the design is LIBRARY-AGNOSTIC — neutral tile blocks, zero provider chrome; everything on this screen binds whichever map library ships · C17: confirming reports "Location saved ✓" — coordinates are never surfaced to the user.

3:42
••••

Bheldi PHC

Set the location — drag the map, the pin stays put
Move the map — the pin stays centred
S5 · contribute · publish moments

Specific, tappable, fear-free

D19: the toast names WHAT went live and WHERE — "Mukhiya's name added — live on Bheldi's page", 5s, tappable → scrolls to the live section; never a generic "Contribution added". Founding-Steward dialog: primary CTA = "See it on Bheldi's page" — the promise lands where they live; the steward desk is the secondary link · A1 phone-pending variant keeps the win in front: "everything else is live" · B13 duplicate-pending stays fear-free — no "rejected", no "review", a clear nothing-more-to-do · A5 place-level velocity cap: the PLACE enters a 24h review mode with the "High edit activity — contributions being reviewed" state; individual sheets keep working. App-only: A5 cap thresholds · A6 heroPhoto NSFW async gate — Seva fires only after the pass · A7 <7-day account hold on official contributions · B13 rejected = SPECIFIC reason + path forward via steward canned-reasons.

3:42
••••
The publish moment6 states
Publish-then-patrol: low-risk contributions go live on tap — the feedback beat must prove it, instantly and specifically.
A · Instant toast — auto-publish path
Mukhiya's name added — live on Bheldi's page
View →
5 seconds, tappable — tap scrolls to the section that just went live. Copy is SPECIFIC per kind; "Contribution added" never renders.
B · Phone-pending variant — only the number waits
Number will appear after a quick check — everything else is live
View →
A1: the phone is the ONLY gated piece. The win stays in front; the hold is a quick check, never "review/pending" wording in the contributor flow (B13).
C · First contribution — Founding-Steward dialog
You're a Founding Steward of Bheldi

Your first contribution started the page — ★ +10 Seva earned.

D19: the primary CTA is the PAGE — the S2 promise is delivered where they live. The steward desk stays a secondary link.
D · Duplicate pending — someone beat you to it
A neighbour already added this — it's on its way to Bheldi's page
B13 fear-free: no "rejected", no "duplicate error" — a clear nothing-more-to-do. Two people caring about the same fact is a good sign, not a failure.
E · High-activity place — 24h place state
High edit activity — contributions being reviewed
A5: the velocity cap trips the PLACE into a 24h review mode (this neutral-info state, C10 tone) — sheets keep working; submissions queue quietly.
F · Needs a small fix — specific reason + path forward
The source link didn't open — add a working government link and the number goes live
Fix →
B13: the word "rejected" NEVER appears. A SPECIFIC reason (steward canned-reason or free text) + a one-tap path forward — and everything that wasn't the phone stayed live the whole time. Fear-free, fixable, never a dead end.
S5 · hi locale reference — translation check (NOT a design pattern)

The minimal sheet, rendered in the hi locale

DECISIONS #8: ONE language per screen via i18n — this frame renders S5·A end-to-end in hi to validate every S5 key: sheet title, area-gift chip (B11's "Aapka area — apne aap bhara gaya"), role-specific field label मुखिया का नाम (B11 — never "Representative"), phone label + amber microcopy, attribution preview + "बदलें", expander row, trust note (B13's "गाँव के सब लोग देख सकते हैं" framing + undo comfort), Publish CTA, nav. Seva = सेवा (DECISIONS #10 — "★ +10 सेवा" on the submit badge; "karma"/"कर्म" never rendered). Numerals and brand "Nyburs" stay Latin. Layout, components and states identical to S5·A.

3:42
••••

भेल्दी गाँव

घर · निवासी
बिहारसारणगढ़खाभेल्दी
भेल्दी के दफ़्तर6 में से 1
मुखिया · ग्राम पंचायत
अपने मुखिया को जोड़ें
जोड़ें ★ +10 सेवा
अपने मुखिया को जोड़ें
भेल्दी · ग्राम पंचायत
आपका इलाक़ा — अपने आप भरा गया
मुखिया का नाम *
जैसे: रामनाथ सिंह
सरकारी दफ़्तर का नंबर (सार्वजनिक)
दफ़्तर का नंबर
सबको दिखेगा — सिर्फ़ दफ़्तर के नंबर
ऐसे दिखेगा: सुनीता दे. · बदलें
गाँव के सब लोग इसे भेल्दी के पेज पर देख सकते हैं। ग़लती हो गई? पेज पर जाकर फिर से बदल सकते हैं।

Journey position: S1 confirm → LAND on the home-village page + intro sheet (S2 — the carousel gate is dead per S2·A1/A2; adaptive landing starts from the SECOND session) → S3+. All frames render inline in the Place branch (root tab, no back chevron). One language per screen (C13-amended / DECISIONS #8): en frames + one hi-locale translation check per screen (S1·F, S2·D). S1 app-only rulings (A2 key scoping, A3 far-GPS soft confirm, A4 gpsAccuracy + 3/30d rate-limit, E21 timeout→retry, F28 events) ship in set_your_place.page.dart + nybursapi. S2 app-only rulings: A3 PlaceIntroRoute/PlaceIntroExtra deleted — the sheet lives in place-page logic reading the loaded PlaceDetail, placeIntroSeen + double-show guard, ~1.2s rise · D13 funnel events · D14 kill criterion (D1-return uplift ≥ +4pp or the intro is removed) · D15 post-first-contribution share card — part of the S2 design set, designed & built with the profile/share wave · E16 interim carousel bugs die with the carousel. C12's ⏳ rename is RESOLVED by DECISIONS #10: points = "Seva" — UI renders "★ +N Seva" / "Seva score" ("सेवा" in hi); "karma" survives only as internal code identifiers. S3 (header diet) app-only/build-phase rulings cited in captions: A3 first-arrival = client skips the landing call when placeIntroSeen unset + lazy ladder after paint (zero API change) · D12 auto-follow home wired as an UpdatePinnedRegions side-effect of confirmHomePlace · E15 invalidatePlaceDetail also busts places#landing#<id> (15-min banner lag), 10-min remount refresh gate, isFollowedByViewer pre-warm/fold, landing cache key gains a userId prefix BEFORE any personal cell ships (cross-user leak), open-issues count added to the landing payload · E16 personal-delta cells (Seva delta / issue-moved / per-rung rank) are deferred — the ③ Today slot is DESIGNED for them · F17/F18 mechanical-AA + i18n batches: ≥11px sublabels, kPlaceWarn light variant, chip maxWidth/ellipsis/scroll-to-active wiring, home icon on active chip, "1 contributor" singular, onAppCount stats gate ≥3, Material icons for stats, hide the "Nearby" stub tab, 44px back-chevron, "Page completeness" → "{place} info" (hi: jaankari), live "karma" string → Seva. Banner mechanics: "Go to" = pushReplacement; orientation state capped at 3 impressions in the first 2 weeks. S4 (Overview tab content) app-only/build-phase rulings cited in captions: A1 identity blocks structurally relocate from pre-tab slivers into the Overview tab + sticky TabBar via SliverPersistentHeader · B6 expose verifiedCivic in DTOs (the checkmark currently renders on ALL rows — must become claimed-only) · B8 _ContactChip currently has NO onTap — wire the locked Call·WhatsApp·Copy sheet · B10 attribution = batched revision join on directoryTemplate (M); the ⏳ confirm-counts mechanism ("6 logon ne sahi maana") + confirm-gated call = slot designed, built later · B11 new REPORT contribution kind (S) · B14 election-staleness refresh mechanics ride the election runbook · B16 POI lat/lng is currently silently dropped — plumb it (S) for distance + open-in-maps · D ledger: onAppCount display DEPENDS on the primaryLocation sync flag (currently OFF — everything reads 0; launch-blocking) + ≥3 gate, emoji stats → icons, "1 contributors" singular, helpChipMeta missing keys (popularPlace/co/civil_surgeon/chief_secretary/dgp/panchayat_secretary = invisible chips), hardcoded-strings batch (hero fallback, completeness card, "Add a place", empty states, "karma" in _LeaderRow → Seva ×2), placeText3 ≥11px/text-2, party+seat 320px overflow guards, breadcrumb › RTL, rank width, _SectionLabel merge, canRevert role-gate, kPlaceWarn light #D9641B, "View all" 44px tap targets, steward card tap + role label. The S4·A/S4·B/S4·E tall frames render the FULL Overview scroll in one device frame — in app the same content scrolls under the sticky tab bar.