feat(studio): make storyboard view default available (remove FF)#1794
Conversation
Removes STUDIO_STORYBOARD_ENABLED. The storyboard view-mode toggle was gated behind a default-off feature flag (VITE_STUDIO_ENABLE_STORYBOARD) since #1529. With the storyboard experience now ready for broad exposure, drop the gating and make the toggle available unconditionally. Changes: - packages/studio/src/components/editor/manualEditingAvailability.ts: delete the STUDIO_STORYBOARD_ENABLED constant. - packages/studio/src/App.tsx: drop the import + FF arg to useViewModeState(). Hook is now called argument-free. - packages/studio/src/components/StudioHeader.tsx: drop the import + the conditional-render guard on <ViewModeToggle />. The toggle always renders in StudioHeader's center slot. - packages/studio/src/contexts/ViewModeContext.tsx: remove the enabled: boolean parameter from useViewModeState() and simplify. - packages/studio/fixtures/storyboard-sample/README.md: drop the VITE_STUDIO_ENABLE_STORYBOARD=1 prefix from the preview command. The VITE_STUDIO_ENABLE_STORYBOARD / VITE_STUDIO_STORYBOARD_ENABLED env vars become no-ops after this change. Co-Authored-By: Jerrai <noreply@anthropic.com>
vanceingalls
left a comment
There was a problem hiding this comment.
Stack status
Single PR. base = main, no descendants on feat-storyboard-default-available. The case-file admits no accomplices.
Verdict
LGTM with one 🟡 doc nit — the implementation is a clean flag-removal; only a single stale citation in a sibling skills doc warrants the magnifying glass.
Scope
Removes the default-off feature flag STUDIO_STORYBOARD_ENABLED (env: VITE_STUDIO_ENABLE_STORYBOARD / VITE_STUDIO_STORYBOARD_ENABLED) introduced in #1529. The constant is deleted from manualEditingAvailability.ts; App.tsx and StudioHeader.tsx shed their imports + guards; useViewModeState() loses its enabled: boolean parameter and the pin-to-timeline branch dies with it. Fixture README drops the VITE_STUDIO_ENABLE_STORYBOARD=1 prefix. The two env vars become inert — nothing else reads them.
Context snapshot
- HEAD:
8108799d9f8241c812d5d053737e996490591bd5 - Author:
jrusso1020 - Reviews on PR at read time: none (Magi tagged in parallel; pre-post freshness re-check before submission)
- CI: Format / Lint / Fallow audit / Semantic title / SDK contract / runtime contract / Studio load smoke / regression / player-perf / CodeQL python — all green. Typecheck / Build / Test / CLI smoke (required) / Windows render / preview-regression — in progress at observation time, no failures.
- mergeStateStatus
BLOCKEDis the standing review-required gate, not a CI fail.
Findings
✅ Deletion completeness — verified clean
Three forensic dragnets at HEAD confirm the constant is gone everywhere it lived:
STUDIO_STORYBOARD_ENABLED: only the three files this PR touches —manualEditingAvailability.ts(definition deleted),App.tsx(import + arg dropped),StudioHeader.tsx(import +&&guard dropped). Zero stragglers.VITE_STUDIO_STORYBOARD_ENABLED: only the (now-deleted) definition line.VITE_STUDIO_ENABLE_STORYBOARD: only the fixture README (updated) and one stale skills doc reference (see 🟡 below).
✅ Hook-signature blast radius — verified clean
useViewModeState had exactly one call site in the repo — packages/studio/src/App.tsx:65, updated to argument-free. ViewModeProvider plumbing downstream (App.tsx:472, StoryboardFrameFocus.tsx via useViewMode) is unchanged because the value shape { viewMode, setViewMode } is preserved. No facade ripple.
✅ Reachability of the newly-ungated path — verified
Per the verify-new-path-reachable lens: under prod defaults the storyboard view is now reached two ways, both unconditional:
<ViewModeToggle />renders for every Studio session (StudioHeader.tsx:206).?view=storyboarddeep-link works on mount (readViewModeFromUrl()atViewModeContext.tsx:50, no guard).
The popstate listener and writeViewModeToUrl similarly drop their enabled short-circuits — back/forward sync remains live. The downstream render branch in App.tsx:498 (viewModeValue.viewMode === "storyboard" && <StoryboardView .../>) is untouched and now actually firable. No dead-code residue.
✅ Decorative-gate / band-aid check — clean
This PR is the removal of a gate, not the addition of one. The simplified useViewModeState body is straightforwardly inert-free: no duplicate guards, no contradictory rules, no silent scope gaps. The JSDoc rewrite accurately reflects the new behavior.
🟡 Stale skills doc citation — skills/hyperframes-core/references/storyboard-format.md:5
HyperFrames Studio renders it as a contact sheet (the Storyboard view, behind `VITE_STUDIO_ENABLE_STORYBOARD=1`).
After this PR, VITE_STUDIO_ENABLE_STORYBOARD is a no-op env var. The "behind …" clause is now actively misleading — any agent (LLM or human) reading this skill will believe the flag still gates the view and will either set a dead env var or, worse, propagate the stale gate into a generated workflow. Suggested fix:
HyperFrames Studio renders it as a contact sheet (the Storyboard view, available by default; toggle in the header or deep-link with `?view=storyboard`).
Same patch motion as the fixture README change — one-line edit, no logic change.
💭 Cosmetic — JSDoc precision
The new doc comment on useViewModeState:
initial read from
?view=, toggling, popstate sync.
is fine and matches the body. The remark that "a scripted pushState/replaceState to ?view= would not be reflected here, by design" survives below the hook in the useEffect comment, so the contract for the agent-deep-link case stays documented. No change needed; just noting that the surviving comment is load-bearing for the agent-navigation use case and should stay even on future tidy-up passes.
Cross-PR notes
#1791(storyboard-angle follow-ups) is in@hyperframes/core/storyboardparser/CLI territory — disjoint file set from this PR. No interaction risk.- No conflict with the recent producer/cache (#1781), keyframe-retiming (#1784), package-files (#1787), or id-less-media (#1790) work — those touch unrelated modules.
Summary
Textbook flag-removal: definition deleted, all consumers updated, hook signature simplified with zero downstream ripple, fixture doc kept in sync. The only investigatory residue is the sibling skills reference still describing the view as flag-gated — a single-line follow-up either in this PR or a quick stacked one. Not a merge blocker; flagged for hygiene.
Review by Via
miguel-heygen
left a comment
There was a problem hiding this comment.
Concur with Via's review. I independently checked the diff at 8108799d and do not see additional blockers.
Verified:
packages/studio/src/contexts/ViewModeContext.tsx:50now owns view mode without the feature-flag parameter while preserving URL read/write andpopstatecleanup.packages/studio/src/App.tsx:65is the onlyuseViewModeState()call site and now matches the simplified signature; the storyboard branch remains behind the existing Studio project-resolution guard.packages/studio/src/components/StudioHeader.tsx:206exposes the toggle unconditionally, which matches the product intent.rgconfirms noSTUDIO_STORYBOARD_ENABLED,VITE_STUDIO_ENABLE_STORYBOARD, orVITE_STUDIO_STORYBOARD_ENABLEDreferences remain underpackages/.
Only caveat is the same non-blocking doc stale ref Via flagged: skills/hyperframes-core/references/storyboard-format.md:5 still describes Storyboard as behind VITE_STUDIO_ENABLE_STORYBOARD=1. That should be updated, but it is not a runtime blocker for this PR.
CI has no failures at review time; only Smoke: global install and Windows checks are still pending.
Verdict: APPROVE
Reasoning: Runtime flag removal is complete and the newly default-available storyboard path is reachable without introducing a code-path regression; remaining issue is documentation hygiene only.
— Magi
The Storyboard view is now available by default (the FF removed in this PR); storyboard-format.md no longer points at the dead env var, and skills-manifest is regenerated for the hyperframes-core hash. Closes the Via/Magi review nit. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
miguel-heygen
left a comment
There was a problem hiding this comment.
Re-reviewed the delta at fcac5b197.
The only changes since my prior approval are the stale Storyboard skill doc line and regenerated manifest hash:
skills/hyperframes-core/references/storyboard-format.mdnow correctly says Storyboard is available by default instead of behindVITE_STUDIO_ENABLE_STORYBOARD=1.skills-manifest.jsonupdates thehyperframes-corehash to match.
I re-checked the full diff context: the original flag removal remains complete, useViewModeState() still has a single updated call site, and the toggle/deep-link path remains unconditionally reachable. No new issues found.
CI has no failures at review time; several long jobs are still pending.
Verdict: APPROVE
Reasoning: prior doc nit is resolved and the manifest update is consistent with that doc change.
— Magi
What
Removes
STUDIO_STORYBOARD_ENABLED. The storyboard view-mode toggle was gated behind a default-off feature flag (VITE_STUDIO_ENABLE_STORYBOARD/VITE_STUDIO_STORYBOARD_ENABLED) since the original storyboard shell PR. With the experience now ready for broad exposure, drop the gating and make the toggle available unconditionally.After this lands the FF env vars become no-ops; nothing else in the codebase reads them.
How
packages/studio/src/components/editor/manualEditingAvailability.ts— delete theSTUDIO_STORYBOARD_ENABLEDconstant + its comment.packages/studio/src/App.tsx— drop the import + the FF arg touseViewModeState(). Hook is now called argument-free.packages/studio/src/components/StudioHeader.tsx— drop the import + the conditional-render guard on<ViewModeToggle />. The toggle renders alongside the project name + toolbar in every Studio session.packages/studio/src/contexts/ViewModeContext.tsx— remove theenabled: booleanparameter fromuseViewModeState()and simplify. No more pin-to-timeline-when-disabled branch — the function now does the obvious thing: initial read from?view=, toggling, popstate sync.packages/studio/fixtures/storyboard-sample/README.md— drop theVITE_STUDIO_ENABLE_STORYBOARD=1prefix from the preview command.Net: -23/+14 across 5 files.
Testing
grep -rn STUDIO_STORYBOARD_ENABLED packages/returns no hits.grep -rn VITE_STUDIO_ENABLE_STORYBOARD packages/returns no hits.StudioHeader(Storyboard / Preview) now renders on every Studio session.?view=storyboarddeep-links work without needing the env var. Browser back/forward continues to sync?view=viapopstate.Co-Authored-By: Jerrai noreply@anthropic.com