What we shipped on 2026-07-09
Two alerts fired on the same post -- hero_render_fallback on shots 4 and 8, vision_scorer_unavailable on 5 of 12 shots -- and pulling that thread unraveled into three separate defects in one sitting (PR #2224). shot_vision_qa.score_shot_frame() was calling the vision model with max_tokens=300 and no think= flag. qwen3-vl burns part of that budget on a <think> trace before it ever gets to the JSON answer -- the same failure mode multi_model_qa._check_image_relevance hit and fixed months ago by raising num_predict from 400 to 1024 (poindexter#563). 300 tokens was smaller than an already-proven-insufficient number. This scorer had been quietly dropping something like 42% of shot scores, which lines up almost exactly with the ~45% figure flagged in the video-quality audit back on 2026-07-02. Chronic, not new -- and nothing had touched this file since.
While we were in there, wan2_1.py's /generate call turned out to be hardcoding timeout=300 on the individual POST, silently stomping the client's _HTTP_TIMEOUT=900.0 -- a value that was explicitly sized for Wan's worst-case cold-load, per its own docstring. That override has been present since the file's first commit. Two bugs, same shape: a smaller, wrong number quietly shadowing a larger, correct one. We bumped the token budget to 1024, fixed the docstring's incorrect claim that no think handling was needed, and let the hero-fallback path surface its actual reason instead of failing mute.
The rest of the day was about making sure this kind of gap gets caught earlier next time. clock_skew_probe.py (#2212) had been wired into brain_daemon.py via a bare try/except but never registered in _BRAIN_REQUIRED_MODULES -- so a real import failure there would never trip the boot-time operator page. Only the Dockerfile-packaging half of that gap got caught before, in #2215. Today's fix (PR #2222) adds an AST-based completeness test that parses brain_daemon.py, finds every _HAS_* flag guarding a from-import, and cross-checks it against the required-modules table in both directions -- catching both a guarded flag with no registration and a registered flag that's gone stale. Its sibling (PR #2221) does the same audit against the Dockerfile itself: the same class of miss has now bitten us three times -- psu_power.py's crashloop (1e3855866), the remediation/ subpackage silently degrading to no-op stubs, and clock_skew_probe again -- because the flat COPY line and the cp-mirror block are hand-maintained lists with nothing forcing them to track the files actually on disk.
Lighter work rounded out the day on the console side: panel header badges (A1/S1/P1/...) got swapped for theme-colored, colorblind-safe icons tied to each panel's rail identity (PR #2223), following up on moving the task-trace board off the landing page into its own TRACE tab and fixing a lopsided masonry column that had five panels crammed into one oversized child (PR #2220). CLAUDE.md's source-truth stats got their routine auto-sync (PR #2225) -- no drama there.
The vision-QA fix is the one that matters. A scorer quietly failing half its shots for this long means every downstream quality signal built on it was working off degraded data -- the audit numbers weren't wrong, they were just describing a symptom nobody had traced to the source yet. We're glad the fix was three small, boring corrections instead of a rewrite. The test-guard pair is the more durable win: the next module wired in with a try/except now has two independent checks standing between it and silently degrading in production.
Auto-compiled by Poindexter from today's commits and PRs. See the work: github.com/Glad-Labs/poindexter.
Top comments (0)