Found by the first scheduled weekly review after 3.3.0 — the loop catching a defect in the skill that runs it.
A patch for a bug shipped in 3.3.0. If you've run a weekly review since installing it and saw skills fail the size gate without having changed, this is why.
What was wrong
3.3.0 added the core-size ratchet as a constant inside the validator:
MAX_CORE_LINES = 728728 is task-observer's own core size on the day that was written. But validate-skill-bundle.py ships inside task-observer, and the weekly review runs it against every skill in your library — so one skill's private budget silently became a library-wide limit.
In the first review after release it failed three unrelated skills that hadn't grown at all, each with the message "Move content to a reference file — do not raise the ceiling." That advice is right for the skill the number belongs to and meaningless to any other.
The fix
The ceiling is a property of the skill, not of the script. Declare your own:
---
name: "my-skill"
core_max_lines: 640
description: "..."
---or put the number in a .core-ceiling file beside SKILL.md.
Not declaring one is not a failure. A skill that declares neither hasn't opted in: the line count and the distance to the 500-line target are still reported, and nothing is gated.
A malformed value doesn't silently become a default. It says so and doesn't gate — falling back to some number is how this happened in the first place.
Seed it at whatever your core measures today. The point isn't that every skill reaches an ideal size; it's that no skill silently grows past where it already is. That's what makes it a ratchet rather than someone else's rule.
Controls run
- task-observer at its declared ceiling — passes
- the three skills that failed — now report and pass
- a declared ceiling set below the real size — still fails
- a malformed value — reports, does not gate
- the
.core-ceilingfile path — resolves
A note on the ratchet's own rule
task-observer declares 728 for itself, and its core is still 728. The line the declaration costs was paid back out of the text, not by moving the ceiling — the rule that it only ever falls survives the release that fixes the mechanism.
The general lesson
A tool one skill ships for the whole library must not carry that skill's own constants. Any threshold in a shared script is either read from the subject being checked or is advisory. The tell is a gate that fails on input its author never looked at.
references/skill-authoring.md now documents the ceiling as opt-in and carries that rule.
Installing
Download task-observer.skill below, or:
npx skills add rebelytics/one-skill-to-rule-them-all --skill task-observer