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.
Files changed (178) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +151 -0
  3. package/contracts/codex-app-server-0.150.1/manifest.json +25 -0
  4. package/contracts/codex-app-server-0.150.1/schema/InitializeParams.json +84 -0
  5. package/contracts/codex-app-server-0.150.1/schema/JSONRPCMessage.json +137 -0
  6. package/contracts/codex-app-server-0.150.1/schema/v2/ThreadReadParams.json +17 -0
  7. package/contracts/codex-app-server-0.150.1/schema/v2/ThreadTokenUsageUpdatedNotification.json +82 -0
  8. package/contracts/codex-app-server-0.150.1/schema/v2/TurnInterruptParams.json +17 -0
  9. package/contracts/codex-app-server-0.150.1/types/AskForApproval.ts +5 -0
  10. package/contracts/codex-app-server-0.150.1/types/ClientNotification.ts +5 -0
  11. package/contracts/codex-app-server-0.150.1/types/SandboxMode.ts +5 -0
  12. package/contracts/codex-app-server-0.150.1/types/ThreadReadParams.ts +9 -0
  13. package/contracts/codex-app-server-0.150.1/types/TokenUsageBreakdown.ts +5 -0
  14. package/contracts/codex-app-server-0.150.1/types/TurnInterruptParams.ts +5 -0
  15. package/contracts/codex-app-server-0.153.4/manifest.json +27 -0
  16. package/contracts/codex-app-server-0.153.4/schema/JSONRPCMessage.json +137 -0
  17. package/contracts/codex-app-server-0.153.4/schema/v1/InitializeParams.json +84 -0
  18. package/contracts/codex-app-server-0.153.4/schema/v2/ThreadReadParams.json +17 -0
  19. package/contracts/codex-app-server-0.153.4/schema/v2/ThreadStartParams.json +515 -0
  20. package/contracts/codex-app-server-0.153.4/schema/v2/ThreadTokenUsageUpdatedNotification.json +82 -0
  21. package/contracts/codex-app-server-0.153.4/schema/v2/TurnInterruptParams.json +17 -0
  22. package/contracts/codex-app-server-0.153.4/schema/v2/TurnStartParams.json +921 -0
  23. package/contracts/codex-app-server-0.153.4/types/AskForApproval.ts +5 -0
  24. package/contracts/codex-app-server-0.153.4/types/ClientNotification.ts +5 -0
  25. package/contracts/codex-app-server-0.153.4/types/SandboxMode.ts +5 -0
  26. package/contracts/codex-app-server-0.153.4/types/ThreadReadParams.ts +12 -0
  27. package/contracts/codex-app-server-0.153.4/types/TokenUsageBreakdown.ts +5 -0
  28. package/contracts/codex-app-server-0.153.4/types/TurnInterruptParams.ts +5 -0
  29. package/contracts/openhands-agent-server-v1.44.1.json +65 -0
  30. package/contracts/openhands-agent-server-v1.46.0.json +46 -0
  31. package/dist/contracts/codex-app-server-0.153.4/types/AskForApproval.d.ts +9 -0
  32. package/dist/contracts/codex-app-server-0.153.4/types/AskForApproval.js +2 -0
  33. package/dist/contracts/codex-app-server-0.153.4/types/ClientNotification.d.ts +3 -0
  34. package/dist/contracts/codex-app-server-0.153.4/types/ClientNotification.js +2 -0
  35. package/dist/contracts/codex-app-server-0.153.4/types/SandboxMode.d.ts +1 -0
  36. package/dist/contracts/codex-app-server-0.153.4/types/SandboxMode.js +2 -0
  37. package/dist/contracts/codex-app-server-0.153.4/types/ThreadReadParams.d.ts +10 -0
  38. package/dist/contracts/codex-app-server-0.153.4/types/ThreadReadParams.js +2 -0
  39. package/dist/contracts/codex-app-server-0.153.4/types/TokenUsageBreakdown.d.ts +8 -0
  40. package/dist/contracts/codex-app-server-0.153.4/types/TokenUsageBreakdown.js +2 -0
  41. package/dist/contracts/codex-app-server-0.153.4/types/TurnInterruptParams.d.ts +4 -0
  42. package/dist/contracts/codex-app-server-0.153.4/types/TurnInterruptParams.js +2 -0
  43. package/dist/src/agent-sdk-normalizer.d.ts +22 -0
  44. package/dist/src/agent-sdk-normalizer.js +995 -0
  45. package/dist/src/agent-sdk-run.d.ts +31 -0
  46. package/dist/src/agent-sdk-run.js +242 -0
  47. package/dist/src/agent-sdk-runner.d.ts +96 -0
  48. package/dist/src/agent-sdk-runner.js +407 -0
  49. package/dist/src/agent-sdk.d.ts +294 -0
  50. package/dist/src/agent-sdk.js +644 -0
  51. package/dist/src/aggregation.d.ts +183 -0
  52. package/dist/src/aggregation.js +513 -0
  53. package/dist/src/artifacts.d.ts +36 -0
  54. package/dist/src/artifacts.js +1372 -0
  55. package/dist/src/atlas-grafana.d.ts +377 -0
  56. package/dist/src/atlas-grafana.js +47 -0
  57. package/dist/src/atlas-html.d.ts +2 -0
  58. package/dist/src/atlas-html.js +34 -0
  59. package/dist/src/atlas.d.ts +130 -0
  60. package/dist/src/atlas.js +235 -0
  61. package/dist/src/behavior-assertions.d.ts +95 -0
  62. package/dist/src/behavior-assertions.js +154 -0
  63. package/dist/src/cli.d.ts +5 -0
  64. package/dist/src/cli.js +957 -0
  65. package/dist/src/codex-judge.d.ts +44 -0
  66. package/dist/src/codex-judge.js +214 -0
  67. package/dist/src/codex-run.d.ts +114 -0
  68. package/dist/src/codex-run.js +519 -0
  69. package/dist/src/codex.d.ts +187 -0
  70. package/dist/src/codex.js +1028 -0
  71. package/dist/src/contracts.d.ts +155 -0
  72. package/dist/src/contracts.js +866 -0
  73. package/dist/src/corpus.d.ts +67 -0
  74. package/dist/src/corpus.js +540 -0
  75. package/dist/src/cursor-sdk-runner.d.ts +81 -0
  76. package/dist/src/cursor-sdk-runner.js +362 -0
  77. package/dist/src/cursor-sdk.d.ts +81 -0
  78. package/dist/src/cursor-sdk.js +1078 -0
  79. package/dist/src/deepseek-adapter.d.ts +152 -0
  80. package/dist/src/deepseek-adapter.js +777 -0
  81. package/dist/src/exports.d.ts +69 -0
  82. package/dist/src/exports.js +966 -0
  83. package/dist/src/human-calibration.d.ts +167 -0
  84. package/dist/src/human-calibration.js +618 -0
  85. package/dist/src/index.d.ts +71 -0
  86. package/dist/src/index.js +38 -0
  87. package/dist/src/lifecycle.d.ts +196 -0
  88. package/dist/src/lifecycle.js +1889 -0
  89. package/dist/src/normalization-integrity.d.ts +128 -0
  90. package/dist/src/normalization-integrity.js +429 -0
  91. package/dist/src/openhands-run.d.ts +36 -0
  92. package/dist/src/openhands-run.js +415 -0
  93. package/dist/src/openhands.d.ts +130 -0
  94. package/dist/src/openhands.js +859 -0
  95. package/dist/src/pi.d.ts +203 -0
  96. package/dist/src/pi.js +1345 -0
  97. package/dist/src/process-protocol.d.ts +245 -0
  98. package/dist/src/process-protocol.js +1261 -0
  99. package/dist/src/retained-evidence.d.ts +12 -0
  100. package/dist/src/retained-evidence.js +201 -0
  101. package/dist/src/run-bundles.d.ts +193 -0
  102. package/dist/src/run-bundles.js +993 -0
  103. package/dist/src/scheduler.d.ts +109 -0
  104. package/dist/src/scheduler.js +1080 -0
  105. package/dist/src/semantic-judge.d.ts +194 -0
  106. package/dist/src/semantic-judge.js +875 -0
  107. package/dist/src/structural-observations.d.ts +124 -0
  108. package/dist/src/structural-observations.js +671 -0
  109. package/dist/src/task-packets.d.ts +115 -0
  110. package/dist/src/task-packets.js +683 -0
  111. package/dist/src/uniform-events.d.ts +120 -0
  112. package/dist/src/uniform-events.js +158 -0
  113. package/dist/src/verifiers.d.ts +116 -0
  114. package/dist/src/verifiers.js +819 -0
  115. package/dist/src/workspaces.d.ts +56 -0
  116. package/dist/src/workspaces.js +1314 -0
  117. package/docs/README.md +60 -0
  118. package/docs/development/README.md +71 -0
  119. package/docs/development/documentation-sync.md +58 -0
  120. package/docs/development/extension-contracts.md +307 -0
  121. package/docs/evaluation/README.md +48 -0
  122. package/docs/evaluation/aggregation.md +112 -0
  123. package/docs/evaluation/behavior-assertions.md +45 -0
  124. package/docs/evaluation/human-calibration.md +170 -0
  125. package/docs/evaluation/normalization-integrity.md +80 -0
  126. package/docs/evaluation/semantic-judge.md +188 -0
  127. package/docs/evaluation/structural-observations.md +84 -0
  128. package/docs/evaluation/uniform-events.md +131 -0
  129. package/docs/guides/atlas.md +144 -0
  130. package/docs/guides/evidence-and-sharing.md +100 -0
  131. package/docs/guides/operator-guide.md +424 -0
  132. package/docs/guides/quickstart.md +152 -0
  133. package/docs/guides/telemetry.md +66 -0
  134. package/docs/harnesses/README.md +31 -0
  135. package/docs/harnesses/claude-agent-sdk.md +61 -0
  136. package/docs/harnesses/codex-harness.md +174 -0
  137. package/docs/harnesses/cursor-sdk.md +149 -0
  138. package/docs/harnesses/deepseek-harness.md +134 -0
  139. package/docs/harnesses/openhands-agent-server.md +153 -0
  140. package/docs/harnesses/pi-sdk.md +66 -0
  141. package/docs/reference/README.md +19 -0
  142. package/docs/reference/agent-sdk-operational-runner.md +118 -0
  143. package/docs/reference/cli.md +114 -0
  144. package/docs/reference/contracts.md +222 -0
  145. package/docs/reference/run-bundle-contract.md +354 -0
  146. package/docs/reference/run-lifecycle.md +54 -0
  147. package/examples/cursor-sdk/README.md +11 -0
  148. package/examples/cursor-sdk/capture-profile.json +1 -0
  149. package/examples/cursor-sdk/harness.json +1 -0
  150. package/examples/cursor-sdk/model.json +1 -0
  151. package/examples/cursor-sdk/native-limits.json +1 -0
  152. package/examples/cursor-sdk/native-tool-policy.json +1 -0
  153. package/ontology/behavior-categories.v1.json +46 -0
  154. package/package.json +66 -0
  155. package/release/0.1.0/KNOWN_LIMITATIONS.md +35 -0
  156. package/release/0.1.0/README.md +46 -0
  157. package/release/0.1.0/reproducibility.json +61 -0
  158. package/release/0.2.0/KNOWN_LIMITATIONS.md +40 -0
  159. package/release/0.2.0/README.md +42 -0
  160. package/release/0.2.0/reproducibility.json +73 -0
  161. package/release/0.2.1/KNOWN_LIMITATIONS.md +18 -0
  162. package/release/0.2.1/README.md +63 -0
  163. package/release/0.2.1/reproducibility.json +73 -0
  164. package/release/README.md +13 -0
  165. package/schemas/aggregation.v1.json +293 -0
  166. package/schemas/behavior-assertions.v1.json +220 -0
  167. package/schemas/deepseek-runtime-composition.v1.schema.json +122 -0
  168. package/schemas/experiment.v1.schema.json +188 -0
  169. package/schemas/human-calibration.v1.json +336 -0
  170. package/schemas/normalization-integrity.v1.json +302 -0
  171. package/schemas/run-bundles/v1.json +1040 -0
  172. package/schemas/run-queue.v1.schema.json +206 -0
  173. package/schemas/semantic-judge.v1.json +380 -0
  174. package/schemas/structural-observations.v1.json +131 -0
  175. package/schemas/task-packet-freeze.v1.schema.json +106 -0
  176. package/schemas/task-packet.v1.schema.json +234 -0
  177. package/schemas/uniform-events/v1.json +289 -0
  178. 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.