Skip to content

refactor(studio): remove the storyboard view and its Storyboard/Preview switch - #4140

Merged
miguel-heygen merged 6 commits into
mainfrom
feat/remove-storyboard-view
Sep 19, 2026
Merged

miguel-heygen merged 6 commits into
mainfrom
feat/remove-storyboard-view

Conversation

@miguel-heygen

@miguel-heygen miguel-heygen commented Sep 19, 2026

Copy link
Copy Markdown
Collaborator

What this changes

The Studio no longer has a Storyboard view or the Storyboard/Preview switch in its header. Studio always opens on the preview, including when a link still carries ?view=storyboard. hyperframes preview stops choosing a landing view and hands out the plain #project/<name> link.

The storyboard file format and its parser stay: STORYBOARD.md and @hyperframes/core/storyboard are used by agents and are untouched. Git history is the way back if the view is missed; there is no flag and no hidden toggle.

Before

The header shows a Storyboard / Preview switch.

Before: Storyboard / Preview switch in the header

After

The switch is gone and the preview is the only surface. Same project and viewport; an old ?view=storyboard link also lands on the preview.

After: no switch, preview only

What was removed

  • Studio: the components/storyboard/ folder, useStoryboard, the view-mode context, the header switch, the hidden-shell prop in EditorShell, the "Storyboard mode" feedback preset, the storyboard fixture project, and useProjectSignaturePoll (its only readers were the deleted board).
  • Studio server: the storyboard read routes and their tests, and the storyboard thumbnail output mode.
  • CLI: studioLandingSearch and the projectDir argument that only fed it.
  • Docs and skills: the Studio storyboard page and its nav entry, links to it from three guides, and the agent steps that told agents to open ?view=storyboard.
  • Two studio dependencies (dompurify, marked) that only the board used.

Why the thumbnail mode could go

output=storyboard was requested from one place: FramePoster.tsx:62 on the base commit. That file is deleted here. The remaining references were the route itself and its two tests. Searched with git grep -n 'output=.storyboard\|"storyboard"' on the base commit across packages and skills.

Kept on purpose

  • GET /api/projects/:id/signature and resolveProjectSignature in studio-server stay: it is public server API, and only the Studio poller was removed.
  • @hyperframes/core/storyboard stays, tied to the skills' vendored parsers by vendoredParity.test.ts.

Skill docs

The storyboard becomes an agent-driven recipe in the skills: the agent presents the plan in chat before building, with STORYBOARD.md staying the artefact. That rewrite is the next PR on this stack, not this one. These skill files still carry the old live-board wording and are rewritten there:

  • skills/faceless-explainer/SKILL.md, skills/pr-to-video/SKILL.md, skills/product-launch-video/SKILL.md, skills/general-video/SKILL.md
  • skills/hyperframes-cli/SKILL.md
  • skills/hyperframes/references/: review-loop.md, brief-contract.md, brief-format.md, intent-interview.md, frame-worker-core.md, production-loop.md, script-format.md, storyboard-format.md
  • skills/media-use/references/memory.md, skills/media-use/scripts/recipe.mjs

Verification

Run on a built Linux checkout:

  • packages/studio: 450 files, 4996 tests pass; tsc --noEmit clean.
  • packages/studio-server: 38 files, 553 tests pass.
  • packages/cli preview.test.ts: 33 pass.
  • packages/core storyboard tests: 30 pass.
  • oxlint clean; fallow reports nothing introduced by this branch.
  • bun install --frozen-lockfile accepts the trimmed lockfile.

@mintlify

mintlify Bot commented Sep 19, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
hyperframes 🟢 Ready View Preview Sep 19, 2026, 3:27 AM

💡 Tip: Enable Automations to automatically generate PRs for you.

@terencecho terencecho left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve at fe02b385 — clean deletion, verified end-to-end

75 files, 231 additions, 4192 deletions, 36 file-deletes, zero new files added — matches "large removal, nothing new introduced." (gh pr diff from GitHub API; my local merge-base..head shows extra churn from post-branch main merges — [[reference_graphite_mid_merge_diff_inflation]] applies, so I used GitHub's canonical PR diff throughout.)

Captures — verified myself

Downloaded both attachments and opened them. Before: Storyboard | Preview segmented toggle centered in the header, Preview selected, project loads safe margins on a wide viewport. After: same project, same viewport, same title/caption timeline lanes — the toggle is gone from the header center. Matches "Studio always opens on the preview; header switch removed." (Correcting the dispatch: "before/after captures viewed by home" wasn't true — Rames flagged 6th instance of that fabrication pattern this arc. I did the pass first-hand.)

Deletion completeness — no dangling references

Grepped the tree at head for every deleted symbol. Zero consumer refs remaining for StoryboardView, StoryboardGrid, ViewModeContext, useViewMode, ViewModeProvider, FramePoster, useProjectSignaturePoll, useStoryboard, studioLandingSearch, ?view=storyboard, output=storyboard. The only surviving useStoryboard/StoryboardView/etc. mentions are inside scripts/check-no-main-deletions.mjs's ALLOWED_DELETIONS map — the guard entries themselves, not code that calls into the deleted symbols.

The check-no-main-deletions.mjs shape is right: 36 storyboard-deletion paths spread into ALLOWED_DELETIONS with a single shared STORYBOARD_VIEW_REASON constant, no blanket bypass (the file's docstring explicitly rules that out). Matches the guard's "name each intentional deletion in the diff" contract.

Preserved surfaces — confirmed present

  • packages/core/src/storyboard/ intact: types.ts, parseStoryboard.ts, editStoryboard.ts, transitionsContract.test.ts, vendoredParity.test.ts, index.ts — the module + parser + the vendored-parity gate that ties skills' vendored copies (skills/{faceless-explainer,pr-to-video,product-launch-video,music-to-video}/scripts/lib/storyboard.mjs) back to the source. Only edit inside this module was a one-line docstring cleanup in types.ts (removes "the Studio's storyboard view" mention).
  • STORYBOARD.md format docs preserved in skills/hyperframes/references/storyboard-format.md + skills/music-to-video/references/storyboard-format.md (unchanged filenames; the hyperframes/ file loses one line about the contact-sheet view and the read API being deleted).
  • Server-side GET /api/projects/:id/signature + resolveProjectSignature stay in packages/studio-server/src/routes/projects.ts (docstring cleanup only). Client-side useProjectSignaturePoll is the only reader that's removed — the endpoint stays for external consumers as claimed.
  • docs/studio/storyboard.mdx deleted (the page itself), nav in docs/docs.json updated to drop it, cross-links from docs/guides/{faceless-explainer,general-video,pr-to-video}.mdx + docs/help.mdx + docs/studio/{index,troubleshooting}.mdx all cleaned up.

CI-guard shape borrowed from #4132

scripts/check-no-main-deletions.mjs gets the same pattern I flagged on #4132 and Somu applied to their #3618 — the guard is on for every deletion, and each intentional removal is a named line in the diff. Here the author pre-added all 36 storyboard paths in the same commit as the deletion, so Detect changes passes cleanly (no post-hoc Fix CI commit needed like #4132/#3618 had to add).

Studio-side surface — no scope creep

Confirmed the true (GitHub-computed) diff after peeling back my local diff's mid-merge inflation. App.tsx change is pure removal of the ViewMode wiring; EditorShell.tsx drops the hidden prop; StudioHeader.tsx deletes the ViewModeToggle component; feedbackTrigger.ts drops the "Storyboard mode" follow-up entry; CompositionThumbnail.{tsx,test.ts} collapses output?: "source" | "storyboard" to output?: "source"; useAppHotkeys.ts + CaptionOverlayUtils.ts are one-line docstring cleanups. packages/studio/tsup.config.ts and packages/studio/package.json + bun.lock drop dompurify + marked (only the deleted board used them). No unrelated hook additions, no unrelated refactors carried in this diff.

studio-runtime-smoke.mjs

Fake server drops the ${PROJECT_PATH}/storyboard response entry — matches "no client-side reader remains."

Follow-up scope claim

PR body flags "about fifteen skill files still describe reviewing on a 'live board'." Actual remaining count at head: 8 mentions across 4 files (review-loop.md § 2+ still references it after § 1's rewrite; plus brief-format.md, intent-interview.md, brief-contract.md). The 15 figure is stale — probably from before this diff removed some — but the follow-up-in-a-separate-PR shape is right; this deletion doesn't need to churn every prose reference.

Deploy shape

hf-oss require_last_push_approval=true, so this approval binds to head fe02b385. All required substantive checks green as of this stamp; the earlier Tests on windows-latest / regression / Typecheck "fails" in the check-runs table were cancelled/superseded runs (matches [[feedback_check_runs_api_returns_stale_runs]]), replaced by fresh IN_PROGRESS lanes on run 35411132040 which settled green.

— Review by tai (pr-review)

@terencecho terencecho left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RE-APPROVING at 9e1a6d03 — clean rebase; prior review at fe02b385 carries

require_last_push_approval=true on hf-oss invalidated my prior 5253948311. Re-verifying at the new head rather than re-stamping blind.

The rebase is exactly what the description says

Structural check first (via gh pr diff 4140 at each head, since the local fe02b385..9e1a6d03 compare is polluted by 4 intervening main commits — [[reference_graphite_mid_merge_diff_inflation]]):

  • 75 files at fe02b385, 75 files at 9e1a6d03, ZERO added, ZERO removed.
  • Old total +229/-4190; new total +231/-4192 — net delta +2/-2 across the whole PR.
  • Only 2 files show a per-file diff-hunk difference between the two heads.

That matches Miguel's "one App.tsx conflict re-applied by hand + one comment trimmed" description one-for-one.

File 1 — packages/studio/src/App.tsx (the re-applied conflict)

The delta is Miguel's deletion of the ViewMode wiring being re-expressed against the new drag-overlay API that landed on main tonight (the #4142 refactor Rames approved). Concretely, the container props change from the old dragOverlay.* 4-handler shape:

onDragOver={dragOverlay.onDragOver}
onDragEnter={dragOverlay.onDragEnter}
onDragLeave={dragOverlay.onDragLeave}
onDrop={dragOverlay.onDrop}
...
dragOverlayActive={dragOverlay.active}

to the new fileDrop.* 2-handler shape:

onDragOver={fileDrop.onDragOver}
onDrop={fileDrop.onDrop}

That's the shape main now uses. Nothing about the storyboard-view removal itself changed — the ViewMode conditional is still gone, the storyboard-only branches are still gone, the composition-thumbnail output-mode arg is still gone. −6 lines net just reflects the smaller new drag-overlay call site (4 handlers → 2, dragOverlayActive prop dropped).

File 2 — packages/studio/src/captions/components/CaptionOverlayUtils.ts (the comment trim)

Pure docstring edit on isCaptionPreviewVisible:

  • Was: store's isEditMode stays true while the preview is merely hidden (e.g. storyboard view), so hotkeys must not route ⌘Z to the caption stack unless the user can actually see the captions the undo would change.
  • Now: store's isEditMode stays true while the preview is merely hidden, so hotkeys must not route ⌘Z to the caption stack unless the user can see the captions the undo would change.

Dropped the (e.g. storyboard view) parenthetical (which is now dead — the storyboard view is what this PR removes) and the word actually. Zero runtime change; the guard's contract is unchanged.

Everything else my prior review confirmed still holds byte-for-byte

Verified via awk-scoped per-file diff extraction: the remaining 73 files' hunks are byte-identical between the two PR diffs. So all the prior work carries:

  • Zero dangling refs across .ts/.tsx/.mts/.mjs/.js in packages/skills/scripts/docs for StoryboardView, StoryboardGrid, ViewModeContext, FramePoster, useProjectSignaturePoll, useStoryboard, ?view=storyboard, output=storyboard, studioLandingSearch — only surviving mentions are inside the ALLOWED_DELETIONS guard map itself.
  • Preserved surfaces intact: packages/core/src/storyboard/ module + parsers, STORYBOARD.md format spec in skills, 4 vendored skill parsers with parity test, GET /api/projects/:id/signature server route.
  • check-no-main-deletions.mjs guard entries match every deleted file 1:1.
  • Before/after captures (/tmp/hf4140_captures/{before,after}.png from my first-hand pass this session): toggle removed from StudioHeader, same viewport / composition, no other UI drift. StudioHeader.tsx's hunk is unchanged across the rebase, so the visual pass carries.

Stamp mechanics

hf-oss require_last_push_approval=true → this APPROVE binds to 9e1a6d03 only. Any push after this invalidates it.

CI status: running a background poll at the new head; will re-verify before the loop presses merge that the green stayed green (per [[feedback_check_runs_api_returns_stale_runs]] — workflow-run list is truth, check-runs API can lie on cancelled aggregators).

— Review by tai (pr-review)

@terencecho terencecho left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RE-APPROVING at 39bd9f73 — rebase over #4125 merge; "5-of-6 identical + first differs only in manifest" verified end-to-end

require_last_push_approval=true voided my prior 5254249299 at 9e1a6d03. Rebased after #4125 squashed into main.

Applied the rebase-scoped diff-of-diffs pattern

Same 6 author commits at both heads, message-identical. Per-commit patch-id (git patch-id --stable on each commit's raw diff, fetched via gh api -H "Accept: application/vnd.github.diff" /commits/<sha>):

# commit new SHA old SHA patch-id parity
1 remove-storyboard-view ac553227 0a6f8cdd DIFFER (see below)
2 fold-thumbnail-branches b5b808b4 3d4b56fb IDENTICAL 49098940…
3 docs-storyboard-refs 40635324 866cc1fc IDENTICAL 1eef3a2b…
4 ci-no-deletions-guard 5ed02957 d7d50be2 IDENTICAL a4de8eb8…
5 wrap-comment-line dc2ab126 a24cff00 IDENTICAL 4bc46f55…
6 reindent-App.tsx 39bd9f73 9e1a6d03 IDENTICAL 122d01f0…

5 of 6 byte-identical across the rebase — matches your claim exactly.

Commit-1 delta is 18 lines total; entirely blob-header + expected manifest-hash rotation

The one DIFFER commit's diff-of-diffs is 18 lines. Nothing about the removals changes — the storyboard teardown is line-for-line identical. What differs:

  • packages/studio/package.jsonindex blob-hash change only. Pre-image differs because intervening main touched a neighbouring dep entry, so the "before" is different. The -dompurify + -marked removals themselves are byte-identical.
  • skills-manifest.json — two skills whose pre-image hashes rotated on the new base (faceless-explainer and hyperframes). Post-image hashes are the deterministic result of removing storyboard content from post-#4125 skill files. Both pre AND post differ by hash, but no other content changes.
  • One hunk-header offset shift on the manifest (@@ -66 → @@ -62) — expected when preceding hunks changed size on the new base.

Whole delta. Everything semantic is unchanged.

CI at head

Fresh runs SUCCESS on 44+ completed lanes at 39bd9f73; Test, Windows render tests, and 9 regression shards IN_PROGRESS (started 03:26–03:28Z). If dompurify / marked were consumed elsewhere on main, Preflight/Lint/Build/Typecheck would be red — all SUCCESS. Not stamping on unfinished lanes, but no lane has flipped red and code merit is clear.

Prior review's substantive verification carries

The 4,100-line storyboard removal, its no-deletions guard-allowlist entries, and my prior visual pass on the fileDrop-vs-dragOverlay swap are all pinned at identical patch-ids to my prior stamp. Nothing to re-review at the file level.

Stamp mechanics

hf-oss require_last_push_approval=true → this APPROVE binds to 39bd9f73 only.

— Review by tai (pr-review)

@miguel-heygen
miguel-heygen merged commit a25da94 into main Sep 19, 2026
64 checks passed
@miguel-heygen
miguel-heygen deleted the feat/remove-storyboard-view branch September 19, 2026 03:47

This branch was successfully deployed

1 active deployment
staging - docs 39bd9f73 Deployed Sep 19, 2026 by mintlify[bot]
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.

2 participants