Skip to content

Put a floor under the camera, and make its height a setting - #6

Merged
Slicit merged 1 commit into
mainfrom
feat-wind-gate
Sep 9, 2026
Merged

Slicit merged 1 commit into
mainfrom
feat-wind-gate

Conversation

@Slicit

@Slicit Slicit commented Sep 9, 2026

Copy link
Copy Markdown
Owner

A cap answers how loud a camera move is allowed to be. It never answers whether it should blow at all, and that second question is the one somebody in the seat is actually asking. Measured across two 15-minute cuts, capping alone left the fan on for 75% of an action sequence and 71% of a dialogue-heavy film, nearly all of it a murmur below the cap produced by nothing but the camera moving.

wind.series takes a gate now: below it, with nothing in the film agreeing, a moving camera is not wind and the fan is off.

Why 0.25

Both cuts, seven heights:

gate Rebel Moon silent Wanted silent caused (both)
none 24.6% 29.4% 19.3% / 12.4%
0.15 45.9% 56.9% unchanged
0.25 59.3% 68.3% unchanged
0.45 74.2% 83.1% unchanged

The caused column never moves. A cause is never gated, so raising this can only ever remove wind the camera invented, and no height costs a gust the film actually gave. There is a test asserting that at four heights including 1.0.

Not a deletion, deliberately: a forward dolly is real evidence of travel and is sometimes the only evidence there is, which is why the cap was a cap. This lets it speak quietly and stops it muttering.

The setting

The height is a judgement about a room and a fan, and the person who owns those should not have to own wind.py. This is the studio's first server-side setting, so it arrives with somewhere to live: analysis.json beside the scores, /api/analysis, and an Analysis page in the admin. Global rather than per film — "how much wind do I want in this room" has the same answer for every film in it, and a setting that must be given twenty times is one nobody changes.

Two details worth keeping:

  • The stored field is a pointer, because zero is a real answer meaning the floor is off, and a plain float cannot tell that from a file that does not mention it.
  • A Go test reads CARRIED_GATE out of wind.py and fails if the two languages disagree about the default. Nothing else connects them, and a studio quietly passing a different number would produce scores that behave unlike the composer's own documentation, with no symptom anybody could name. Mutation-tested.

Nothing here touches a score that already exists, and the page says so — a number changing while nothing moves is how a setting earns a reputation for doing nothing.

758 unit tests, 18 browser specs (two new, driving the slider through the API to the file and back), 318 composer tests.

🤖 Generated with Claude Code

A cap answers how loud a camera move is allowed to be. It never answers
whether it should blow at all, and that second question is the one somebody in
the seat is actually asking. Measured across two fifteen minute cuts, capping
alone left the fan on for 75 per cent of an action sequence and 71 per cent of
a dialogue-heavy film, nearly all of it a murmur below the cap produced by
nothing but the camera moving.

wind.series takes a gate now: below it, with nothing in the film agreeing,
a moving camera is not wind and the fan is off.

0.25, from measuring both cuts at seven heights. They go silent for 59 and 68
per cent of their running time against 25 and 29 before. What makes the height
cheap to choose is that it costs nothing real: a cause is never gated, so the
caused fraction is identical at every height tried, 19.3 per cent on one film
and 12.4 on the other. Raising this can only ever remove wind the camera
invented. There is a test that says so at four heights including 1.0.

Not a deletion, deliberately. A forward dolly is real evidence of travel and
is sometimes the only evidence there is, which is why the cap was a cap. This
lets it speak quietly and stops it muttering.

The height is a setting because it is a judgement about a room and a fan, and
the person who owns those should not have to own wind.py. It is the first
server-side setting this studio has had, so it arrives with somewhere to live:
analysis.json beside the scores, an /api/analysis endpoint, and an Analysis
page in the admin. Global rather than per film, because "how much wind do I
want in this room" has the same answer for every film in it, and a setting
that must be given twenty times is one nobody changes.

Two details worth keeping. The stored field is a pointer, because zero is a
real answer meaning the floor is off and a plain float cannot tell that from a
file that does not mention it. And a Go test reads CARRIED_GATE out of wind.py
and fails if the two languages disagree about the default: nothing else
connects them, and a studio quietly passing a different number would produce
scores that behave unlike the composer's own documentation with no symptom
anybody could name.

Nothing here touches a score that already exists. The setting says so on the
page, because a number changing while nothing moves is exactly how a setting
earns a reputation for doing nothing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Slicit
Slicit merged commit 7f4acc5 into main Sep 9, 2026
9 checks passed
@Slicit
Slicit deleted the feat-wind-gate branch September 9, 2026 22:15
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