Conversation
Every enabled skill contributes a line to a listing the agent reads at the start of a session, and that listing has a budget set as a fraction of the context window. On overflow nothing fails: names are kept, descriptions are dropped by least recent use, and a skill with no description can no longer be matched against a prompt. structure.py reads one skill at a time, which is right for a limit the format sets per skill. This one belongs to the whole set, so every skill can be within its limits and the listing still overflow. A published catalog cannot observe this. It is a guest in a budget it does not own, sharing it with whatever its installers already had, so the number worth watching is the share it consumes. Reported, not graded. Where the line sits is another repo's judgement, and a threshold invented here would be argued with rather than watched.
🔄 Changes requestedThe new Summary
Remaining ConcernsBlocking
Non-blocking suggestions
Missing elements
Positive signals
Deployment Notes
🤖 Automated review by agent-hub — |
The point of this module is that one number is right, and nothing was checking it. A separator counted once too often, an entry overhead of three, or a share divided the wrong way round would have misreported quietly for as long as anyone cared to read the line. So the totals here are worked out by hand from the entries the fixture writes, rather than from the module's own constants: a total derived the way listing.py derives it would agree with the bug as readily as with the arithmetic. Covered are the entry cost, the separator between entries and not after the last, the three ways frontmatter can fail to load, the description clamp, the budget and its floor, the share and its zero guard, the printed line, and its absence over a repo with no skills. The clamp and the unreadable list are unreachable through the CLI, which runs the structural gate first; both now say so, and a test pins the cap above the gate's so the claim cannot quietly stop being true. The printed line carried a bare percentage while the docstring was candid that it rests on settings this repo cannot observe. It now says which defaults it assumed. README and docs/usage.md mention the line, which was visible output nothing described.
|
Addressed in Blocking — test coverage for
|
Summary
skillscope/listing.py: what a repo's skills cost in the listing the agent reads at session start, mirroring the runtime's own arithmetic (context tokens x bytes per token x fraction, per-description cap, one separator per entry).skillscope structuralprints one line with the total and the share of the default budget it consumes. Silent when the repo has no skills.Why
structure.pyreads one skill at a time, which is the right shape for a limit the format sets on each skill. The listing budget belongs to the whole installed set, so every skill can be within its limits and the listing still overflow.On overflow nothing fails. Names are kept and descriptions are dropped, ordered by least recent use, until the rest fits. A skill with no description is still callable by name and can no longer be matched against a prompt. Nobody is told, and a freshly installed skill has no usage history, so it is first to lose its description and then never gets used.
A published catalog cannot see any of this from its own repo. It is a guest in a budget it does not own, sharing it with whatever skills its installers already had.
Measured on amd/skills today: 8 skills, 5,772 characters, 72% of the default budget. Average 724 per skill, so roughly three more skills and the catalog alone consumes the whole thing.
Why no threshold
Where the line sits between a catalog people can install alongside their own skills and one that takes the room is another repo's judgement. A number invented here would get argued with rather than watched. The share and the per-PR delta are useful without anyone agreeing on a limit first; a gate can follow once the number has been visible for a while.
How to test
Look for the
[evals] listing:line. A repo with no skills (this one) prints nothing.