Demo-friendly additions: scenario names, saved recipes, and a stable stats frame#57
Demo-friendly additions: scenario names, saved recipes, and a stable stats frame#57hallmansm wants to merge 16 commits into
Conversation
When comparing several simulation runs, the stats columns are all titled by the workload string (e.g. "dev: 1"), which makes runs with the same workload but different workers or WIP limits hard to tell apart. Adds an optional Name field to the form; when filled, it is used as the scenario title. Falls back to the workload string when left blank. Also adds a little top padding to #stats so the selected column's outline is not clipped by the sticky header's shadow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- #scenarios gets 4px internal padding so the selected column's outline is not clipped by the overflow-auto scroll container (padding outside the container could not fix this). - Scenario titles stay on one line with an ellipsis so a long workload title no longer wraps and misaligns the stat rows against the legend. The full title is available as a tooltip. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Typing "Fullstack" instead of "fullstack" flagged the workers field as invalid, and a capitalized worker would receive no skills at all (the engine looks skills up in lowercase). Worker names and workload keys are now lowercased at the parsing and validation boundary, so any capitalization works. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Pushed two follow-up commits after using this in anger for a demo prep session: (1) the selected column's outline was being clipped by the overflow-auto scroll container, and long workload titles wrapped to two lines and misaligned the stat rows against the legend - fixed with internal padding and a one-line ellipsis title (full title available on hover); (2) worker/skill names are now accepted case-insensitively - typing Fullstack flagged the field invalid, and would have produced a worker with no skills. Happy to split the case-insensitivity commit into its own PR if you prefer smaller reviews. |
Running the same handful of scenarios in front of an audience means retyping (or pasting) workload, workers, WIP limit and story count each time, with a typo risk on every field. - Every run submitted with a Name is now saved as a "recipe" (name + all form fields) in localStorage. Re-running with the same name updates the recipe. - A Recipe dropdown fills the whole form, including the name, from any saved recipe: pick, Run, talk. - A Clear button resets the page for a blank slate; saved recipes survive (they live in localStorage, not the page). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
One more, born from rehearsing an actual talk: saved recipes. Any run submitted with a Name is remembered (localStorage); a Recipe dropdown refills the whole form from any saved run, and a Clear button resets the page for a blank slate while recipes survive. Makes live comparisons typo-proof: pick, Run, talk. As before - happy to split any of these commits out into separate PRs if you'd rather review them piecemeal. |
Large teams (4x/8x) produce dozens of worker-utilization rows that shoved the animation far down the page, held there by the tallest column. The scenarios frame now caps at 480px (fits a 2x team, ~14 workers, without scrolling) and scrolls vertically inside itself; the board below stays put regardless of team size. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Recipes.remove existed with no UI. An outline-danger x next to the Recipe dropdown: disabled until a recipe is selected, deletes exactly that one, re-disables after. Overwrite-by-name (upsert on Run) remains the way to update a recipe in place. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(Fork-identity change — must be dropped from any upstream PR.) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Eleven demo recipes (Base Team through the WIP+cross-skill+batch combos, dev time 8 full-batch / 4 cut-batch) seed into localStorage on first visit only — the key having never been written. Users can delete any or all (an emptied list stays empty) and add their own. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eries Steve's argument in readme form: baseline, buy-capacity (2x/4x/8x and throughput-per-expense), the three free levers solo, the combos that beat 2x payroll at 1x cost, and the noVar control. Fork additions listed, rework-sim linked as the companion, Michel credited as concept/model/original implementation, CC BY 4.0 retained. (Fork-identity change — drop from any upstream PR.) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Each scenario gets its why and its watch-for; the combos close as a skill ladder (2 -> 3 -> 4 skills per person, all with WIP capped and batches cut) against the buying-capacity strategy. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
'Team member cost' input beside Run (default $100,000). Each run's column now opens with Team cost — headcount × cost, snapshotted at Run — in a bold money-green row above Throughput. The 2x/4x/8x columns finally wear their price: throughput-per-expense at a glance. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Flexbox default stretch capped each column's box at the frame's 480px, so the selection outline stopped mid-list while worker rows overflowed past it unoutlined. align-items: flex-start lets each column own its full height; the frame scrolls to reveal the rest, outline included. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…cost Whole form fits one row now — no wrapping. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Text input with tolerant parsing (digits extracted from any mix of $, commas, spaces) and self-reformatting on change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cross-skilling only + cx2 combo: dev-4 pairs (dev+ui x2, dev+qa, dev+po, ui+po, ui+qa, qa+po). cx3 combo: dev-6 triples. Validated against the Banana Software Company sheet — cross-skilling-only now beats the base team (0.40 vs 0.35, cycle max 26.6 vs 67.8) instead of losing to it. Readme scenario 6 teaches the pointing rule and keeps the naive roster as a documented trap to try. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Six failed push-triggered Jekyll builds and two wedged ones in one evening. CI now builds from source (npm ci, test, vite build) and deploys the dist artifact directly — no gh-pages branch, no Jekyll, no failure emails. (Fork-identity file — drop from any upstream PR.) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
First off — thank you for this simulator. I'm an agile coach using it to show teams and leadership why WIP limits and cross-skilling beat adding headcount, and it does that job beautifully. This branch grew out of running it in live demos; everything here exists to make those demos smoother.
What this adds
Scenario names. The stats columns are all titled by the workload string (e.g.
dev: 1), so two runs with the same workload but different workers or WIP limits are hard to tell apart — especially five or six scenarios deep into a demo. An optional Name field ("WIP-limit 5", "2nd developer", "full stack"…) becomes the scenario's title in the stats comparison and the document title. Left blank, it falls back to the current behavior.Saved recipes. Named scenarios are saved to
localStorageand reappear in a Recipe dropdown — pick one and the whole form fills in. Re-running under the same name updates that recipe in place; a small × button deletes the selected recipe. Lets a presenter walk into a room with a prepared sequence ("Base Team → 2x People → WIP throttling → Cross-skilling") instead of retyping configs live.A Clear button that resets runs and charts for the next audience while keeping saved recipes.
A stable stats frame. Large teams (4×/8×) produce dozens of worker-utilization rows that shoved the animation far down the page. The scenarios comparison now caps at a fixed height (a ~14-worker team fits without scrolling) and scrolls vertically inside its own frame — the board and charts below stay put regardless of team size.
Small fixes along the way: worker and skill names parse case-insensitively; the selected column's outline is no longer clipped by the sticky header; the stats titles wrap cleanly.
Notes
🤖 Generated with Claude Code