## 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>
create-channel-invite-users
What the agent does
Creates a temporary private stream channel named fix-pr-1234 with a one-hour
lifetime and invites an exact subset of a seeded directory: three named users as
members and two named bots with the bot role
(instruction.md).
Unlike the other tasks in this suite, the graded behavior is stated in the
instruction. What makes it hard is precision at scale: the provisioner seeds 50
users (benchmark-user-01…50) and 10 bots (benchmark-bot-01…10), so the
agent has to resolve five specific names out of sixty look-alikes and invite
nobody else.
Environment
python:3.12-slim-bookworm, no extra packages: the agent never runs in this
container's shell. BuzzOrchestraAgent launches the real buzz-acp /
buzz-agent stack against a dedicated relay, and the agent does all its work
through buzz channels create / channels invite. Agent timeout 300s.
Directory identities are derived deterministically from the owner key
(BuzzTrialProvisioner._stable_credential) without persisting any secret, and
_seed_directory skips profiles already published — so reruns are idempotent
and pubkeys are stable across trials.
Verifier
Reads the post-agent /logs/artifacts/buzz-evidence.json snapshot. The
snapshot's observed_channels come from the production CLI
(channels search --exact --include-archived plus channels members), so the
verifier grades the same view a user would see. Every dimension is
programmatic; reward is the conjunction of all of them.
| Dimension | Type | Measures |
|---|---|---|
evidence_complete |
programmatic | Snapshot is v1, names this task, and carries all 60 directory rows (50 users + 10 bots), the 5 resolvable targets, and exactly one orchestrator. Harness health, not agent skill — a 0 here means the provisioner or relay is suspect |
channel_created |
programmatic | Exactly one channel named fix-pr-1234 exists |
channel_shape |
programmatic | channel_type = stream, visibility = private, not archived |
temporary_channel |
programmatic | ttl_seconds == 3600 — "for one hour", read from the kind:39000 ttl tag surfaced by channels search |
exact_membership |
programmatic | Member pubkeys are exactly the owner plus the 5 targets — no extras, no duplicates |
expected_roles |
programmatic | The 3 users hold member, the 2 bots hold bot, the creator holds owner |
Layout
create-channel-invite-users/
├── instruction.md # Prompt posted to the agent as the trial user
├── task.toml # Metadata, timeouts, 1 CPU / 1 GiB environment
├── environment/Dockerfile # Bare python image; the relay stack is uploaded
└── tests/
├── test.sh # Runs verify.py against the evidence snapshot
└── verify.py # Deterministic scorer (see table above)
To change the target set, edit task_fixtures.TARGET_USERS / TARGET_BOTS,
instruction.md, and the matching constants at the top of tests/verify.py —
all three must agree, and evidence_complete will fail loudly if the directory
size drifts from 60.
Running
just benchmark \
--path benchmarks/buzz-dataset/create-channel-invite-users \
--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_create_channel_invite_users_verifier.py.