Phase 48 · Capture board · status: ✅ All 18 plans shipped — pending iPad UAT · 2026-05-28

Deep Audit + Demo Data Sweep

Backlog clearance phase: cross-city data seeding (10 cities × 15 content types), Phase 47 spillover (builder claim, saved developments, non-NYC heatmap), pre-pitch hygiene sweeps (gradient, emoji-to-Lucide, a11y, page-bg, icons), and a full self-testing pass. Wave 0 produced the audit artifacts that gate all downstream waves.

18 plans · 6 waves · Wave 0 complete 2026-05-28 · ~30 hygiene items triaged (14 DONE, 12 OPEN, 2 PARTIAL)
Status glance
18 / 18
Plans shipped (10 waves)
0
Build errors (tsc + npm build)
4
iPad UAT items pending
1
Minor gap deferred (Vesta hotspot 1/2)
✅ Phase 48 shipped — your next step

All 18 plans executed end-to-end. Build is clean. Four items need your iPad UAT before Phase 48 is fully signed off.

→ Open the UAT checklist
Quick links
Phase scope — 18 plans across 6 waves
Plan Wave Status Objective
00 Wave 0 ✅ Shipped 3 audit artifacts written: 48-GAP-MATRIX (10 cities × 15 content types, 65 FILL cells), 48-HYGIENE-TRIAGE (28 items: 14 DONE, 12 OPEN, 2 PARTIAL), 48-WAVE0-COUNTS (8 baseline greps). Capture board built + linked from index.
01 Wave 1 ✅ Shipped +3 EV businesses (Third Rail, Mast Books, Mamoun's), +2 EV groups, +4 singles (2 GP + 2 EV), +6 vault guides (3 GP + 3 EV). Stories already at target. Building reviews deferred (no parent buildings seeded yet).
02 Wave 1 ✅ Shipped Vesta saturation: groups 0→2, families 0→2, businesses 3→6, service providers 0→3, building reviews 0→3 (Olive Quarter Block 7 + 1 mgr response). Vault lock preserved; war-recovery tone preserved.
03 Wave 2 ✅ Shipped LA: 30 records across 12 files — 5 listings (Echo Park, Silver Lake, Highland Park, Venice, Los Feliz), 2 businesses, 2 hotspots, 2 groups, 2 families, 2 singles, 3 service providers, 1 building + 3 reviews, 3 developments, 5 permits, 1 builder. Zero Hollywood caricature.
04 Wave 2 ✅ Shipped Tokyo: 35 records — Shibuya, Shinjuku, Setagaya, Meguro, Asakusa wards. 5 listings, 2 groups, 2 families, 5 singles, 3 service providers, 1 building + reviews, 6 developments, 8 permits, 2 builders. Modern resident/expat framing, zero "polite Japan" cliché.
05 Wave 2 ✅ Shipped Paris: 41 records — arrondissements 3e/10e/11e/18e/20e. Devs/permits/builders triad seeded (was 0/0/0) — unblocks ParisHeatmapLayer liveness. Real syndic + AGM + cycling framing, no "ooh la la".
06 Wave 2 ✅ Shipped Austin: 11 posts (pre-existing) + 25 new — East Austin, SoCo, Hyde Park, Mueller, Zilker. 5 listings, 5 businesses, 3 hotspots, 2 groups, 2 families, 3 singles, 3 providers, 1 building + 3 reviews, 3 devs, 5 permits, 2 builders. No rodeo/cowboy/10-gallon content.
07 Wave 2 ✅ Shipped Buenos Aires: 27+ records — Palermo, Villa Crespo, Recoleta, San Telmo, Belgrano. GCBA permit format. 2 BA posts, 5 listings, 2 businesses, 2 hotspots (Subte B delay + market), 2 groups, 2 families, 3 singles, 3 providers, 1 building + 3 reviews, 3 devs, 5 permits, 2 builders. Zero tango/empanada caricature.
08 Wave 2 ✅ Shipped Cape Town: 35 records (posts already at 10) — Woodstock, Sea Point, Observatory, Salt River, Bo-Kaap. ZAR prices. 5 listings, 5 businesses, 3 hotspots (Eskom stage 3 + 5K run), 2 groups, 2 families, 3 singles, 3 providers, 1 building + 3 reviews, 3 devs, 5 permits, 2 builders. Mixed Afrikaans/Xhosa surnames.
09 Wave 3 ✅ Shipped New MediaWithOverlay component (Play icon + duration badge). mediaType? + mediaDuration? fields added to Post/Listing/Business/Story types. ~15% sprinkled with video flag: 11 posts (all 6 non-NYC cities), 3 listings, 2 businesses, 2 stories. PostCard rewired.
10 Wave 3 ✅ Shipped Full builder claim flow shipped: claimedBuilder.ts CRUD + 7 Vitest tests, DemoBuilderContext (mutex with agent context), 5 new components (Claim Drawer, Dashboard, Header, ActiveDevelopmentsList, PostUpdateCTA). Verified badge on 2 builders. updates[] seeded on 4 developments.
11 Wave 3 ✅ Shipped savedDevelopments.ts + 8 Vitest tests (corruption-safe, idempotent, city-independent). Bookmark button in DevelopmentDrawer hero (44×44 tap-target, aria-pressed). "Saved developments" warm gradient section in Profile Me tab with empty state.
12 Wave 3 ✅ Shipped 3 static polygon JSONs: LA (32 neighborhoods), Tokyo (23 wards), Paris (20 arrondissements). Generalized useCityPolygons hook (two-tier cache, StrictMode-safe). 3 HeatmapLayers + 3 Sheets, CityPillModal "Browse all LA/Tokyo/Paris" CTAs. 11 unit tests. Per D-25: static-only, no live API.
13 Wave 4 ✅ Shipped WelcomeLanding's AVATAR_GRADIENTS array (3 variants) collapsed to single AVATAR_GRADIENT = 'bg-gradient-brand'. All onboarding avatars now use unified Variant C. Zero saturated from-X-500 chains remain in src/.
14 Wave 4 ✅ Shipped 10 component files swept: MorningBriefingDrawer (Sun/CloudSun/Moon), CompareTable (4 emoji), ProactiveNudges, EventDetailDrawer, CalendarDrawer, WelcomeKitView (Home/Users/BarChart2), MarkerPopup (★→Star), NeighborhoodFavorites, TeamMemberProfile + AgentOverview (🏆→Trophy). All sized to canonical tokens (14/16/18/48). Bonus fix: 11 Vesta FamilyProfile entries relocated from FAMILY_MEMBER_USERS to MOCK_FAMILIES.
15 Wave 4 ✅ Shipped ProfileContainer page-bg bg-gray-50 → warm from-violet-50 to-pink-50. FamilyProfileDrawer hero avatars: removed override classes, applied canonical size="lg" / size="md". 12 oversized icons reduced to canonical tokens. 2 VaultContainer list rows rounded-2xlrounded-xl. WC Hub button deferred (D-53 zinc exempt).
16 Wave 4 ✅ Shipped Family filter chip wired (tags?: string[] on BasePost, branch in useFeedFilter). +2 theater/quiet posts (WAC opening, Berry St noise study). All console.log removed (10 calls, 3 load-bearing warn/error kept). Sub-12px sweep 24→6 instances. ProfileContainer stat tiles → text-base font-bold (W6.50 hybrid lock). New tap-target-audit.mjs script. D-53 exemption added to DESIGN_STANDARDS.
17 Wave 5 ✅ Shipped Cross-city-sweep script extended (writes CROSS-CITY-FLAGS.md). New demo-path-walk.mjs (W'burg → LA → Tokyo → Vesta, all 4 tabs). 5 emergent bugs fixed inline (4 nurturing/persona script gaps + 1 stale Marcus Escape assertion). All passes green; zero load-bearing console errors. npm run build + tsc + vitest all 0.
Execution incidents — none lost work, all handled inline
2× stale worktree
Plans 48-13 + 48-16 had Agent worktrees branch off a Phase-29-era commit instead of current HEAD. Detected via diff inspection. Discarded the worktree's phantom-file commits, re-executed inline. Switched all later plans to sequential mode (no worktree) for reliability.
1× session limit
Plan 48-07 (Buenos Aires) — executor hit limit after committing all 3 task commits but BEFORE writing SUMMARY. Orchestrator wrote SUMMARY post-hoc from commit-message detail. No information lost.
1× commit hygiene
Plan 48-08 (Cape Town) — executor folded Cape Town Task-1 data changes into an unrelated fix(learn) commit (e0f2eae). Code shipped correctly but the commit message is misleading. Will appear odd in archeology but doesn't affect behavior.
180 type errors
Discovered between Wave 8 plan 09 and 10. Wave 2-7 city-seeding plans verified with tsc --noEmit which silently passes — the real build (tsc -p tsconfig.app.json) caught 47 unescaped apostrophes (residents' lounge, don't, San Telmo's main), invalid enums (type:'contractor', category:'shopping', status:'active'), missing BlockScoreData fields, and FamilyProfile entries placed in wrong array. Cleared 180→0 by a focused fixer agent before continuing.
Lesson
Every plan now requires npx tsc -p tsconfig.app.json not tsc --noEmit. The two run different configs. The root one passes too easily.
One minor gap (non-blocking, deferred)

Vesta has 1 hotspot, gap matrix targeted 2. Plan 02 (Vesta saturation) didn't cover mockHotspots.ts and no subsequent plan picked it up. 5-minute data addition whenever you want to clean it up. The existing hotspot is functional for demo purposes.

Decisions locked (Wave 0)
Listings scope

YES — seed listings for all 6 non-NYC non-Vesta cities (LA, Tokyo, Paris, Austin, Buenos Aires, Cape Town). Target: ~5 listings per city = ~30 new records. Vesta listings SKIP (war-affected framing makes traditional real estate inappropriate). Per TODOS.md "all content types × all cities."

Vault scope (Phase 41 NYC-pilot lock)

Vault is NYC-only by design. Non-NYC cities show "vote your city in" empty state intentionally. Do NOT seed mockVaultGuides.ts for non-NYC cities. This is Phase 41 D locked, no re-litigation.

Heatmap-snapshots (D-09 pattern)

NO static city liveness JSON files. Liveness is DERIVED at call time (D-09 pattern from liveness.ts). cityLiveness.ts mirrors liveness.ts with city-key filter. Static polygon JSON (LA/Tokyo/Paris) ships in public/ for polygon shapes, NOT for score snapshots.

Building reviews scope

OUT OF SCOPE Phase 48. Building reviews are buildingId-keyed — seeding non-NYC building reviews requires first adding buildings to those cities. Mark all non-W'burg city cells as INTENTIONALLY-EMPTY. Tracked in gap matrix.

Open questions (2 items need founder input)
OQ-1 · W6.50: text-lg in ProfileContainer — rewrite or exemption?
ProfileContainer.tsx has 6 uses of text-lg font-extrabold for stat numbers (name, posts, comments, saved, contributions). Option A: rewrite to text-base font-bold (smaller, fully compliant). Option B: add "stats line" exemption to DESIGN_STANDARDS — these are identity-anchoring hero-level numbers (same as Block Score, which is already exempt). Recommendation: Option B. Founder decision needed before Wave 4 plan 16 runs.
OQ-2 · Per-city listings depth — 5 per city or more?
Gap matrix defaults to ~5 listings per non-NYC non-Vesta city (30 total). If founder wants more depth (e.g., 8-10 per city to match NYC density), Wave 2 executors should be told the target. Default is 5 — enough to demonstrate the feature without bloating the file.
Highest-leverage items to action first
1. Wave 0 audit artifacts unlock everything
Gap matrix + hygiene triage + baseline counts are now committed. All downstream waves can run. 14 hygiene items confirmed already DONE — Wave 4 execution will be faster than TODOS.md estimated.
2. Wave 2 cross-city seeding is the highest-volume work
6 cities × 8+ content types = most of the seeding work. Plans 03-08 are all independent of each other — can run in parallel. Biggest gap: 0 listings for 6 cities, 0 groups for 7 cities, 0 families for 9 cities.
3. Wave 3 spillover: builder claim is the richest new feature
Builder-side accounts (plan 10) adds demo depth. Saved developments (plan 11) is a 1-hour copy of savedNabes. Non-NYC heatmap (plan 12) is the most complex but has clear donor patterns.
4. W6.50 founder decision (OQ-1) gates Wave 4 plan 16
All other Wave 4 plans can run without the founder's input. Plan 16 (UI bugs + a11y) includes the text-lg decision — flag it before that plan runs, or default to Option B (exemption) if no response.
Outstanding + parked (Phase 48 scope boundaries)
In Phase 48 scope (queued):
  • Cross-city seeding (10 cities × 15 content types — gap matrix has full plan)
  • Builder claim + dashboard (Wave 3, plan 10)
  • Saved developments (Wave 3, plan 11)
  • Non-NYC heatmap shading LA + Tokyo + Paris (Wave 3, plan 12)
  • All Wave 4 hygiene sweeps (12 OPEN items from triage)
  • Self-testing pass with Playwright (Wave 5, plan 17)
Phase 49+ (parked per TODOS.md):
  • Push notifications for development milestones
  • Comment / review system on developments
  • "Time machine" historical view
  • Email digest preview screen
  • Standalone permit-only feed
  • Real-API integration (NYC DOB, LA LADBS, Paris opendata)
  • Phase 47 iPad UAT walk-through (Outstanding UAT log)
iPad bookmarks (all URLs, tap-ready)