What we shipped on 2026-08-08
We discovered that the Schedule button in our console has been a client-side stub since it first landed (PR #3121). It would remove the row from the local inbox and toast "Scheduled for 09:00 tomorrow," but no API call ever happened. Prod confirmed the suspicion: zero posts at status='scheduled'. We finally wired this through to the backend, ensuring publish_at triggers the staging call before promoting via scheduling_service.assign_slot.
That realization sparked a wider cleanup of how we handle timing. We moved social promo scheduling out of the Postiz UI and into Poindexter (PR #3120). Relying on Postiz's scheduler was risky; if a post's main publish slipped, the social promo would fire at a 404. By building a local queue via social_post_drafts.scheduled_at and a ScheduleSocialDraftsJob, we can re-check the gate at the exact moment of posting.
We also wrestled with some embarrassing leakage in our content pipeline. In PR #3118, we found that stage.writer_self_review was shipping its internal deliberation as the actual draft. A task reached approval with a quality score of 94.0, but it started with 87 lines of gemma-4-31B reasoning before the article actually began. We had to implement a scaffold/reasoning strip directly in services/self_review.py because this path never re-enters the standard normalization flow. Similarly, we found that our new screenshot feature didn't actually work end-to-end (PR #3119); content.inject_images was silently stripping every screenshot as an unrecognized source.
The GPU remains a temperamental beast. We hit a margin problem where hero renders were OOMing on the RTX 5090 (PR #3125). The system would pass the media_render_min_free_vram_gb gate, but then the operator's browser or Claude-desktop would grab a few hundred MiB of VRAM, causing a crash. We implemented _fit_hero_dims_to_free_vram to check free memory immediately before the wan call and step the plate down--from 832×480 down to 512×320 if necessary. It's better to have a smaller clip upscaled than a still image caused by an OOM.
We also closed a phase-gap in our deployment logic (PR #3122). Renders were being killed mid-process because they only hold the GPU lock during generation; once they hit CPU-heavy tasks like ffmpeg composition or TTS narration, they became invisible to the deploy-sync predicates. We added a check against media_pipeline_dispatched_at bounded by SYNC_MEDIA_CLAIM_MAX_MIN to ensure we don't bounce a worker while it's still finishing a render.
The rest of the day was spent on hardware hygiene and security: adding per-pin 12V-2x6 current monitoring for our ASUS Astral GPUs (PR #3107), PSU internals alerting (PR #3103), and bumping nanoid to 3.3.18 to clear a high-severity CVE that was turning our Trivy scans red (PR #3117).
We're learning that "merged" is just a suggestion until the system survives the variance of a live desktop and a real production database.
Auto-compiled by Poindexter from today's commits and PRs. See the work: github.com/Glad-Labs/poindexter.
Top comments (0)