UTEv1 · OPEN SPEC · DRAFT

The neutral substrate the human + AI workforce emits into.

UTEv1 — the Universal Time Event spec — is a small, JSON-Schema-driven format for recording any unit of work, human or agent, with enough structure to drive capacity, project cost, OpEx/CapEx, and audit trails from one event stream. Drafted by Tymr, intended as a community standard.

Why a new spec?

Existing observability schemas (OpenTelemetry, CloudEvents) weren't built for the workforce. They capture what happened technically — not who did the work, for which project, or how the activity should be classified for capacity, cost, or accounting.

Existing time-tracking schemas (Tempo, Toggl, Harvest) weren't built for AI agents. They assume a human-entered timesheet, not a continuous event stream from calendars, tickets, dev tools, ITSM systems, chat, and LLM runs.

UTEv1 sits in the gap: one format, human or agent, with the fields capacity, cost, project, and compliance actually need.

Core event shape

// Minimum viable UTEv1 event { "spec": "utev1", "event_id": "01HQ...", "occurred_at": "2026-04-19T14:22:15Z", "duration_ms": 312000, "worker": { "kind": "human" | "agent", "id": "u_8f3c...", "display_name": "K. Ejibe" }, "source": { "system": "jira" | "github" | "gcal" | "agent_sdk", "ref": "ENG-1421", "url": "https://acme.atlassian.net/browse/ENG-1421" }, "project": "PROJ-142", "activity": "design" | "develop" | "test" | "maintain" | "meeting", "classification": { "irs_174": true, "asc_350_40": "capex" | "opex" | null, "confidence": 0.92 }, "cost": { "currency": "USD", "labor_usd": 15.42, "compute_usd": 0 } }

Every field is optional except spec, event_id, occurred_at, and worker.kind. A minimal event can be as small as four fields; a rich one carries full classification and cost.

Design principles

Human and agent are peers

worker.kind is the only field that distinguishes a person from an LLM agent. Same schema, same classification logic, same audit trail. This is foundational — agents are part of the workforce, not a sidecar.

Source truth is immutable

Every event carries a source.ref — a Jira issue key, a GitHub commit SHA, a calendar invite ID, an agent run ID, a ServiceNow incident. The event is reproducible from its source; nothing is invented.

Classification is a field, not a layer

Capacity bucket, OpEx/CapEx status, and compliance tags live on the event itself with a confidence score. Managers, finance, and auditors all see why an event was classified a certain way — not just the total.

Append-only, hash-chainable

Events are immutable once written. Corrections are expressed as new correction-kind events that reference the original event_id. The audit trail is reproducible after the fact.

Reference SDKs

TypeScript v0.1 draft

Core client + UTEv1-aligned types + buffer/flush + session/task context managers. Includes wrapClaudeAgent for Anthropic's SDK. Generated types mirror the JSON Schema 1:1.

npm i @tymr/agent pre-publish

Python v0.1 draft

Core client + TymrCallbackHandler for LangChain. Works with async and sync agents. Same generated types, same buffer/flush semantics as the TypeScript SDK.

pip install tymr-agent-events pre-publish

Status & roadmap

  • v0.1 draft (now) — JSON Schema (Draft 2020-12) + TypeScript + Python codegen shipped. Pre-publish on npm/PyPI.
  • Community RFC — outreach to OpenTelemetry SIG, FinOps Foundation, and adjacent vendors (Tempo, Memory, Reclaim, Worklytics) for feedback.
  • Agent framework wrappers — CrewAI, OpenAI Assistants, Vercel AI SDK, AutoGen.
  • v0.2 — correction & redaction events, expanded classification (non-US tax frameworks).

Why we're publishing this

If only Tymr speaks UTEv1, it's a vendor format. If Anthropic, OpenAI, LangChain, Tempo, and your internal agent framework all speak UTEv1, it's a standard — and managers, PMOs, finance, and auditors get one schema to reason about instead of thirty.

That's the bet. Free for anyone to implement; no license fee, no runtime dependency on Tymr. We'll support the schema whether you use us or not.