What we shipped on 2026-06-22
We finally shipped preview_gate -- component-scoped regen (PR #1851), solving a friction point that had been eating our time for weeks. Until now, if a post’s text was perfect but an image was off, we were forced into a full redo of the entire task. Now we have surgical controls to approve, reject, or specifically trigger regen_images and regen_text.
Implementing this required a specific architectural choice: durable per-component state on pipeline_tasks using regen_<c>_pending booleans and regen_<c>_attempts integers (PR #1851). We couldn’t rely on the LangGraph resume value because routing via that would re-page the operator on every loop-back. By moving the signal to the DB, the atom clears the flag once consumed, preventing infinite loops while allowing the gate to remain inert as a no-op hop until we flip the pipeline_gate_preview_gate flag.
The rollout wasn’t without its typical indie-shop chaos. The live e2e of the preview_gate surfaced a bug where resuming mid-graph halted at content.persist_task with an AttributeError: '_PoolShim' object has no attribute 'update_task' (PR #1854). We realized the CLI resume path was handing the runner a thin shim without the necessary platform key, causing SDXL image generation to silently fall back to Pexels. We fixed this by ensuring the full DatabaseService delegate methods and platform dispatch are available during mid-graph resumes (PR #1854).
We also had to clean up some latent technical debt that nearly took the pipeline down. A worker restart exposed a missing category column in pipeline_tasks for older installs, causing asyncpg.exceptions.UndefinedColumnError and preventing any tasks from being claimed (PR #1853). We’ve since added an idempotent migration to backfill it and, ironically, followed that up by dropping the vestigial column entirely (PR #1843) since 56% of our live rows were NULL and downstream categorization now lives in posts.category_id.
On the ops side, we addressed the “manual intervention” nightmare from yesterday’s outage. Our Docker Engine Watchdog could see that the process was alive but couldn’t detect when the WSL2 utility VM had wedged–leaving us with HCS_E_CONNECTION_TIMEOUT and a dead engine (PR #1844). We extended Invoke-HealthCheck in scripts/docker-watchdog.ps1 to detect this specific wedge and automatically trigger a wsl --shutdown.
We rounded out the day by unblocking our frontend PRs; a security floor override for minimatch: ">=9.0.7" had broken jest --coverage via an outdated test-exclude@6 dependency (PR #1850). Pinning test-exclude@7 in root overrides finally got the jest-unit gate green again.
The system is more resilient now, and we’ve stopped fighting the “all or nothing” nature of content regeneration. Next, we flip the preview gate to ‘on’ and see how the real-world approval flow feels.
Auto-compiled by Poindexter from today’s commits and PRs. See the work: github.com/Glad-Labs/poindexter.



