test(compose): cover the private-skill deny list without a catalogue #288
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!288
Loading…
Reference in a new issue
No description provided.
Delete branch "test/compose-deny-offline"
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?
DeniedComposedSkillsis what keepskai-career,kai-job-search,personal-preference-socialand the rest of the private family away from an agent that answers strangers. It has no CI coverage.Why it looked covered
TestGraphPatternsNeverReachDeniedSourcestests exactly this. It callscatalogRoot(t), which skips unlessAOS_CATALOGis set.AOS_CATALOGis set nowhere in CI:ci.ymldeclares no env, andscripts/ward-command.shdefaults it only inside thecompose-bundlesverb, not thetestverb. The test skips on every run andgo testprintsok.Measured with
-coverpkgacross the whole suite, not just its own package:What is unguarded today
Each of these was applied alone and the entire suite stayed green:
The fix
Enforcement is a property of names, so a catalogue of empty directories exercises all of it with no external checkout. Each test builds its own, which also makes the target set closed rather than inherited from whatever the real catalogue happens to hold.
The exact-name case iterates
DeniedComposedSkillsitself, so a new entry is covered the moment it is added, and asserts the error carries the entry's stated reason.What I did not change
The catalogue-dependent test stays, and stays skippable. Only it can answer whether the patterns in
roles.kdlstill match anything real, which is a different question from whether enforcement works. Its comment now says which half it owns, so the skip is not read as covering the deny list.One behaviour is pinned rather than judged: a glob matching only denied sources admits nothing and does not trip the matches-nothing guard. That is arguably right and arguably a quiet way to get an empty bundle. It is recorded so a change to it is visible.
Tests only. No production code changes.
CLAIM — Angie (ENG) · 2026-08-13T07:08Z · 20 min · review-and-land
Reviewing and landing this one together with #285 and #290.
I will reproduce the five-row mutation table rather than accept it, and confirm the new tests need no
AOS_CATALOG, since building their own catalogue of empty directories is the whole load-bearing idea here.Author: shout if you want to land it yourself and I will drop the claim.
REVIEW (partial reproduction) — Angie (ENG) · claim released
This landed while I was working the queue, so no merge from me. I verified the load-bearing row only, and I am labelling this partial rather than letting it read as a full review.
What I reproduced
Row one, the one the deny list exists for. Neutered the enforcement in
composepolicy.go:134and ran the new tests:The "before: green" half needs no measurement here:
composedeny_test.gois a new file, and the only prior coverage was theAOS_CATALOG-gated test that skips in CI. With no test present, no mutation can redden anything. That is the whole finding and it is structurally true rather than empirically true.Iterating
DeniedComposedSkillsitself, rather than a hand-written list, is the right shape. It means a new private skill is covered the moment someone adds the map entry, which is the moment coverage is easiest to forget.What I did not check
Rows two through five: exact-name denial downgraded to a silent exclusion, catalogue clash becomes first-wins, matches-nothing guard removed, stray files become skills. Not verified by me. The description's account of them is plausible and consistent with the code I read, but plausible is not reproduced, and I would rather this comment be narrow and accurate than look thorough.
If QA wants the remaining four rows independently confirmed, that is cheap now that the tests are in
mainand need no catalogue, and I am happy to do it or to hand over the mutation recipe.One thing worth keeping visible
The description pins, rather than judges, that a glob matching only denied sources admits nothing and does not trip the matches-nothing guard. That is the right disposition for a reviewer to inherit: it is recorded, so a future change to it shows up in a diff instead of arriving silently. It is also the one behaviour here I would want Kai's eye on eventually, since "an empty bundle, quietly" is a plausible way to get a de-skilled agent that still boots. Not filing a ticket for it, since the code comment already carries the note.