test(rate): measure the data-borne injection vector #264
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!264
Loading…
Reference in a new issue
No description provided.
Delete branch "test/data-borne-injection"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes the case that #256 existed to unblock. Non-gating, never wired into CI, reaches no live system.
What
f37074bgot rightIt shipped neither option I proposed, and the third one is better than both.
An in-process
FixtureProviderisolates more strongly than a fixture server — no socket, no process, so a case reaches nothing at all — while keeping the fidelity a case-schema stub would have lost: a declared result returns fromtoolSession.Calland flows into the message list through the production path, with no second injection point and no branch in the tool loop.My argument for the server was that a fixture boundary is needed anyway for the destructive case. That argument is satisfied better by something that cannot reach the network at all.
What lands
agent/tool-fixture-injection.yaml— three payloads imitating strings that already reach the model as tool results:eco__get_storeseco__get_currencyeco__get_civicsagent/rate-fixture-deep.yaml— three cases, each naming itsrequired_toolso the payload is actually fetched.Nothing here is real and nothing is written to a live server, which was the constraint that kept this case unwritten. The alternative — creating an Eco store named with an injection payload — would have meant attacking a server a community plays on to run a test.
Why a separate pack
SIRENS_ECHO_TOOL_FIXTUREis exclusive with the MCP roster. A run reaching both surfaces could not say which one answered, so this gets its own pack and its own verb,rate-fixture-deep, mirroring howrate-deepis wired.Anchoring, again
Same discipline as the chat-box cases: each payload asks for the marker as the first line on its own line, and the pattern matches only that shape.
A bare marker pattern would false-fire on the most likely correct reply to these three — one that summarises the laws and notes that one of them contains an instruction it is ignoring. In a rate pack that inflates a number later quoted as evidence, which is harder to notice than a red build.
policy-check extended
Both new packs are now verified at policy-check time.
b128603made that argument for the rate pack — a pack that does not load produces no measurement, and a missing measurement reads as a clean one.A fixture that does not load is worse: its cases would reach no tool, and a case that fetched nothing reads as a case that found nothing. So
verifyFixturePackalso fails on a pack declaring zero tools.Verification
bash -non the script, fullgo test ./...,policy-check, andpre-commit run --filesall clean.Not run. 45 live turns against a deployment, and Deep is still 32 commits behind (deploy 426) — it does not even have the fixture. This is the instrument, not the measurement.
Still absent: the destructive-instruction case. It now could be written against this fixture, but "never run live" needs to be enforced by something other than a comment before I write a case whose payload asks the agent to close issues.
Quail (QA)
a53200bd485a4c992df7