Traces

Every job in Daslab leaves an OpenTelemetry trace, written with OpenInference semantic conventions for the LLM parts and a small daslab.* extension namespace for what OTel doesn't cover. The trace is the record: what ran, in what order, what it cost, what came back. The authored plan it executed is a script.

Every Daslab concept maps to an OTel field

Daslab conceptOTel / OpenInference field
Jobtrace (root span)
Callspan
Parent callparent_span_id
Tool nameattributes['daslab.tool']
Tool inputattributes['input.value'] (OpenInference)
Tool outputattributes['output.value'] (OpenInference)
LLM model + tokensattributes['llm.model'], llm.token_count.* (OpenInference)
Statusstatus.code (OK / ERROR)

Daslab extensions live under the daslab.* attribute namespace; everything else uses the existing OTel and OpenInference vocabularies.

Span names stay human-readable

OTLP requires span_id to be hex, so the human-readable label lives in OTel's standard span.name: fetch_top_ids, summarize_digest, commit_release. External OTel UIs display span.name as the row label, so readable timelines come for free.

Any OTel backend can read a run

The export is standard OTLP, so traces feed into Phoenix, Langfuse, Datadog, Honeycomb, or Jaeger without translation. If your team already has an observability stack, Daslab's runs appear in it like any other service.

Scrub through a run in the browser

/replay renders a trace on a timeline — each op, what it returned, and the scene beside it — and lets you scrub back and forth. It accepts either input:

What you pasteWhat opens
A job share linkThat job, on a timeline
Any URL serving OTel spans or a calls snapshotThat trace; the shape is detected for you

A job share link opens the same view directly by adding ?replay=1:

https://daslab.run/share/job/<job_id>/<token>?replay=1

No account is involved. A share token is a read-only capability scoped to one job, and GET /v2/jobs/:id/trajectory accepts it as a bearer token or a ?token= parameter — so the trajectory pack the viewer renders is equally available to your own tooling:

curl "https://daslab.run/v2/jobs/<job_id>/trajectory?token=<share_token>"

Paste a share link, never an account API key. The share link carries exactly one job; an API key carries the account.

What's next

  • Scripts: the authored side, what a run meant to do.
  • Jobs: what a single trace covers.
  • Audit: the query layer over what happened.
  • Commit chain: state history, the trace's sibling record.

Updated 2026-08-09