Skip to content

Intro film v5: a Blender galaxy opening, 150.5 s, and HD players in the READMEs - #51

Merged
ZLHad merged 4 commits into
mainfrom
claude/intro-v5
Oct 2, 2026
Merged

ZLHad merged 4 commits into
mainfrom
claude/intro-v5

Conversation

@ZLHad

@ZLHad ZLHad commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Why

The intro film's v3 (81 s, all WebGL) read as cheap effects, and "many films" was only a claim. v5 opens with a Blender render where every star is a film, then follows one request through the repo. You also asked for every sample to play inside the README, in HD, with a small ZLHad/OpenVideoHarness mark in a corner.

Changes

  • showcase/04-intro-film is v5 (150.5 s, 1080p30). v3's notes and media move to v3/.
    • 0–15.8 s: Blender 5.2 Cycles (blender/galaxy.py, GPL-3.0-or-later; the rest of the repo stays MIT). 475 frames, about 1 h 28 min on an M-series GPU, with motion blur from per-vertex velocity.
    • 15.0–15.6 s: the plate dissolves into the WebGL grid with the same camera (tools/export_state.py exports it without starting Blender).
    • After that: one request runs through the body. It's showcase 02's question: its type lights up, the gates' doors show its outline, storyboard and draft sheet, the loop fails three of its frames, and the final cut plays its video.
    • js/tmap.js lengthens 26 holds so each line meets the reading-time floor. The story runs on the mapped time; ambient motion runs on film time.
    • tools/retime.py lengthens the score with the same map (whole beats, held breaths), and tools/build_audio.sh rebuilds the mix.
  • Inline players in the READMEs. GitHub user-attachments, 1080p, ≤ 10 MB each, with the corner mark.
    • Samples table (both READMEs): each cell has a player plus a link to the original file.
    • Showcase 00–03 and styles/README.md: the player replaces the GIF at the top.
    • The intro: the hero shows chapter 1, and its own README has all eight chapters.
  • Lessons into the docs.
    • playbook/02: camera continuity checked by numbers; a failed async build that nobody saw.
    • playbook/08: atmosphere layers draw first; amber type below the glare threshold.
    • engines/blender.md: measured speeds.
    • Recipes: gate-as-door, one-take, decode-type.
    • Also video-types/03, CLAUDE.md / AGENTS.md, and a CHANGELOG entry.

Checked

  • tools/ci.sh --committed, with shellcheck and pyflakes, also under VH_BASH=/bin/bash: all checks passed. The first push failed Linux CI on shellcheck, which I hadn't installed locally; fixed in the second commit.
  • bin/vh check on media/final.mp4: no black, frozen or silent stretch; BT.709 tags.
  • bin/vh qa: 62/62 cues within a frame, −14.0 LUFS, −1.65 dBTP.
  • Camera continuity via a frame-difference curve, Blender plate and the whole film. Blender determinism: PSNR 71.3 and 47.3 dB.
  • Five fresh-context reviews, 8 scores each (table in the showcase README). Round 4 reached 8+ on concept, desktop read and accuracy. Round 5's fixes are in this cut but were not reviewed again, at your request.
  • Reproducing: tools/film_atlas.py rebuilds films.jpg byte for byte; rendering audio/score.base.json rebuilds audio/music.beats.json byte for byte; tools/retime.py reproduces score.json, events.json and index.html.
  • Relative links in the changed READMEs resolve. docs/design-notes/ isn't included.
  • The README players load for a logged-out visitor (checked on this branch in a browser that isn't signed in: all 7 on the front page and all 8 chapters). Chapters 2–8 were re-uploaded without a picture fade-in, because GitHub's player shows frame 0 as the thumbnail.

Not done / known

  • Review round 1 found a blocker (shellcheck) and nine should-fixes; all addressed in the second commit except the repo size (below). Not changed: the caret in the terminal blinks on story time, so it vanishes for 4.8 s in the stretched hold (fixing it means a full re-render); the corner mark is hard to read over the busiest frames.

  • Not every score reached 8: variety is 6.

  • 150.5 s is long for an intro.

  • bin/vh qa reports about 190 click warnings from the score's gated saw (not checked by ear).

  • media/final.mp4 is 48 MB (2.5 Mbps). The clone grows from about 330 MB to about 530 MB (the README and install.sh say so). Moving v3's media out of the tree wouldn't shrink a clone, since history keeps it; a shallow clone in install.sh would, as a separate change.

ZLHad added 4 commits October 2, 2026 23:14
…ME; Blender large-scene notes

- overview/architecture SVGs, CITATION.cff, recipes/README: 31 styles, 13 playbook docs, 30 reference repos, 9 types
- README (en/zh): styles are references, not templates; quick's checks; concept cards in the FAQ; research note 06;
  the reel is 46 s; the bin/vh table lists new flags, style compare/apply, storyboard/rhythm/cover-preview
- README: code-driven Blender as a feature (badge, a bullet, a section)
- engines/blender.md: lessons from the intro film's opening (numpy-driven point clouds, velocity motion blur,
  no denoiser on stars, camera up vector, nodexpr, chunked resumable renders, Metal determinism)
- styles/_swatch/lib.js: color(tokens, 'fg') falls back to ink/text before magenta (pastel-ui names its foreground ink)
- showcase 00/01 READMEs: mix figures re-measured after the #40 sound refresh; build_audio.sh comments: 21 built-ins
…he READMEs

- showcase/04-intro-film is now v5: 0–15.8 s rendered in Blender (Cycles, a galaxy of films),
  the rest in HyperFrames + Three.js, one camera handed across the dissolve. v3 moves to v3/.
- The film follows one request (showcase 02's question) through the router, the gates and the
  self-review loop to the finished short. A time map (js/tmap.js) lengthens holds so every line
  meets the reading-time floor; the score is retimed with the same map.
- READMEs: the samples play inline (GitHub user-attachments, 1080p, a small corner mark); the
  intro plays as eight chapters. Each sample links its original file.
- Lessons into playbook/02 and 08, engines/blender.md, recipes; CHANGELOG entry.
…e Reproduce block

- tools/deliver.sh and tools/build_audio.sh pass shellcheck; deliver.sh drops the unused 720p clip and WebP preview and
  cuts the eight README chapters instead (tools/chapters.sh, tools/watermark.sh, now in the repo).
- audio/music.beats.json (the body score's beat map, which js/main.js reads for its pulses) is committed; rendering
  audio/score.base.json reproduces it byte for byte, and a missing map now logs a warning instead of failing silently.
- Reproduce: npm i (no lockfile), the shader export before the atlases, film_atlas.py pinned to the 41 rows the film
  was made with (the rebuilt films.jpg is byte-identical), Blender steps marked macOS only (bl.sh says so and exits).
- The hand-over is 15.0–15.6 s everywhere; the Blender determinism figures say which plate they are from; the asset
  ledger covers the AI stills, atlases and v5 audio; showcase docs use showcase paths (NOTES says it is a log).
- README chapter thumbnails: chapters 2–8 re-uploaded without a picture fade-in (frame 0 is the player's thumbnail);
  the 04 cell says it plays chapter 5; exact chapter ranges; the clone is about 530 MB now.
@ZLHad
ZLHad marked this pull request as ready for review October 2, 2026 18:58
@ZLHad
ZLHad enabled auto-merge (squash) October 2, 2026 18:58
@ZLHad
ZLHad merged commit a881f4f into main Oct 2, 2026
2 checks passed
@ZLHad
ZLHad deleted the claude/intro-v5 branch October 2, 2026 19:01
ZLHad added a commit that referenced this pull request Oct 3, 2026
* install.sh: shallow clone, so a fresh install downloads about 210 MB instead of 350

After #51 a full clone is about 550 MB on disk (351 MB to download), most of
it earlier versions of the sample films kept in the history. The installer now
clones with --depth 1 --single-branch: about 210 MB to download, 420 MB on disk.

Re-running it on a shallow checkout fetches the newest commit with --depth 1
and moves to it with reset --keep (a depth-1 fetch can't be fast-forwarded):
untracked and ignored files (LOCAL.md, projects/) and edits to untouched files
stay; a file it would overwrite, or commits of your own, stop it with a hint.
A full clone keeps git pull --ff-only, since a depth-1 fetch would make it
shallow.

READMEs (en/zh): clone and total sizes (825 MB instead of 935), the "What gets
downloaded" row, a note that contributors who want the history clone normally,
and "To update" says to re-run the install command.

* install.sh: stop before updating a checkout that isn't on a tracking branch; put origin/main back when the reset is refused

Review of the shallow-clone update found two cases:
- On a branch without upstream, or a detached HEAD, the own-commits check
  read a failed rev-list as "no commits", fetched anyway and then blamed
  the user's edits. With an upstream configured but origin/main missing,
  it exited 0 and left a commit of your own behind. It now resolves @{u}
  first and stops with a message if it can't.
- When reset --keep refused, origin/main had already moved to the new
  parentless commit, so after a manual git pull the next run reported
  "commits of your own" that didn't exist, and git status showed
  ahead 1 / behind 1. origin/main is now put back before exiting.

The hint now tells edited files (stash, re-run, stash pop) from untracked
ones (move them out of the way). Docs: "re-run with the same options" and
how to pass them to the one-line install; the download is about 215 MB
(decimal, like the 351 MB of a full clone); v3's README says to fetch
7057c74 first in the installer's clone.

* install.sh: quiet rev-parse on older git; drop the git pull claim; hint for a missing origin/main

- rev-parse -q --verify '@{u}' still prints "fatal: no upstream…" on Apple
  Git 2.39; send it to /dev/null so only the installer's own message shows.
- After a refused reset, the fetched commit stays grafted in .git/shallow, so
  a plain git pull still can't fast-forward (it couldn't before either);
  the comment and CHANGELOG no longer say it can. Re-running the installer
  works.
- When the branch is main but origin/main is missing, the hint now says to
  git fetch.
ZLHad added a commit that referenced this pull request Oct 4, 2026
…he READMEs (#51)

* Docs: counts and wording after #41–#50; a Blender section in the README; Blender large-scene notes

- overview/architecture SVGs, CITATION.cff, recipes/README: 31 styles, 13 playbook docs, 30 reference repos, 9 types
- README (en/zh): styles are references, not templates; quick's checks; concept cards in the FAQ; research note 06;
  the reel is 46 s; the bin/vh table lists new flags, style compare/apply, storyboard/rhythm/cover-preview
- README: code-driven Blender as a feature (badge, a bullet, a section)
- engines/blender.md: lessons from the intro film's opening (numpy-driven point clouds, velocity motion blur,
  no denoiser on stars, camera up vector, nodexpr, chunked resumable renders, Metal determinism)
- styles/_swatch/lib.js: color(tokens, 'fg') falls back to ink/text before magenta (pastel-ui names its foreground ink)
- showcase 00/01 READMEs: mix figures re-measured after the #40 sound refresh; build_audio.sh comments: 21 built-ins

* Intro film v5: a Blender galaxy opening, 150.5 s, and HD players in the READMEs

- showcase/04-intro-film is now v5: 0–15.8 s rendered in Blender (Cycles, a galaxy of films),
  the rest in HyperFrames + Three.js, one camera handed across the dissolve. v3 moves to v3/.
- The film follows one request (showcase 02's question) through the router, the gates and the
  self-review loop to the finished short. A time map (js/tmap.js) lengthens holds so every line
  meets the reading-time floor; the score is retimed with the same map.
- READMEs: the samples play inline (GitHub user-attachments, 1080p, a small corner mark); the
  intro plays as eight chapters. Each sample links its original file.
- Lessons into playbook/02 and 08, engines/blender.md, recipes; CHANGELOG entry.

* Intro v5: fixes from review — shellcheck, the beat map, a reproducible Reproduce block

- tools/deliver.sh and tools/build_audio.sh pass shellcheck; deliver.sh drops the unused 720p clip and WebP preview and
  cuts the eight README chapters instead (tools/chapters.sh, tools/watermark.sh, now in the repo).
- audio/music.beats.json (the body score's beat map, which js/main.js reads for its pulses) is committed; rendering
  audio/score.base.json reproduces it byte for byte, and a missing map now logs a warning instead of failing silently.
- Reproduce: npm i (no lockfile), the shader export before the atlases, film_atlas.py pinned to the 41 rows the film
  was made with (the rebuilt films.jpg is byte-identical), Blender steps marked macOS only (bl.sh says so and exits).
- The hand-over is 15.0–15.6 s everywhere; the Blender determinism figures say which plate they are from; the asset
  ledger covers the AI stills, atlases and v5 audio; showcase docs use showcase paths (NOTES says it is a log).
- README chapter thumbnails: chapters 2–8 re-uploaded without a picture fade-in (frame 0 is the player's thumbnail);
  the 04 cell says it plays chapter 5; exact chapter ranges; the clone is about 530 MB now.

* Intro v5: cut the README chapters after the final check; chapters.sh is executable
ZLHad added a commit that referenced this pull request Oct 4, 2026
* install.sh: shallow clone, so a fresh install downloads about 210 MB instead of 350

After #51 a full clone is about 550 MB on disk (351 MB to download), most of
it earlier versions of the sample films kept in the history. The installer now
clones with --depth 1 --single-branch: about 210 MB to download, 420 MB on disk.

Re-running it on a shallow checkout fetches the newest commit with --depth 1
and moves to it with reset --keep (a depth-1 fetch can't be fast-forwarded):
untracked and ignored files (LOCAL.md, projects/) and edits to untouched files
stay; a file it would overwrite, or commits of your own, stop it with a hint.
A full clone keeps git pull --ff-only, since a depth-1 fetch would make it
shallow.

READMEs (en/zh): clone and total sizes (825 MB instead of 935), the "What gets
downloaded" row, a note that contributors who want the history clone normally,
and "To update" says to re-run the install command.

* install.sh: stop before updating a checkout that isn't on a tracking branch; put origin/main back when the reset is refused

Review of the shallow-clone update found two cases:
- On a branch without upstream, or a detached HEAD, the own-commits check
  read a failed rev-list as "no commits", fetched anyway and then blamed
  the user's edits. With an upstream configured but origin/main missing,
  it exited 0 and left a commit of your own behind. It now resolves @{u}
  first and stops with a message if it can't.
- When reset --keep refused, origin/main had already moved to the new
  parentless commit, so after a manual git pull the next run reported
  "commits of your own" that didn't exist, and git status showed
  ahead 1 / behind 1. origin/main is now put back before exiting.

The hint now tells edited files (stash, re-run, stash pop) from untracked
ones (move them out of the way). Docs: "re-run with the same options" and
how to pass them to the one-line install; the download is about 215 MB
(decimal, like the 351 MB of a full clone); v3's README says to fetch
c649392 first in the installer's clone.

* install.sh: quiet rev-parse on older git; drop the git pull claim; hint for a missing origin/main

- rev-parse -q --verify '@{u}' still prints "fatal: no upstream…" on Apple
  Git 2.39; send it to /dev/null so only the installer's own message shows.
- After a refused reset, the fetched commit stays grafted in .git/shallow, so
  a plain git pull still can't fast-forward (it couldn't before either);
  the comment and CHANGELOG no longer say it can. Re-running the installer
  works.
- When the branch is main but origin/main is missing, the hint now says to
  git fetch.
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