Skip to main content

Token-free visibility testing

Smithers can exercise every visibility plane (overview HUD, herdr cockpit, gateway monitor, TUI, pack UIs) without calling a model. Behavior is scripted; the engine and surfaces stay real where it matters. This is the cross-plane testing model used while building the Herdr × Smithers terminal experience. It is not herdr-specific: herdr is one plane adapter.

Layer cake

Fixtures (agent-trace vectors)

Reusable JSON scripts loaded by loadAgentTraceVector / scriptedAgent.
  • One fixture ≠ one UI test. Compose vectors into scenarios.
  • Versioned (version: 1), stable id, ordered turns with optional when matchers.
  • Stream events: delay, text, tool_*, progress; results: ok | fail | hang.
  • Pacing is runtime: virtual clock in CI; real wall-clock delays only for human watch.
Catalog: packages/testing/fixtures/agent-traces/README.md.

Core scenarios (engine truth)

Token-free real engine + sqlite tests of practical graphs: hello, sequence, parallel fail, hitl, steer, retry, loop, hang, stream, branch, continueAsNew, system frontmatter, etc.
Assert node/run state, steers, and event counts - not UI. Catalog: packages/testing/tests/scenarios/README.md.

Watch-pack (human-visible subset)

Plane-agnostic scenario ids optimized for watching a surface: Implementations: packages/testing/scripts/watch-pack.mjs (campaign + herdr bridge). Same ids should be reused for HUD-only or future gateway exports.

Plane adapters

Overview / smithtop (portable product)

Guide: workflow supervisor. Herdr-only pieces (dock, soft-pin, workspace labels) stay out of this layer.

Herdr cockpit (host plane)

Live campaigns set SMITHERS_CAMPAIGN_DB (shared store) so one top process fleet-watches every scenario. That env is campaign plumbing, not product API.
Runbook: packages/testing/docs/VIBE_CHECK_RUNBOOK.md.

Gateway / TUI / pack UIs

TUI already uses a real in-process gateway with seeds (packages/tui/tests/seededGateway.ts). Long-term, seeds should track scenario-exported run shapes so they do not drift from the engine.

Gates (CI vs human)

Product and e2e code still use real backends (engine, herdr, gateway). Fixtures replace LLM agents, not the control plane.

Campaign CLI (planes)

--plane engine never touches herdr. --plane herdr attaches the herdr adapter. Future: --plane hud for terminal-only overview smoke without herdr.

Principles

  1. One fixture catalog, many planes - do not fork agent-traces per host.
  2. Assert at the right altitude - engine state vs tabs/panes vs pure render frames.
  3. Watch-pack is a subset of scenarios, not a second product.
  4. Virtual clock in CI; real pacing only for humans.
  5. No mocks of the plane under test - soft-skip or seed a real server.

Package map