You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
auto-experiment: name the root cause of pup's write exit codes, and the pending fix
The exit-code warning said pup's experiment writes "fail while deserializing the API's response"
without saying why, which makes it impossible to tell whether an installed build is affected.
Both causes are now stated, each confirmed against the live API:
* `experiments update` — a successful PATCH answers HTTP 200 with a ZERO-BYTE body, which the
generated typed client hands to serde_json::from_str, failing with "EOF while parsing a value".
* `experiments create` — the 200 response omits `config`, a field the generated model requires,
giving "missing field config".
Neither is a request failure. In one run this fired four times and all four writes had applied.
Also records that DataDog/pup#682 fixes both, by routing these two writes through pup's raw client
(as every other llm-obs command already does) and making parse_response_json treat an empty
successful body as JSON null. With that build update exits 0 and prints
{"experiment_id": ..., "status": "updated"}, and create exits 0 returning the new id.
That PR is OPEN, NOT MERGED, and the skill says so rather than describing unreleased behaviour as
current. The detection advice is deliberately not "check the version": run the command and compare
the exit code against a read-back, the same discipline the rest of this file uses — a version
number would not have caught the --help probe that reported records-all present on a binary that
lacked it.
The setup gate keeps read-back unconditionally, since it is correct on both builds and avoids
branching on which one is installed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
which the `unstable` REST route does not. The skill never creates an experiment — the id is an
400
415
input — so this only matters if you are provisioning one by hand.
@@ -481,7 +496,7 @@ ran because you intended it to.
481
496
| 3 |`config.json` written | file exists with every required field populated (incl. the resolved `files_to_optimize` list, `evaluators` verbatim, data source) |
482
497
| 4 | experiment id |`$experiment-id` validated as a UUID at the intake gate and persisted to `config.json` as `dd_auto_experiment_id`|
483
498
| 5 | run context on experiment | confirm the `update_llmobs_experiment` call (or `pup llm-obs experiments update`) **actually returned a success response in hand** (not merely that you intended to call it). For the us5 MCP that response is `updated_fields` containing `"metadata"` — accept that, or any non-error response acknowledging the metadata write if the tool's shape differs. The check is "the call was made and acknowledged", so do not hard-block on one exact field name; if it errored or was never called, re-run it. |
484
-
| 6 | backend reachable | with `datadog_backend: pup`, `pup auth status` (or `$PUP_BIN auth status`) returned `authenticated: true` for the expected site — run the check, don't assume the binary works. A missing or unauthenticated pup is a **STOP**, not a fallback (see **Datadog backend**). With `datadog_backend: mcp`, step 5's acknowledged response is itself the proof the backend is reachable. Record `backend_used` in `config.json` either way. **Under pup, satisfy step 5 by reading the experiment back** (`pup llm-obs experiments list --filter-project-id …` and confirm the metadata/status you just wrote), because `experiments update` exits non-zero on a response-parsing bug even when the write landed — an exit-code check would fail a step that actually succeeded. |
499
+
| 6 | backend reachable | with `datadog_backend: pup`, `pup auth status` (or `$PUP_BIN auth status`) returned `authenticated: true` for the expected site — run the check, don't assume the binary works. A missing or unauthenticated pup is a **STOP**, not a fallback (see **Datadog backend**). With `datadog_backend: mcp`, step 5's acknowledged response is itself the proof the backend is reachable. Record `backend_used` in `config.json` either way. **Under pup, satisfy step 5 by reading the experiment back** (`pup llm-obs experiments list --filter-project-id …` and confirm the metadata/status you just wrote). On released pup `experiments update` exits non-zero on a response-parsing bug even when the write landed, so an exit-code check would fail a step that actually succeeded; DataDog/pup#682 fixes that but is not merged yet. Read-back is correct either way, so use it unconditionally rather than branching on the build. |
485
500
486
501
State the gate result briefly (each step ✓ with its evidence) before Step 1. This same
487
502
"external-effect step → verify against an artifact" discipline is why per-iteration score
0 commit comments