Skip to content

Score outpost-001 against the customer's endpoint, not one the agent picked - #67

Merged
leggetter merged 1 commit into
mainfrom
outpost-001-customer-endpoint
Aug 29, 2026
Merged

Score outpost-001 against the customer's endpoint, not one the agent picked#67
leggetter merged 1 commit into
mainfrom
outpost-001-customer-endpoint

Conversation

@leggetter

@leggetter leggetter commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

Refs #47 — the first of the "does this scenario actually discriminate" items, and the one the code already knew about.

What was being measured

The ticket said "so they receive order events at their endpoint" and named no endpoint, so any reachable URL satisfied it. Across the six stored cells of this scenario the agents picked six different receivers:

arm receiver result
claude-code-sonnet-5 hkdk.events source it created pass
claude-code-sonnet-5-no-skills webhook.site inbox pass
codex-gpt-5.6 hkdk.events source pass
codex-gpt-5.6-no-skills hkdk.events source pass
codex-gpt-5.4-mini-no-skills mock.hookdeck.com path pass
codex-gpt-5.4-mini localtunnel inside its own sandbox fail

The failing cell is the one worth reading. It built the tenant, the destination and the topic set, published an order event, and reported delivery confirmed with 200 attempts. Its tunnel died with the container before scoring. So the check named "an order event reaches the customer" was discriminating on whether an improvised receiver outlived the run.

EVAL.ts already carried this as a known hole and deferred it, because closing it changes a published scenario.

Why now

Three things make this the cheap moment rather than the expensive one:

The change

The ticket names https://mock.hookdeck.com/api/v1/acme/orders — the URL SOLUTION.ts was already delivering to, which is how the mismatch surfaced — and the scorer counts only destinations pointed there. Matching is lenient on trailing slash, query string and case, strict on host and path.

Verified without an agent run

Using score-only, per the convention that a scorer change is validated for the price of some API calls:

  • solution path: 2/2 pass
  • --no-solution: fail
  • solution edited to deliver to a receiver of its own choosing: fail — where it would previously have passed

Split out

The pnpm check breakage found while validating this is now #68, so the gate lands independently of a scenario change.

🤖 Generated with Claude Code

https://claude.ai/code/session_01MQzUoMAwEBJWpEGVvVzSjK

…picked

The ticket said "so they receive order events at their endpoint" and named no
endpoint, so any reachable URL satisfied it. Across the six stored cells of this
scenario the agents picked six different receivers: three Event Gateway sources
on hkdk.events, a webhook.site inbox, a mock.hookdeck.com path, and a
localtunnel inside the agent's own sandbox. Five passed.

The sixth is the one worth reading. It failed, and not because the customer was
not subscribed — the agent built the tenant, the destination and the topics, and
reported delivery confirmed. Its tunnel died with the container before scoring.
So the check named "an order event reaches the customer" was discriminating on
whether an improvised receiver outlived the run.

EVAL.ts already carried this as a known hole and deferred it, because fixing it
changes a published scenario. That is the right call to revisit now rather than
later: publishing is held under #66, the scenario fingerprint from #65 records
the change for anyone comparing rows across it, and the next matrix has not been
paid for yet. Doing it after that run would mean measuring this scenario twice.

The ticket now names mock.hookdeck.com/api/v1/acme/orders — the URL SOLUTION.ts
was already delivering to, which is how the mismatch surfaced — and the scorer
counts only destinations pointed there. A customer's endpoint is not the
integrator's to choose.

Verified with score-only rather than an agent run: the solution path passes 2/2,
the unsolved path fails, and a solution edited to deliver to a receiver of its
own choosing now fails where it would previously have passed.

Refs #47

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MQzUoMAwEBJWpEGVvVzSjK
@leggetter
leggetter force-pushed the outpost-001-customer-endpoint branch from 2fdaab8 to b61066b Compare August 28, 2026 13:19
@leggetter
leggetter merged commit 6dc9d5a into main Aug 29, 2026
2 checks passed
@leggetter
leggetter deleted the outpost-001-customer-endpoint branch August 29, 2026 10:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant