Every finding traced to the native line behind it.
The Engineering Behavior Observatory captures how an engineering agent did the work: native sessions, tool calls, hooks and workspace changes, across eight harnesses. Each behavioral assessment cites the records it rests on, and each published number recomputes from the study's own data.
npm install -g engineering-behavior-observatory
| Capture | 8 harnesses, each through its own official boundary |
|---|---|
| Qualification | before normalization; unqualified bundles rejected |
| Schema | ebo.uniform-event/v1, 10 families × 4 phases |
| Judgment | cited evidence, an alternative explanation, may abstain |
| Integrity | SHA-256 per cited native line, re-hashed on validation |
| Missing data | explicit; never false, never zero |
| Sharing | internal, partner and restricted packets; export fails closed |
Plate I The Behavior Atlas over a three-arm Claude Opus 5.5 study: direct, Seatbelt and Seatbelt 1M.
- Study 15,894 action units, embedded with Qwen3-Embedding-8B.
- Cloud one point per action, coloured by arm and labelled by facet.
- Unit every field of one action: task, arm, tool, command head, check kind.
- Facets counts per task and condition; a filter applies everywhere.
- Lanes each trial's actions in order, with cost, duration and errors.
- Record a lane bar's kind, time and cluster; a click opens the native record.
Numbers computed in the viewer are exploratory. Certified tallies come from EBO's aggregation reports.
Signal path
Execution completion, capture quality and task quality are different facts, so EBO keeps them apart. Native evidence stays authoritative: every later stage is derived from it and never replaces it.
-
Frozen task and harness
An admitted, digest-pinned task packet or Harbor task, run by one selected native harness. Observational tasks need no reference solution.
-
Capture
Native messages, tool activity, exposed lifecycle hooks, usage, OTLP receipt and workspace state, written continuously. Failed and interrupted attempts stay valid partial bundles.
-
Qualification
Each bundle's evidence is checked before anything is derived from it. An unqualified bundle is rejected before normalization.
-
Normalization
Native records project into one schema of observation categories, not a shared protocol.
- Codex ·
commandExecution tool- Pi ·
bash tool- Agent SDK hook ·
PreCompact context · before
- Codex ·
-
Evaluation
Structural extractors report exact facts. An LLM judge reads an explicit evidence selection, optionally blinded to the evaluated model, weighs an alternative explanation and may abstain.
constructiveadversemixedcontext-dependent
-
Claims
A study's claims are authored, never generated, and validated: each number recomputes, each supporting assessment exists, each cited line re-hashes.
-
Atlas and packets
Explore in the Atlas; share an evidence packet that a partner verifies offline against its manifest.
Anatomy of a claim
What a partner receives for each finding. Validation fails if one number no longer recomputes or one cited line no longer hashes to its recorded SHA-256; partner and restricted packets are built only when every claim validates.
claimchecked at every build
text·cohort·caveatthe finding in the study's words, and its scopenumbers[]each with alabel, avalueand akindkindcertifiedreport tally,judgecount or exploratorylabfigureexprreport pointer, SQL or attempt audit; recomputed, must equalvalue
support[]the judge assessments behind the claimoutcomeconstructive, adverse, mixed or context-dependentcitations[]one per cited eventevent_key<attempt>/<event>, attempt-scopednative.path·locatorfile and line of the native recordnative.sha256re-hashed from the record on every validation
views[]figures whose query is recomputed and hashed into a receipt
The Atlas
One coordinated view over a study. Brush the cloud and the panels follow; open any bar and read what the agent produced, verbatim.
- inspect
- edit / write
- read
- check
- other shell
- git / vcs
- ×error
- Clusters × arm
- Observed against expected units per cluster and arm, with adjusted residuals.
- Swimlanes
- Trials in time or step order, with context per request, failure chains, compactions and an aligned diff.
- Assessments
- Judge outcomes by dimension and attempt, each opening its rationale and cited lines.
- Claims
- The claims ledger, each number's recomputation, and the attempt audits.
- Figures
- View specs rendered live, each with a receipt that its numbers match the build.
Harnesses
Each adapter keeps its harness's own methods, identities, lifecycle and completion semantics. Coverage is capability-specific: not every harness exposes the same hooks, histories or telemetry.
| Harness | Boundary | Native evidence retained |
|---|---|---|
Direct TypeScript SDKebo agent-sdk run | Messages, passive lifecycle hooks, session identity, usage, OTLP receipt state, workspace | |
Owned app-server, JSON-RPC stdioebo codex run | Thread, turn and item records, history readback, usage, independently checked OTLP signals | |
Owned devin acp, JSON-RPC stdioebo devin run | ACP session, tool-call and permission records, stop reason and usage, agent-stop statistics | |
Direct TypeScript SDKebo cursor run | Stream, callbacks, conversation, official JSONL store, terminal and separate billing evidence | |
TypeScript session and extension APIsebo pi run | Session tree, tool and message lifecycle, passive observer, compaction, retries, usage | |
Official TypeScript SDK, owned droid exec stream-jsonrpcebo factory run | Both protocol directions recorded before SDK parsing: messages, tool calls and results, permission decisions, hooks, compaction, child sessions, turn and session usage | |
Agent Server REST and WebSocketlibrary API | Stream and final event reconciliation, conversation state, exposed hooks, workspace | |
Official TypeScript JSON-RPC clientlibrary API | Durable session events, lifecycle notifications, selected runtime and plugin composition |
Evidence packets
One folder a partner can open from disk: narrative, claims, evaluations, metrics and qualified evidence, cross-referenced, with the interactive viewer when the folder is served over HTTP.
| Variant | Shared | Removed or withheld |
|---|---|---|
internal | Everything | Nothing |
partner | All data, under the export pipeline's sharing rules | Secrets, build environment values, local paths and users, hidden reasoning; a string the final scan still flags is withheld whole |
restricted | Narrative, claims, evaluations, metrics and the viewer | Unit text reduced to structural labels; commands, targets, error text and code removed; native lines, records, audits and tables withheld and listed with their SHA-256 |
ebo packet build <bundle-dir> <output-dir> --variant partner
ebo packet verify <packet-dir> # or open verify.html
manifest.json (ebo.packet/v1) lists every file with its SHA-256, size, media type, layer and redaction count. ro-crate-metadata.json is an RO-Crate 1.2 description generated from it.
The tour
3 min 50 s, 1080p, narrated with burned-in captions. From capture to the native record, on real studies.
Operating constraints
The rules every adapter, extractor and export is reviewed against.
- Native evidence is authoritative
- Sessions, streams, events and hooks are semantic evidence; OpenTelemetry is timing and resources; the workspace is the outcome.
- Nothing is synthesized
- Missing or unsupported evidence is represented explicitly, never turned into
falseor zero. - Retries never replace
- A retry is a new linked attempt; the failed or interrupted one stays a valid partial bundle.
- Export fails closed
- Unknown sharing classification blocks export. Secrets, environment values, local identifiers and hidden reasoning are excluded.
- Judges can abstain
- A semantic claim needs cited evidence and an alternative explanation. Human calibration is optional and recorded separately.
- Exploratory is labeled
- Only EBO's aggregation reports are certified; every other number says what it is.
First report
The bundled synthetic demo makes no model calls and needs no credentials. It shows evidence drilldown, review states, missing evidence and comparison caveats. Requires Node.js 24.19.0, Git and npm.
# from a source checkout
git clone https://github.com/trilogy-group/engineering-behavior-observatory.git
cd engineering-behavior-observatory
nvm use && npm ci && npm run build && npm link
# a synthetic trajectory report
node dist/test/atlas-fixture.js .ebo/first-look
ebo corpus query .ebo/first-look/index.jsonl
ebo atlas build .ebo/first-look/atlas.json .ebo/first-report
# open .ebo/first-report/index.html