Signal Contract
One portable event. One shared clock. Many governed renderers.
One portable event carries machine state. A shared clock gives it time. Governed renderers make it perceptible.
Canonical schema JSONDirect answer
What is the Signal Contract?
Signal Contract is the flat, renderer-facing event object that separates what happened from how a human perceives it. One valid event can become sound, motion, a trace row, a structured log, or a future device cue without changing its meaning.
Not this protocol
MCP carries capability and work. VIBEnet carries meaning.
The Model Context Protocol is becoming an agent runtime: identity, delegation, events, and long-running Tasks. That answers who can talk to what, with which identity, and how work moves. It does not define a domain-neutral contract for what a resulting operational state means to a human.
Signal Contract sits above that join. MCP identity, task, and event become governed semantic state. VIBEnet expresses the transition. This site does not implement DPoP, token exchange, or MCP Tasks. Replay the fixture on the agent-trace desk if you want to hear the seven beats.
Architecture
One event. One shared clock. Many renderers.
- 01 · ProducerA domain adapter emits one renderer-facing event.
- 02 · ContractSignal Contract carries semantic state without choosing a renderer.
- 03 · ClockOne shared run keeps sound, motion, traces, and receipts aligned.
- 04 · RendererEach surface expresses the same truth without changing the event.
Canonical example
The event stays small and inspectable.
Producers may add public-safe context in metadata. The required core remains portable.
{
"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"
}
}Field specification
Canonical v1 fields
| Field | Type | Requirement | Meaning | Example |
|---|---|---|---|---|
schema_version | string | required | Published version of the flat public event object. | 1.0 |
id | string | required | Stable event identifier for dedupe, replay, and audit references. | sig_demo_005 |
occurred_at | RFC 3339 timestamp | required | When the awareness event occurred, not when the renderer received it. | 2026-04-19T18:32:18.442Z |
producer | string | required | System or adapter that emitted the event. | vibenet-demo |
entity | string | required | Stable subject identifier for the thing whose state changed. | agent.serpradio.route_intelligence |
event | string | required | Meaningful awareness event name. Snake case is recommended. | handoff.requested |
channel | enum | required | Public semantic channel for how the state should be interpreted. | handoff |
valence | number 0-1 | required | Normalized affective polarity for the current state. | 0.42 |
energy | number 0-1 | required | Normalized activity level of the state change. | 0.66 |
tension | number 0-1 | required | Normalized instability or unresolved uncertainty. | 0.73 |
intensity | number 0-1 | required | Renderer-facing emphasis. Higher values should feel harder to ignore. | 0.72 |
hue | number 0-360 | required | Flat renderer-facing hue hint for browser, lighting, or AR renderers. | 44 |
pulse | number 0-1 | required | Flat renderer-facing pulse hint for motion, cadence, or temporal emphasis. | 0.78 |
confidence | number 0-1 | optional | Optional producer confidence in the emitted awareness event. | 0.94 |
ttl_ms | integer | optional | How long a renderer should keep expressing the event before it expires. | 15000 |
metadata | object | optional | Context payload for links, IDs, route names, renderer-safe details, and optional publishable/indexable convention fields. | {"publishable":false,"indexable":true,"fallback_reason":"primary_source_stale"} |
Semantic channels
Public posture, not private taxonomy.
nominalExpected operating state. Nothing requires attention. Use when the system is steady and no intervention is needed.
advisoryWork is happening. Attention is optional. Use for planning, tool calls, synthesis, and healthy in-flight state shifts.
warningSomething deserves a second look. Use when confidence drops, retries stack up, or trust changes materially.
criticalIntervention required. Use when a human or policy boundary must intervene immediately.
recoveryThe system is resolving back toward nominal. Use when an earlier warning has been contained or when the run lands cleanly.
opportunityAn actionable window has appeared. Use when the system detects a state worth acting on soon but not urgently.
handoffAttention is passing between agents, humans, or devices. Use when responsibility moves and the receiver needs situational context.
Implementation notes