Skip to content

Demo-friendly additions: scenario names, saved recipes, and a stable stats frame#57

Open
hallmansm wants to merge 16 commits into
michelgrootjans:mainfrom
hallmansm:feature/scenario-name-label
Open

Demo-friendly additions: scenario names, saved recipes, and a stable stats frame#57
hallmansm wants to merge 16 commits into
michelgrootjans:mainfrom
hallmansm:feature/scenario-name-label

Conversation

@hallmansm

@hallmansm hallmansm commented Jul 3, 2026

Copy link
Copy Markdown

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 localStorage and 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

  • All 140 unit tests pass.
  • No behavior change when the Name field is left empty and no recipe is used.
  • Happy to split this into smaller PRs if you'd prefer to take the name field alone — say the word.

🤖 Generated with Claude Code

hallmansm and others added 3 commits July 3, 2026 15:10
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>
@hallmansm

Copy link
Copy Markdown
Author

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>
@hallmansm

Copy link
Copy Markdown
Author

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.

hallmansm and others added 2 commits July 4, 2026 10:32
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>
@hallmansm hallmansm changed the title Add an optional scenario name to label runs in the stats comparison Demo-friendly additions: scenario names, saved recipes, and a stable stats frame Jul 4, 2026
hallmansm and others added 10 commits July 4, 2026 13:13
(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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant