## Summary - classify every Buzz-native benchmark task as `regression` or `workflow` - add metadata-backed `--layer` selection with k=1 regression and k=3 workflow defaults, while preserving explicit `--attempts`/`-k` - split an unqualified mixed Buzz dataset run into two Harbor jobs so each layer gets the correct default - document the layer contract and cover metadata, selection, defaults, overrides, invalid input, and command construction --------- Signed-off-by: Salman Mohammed <smohammed@squareup.com>
read-named-path-outside-workspace
What the agent does
Reads one file the user names explicitly by path —
~/.claude/skills/context-health-check/SKILL.md — and reports its CHECK_ID
and ACTION values (instruction.md).
This is a regression case, not a capability test. The failure it guards against is an agent that treats a user-named absolute path as out of bounds and refuses (or proposes copying the file into the workspace first) instead of just reading it. See block/buzz#6261.
Environment
python:3.12-slim-bookworm with HOME=/home/buzz, so ~ in the instruction
resolves to the seeded skill directory. The Dockerfile generates the
CHECK_ID marker with secrets.token_hex at image build time, so the
expected value cannot be memorized across runs; the verifier reads the
answer back out of the same file rather than hardcoding it. Agent timeout 300s.
Verifier
Reads the post-agent /logs/artifacts/buzz-evidence.json snapshot plus the
seeded SKILL.md (via --skill-file) for the expected values.
| Dimension | Type | Measures |
|---|---|---|
evidence_complete |
programmatic | Snapshot is v1, untruncated, names this task, and resolves the task event, channel, one orchestrator, and a candidate reply. Harness health, not agent skill |
expected_author |
programmatic | The scored message was published by the orchestrator |
same_channel |
programmatic | Reply carries the trial channel's h tag |
named_path_read |
programmatic | Reply contains the build-time CHECK_ID marker — proof the file was actually read |
action_reported |
programmatic | Reply contains the ACTION line, matched case-insensitively with whitespace collapsed and trailing punctuation stripped |
reward is the conjunction of every dimension above.
Refusal wording is deliberately not scored. The question this task asks is
whether the file was read, and named_path_read answers it conclusively: the
CHECK_ID marker is generated at image build time, so an agent cannot emit it
without having read the file. A genuine refusal therefore already scores 0 on
the substance. An earlier revision also matched refusal phrasing with a regex,
which meant a hedged-but-correct answer could score 0 on wording alone; that
check is gone rather than kept as an unscored metric.
instruction.md also says "Do not search other directories". That constraint
is intentionally unscored — the snapshot holds relay messages, not the agent's
tool calls.
Layout
read-named-path-outside-workspace/
├── instruction.md # Prompt posted to the agent as the trial user
├── task.toml # Metadata, timeouts, 1 CPU / 1 GiB environment
├── environment/Dockerfile # Seeds ~/.claude/skills/... with a random CHECK_ID
└── tests/
├── test.sh # Runs verify.py against the snapshot + SKILL.md
└── verify.py # Deterministic scorer (see table above)
Running
just benchmark \
--path benchmarks/buzz-dataset/read-named-path-outside-workspace \
--attempts 1 \
--manifest benchmarks/harbor-buzz-orchestra/manifests/buzz-native-solo-luna.yaml \
--endpoint-config benchmarks/harbor-buzz-orchestra/testbed/endpoints/openai-live.json \
--n-concurrent 1
harbor run -a oracle does not work here, and no solution/solve.sh is
shipped: the Oracle agent replaces BuzzOrchestraAgent, so no relay trial is
provisioned and no evidence snapshot is exported. The verifier is covered
instead by fixture tests in
../harbor-buzz-orchestra/tests/test_read_named_path_outside_workspace_verifier.py.