What we shipped on 2026-07-11
Today’s oddest bug was cosmetic and almost embarrassing: the SYSTEM PULSE cards on the console overview jumped around under the mouse. Not a layout bug in the usual sense – .nowrun__col had picked up a max-height ceiling in #2273 with a lone overflow-y: auto, and per the CSS spec, one non-visible overflow axis forces the other to compute to auto too. So every pulse column silently became a dual-axis scroll container. A hair of horizontal overflow thrashed the h-scrollbar against the vertical cap every time the pointer moved, and the cards spasmed. We confirmed it live by reading computed styles off the running console – overflow-x: auto on all three columns – then clipped the x-axis explicitly with overflow-x: hidden, the same idiom .main already uses. Console suite stayed green at 156/156, nothing touched in JS. One property, root-caused by actually reading computed styles instead of guessing (PR #2285).
The architect prompt bug was quieter but scarier. The pipeline-architect’s system prompt – the thing that grounds it when composing graph specs – still listed atoms that don’t exist anymore. We audited every atom name in the COMPOSITION HEURISTICS against the live registry (63 atoms, 15 surfaced stages) and found three stale references: aggregate_reviews should’ve been qa.aggregate, review_with_critic should’ve been qa.critic (and the old atom itself was deleted back in #2278), and stage.approval_gate doesn’t surface as a stage at all – the approval gate only exists natively. Left uncorrected, any of these could have had the architect emit a spec naming a nonexistent atom, which build_graph_from_spec rejects at compile time. We also fixed a folded-channel reference – state.qa_reviews → state.qa_rail_reviews – to match what qa.aggregate actually requires. Cheap fix, expensive failure mode avoided (PR #2284).
The research-dedup bug took more digging. Profiling the writer prompt for one task turned up the SOURCES block rendered twice – roughly 9,005 characters, half of it redundant. Tracing it layer by layer: 4,199 chars came in as “caller-attached” research, another ~4,806 came from a fresh ResearchService build, and pgvector’s build_rag_context contributed nothing. The root cause: the task had stalled on its first run, gotten reset to pending by the stale-reclaim sweep, then re-run – and on the re-run, _collect_research_context read the first run’s persisted research_context back in as if it were caller-attached, then appended the freshly-built context on top. We fixed the re-run path to stop treating stale persisted research as new input (PR #2286).
On the pipeline side, rebuild-images stopped blocking. It used to run the entire image pipeline inline – minutes per draft, CLI hanging – with a forked 233-line copy of the image logic living inside ImageRebuildService. Now it enqueues a pipeline_tasks row with template_slug=image_rebuild and returns immediately; the Prefect worker drives it through the same atoms canonical_blog runs, via a new graph template (load_draft → plan → generate → featured → gate → inject → persist → END) seeded by migration 20260711_024500. This is more infrastructure than a rebuild command probably needs, but it collapses a maintenance burden – one atom seam instead of two parallel image pipelines (PR #2287).
Housekeeping filled out the rest of the day. ProbeZeroReaderSettingsJob had flagged 50 app_settings keys with no reads past the 30-day grace window; after grepping the whole repo for each one we retired 26 that were truly dead, kept 22 (blind spots plus intentional operator config), and left one for a human call – 245 tests passed on the way out (PR #2281). Prettier format drift across 55 files, mostly web/public-site, and 11 ESLint warnings got cleaned up, with markdown diffs hand-reviewed to avoid prettier corrupting prose near underscore-emphasis tokens (PR #2283). Hardware sensors consolidated onto AIDA64 + iCUE after confirming the hwinfo_* exporter series was already at zero and scrape latency was erratic – HWiNFO wasn’t feeding anything real anyway (PR #2290). And social drafts finally link to the actual post instead of the bare index – the drafts had been generated before the slug existed, so we gate on approve-time and predict the slug up front (PR #2282).
All of it landed in 0.100.0 (PR #2302) – a version bump that’s really a dozen small acts of not trusting the last assumption: not trusting that HWiNFO was still useful, not trusting that the architect’s prompt matched the live registry, not trusting that a re-run task’s cached research was safe to reuse. None of these fixes are individually glamorous. Together they’re the difference between a system that mostly works and one we can leave alone overnight.
Auto-compiled by Poindexter from today’s commits and PRs. See the work: github.com/Glad-Labs/poindexter.



