SIGNAL CONTRACT · V1

Hear what every agent is doing.

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.json

License: Apache 2.0Version: 1.0.0Status: Published

Canonical example

One 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"
  }
}

Field specification

schema_versionstringrequired

Published version of the flat public event object.

Example: 1.0

idstringrequired

Stable event identifier for dedupe, replay, and audit references.

Example: sig_demo_005

occurred_atRFC 3339 timestamprequired

When the awareness event occurred, not when the renderer received it.

Example: 2026-04-19T18:32:18.442Z

producerstringrequired

System or adapter that emitted the event.

Example: vibenet-demo

entitystringrequired

Stable subject identifier for the thing whose state changed.

Example: agent.serpradio.route_intelligence

eventstringrequired

Meaningful awareness event name. Snake case is recommended.

Example: handoff.requested

channelenumrequired

Public semantic channel for how the state should be interpreted.

Example: handoff

valencenumber 0-1required

Normalized affective polarity for the current state.

Example: 0.42

energynumber 0-1required

Normalized activity level of the state change.

Example: 0.66

tensionnumber 0-1required

Normalized instability or unresolved uncertainty.

Example: 0.73

intensitynumber 0-1required

Renderer-facing emphasis. Higher values should feel harder to ignore.

Example: 0.72

huenumber 0-360required

Flat renderer-facing hue hint for browser, lighting, or AR renderers.

Example: 44

pulsenumber 0-1required

Flat renderer-facing pulse hint for motion, cadence, or temporal emphasis.

Example: 0.78

confidencenumber 0-1optional

Optional producer confidence in the emitted awareness event.

Example: 0.94

ttl_msintegeroptional

How long a renderer should keep expressing the event before it expires.

Example: 15000

metadataobjectoptional

Context payload for links, IDs, route names, and other renderer-safe details.

Example: {"reason":"source_confidence_below_threshold"}

Channel semantics

nominal

Expected 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.

advisory

Work 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.

warning

Something 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.

critical

Intervention 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.

recovery

The 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.

opportunity

An 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.

handoff

Attention 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.

Build your first adapter

Producers emit the object. Renderers validate it, then turn it into sound, voice, visual motion, haptics, or logs.

Emitting from Python

Python emission example
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)

Consuming in a renderer

TypeScript renderer example
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);
}

Reference renderer

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.

Browser pulse primitive example
<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>

Conformance

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.

Versioning

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.

License

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.