Adapters
One event in. Many truthful renderers out.
An adapter translates domain state into the public contract. A renderer decides how a human perceives it. Neither gets to invent source truth.
Registry
Reference paths and production proof
Browser Pulse
Reference browser renderer: visual pulse, trace rows, and JSON from one Signal Contract stream.
SERPRadio
First live Domain Adapter — route intelligence, materialized state, and audio previews in production.
Python Logger
Reference logger adapter for emitting validated events from scripts and agent runtimes.
Adoption rule
Build against the schema, not the demo.
The demo is one renderer. The schema is the contract. Validate the event before choosing sound, motion, logs, or a domain surface.
Event shape
The portable input
{
"schema_version": "1.0",
"id": "sig_demo_005",
"occurred_at": "2026-04-19T18:32:18.442Z",
"producer": "vibenet-demo",
"entity": "agent.serpradio.route_intelligence",
"event": "handoff.requested",
"channel": "handoff",
"valence": 0.42,
"energy": 0.66,
"tension": 0.73,
"intensity": 0.72,
"hue": 44,
"pulse": 0.78,
"confidence": 0.94,
"ttl_ms": 15000,
"metadata": {
"reason": "source_confidence_below_threshold",
"route": "JFK-LHR"
}
}Implementation detail
Inspect only the lane you need.
The adapter shape
Adapters are thin translators. Emit normalized Signal Contract events from your runtime. Renderers stay downstream so the same event can drive audio, visual, and trace surfaces.
"type AdapterInput = {\n agentId: string;\n event: \"planning\" | \"tool_call\" | \"warning\" | \"handoff\" | \"complete\";\n valence: number;\n energy: number;\n tension: number;\n summary?: string;\n};"Renderer reference
Renderers consume validated Signal Contract fields. Audio, visual pulse, trace, and receipt views can differ, but they should all follow the same event and clock.
"type RendererTarget =\n | \"audio\"\n | \"visual_pulse\"\n | \"trace\"\n | \"receipt\";"