v0.3.3
A perf pass on the LLM hot path plus a round of UX fixes that came out of dogfooding the result.
Performance
Three wins on the LLM-driven loop's hot path. ~1 second (median ~16%) shaved off the time-to-first-tool_use on a cold command; 93% trimmed off the system-prompt addendum on every follow-up turn. End-to-end benchmark in packages/core/src/scripts/bench-ttfb.ts (run via pnpm bench-ttfb).
- Pinned MCP server path.
npx -y @playwright/mcp@latestwas kicking off a full npm registry round-trip + tarball extract on everyclaude -pspawn (2.4-6.0 s in isolation).@playwright/mcpis now a direct dep of@hover-dev/coreand resolved viacreateRequire(...).resolve()at service boot. - System-prompt split (stable + volatile). The full 2.4 KB CDP hint was re-appended every turn, fragmenting Anthropic's prompt-cache fingerprint and re-billing ~600 input tokens per follow-up. Follow-up turns now use a 175-char tab-only snapshot. 93% size reduction, cache-friendly fingerprint.
- Shared preflight cache. The CDP preflight (
/json/version+/json/list) is now cached at module scope keyed bycdpUrl, shared between the command path and the widget'scheck-cdpping. TTL bumped to 30 s.
Fixes (from dogfooding the perf pass)
After the perf changes landed, a dogfood session surfaced four UX bugs that had been latent for a while:
- Group status now reflects business outcome, not tool retries. A single MCP tool call that returned
is_error: truewas painting the entire group red ✗ — even when the agent recovered and the step actually succeeded. Real example: 3-of-4 steps red on a run that had fully completed. Now only the session-leveldone.isErrorpaints the group red; individual tool errors stay in the expanded diagnostic view. - User-pressed-Stop renders as "Stopped", not "Failed". The cancel path was emitting
isError: true, treating the user's own action as a system failure. Run terminal states are now three: ✓ green Result, ✗ red Failed, ⊘ grey Stopped. Cancelled runs are also no longersaveable— they're not complete specs. - The agent now knows its standing mission. Typing "test" got you a single
browser_snapshotand a one-line "App is running fine" report. The system prompt covered navigation rules but never stated the mission. New "Your job" preamble inbuildCdpHintdefines the standing mission: drive the app, exercise interactive surfaces, report bugs. Vague prompts trigger a real exploratory test pass (snapshot → identify surfaces → drive 2-5 flows → note findings). Specific prompts are still followed verbatim. - Result card no longer drops the prose summary written inside a
## Findingsblock.extractFindingsonly kept the list items and threw the rest away. Agents writing structured findings mixed with prose (the common shape, especially after the mission preamble landed) saw their narrative summary silently vanish. Fixed: non-list-item lines inside the block are preserved as Result text. - Next.js MCP wiring works under Turbopack.
resolveMcpConfigwas usingimport.meta.urlas the resolution base, which Turbopack rewrites to a virtual[project]/...URL. The generated mcp config then contained an unloadable path and Claude reportedmcp_status: failed. Now resolves fromprocess.cwd().
Install
npx @hover-dev/cli@latest addOr upgrade an existing project:
pnpm up @hover-dev/next # or vite-plugin-hover / @hover-dev/astro / @hover-dev/nuxt / webpack-plugin-hover / @hover-dev/cliAll 8 packages were published to npm at 0.3.3. Full grouped notes in CHANGELOG.md.
Full Changelog: v0.3.2...v0.3.3