Skip to content

fix(vibe): Judge Storybook stories by the lifecycle scheme of the session's base - #301

Merged
shafty023 merged 4 commits into
mainfrom
fix/vibe-storybook-lifecycle
Oct 16, 2026
Merged

shafty023 merged 4 commits into
mainfrom
fix/vibe-storybook-lifecycle

Conversation

@shafty023

Copy link
Copy Markdown
Collaborator

Purpose

symphony-alpha #8867 (ISS-12610, Storybook 3.0.0) replaced the v1.0/v2.0 Storybook scheme with lifecycle tags: the <Level> v2.0 roots became the plain roots, the old plain roots became <Level> v1.0, and every story file now carries one of stable, preview, experimental or deprecated. The handoff inventory still read every plain-root title as frozen v1.0. The grouped-list-sections session synced main, moved its own new entries to Composites/... with stable, and handoff blocked them as frozen stories. On a post-#8867 base, 1.0.49 also left an edit of a Surfaces v1.0/ file unclassified.

What changed

  • New skills/handoff/scripts/storybook-taxonomy.mjs works out the scheme from the session base's own apps/storybook/story-group-order.ts. If that file exports StorybookLifecycle, the base uses the lifecycle scheme: the frozen tag is the Deprecated value, and a frozen root is any title root ending in ${storybookBaselineVersion}. That is the same test symphony-alpha's validate:catalog applies, so the next rename there carries over without a plugin change. A base without the export uses the version scheme, whose patterns stay hardcoded because that scheme is closed history. If the export can't be read, a session that changed a story file is blocked (storybookSchemeRecognized: false); the inventory does not guess. The story meta parsers moved into this module.
  • handoff-inventory.mjs reports storybookScheme and judges v1Stories and compileOnlyV1Repairs by that scheme. The freeze, the compile-only repair (same meta title, tags and exports as the base), the retitle check against the main the session last synced, and the Start Here exemption are unchanged on both schemes. The output keys are unchanged too.
  • Docs: guardrails.md ("Storybook taxonomy" and Missing primitives step 3), the Storybook decomposer, the change and primitive workers, guardrails reviewer check 10, design-pass.md, handoff section 4 and the README. New work goes in the plain current roots with one lifecycle tag: stable for shipped work, preview under Labs, experimental for design-only or not-in-the-app work. New states of a deprecated component go in a new entry in the current root, with a permanent name and no version number. An existing non-deprecated file keeps its title and tag. A session on a pre-#8867 base follows that base's v2.0 rules until it syncs.
  • Two eval cases tagged storybook (the Codex runner picks them up automatically).
  • vibe 1.0.49 to 1.0.50, CHANGELOG entry. Main was merged twice (feat(vibe): Test named mechanisms and decision provenance in vibe sessions #299, then fix(vibe): Close five gaps from a PM pull request review #300), keeping both sides.

Commands run

node --test 'plugins/vibe/**/*.test.mjs'     # 306 pass
uv run pytest plugins/ -q                    # 2331 passed, 3 skipped
uv run ruff check . && uv run pyright        # clean

handoff-inventory-storybook-scheme.test.mjs has 5 cases, and 4 of them fail against the 1.0.47 inventory (unchanged through 1.0.49). The 1.0.47 failing shape: a post-#8867 base with edits to Composites/Artifacts/Grid Groups and Primitives/Actions/Button, both tagged stable, gives v1Stories both with reason frozen and storiesInV2Taxonomy: false. The sync case uses a base with the version scheme, has the session add a story to a v2.0 file and a new v2.0 entry, then lands a #8867-shaped main commit and merges it. After that it asserts no retitles and no frozen files, that the own entry can move to the plain root, and that an edit of the now-deprecated file is still frozen.

Real repo check, in a scratch branch of symphony-alpha at afc38408c3, later deleted. After merging main into the stranded branch commit cdce00a741 and moving its three new entries to plain roots with stable, 1.0.47 blocks all three with reason title. This branch passes them and lists the Surfaces v1.0/Documents/Listing edit under compileOnlyV1Repairs.

Evals, one run each. Claude (claude plugin eval, Opus): 2 of 2 here; on 1.0.48 it failed the deprecated-component case (score 0.2) and passed the sync case. Codex (evals/codex/run.py): 2 of 2 here and 0 of 2 on 1.0.48. On 1.0.48 Codex answered Composites v2.0/... with v2.0 for the first case and a shipped tag for the second.

…sion's base

symphony-alpha #8867 (ISS-12610) made the plain roots current and moved the
old ones to <Level> v1.0 with a deprecated tag. The handoff inventory read
every plain-root story as frozen v1.0, so a synced session was blocked.

- Read the scheme from the base's story-group-order.ts: the lifecycle
  scheme takes its frozen tag and v1.0 root suffix from StorybookLifecycle
  and storybookBaselineVersion; an older base keeps the v1.0/v2.0 rules.
- Keep the freeze, the compile-only repair, the retitle check against the
  synced base and the Start Here exemption on both schemes.
- Translate the placement rules in guardrails, the decomposer, the writer,
  the reviewer, design pass, handoff and README.
Changelog entry for the Storybook lifecycle scheme fix, and the
base-scheme contract test reads agent text through flat() after the
shared helpers from #299 started returning raw text.
…fecycle

# Conflicts:
#	CHANGELOG.md
#	plugins/vibe/evals/codex/README.md
#	plugins/vibe/evals/codex/test_run.py
@shafty023
shafty023 merged commit fe25e91 into main Oct 16, 2026
10 checks passed
@shafty023
shafty023 deleted the fix/vibe-storybook-lifecycle branch October 16, 2026 17:09
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