refactor(studio): remove the storyboard view and its Storyboard/Preview switch - #4140
Conversation
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
terencecho
left a comment
There was a problem hiding this comment.
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 intypes.ts(removes "the Studio's storyboard view" mention).STORYBOARD.mdformat docs preserved inskills/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+resolveProjectSignaturestay inpackages/studio-server/src/routes/projects.ts(docstring cleanup only). Client-sideuseProjectSignaturePollis the only reader that's removed — the endpoint stays for external consumers as claimed. docs/studio/storyboard.mdxdeleted (the page itself), nav indocs/docs.jsonupdated to drop it, cross-links fromdocs/guides/{faceless-explainer,general-video,pr-to-video}.mdx+docs/help.mdx+docs/studio/{index,troubleshooting}.mdxall 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)
a706ae4 to
9e1a6d0
Compare
terencecho
left a comment
There was a problem hiding this comment.
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 at9e1a6d03, 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/.jsin packages/skills/scripts/docs forStoryboardView,StoryboardGrid,ViewModeContext,FramePoster,useProjectSignaturePoll,useStoryboard,?view=storyboard,output=storyboard,studioLandingSearch— only surviving mentions are inside theALLOWED_DELETIONSguard map itself. - Preserved surfaces intact:
packages/core/src/storyboard/module + parsers,STORYBOARD.mdformat spec in skills, 4 vendored skill parsers with parity test,GET /api/projects/:id/signatureserver route. check-no-main-deletions.mjsguard entries match every deleted file 1:1.- Before/after captures (
/tmp/hf4140_captures/{before,after}.pngfrom my first-hand pass this session): toggle removed fromStudioHeader, 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)
…toryboard mode went
9e1a6d0 to
39bd9f7
Compare
terencecho
left a comment
There was a problem hiding this comment.
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.json—indexblob-hash change only. Pre-image differs because intervening main touched a neighbouring dep entry, so the "before" is different. The-dompurify+-markedremovals themselves are byte-identical.skills-manifest.json— two skills whose pre-image hashes rotated on the new base (faceless-explainerandhyperframes). 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)
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 previewstops choosing a landing view and hands out the plain#project/<name>link.The storyboard file format and its parser stay:
STORYBOARD.mdand@hyperframes/core/storyboardare 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.
After
The switch is gone and the preview is the only surface. Same project and viewport; an old
?view=storyboardlink also lands on the preview.What was removed
components/storyboard/folder,useStoryboard, the view-mode context, the header switch, the hidden-shell prop inEditorShell, the "Storyboard mode" feedback preset, the storyboard fixture project, anduseProjectSignaturePoll(its only readers were the deleted board).storyboardthumbnail output mode.studioLandingSearchand theprojectDirargument that only fed it.?view=storyboard.dompurify,marked) that only the board used.Why the thumbnail mode could go
output=storyboardwas requested from one place:FramePoster.tsx:62on the base commit. That file is deleted here. The remaining references were the route itself and its two tests. Searched withgit grep -n 'output=.storyboard\|"storyboard"'on the base commit acrosspackagesandskills.Kept on purpose
GET /api/projects/:id/signatureandresolveProjectSignaturein studio-server stay: it is public server API, and only the Studio poller was removed.@hyperframes/core/storyboardstays, tied to the skills' vendored parsers byvendoredParity.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.mdstaying 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.mdskills/hyperframes-cli/SKILL.mdskills/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.mdskills/media-use/references/memory.md,skills/media-use/scripts/recipe.mjsVerification
Run on a built Linux checkout:
packages/studio: 450 files, 4996 tests pass;tsc --noEmitclean.packages/studio-server: 38 files, 553 tests pass.packages/clipreview.test.ts: 33 pass.packages/corestoryboard tests: 30 pass.oxlintclean;fallowreports nothing introduced by this branch.bun install --frozen-lockfileaccepts the trimmed lockfile.