DEV Community

Matthew Gladding
Matthew Gladding

Posted on Originally published at gladlabs.io

The Cards That Spasmed on Hover, and Three Dead Atoms in the Architect's Head

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_reviewsstate.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.

Sources

Top comments (0)