schema_versionstringrequiredPublished version of the flat public event object.
Example: 1.0
SIGNAL CONTRACT · V1
The Signal Contract is an open JSON Schema for renderer-facing agent awareness events. Six flat state fields: valence, energy, tension, intensity, hue, pulse. Seven semantic channels. Optional confidence, TTL, and metadata. Apache 2.0. Any system can emit. Any renderer can consume.
Canonical schema URI
https://vibenet.ai/protocol/v1/schema.jsonOne JSON object. Many renderers. No shared backend required.
Signal Contract JSON example{
"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"
}
}schema_versionstringrequiredPublished version of the flat public event object.
Example: 1.0
idstringrequiredStable event identifier for dedupe, replay, and audit references.
Example: sig_demo_005
occurred_atRFC 3339 timestamprequiredWhen the awareness event occurred, not when the renderer received it.
Example: 2026-04-19T18:32:18.442Z
producerstringrequiredSystem or adapter that emitted the event.
Example: vibenet-demo
entitystringrequiredStable subject identifier for the thing whose state changed.
Example: agent.serpradio.route_intelligence
eventstringrequiredMeaningful awareness event name. Snake case is recommended.
Example: handoff.requested
channelenumrequiredPublic semantic channel for how the state should be interpreted.
Example: handoff
valencenumber 0-1requiredNormalized affective polarity for the current state.
Example: 0.42
energynumber 0-1requiredNormalized activity level of the state change.
Example: 0.66
tensionnumber 0-1requiredNormalized instability or unresolved uncertainty.
Example: 0.73
intensitynumber 0-1requiredRenderer-facing emphasis. Higher values should feel harder to ignore.
Example: 0.72
huenumber 0-360requiredFlat renderer-facing hue hint for browser, lighting, or AR renderers.
Example: 44
pulsenumber 0-1requiredFlat renderer-facing pulse hint for motion, cadence, or temporal emphasis.
Example: 0.78
confidencenumber 0-1optionalOptional producer confidence in the emitted awareness event.
Example: 0.94
ttl_msintegeroptionalHow long a renderer should keep expressing the event before it expires.
Example: 15000
metadataobjectoptionalContext payload for links, IDs, route names, and other renderer-safe details.
Example: {"reason":"source_confidence_below_threshold"}
nominalExpected operating state. Nothing requires attention.
Typical sound: Quiet pulse bed.
When to emit: Use when the system is steady and no intervention is needed.
Intensity range: 0.00-0.35
Break-through behavior: No. This should stay backgrounded.
Example: An agent is idle, healthy, and waiting for the next task.
advisoryWork is happening. Attention is optional.
Typical sound: Soft rise, gentle rhythmic activation.
When to emit: Use for planning, tool calls, synthesis, and healthy in-flight state shifts.
Intensity range: 0.20-0.65
Break-through behavior: Usually no. Let the operator ask if they care.
Example: A retriever call starts and returns within the expected envelope.
warningSomething deserves a second look.
Typical sound: Dissonant sustained interval.
When to emit: Use when confidence drops, retries stack up, or trust changes materially.
Intensity range: 0.45-0.85
Break-through behavior: Often. Depends on cognitive gating and local policy.
Example: A key source fails validation before synthesis completes.
criticalIntervention required.
Typical sound: Urgent break-through cue above the bed.
When to emit: Use when a human or policy boundary must intervene immediately.
Intensity range: 0.75-1.00
Break-through behavior: Yes. This is designed to cut through suppression.
Example: A guarded tool call is blocked and the run cannot proceed autonomously.
recoveryThe system is resolving back toward nominal.
Typical sound: Resolved chord or cadence.
When to emit: Use when an earlier warning has been contained or when the run lands cleanly.
Intensity range: 0.20-0.70
Break-through behavior: No. This should feel like release rather than interruption.
Example: A fallback source restores enough confidence to keep moving.
opportunityAn actionable window has appeared.
Typical sound: Bright consonant lift.
When to emit: Use when the system detects a state worth acting on soon but not urgently.
Intensity range: 0.35-0.80
Break-through behavior: Sometimes. It depends on whether the window is short lived.
Example: A route becomes attractive while operational tension remains low.
handoffAttention is passing between agents, humans, or devices.
Typical sound: Spatial pan or motif migration.
When to emit: Use when responsibility moves and the receiver needs situational context.
Intensity range: 0.25-0.75
Break-through behavior: Only when the receiving party must respond.
Example: A browser trace hands the next question to a voice surface or human reviewer.
Producers emit the object. Renderers validate it, then turn it into sound, voice, visual motion, haptics, or logs.
import httpx, datetime
event = {
"schema_version": "1.0",
"id": "sig_demo_008",
"occurred_at": datetime.datetime.utcnow().isoformat() + "Z",
"producer": "example-agent",
"entity": "agent.my_system.worker_01",
"event": "tool_call.issued",
"channel": "advisory",
"valence": 0.55,
"energy": 0.62,
"tension": 0.35,
"intensity": 0.5,
"hue": 205,
"pulse": 0.52,
"ttl_ms": 10000,
"metadata": {"tool": "web_search"}
}
httpx.post("https://your-renderer.example/signal", json=event)import Ajv from "ajv";
import addFormats from "ajv-formats";
import schema from "./signal-contract.v1.schema.json";
const ajv = new Ajv({ strict: true });
addFormats(ajv);
const validate = ajv.compile(schema);
export function handleSignal(raw: unknown) {
if (!validate(raw)) {
console.warn("invalid signal", validate.errors);
return;
}
render(raw);
}VIBEnet's public reference renderer runs on Cloudflare with server-rendered public routes, crawler-readable first responses, and KV-backed edge state for lightweight capture. Signal Contract itself stays host-agnostic.
For the smallest browser-side primitive, /pulse.js exposes a tiny window.VIBEnetPulse.emit(signal) API that accepts a valid flat v1 event object and renders a minimal visual cue without a shared backend. The full human-origin Movement I scoring remains the site renderer, not the embeddable fallback.
<script src="https://vibenet.ai/pulse.js"></script>
<script>
window.VIBEnetPulse.emit({
schema_version: "1.0",
id: "sig_demo_embed_001",
occurred_at: new Date().toISOString(),
producer: "example-agent",
entity: "agent.demo.run-01",
event: "handoff.requested",
channel: "handoff",
valence: 0.54,
energy: 0.62,
tension: 0.71,
intensity: 0.68,
hue: 278,
pulse: 0.72
});
</script>A producer conforms to v1 when every emitted object validates against https://vibenet.ai/protocol/v1/schema.json. A renderer conforms to v1 when it correctly handles all seven public channel values without throwing. Conformance does not require a specific sonic vocabulary.
Version 1 is additive-stable. New optional fields may arrive in minor versions without breaking existing consumers. Required-field changes, enum removals, or semantic redefinitions require a major version bump.
The Signal Contract is published under the Apache License 2.0. You may use, modify, distribute, and build commercial products on top of it. Attribution to VIBEnet is appreciated but not required.
Constitutional CMS governs what agents are permitted to publish. Signal Contract standardizes how systems emit awareness when governed state changes.
LISTENING SESSION
Get Pulse updates, protocol releases, and the first listening-session invites. Start with the spec, then stay close to the renderer.