refactor(agents): give each agent one folder, evals included #826
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!826
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/bk79-agent-folders"
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 #816. Layout picked by Kai from the options in the issue thread.
The shape
agent/keeps only what both agents read:phrases.yaml,content-classes.yaml,compose/,rendered/roles/, and the tracker and injection fixtures.Filenames stop repeating what the folder says, so
rate-deep.yamlisagents/deep/packs/rate.yamland the two agents' files finally match each other.Four judgement calls worth reviewing
Probes are not packs. The sixteen ad-hoc packs from
evaluations/packs/went toprobes/, notpacks/.packs/is the canonical set policy-check loads, andTestEveryTrackedPackReachesPolicyCheckandTestEveryCaseDeclaresItsLanguageScopeassert over it. Filing probes there would have silently widened both tests onto files that were never meant to satisfy them.Datasets keep their original paths. A record whose provenance reads
definition: agent/sirens-deep.yamlstill reads that. It is the record of what ran, and rewriting it would falsify the thing#316built the field for. Ownership came from that field rather than from filenames, which is howrate-fixture-tracker-*records ended up underecho/- the Echo definition produced them..agents/skills/did not move, though Echo's and Deep's skills are agent-exclusive. It is the agentic-os catalog contract, not this repo's convention:check-skillsandrepo-pointer-skillsrun against that path and the workspaceAGENTS.mdcalls it canonical. This is the one place "every file" is deliberately not satisfied, anddocs/sirens-echo-agent-folders.mdsays so.Prompt snapshots grew five bytes each. That is exactly the longer definition path rendered into their header line. Budgets rise by five; nothing else changed.
sirens-echo-promptalso had to stop deriving the output name from the definition filename, since both agents' files are nowdefinition.yamland would have collided onto one snapshot.Blast radius
58 renames, 64 modified files. Beyond the moves:
ward-command.shverbs, the eval command's defaults and its out-of-repo pack preservation,sirens-echo-promptoutput paths,sirens-echo-evidence's dataset glob, the Dockerfile COPY set for all three stages, and roughly twenty tests that built paths withfilepath.Join("..", "..", "agent", ...)rather than string literals.A small
trackedpaths_test.gohelper replaces four hand-rolledagent/*.yamlglobs, since packs now span two roots.Verification
ward gatePASS on all six steps: build, policy-check, vet, test, test-skips, pre-commit.sirens-echo-prompt --checkreports both snapshots current.Not in this PR
The evals do not test the composed agent.
SIRENS_ECHO_COMPOSED_BUNDLEis set by nothing in the repo, so every eval verb runs againstPlaceholderComposed. I raised it on #816 with the provenance counts; Kai's call was to leave it alone, so this PR moves those files without touching that behaviour.I also reported
.agents/skills/ops-social-discord/as possibly orphaned. That was wrong -AGENTS.mdalready documents it as deliberately outside the runtime skill roots. No change made.Merged
mainin and repaired the fallout.ward gateis green and the branch is mergeable again. Also one blocker below that this PR cannot fix from inside this repository.Pushed as two commits rather than a rebase, so bk79's commit is untouched.
🔴 Blocker: this bricks Sirens Deep on the next image
coilyco-bridge/deployservices/sirens-echo/deploy/sirens-deep-values.yaml:161pins:That file stops existing in the image.
LoadConfigreturns the load error,cmd/sirens-echo/main.go:27callsos.Exit(1), so Deep crashloops rather than degrading. Echo is fine, because it takesdefaultDefinitionPathand this PR moved that with it. Deep is the only pod that names the path, and it is the one that names it.The ordering is the awkward part. Deploy cannot change first, because the running image still only has the old path. So: merge this, let
publish-echo-imageship the new layout, then change the deploy value, then roll out. Between the merge and the deploy change, any Deep rollout is a crashloop.If you would rather not hold that window open, the alternative is for this PR to keep
agent/sirens-deep.yamlas a one-line compatibility file until deploy catches up. I have not done that, because it half-undoes the refactor and the window is closeable in one deploy PR. Your call."Blast radius" lists the in-repo consequences and does not mention the deploy repo, which is where the only production-visible one is.
Two conflicts, both mechanical
agents/deep/packs/rate.yaml- #819 added ashapeper case while this branch rewrote everyobserveddataset path. Kept both. The rewritten paths are the live ones:evaluations/really did becomeagents/deep/evaluations/, so main's copies are dead references rather than a competing opinion.prompt_test.go- this branch renamed the snapshot keys and raised each budget by five for the longer definition path in the header, while #821 raised both for prompt growth. They compose, and the merged snapshots measure exactly 22296 and 12580, which is main's numbers plus five. Budgets set to the measured sizes rather than to either side's guess.Two tests main added that git merged into a broken build
ratebrevity_test.go(#819) andfilingtrigger_test.go(#821) landed after this branch was cut and build paths fromagent/literals. Neither touched a line this branch changed, so git merged both cleanly and the package stopped compiling. Same shape as #812, arriving through a rename this time.Both now derive from the layout rather than naming files, using this branch's own helpers:
agents/*/packs/rate.yamlAdded
trackedRatePackPathsandagentOfbeside the existing helpers.On the four judgement calls
All four read correctly to me. Probes are not packs is the one I would have got wrong: filing them under
packs/would have silently widenedTestEveryTrackedPackReachesPolicyCheckandTestEveryCaseDeclaresItsLanguageScopeonto sixteen files that were never written to satisfy either, and the tests would have gone green while meaning less.Datasets keep their original paths is right and is not contradicted by the
observedrewrites I resolved above:definition:inside a record is provenance and must not move, whileobserved:is a pointer to a file that did move.A stale-reference sweep over the tree finds one hit, in
docs/sirens-echo-agent-folders.md, and it is the sentence explaining why old provenance stays as it is.coilyco-ops referenced this pull request2026-08-15 17:30:28 +00:00
internal/community/config.go, with the classic env var override, update READMEmd to point at that file #829The deploy blocker I raised is gone. Verified against
coilyco-bridge/deployorigin/mainat922aac4, not taken on report.Both lanes now read
SIRENS_ECHO_DEFINITIONfrom a mounted ConfigMap rather than from a path in the image. Deep's is/etc/sirens-deep-definition/definition.yaml, with volume and mount present. That is the third option fromdeploy#548— stop pinning an image path at all — so the merge-ordering window that issue described no longer exists in either direction. #548 is closed.The two remaining image couplings both hold for this branch:
/app/agent/phrases.yaml, still pinned by both lanes. This branch keepsagent/phrases.yamlin place, confirmed against the branch tree.local_skill_roots, which stays image-relative. This branch does not move.agents/skills/, confirmed the same way.services/sirens-echo/README.mdstill describes Deep as pinning/app/agent/sirens-deep.yaml, which is stale prose in that repo rather than anything this branch touches.What is not safe yet is the merge itself
The branch is 32 commits behind
mainand conflicts in 9 files, up from 4 last time:I ran that merge to count them and aborted it, so the branch is untouched. Two of those, the rendered prompts and
prompt_test.go, are the budget pattern from last time: re-render from the merged sources and set the budgets to what they measure, rather than resolving the numbers by hand.Worth noting the cost of waiting is superlinear here. A branch that renames 58 files collides with every doc and snapshot anyone else touches, and it has now been through two rounds of that. If it is wanted, it is cheapest to merge soon.
Say the word and I will do the merge and take it to green, the same way as before.
Done.
mainis merged in,just gateis green on all six steps, and the branch is mergeable and level withmainat28a0a5b.Pushed as two commits plus a second merge, so bk79's original commit stays untouched.
3e58567- the merge, conflict resolutions only.2b9366d- the repairs the merge needed to build.a318a68- a second merge, becausemainmoved four commits while this was in flight. Clean, no conflicts.The nine conflicts
Eight were the same shape: this branch renamed the file,
mainrewrote the sentence around it. Resolved to this branch's paths withmain's wording, which matters more than it sounds becausemainretiredward execforjustin the meantime. The branch was written before that, so every doc line it touched saidward execand every one of those is nowjust.docs/response-profiles.mdalso had a paragraphmainadded about object emoji, kept alongside the renamed path.internal/community/prompt_test.gowas the budget pattern again, and the arithmetic is a clean check on the whole merge: re-rendered from merged sources the snapshots measure 25777 and 14521, which ismain's 25772 and 14516 plus exactly five. Five bytes is the longer definition path in the header line, which is what the PR body predicted two rounds ago. Budgets set to the measured sizes.One judgement call
docs/sirens-echo-board.mdhadmainwriting the board output asevaluations/<date>-<seat>/dataset.yaml, a per-run directory. Nodataset.yamlexists anywhere in this repository on either side, andmain's ownevaluations/is flat.yamlfiles. So that line describes something neither tree does. I kept this branch's flat form, repointed:agents/deep/evaluations/<date>-<seat>.yaml. If the directory shape is actually intended, it is a separate change and this line should not be the only place it is stated.Two tests
mainadded that git merged into a broken buildorganizations_test.go(#806) andthreadprefill_test.go(#769) both build paths fromagent/literals. Neither touched a line this branch changed, so git merged both cleanly and the package stopped compiling. That is now the third round of this exact failure on this branch.Both derive from the layout instead:
organizations_testtakes every tracked definition, andthreadprefill_testasks for Deep's by name through a newdefinitionOfhelper.A real bug this exposed, not introduced
agentOfwas wrong for definition paths, andorganizations_testwas the first caller to make it visible.It counted two directories up, which is correct for
agents/<name>/packs/rate.yamland returns"agents"foragents/<name>/definition.yaml. I verified that rather than reading it: all three definition paths return"agents".filingtrigger_test.go:57has been calling it on definition paths since the previous merge, so every failure message there has been labelling both agents"agents". Cosmetic, since it only reaches failure output, but it defeats the reason that test was rewritten to name the agent. It now reads the segment afteragents/, correct at both depths.Verification
just gatePASS on build, policy-check, vet, test, test-skips, pre-commit.just prompt-checkreports both snapshots current. The+5budget raise is recorded indocs/sirens-echo-prompt-budget-raises.mdwith its cause, which the ratchet comment inprompt_test.gorequires and the branch had not done.One caveat worth stating plainly:
3e58567does not build on its own. It carries the conflict resolutions andmain's two new tests, and2b9366dis what makes the tree compile. That split is deliberate so the judgement calls are readable separately from 129 files of mechanical merge, but it does mean a bisect landing exactly on the merge commit sees a broken build.Left alone
pyproject.toml:19andAGENTS.md:34still sayward exec knobs. Both are onmainalready and neither is this branch's, so they are stale prose inmainrather than merge fallout. Not fixed here.Not merged. The merge stays director-gated and this PR has an unactioned review request. Say the word and I will merge it. Worth doing soon rather than later for the reason the last round gave: a branch that renames 58 files collides with every doc and snapshot anyone touches, and this is now the third round of that in under 24 hours.