Skip to content

outpost-004: stop shipping AWS's documented example credentials - #52

Merged
leggetter merged 2 commits into
mainfrom
outpost-004-credentials
Aug 24, 2026
Merged

outpost-004: stop shipping AWS's documented example credentials#52
leggetter merged 2 commits into
mainfrom
outpost-004-credentials

Conversation

@leggetter

Copy link
Copy Markdown
Collaborator

The workspace note carried AKIAIOSFODNN7EXAMPLE and its matching secret — AWS's published documentation placeholders, verbatim in most AWS tutorials ever written.

What it did to a run

claude-code-sonnet-5 recognised them, having already derived the whole solution — aws_sqs, config.queue_url, credentials as a separate object, narrowing the webhook to retries — and stopped, because configuring delivery with placeholder keys fails silently and the customer receives nothing.

It scored 0/1. Three other agents didn't notice and scored 6/6. The scenario rewarded not checking your inputs — the inversion AGENTS.md names as the worst thing a scorer can do. A review flagged these credentials before the run and I judged the impact "roughly zero"; the run disagreed.

Three attempts, three different failures

  1. AWS's example keys — recognised and refused, as above.
  2. A realistic literal key — rejected by GitHub push protection. A credential convincing enough to fool an agent is convincing enough to look like a leak.
  3. ${VAR} placeholders — the documented mechanism, but expansion reads from sandboxEnv, which was a fixed list of three Hookdeck variables. The agent was handed the literal ${ACME_SQS_ACCESS_KEY}, which reads exactly as fake as the AWS keys, and stopped for the same reason.

The fix

Any SEED_* variable in the environment now reaches sandboxEnv, so a scenario can supply a credential of its own without editing the runtime. A prefix rather than a wholesale passthrough: a workspace file saying ${OPENAI_API_KEY} should not be able to help itself to one.

Verified end to end — the literal placeholder is gone from the transcript, the values reached the agent, and the existing redaction layer caught them on the way back out (<redacted:SEED_ACME_SQS_ACCESS_KEY>).

Result: 004 now passes 6/6 across every arm, including the Sonnet cell that previously scored 0/1.

CI needs SEED_ACME_SQS_ACCESS_KEY and SEED_ACME_SQS_SECRET_KEY as repository secrets before this scenario runs there.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Nt2Zgjw7STjrnFXYKRRVAA

leggetter and others added 2 commits August 24, 2026 15:21
The workspace note carried AKIAIOSFODNN7EXAMPLE and its matching secret —
AWS's published placeholders, verbatim in most AWS tutorials ever written.

On 24 August claude-code-sonnet-5 recognised them. It had already derived
the whole solution — aws_sqs, config.queue_url, credentials as a separate
object, narrowing the webhook to retries — and stopped, because
configuring delivery with placeholder keys fails silently and the customer
receives nothing. It scored 0/1. Three other agents did not notice and
scored 6/6. The scenario was rewarding not checking your inputs.

A review flagged the credentials before the run and I judged the scoring
impact to be roughly zero. The run disagreed.

Replaced with `${ACME_SQS_ACCESS_KEY}` / `${ACME_SQS_SECRET_KEY}`, expanded
from the environment on the way into the workspace — the mechanism
HOOKDECK_WEBHOOK_SECRET already uses. Committing a realistic literal is not
an option: the first attempt was rejected by GitHub push protection, which
is the whole problem in miniature. A key convincing enough to fool an agent
is convincing enough to look like a leak.

Values are synthetic and live in .env; .env.example documents them. CI needs
the two variables added before this scenario runs there — without them the
note shows the literal placeholders, which reads as missing rather than as
configured, and is the documented behaviour of the expansion.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nt2Zgjw7STjrnFXYKRRVAA
`local/` files expand `${VAR}` from the session's sandboxEnv, not from the
host environment — and sandboxEnv was a fixed list of three Hookdeck
variables. So a scenario needing a credential of its own had no way to
supply one without editing runtime.ts.

Measured: outpost-004 put `${ACME_SQS_ACCESS_KEY}` in its workspace note
with the value set in .env, and the agent was handed the literal
placeholder. It read exactly like the AWS documentation keys it had just
replaced — obviously fake — and the agent stopped rather than configure
delivery it believed would fail. Same failure, new cause.

Any `SEED_*` variable in the environment now reaches sandboxEnv. A prefix
rather than a wholesale passthrough: a workspace file saying
`${OPENAI_API_KEY}` should not be able to help itself to one, so exposure
is opt-in by name.

outpost-004's variables are now SEED_ACME_SQS_ACCESS_KEY and
SEED_ACME_SQS_SECRET_KEY. Verified they arrive in sandboxEnv with the
expected shape.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nt2Zgjw7STjrnFXYKRRVAA
@leggetter
leggetter merged commit 0171a36 into main Aug 24, 2026
2 checks passed
@leggetter
leggetter deleted the outpost-004-credentials branch August 24, 2026 17:04
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