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 concept | OTel / OpenInference field |
|---|---|
| Job | trace (root span) |
| Call | span |
| Parent call | parent_span_id |
| Tool name | attributes['daslab.tool'] |
| Tool input | attributes['input.value'] (OpenInference) |
| Tool output | attributes['output.value'] (OpenInference) |
| LLM model + tokens | attributes['llm.model'], llm.token_count.* (OpenInference) |
| Status | status.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 paste | What opens |
|---|---|
| A job share link | That job, on a timeline |
| Any URL serving OTel spans or a calls snapshot | That 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