Every task maps to a deliverable on the portal (Foundation, Models 1–8, Platform). Ordered by priority: M8 close-out first, then production, then the data layer that unlocks Models 1–7.
One task left: Liam signs the Rules spec. Everything else moved to Iterative V2 (bolt-on work after go-live).
None of these block sign-off. They're iterative improvements that make a working tool better. Listed here so the plan is visible and Liam signs knowing what's coming.
All Iterative V2 items shipped. New asks land here as they come up.
Make the tool run itself — nightly automated refresh so the rota reflects the latest holidays, bookings and rota-sheet edits without anyone pressing a button.
python3 deliverables/d2_rota_analysis.py nightly on the Mac Mini; auto-push regenerated HTML to the maji repo. Open the page in the morning and it reflects today's data.Specific dealer / event data questions to put to Liam short-term, and the standing data requirements to flow into Toby Austin's web-app API contract long-term. Not blocking work, but unresolved items here degrade model accuracy.
dealer_aliases table in Postgres; Models 2/7 joins on historical sales will resolve correctly.dealer_aliases.dealer_aliases.AWi vs AWo). So we don’t need a tenure/date-range model for historical attribution — initials alone remain a stable identifier per person.live = true get pulled into active = true in Postgres, so the optimiser never proposes a non-starter.parse_dealers to read the new column, then delete the temporary KNOWN_NON_STARTERS hard-code in sync_sheets_to_postgres.py. Run make sync && make validate to confirm active counts match Liam’s live roster.ROUNDUP(4.2 × weekly)ROUNDUP(4.2 × per-Week). Matches ~90% of current dealers; Adam Chapman and a few others have custom overrides in the Sheet.former_dealers table to track them so historical sales by these dealers can still be attributed. Not urgent — only matters for dealer performance analysis across 2+ years of data.active=false for now so the optimiser doesn’t pick her.WR14 3G (Malvern, 27 Feb 2026) — truncatedWR14 3G — only 2 chars after the space instead of the expected 3. No WR14 3G* postcode exists at all in postcodes.io (live or terminated), so the original was likely a transcription error from a different unit within the same sector.WR14 3AA (central Malvern) as a proxy. All WR14 3XX units sit within ~0.5 miles of each other, so drive-time error is <1 min for any dealer. Only 1 event affected (id 161, Malvern, 2026-02-27).Move off manual sheet reads into a proper data layer. Required before Models 1–7 can be built and validated properly.
Each model is one block: design → build → validate against held-out data → confidence bounds → ship. Validation happens inside each block, not as a separate phase.
The front-end layer the ops team uses day-to-day. Fixed pages for recurring questions, a conversational interface for ad-hoc ones.
Move from Toby-as-operator to WBV running the platform themselves.
Would improve the product but nothing upstream waits on them. Picked up opportunistically.
What's already live. Expand each group to see the detail.
data/external/May Rota information for Toby.xlsx with fallback to Downloads. Supersedes the quarterly file for May weeks; Liam's 30 Apr baseline assignments preserved for W18 before/after comparison.Road show #, Area, Date, Dealer #1, Dealer #2, Dealer #3. Dealer cells paste cleanly into his existing rows keyed by Road show #; no risk of overwriting other columns. Road show # populated from the May Excel for W18-W22 and from the Sheet's own column for historical weeks.rota-tool.htmlconst FEEDBACK_KEY was throwing SyntaxError, halting all JS)