Five and Six Drawings of One Card
A dub keeps the owner's master as its picture (lesson 6 of this track) and redraws only the lettering that carries words: Pippa's own on-air cards, and in a mobile film's dub also the speakers' names, the synthesized-voice labels, the subtitles, the opening notices and the chapter lettering. Every other pixel is the owner's master. For the first two weeks of dubbing mobile films, each card region carried its own font size, weight, leading and padding, written by whichever session was translating, and the renderer drew whatever it was given. No single choice was wrong. The trouble was that every session made them all again. One dub's Chinese and Japanese cards were drawn five and six times. The next dub's were drawn three times each, and the owner stopped that run mid-render, with a screenshot of the session's own log: a subtitle that now outranked the gold headline being put back in its place, the English sheet refilled too, which would have shifted the regions of an English movie already uploaded, and the type being grown to 50 px for yet another render.
His verdict was about the missing rule, not about any one card: “한번 룰로 정하면? 저렇게 계속 실수를 하는 건 룰이 없다는 건데. 세션마다 처음부터 다시 한다는 거거든” (“Why not settle it once as a rule? Making the same mistakes again and again means there is no rule. It means every session starts from scratch”), 2026-10-19.
One Canonical Scale, and the Children Pay the Tax
The ruling came with its shape, and the shape is the owner's root-class doctrine: one canonical definition, and a child that needs something different pays for it by overriding only what it must, inheriting the rest. beacon/card_type.py defines a root scale, Latin, at the dub canvas's own 1920×1080. It has eight roles: headline, lead, subtitle, body, cell-head, cell, label and caption. Each carries a rank, a weight, a nominal size that is the largest it is ever drawn, a floor it may shrink to, a leading, a padding and a default ink. English is a child that changes nothing. CJK is a child that changes one value, the caption's floor, and Chinese, Japanese and Korean inherit from it. Adding a language is adding a class with its code. The numbers were not invented in the module either. They were read from the cards the owner had already accepted in the uploaded dubs of 2026-10-08 to 2026-10-19, and where those sessions had disagreed with each other the scale took the middle and kept a visible step between ranks.
The Measurement That Had Been Growing the Type
The most instructive thing in the module is what the Chinese and Japanese children do not change: their sizes and leading are the root's. Every Chinese and Japanese size bump in the dubs before the ruling had the same cause, and it was not a reader's need. After a render the workshop reads its own frames back and compares the ink it drew with the ink in the encoded video (track 6's new lesson, "Nothing Burns as a Box", is that instrument). Present, correct Han glyphs at title size read slightly over the strict line of 14: 14.3 for one title face, 15.4 to 16.6 for regular Han at 37 px, 14.03 to 15.02 for bold Han at 42 px. A glyph that is actually missing reads 44 to 77, and a box 51 to 135. Sessions answered a correct glyph's high reading by growing the type until the strict line passed, and that is how the cards lost their hierarchy. The fix went to the instrument: stroke-dense script keeps the looser small-type line up to 56/1080 of the frame's height.
The same line was not wrong every time, which is what makes it a lesson. On 2026-10-18 thin Chinese strokes failing it at 14.6 and 15.3 exposed a real bug: the face index for bold pointed at a regular weight of the font collection, so every bold Han line had been drawn regular beside bold digits and kana. An instrument that sits close to its threshold catches some true faults and some correct work alike. When people answer its readings by changing the product, ask first which kind each reading is.
Sizing Is Mechanical
A region now states only what the master dictates: where the source ink sits (bounds), its ground and its ink, the master's own text inset, wrapping, alignment, a bullet. And it names a role. A region that sets font_size, weight, line_height, padding or paragraph_gap itself is refused; a measured exception lives in an override with a reason, printed at every run and kept in the card lock. Then the layout decides every size once for the whole dub. Each region takes the largest size in its role's range at which its text fits, on one line first and then wrapped, and below the floor it stops by name: the region, its box, its role, the floor, and “shorten its translation”. A role is drawn at one size across a card, the smallest any of its regions needs. The hierarchy is an invariant: a higher rank stays at least 2 px above every lower one on the card, the lower giving way, and if giving way would push the lower one under its own floor, the run stops and tells you to shorten the higher line.
The procedure says it in one line: shorten the translation, never grow the type. A card has a room the master set, and the words have to fit that room. It is the same constraint lesson 6 put on every spoken line.
Bounds Freeze, and an Uploaded Language Is Never Redrawn
The first render of a language writes dub/<language>/card-lock.json: each region's bounds, role and size, and every override with its reason. A later run that moves a drawn region's bounds stops, because bounds are the master's geometry, never a way to make type fit; a region measured wrong is unlocked only by saying why in the rejection log and removing the lock. A language that already has an upload record is never drawn again at all, and a fix there is a revision (track 4's new lesson, "A Correction Is a Successor"). That is the refilled English sheet from the screenshot, turned into a refusal.
The Script's Own Rules Came Along
Settling the scale exposed the other ways CJK lettering had been wrong without anyone choosing it. Lines follow kinsoku: a line never opens on a closing mark or a small kana (2026-10-17 for the boards, 2026-10-26 for opening notices that had kept a greedy wrap of their own). Since 2026-10-26 the wrap also carries a whole run of closing marks down together with the character before them, and an opening bracket standing just before that character goes down with them. That bracket check runs only on this carry. When the break falls before an ordinary character, an opening bracket can still end a line, so the change's own commit message, which says the wrap never leaves one at a line's end, holds only for that case. A number stays whole in a CJK subtitle and is never split at its separator (2026-10-13). And the coverage gate now checks every surface an authored dub burns, names, voice tags, notices, chapter cards and every region, not only the voiced subtitles (2026-10-17). Each was found by measurement and fixed once, in the code every language draws through.
The proof the ruling asked for was a render with no tuning. Two earlier dubs were rendered again in Chinese and Japanese, 18 regions on 3 cards and 24 regions on 12 cards, one pass each, with no readback failure, and the card whose subtitle had once outranked its headline drew the headline at 38 over a 33 subtitle in every language.