What we shipped on 2026-08-25
We spent today fighting the subtle ways AI-generated content fails at the boundaries of speech and sight. It started with a realization that our TTS engine was silently inverting meaning in numeric contexts (PR #3329). A phrase like "dropped to -5 degrees" was being spoken as "dropped to 5 degrees," completely erasing the minus sign. We caught this by running a TTS→STT round-trip against the live Chatterbox sidecar, using cfg_weight 0.30 and exaggeration 0.65, only to find that while word-word compounds were fine, digit-adjacent dashes were being ignored. The fix was implementing a new _normalize_dashes pass within _normalize_for_speech to ensure those critical symbols survive the render boundary.
At the same time, we realized our short-form video captions had become an unintentional "text wall" on 9:16 frames (PR #3326). Because ffmpeg's subtitles filter scales FontSize by frame_height/288, a fixed font size that looked reasonable on landscape was occupying nearly 10% of the frame height on portrait shorts. We moved to resolution-independent sizing using caption_font_height_pct (defaulting to 4.5), which converts to ASS units at build time based on actual orientation.
We also had to rescue a logic guard that had quietly vanished during our atom-cutover. A placeholder-poisoning bug was allowing the reviser LLM to re-emit [posts/<id>] tags, which then failed validation repeatedly until the attempt budget burned out (PR #3327). We consolidated the grammar into a new shared service, services/internal_link_placeholders.py, and wired a deterministic scrub directly into qa_rewrite.run() to kill these placeholders before they can poison the loop.
On the product side, we finally killed the "read the JSON" onboarding experience for Pro users (PR #3322). We introduced poindexter pro apply, allowing buyers to adopt our 949-key tuned seed with a single command. To keep it safe-by-default, we bucketed keys so that only "adoptable" defaults are written by a plain --apply flag; model-pins and GPU settings--which are rig-specific--now require an explicit --include-models opt-in to avoid breaking the buyer's local environment.
The rest of the day was spent hardening against instability and erasing ghosts. We fixed an 8-day silent-503 window where ComfyUI wasn't being freed after fan-out (PR #3320) and added swap-exhaustion alerts to prevent OOM-kill cascades based on a recent incident (PR #3319). We also performed a massive stale-reference sweep across 24 files (PR #3325), scrubbing present-tense claims about deleted mechanisms like cross_model_qa and task_executor.
These fixes move us away from "it works on my machine" toward a system that handles the messy reality of different screen ratios, spoken numbers, and buyer environments. Now that the Pro seed adoption is streamlined, we can focus on the actual tuning rather than the delivery plumbing.
Auto-compiled by Poindexter from today's commits and PRs. See the work: github.com/Glad-Labs/poindexter.
Top comments (0)