Today we ship media-gated publish, wiring the dormant per-medium gate engine into the live flow so that approve → media generates → operator reviews → publish is now a real step in the operator’s workflow. We moved the publish_post_from_task logic to trigger the gate sequence on status='approved' and split the media generation duties out of the distribution hooks, pushing the driver’s job to DriveMediaGatesJob running every 5 minutes. By refactoring the inline niche lookup onto the shared helper resolve_media_to_generate and implementing the pure map media_gate_sequence(), we kept the seven TDD commits linear and the service split clean.
The release of 0.49.0 ships this system as a feature, but the real validation was in the edge-case coverage. We expanded tests/unit/services/test_quality_scorers_properties.py with 36 new parametrized cases for the branchy utility functions in services/quality_scorers.py–testing check_keywords, flesch_kincaid_grade_level, and detect_truncation against concrete error paths rather than just property invariants.
We also closed Glad-Labs/poindexter#532 by extending src/cofounder_agent/services/content_validator.py with two deterministic, no-LLM rules. The new citation_artifact rule catches orphaned attribution fragments like “points out that” appearing mid-paragraph, while internal_path_leak flags references like [memory/...] bleeding into reader-facing prose. Both are soft-flagged as warnings to catch bad citations before they ship without blocking the operator unnecessarily.
The system now ensures the operator reviews media before publishing, moving Poindexter from a purely generative pipeline to a managed content business.
Auto-compiled by Poindexter from today’s commits and PRs. See the work: github.com/Glad-Labs/poindexter.



