Skip to content

Review rounds get caps; reading time follows the film's Pace instead of fixed seconds - #57

Merged
ZLHad merged 4 commits into
mainfrom
claude/review-caps-text-pace
Oct 4, 2026
Merged

ZLHad merged 4 commits into
mainfrom
claude/review-caps-text-pace

Conversation

@ZLHad

@ZLHad ZLHad commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Why

A studio film (two-constellations) ran 11 full independent review rounds: every fresh reviewer found new taste nits, the scores hovered at 7–9, and small fixes sometimes broke something else. The maintainer, verbatim:

我觉得可以了 其实我觉得也不必要你每次这么十几轮审阅 太多了 给项目加一个限制,每一种问题不超过5次,总共不超过10次,不要为了一个小问题就全部来一遍Review。另外,项目中关于字的节奏也不要写死间隔时间,有的时候太慢。

1. Caps on review rounds

Where the loop is defined: templates/TASTE_CHECKLIST.md (scoring layer), CLAUDE.md / AGENTS.md (effort table, a new 评审有上限 paragraph, hard rule 4), playbook/01 (stage 7, unattended mode), playbook/02 (layer 5), both READMEs, templates/NOTES.md, templates/REVIEW.md, video-types/09.

  • Total cap: at most 10 full review rounds per film (a fresh-context reviewer scoring all 8 dimensions over the whole film). At the cap: ship, or take the scores and remaining items to gate ③.
  • Per-issue cap: the same kind of issue (one checklist item on one shot or segment) gets at most 5 fix-and-check cycles, then it goes into NOTES as a known limitation with its last evidence, for the human. A floor item at the cap goes to the human too, never shipped silently.
  • Small fixes don't trigger a full round: a local fix is checked on its own span (frames and strips, the automated checks covering it, the author's look). A new round is for structural changes or the final pass.
  • Minimums unchanged: standard 1 round; studio ≥ 3, all 8 ≥ 8. The draft-count cell stays "不设上限,直到过线" and points to the review cap.
  • Log: NOTES gets 评审记录 (one line per round), a 问题计数 table (issue | rounds so far | status) and 已知局限.
  • Regressions: when a later round contradicts an earlier one on a taste item, the author may keep the earlier decision with a DECISIONS line, which goes to the next reviewer with the taste overrides. The reviewer also gets the known limitations and the BRIEF's Pace (so Document auto-merge; match the ruleset file to the live ruleset #5 only FAILs under the floor).
  • bin/vh effort standard|studio prints the caps paragraph.

2. Reading time: no fixed seconds

formula 16 CJK chars 4 CJK chars
floor (【底线】, FAIL) max(1.5 s, CJK/7 + other/20 + 0.8 s), #53's short-label rule 3.1 s 1.5 s
relaxed target CJK/4.5 + other/15 + 1.0 s 4.6 s 1.9 s
normal target (default) CJK/6 + other/18 + 0.8 s 3.5 s 1.5 s
brisk target CJK/7 + other/20 + 0.8 s (= the floor) 3.1 s 1.5 s

(old rule: max(2.5 s, CJK/4.5 + other/15 + 1.5 s): 5.1 s and 2.5 s)

  • New BRIEF Spec line - Pace: relaxed | normal | brisk, default normal.
  • Tuning: brisk equals the floor. The 8 CJK/s + 0.3 s first proposed for brisk is under the floor at every length, so it could never warn. Relaxed keeps lemo's reading speeds with a 1.0 s pad instead of 1.5 s. Normal sits between them, with the Latin rate scaled to match. 20 other chars/s is about 240 wpm, close to Brysbaert's (2019) meta-analytic silent reading mean of 238 wpm for non-fiction. None of these numbers has been tested on viewers; playbook/03 §2 says so.
  • Text the viewer already knows and short labels may run at brisk; text on a musical grid ends on a bar line instead of being padded; a WARN is "take a look", and a sheet of WARNs means the Pace or the word count is wrong.
  • tools/readcheck.py: --pace, else the nearest BRIEF.md's Pace line, else normal. FAIL (exit 1) only under the floor, WARN (exit 0) under the target; output OK / WARN / FAIL. data-pace on a clip/scene (nearest wins, sub-compositions included) and "pace" in texts.json; --export writes it. --mode label / data-read="label" kept and folded in (target = brisk). --cjk-cps/--latin-cps/--pad/--min kept; they retune the target only. --budget shows the pace's target and the floor; bin/vh readcheck -h prints the rules. tools/rhythm.py follows (red under the floor, amber under the target, the project's Pace).
  • Places that restated 2.5 s: TASTE_CHECKLIST Document auto-merge; match the ruleset file to the live ruleset #5, playbook/03 §2, CLAUDE.md floor list, BRIEF Text rules, STORYBOARD checklist, video-types/01's prompt block, five style presets (four others keep their 2.5 s holds as style beats), the recipes (black-card / breath-title-card / brand-imprint-open recomputed at normal: holds 46 / 62 / 45 frames, with their durations, QA frames and index rows; sequence budgets say 读时 instead of ≥ 75 frames), cases/promo-video-shotcraft.md, a current-state line in docs/research/04 (zh, en).
  • Subtitles are unchanged (Netflix ceilings + 1.8 s floor): the voice sets their pace.

Verification

  • tools/ci.sh --committed and VH_BASH=/bin/bash tools/ci.sh --committed: all checks passed.
  • With linters, as on Linux CI: a shellcheck shim (uvx --from shellcheck-py shellcheck) on PATH and uv run --no-project --with pyflakes -- bash tools/ci.sh --committed: shellcheck -S warning and pyflakes pass, all checks passed.
  • New CI tests: the --budget lines; a WARN band at normal with exit 0, while a label and a "pace": "brisk" text pass at the floor; FAILs under the floor and under 1 s; the BRIEF's Pace (relaxed) and --pace brisk overriding it; a bad pace refused (exit 2); a project made by bin/vh new carries Pace: normal, and readcheck reads it.
  • By hand: data-pace inheritance into a sub-composition and a bad data-pace note; bin/vh rhythm with a WARN and two FAILs; bin/vh recipes check 32/32.

After independent review

A fresh-context review asked for changes; these went in before merging:

  • The floor is Videos move to a GitHub release; the intro film is re-paced to 103 s; the READMEs are rewritten #53's short-label rule again, max(1.5 s, CJK/7 + other/20 + 0.8 s). The first version had lowered it to 1 s and +0.5 s while saying it kept it, and that rule is the one the approved 103 s intro film was cut to ("not a flash either"). normal's pad is 0.8 s too, so the paces never cross. Recipes and CI recomputed.
  • Style holds that are part of a style (editorial-data, monumental-scifi, symmetry-pastel, dark-math) stay 2.5 s, marked as style beats; type 01's question card stays a 2–3 s pause to think.
  • Caps: studio's three rounds run even between small fixes; a gate ③ return restarts both counts; a floor FAIL at its cap goes to the human and never ships as final (unattended output is labelled). Changing Pace needs a DECISIONS line and, when the human owns rhythm, their say.
  • bin/vh new writes Pace relaxed for math and paper, brisk for meme.
  • 7 CJK chars/s is marked as an assumption; product-film-60s's breath beats are rhythm, not reading time.
  • A targeted re-review approved; its two one-line nits are fixed.

ZLHad added 4 commits October 4, 2026 12:36
…of fixed seconds

A studio film's independent review ran 11 full rounds: each fresh reviewer
found new taste nits, scores hovered at 7-9, and small fixes sometimes broke
something else. The maintainer asked for at most 5 rounds per kind of issue,
10 in all, no full review for a small fix, and no hard-coded text intervals
("有的时候太慢").

Review caps (TASTE_CHECKLIST scoring layer, CLAUDE.md/AGENTS.md, playbook/01
and 02, READMEs, NOTES/REVIEW templates, video-types/09):
- at most 10 full review rounds per film, then ship or go to gate 3;
- the same kind of issue (one checklist item on one shot or segment) gets at
  most 5 fix-and-check cycles, then it is a known limitation for the human;
- a local fix is rechecked on its own span (frames, strips, the automated
  checks, the author's look); a new round is for structural changes or the
  last pass;
- minimums unchanged (standard 1, studio >= 3 with all eight >= 8);
- a later round contradicting an earlier one on a taste item may be
  overruled with a DECISIONS line;
- NOTES gets a one-line-per-round log, a per-issue counter and known
  limitations; bin/vh effort prints the caps.

Reading time:
- floor (TASTE_CHECKLIST #5): one brisk read, CJK/7 + other/20 + 0.5 s,
  never under 1 s; no fixed 2.5 s minimum;
- target (taste default): BRIEF "- Pace: relaxed | normal | brisk",
  default normal: relaxed CJK/4.5 + other/15 + 1.0 s, normal CJK/6 +
  other/18 + 0.6 s, brisk = the floor;
- tools/readcheck.py: --pace, else the nearest BRIEF's Pace, else normal;
  FAIL (exit 1) under the floor, WARN (exit 0) under the target; data-pace
  and "pace" per text; labels use brisk; old flags retune the target only;
  --budget and -h describe both; bin/vh rhythm draws WARNs amber;
- playbook/03 §2 explains the numbers; templates, recipes (three recomputed
  at normal), style presets, a case and research note 04 stop restating
  2.5 s; CI covers the new rules.
- The floor is max(1.5 s, CJK/7 + other/20 + 0.8 s) again: the rule the
  intro film was cut to and the maintainer approved ("not a flash").
  The PR had lowered it to 1 s and +0.5 s while saying it kept it.
  brisk = the floor; normal's pad 0.6 -> 0.8 so the paces never cross.
  Recipes recomputed (black-card 46, breath-title-card 62,
  brand-imprint-open 45 frames), CI expectations updated.
- Style presets keep their own 2.5 s holds as style beats (editorial-data,
  monumental-scifi, symmetry-pastel, dark-math); type 01's question card
  is a 2-3 s pause to think again.
- Caps: studio's three rounds run even between small fixes; a gate 3
  return restarts the counts; a floor FAIL at its cap goes to the human
  and never ships as final. Changing Pace gets a DECISIONS line.
- bin/vh new: Pace relaxed for math and paper, brisk for meme.
- 7 chars/s is marked as an assumption; product-film-60s's breath beats
  are rhythm, not reading time.
@ZLHad
ZLHad marked this pull request as ready for review October 4, 2026 05:13
@ZLHad
ZLHad merged commit 92af89b into main Oct 4, 2026
2 checks passed
@ZLHad
ZLHad deleted the claude/review-caps-text-pace branch October 4, 2026 05:13
ZLHad added a commit that referenced this pull request Oct 4, 2026
…of fixed seconds (#57)

- Review caps (TASTE_CHECKLIST scoring layer, CLAUDE.md / AGENTS.md, playbook/01 and 02, READMEs, NOTES and REVIEW templates): at most 10 full review rounds per film and 5 fix-and-check cycles per issue; a local fix gets a check of its own span, not a new round; studio's three rounds still run; a gate 3 return restarts the counts; a floor FAIL at its cap goes to the human and never ships as final. bin/vh effort prints the caps.
- Reading time has no fixed seconds. The floor (TASTE_CHECKLIST #5) is one brisk read, max(1.5 s, CJK/7 + other/20 + 0.8 s), the short-label rule from #53. A new BRIEF line, Pace: relaxed | normal | brisk, sets the comfortable target (relaxed CJK/4.5 + other/15 + 1.0 s, normal CJK/6 + other/18 + 0.8 s, brisk = the floor); bin/vh new writes relaxed for math and paper, brisk for meme.
- tools/readcheck.py: FAIL under the floor, WARN under the target; --pace, data-pace and "pace" in texts.json; --budget shows both. bin/vh rhythm draws red and amber to match.
- Docs that restated 2.5 s follow the rule: templates, playbook/03, video-types/01, five style presets (four keep 2.5 s as a style beat), recipes recomputed (black-card 46, breath-title-card 62, brand-imprint-open 45 frames), docs/research/04.
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