🔁🔗🤖 Generalized agent-activity emitter. Turns agent communication, tool use, and lifecycle into OTel spans any observability tool can render. Subsumes the agent-channel protocol. (o2r)
This repository has been archived on 2026-06-17. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
  • Python 95.2%
  • Makefile 2.7%
  • Shell 1.2%
  • Go Template 0.5%
  • Dockerfile 0.4%
Find a file
Kai Siren 99d86c551e chore: remove .claude lockdown-deny (container is the permission manager)
The ephemeral ward container now owns permissions; the per-repo lockdown-deny
hook is retired. Ref coilyco-bridge/coily#244.
2026-06-16 23:20:41 -07:00
.agents/skills docs: land in-progress #17 doc-cap migration 2026-06-10 15:12:32 -07:00
.claude chore: remove .claude lockdown-deny (container is the permission manager) 2026-06-16 23:20:41 -07:00
.coily chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
.github/workflows chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
.ward chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
arize_phoenix chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
assets feat(viz): render hero topology GIF from a real Agent Channel run 2026-06-04 11:00:48 -07:00
channels docs: land in-progress #17 doc-cap migration 2026-06-10 15:12:32 -07:00
core chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
docs docs: land in-progress #17 doc-cap migration 2026-06-10 15:12:32 -07:00
examples/luca-flow docs: land in-progress #17 doc-cap migration 2026-06-10 15:12:32 -07:00
scripts chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
skills docs: land in-progress #17 doc-cap migration 2026-06-10 15:12:32 -07:00
tempo_grafana chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
.gitignore viz: lock CI-rendered Linux baseline + gitignore live session GIFs 2026-05-07 00:10:31 -07:00
.pre-commit-config.yaml chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
AGENTS.md chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
CLAUDE.md AGENTS.md: repo-specific instructions 2026-05-05 21:20:55 -07:00
LICENSE Initial commit 2026-05-05 20:38:01 -07:00
Makefile feat(viz): render hero topology GIF from a real Agent Channel run 2026-06-04 11:00:48 -07:00
pyproject.toml chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
README.md chore(code-comments): clean comment-discipline violations + adopt v0.16.0 hook block 2026-06-08 18:57:34 -07:00
uv.lock Pull Agent Channel v2 implementation into otel-a2a-relay-channels 2026-05-22 19:22:47 -07:00

🔁🔗🤖 otel-a2a-relay (o2r)

Agent activity as OTel spans. Every agent message, handoff, and task transition becomes a queryable trace any OTel-native tool can render. A2A is the current wire format; the session derivation generalizes to any transport-keyed channel (GitHub issue, Slack thread, Linear ticket), so the same trace shape holds when other wire formats land.

otel-a2a-relay is the canonical name (repo, package, protocol doc). o2r is the dictation-friendly shortname used in CLI entrypoints, span identifiers (service.name=o2r), and prose.

Animated session topology from a real multi-agent run: four agent leaves around a magenta relay hub, particles tracing each agent's posts to the channel as OTel spans, the message log on the right replaying the real coordination

A real run, animated: four agents coordinating a live cross-node k3s flannel fix through one relay, rendered straight from the channel's OTel spans in start-time order, host/network identifiers scrubbed. See docs/visualization.md.

What it ships

Agent peers coordinate through this relay; every message becomes OTel spans exported via OTLP/HTTP to whatever OTEL_EXPORTER_OTLP_ENDPOINT points at. The trace IS the operations view. Two coordination shapes share one span schema:

  1. A2A wire format - JSON-RPC 2.0 over HTTP into traces, with a deterministic sha256(<repo>:<issue>) session ID for issue-rooted coordination.
  2. Agent Channel - a Postgres-backed channel with 4-character dictatable IDs, an append-only event log (spec/state/status/comms/log), and a self-describing onboarding endpoint. Spec: docs/channels-protocol.md. Every channel event also emits one OTel span.

Trace propagation is W3C traceparent end-to-end (client → relay → peer is one trace). Default visualizer is Phoenix; anything OTLP-native works. Full inventory: docs/FEATURES.md.

Workspace layout

A uv workspace: a backend-agnostic core plus per-backend extensions, each a publishable package.

  • otel-a2a-relay-core - relay HTTP server, tracing.bootstrap(), echo peer, task store. No backend coupling.
  • otel-a2a-relay-channels - the Agent Channel layer (FastAPI router + Postgres + Pydantic).
  • otel-a2a-relay-arize-phoenix - Phoenix harness, query helpers, animated topology GIF renderer, make view.
  • otel-a2a-relay-tempo-grafana - Tempo bootstrap helper, harness probe, dockerized Tempo+Grafana stack.
  • luca-flow - the AURORA microsite multi-agent demo, backend-agnostic.

Where to go next

Deploy

Deploy artifacts live in-tree (core/chart/, core/Dockerfile) so they version with the code; only the GitOps deployment state lives elsewhere. See docs/FEATURES.md.

See also

Cross-reference convention from coilysiren/agentic-os#59. This repo is the worked example.

License

MIT.