fix(skills): hold the composer's own identity doctrine eager #1008

Merged
coilysiren merged 1 commit from fix/roster-core-eager into main 2026-08-19 01:56:31 +00:00
Member

Follow-up to #1004, which left one thing open and this answers it.

#1004 partitioned on inline: always rather than on entrypoint-vs-reference, and roster:core went over the wall with everything else. The identity card still named boundary-modify-live-system, but the file saying what that boundary means became fetchable. An agent that has to ask what its own boundaries say has already acted without them. That is exactly the #859 failure, one layer up from where #859 found it.

Kai's call: roster:core is eager.

The rule keys on provenance, not on names

role-*, boundary-*, personality-* is the accurate list today, but it describes the contents rather than giving the reason. agent-compose stages roster:core as its own source directory holding exactly those three families and nothing else:

engineer/content/skills/
  aos-public/        51 skills
  roster%3Acore/      6 skills   <- role, boundaries, personality meld

So the loader asks which source a root came from. A roster that later grows a fourth family is covered with no edit here, and an aos-public skill that happens to be named role-something is not swept in by accident. The directory name is URL-escaped, so it gets unescaped rather than matched in its escaped form, since the escaping is the composer's business.

Cost

Measured across all eight staged bundles, same tree, before and after:

role       deferred -> eager      delta   fetchable
ai            4,576 ->  14,295   +9,719     6 -> 0
creator      10,414 ->  17,155   +6,741    25 -> 20
design        4,671 ->  13,929   +9,258     6 -> 0
director      4,189 ->   9,876   +5,687     5 -> 0
engineer     37,721 ->  46,539   +8,818   141 -> 135
exec          4,648 ->  12,737   +8,089     6 -> 0
ops           5,111 ->  15,894  +10,783     7 -> 0
qa            4,506 ->  12,983   +8,477     6 -> 0

Six of the eight roles now have nothing fetchable at all, because outside engineer and creator the whole bundle is roster:core. Against the pre-#1004 baseline the engineer lane is still far ahead. This gives back under 9k of that to keep identity whole.

Tests

Two, both against a two-source fixture that stages the escaped directory name the way agent-compose actually does:

  • TestRosterCoreLoadsEagerly - the roster body is in the pack, the catalogue skill's body is not, and the catalogue skill still carries its description.
  • TestRosterCoreOffersNothingToRead - nothing under roster:core is offered as fetchable, because an eager root has nothing left to fetch.

Full suite and pre-commit green.

Separate, not in this PR

Kai also said Dowel should not be loading boundaries at all. That is a real observation and a bigger one. Filed separately rather than smuggled in here, because it is an agent-compose question rather than a loader question.

Follow-up to #1004, which left one thing open and this answers it. #1004 partitioned on `inline: always` rather than on entrypoint-vs-reference, and `roster:core` went over the wall with everything else. The identity card still named `boundary-modify-live-system`, but the file saying what that boundary *means* became fetchable. An agent that has to ask what its own boundaries say has already acted without them. That is exactly the #859 failure, one layer up from where #859 found it. Kai's call: roster:core is eager. ## The rule keys on provenance, not on names `role-*`, `boundary-*`, `personality-*` is the accurate list today, but it describes the contents rather than giving the reason. agent-compose stages `roster:core` as its own source directory holding exactly those three families and nothing else: ``` engineer/content/skills/ aos-public/ 51 skills roster%3Acore/ 6 skills <- role, boundaries, personality meld ``` So the loader asks which source a root came from. A roster that later grows a fourth family is covered with no edit here, and an `aos-public` skill that happens to be named `role-something` is not swept in by accident. The directory name is URL-escaped, so it gets unescaped rather than matched in its escaped form, since the escaping is the composer's business. ## Cost Measured across all eight staged bundles, same tree, before and after: ``` role deferred -> eager delta fetchable ai 4,576 -> 14,295 +9,719 6 -> 0 creator 10,414 -> 17,155 +6,741 25 -> 20 design 4,671 -> 13,929 +9,258 6 -> 0 director 4,189 -> 9,876 +5,687 5 -> 0 engineer 37,721 -> 46,539 +8,818 141 -> 135 exec 4,648 -> 12,737 +8,089 6 -> 0 ops 5,111 -> 15,894 +10,783 7 -> 0 qa 4,506 -> 12,983 +8,477 6 -> 0 ``` Six of the eight roles now have nothing fetchable at all, because outside engineer and creator the whole bundle is roster:core. Against the pre-#1004 baseline the engineer lane is still far ahead. This gives back under 9k of that to keep identity whole. ## Tests Two, both against a two-source fixture that stages the escaped directory name the way agent-compose actually does: - `TestRosterCoreLoadsEagerly` - the roster body is in the pack, the catalogue skill's body is not, and the catalogue skill still carries its description. - `TestRosterCoreOffersNothingToRead` - nothing under roster:core is offered as fetchable, because an eager root has nothing left to fetch. Full suite and `pre-commit` green. ## Separate, not in this PR Kai also said Dowel should not be loading boundaries at all. That is a real observation and a bigger one. Filed separately rather than smuggled in here, because it is an agent-compose question rather than a loader question.
fix(skills): hold the composer's own identity doctrine eager
All checks were successful
ci / image-build (pull_request) Successful in 37s
ci / test (pull_request) Successful in 1m5s
ci / publish-echo-image (pull_request) Has been skipped
ci / publish-observed (pull_request) Has been skipped
df32c66eaa
#1004 made every entrypoint index rather than inline, and roster:core went
with it. An agent that has to fetch what its own boundaries say has already
acted without them, so the identity card named boundaries whose content was
absent. That is the #859 failure, one layer up.

The rule keys on the source directory rather than a name glob. roster:core
is a staged source of its own holding exactly role-*, boundary-*, and
personality-*, so provenance answers the question and a later addition to
the roster is covered without editing a pattern here.

Costs 5.7k to 10.8k bytes per role, measured across all eight.

Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/sirens-echo!1008
No description provided.