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.
Implements A1 RECENCY-DEFAULT at village level, hard — engagement-ranking on ~3 posts/day buries today's flooded road under last week's festival photo; district/state get ranked + a "Latest" chip · A2 the Today strip's "6 new" tap lands HERE recency-first, scrolled to top (build contract, not a note) · A3 count honesty: "new"/"recent", never "today" until 🔨 todayCount (IST midnight) ships · B6 slim compose bar KEPT — fake-input, edit glyph, NO avatar, persona placeholder · B7 open posting, residency SURFACED not gated: subtle "Resident" chip on the place·time line + "Residents post here" signal · C9 civic post = WRAPPER overlay (amber left bar + status chip + "Filed with…" + Samarthan count) AROUND an UNTOUCHED UserPostWidget · C10 resolved issues stay; recency sinks them · DECISIONS #11: card = 1:1 redraw of refs/real-place-feed-post.png. App-only 🔨: A1 server sortBy in getPlaceFeedPage · A4 P0 14d cap on the DB fallback (posts.repo.ts:3927) · A5 Gorse re-score now intentional · C9 status/routedTo/supportCount onto Fragment$post · F20 batch the 20× GetPostV2 hydration · F21 q:60 media variant. S3 AMENDMENT 2026-06-11 (a)–(d) + (g): the amber bullhorn tile at the compose bar's right end is a one-tap ISSUE shortcut — opens the composer directly in Shikayat mode ("one big tap to complain"); the bar keeps no-avatar, edit glyph, persona placeholder.
Evolves the owner-APPROVED place-composer.html. Implements D11 destination chip "Posting to → Bheldi" in PLACE BRAND GREEN — amber is Shikayat-ONLY (today both modes show issue tint, a semantic bleed; 🔨 palette fix + "Yahan post hoga:" i18n); chip is NON-EDITABLE (no caret/picker) and is designed with a second-line extension point for the future follower-timeline disclosure — until that ships the composer says NOTHING about followers (Law #7) · B8 [Post | Shikayat] selector — Shikayat carries a slightly LARGER tap target even when inactive (mis-mode guard on budget phones); modes never bleed · B6 persona-aware placeholder, resident frame (hi: "Gaon mein kya ho raha hai? Batao…" — never raw EN on the hi locale, 🔨 i18n batch; follower/migrant + visitor variants ship as keys) · B7 posting open to all. App-only 🔨: D14 P0 DATA CHECK — no code path injects CreatePostPageExtra.placeId into a normal post's regionIds (issues use issuePlaceId); the chip's promise is broken until wired — verify before any build sign-off.
Implements B8 "Issue" label = Shikayat (localized term, never an untranslated EN word; selector target slightly larger) · D11 Shikayat-ONLY amber destination chip · D13 10 icon+label category chips with "Yojana", not "Scheme" (highest-search Bihar civic term); title placeholder ships Hindi-frame · D12 routing preview card ALWAYS VISIBLE — 🚫 conditional hide (discovery fails). Resolved copy is locally legible office-title honesty: "Will be sent to Gram Panchayat, Bheldi" (hi-frame ruling copy "Gram Panchayat, Bheldi ko bheja jayega") — NO arrow glyph, no person promised (S7 4-tier honesty applies to the preview too). Empty state below = "Pick a category first" (hi-frame "Pehle category chuniye"); 2G: lookup >5s → fallback "It will reach the right office for this category" and the user may proceed. Evidence media stays (Photo/Camera/Video); GIF/Poll disabled. App-only 🔨: routing computed server-side from category + region; D14 regionIds wiring check rides this mode's sibling too.
Implements E15 empty (0 posts) = use-case VISUAL prompts — road/water/news mini-rows showing WHAT people post — with the compose bar prominent above and a place-silhouette illustration (🚫 bare "Be the first" EN text-nudge · 🚫 sad-cloud) · E16 quiet (1–5 posts/14d) = show the posts with honest "Posted 11 days ago" labels (A4: the 14-day window holds at all levels, no silent widening), then ONE low-key below-feed nudge "4 people posted this week — add yours" rendered ONLY when N≥3 (B7-amended: below 3, show NOTHING); resident-aware variant ships as a key · E17 the invite CTA deep-links the D15 share card (place name + honest post count + Feed deep link — the primary viral loop); ⏳ the card itself is designed at the S14/S16 window, so this frame carries a placeholder slot. The banner stays the S3 single-slot system — S6 adds NO fourth banner state. Top-bar pin tile per S3 AMENDMENT 2026-06-11 (c); tab badges omitted here (empty/quiet counts), the (g) issue shortcut shows on S6·A/S6·F.
Implements F19 skeleton states REQUIRED — shimmer post-shaped rows between feed-load and hydration-complete (today: a blank list on 2G → rage-refresh loop); the error state's retry button is a ≥44px target · E18 end-of-feed is SILENT (a minimal spacer at most) — 🚫 "You're all caught up" congratulatory tone on a thin village feed. App-only 🔨 (the real 2G fixes live server-side): F20 the 20× parallel GetPostV2 hydration is the highest-impact perf fix — first page currently gated on the SLOWEST of 20 calls; batch endpoint or batched GraphQL (M) · F21 place feed passes a medium-quality image hint (q:60) — the card today defaults to q:100/h:1080 ⇒ 4–10MB pages on 2G · F22 landing-cache single-flight (district scale, low priority) · A5 sort mode resets per session. G events: place_feed_open · place_feed_new_tap · place_compose_bar_tap · place_compose_submitted/_type · place_empty_share_tap · place_feed_scroll_depth; metric = weekly place-post rate ≥10% of active places within 60 days. Top-bar pin tile per S3 AMENDMENT 2026-06-11 (c); tab badges omitted while counts are still loading.
DECISIONS #8: ONE language per screen via i18n — this frame renders S6·A end-to-end in hi to validate every S6 key: persona placeholder "गाँव में क्या हो रहा है? बताओ…" (B6 — the current fallback is raw EN on the hi locale, 🔨 i18n batch; "post" is never a Hindi verb — लिखना framing), "Residents post here" → "भेल्दी के निवासी यहाँ लिखते हैं", Resident chip (निवासी), civic wrapper strip: status खुली, routed-to "ग्राम पंचायत, भेल्दी को भेजा गया" (no arrow glyph, D12 honesty) and 12 समर्थन (the Shikayat/Samarthan vocabulary is locale-native, B8/D13). Handles, numerals and brand "Nyburs" stay Latin. Layout, components and recency order identical to S6·A. S3 AMENDMENT 2026-06-11 (a)–(d) + (g) applied in hi (rung sublabels गाँव/प्रखंड/ज़िला/राज्य); the amber bullhorn opens the composer directly in Shikayat mode.
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.