release: v0.9.0-beta#84
Conversation
chore: back-merge release/v0.8.2-alpha → development
docs: v0.9.0-beta plan
… Round Phase 1 of the v0.9.0-beta plan (docs/v0.9-plan.md §6). Plumbing only — no components consume the new tokens yet; visual output is near-identical to v0.8.2-alpha. - Add Meadow palette to src/index.css @theme block as CSS custom properties (bg, surface, surface-alt, ink trio, border pair, accent trio, warn pair, 5 chip tokens incl. --chip-sea). - Add Fraunces (opsz 9..144, weights 400/500/600 + italic) and Inter (400/500/600/700) via Google Fonts in index.html, src/index.css, and public/version-history.html. Register --font-display / --font-sans. - Mirror tokens in src/lib/colors.ts as new `meadow` export; add `fontStacks` export. Legacy `colors` export kept untouched until later phases retire its consumers. - Retire Varela Round entirely: remove all @imports and any font-family references (src/index.css, index.html, src/App.tsx loading state, public/version-history.html). Per locked decision #2, Parchment / Midnight / Sakura are intentionally excluded — Meadow is the only theme for v0.9. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…fonts v0.9 Phase 1: tokens + fonts (Meadow + Fraunces/Inter)
Worktree-isolated sessions can't see untracked files at the host repo root. Move the three design curator handoffs into docs/ so future sessions (Phase 5+) can reference them. Update docs/v0.9-plan.md paths accordingly. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…doffs chore: commit v0.9 design handoffs to repo
- New Sidebar component (280px sticky) with brand, active town card, per-category nav with donated/total counts, footer (Export + Settings) - App shell CSS in index.css: .ac-app grid (280px 1fr), max-width 1440px, stacks above main below 980px - ACCanvas refactored to mount Sidebar + <main className="ac-main">; outer gradient/grid background removed in favor of --bg - Hemisphere toggle relocated to sidebar town card for ACNH (was in MuseumHeader); will move into TownManager in Phase 4 - Switch town stub: cycles between towns or opens CreateTownModal — full TownManager drawer ships in Phase 4 - Deleted: MuseumHeader, TabBar, TownSwitcher - CHANGELOG + CLAUDE.md updated Per docs/v0.9-plan.md Phase 2. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- package.json version → 0.9.0-beta (footer/UI version flows from here via vite define) - README.md: clarify v0.8.2-alpha is last stable, v0.9.0-beta in active dev - CLAUDE.md: update current-version line to reflect Phase 2 shipped - docs/v0.9-plan.md: mark Phase 1 (PR #63) and Phase 2 (PR #65) as shipped - README sea-creatures note updated (TabBar → sidebar nav) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.9 Phase 2: Sidebar + shell layout
About + Danger zone sections per locked decisions #3 and #7. No Appearance section (Meadow-only per #2). - SettingsPage: About (version, source, live storage summary, credits) and Danger zone (reset donations, reset everything) with native confirm() guards. Esc and close button navigate back to active town home. - SettingsRoute wrapper renders Sidebar + SettingsPage so the sidebar stays in place at /settings. - Store: resetActiveTownDonations() + resetAll() (also clears ac-curator-search-history from localStorage). - /settings route added in App.tsx; Sidebar Settings button no longer carries the Phase 2 "coming soon" tooltip. - Styles in index.css mirror docs/design-handoffs/v0.9.2_curator/ addons-styles.css with the Curator-codename strings dropped. Build, lint, and 59 unit tests pass.
v0.9 Phase 3: Settings page (About + Danger zone)
Replaces CreateTownModal, EditTownModal, and the Phase 2 sidebar
bridge stubs (window.prompt switcher, Edit/+New buttons, hemisphere
toggle) with a single right-side TownManager drawer mounted at the
App layout level. Drawer is a bottom sheet at <=720px.
Honors locked Decision 1: the inline edit form has no game <select>;
gameId is shown as a read-only badge and never appears in the patch
object passed to updateTown. Honors Decision 5 by removing playerName
from the Town type, store, CSV export, and tests.
Auto-opens in forceCreate mode when towns.length === 0, replacing
the previous CreateTownModal required={noTowns} pattern. Resolves
the v0.8.1 greyed-out-buttons stopgap because the drawer now mounts
above the router and is unaffected by overflow/z-index on category
tabs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ager v0.9 Phase 4: TownManager drawer + retire modal CRUD
…beta Add v0.9 plan baseline + verify repo health commands
…ager Feature/v09 phase 4 townmanager
Rebuilds the collectible row and inline expand panel to match the v0.9 Curator design (monogram glyph, meta line with separators, leaving/new pills, two-column expand with month grid + stats stack). Wires data-row-id and a highlightId pulse for the upcoming Phase 6/8 jump-to. Per-row donate toggle moves into the expand panel (matches the spec). MonthGrid re-skinned to .ac-monthgrid; category list wraps in .ac-list. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
A bare <span> with aria-label is ignored by screen readers. Adding role="img" lets the implicit name surface for assistive tech. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ItemExpandPanel already renders sea-creature time in its own 'active hours' stat. Returning it from itemNotes caused the same string to appear twice in the row. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…e expand panel - Add the missing .ac-list rule referenced by ACCanvas (single rounded surface; rows still divided by .ac-row border-bottom). - Add :focus-visible outline on .ac-row-main so keyboard users see focus. - Remove .ac-expand border-top — .ac-row already draws the seam, the pair was rendering as a 2px line. - When months are absent (fossils, art), collapse .ac-expand to a single column instead of leaving the side panel orphaned beside an empty 240px slot. - Add a minimal .ac-expand-section rule so the wrapper has a defined min-width inside the grid. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…prop Round 1 made itemNotes() return undefined for sea creatures, which broke DetailModal's notes block (it calls itemNotes(item) for the global-search detail view). Restore itemNotes' "give me the notes string for this item" contract — return time for sea creatures — and push the duplicate-render suppression into ItemExpandPanel where the duplicate actually exists (time is already rendered as the "active hours" stat). Also drop the dead onToggle prop from CollectibleRow and the GlobalSearchResults passthrough. Bea confirmed "click into modal is fine for now" — no inline donation toggle from global search. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.9 Phase 5: CollectibleRow + ItemExpandPanel restyle
Adds segmented ProgressMeter (4 or 5 segments by gameId), rebuilt HomeTab with hero stat + month strip + leaving-soon / just-arrived shelves + latest donations card, and useJumpToRow hook wiring shelf/recent cards into ACCanvas's scroll-to + pulse highlight effect. Honors Locked Decisions 4 (sea in ProgressMeter for ACNL/ACNH) and 10 (scrollIntoView + .ac-row-pulse on jump). No version bump. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat(home): v0.9 Phase 6 — rebuilt HomeTab + ProgressMeter
Replace the flat A–Z list per category with a sectioned page: Leaving this month / Available now / Out of season / Already donated. Empty groups hidden; donated items always land in Already donated. December→January wrap handled. Fossils/art (no months) collapse cleanly to Available now + Already donated. CategoryTab owns its own expandedId so only one row is open per tab and reacts to highlightId so jumps from Home shelves expand the row before ACCanvas's scroll-to fires. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat(v0.9): Phase 7 — CategoryTab sectioning
Replaces GlobalSearchBar + GlobalSearchResults + SearchHistoryPopover with a single GlobalSearchDropdown anchored under a Home-tab topbar search input. Four states: empty + intro hint, empty + recent searches, no-match, grouped results. Sea group gated to ACNL/ACNH. Art search matches `name` and `basedOn` (Decision 8). Keyboard nav (↑↓↵esc). History persists in `ac-curator-search-history` (max 8, deduped). Result selection fires onJump → setTab + setHighlightId so the row scroll-to + .ac-row-pulse animation triggers (Decision 10). Retires the `'search'` ViewId, the Search nav entry, and the `useSearch` hook. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- GlobalSearchDropdown now commits the user's typed query (not the selected item name) into recent searches. commitSearch already trims and rejects empty strings. - Removed duplicate @Keyframes ac-fade in src/index.css (was defined twice with identical bodies); kept the earlier definition. Addresses Copilot review comments on PR #75. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.9 Phase 8 — GlobalSearchDropdown
… rhythm chart Per-category card grid (3/4/5 cards gated by game data presence) above a 12-column "Yearly rhythm" availability chart with current-month accent border. Sea creatures included in the chart for ACNL/ACNH (Decision 4), hemisphere-aware via itemMonths(). Retires AnalyticsView and SectionCard. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v0.9 Phase 9: rebuild StatsTab with per-category cards + yearly rhythm chart
- public/data/acww/art.json: 20 paintings (Wikibooks-sourced) - public/data/accf/art.json: 23 paintings (Bea-curated list) - Schema matches acnl/art.json; basedOn strings reuse ACNL phrasing verbatim where the real-world reference matches. Closes #74
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
The art.json files were added in the prior commit but the loader's GAMES_WITH_ART set still excluded ACWW and ACCF, so getDataPaths returned null for art on those games and the sidebar's data.art.length === 0 gate hid the tab.
Phase 9 hardcoded a local GAMES_WITH_ART set in StatsTab that excluded ACWW/ACCF, so even after the categoryMeta fix the card grid still rendered only 3 cards on those games. Switch the art and sea_creatures gates to check data[cat].length > 0, matching the sidebar's philosophy. Chart cats list left alone — art has no monthly availability.
Bring repo documentation in sync with v0.9.0-beta as Phases 1–9 have shipped to `development`. No code changes — docs only. - CLAUDE.md: rewrite version banner, design system block, file tree, ACCanvas section, and roadmap to reflect Phases 1–9 (Sidebar, TownManager, SettingsPage/Route, CategoryTab/StatsTab, ProgressMeter, GlobalSearchDropdown, useJumpToRow, useUIStore, Meadow tokens + Fraunces/Inter); flag CategoryProgress as dead pending cleanup; note retired components (MuseumHeader, TabBar, TownSwitcher, useSearch, AnalyticsView, SectionCard, GlobalSearchBar/Results/HistoryPopover, CreateTownModal, EditTownModal, TownNameFields). - docs/v0.9-plan.md: mark Phases 3, 4, 5, 7, 8, 9 ✅ with PR refs; expand Phase 6 ✅ to call out Issue #71; mark Phase 10 ⏳ pending; update doc-level status header. - docs/architecture.md: rewrite as a thin pointer to the canonical `.claude/rules/architecture.md` to avoid drift. - .claude/rules/architecture.md: full rewrite for v0.9 — new shell, store actions (resetActiveTownDonations, resetAll), useUIStore, Decision 1 (game immutable), Decision 5 (no playerName), highlight wiring (Decision 10), Phase 8 search routing. - .claude/rules/dev-process.md: fix stale dev preview URL. - README.md: update feature list to describe sidebar, TownManager, CategoryTab sectioning, GlobalSearchDropdown, StatsTab, Settings; bump version reference text. - docs/decisions.md: add a 2026-05-03 pointer entry directing readers to docs/v0.9-plan.md § 4 for v0.9 locked decisions. Note: public/version-history.html dev-preview link is current; flagged in PR but not modified. Verified: npm run build (clean), npm test (63 passed).
feat(data): ACWW + ACCF art data (closes #74)
chore(docs): v0.9 doc sweep through Phase 9
CSS-only fixes in src/index.css Phase 10 block — no component changes. - Touch targets >=44px for drawer close, settings close, town row edit, TownManager actions, GlobalSearch history rows, donate button, chevron. - iOS zoom prevention: search input rendered at 16px on stacked layouts. - Hero/category title overflow: word-break + further font shrink at <=480px. - Recent activity row drops category label at <=720px so name+time fit. - Topbar wraps at <=480px; sidebar foot links get full tap height when stacked. - GlobalSearchDropdown kbd-hint footer hidden at <=720px (no hardware keyboard). Verified: build clean, 63 tests pass, lint clean. All Phase 10 checklist items checked in docs/v0.9-plan.md. CLAUDE.md updated with 980/720/700/480 breakpoint hierarchy. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat(phase-10): mobile responsive verification
Closes #81 Art rows now expand inline like fish/bugs/fossils/sea creatures (same .ac-row → .ac-expand flow) instead of opening the DetailModal bottom-sheet. Fixes the v0.9 release blocker — Art was the last category with a different interaction model post-Phase 5. ItemExpandPanel: render `basedOn` as primary stat for art (italic in side stack) and a Crazy Redd authentication note keyed off `hasFake` (warn = counterfeit-possible; ok = always-genuine). Note is hidden when `hasFake` is undefined, so ACGCN/ACWW/ACCF/ACNL art (which lacks the field) just shows basedOn + donate button. ArtPiece type: add optional `hasFake?: boolean` (ACNH-only). DetailModal retired — file deleted. It was the only remaining consumer; global search uses onJump (highlight + scroll) and no other tab depended on it. CategoryTab drops the `onItemSelect` prop and `category === 'art'` special-cases. ACCanvas drops the `selected` state. All affected docs updated (CLAUDE.md retired- component note, CHANGELOG entry under [Unreleased] v0.9.0-beta). CSS: `.ac-art-fake-note` (warn/ok variants reusing existing --warn / --accent tokens) and `.ac-stat-art` italic rendering. Verified: npm run build, npm test (63/63), npm run lint — all green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sweep of active living docs to reflect that DetailModal was deleted in #81 and Art now uses the inline ItemExpandPanel. - README.md: collapse the separate "bottom-sheet detail view" bullet into the inline-expand bullet; mention basedOn + Crazy Redd note. - .claude/rules/architecture.md: ACCanvas, CategoryTab, and modals/ entries all reframed — DetailModal listed as retired. Left untouched (history / out of scope): - CHANGELOG Phase 7 Decisions entry ("Art keeps its bottom-sheet DetailModal") — describes a v0.9 Phase 7 decision that was reversed in #81. As Phase 7 history it's still accurate. Reported to Bea. - docs/v0.7-audit.md, docs/v0.7-architecture-proposal.md — historical v0.7 docs. - docs/design-handoffs/v0.9_curator/README.md — design handoff snapshot. Reported to Bea. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix(#81): convert Art tab to inline ItemExpandPanel
- CHANGELOG: roll [Unreleased] section into [v0.9.0-beta] - 2026-05-04; add fresh empty [Unreleased] above - App.tsx (#60): hide branch suffix in version footer when branch starts with `release/` - CLAUDE.md, README.md: mark v0.9.0-beta as shipped - docs/v0.9-plan.md: status header to shipped - public/version-history.html: add v0.9.0-beta entry to timeline, velocity table, and "currently building" → v1.0
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Phase 1 complete — release branch staged, awaiting green light for Phase 2. Files touched on
Verified locally: Phase 2 (do not run without explicit go-ahead):
|
|
Merged |
There was a problem hiding this comment.
Pull request overview
Release PR for v0.9.0-beta (“Curator” UI revamp), consolidating the redesigned Meadow UI shell, new navigation/search/settings surfaces, town-management changes, stats redesign, and supporting data/docs updates for the first public beta.
Changes:
- Introduces the v0.9 app shell (Sidebar + TownManager), new Settings route, revamped Home/Category/Stats tabs, and new progress + search utilities.
- Updates the persisted store model (deprecates
playerName, adds reset actions, addsTownPatchandGAME_LIST), and aligns CSV export + view routing with removed Search tab. - Ships ACWW/ACCF art data and refreshes documentation/design-handoff assets for v0.9.
Reviewed changes
Copilot reviewed 85 out of 86 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/lib/viewTypes.ts | Removes 'search' from ViewId to reflect Search tab retirement. |
| src/lib/utils.ts | Simplifies itemNotes signature; sea creature notes now type-guard driven. |
| src/lib/uiStore.ts | Adds non-persisted Zustand UI store for TownManager open/force-create state. |
| src/lib/types.ts | Adds GAME_LIST; extends ArtPiece with optional hasFake. |
| src/lib/store.ts | Deprecates playerName, adds TownPatch, reset actions, and updates town create/update APIs. |
| src/lib/store.test.ts | Updates tests to match new createTown signature and removed playerName. |
| src/lib/csvExport.ts | Removes playerName from CSV export header and API. |
| src/lib/colors.ts | Adds Meadow token mirror and font stacks for JS-literal usage. |
| src/lib/categoryMeta.ts | Expands GAMES_WITH_ART to include ACWW/ACCF. |
| src/hooks/useSearch.ts | Removes retired global-search hook (replaced by dropdown). |
| src/hooks/useJumpToRow.ts | Adds navigation + highlight helper for scroll-to-row behavior. |
| src/components/views/SectionCard.tsx | Removed (retired by Stats redesign). |
| src/components/shared/TownNameFields.tsx | Removed (no longer used after TownManager changes). |
| src/components/shared/MonthGrid.tsx | Restyles MonthGrid and adds optional current month highlight support. |
| src/components/search/SearchHistoryPopover.tsx | Removed (search UI replaced). |
| src/components/search/GlobalSearchResults.tsx | Removed (search UI replaced). |
| src/components/search/GlobalSearchBar.tsx | Removed (search UI replaced). |
| src/components/progressMeterUtils.ts | Adds segmentsForGame helper for 4 vs 5 segment meters. |
| src/components/modals/EditTownModal.tsx | Removed (retired by TownManager drawer). |
| src/components/modals/DetailModal.tsx | Removed (retired; art now inline-expand). |
| src/components/modals/CreateTownModal.tsx | Removed (retired by TownManager drawer). |
| src/components/TownSwitcher.tsx | Removed (retired by Sidebar + TownManager). |
| src/components/TabBar.tsx | Removed (retired by Sidebar navigation). |
| src/components/StatsTab.tsx | Adds redesigned Stats tab with per-category cards + yearly rhythm chart. |
| src/components/Sidebar.tsx | Adds persistent Sidebar shell with nav counts + export/settings footer. |
| src/components/SettingsRoute.tsx | Adds /settings route wrapper keeping Sidebar mounted. |
| src/components/SettingsPage.tsx | Adds Settings UI (About + Danger zone) with reset actions. |
| src/components/ProgressMeter.tsx | Adds segmented ProgressMeter UI using Meadow chip tokens. |
| src/components/ProgressMeter.test.ts | Unit-tests segmentsForGame. |
| src/components/MuseumHeader.tsx | Removed (retired by Sidebar shell). |
| src/components/ItemExpandPanel.tsx | Updates expand panel layout/stats; adds art basedOn + fake-note support. |
| src/components/CollectibleRow.tsx | Restyles rows (glyph/meta/pills/chevron) and supports highlight pulse. |
| src/components/CategoryTab.tsx | Adds sectioned category lists and inline expand behavior with highlight integration. |
| src/App.tsx | Adds Settings route, mounts TownManager globally, forces create-mode when no towns, and updates version footer suffix rules. |
| public/version-history.html | Updates version-history static page to v0.9.0-beta info + new fonts. |
| public/data/acww/art.json | Adds ACWW art dataset. |
| public/data/accf/art.json | Adds ACCF art dataset. |
| package.json | Bumps version to 0.9.0-beta. |
| package-lock.json | Aligns lockfile package version to 0.9.0-beta. |
| index.html | Switches app font loadout to Fraunces + Inter. |
| docs/design-handoffs/v0.9_curator/theme.js | Adds v0.9 handoff theme tokens (design artifact). |
| docs/design-handoffs/v0.9_curator/tabs.jsx | Adds v0.9 handoff tab mock implementation (design artifact). |
| docs/design-handoffs/v0.9_curator/shell.jsx | Adds v0.9 handoff shell mock (design artifact). |
| docs/design-handoffs/v0.9_curator/components.jsx | Adds v0.9 handoff component mocks (design artifact). |
| docs/design-handoffs/v0.9_curator/Curator.html | Adds v0.9 handoff runnable HTML (design artifact). |
| docs/design-handoffs/v0.9.2_curator/theme.js | Adds v0.9.2 handoff theme tokens (design artifact). |
| docs/design-handoffs/v0.9.2_curator/shell.jsx | Adds v0.9.2 handoff shell mock (design artifact). |
| docs/design-handoffs/v0.9.2_curator/components.jsx | Adds v0.9.2 handoff component mocks (design artifact). |
| docs/design-handoffs/v0.9.2_curator/README.md | Adds v0.9.2 handoff delta notes (design artifact). |
| docs/design-handoffs/v0.9.1_curator/theme.js | Adds v0.9.1 handoff theme tokens (design artifact). |
| docs/design-handoffs/v0.9.1_curator/shell.jsx | Adds v0.9.1 handoff shell mock (design artifact). |
| docs/design-handoffs/v0.9.1_curator/components.jsx | Adds v0.9.1 handoff component mocks (design artifact). |
| docs/design-handoffs/v0.9.1_curator/README.md | Adds v0.9.1 handoff delta notes (design artifact). |
| docs/design-handoffs/v0.9.1_curator/Curator.html | Adds v0.9.1 handoff runnable HTML (design artifact). |
| docs/design-handoffs/README.md | Documents the three v0.9 handoff passes and which is current. |
| docs/decisions.md | Adds pointer entry directing v0.9 locked decisions to the plan doc. |
| docs/architecture.md | Updates architecture doc to v0.9 and points to canonical .claude rules. |
| README.md | Updates repo README to reflect v0.9 UI/feature set and current version. |
| .claude/rules/dev-process.md | Updates dev preview URL used in process checklist. |
| .claude/rules/architecture.md | Updates canonical architecture reference for v0.9 structure and decisions. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| chipFish: "oklch(0.62 0.08 230)", | ||
| chipBug: "oklch(0.6 0.1 130)", | ||
| chipFossil: "oklch(0.55 0.06 60)", | ||
| chipArt: "oklch(0.58 0.08 320)", |
| <div className="ac-glyph" style={{ | ||
| background: donated ? tint : "transparent", | ||
| borderColor: tint, | ||
| color: donated ? "var(--surface)" : tint, backgroundColor: "rgb(98, 174, 118)" | ||
| }}> |
v0.9.0-beta — Curator UI Revamp
This release is a top-to-bottom UI revamp under the internal "Curator" codename — Meadow design language (Fraunces + Inter, moss-green accent), retired wood/parchment palette, persistent sidebar navigation, unified town manager, sectioned category lists, redesigned home and stats, and a unified global search dropdown — plus mobile responsive verification.
What's in v0.9
MuseumHeader+TabBar+TownSwitcher. Per-category donation counts, sea nav gated for ACNL/ACNH.playerNamedeprecated. Resolves the v0.8.1 greyed-out modal stopgap./settings) — About + Danger zone (reset active town, reset everything).ac-curator-search-history, max 8),basedOnart matching preserved (Decision 8).DetailModalbottom-sheet to inlineItemExpandPanel.DetailModalretired.Phase PR list
Supporting PRs: #78 (ACWW + ACCF art data), #79 (doc sweep), #83 (Art tab inline / DetailModal retirement).
Issues closed by v0.9
release/branches (fixed in this PR's release-branch commit)Open follow-ups (v0.9.x or v1.0)
Test plan
npm run build— passes (TypeScript + Vite production build)npm test— 63/63 passingnpm run lint— cleanPhase 2 (post-merge, gated on Bea's explicit go-ahead)
After this PR is approved + merged into
main:v0.9.0-betafrommaingh release create v0.9.0-betawith these notesmainback intodevelopmentto keep branches in syncDo not merge this PR without Bea's explicit "ship to production" green light.