Repository navigation
Releases: ssheleg/make-skill
Release list
v0.33.4 — make-skill
- Codex edits are audited (hub board row B-211). Codex sends every file edit as one tool,
apply_patch, with the patch text intool_input.commandand nofile_path. The PostToolUse
hook matchedWrite|Edit|MultiEditand tookfile_pathwithsed, so aSKILL.mdwritten in
Codex was never audited. The matcher now namesapply_patch, andskill-md-audit.shparses the
payload as JSON: forapply_patchevery*** Add File:,*** Update File:,
*** Delete File:and*** Move to:path (relative ones against the payload'scwd), for the
other toolstool_input.file_path. EachSKILL.mdthat exists after the call is audited, and
the gaps of several skills come back in onesystemMessage. A payload with noSKILL.mdin it
starts no interpreter; a malformed one stays silent. Newtest/hook_test.py(17 cases, run by
npm testand CI); five of them fail on 0.33.3's hook. - Trigger:
"check a skill against the standard"/ «проверь скилл по стандарту» joins the
## Triggerssection ofmake-skill(the description is unchanged), with eval query q23 in
test/evals/triggers.json(not yet measured on a model).
v0.33.3 — make-skill
- The description target is 300 characters (hub board row B-257): the family moved to a
300-character budget on 2026-10-26 (B-255), but the canon new members and retrofits read
still said 400, so a skill written to it would raise the family total the hub ratchet holds.
SKILL.md,references/authoring.md,retrofit.md,agent-skills-spec.md, the
SKILL.template.mddescription,README.md,CONTRIBUTING.md, the eval scenario and both
DESC_TARGETconstants (audit_skill.py,test/validate.py) now say 300. The soft cap
(500, WARN) and the spec cap (1024, FAIL) are unchanged: only the advisory target moved.
v0.33.2 — make-skill
- Descriptions within a 300-character budget (hub board row B-255 (a)): Claude Code lists every
skill's description in one ~30,000-character budget, and on the operator's machine the listing
stood at 51,178. make-skill falls from 470 to 290 characters and skill-search from 397 to 297
(hub measure). Both gain a## Triggerssection holding the phrases the descriptions dropped;
make-skill's body trims two clauses so it stays inside its 4,750-token working limit (~4,740).
v0.33.1 — make-skill
test/family_gate.py, the family's canonical member gate (hub B-108, B-109): the board
parses (every row as wide as its header, no id twice) andrelease.ymlkeeps the tag-ancestry
check (fetch-depth: 0,git merge-base --is-ancestor), each watched failing on a plant by
--self-test. Wired into the gate; a byte-for-byte copy of the hub'smember-gate/family_gate.py.
v0.33.0 — make-skill
- Why. Claude Code fits every skill's description into one listing budget and
shows the rest as bare names. Measured on the operator's machine 2026-10-20: a
29,995-char listing for 134 skills, 81 of them with no description, against about
80,000 chars of descriptions on offer. Family descriptions sat at 870-965 chars
because the old house rule ("5% headroom", 970 of 1024) read as a target. Plugin
skills cannot be hidden withskillOverrides, so the length is the author's lever. - The rule. One "Use when ..." sentence naming the job, the 4-8 highest-signal
triggers in English and Russian as one compact list, one "NOT for ..." boundary
with the refusal phrase if any. Target 400 chars, house soft cap 500, spec cap 1024.
Longer trigger lists, examples and caveats go in the body. Stated inSKILL.md,
references/authoring.md(new section The description budget),
agent-skills-spec.md(norm table and checklist),retrofit.md(item 1),
claude-code-plugin.md(the 2026-10-20 measurement), theSKILL.template.md
placeholder, the Cursor rule, the/skill-auditcommand and theskill-auditor
agent (which now also sums a family's descriptions against the listing budget). - The checks.
audit_skill.py --housereplacesDESC_HEADROOM(GAP past 970)
withDESC_BUDGET: a WARN past 500 that does not change the exit code; past 1024
DESC_LENGTHstays the GAP. The text summary counts WARN lines.test/validate.py
printsWARN:past 500 for every shipped skill (it read make-skill alone before)
and fails only past 1024. The shared constants areDESC_TARGET = 400and
DESC_SOFT_CAP = 500, compared by the drift guard. The CIdescheadnegative case
(fail at 1000 chars) is gone; the auditor step now asserts a WARN instead. - Own descriptions.
make-skill943 to 470 chars (it keeps the five English and
Russian pairs the sshlg-skills routing table requires, so it sits above the 400
target and under the 500 cap);skill-search540 to 397. The dropped trigger
phrases moved into each body. To pay for the rule inside the body budget, two
gotchas (two token counters, time-branching text) now point atauthoring.md
Content guidelines, where the long form lives. - Tests. Six new cases in
test/checker_parity_test.py: the auditor WARNs and
does not GAP past the soft cap; it passes inside the cap and skips the rule without
--house; past 1024 onlyDESC_LENGTHfires; the validator WARNs and exits 0 on a
planted 600-char description in either shipped skill, stays silent on the shipped
ones, and fails at 1100 chars.fix-ms-01.02.pypins the two new thresholds' owner.
v0.32.0 — make-skill
- Supply-chain checks SC-1..SC-5.
references/enterprise.mdnames five shapes a
pre-install review must resolve: an unpinned runtime installer or a pipe into a
shell (SC-1), an unknown skill pack or marketplace (SC-2), a write to the user's
global instruction file (SC-3), an impersonation fork (SC-4, by hand from the SC-2
list) and a step that turns a security feature off (SC-5). Each carries the
primary source it rests on, read 2026-10-19. audit_skill.py --supply-chainreports SC-1, SC-2, SC-3 and SC-5 as named GAPs
with file:line over the skill's text files and its plugin'shooks/andbin/.
Off by default, so a skill that teaches installation keeps a clean conformance
audit. 14 cases intest/audit_regressions/sc-supply-chain.py(a planted positive
and a near-miss per check); the test fails against the 0.31.2 auditor.claude plugin evalre-measured. On Claude Code 2.1.299 (2026-10-19)
claude plugin eval --helpprints its usage and exits 0, andeval init --bare
writes a case and exits 0.references/authoring.mdno longer says every path
prints "early access" and exits 1 (that was 2.1.236, 2026-08-31);retrofit.md
anddistribution.mddrop "gated". No scored run was made.
Thevalidate.ymlnegative self-tests for this claim now plant against the new
wording and date.- Codex
AGENTS.mdbyte budget.references/distribution.mdrecords, from the
Codex guide, that Codex takes one file per directory from the project root down,
concatenates root first and stops adding files atproject_doc_max_bytes
(32 KiB by default), so the deepest guidance is what a long chain loses.
test/validate.pymeasures this repository's chain on every run, with a self-test.
v0.31.2 — make-skill
- FW01 expands the Python temporary-tree source check to the owning repository,
with the documented excluded directories and lexical limits preserved. - Only the exact ledger path, allocation count and call shape receive the existing
exception. Negative controls cover absent/wrong-path ledgers and changed calls. - Validation follows nightly and deliberate frozen-candidate promotion policy.
This patch packages source-validation maintenance; no new model-eval result or
broader lexical/dataflow guarantee is claimed. - FW01 source evidence.
v0.31.1 — make-skill
Correction to v0.31.0's MS-05 entry. That entry said the check refuses a temp-dir call
"through any receiver". Measured against temp_maker_hit(): it catches a direct call through
one receiver or none (tempfile.mkdtemp(, tf.mkdtemp(, mkdtemp() and a one-line renaming
from-import (from tempfile import mkdtemp as m); only whole-line # comments and """
blocks are skipped (chained receivers, function references, getattr and parenthesised
multi-line imports are not seen). A trailing # comment or a ''' block that names a
maker is read as code and refused, which errs toward a false refusal, not a miss.
The missing-back-link message says how the routing runs. test/validate.py told an
author that "the adapter skills route authors here and this skill must route them back";
only creating-fabric-agents routes here. The message now reads no back-link to <name> —
creating-fabric-agents routes packaging here; this skill names all three builders and
handling-secrets in return, and an in-gate self-test refuses the old wording.
HANDOFF records v0.31.0 as published (tag, release run, npm, hub pin) and keeps W4-C as
the single next task.
v0.31.0 — make-skill
MS-05: a source check that every test temp tree goes through the residue ledger.
test/validate.py now refuses a mkdtemp() or TemporaryDirectory() call through any
receiver (tempfile., an alias, or none) and a from-import that renames either, anywhere
under test/ (recursively; comments and """ docstrings are not read as calls). It reads
Python only: installer_test.js keeps its own ledger, and mkstemp/NamedTemporaryFile
make files, not trees. Ported from
agent-stack, widened to subdirectories — and it found six real bypasses in
test/audit_regressions/, now routed through residue.workspace().
Back-links to the skills this one routes work to. references/mcp.md now points a
skill about a Fabric agent or service at fabric-agent-adapter:creating-fabric-agents,
:adapting-projects-to-fabric and :building-fabric-services, and credentials at
observatory-log:handling-secrets; the validator checks the names appear (not that the
targets still say what the one-liners say — read against fabric-agent-adapter 0.20.0). Only
creating-fabric-agents points back here.
skill-search trigger evals (authored, not yet model-run). 20 queries in English and
Russian, both classes in both languages on each side of the split, in
test/evals/skill-search/triggers.json; test/evals_validate.py validates them and is
now part of npm test.
v0.30.1 — make-skill
references/distribution.md step 6 told a release to refresh this machine with
npx skills update <name> --global --yes for every skill. For a member of a family
with its own launcher that is the wrong door: a bare skills-CLI update of a plugin
member recreates the plain ~/.claude/skills shadow and bypasses the family's pins.
The step now sends a family member through its launcher (npx --yes sshlg-skills@latest update, no member argument), a non-family plugin through its
full id, and keeps the update-plus-prune recipe for standalone skills. Reported
2026-10-11 by a peer session against the operator's standing rule.