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 E18 sort row (Open first default · Most supported · Newest) + filter chips incl. Mine (non-negotiable for day-30) and Long pending 90d+ · E21 "Report a problem" = bullhorn glyph (report_outlined reads as "reporting yourself"); routed-to icon = government glyph, never the account_balance bank · the card is the REAL post card (DECISIONS #11, refs/real-place-feed-post.png) plus an overlay: E19 compact 3-dot track + state label (🚫 full-width bar) · C11 staleness ALWAYS on card ("Filed — 12 days") · A1/A2 Tier-B water line "Filed with PHED Sub-division, Saran" — per-category REAL owners, MLA/MP demoted to CC · D15 raised-hand icon, count+word together ("47 Samarthan", never a bare number) · D16 views count HIDDEN, standard like-label suppressed (support IS the like) · E20 share = NATIVE sheet (WhatsApp forward is THE rural escalation; 🔨 today onShare opens post detail — bug) · E22 Today-strip "3 open" excludes Duplicate+Rejected, tap pre-applies the open filter. App-only 🔨: Flutter PlaceIssueModel does NOT parse statusHistory (P0 model field); {placeId,status,createdAt} + {placeId,reporterId} indexes; openIssueCount in the landing payload (≤10-min lag); D17 support=likes — most-supported sort is client-side over the ≤50 batch v1. Header refresh per S3 AMENDMENT 2026-06-11 (a)–(d) — the Issues tab badge mirrors the strip's open count (3, E22 exclusions apply).
A1 ⚠️ the credibility ruling: Tier A claimed official → "Routed to {name}, {role}" + claimed badge · Tier B seeded office → "Filed with {office}", no person · Tier C constituency fallback → "Filed publicly · MLA notified" — NEVER "routed to MLA" ("routed" implies action, "notified" is honest) · Tier D no mapping → "Filed publicly in {place}" + pressure copy. A2 ⚠️ per-category REAL owners (streetlight/sanitation → Gram Panchayat, water → PHED sub-division, road → PWD/PMGSY, scheme → BDO, health → PHC MO); MLA/MP demoted to CC everywhere · A3 ⚠️ electricity → DISCOM (NBPDCL/SBPDCL), MLA/MP removed from the chain entirely (🔨 routing-service special-case) · A4 named office TITLE, never a bare level word ("a level word means nothing to me"); 🔨 authorityRef.label frozen at submit — re-hydrate via officialId, rides the election runbook. Below: C14 the 4 mandatory chip colour states — grey / amber / green / red-amber stale — with C11 factual stale copy ("No update in 30 days", 🚫 "Ignored" — screenshot-inflammatory).
B5 ⚠️ proof gate: IN REVIEW → RESOLVED requires a ≥20-char resolution note + ≥1 NEW photo from the resolver, else the card renders "Marked resolved — pending confirmation", not the green chip (every Indian grievance portal is gamed by boilerplate "Disposed") · B9 the RESOLVED card names WHO closed + elapsed ("Resolved by Panchayat Sachiv · 38 days after filing"); 🚫 confetti/celebration — celebrating an unverified closure is an uninstall trigger · B6 ⚠️ 48h reporter-confirm push → sheet "Did this get fixed?" Yes/No; No → auto-revert IN REVIEW + public "Disputed — under review"; silent 7d → stays RESOLVED with "Resolution unconfirmed" sub-label · B8 steward closure = a distinct "Community-verified resolved" state (different trust level than official green) · B10 reporter push on every transition, none on self-Duplicate. App-only 🔨: proofImageUrl on IssueStatusEntry (sparse, backward-compatible); new SmartNotif type; boolean verifiedByReporter v1 (ReporterConfirmed enum ⏳ Phase 2).
C11 auto-label "No update in 30 days — still on record" — factual, 🚫 "Ignored" (screenshot-inflammatory); staleness derives from statusHistory.last.at (🔨 the P0 Flutter parsing gap rides S7·A) · C14 the red-amber 4th chip state, distinct from amber · C12 the day-30 push opens a CHOICE and promises nothing: (a) Re-share to feed — flags the issue stale for more neighbour support (b) "Widen visibility" — tags it one level up (block); the reporter owns the act, 🚫 AUTO-escalation (the mukhiya-asks-why scenario + governance over-promise) · C13 bump 1/30d renders as a thread comment, not a transition (⏳ after sort infra) · B7 REJECTED: note MANDATORY, reason inline on the card, reporter push + "Dispute this" → comment thread; 🚫 silent rejection. Honest empty state per E21 ("No issues reported yet — be the first to flag a problem"; 🚫 green-checkmark "everything is perfect").
F23 ⚠️ owner product-policy call: "File without your name" toggle in issue mode — the card byline becomes "Filed by a Bheldi resident"; identity stays visible to stewards/admin and the toggle copy SAYS so (never claim official-only visibility unless true). Category-B issues — the ones naming contractors or the mukhiya — are the most important and go unfiled under real names · F25 soft prompt "describe the problem, not the person" — nudges, never blocks · G26 ⚠️ admin-controlled per-state MCC flag: routing lines suppress person names → "Routed to Garkha constituency office"; filing stays OPEN; candidate/party keywords soft-block in titles; 50+-support issues drop from the Today-strip count (still visible in tab); steward patrol briefing banner. Manual activation v1, rides the election runbook (#18). App-only 🔨: F24 EXIF strip on issue photos = table stakes (verify pipeline; face/plate soft-blur ⏳ Phase 2); H27 new-account <7d → steward review queue, day-caps 10 verified / 3 unverified.
Owner 2026-06-14: the issue detail reuses the post detail (Law #2 — an issue is a real post with a civic wrapper; the comments thread comes free) with a civic status-timeline header on top — the reporter's #1 return-job ("what happened to my complaint") pays off here. The header is the full journey: Filed → Acknowledged → In review → Resolved, each with a date + who, the routing line, and staleness. Below the post: the J31 support button in its tapped "You're in" state. Owner ruling — reporter self-resolve: because the fix often happens informally (neighbour, local fixer, no official), the reporter can mark their own issue resolved (lightweight note + photo) — shown as a distinct "Resolved · by reporter" trust level (below official-green and steward "community-verified"), and neighbours can still dispute. The updates thread folds status transitions, neighbour comments, the day-30 bump (C13) and steward notes into one timeline. App-only 🔨: status-timeline header = parse statusHistory (the P0 model gap from S7·A); self-resolve = reporter-scoped status write + verifiedByReporter; "Resolved by reporter" needs a closedBy role on the status entry.
DECISIONS #7/#8: ONE locale per screen — the S7·A tab rendered fully in hi as the translation check; every string is an i18n key, copy idiom-free. Vocabulary: tab = "शिकायतें" (Shikayat) · support = "समर्थन" (Samarthan — count+word together per D15, raised hand) · statuses = दर्ज / जाँच में / हल हो गई · staleness = "दर्ज — 12 दिन" (C11) · Tier-B route "PHED उप-प्रमंडल, सारण में दर्ज" + Tier-A "रामजी प्रसाद, मुखिया को भेजी गई" + claimed badge (A1/A2) · D15 first-tap toast "आपका समर्थन दर्ज हो गया।" shown live. Devanagari metrics follow the established .dev pattern (lighter weights). Seva naming rides DECISIONS #10 — "karma" is never rendered in any locale. Header refresh per S3 AMENDMENT 2026-06-11 (a)–(d) in hi — rung sublabels गाँव/प्रखंड/ज़िला/राज्य, tab badges on फ़ीड/शिकायतें.
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.