Automated release: version and notes generated from pull requests merged since 1.11.1.
Added
- Fonts by script.
caption.py,graphics.pyandoverlay.py --textdetect the writing system of the text they are about to draw (Japanese, Chinese, Korean, Arabic, Hebrew, Devanagari, Thai, Cyrillic, Greek) and resolve a font file that actually covers it —fc-list :lang=xxon Linux/macOS, the known system fonts on Windows — printing one line:font: /usr/share/fonts/.../wqy-zenhei.ttc (covers ko). A machine where fontconfig reports no font for the script fails the job (kind: input, with per-OS install hints) instead of writing a video full of empty boxes that ffmpeg reports as a success; a machine with no working fontconfig at all isunknown, notmissing, and the job runs with the font as given behind one info line. An explicit--font, an explicit--font-file, or a font your brand file itself names is always kept (a brand file that never mentions a font is not a choice — the script still picks one); when fontconfig says the stated font does not cover the text, one info line says so.caption.py --fonts-diris searched first and checked withfc-scan: a directory that does not cover the script gets one line and a font resolved by script anyway. --lang XXoncaption.py(an alias of the existing--language, which keeps tagging the subtitle stream under--mode muxand setting--transcribe's language) and ongraphics.py, plus"lang"in brand.json: the hint that says whether Han-only text is Chinese, Japanese or Korean. Everything else is read from the characters.doctor'sfontscapability gainsscripts:available/missing/unknownper writing system with the font file it would use, so "can this machine render Korean captions" is answered before the job. The plain-textdoctorsummarises it on one line and stays short.- Captions people can read. Every cue is wrapped to the safe area by measured width — a per-character table for Latin (read off DejaVu Sans, so a line of capitals measures as wide as it draws), a full em per CJK/Thai character, 0.6 for Arabic/Hebrew, 0.7 for Devanagari, and nothing at all for a combining mark, which never gets separated from the character it belongs to (Thai tone marks and vowel signs, Devanagari matras, Arabic and Hebrew points). Lines break between characters for CJK/Thai and at spaces otherwise.
--max-lines N(default 2) splits a cue that needs more lines into consecutive cues sharing its time;--min-duration S(default 1.0) holds a flashed cue longer, never past the next cue's start;--offset TIMEshifts every cue for--text,--srtand--assand takes the skill's timestamp grammar (seconds,mm:ss,hh:mm:ss.ms, SMPTEhh:mm:ss:ff, with a leading-for earlier). Onecues:line reports what changed, and a file you passed in is never edited in place — the adjusted copy is written next to the output and burned instead. Under--dry-run/--planthe planned command names that same copy and the plan records where it comes from, while nothing is written until the real run.--min-duration/--offsetalso work with--write-srtalone;--max-linesneeds the input video, whose frame size sets the line width. --karaokeuses real per-word timings when the transcript has them (a whisper<stem>.json/<stem>.words.jsonnext to the SRT), falling back to the existing energy or even split.- brand.json
styles.caption({font, size, colour, box, position}, either spelling of colour) — one caption look shared bycaption.pyand, forfontandcolour,graphics.py. The older top-levelcaptionblock still works and still carries the burn-in-only defaults. render.pyprojects passlang,offset,max_linesandmin_durationthrough to the captions stage, andlangto a graphics entry.
Changed
doctor's plainfonts:line carries the default font'sdetailin brackets when the status is notavailableand the detail is short enough to keep the line to one screen width; longer detail stays--jsononly.references/gotchas.mdon RTL:caption.pyshapes and reorders Arabic and Hebrew by construction (everything it draws goes through libass);drawtext(overlay.py --text,graphics.py) does too on a build with--enable-libfribidi/--enable-libharfbuzz, and only an older build draws unjoined logical order.tests/fixtures/mcp_tools.jsonregenerated:captiongainslanguage(spelled--langtoo),offset,max_lines,min_duration;graphicsgainslang.
Docs
- Correction to the 1.11.1 entry: iteration 11's agents did not read
references/gotchas.mdorreferences/scripts.md(0 of 36 and 2 of 36 actual reads; the earlier counts matched the file names inside SKILL.md's own text). What 1.11.1 changed in practice, measured in iteration 12:doctorbefore a job 23 of 36 runs → 0,--json-briefon a writing step 4 of 36 → 23. Tokens per run are flat (72.2k → 71.8k) because about 64k of every run is the harness's own context, not the skill. - feat: fonts by script (ja zh ko ar he hi th ru el), doctor per-language fonts, captions that wrap and fit (#218)
- evals: 14 multilingual prompts (zh ko es pt fr de ar), 7 trigger queries, per-language grader rules (#217)
- docs: eval iteration 12 at 1.11.1 (36 prompts); correct iteration 11's transcript counts (#216)
What's Changed
- docs: eval iteration 12 at 1.11.1; correct iteration 11's transcript counts by @kajisho5 in #216
- evals: multilingual prompts (zh ko es pt fr de ar), trigger queries, per-language grader rules by @kajisho5 in #217
- feat: fonts by script (ja zh ko ar he hi th ru el), doctor per-language fonts, captions that wrap and fit by @kajisho5 in #218
Full Changelog: v1.11.1...v1.12.0