2. What’s New in v2

Levi’s Buy Plan Platform · single home for all Sprint 13 changes
v2 · Sprint 13
Jun 27 – Jul 4, 2026

v2 delivered 10 workstreams (≈19.3K source lines added, ≈5.4K removed). Two are structural — marked MAJOR CHANGE below — and the rest are new features, enhancements, and fixes.

SectionWhat changedScaleDelivered
2.1 Data modelPlanning hierarchy went from 3 to 4 levels; Width became the editable lever165 files · +5.4K/−2.1KJun 29–30
2.2 UI refreshNew skin from a single design-token system — color, chrome, cell shapes, hover; focused columns51 files · +3.5K/−1.9KJun 27–29
2.3 New featuresUser management · admin engagement dashboard · per-view search73 files · +5.5KJun 30
2.4 EnhancementsDistribution % normalization · reset to AI · six smaller improvements40+ files · +3.9KJun 29–30
2.5 Minor fixes8 fixes (2 high / 3 medium / 3 low)8 fixesJun 27–Jul 4

2.1 Data Model Change: 3-Level to 4-Level Hierarchy MAJOR CHANGE

165 files · 5 layers · 4 DB tables · 4 API changes · all 4 planning views
BE-T01–T08 SPEC-14 FE-T12 / BE-T08 delivered Jun 29–30, 2026 · verified through UAT Jul 2–4

A new Platform tier was inserted between Brick and Fit, changing the planning hierarchy from three levels to four. With it, Width was re-established as the value planners edit directly and Depth is now calculated (Depth = Sell-In ÷ Width), with the model extended across all four levels.

v1 — 3 levels
GenCatcategory summary
Brickeditable planning level
Fit"Brick Fit" detail rows
v2 — 4 levels
GenCatnow free-form (hardcoded MB/MT/WB/WT list removed)
Brickeditable in Brick View
Platform — NEWnew "Platform View" tab between Brick and Fit
Fitrenamed from "Brick Fit"

⇅  Width edits recalculate in both directions from whichever level is edited — down to descendants proportionally (by ratio) and up to parents as the sum of child widths. Sell-In cascades down only (parent Sell-In × child Distribution %); Depth is derived locally at every level.

User impact

REQUIRED BEFORE GO-LIVE

The schema change ships through the tenant schema template, not a versioned migration. New environments provision correctly with no extra steps — but existing tenant databases must run the two backfill scripts once (exports table; user columns) before using this release. The scripts are idempotent — safe to run more than once. This action also belongs on the go-live checklist in the Operating v2 section.

Why this was a major change

A hierarchy level is not a feature added at the side — it changes the shape of the planning row itself, and every layer of the system consumes that row. Nothing between the database and the exported workbook was untouched:

ALL 7 LAYERS TOUCHED
Databaseplatform column in 4 tables · row identity widened to a 6-part key · indexes & level constraint extended
Data access & DTOsevery repository query and transfer object re-shaped for the 4-level row (BE: 111 files)
Calculation enginebi-directional Width engine across all 4 levels — edits cascade down by ratio and roll up as sums; Depth derived at each level (SPEC-14)
REST API3 new endpoint groups · 1 breaking response change (fit_rowsplatform_rows)
Frontend statestore slices, selectors, and drill-down state re-built around the extra level
Planning UI4th tab “Platform View” · 4-level drill-down · editable Width column in every view
Excel export5th worksheet for Platform · Depth on every sheet · re-mapped headers
165
files changed (BE 111 / FE 54)
+5.4K / −2.1K
source lines · 28% of sprint*
4
DB tables altered
160
source files now reference the new level
Scope details — schema & API

How a planning row's identity changed

In v1, a planning row in som_inputs was identified by store + level + three hierarchy fields. In v2 it is six fields — the “6-part composite key” (a row is now identified by six fields instead of five):

v1  store_code · level · gen_cat · brick_name · fit
v2  store_code · level · gen_cat · brick_name · platform · fit
  • A platform column was added to som_inputs, buy_plan_recommendations, and both historical-season tables; the level constraint and indexes were extended to include PLATFORM.
  • category widened to VARCHAR(100) for free-form GenCats.
  • New exports table (job tracking: storage key, type, status, expiry) — powers the dashboard’s “downloaded” signal (2.3).
  • users.last_login_at and users.is_active added — enable the engagement KPIs (2.3).

API changes

MethodPathStatusPurpose
GET/planning/platform (+ /:gencat, /:gencat/:brick)newPlatform-view drill-down (summary → brick → platform rows)
PUT/planning/platformnewSave a platform-level plan (GenCat / Brick / Platform / Fit arrays)
GET/planning/brickfit/:gencat/:brick/:platformnewFit-level rows under a platform
GET/planning/brickfit/:gencat/:brickchanged — breakingNow returns platform_rows (was fit_rows). Both first-party apps were updated in the same release; any external consumer of this endpoint must be updated before upgrading — flagged for the Known Limitations / Operating section.

Verification

2.2 UI Refresh — New Design Token System MAJOR CHANGE

51 files · 1 token source · 10 shared primitives · 4 planning views · +3.5K/−1.9K lines
F006 F007 / F012 delivered Jun 27 – 29, 2026

The UI was re-skinned end to end on a new design-token system: every color, gradient, font, radius, shadow, spacing, and motion value now resolves from a single token source (design-tokens.json + resolver) through shared styled primitives. The refresh is not just colors — layout chrome, cell shapes, elevation, and hover behavior all changed with it:

AreaWhat changed
Color systemNavy #10233f + red #c41230 brand palette; burnt-orange #E8590C for errors (kept distinct from brand red); grey ramp re-derived from token surfaces; legacy blue/indigo removed entirely.
Zone bandsGrid header bands color-coded by data source — Structure (navy) / Actuals / Recommendation / Input (red) — with matching low-alpha cell tones per band.
Cell shape“Floating cell” table: separated borders with 6px spacing and 6px per-cell radius; 64px rows, compacted to 48px; fixed 90px pill columns; editable cells get red-tinted borders and red text.
Layout chromeDark navy gradient header bar, light blue-tinted sidebar, radial page-background gradient, custom scrollbar, restyled breadcrumbs and environment indicator, spinner-free number inputs.
TypographyInter only (Plus Jakarta Sans removed); weight ladder to 900 for display and labels; uppercase eyebrow labels with wide letter-tracking.
Shape & elevationRadius ladder from 32px cards down to 6px cells; navy-tinted shadow ladder (sm → popover) plus a red focus ring on editable inputs.
Hover & motion150ms ease transitions, 1px hover-lift on buttons and options, hover washes and border-darkening on interactive elements; reduced-motion preference respected.
Components10 styled primitives (PrettyCard, SectionCard, MetricTile, PillButton, EyebrowChip, AccentBar, combobox shells, …) used across all views; 8 non-action MUI components overridden to navy.

Where things moved

Before (v1)After (v2)
Flat grid, all reference columns always expandedSource-coded zone bands: Structure / Actuals / Recommendation / Input; Historical & AI bands collapse in place to a narrow strip while User Inputs stay visible (state remembered per view)
All columns shown per zoneReduced to the 4 most relevant columns per zone; remaining columns are kept but hidden
Level / Assortment scrolled with the gridPinned left, layered above the scrolling header bands
Editable cells styled like read-only cellsEditable cells are white with red text — the single visual cue for “you can type here”
Zone headers mixed-case, low contrastUppercase navy band headers; expand buttons are navy squares
Tab named “Brick Fit”Renamed “Fit” across tabs, breadcrumbs, and titles; season relabeled H1-27 across UI and exports
Depth edited, Width derivedWidth edited, Depth derived (see 2.1) — the red editable column moved accordingly

Scope of the change

51
FE files rebuilt
+3.5K / −1.9K
source lines*
10
reusable styled primitives
4
planning views restyled

2.3 New Features NEW FEATURES

3 features · 73 files · +5.5K lines

Three net-new capabilities, all delivered Jun 30 and hardened through UAT to Jul 4.

1 — User Management & Profiles

S13-F-005 delivered Jun 30 · merged Jul 4 (PR #6) · 36 files, +2.3K lines
What it does
A full user directory replaced the previous placeholder: create / edit / delete users, a six-role model (expanded from v1’s four roles), franchise-code assignment with exclusive-ownership handling, one-time password display and onboarding email — plus a self-service profile and change-password area for every role. Closes two v1 gaps: standard users could not log in, and change-password was a non-functional stub.
How to use it
Admins: Admin → Users for the directory, role and franchise-code assignment, and password resets. Every user: the profile menu for My Profile and Change Password.

2 — Admin Engagement & Finalization Dashboard

Admin dashboard delivered Jun 30 · 32 files, +2.9K lines
What it does
Surfaces the headline Levi’s metric — “downloaded but not edited” — alongside login recency and store-finalization KPIs, with a searchable, paginated franchisee table and lazy per-store drill-down. Powered by the new exports job tracking and login-time columns added in 2.1.
How to use it
Admin → Dashboard. KPI tiles at the top; click a franchisee row to expand its stores. Live freshness labels show when each figure was computed.

3 — Per-View Search

S13-F-003 delivered Jun 30 · merged PR #5 · 5 files, +269 lines
What it does
Each planning view gets a search box. Typing collapses the grid to a flat list of only the editable-level rows whose working column matches, with an ancestor breadcrumb (GenCat › Brick › …) above the results. Display-only — it never alters saved data or edit state.
How to use it
Type in the search field above any planning grid; clear it to restore the full hierarchy view.

2.4 Enhancements ENHANCEMENTS

2 headline + 6 smaller · +3.9K lines

1 — Automatic Distribution % Normalization

F005 delivered Jun 29 · 22 files, +2.9K lines incl. integration tests
Editing a distribution % auto-adjusts sibling values so each group always totals 100% — proportional, equal, or zero-out strategies computed with precise decimal math. Adjusted cells flash briefly and a toast (3s auto-dismiss) confirms what was rebalanced.

2 — Reset to AI Recommendations

Planning / reset delivered Jun 30 · 18 files, +1.0K lines
A guarded, confirm-gated action that atomically restores a store’s entire plan to the AI baseline across all four levels, clears edit-audit flags, and un-finalizes the store. Available from all four planning views.

3 — Smaller enhancements

across the sprint, Jun 27 – Jul 4
  • Excel terminology aligned to Levi’s vocabulary; Depth shown on every export sheet.
  • Store Segment surfaced in the store list and planning header (was mapped to the wrong field).
  • User edits preserved when recommendations are re-uploaded.
  • Structured field-level validation errors on uploads.
  • Large-upload tuning for memory stability and polling cadence.
  • Live freshness labels on dashboards; season relabel H1-27 (see 2.2).

2.5 Minor Fixes & Improvements FIXES

8 fixes · 2 high / 3 medium / 3 low

8 fixes shipped in v2 — 2 high (login, change-password: folded into User Management above), 3 medium (Platform data rendering, store Segment mapping, multi-store export depth), and 3 low (pinned-column layering, grid visual defects, frontend test tooling). Full list with severity in Appendix C.

Appendix C — Fix list

SeverityFix
HIGHStandard users could not log in — login now resolves the active environment; previously only super-admins authenticated.
HIGHChange-password was a non-functional stub — now fully implemented with current-password verification.
MEDPlatform View showed empty / zero values — a type cast dropped the new level; fixed so Platform data renders.
MEDStore “Segment” mapped to the wrong field — corrected in both the API response and the planning header.
MEDMulti-store export skipped the Platform level — export now drills the full hierarchy.
LOWPinned columns hidden on horizontal scroll — sticky headers rendered over the pinned Level / Assortment columns; z-index layering corrected.
LOWGrid visual defects — mislabeled Historical band color, cell-pill misalignment, and off-center grouped headers corrected.
LOWFrontend test tooling repaired — 13 test files still called the old jest.* API under the Vitest runner; migrated to vi.*, missing msw dependency installed, two broken import paths corrected.