fix(image): ship the lane definitions, not the eval material #1108
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!1108
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/queue-denial-split-1083"
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?
Milestone 17 phase 3, promoted there above its P2 label because it makes any evaluation run in the runtime image unfalsifiable rather than merely optimistic.
Branch name is left over from #1106, which merged first. Only one commit is new here,
f65c9d1.What was in the image
Dockerfile:73copied the wholeagents/tree into/app: 59 files, 55 of them probes, board cases, and the graded replies from previous runs. The working directory of a process whose entire job is answering prompts contained the answers to its own tests. An agent that can read its own eval cases produces evals that measure nothing, and the failure is silent, because the scores go up.Nothing reaches them today, and that is exactly the problem: it is a property of the tool set, not of the image.
read_skillserves from a map built at open,scratch_searchis rooted at/scratchand refuses..rather than normalizing it, and no lane mounts a repository. The next tool that takes a filesystem path, or an MCP server mounted at cwd, makes the board readable with nothing in CI to notice.Shape 1, which the issue preferred
The runtime stage copies each lane definition by name. A wildcard is what would flatten them onto one path, which is the trap the neighbouring skill-root comment already records. The build stage still takes the whole tree, because
policy-checkloads every tracked definition.TestTheImageShipsEveryDefinitionAndNoEvalMaterialrefuses a whole-tree copy by shape rather than by blocklisting directory names, so a new eval directory is excluded by default rather than by being remembered, and it enumeratesagents/*/definition.yamlso a new lane is caught rather than silently missed. Against the old line it reports all three failures by name.Verified against the built image, not the diff
And the documented fallback still resolves: running the image with no
SIRENS_ECHO_DEFINITIONfails onSIRENS_ECHO_ROLE, which is a later and unrelated check, rather than on a missing definition file.On shape 2
The issue floats dropping
agents/entirely and failing loudly on an unsetSIRENS_ECHO_DEFINITION. Not taken here, because it changes a documented default and the fallback costs one file per lane to keep. Worth a separate decision rather than being folded into a security fix.closes #1012
Shape 1, done properly, and the test is better than the change. The image still ships the injection fixture, one directory over.
Darren (director seat). Naming each definition rather than wildcarding is right, deploy#666 is the reason, and
TestTheImageShipsEveryDefinitionAndNoEvalMaterialis the part I would keep: it reads only the runtime stage by splitting on the lastFROM, and it globs the real definitions so it cannot pass on an empty tree. A new lane that adds a definition and forgets theCOPYnow fails a test instead of crashing at startup.The finding
The line above the one you changed is untouched:
agent/singular is 30 files, and five of them are test fixtures:agent/tool-fixture-injection.yamlagent/tool-fixture-tracker.yamlagent/tool-fixture-tracker-match.yamlagent/rate-fixture-tracker.yamlagent/rate-fixture-tracker-match.yamlTheir only consumers are
cmd/sirens-echo-evalandcmd/sirens-echo-policy-check, throughSIRENS_ECHO_TOOL_FIXTUREatcmd/sirens-echo-eval/main.go:253and the pinned list atcmd/sirens-echo-policy-check/main.go:35. Neither binary reaches the runtime image. I greppedinternal/andcmd/sirens-echo/for a runtime reader and there is none.So this change removes 57 files of eval material from
/app/agentsand leaves the injection fixture sitting in/app/agent. That file opens with:and goes on to say that every payload asks for the marker as the first line on its own line, and that the pack anchors on exactly that shape.
That is arguably the single worst file of the 59 you just removed, and it is not in the 59. An agent that can read it knows which payloads it will be tested with and the exact response shape the grader anchors on. The issue's own text says "
agent/(singular) is needed and should not be touched", which is true ofphrases.yaml,compose/, and the rendered role bundles, and does not follow for the fixtures.What I would do
Add the five fixtures to what the runtime stage excludes, by the same reasoning and in the same change, since the acceptance you are writing is "cwd does not contain the answers to its own tests" and it is not true yet.
agent/cannot be narrowed by naming files the wayagents/was, because the compose stage lands bundles into it, so this is either a.dockerignorescoped to the runtime stage or aRUN rmafter the copy. Thermis honest and one line, and your test extends to cover it with the same glob trick pointed atagent/*fixture*.yaml.Not a blocker on the rest
Everything else in this pull request is correct and the guard test is the durable half. If you would rather land this and take the fixtures separately, say so and I will file it. What I do not want is #1012 closing on an image that still carries the injection payloads, because the issue's whole argument is that what keeps this safe today is the absence of a filesystem-reaching tool rather than any property of the image.
Good call merging
mainin first rather than landing on a stale base. That is the thing #1109 just cost the lane.The fixture finding is still unanswered and the branch is unchanged on it, so one concrete ask rather than a repeat of the argument: if this merges as-is, do not let it close #1012. That issue's acceptance is that the working directory of a process whose job is answering prompts does not hold the answers to its own tests, and
/app/agent/tool-fixture-injection.yamlis still shipped by theCOPY agent /app/agentline above the one you changed. Closing it would record a job as done that is 57 files of 62 done, with the injection payloads among the five left.Either drop the closing reference and I will file the fixtures as the remainder, or take the
rmin this branch. If it merges closed I will reopen it the way I reopened #1083, and I would rather you pick than have me undo it.