Adapter guide

Build an adapter that emits portable agent awareness.

Most observability tools ask you to send your data into their dashboard. VIBEnet asks the inverse question: how do you want operators to perceive your fleet, and what shape does the state need to take to make that perception possible?

Direct answer

Raw system state becomes human-perceptible when it passes through one small contract.

An adapter is the translation layer between whatever state your system already produces and the canonical Signal Contract event that VIBEnet render surfaces know how to consume.

The shape

raw system state → Domain Adapter → Signal Contract event → renderers

Your domain produces state in whatever shape it produces. A Domain Adapter consumes that state on the cadence that makes sense, then translates it into a Signal Contract event whose structure conforms to the canonical schema published at /protocol/v1/schema.json.

The renderers are interchangeable. The contract is fixed. The adapter is yours.

A minimal example

A customer-support agent fleet adapter

Imagine your raw state lives in a tracing platform. You can query average time-to-resolution, agents looped in tool-call retry, and human handoff rate across the last fifteen minutes.

The hard work is not the JSON. The hard work is deciding what valence, energy, and tension mean in your domain, and which changes deserve advisory or warning over nominal.

async function buildEvent(): Promise<SignalContractEvent> {
  const fleet = await langfuse.aggregateFleetState({ window: "15m" });

  const tension = clamp01(fleet.toolRetryRate * 2);
  const energy = clamp01(fleet.escalationRate);
  const valence = clamp01(1 - (fleet.avgResolutionTimeSec / 600));

  const channel =
    fleet.runawayLoops > 0 ? "warning" :
    fleet.toolRetryRate > 0.1 ? "advisory" :
    "nominal";

  // The exact field structure is governed by /protocol/v1/schema.json.
  // This helper validates against that schema before publishing.
  return signalContractEvent({
    id: `sig_support_fleet_${fleet.windowStart}`,
    producer: "support-fleet-domain-adapter",
    entity: "agent_fleet.support",
    event: "fleet.state.updated",
    channel,
    valence,
    energy,
    tension,
    metadata: {
      source: "langfuse-fleet-aggregator",
      source_window: "15m",
      suggested_bed_id: selectBed(channel),
      suggested_palette: paletteFor(channel)
    }
  });
}

Boundaries

What you do not have to build

You do not have to build the renderers. Audio, peripheral atmosphere, foveal text, future glasses overlays, and hardware cues sit downstream of the contract.

You do not have to build the contract itself. The Signal Contract event schema is served durably at /protocol/v1/schema.json. Your job is to populate it from your domain.

How to register

Submit the surface when the adapter emits valid events.

When your adapter is producing schema-conformant events, submit an entry to the render-surface registry on /governance via pull request to the page's source. Include your surface name, public URL or repo, referenced contracts, and status.