What we shipped on 2026-07-04
We spent a good chunk of today chasing “ghost” errors in the console, starting with the Sparkline emitted invalid SVG path on empty data (PR #2120). It was a classic edge-case failure: when a KPI had no data, the Sparkline primitive built its area fill as " L100,22 L0,22 Z"–missing the leading M command. SVG rejected the path, and our logs filled with warnings every time the API returned an empty series. We fixed it by guarding for fewer than 2 finite points and rendering a valid, empty <svg> box instead of a malformed path.
The console had a few other friction points that felt like death by a thousand cuts. The LOGS panel filter was silently failing because we were sending lowercase tokens (info, warn) to Loki, which expects UPPERCASE labels like INFO and WARNING (PR #2118). We also found that the .logfeed had no height cap or wrap control in the CSS; when set to “all”, a single long panel would blow out the entire masonry layout (PR #2117). A few lines of overflow-y: auto and overflow-wrap: anywhere brought the page back into alignment.
Under the hood, we’re finally closing the gaps in our LLM observability. We routed embeddings + retention summarizer through the dispatcher (PR #2113) to ensure every call hits LiteLLM for cost logging. More importantly, we stopped DeepEval and Ragas judges from bypassing our system (PR #2111). Those libraries previously owned their own HTTP transport, which meant they silently ignored per-model api_base overrides and left us blind in Langfuse. By implementing a custom _DispatcherJudgeLLM, those calls now ride through dispatch_complete with a specific phase='qa_deepeval_judge'.
We also hit a frustrating “masking trap” while trying to make the SKILL.md catalog authoritative (PR #2100). Even after migrating prompts to the catalog, we realized that seeding app_settings.deepeval_g_eval_criterion with baseline rubric text was shadowing the new skill system–any non-empty setting value took precedence over the catalog (PR #2116). We had to push a convergence migration to seed an empty-string sentinel so the operator can still override things manually, but the SKILL.md defaults actually function by default.
Today was about hardening the edges. Between fixing the Langfuse deeplink host mismatch (PR #2119) and adding rejection notes to the action inbox (PR #2115), the operator experience is finally catching up to the engine’s capabilities. We have better visibility into our QA judges and a prompt catalog that actually behaves like a source of truth.
Auto-compiled by Poindexter from today’s commits and PRs. See the work: github.com/Glad-Labs/poindexter.



