fix(skills): restore the skill contract, entrypoints index rather than inline #1004
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!1004
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/971-skill-contract"
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 #971. Kai asked for this tonight. It is green, and one decision stands
between it and merging — that decision is the reason to read this rather than
approve it.
What was wrong
loadSkillspartitioned onisReferencePath, so an entrypoint was alwaysinlined and only a reference could be deferred.
stripFrontmatterthen droppednameanddescriptionentirely. That is the skill contract backwards: thefield meant to be a cheap always-on index was discarded, and the body meant to
be fetched on relevance was the part always present.
What changed
Three small things, which is what #971 predicted:
inline: alwaysfor both kinds, so an entrypoint candefer like a reference.
descriptionas its index line.firstHeadingbecomes the fallback for a file that declares none, ratherthan the first choice.
inline: always, so nothingthat was in the prompt has left it.
read_skillneeded no change. It already takes a repo-relative path.Measured, against the catalogue at agentic-os main
#971 estimated ~74% headroom. This lands at 69% because local policy is held
inline, which is the difference between the estimate and keeping the guards.
For context on why that matters beyond tidiness: #932 has this lane at a 32.9s
median turn from a 116KB fixed prefix with zero prompt-cache hits.
Step 3 is load-bearing, and there is proof
The first cut deferred everything, and
TestNewAgentSupportsHTTPOnlySocialDeploymentfailed because
coilyco-general's response policy had become fetchable. That isthe whole risk of this change in one test, and it passes now.
ops-social-discordandrepo-sirens-echoare deliberately not marked: nosirens definition loads them, and the second is generated, which its own hook
told me when I marked it by mistake.
The open decision, which is not mine
The composed bundle's
roster:coreentries —role-*,boundary-*,personality-*— are now deferred too. The identity card still names them, sothe agent knows which boundaries it carries and not what they say.
That is exactly the failure #859 named: a model that has to choose to read its
own boundaries may not.
Those files live in agent-compose's roster, not here, so the options are:
inline: alwaysupstream, which is a catalogue change #971 saysshould not be needed
pattern in code, and encodes an inventory the code should not own
enough
I do not think this should merge before that is answered, and it is 17 hours
to a livestream on the lane it most affects. My own recommendation is to answer
it after the stream and merge then, since the 69% is worth having and none of it
is worth discovering live.
Tests
Three pinned the old contract and are rewritten against the new one rather than
loosened.
TestLoadSkillpackReadsComposedSourcesnow asserts the inversiondirectly: the pack carries the description and not the body, the reference
list holds three entries because both entrypoints joined it, and an entrypoint
with no description still indexes by its heading rather than vanishing.
That fixture also gained a
description, becausecheck_skill.pyfails thebuild on an empty one, so the old fixture was a tree agent-compose cannot ship.
Full suite and
pre-commitpass.Follow-ups this unlocks, both cheap now and not in scope here
.agents/skills/wholesale instead of onlylocal_skill_rootsnow costs descriptions rather than bodies. It wasunaffordable before this and is not now, which is what removes the special
loading step.
read_skillcalls carry a path,but
progressRowholds no argument, so every call rendersskills.read_skill.That matters more once skills are fetched rather than always present.
Refs #971, #968, #993, #932, #859