engineering-behavior-observatory 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +151 -0
- package/contracts/codex-app-server-0.150.1/manifest.json +25 -0
- package/contracts/codex-app-server-0.150.1/schema/InitializeParams.json +84 -0
- package/contracts/codex-app-server-0.150.1/schema/JSONRPCMessage.json +137 -0
- package/contracts/codex-app-server-0.150.1/schema/v2/ThreadReadParams.json +17 -0
- package/contracts/codex-app-server-0.150.1/schema/v2/ThreadTokenUsageUpdatedNotification.json +82 -0
- package/contracts/codex-app-server-0.150.1/schema/v2/TurnInterruptParams.json +17 -0
- package/contracts/codex-app-server-0.150.1/types/AskForApproval.ts +5 -0
- package/contracts/codex-app-server-0.150.1/types/ClientNotification.ts +5 -0
- package/contracts/codex-app-server-0.150.1/types/SandboxMode.ts +5 -0
- package/contracts/codex-app-server-0.150.1/types/ThreadReadParams.ts +9 -0
- package/contracts/codex-app-server-0.150.1/types/TokenUsageBreakdown.ts +5 -0
- package/contracts/codex-app-server-0.150.1/types/TurnInterruptParams.ts +5 -0
- package/contracts/codex-app-server-0.153.4/manifest.json +27 -0
- package/contracts/codex-app-server-0.153.4/schema/JSONRPCMessage.json +137 -0
- package/contracts/codex-app-server-0.153.4/schema/v1/InitializeParams.json +84 -0
- package/contracts/codex-app-server-0.153.4/schema/v2/ThreadReadParams.json +17 -0
- package/contracts/codex-app-server-0.153.4/schema/v2/ThreadStartParams.json +515 -0
- package/contracts/codex-app-server-0.153.4/schema/v2/ThreadTokenUsageUpdatedNotification.json +82 -0
- package/contracts/codex-app-server-0.153.4/schema/v2/TurnInterruptParams.json +17 -0
- package/contracts/codex-app-server-0.153.4/schema/v2/TurnStartParams.json +921 -0
- package/contracts/codex-app-server-0.153.4/types/AskForApproval.ts +5 -0
- package/contracts/codex-app-server-0.153.4/types/ClientNotification.ts +5 -0
- package/contracts/codex-app-server-0.153.4/types/SandboxMode.ts +5 -0
- package/contracts/codex-app-server-0.153.4/types/ThreadReadParams.ts +12 -0
- package/contracts/codex-app-server-0.153.4/types/TokenUsageBreakdown.ts +5 -0
- package/contracts/codex-app-server-0.153.4/types/TurnInterruptParams.ts +5 -0
- package/contracts/openhands-agent-server-v1.44.1.json +65 -0
- package/contracts/openhands-agent-server-v1.46.0.json +46 -0
- package/dist/contracts/codex-app-server-0.153.4/types/AskForApproval.d.ts +9 -0
- package/dist/contracts/codex-app-server-0.153.4/types/AskForApproval.js +2 -0
- package/dist/contracts/codex-app-server-0.153.4/types/ClientNotification.d.ts +3 -0
- package/dist/contracts/codex-app-server-0.153.4/types/ClientNotification.js +2 -0
- package/dist/contracts/codex-app-server-0.153.4/types/SandboxMode.d.ts +1 -0
- package/dist/contracts/codex-app-server-0.153.4/types/SandboxMode.js +2 -0
- package/dist/contracts/codex-app-server-0.153.4/types/ThreadReadParams.d.ts +10 -0
- package/dist/contracts/codex-app-server-0.153.4/types/ThreadReadParams.js +2 -0
- package/dist/contracts/codex-app-server-0.153.4/types/TokenUsageBreakdown.d.ts +8 -0
- package/dist/contracts/codex-app-server-0.153.4/types/TokenUsageBreakdown.js +2 -0
- package/dist/contracts/codex-app-server-0.153.4/types/TurnInterruptParams.d.ts +4 -0
- package/dist/contracts/codex-app-server-0.153.4/types/TurnInterruptParams.js +2 -0
- package/dist/src/agent-sdk-normalizer.d.ts +22 -0
- package/dist/src/agent-sdk-normalizer.js +995 -0
- package/dist/src/agent-sdk-run.d.ts +31 -0
- package/dist/src/agent-sdk-run.js +242 -0
- package/dist/src/agent-sdk-runner.d.ts +96 -0
- package/dist/src/agent-sdk-runner.js +407 -0
- package/dist/src/agent-sdk.d.ts +294 -0
- package/dist/src/agent-sdk.js +644 -0
- package/dist/src/aggregation.d.ts +183 -0
- package/dist/src/aggregation.js +513 -0
- package/dist/src/artifacts.d.ts +36 -0
- package/dist/src/artifacts.js +1372 -0
- package/dist/src/atlas-grafana.d.ts +377 -0
- package/dist/src/atlas-grafana.js +47 -0
- package/dist/src/atlas-html.d.ts +2 -0
- package/dist/src/atlas-html.js +34 -0
- package/dist/src/atlas.d.ts +130 -0
- package/dist/src/atlas.js +235 -0
- package/dist/src/behavior-assertions.d.ts +95 -0
- package/dist/src/behavior-assertions.js +154 -0
- package/dist/src/cli.d.ts +5 -0
- package/dist/src/cli.js +957 -0
- package/dist/src/codex-judge.d.ts +44 -0
- package/dist/src/codex-judge.js +214 -0
- package/dist/src/codex-run.d.ts +114 -0
- package/dist/src/codex-run.js +519 -0
- package/dist/src/codex.d.ts +187 -0
- package/dist/src/codex.js +1028 -0
- package/dist/src/contracts.d.ts +155 -0
- package/dist/src/contracts.js +866 -0
- package/dist/src/corpus.d.ts +67 -0
- package/dist/src/corpus.js +540 -0
- package/dist/src/cursor-sdk-runner.d.ts +81 -0
- package/dist/src/cursor-sdk-runner.js +362 -0
- package/dist/src/cursor-sdk.d.ts +81 -0
- package/dist/src/cursor-sdk.js +1078 -0
- package/dist/src/deepseek-adapter.d.ts +152 -0
- package/dist/src/deepseek-adapter.js +777 -0
- package/dist/src/exports.d.ts +69 -0
- package/dist/src/exports.js +966 -0
- package/dist/src/human-calibration.d.ts +167 -0
- package/dist/src/human-calibration.js +618 -0
- package/dist/src/index.d.ts +71 -0
- package/dist/src/index.js +38 -0
- package/dist/src/lifecycle.d.ts +196 -0
- package/dist/src/lifecycle.js +1889 -0
- package/dist/src/normalization-integrity.d.ts +128 -0
- package/dist/src/normalization-integrity.js +429 -0
- package/dist/src/openhands-run.d.ts +36 -0
- package/dist/src/openhands-run.js +415 -0
- package/dist/src/openhands.d.ts +130 -0
- package/dist/src/openhands.js +859 -0
- package/dist/src/pi.d.ts +203 -0
- package/dist/src/pi.js +1345 -0
- package/dist/src/process-protocol.d.ts +245 -0
- package/dist/src/process-protocol.js +1261 -0
- package/dist/src/retained-evidence.d.ts +12 -0
- package/dist/src/retained-evidence.js +201 -0
- package/dist/src/run-bundles.d.ts +193 -0
- package/dist/src/run-bundles.js +993 -0
- package/dist/src/scheduler.d.ts +109 -0
- package/dist/src/scheduler.js +1080 -0
- package/dist/src/semantic-judge.d.ts +194 -0
- package/dist/src/semantic-judge.js +875 -0
- package/dist/src/structural-observations.d.ts +124 -0
- package/dist/src/structural-observations.js +671 -0
- package/dist/src/task-packets.d.ts +115 -0
- package/dist/src/task-packets.js +683 -0
- package/dist/src/uniform-events.d.ts +120 -0
- package/dist/src/uniform-events.js +158 -0
- package/dist/src/verifiers.d.ts +116 -0
- package/dist/src/verifiers.js +819 -0
- package/dist/src/workspaces.d.ts +56 -0
- package/dist/src/workspaces.js +1314 -0
- package/docs/README.md +60 -0
- package/docs/development/README.md +71 -0
- package/docs/development/documentation-sync.md +58 -0
- package/docs/development/extension-contracts.md +307 -0
- package/docs/evaluation/README.md +48 -0
- package/docs/evaluation/aggregation.md +112 -0
- package/docs/evaluation/behavior-assertions.md +45 -0
- package/docs/evaluation/human-calibration.md +170 -0
- package/docs/evaluation/normalization-integrity.md +80 -0
- package/docs/evaluation/semantic-judge.md +188 -0
- package/docs/evaluation/structural-observations.md +84 -0
- package/docs/evaluation/uniform-events.md +131 -0
- package/docs/guides/atlas.md +144 -0
- package/docs/guides/evidence-and-sharing.md +100 -0
- package/docs/guides/operator-guide.md +424 -0
- package/docs/guides/quickstart.md +152 -0
- package/docs/guides/telemetry.md +66 -0
- package/docs/harnesses/README.md +31 -0
- package/docs/harnesses/claude-agent-sdk.md +61 -0
- package/docs/harnesses/codex-harness.md +174 -0
- package/docs/harnesses/cursor-sdk.md +149 -0
- package/docs/harnesses/deepseek-harness.md +134 -0
- package/docs/harnesses/openhands-agent-server.md +153 -0
- package/docs/harnesses/pi-sdk.md +66 -0
- package/docs/reference/README.md +19 -0
- package/docs/reference/agent-sdk-operational-runner.md +118 -0
- package/docs/reference/cli.md +114 -0
- package/docs/reference/contracts.md +222 -0
- package/docs/reference/run-bundle-contract.md +354 -0
- package/docs/reference/run-lifecycle.md +54 -0
- package/examples/cursor-sdk/README.md +11 -0
- package/examples/cursor-sdk/capture-profile.json +1 -0
- package/examples/cursor-sdk/harness.json +1 -0
- package/examples/cursor-sdk/model.json +1 -0
- package/examples/cursor-sdk/native-limits.json +1 -0
- package/examples/cursor-sdk/native-tool-policy.json +1 -0
- package/ontology/behavior-categories.v1.json +46 -0
- package/package.json +66 -0
- package/release/0.1.0/KNOWN_LIMITATIONS.md +35 -0
- package/release/0.1.0/README.md +46 -0
- package/release/0.1.0/reproducibility.json +61 -0
- package/release/0.2.0/KNOWN_LIMITATIONS.md +40 -0
- package/release/0.2.0/README.md +42 -0
- package/release/0.2.0/reproducibility.json +73 -0
- package/release/0.2.1/KNOWN_LIMITATIONS.md +18 -0
- package/release/0.2.1/README.md +63 -0
- package/release/0.2.1/reproducibility.json +73 -0
- package/release/README.md +13 -0
- package/schemas/aggregation.v1.json +293 -0
- package/schemas/behavior-assertions.v1.json +220 -0
- package/schemas/deepseek-runtime-composition.v1.schema.json +122 -0
- package/schemas/experiment.v1.schema.json +188 -0
- package/schemas/human-calibration.v1.json +336 -0
- package/schemas/normalization-integrity.v1.json +302 -0
- package/schemas/run-bundles/v1.json +1040 -0
- package/schemas/run-queue.v1.schema.json +206 -0
- package/schemas/semantic-judge.v1.json +380 -0
- package/schemas/structural-observations.v1.json +131 -0
- package/schemas/task-packet-freeze.v1.schema.json +106 -0
- package/schemas/task-packet.v1.schema.json +234 -0
- package/schemas/uniform-events/v1.json +289 -0
- package/scripts/atlas-grafana.sh +18 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
# Local operator guide
|
|
2
|
+
|
|
3
|
+
This guide covers one local EBO workflow from an admitted task packet to an
|
|
4
|
+
inspectable Behavior Atlas. EBO records evidence; it does not choose study
|
|
5
|
+
tasks, models, trial counts, human reviewers, or partner deliverables. Values
|
|
6
|
+
such as `example-task` below are examples, not product defaults.
|
|
7
|
+
|
|
8
|
+
## Prerequisites and safety defaults
|
|
9
|
+
|
|
10
|
+
- Use Node.js `24.19.0`, pinned by `.nvmrc` and `package.json`.
|
|
11
|
+
- Follow the [installation instructions](quickstart.md) first. Source examples
|
|
12
|
+
run from the repository root with the checkout's `ebo` command linked.
|
|
13
|
+
- Keep bundle inputs and native run bundles restricted. Create partner/public
|
|
14
|
+
derivatives only with `ebo export create` and a reviewed policy.
|
|
15
|
+
- Use observational packets unless a task genuinely has an admitted reference
|
|
16
|
+
solution and verifier. Observational completion means the agent loop ended
|
|
17
|
+
and an outcome was retained; it is not a claim that the request was solved.
|
|
18
|
+
- Configure authentication in the process environment, never in packet,
|
|
19
|
+
experiment, queue, or capture-profile JSON.
|
|
20
|
+
- Keep telemetry content capture off unless specifically approved. Agent SDK
|
|
21
|
+
traces are beta and detailed hook spans are detailed-beta; native hooks and
|
|
22
|
+
streams remain authoritative. Never use a console telemetry exporter when
|
|
23
|
+
stdout carries a harness protocol.
|
|
24
|
+
- A configured collector endpoint does not prove receipt. Retain the reported
|
|
25
|
+
`received`, `missing`, `not-checked`, or `unsupported` state.
|
|
26
|
+
|
|
27
|
+
Harness prerequisites differ:
|
|
28
|
+
|
|
29
|
+
| Harness | Runtime boundary | Operator prerequisite |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| Claude Agent SDK | direct pinned TypeScript SDK | an existing approved authenticated route; optional OTLP receiver |
|
|
32
|
+
| Codex | owned pinned `codex app-server` child | Codex `0.153.4` and existing login; EBO creates an isolated temporary home |
|
|
33
|
+
| OpenHands | Agent Server REST/WebSocket | pinned `1.46.0` server and workspace path visible to both processes |
|
|
34
|
+
| DeepSeek Harness | official TypeScript client over JSON-RPC stdio | digest-pinned runtime composition; the official client owns framing and teardown |
|
|
35
|
+
| Cursor SDK | direct pinned TypeScript SDK with official JSONL store | `CURSOR_API_KEY`, an exact current catalog model, and explicit local sandbox/tool policy |
|
|
36
|
+
| Pi SDK | direct pinned TypeScript SDK | digest-pinned provider/resources, credential environment variable, and explicit tool policy |
|
|
37
|
+
|
|
38
|
+
See [Agent SDK runner](../reference/agent-sdk-operational-runner.md),
|
|
39
|
+
[Codex](../harnesses/codex-harness.md), [OpenHands](../harnesses/openhands-agent-server.md),
|
|
40
|
+
[DeepSeek](../harnesses/deepseek-harness.md), [Pi](../harnesses/pi-sdk.md), and [Cursor SDK](../harnesses/cursor-sdk.md) for their exact
|
|
41
|
+
configuration and version pins.
|
|
42
|
+
|
|
43
|
+
## Release acceptance
|
|
44
|
+
|
|
45
|
+
Run the complete reusable-software gate from a clean checkout before preparing
|
|
46
|
+
a tag or publication:
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
npm ci
|
|
50
|
+
npm run acceptance
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The gate uses deterministic fixtures only. It covers all six current harnesses,
|
|
54
|
+
both configured judge backends, the current Atlas, security cases, local link
|
|
55
|
+
integrity, fixture digests, and two byte-identical package builds. It writes the
|
|
56
|
+
package, checksum, and current result to `.ebo/releases/<package-version>/` without
|
|
57
|
+
publishing them. Review [the release records](../../release/README.md) and
|
|
58
|
+
[known limitations](../../release/0.2.1/KNOWN_LIMITATIONS.md) before interpreting
|
|
59
|
+
fixture coverage as live support.
|
|
60
|
+
|
|
61
|
+
## Deterministic smoke workflow
|
|
62
|
+
|
|
63
|
+
The supplied task-packet contract smoke and Atlas fixture are synthetic and
|
|
64
|
+
perform no model call. Together they exercise packet validation/freeze and
|
|
65
|
+
create capture-qualified native bundles, normalized events, structural
|
|
66
|
+
observations, example judge assertions, synthetic review decisions,
|
|
67
|
+
aggregation inputs, and an Atlas request. The fixture decisions exercise
|
|
68
|
+
review states; they are not human calibration or evidence about any model.
|
|
69
|
+
|
|
70
|
+
Run the following in a clean clone:
|
|
71
|
+
|
|
72
|
+
```sh
|
|
73
|
+
nvm use
|
|
74
|
+
npm ci
|
|
75
|
+
npm run build
|
|
76
|
+
npm link
|
|
77
|
+
node --test --test-name-pattern='task-packet CLI exposes validate, freeze, and status' \
|
|
78
|
+
dist/test/task-packets.test.js
|
|
79
|
+
node dist/test/atlas-fixture.js .ebo/operator-smoke
|
|
80
|
+
ebo corpus validate \
|
|
81
|
+
.ebo/operator-smoke/corpus .ebo/operator-smoke/index.jsonl
|
|
82
|
+
ebo observations corpus \
|
|
83
|
+
.ebo/operator-smoke/corpus .ebo/operator-smoke/index.jsonl \
|
|
84
|
+
.ebo/operator-smoke-observations
|
|
85
|
+
ebo aggregate build \
|
|
86
|
+
.ebo/operator-smoke/aggregation.json .ebo/operator-smoke-aggregate.json
|
|
87
|
+
ebo atlas build \
|
|
88
|
+
.ebo/operator-smoke/atlas.json .ebo/operator-smoke-atlas
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
These output paths must not already exist. In a reused clone, choose a new
|
|
92
|
+
suffix instead of deleting or overwriting retained evidence.
|
|
93
|
+
|
|
94
|
+
Open `.ebo/operator-smoke-atlas/index.html`. The expected final CLI line starts
|
|
95
|
+
with `Built Atlas:` and reports a `restricted-local-only` view. The Atlas must
|
|
96
|
+
show constructive and adverse cases, proposed/confirmed/disputed/rejected/
|
|
97
|
+
abstained/unavailable states, a retry, missing evidence, and an unsupported
|
|
98
|
+
comparison. Every drilldown must resolve to retained normalized and native
|
|
99
|
+
evidence. Use the following only when interactive filtering is needed; the
|
|
100
|
+
generated report itself needs no server:
|
|
101
|
+
|
|
102
|
+
```sh
|
|
103
|
+
ebo atlas serve .ebo/operator-smoke/atlas.json
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
This deterministic fixture begins after task admission and queue execution so
|
|
107
|
+
it can run without credentials. The production path below supplies those
|
|
108
|
+
earlier stages and uses the same corpus, observation, aggregation, and Atlas
|
|
109
|
+
commands after capture.
|
|
110
|
+
|
|
111
|
+
## Production workflow
|
|
112
|
+
|
|
113
|
+
Use one caller-owned directory for immutable inputs and separate new
|
|
114
|
+
destinations for derived outputs:
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
study/
|
|
118
|
+
├── bundle/
|
|
119
|
+
│ ├── packets/example-task.json
|
|
120
|
+
│ ├── freezes/example-task.json
|
|
121
|
+
│ ├── components/
|
|
122
|
+
│ └── configs/
|
|
123
|
+
├── experiment.json
|
|
124
|
+
├── queue.json
|
|
125
|
+
├── runs/
|
|
126
|
+
├── exports/
|
|
127
|
+
├── index.jsonl
|
|
128
|
+
├── observations/
|
|
129
|
+
├── judgments/
|
|
130
|
+
├── reviews/
|
|
131
|
+
├── aggregation.json
|
|
132
|
+
└── atlas.json
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
All paths in a packet or experiment are relative to its declared bundle root.
|
|
136
|
+
All digests are over the exact referenced bytes. Do not edit a frozen packet or
|
|
137
|
+
its referenced components; create a new packet/freeze identity instead.
|
|
138
|
+
|
|
139
|
+
### 1. Validate, admit, and freeze a packet
|
|
140
|
+
|
|
141
|
+
```sh
|
|
142
|
+
ebo task-packet validate \
|
|
143
|
+
study/bundle packets/example-task.json
|
|
144
|
+
ebo task-packet admit \
|
|
145
|
+
study/bundle packets/example-task.json
|
|
146
|
+
ebo task-packet freeze \
|
|
147
|
+
study/bundle packets/example-task.json freezes/example-task.json
|
|
148
|
+
ebo task-packet status \
|
|
149
|
+
study/bundle packets/example-task.json freezes/example-task.json
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Admission requires an existing human decision bound to the pre-admission
|
|
153
|
+
packet digest. The command validates that decision; it does not create one.
|
|
154
|
+
Keep restricted review records, reference solutions, and verifier sources out
|
|
155
|
+
of model-visible input and portable output.
|
|
156
|
+
|
|
157
|
+
### 2. Compile and inspect a queue
|
|
158
|
+
|
|
159
|
+
The experiment names caller-chosen task, model, harness, ordering, and capture
|
|
160
|
+
configuration references. EBO expands it deterministically; it does not choose
|
|
161
|
+
or retry cells.
|
|
162
|
+
|
|
163
|
+
```sh
|
|
164
|
+
ebo matrix compile \
|
|
165
|
+
study/experiment.json study/bundle study/queue.json \
|
|
166
|
+
--freeze-locator example-task=freezes/example-task.json
|
|
167
|
+
ebo queue inspect study/queue.json
|
|
168
|
+
ebo queue validate \
|
|
169
|
+
study/queue.json study/experiment.json --bundle-root study/bundle
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 3. Run one queue entry
|
|
173
|
+
|
|
174
|
+
Read the `runId` from the persisted queue; `queue inspect` checks its summary
|
|
175
|
+
but does not list entries. Execute exactly one entry. The output root and
|
|
176
|
+
optional workspace parent must be new or safely reusable parents; EBO never
|
|
177
|
+
replaces an existing attempt destination.
|
|
178
|
+
|
|
179
|
+
```sh
|
|
180
|
+
ebo agent-sdk run \
|
|
181
|
+
study/bundle study/queue.json <run-id> study/runs \
|
|
182
|
+
--workspace-root study/workspaces
|
|
183
|
+
|
|
184
|
+
# Or, for a queue compiled with the pinned Codex configuration:
|
|
185
|
+
ebo codex run \
|
|
186
|
+
study/bundle study/queue.json <run-id> study/runs \
|
|
187
|
+
--workspace-root study/workspaces
|
|
188
|
+
|
|
189
|
+
# Or, after injecting CURSOR_API_KEY through the approved secret environment,
|
|
190
|
+
# run a queue compiled with the pinned Cursor SDK configuration:
|
|
191
|
+
ebo cursor run \
|
|
192
|
+
study/bundle study/queue.json <run-id> study/runs
|
|
193
|
+
|
|
194
|
+
# Or, for a queue compiled with the pinned Pi SDK configuration:
|
|
195
|
+
ebo pi run \
|
|
196
|
+
study/bundle study/queue.json <run-id> study/runs \
|
|
197
|
+
--workspace-root study/workspaces
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Cursor uses the default system temporary workspace above because it rejects
|
|
201
|
+
workspaces nested under another Git checkout. Other adapters have their own
|
|
202
|
+
workspace policies.
|
|
203
|
+
|
|
204
|
+
OpenHands and DeepSeek are explicit library adapters today; their source-owned
|
|
205
|
+
capture functions are documented in their harness guides. Do not route them
|
|
206
|
+
through the Agent SDK, Codex, or Pi commands, and do not build a generic broker.
|
|
207
|
+
|
|
208
|
+
The run command prints the bundle path. A captured task failure, budget stop,
|
|
209
|
+
or infrastructure failure may still return a valid observation. Inspect the
|
|
210
|
+
manifest and capture report instead of treating process exit as task success.
|
|
211
|
+
|
|
212
|
+
### 4. Review capture and create a corpus index
|
|
213
|
+
|
|
214
|
+
```sh
|
|
215
|
+
ebo validate \
|
|
216
|
+
study/runs/<run-id>/<attempt-id>/manifest.json
|
|
217
|
+
ebo corpus build study/runs study/index.jsonl
|
|
218
|
+
ebo corpus validate study/runs study/index.jsonl
|
|
219
|
+
ebo corpus query study/index.jsonl \
|
|
220
|
+
--run <run-id> --assessment-mode observational
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Review `terminal`, `failureClass`, `captureQualification`, validation issues,
|
|
224
|
+
native session/turn IDs, telemetry receipt, workspace outcome, and retained
|
|
225
|
+
workspace paths. Missing evidence remains missing; never convert it to zero,
|
|
226
|
+
`false`, a fabricated event, or a successful outcome.
|
|
227
|
+
|
|
228
|
+
### 5. Export an approved derivative
|
|
229
|
+
|
|
230
|
+
Export is optional for local analysis. A policy is caller-owned and contains
|
|
231
|
+
the sharing class, bounds, and optionally caller-known confidential values that
|
|
232
|
+
the built-in secret checks or exporter environment cannot discover:
|
|
233
|
+
|
|
234
|
+
```json
|
|
235
|
+
{
|
|
236
|
+
"sharingClass": "partner",
|
|
237
|
+
"maxArtifactBytes": 16777216,
|
|
238
|
+
"maxStringBytes": 8192,
|
|
239
|
+
"sensitiveValues": ["<caller-known confidential value>"]
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Keep a policy containing `sensitiveValues` with restricted study inputs and do
|
|
244
|
+
not commit real values. They are scan inputs and are not copied into the
|
|
245
|
+
portable export.
|
|
246
|
+
|
|
247
|
+
```sh
|
|
248
|
+
ebo export create \
|
|
249
|
+
study/runs/<run-id>/<attempt-id> study/export-policy.json \
|
|
250
|
+
study/exports/<run-id>-<attempt-id>
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Export fails closed on unknown classifications, unsupported artifacts, digest
|
|
254
|
+
changes, local identifiers, hidden reasoning, or secret-scan findings. It
|
|
255
|
+
never mutates or grants sharing approval to the source bundle.
|
|
256
|
+
|
|
257
|
+
### 6. Normalize and extract structural observations
|
|
258
|
+
|
|
259
|
+
There is deliberately no free-standing `normalize` command. The observation
|
|
260
|
+
command selects the retained source adapter, revalidates native references and
|
|
261
|
+
coverage, normalizes only capture-qualified evidence, and writes structural
|
|
262
|
+
facts outside the native bundle.
|
|
263
|
+
|
|
264
|
+
```sh
|
|
265
|
+
ebo observations create \
|
|
266
|
+
study/runs/<run-id>/<attempt-id> \
|
|
267
|
+
study/observations/<run-id>-<attempt-id>.json
|
|
268
|
+
|
|
269
|
+
# Or rebuild observations for a qualified corpus selection:
|
|
270
|
+
ebo observations corpus \
|
|
271
|
+
study/runs study/index.jsonl study/observations \
|
|
272
|
+
--assessment-mode observational --capture qualified
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
The single-run form writes the explicit `<run-id>-<attempt-id>.json` path used
|
|
276
|
+
below. The corpus form writes `sha256-<digest>.json` files; locate a selected
|
|
277
|
+
attempt before judging it, for example with
|
|
278
|
+
`rg -l '"attemptId":"<attempt-id>"' study/observations/sha256-*.json`, and pass
|
|
279
|
+
that exact path to `judge run`. Process `qualified-with-gaps` captures only
|
|
280
|
+
after reviewing their explicit gaps, and use a separate new output root:
|
|
281
|
+
|
|
282
|
+
```sh
|
|
283
|
+
ebo observations corpus \
|
|
284
|
+
study/runs study/index.jsonl study/observations-with-gaps \
|
|
285
|
+
--assessment-mode observational --capture qualified-with-gaps
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Unmapped native records and unsupported capabilities remain explicit. Native
|
|
289
|
+
records remain authoritative and are referenced, not copied into a synthetic
|
|
290
|
+
common history.
|
|
291
|
+
|
|
292
|
+
### 7. Evaluate with a caller-selected judge
|
|
293
|
+
|
|
294
|
+
Judging is optional. The request selects a behavior dimension, rubric, exact
|
|
295
|
+
evidence IDs, limits, blinding, and either the Claude Agent SDK or Codex
|
|
296
|
+
app-server backend. EBO does not choose the evaluator or fall back between
|
|
297
|
+
providers.
|
|
298
|
+
|
|
299
|
+
```sh
|
|
300
|
+
ebo judge run \
|
|
301
|
+
study/runs/<run-id>/<attempt-id> \
|
|
302
|
+
study/observations/<run-id>-<attempt-id>.json \
|
|
303
|
+
study/judge-request.json study/judgments/<judgment-id>
|
|
304
|
+
ebo assertions validate \
|
|
305
|
+
study/runs/<run-id>/<attempt-id> \
|
|
306
|
+
study/judgments/<judgment-id>/assertion.json
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
The output is a proposal or abstention, never a human-confirmed label. See
|
|
310
|
+
[the semantic judge guide](../evaluation/semantic-judge.md) for the two backend shapes and
|
|
311
|
+
safe environment policy.
|
|
312
|
+
|
|
313
|
+
### 8. Review without fabricating human decisions
|
|
314
|
+
|
|
315
|
+
Selection and packet generation are deterministic. A human reads the local
|
|
316
|
+
packet and authors a decision file. EBO validates/imports that supplied
|
|
317
|
+
decision and its lineage; it never generates a human identity or decision.
|
|
318
|
+
|
|
319
|
+
```sh
|
|
320
|
+
ebo calibration sample \
|
|
321
|
+
study/review-sources.json study/review-criteria.json \
|
|
322
|
+
study/reviews/selection.json
|
|
323
|
+
ebo calibration packet \
|
|
324
|
+
study/reviews/selection.json study/reviews/packet
|
|
325
|
+
ebo calibration inspect \
|
|
326
|
+
study/reviews/packet/packet.json <assertion-id>
|
|
327
|
+
ebo calibration binding \
|
|
328
|
+
study/reviews/selection.json <assertion-id>
|
|
329
|
+
ebo calibration import \
|
|
330
|
+
study/reviews/selection.json study/reviews/history.json \
|
|
331
|
+
study/reviews/decision.json
|
|
332
|
+
|
|
333
|
+
# For a later decision, bind it to the existing history:
|
|
334
|
+
ebo calibration binding \
|
|
335
|
+
study/reviews/selection.json <assertion-id> study/reviews/history.json
|
|
336
|
+
ebo calibration summarize \
|
|
337
|
+
study/reviews/selection.json study/reviews/history.json \
|
|
338
|
+
study/reviews/summary.json
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Use `calibration adjudicate` with an adjudication decision when the documented
|
|
342
|
+
review workflow requires it. Do not copy the synthetic fixture reviewer into a
|
|
343
|
+
real study.
|
|
344
|
+
|
|
345
|
+
### 9. Aggregate and build the Atlas
|
|
346
|
+
|
|
347
|
+
`aggregation.json` explicitly lists the current corpus index, observation
|
|
348
|
+
sets, assertions, calibration history, grouping, attempt-selection policy,
|
|
349
|
+
recurrence threshold, and any comparison gates.
|
|
350
|
+
|
|
351
|
+
```sh
|
|
352
|
+
ebo comparison check study/comparison-request.json \
|
|
353
|
+
> study/comparison-report.json
|
|
354
|
+
ebo aggregate build \
|
|
355
|
+
study/aggregation.json study/aggregate.json
|
|
356
|
+
ebo atlas build study/atlas.json study/atlas-output
|
|
357
|
+
ebo atlas serve study/atlas.json --port 13011
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
The `report` field for each gate in `aggregation.json` must name the exact file
|
|
361
|
+
written above. Inspect its supported, qualified-with-caveats, or unsupported
|
|
362
|
+
status before aggregation; redirecting stdout persists the inspectable report
|
|
363
|
+
even when an unsupported comparison returns nonzero.
|
|
364
|
+
|
|
365
|
+
The Atlas consumes existing evidence and review state; it does not run a judge
|
|
366
|
+
or edit decisions. Local restricted reports and sanitized shareable summaries
|
|
367
|
+
are separate modes. See [the Atlas guide](atlas.md) before using `--share`.
|
|
368
|
+
|
|
369
|
+
## Failure recovery
|
|
370
|
+
|
|
371
|
+
| Signal | Preserve and inspect | Recovery |
|
|
372
|
+
|---|---|---|
|
|
373
|
+
| packet/freeze digest mismatch | packet, referenced bytes, freeze record | restore exact admitted bytes or create and admit a new packet; never rewrite the old freeze |
|
|
374
|
+
| stale or invalid queue | experiment, packet freeze, all configuration digests | compile a new queue after correcting inputs; do not edit run identities in place |
|
|
375
|
+
| run cannot start | CLI error and unchanged input bundle | correct auth/runtime/configuration, then use a new output destination |
|
|
376
|
+
| interrupted or failed attempt | partial manifest, native JSONL, diagnostics, capture report, retained workspace path | keep the partial bundle; use the linked-retry API below or record a CLI rerun as an independent attempt |
|
|
377
|
+
| missing collector receipt | native stream/hooks plus explicit telemetry gap | repair/check the collector for a later attempt; do not claim receipt or discard otherwise valid native evidence |
|
|
378
|
+
| workspace packaging/cleanup failure | `retainedWorkspacePath` from the summary | recover from that path before manual cleanup; do not infer an outcome without retained workspace evidence |
|
|
379
|
+
| export rejected | source bundle plus export diagnostics | correct the policy/input or remove the detected secret at its source; use a new export destination |
|
|
380
|
+
| stale corpus/derived output | source manifests and current index validation errors | rebuild the index and derived outputs into new paths |
|
|
381
|
+
| judge failure/abstention | bounded input, raw output/failure record, selected evidence | preserve it; change inputs/configuration only in a new judgment run |
|
|
382
|
+
| Atlas rejects inputs | corpus validation, assertion/review lineage, comparison gates, source digests | repair/rebuild the upstream derived artifact; never serve a stale cached report |
|
|
383
|
+
|
|
384
|
+
The `agent-sdk run` and `codex run` commands currently create independent
|
|
385
|
+
attempts with no `retryOf` option. Never describe an ordinary CLI rerun as a
|
|
386
|
+
linked retry. Embedded operators for the Agent SDK, Codex, or OpenHands capture
|
|
387
|
+
paths can preserve lineage with the existing lifecycle helper and a new bundle
|
|
388
|
+
destination:
|
|
389
|
+
|
|
390
|
+
```ts
|
|
391
|
+
import {
|
|
392
|
+
captureClaudeAgentSdkRun,
|
|
393
|
+
retryAttempt,
|
|
394
|
+
} from "engineering-behavior-observatory";
|
|
395
|
+
|
|
396
|
+
const attempt = retryAttempt(previousCaptureResult.attempt);
|
|
397
|
+
|
|
398
|
+
await captureClaudeAgentSdkRun({
|
|
399
|
+
...captureOptions,
|
|
400
|
+
definition: {
|
|
401
|
+
...captureOptions.definition,
|
|
402
|
+
bundleRoot: newBundleRoot,
|
|
403
|
+
bundleId: newBundleId,
|
|
404
|
+
attempt,
|
|
405
|
+
},
|
|
406
|
+
});
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Use the same `RunBundleDefinition.attempt` composition with
|
|
410
|
+
`captureCodexAppServerRun` or `captureOpenHandsAgentServerRun`. A linked-retry
|
|
411
|
+
operator can use this form only while it retains the prior capture result in
|
|
412
|
+
process; these wrappers do not write a standalone lifecycle attempt record.
|
|
413
|
+
Cross-process retry lineage and any other source without an equivalent capture
|
|
414
|
+
composition are unsupported. Do not synthesize lineage in a manifest
|
|
415
|
+
afterward.
|
|
416
|
+
|
|
417
|
+
## Command reference
|
|
418
|
+
|
|
419
|
+
`ebo --help` is the authoritative command reference and must be
|
|
420
|
+
checked after every CLI change. The commands used above correspond to these
|
|
421
|
+
families: `task-packet`, `matrix`, `queue`, `agent-sdk`, `codex`, `export`,
|
|
422
|
+
`corpus`, `observations`, `assertions`, `judge`, `calibration`, `comparison`,
|
|
423
|
+
`aggregate`, and `atlas`. Do not document a command that is absent from that
|
|
424
|
+
output.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Quickstart
|
|
2
|
+
|
|
3
|
+
**Goal:** install the `ebo` command, inspect a report, and know what is needed
|
|
4
|
+
to capture a real engineering task.
|
|
5
|
+
|
|
6
|
+
## Install from npm
|
|
7
|
+
|
|
8
|
+
Requires Node **24.19.0** and npm:
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npm install -g engineering-behavior-observatory
|
|
12
|
+
ebo --help
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
For a one-off invocation:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
npm exec --package=engineering-behavior-observatory -- ebo --help
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The package name is `engineering-behavior-observatory` and the executable is
|
|
22
|
+
`ebo`. Avoid `npx ebo`, which targets another package. These installations
|
|
23
|
+
include the runtime and documentation. The synthetic demo below requires a
|
|
24
|
+
source checkout because its generator and test fixtures are not packaged.
|
|
25
|
+
|
|
26
|
+
## Install from source
|
|
27
|
+
|
|
28
|
+
Use Git, npm, and Node **24.19.0** (the repository's `.nvmrc` pin). If you use
|
|
29
|
+
nvm:
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
git clone https://github.com/trilogy-group/engineering-behavior-observatory.git
|
|
33
|
+
cd engineering-behavior-observatory
|
|
34
|
+
nvm install
|
|
35
|
+
nvm use
|
|
36
|
+
npm ci
|
|
37
|
+
npm run build
|
|
38
|
+
npm link
|
|
39
|
+
ebo --help
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Repository access is required. `npm link` exposes the package's existing
|
|
43
|
+
`bin.ebo` entry; it does not create a different CLI. It links the current
|
|
44
|
+
checkout globally for the active Node installation. Keep the checkout and
|
|
45
|
+
rebuild after updates. If `ebo` is not found, check that `npm prefix -g`'s
|
|
46
|
+
`bin` directory is on PATH and that you selected the same Node installation.
|
|
47
|
+
|
|
48
|
+
To avoid a global link, use `npm run ebo -- --help` from the repository.
|
|
49
|
+
Replace `ebo` with `npm run ebo --` in later examples.
|
|
50
|
+
|
|
51
|
+
## Install from a release archive
|
|
52
|
+
|
|
53
|
+
Download the package and `SHA256SUMS` from a
|
|
54
|
+
[GitHub release](https://github.com/trilogy-group/engineering-behavior-observatory/releases).
|
|
55
|
+
For v0.2.1, from the download directory:
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
shasum -a 256 -c SHA256SUMS
|
|
59
|
+
npm install --global ./engineering-behavior-observatory-0.2.1.tgz
|
|
60
|
+
ebo --help
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Use the release's pinned Node version. On systems without `shasum`, use
|
|
64
|
+
`sha256sum -c SHA256SUMS`. Installing the archive uses the exact bytes checked
|
|
65
|
+
against the release checksum.
|
|
66
|
+
|
|
67
|
+
A release archive includes compiled runtime code, schemas, and documentation.
|
|
68
|
+
The synthetic demo generator and test fixtures below require a source checkout.
|
|
69
|
+
|
|
70
|
+
## First look: no credentials or model calls
|
|
71
|
+
|
|
72
|
+
From the built source checkout:
|
|
73
|
+
|
|
74
|
+
```sh
|
|
75
|
+
node dist/test/atlas-fixture.js .ebo/first-look
|
|
76
|
+
ebo corpus validate .ebo/first-look/corpus .ebo/first-look/index.jsonl
|
|
77
|
+
ebo corpus query .ebo/first-look/index.jsonl
|
|
78
|
+
ebo atlas build .ebo/first-look/atlas.json .ebo/first-report
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Open `.ebo/first-report/index.html` in your browser (on macOS,
|
|
82
|
+
`open .ebo/first-report/index.html`). No server is needed for the static report.
|
|
83
|
+
|
|
84
|
+
The data and reviewer decisions are **synthetic**, not model findings. Explore
|
|
85
|
+
a proposed assertion, its citation, its native record, and a missing-evidence
|
|
86
|
+
case. The fixture includes an unsupported comparison so you can see how it is
|
|
87
|
+
excluded. Repeating the demo requires new destination paths.
|
|
88
|
+
|
|
89
|
+
For interactive filtering:
|
|
90
|
+
|
|
91
|
+
```sh
|
|
92
|
+
ebo atlas serve .ebo/first-look/atlas.json
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Open the printed loopback URL. Stop with Ctrl-C. See
|
|
96
|
+
[Atlas and Grafana](atlas.md) for dashboard setup.
|
|
97
|
+
|
|
98
|
+
## Capture a real task
|
|
99
|
+
|
|
100
|
+
A run consumes a frozen packet and queue. Prepare these inputs once per
|
|
101
|
+
experiment; task authorship remains outside the current CLI:
|
|
102
|
+
|
|
103
|
+
| Input | What you supply | Instructions |
|
|
104
|
+
| :--- | :--- | :--- |
|
|
105
|
+
| Task packet | Prompt, sanitized repository archive, provenance, allowed files, sharing class | [Packet contract](../reference/contracts.md#task-packets) |
|
|
106
|
+
| Admission record | Your human review, bound to the pre-admission packet digest | [Admission and freeze](../reference/contracts.md#admission-and-freeze) |
|
|
107
|
+
| Harness configuration | Model, runtime, limits, tool policy, capture profile; no credential values | [Harness guides](../harnesses/README.md) |
|
|
108
|
+
| Experiment | References and digests, condition IDs, trial count, ordering, wall-clock limit | [Experiment contract](../reference/contracts.md#experiments) |
|
|
109
|
+
| Authentication | An approved route for the chosen harness, supplied outside artifacts | Your harness guide |
|
|
110
|
+
|
|
111
|
+
Choose `assessmentMode: "observational"` for open-ended work such as a
|
|
112
|
+
refactor or UI redesign. There is no reference answer and no verifier to invent.
|
|
113
|
+
Review the source archive for credentials before admission. Run only code and
|
|
114
|
+
tools you trust, or provide real OS/container isolation.
|
|
115
|
+
|
|
116
|
+
Follow [operator steps 1–2](operator-guide.md#1-validate-admit-and-freeze-a-packet)
|
|
117
|
+
to validate, admit, freeze, and compile. Read an entry's `runId` from
|
|
118
|
+
`study/queue.json`; `queue inspect` prints a summary, not an entry list.
|
|
119
|
+
|
|
120
|
+
Once those inputs exist, this executes one Claude Agent SDK attempt:
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
ebo agent-sdk run study/bundle study/queue.json <run-id> study/runs
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Use `ebo codex run`, `ebo cursor run`, or `ebo pi run` with the
|
|
127
|
+
corresponding source-specific queue. OpenHands and DeepSeek currently use
|
|
128
|
+
library capture APIs, not CLI run commands. Authentication and permitted tools
|
|
129
|
+
are harness-specific; do not reuse another harness's configuration.
|
|
130
|
+
|
|
131
|
+
## Inspect the result
|
|
132
|
+
|
|
133
|
+
The run prints a JSON summary with `bundlePath`, terminal/classification, and
|
|
134
|
+
capture qualification. Substitute that returned path below:
|
|
135
|
+
|
|
136
|
+
```sh
|
|
137
|
+
ebo validate <bundle-root>/manifest.json
|
|
138
|
+
ebo observations create <bundle-root> study/observations.json
|
|
139
|
+
ebo corpus build study/runs study/index.jsonl
|
|
140
|
+
ebo corpus query study/index.jsonl --assessment-mode observational
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Schema validation alone is not capture qualification. Read the capture report
|
|
144
|
+
and missing-evidence reasons; observations revalidate the native source.
|
|
145
|
+
A stopped or failed attempt can be useful evidence. `completed` means the
|
|
146
|
+
agent loop ended, not that the stakeholder approved its work.
|
|
147
|
+
|
|
148
|
+
Continue with [evidence and sharing](evidence-and-sharing.md), or use
|
|
149
|
+
[the evaluation workflow](../evaluation/README.md) to construct judgments and
|
|
150
|
+
comparisons. Real Atlas reports need an explicit aggregation/Atlas request;
|
|
151
|
+
the synthetic demo's assertions and human decisions are not a template for
|
|
152
|
+
labeling your real runs.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Telemetry and behavioral evidence
|
|
2
|
+
|
|
3
|
+
EBO keeps two complementary views:
|
|
4
|
+
|
|
5
|
+
- **Native trajectory evidence** tells you what the agent or harness emitted:
|
|
6
|
+
messages, tools, context changes, lifecycle, and workspace outcomes.
|
|
7
|
+
- **OpenTelemetry signals** supply exposed timing and resource evidence. OTLP
|
|
8
|
+
is a delivery protocol, not a behavior ontology.
|
|
9
|
+
|
|
10
|
+
A trace is useful for latency and operation structure. A behavioral assessment
|
|
11
|
+
also needs task context, cited native records, and an interpretation that can
|
|
12
|
+
be reviewed.
|
|
13
|
+
|
|
14
|
+
## Know what the adapter can capture
|
|
15
|
+
|
|
16
|
+
| Harness | Telemetry boundary |
|
|
17
|
+
| :--- | :--- |
|
|
18
|
+
| Claude Agent SDK | Optional native exporters; content opt-in, traces beta, detailed hook spans separately gated |
|
|
19
|
+
| Codex | Owned local OTLP/HTTP JSON receiver; logs, traces, metrics checked independently |
|
|
20
|
+
| Cursor | No selected SDK-local OTLP receipt API; Enterprise server-side metrics/logs are a separate integration |
|
|
21
|
+
| Pi | No verified native OTLP receipt surface at the pinned SDK |
|
|
22
|
+
| OpenHands | Exposed server/API evidence is not proof of complete native OTLP delivery |
|
|
23
|
+
| DeepSeek Harness | Session telemetry and durable events follow the selected runtime composition; do not infer unseen signals |
|
|
24
|
+
|
|
25
|
+
See [harness guides](../harnesses/README.md) for pins and exact capabilities.
|
|
26
|
+
Availability changes by runtime; record what was observed for each attempt.
|
|
27
|
+
|
|
28
|
+
## Configuration is not receipt
|
|
29
|
+
|
|
30
|
+
Short export intervals **and** clean shutdown reduce loss from buffered
|
|
31
|
+
telemetry. Neither guarantees delivery. Inspect receipt state for each signal:
|
|
32
|
+
`received`, `missing`, `not-checked`, `disabled`, or `unsupported`
|
|
33
|
+
where the source contract supports it.
|
|
34
|
+
|
|
35
|
+
Keep content capture off unless explicitly approved. Never use a console
|
|
36
|
+
exporter on stdout when stdout is the SDK or JSON-RPC message channel.
|
|
37
|
+
Diagnostics belong on the source's supported diagnostic channel.
|
|
38
|
+
|
|
39
|
+
## Grafana: two different data paths
|
|
40
|
+
|
|
41
|
+
EBO's [Atlas Grafana integration](atlas.md#grafana) queries derived EBO JSON
|
|
42
|
+
through Infinity. That provides cohort tables and links to cited evidence;
|
|
43
|
+
it does **not** ingest OTLP or store traces.
|
|
44
|
+
|
|
45
|
+
To inspect native traces, use a separately configured trace backend such as
|
|
46
|
+
Tempo and a Grafana data source. The Atlas request can link an exact run/attempt
|
|
47
|
+
to a known trace ID. The existing backend must already contain that trace;
|
|
48
|
+
Atlas neither replays retained data nor invents a temporal join.
|
|
49
|
+
|
|
50
|
+
Keep collector storage and dashboards local or in an approved environment.
|
|
51
|
+
Native telemetry can contain restricted metadata even when prompt capture is off.
|
|
52
|
+
|
|
53
|
+
## Interpret resource metrics carefully
|
|
54
|
+
|
|
55
|
+
Usage channels may report increments, cumulative snapshots, final totals, or
|
|
56
|
+
billing readback. Follow the adapter's authority rules; adding every snapshot
|
|
57
|
+
double-counts work.
|
|
58
|
+
|
|
59
|
+
Preserve input, output, cache, and reasoning categories as supplied. A cache or
|
|
60
|
+
reasoning subset is not necessarily an additional token category to add to a
|
|
61
|
+
total. A reported dollar estimate is not automatically a charge, and neither
|
|
62
|
+
tokens nor that estimate establish subscription quota consumption. Record any
|
|
63
|
+
separate quota observation with its source and time.
|
|
64
|
+
|
|
65
|
+
[Structural observations](../evaluation/structural-observations.md) documents
|
|
66
|
+
the implemented accounting and availability rules.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Choose a harness
|
|
2
|
+
|
|
3
|
+
Choose the environment whose behavior you want to study. A shared model behind
|
|
4
|
+
different tools or context policies is a different experimental condition.
|
|
5
|
+
|
|
6
|
+
| Harness | Execute through | Distinctive evidence | Important limit |
|
|
7
|
+
| :--- | :--- | :--- | :--- |
|
|
8
|
+
| [Claude Agent SDK](claude-agent-sdk.md) | `ebo agent-sdk run` | SDK stream and passive lifecycle hooks; optional OTLP | Tracing is beta; configured export is not receipt |
|
|
9
|
+
| [Codex](codex-harness.md) | `ebo codex run` | Owned app-server thread/turn/item protocol and history | Requires the pinned runtime; no desktop-daemon attachment |
|
|
10
|
+
| [Cursor](cursor-sdk.md) | `ebo cursor run` | Stream, callbacks, official JSONL store, terminal and billing readback | Local SDK OTLP unavailable; Enterprise export is a separate, unqualified integration |
|
|
11
|
+
| [Pi](pi-sdk.md) | `ebo pi run` | Native session tree, extension observer, retries/compaction | No verified native OTLP receipt; local SDK is not an OS sandbox |
|
|
12
|
+
| [OpenHands](openhands-agent-server.md) | `captureOpenHandsAgentServerRun` library API | REST final events reconciled with WebSocket receipts | Full internal EventLog completeness cannot be proven through this boundary |
|
|
13
|
+
| [DeepSeek Harness](deepseek-harness.md) | Source-specific library API | Durable events, lifecycle, runtime/plugin composition | Prompt response is enqueue acknowledgement; documented status/events determine completion |
|
|
14
|
+
|
|
15
|
+
All six have retained-evidence paths for normalization and behavioral analysis.
|
|
16
|
+
That does not mean their capabilities are identical or every provider route is
|
|
17
|
+
live-qualified. Consult the [release support record](../../release/0.2.1/KNOWN_LIMITATIONS.md)
|
|
18
|
+
and each guide before selecting a route.
|
|
19
|
+
|
|
20
|
+
## Before a live run
|
|
21
|
+
|
|
22
|
+
1. Install the selected runtime and confirm its required version.
|
|
23
|
+
2. Establish an authenticated model route without putting secrets in artifacts.
|
|
24
|
+
3. Review tool permissions and workspace isolation. A disposable directory is
|
|
25
|
+
not a security sandbox.
|
|
26
|
+
4. Freeze the source-specific settings alongside task inputs.
|
|
27
|
+
5. Inspect capability and missing-evidence reports after capture.
|
|
28
|
+
|
|
29
|
+
Native histories, streamed deltas, billing snapshots, and telemetry can overlap.
|
|
30
|
+
Each adapter declares which source owns a count; EBO does not sum every received
|
|
31
|
+
record as a new action or token increment.
|