toolkit-skill-standards
Use when writing or reviewing a SKILL.md for jabworks/agentic-toolkit — frontmatter budgets, the trigger contract ("Use when…" description or when_to_use field), progressive disclosure into references/, and keeping a new description out of existing skills' trigger space. Triggers include "review this skill description", "write the frontmatter", "does this collide with an existing skill", "where should this content live". Not for scaffold/sync mechanics; use toolkit-foundry.
- License 许可
- MIT
- 最近更新
- 2026-11-03
- Stars
- ★ 2
- Forks
- 0
01 前言 Front Matter
- name
- toolkit-skill-standards
- description
- Use when writing or reviewing a SKILL.md for jabworks/agentic-toolkit — frontmatter budgets, the trigger contract ("Use when…" description or when_to_use field), progressive disclosure into references/, and keeping a new description out of existing skills' trigger space. Triggers include "review this skill description", "write the frontmatter", "does this collide with an existing skill", "where should this content live". Not for scaffold/sync mechanics; use toolkit-foundry.
02 资源文件 1
- 参考文档evals/trigger_eval.json3.0 KB
03 SKILL.md 正文
Toolkit Skill Standards
Purpose
The content bar every SKILL.md in this repo must clear: budgets, trigger contract, structure, and collision discipline.
When to use
- Drafting or rewriting any SKILL.md frontmatter or body in this repo.
- Reviewing a proposed skill before it ships.
- A description "feels fine" but the skill under- or mis-triggers.
When not to use
- Scaffolding/registering/syncing mechanics →
toolkit-foundry. - Adapting an externally-sourced skill template to the jabworks stack →
adapting-skills(then return here for this repo's frontmatter/mirror requirements). - Triage of a live triggering bug →
toolkit-debugging-playbookfirst; it routes back here when the cause is wording.
Inputs required
- The draft SKILL.md (or the skill name to review).
- The current library inventory:
ls skills/+ each sibling's description ANDwhen_to_use(both fields form the trigger contract).
Procedure
-
Budgets (test-enforced): description ≤ 500 chars; total frontmatter ≤ 1024;
namekebab-case and identical to the directory name. Check:node --test tests/skill-invariants.test.mjs. -
Trigger contract (owner-ratified 2026-07-08): the contract is description +
when_to_usetogether.- Standalone skills / no
when_to_use: description MUST start with "Use when…" and lead with trigger terms a user would actually type. - condux-style skills: description states what it does;
when_to_usecarries the trigger conditions ("Trigger when…"). Both fields count against the 1024 budget.
- Standalone skills / no
-
Canonical frontmatter form (test-enforced). "Quote YAML strings" was the old rule; it caused its own incident (
2026-08-05— a single-quoted value with a bare apostrophe inthat's). The rule is now a shape, not an instruction to quote:- Every line is
key: value— one space after the colon, no lists, no block scalars. - Plain (unquoted) when the value is safe: it must not start with
- ? : , [ ] { } # & * ! | > ' " % @ `, contain:or#, or end with:. - Double quotes otherwise, escaped the way JSON escapes (
\",\\). - Single quotes are banned outright. YAML needs
''for a literal apostrophe inside them, and that escape is the footgun. Nothing here needs them.
Don't hand-fix a violation — run
node scripts/check-frontmatter.mjs --fix, which rewrites illegal values and leaves legal ones byte-identical. Check withnode --test tests/frontmatter-canonical.test.mjs tests/frontmatter-yaml.test.mjs.Why two gates: the canonical form makes the break unwritable, and the strict
yamlparse proves the form's premise. Neitherclaude plugin validatenor the budget tests can do this — validate passed the file that broke Codex on 2026-08-05 (Claude's frontmatter parser is lenient), and the budget tests regex-parse. Seetoolkit-failure-archaeologyfor all four incidents. - Every line is
-
Front-load trigger terms. Most important phrases first; include the literal words users type ("sync dist", "am I done", "browse specs"). Workflow summaries belong in the body, not the description.
-
Collision scan (mandatory). Read every sibling description +
when_to_use. If the new skill's trigger space overlaps, either merge into the sibling or add explicit mutual disambiguation — both skills name each other, the way subagent-deployment ("not for executing an ordered plan — that's subagent-execution") and subagent-execution ("not for ad-hoc independent tasks — that's subagent-deployment") do. Known hot zones to check against: the subagent pair, plan-review↔spec-browser ("spec directory"), preflight↔finalize ("am I done"), toolkit-foundry↔adapting-skills (skill creation vs adaptation), concord↔toolkit-failure-archaeology ("has this happened before"). Enforcement:tests/skill-routing-contracts.test.mjsasserts each guarded pair names the other in frontmatter — add every new pair there so the guard can't silently erode.scripts/collision-scan.mjs --checkexists but lexical scoring was falsified (5% recall, 2026-07-09) — the reading, and the test, are the scan. -
Progressive disclosure. SKILL.md = concise runbook readable in one scan: purpose, when (not) to use, procedure, traps, related skills. Long archaeology, catalogs, templates, ledgers →
references/. Executable helpers →scripts/or references (see plan-review'sreferences/annotate-server.js). -
Every skill with a plausible sibling overlap must state when NOT to use it and name that sibling instead. Keep unrelated skills concise; do not invent a false alternative merely to fill a section.
-
Interaction contracts. A skill that prescribes a user-facing menu or checkpoint must mark the option set as exhaustive ("present every row, every time") and state that behavioral defaults shape the recommendation marker, never which options appear — an un-defended menu erodes toward the default over sessions (CP-1 incident,
2cc080d). If another skill's prompt can absorb the menu (e.g. a sign-off step doubling as the what-next menu), both skills carry the requirement, on both sides of the seam. -
Dependency ladder. Anything the skill invokes beyond its own files must follow the ladder (section below): work from skill files alone, prefer detected richer surfaces, never depend across plugin boundaries.
-
Health check. A plugin with machinery beyond skill files — hooks, a server, a package registration — ships a doctor per the health-check convention (section below). Reviewing such a plugin without asking "how would a user find out this is broken?" is an incomplete review.
Artifact location contract
Any skill that writes a file into the user's project follows this. Two tiers, split by durability — not by which skill produced them.
| Tier | Where | Git |
|---|---|---|
| Durable — the user asked for this and will keep it | a normal project path (specs/, docs/) |
committed |
| Working state — scaffolding the durable thing was built from | <git-root>/.<plugin-name>/, subdivided by artifact type |
gitignored |
The directory is named for the owning plugin, never the skill and never the
artifact. condux has 13 skills and one .condux/ — the install unit is the
plugin, so it's the thing that owns a directory and the thing a user removes to
stop the directory reappearing. .handoffs/ names content, not owner: two
plugins can both produce handoffs, and the name doesn't say what to uninstall.
Current owners: .condux/ (designs/ plans/ progress/ scratch/ verification/),
.concord/, .session-handoff/, .session-report/.
Bootstrap — the first write in a repo runs this, once:
- Resolve
<git-root>viagit rev-parse --show-toplevel. Not a git repo → fall back to CWD and say so once. git check-ignore -q .<plugin-name>/— if already ignored, proceed silently.- Otherwise ask once: "
<skill>keeps its working files in.<plugin-name>/— add it to.gitignoreso they stay out of your commits?" On yes, append. If the user would rather not touch a tracked file, write it to.git/info/excludeinstead. - Never edit
.gitignoreor.git/info/excludewithout asking.
Override — an explicit AGENTS.md path always beats these defaults.
Never write working state into the repo root, into CWD, or into a project's
docs/: those belong to the project, not to the tool.
Dependency ladder
A shipped skill may prefer richer surfaces but must require nothing beyond its own files. Three rungs:
| Rung | Surface | Present |
|---|---|---|
| 1 | Skill files — SKILL.md, references/, scripts/ |
always, on every channel |
| 2 | CLI bundled inside the skill dir (record's server/docket.mjs) |
always — travels with the skill through npx skills add; needs only Node |
| 3 | Registered MCP server or hooks | host-dependent — exists only after plugin install and registration |
- Function on rung 1 alone.
npx skills addships bare skill trees with no plugin manifest — no.mcp.json, no hooks. A skill that requires rung 3 is broken on an entire distribution channel regardless of how good its installer is. - Prefer the highest rung you can detect; detect, never assume. The reference phrasing is record's: "prefer the MCP tools when registered, otherwise run the bundled CLI."
- Cross-plugin dependencies are banned at every rung. A docket skill that needs condux — or any skill that leans on a third-party MCP server or plugin — breaks silently for everyone without that plugin, and no installer or doctor can fix a dependency the bundle doesn't ship.
- What makes rung 3 a first-class preferred path rather than a lucky bonus:
INSTALL.md(detect → register → verify → report) makes it reliable to reach, and the health-check convention below reports which rung each plugin actually runs on per host.
Ratified 2026-08-05 (docket #6), graduating the older absolute "assume no MCP/plugin is installed" rule after docket shipped the ladder in practice.
Health-check convention
The standing counterpart to INSTALL.md: an installer verifies once, a
doctor verifies whenever you ask. Any plugin with machinery beyond skill
files — hooks, a server, a package registration — ships one.
docket-doctor is the reference implementation.
Four beats, the same shape as ease-of-install:
- Detect — which hosts exist on this machine. Missing host is
absent, not an error. - Probe — every registration the plugin depends on, per host. Static parse and execution: the registered path must exist and the thing it registers must answer. A manifest that parses while its server is dead is the failure the convention exists to catch.
- Report — one row per probe,
host status detail, nothing silent. A host that needs nothing is named with its reason. - Fix — print the repair for every broken row. Performing it is optional and belongs to the plugin's own installer; never reimplement registration inside a doctor.
Non-negotiables:
- Probes must not mutate. Every execution step answers "what does this
write?" first. concord's
capture.mjswrites to the memory store, so it is resolved and loaded but never invoked; aninitializeround-trip mutates nothing, so it runs. - Offline. Version comparison reads the local marketplace clone and prints that clone's own age. A doctor runs in degraded conditions by definition — one that hangs without network fails exactly when needed.
- Own files only. A doctor lives inside its own skill directory so
<skill-base>/doctor.mjsresolves on every distribution channel, and it probes its own plugin. Cross-plugin doctors are banned for the same reason cross-plugin dependencies are. - Say what it cannot prove. No child process can tell whether the host invoked a hook. The report states that probes are static-plus-executable so a green board is never misread as "the hook fired".
Statuses are exactly four — done, broken, absent, skipped. Only
broken fails the run: an unmade optional registration is absent, because
the ladder says the skill still works a rung down.
Ratified 2026-08-06 (docket #1).
Suppressed-class misses
A trigger miss where the description is not the problem: the skill's
declared vocabulary matches the user's turn near-verbatim, the skill still
doesn't fire, and the cause is content already injected into context (a memory
digest, an index) that satisfies the information need before the trigger is
consulted. Measured in specs/trigger-reliability/ — session-handoff fired on
~9% of resume-shaped turns against ~64% of wrap-up turns, same skill, same
declared vocabulary, same sessions.
Recognising it is the whole value of this section. The reflex on any miss is to rewrite the description, and on this class that reflex is measurably wasted: you cannot fix being pre-empted by rewording the thing that was never consulted. A skill whose phrases are already declared and still missing is not a description defect — stop, and look for what answered the turn first.
One finding here generalises past nudges and is worth keeping in mind whenever
anything injects into context: directive, never content. Injected text that
answers a question suppresses the routing decision for it; text that only says
where something routes does not. That is the mechanism behind the whole class
(specs/trigger-reliability/ Q1, Q3).
The nudge remedy is declined, not recommended (2026-08-28)
The named remedy used to be a conditional SessionStart hook injecting a short routing directive — D2's routing-nudge convention. It is no longer house doctrine. session-handoff carried the only instance and 2.0.0 removed it: carrying a second SessionStart hook per suppressed skill was not judged worth its permanent cost, which is paid on every session of every install.
Two things this is not. It is not a falsification — the nudge was never
measured, and Q4 shows no harness can measure one, so the rules were never
tested. And condux's workflow/hooks/routing.md is not a surviving instance:
it is unconditional and bundle-wide, which the convention's own first rule
forbids. It is the precedent for SessionStart injection as a mechanism, nothing
more.
The rules themselves are archived intact in specs/trigger-reliability/
(D2, retired) — read them there if a nudge is ever back on the table.
Bar for shipping one again, both required, never this section alone:
- a measured suppressed-class verdict for the specific skill, and
- explicit owner sign-off on the ongoing token cost.
Absent both, a suppressed-class verdict is a finding to report, not a defect to patch. Reporting it honestly — "this skill cannot win these phrases, here is why" — beats shipping machinery nobody asked for.
Class ratified 2026-08-28 (trigger-reliability D1/D2); nudge remedy declined the same day (docket #69, D2 retired).
Evidence required
For "the description is fine": show budget numbers and the collision scan result (which siblings were checked, why no overlap). For "this collides": quote the overlapping phrases from both skills.
Output artifact
A pass/fail review with specific rewrites, or ship-ready frontmatter.
Common traps
- Judging only the
descriptionand missing that 14+ skills carry their triggers inwhen_to_use— you'll "fix" something that isn't broken. - Trimming needed procedure to fit a scan instead of moving it to
references/. - Writing the description about what the skill DOES instead of when it's NEEDED — models trigger on user-moment language, not feature lists.
Bad behavior this prevents
Shipping a second "sync my skills" skill next to toolkit-foundry because the author
never read the sibling descriptions. Three skills in this repo (preflight,
subagent-execution, test-first-development) shipped with no machine-visible trigger
contract at all until the 2026-07-08 audit added their when_to_use fields — the
collision scan + trigger-contract check makes both failure shapes visible before ship.
Related skills
toolkit-foundry (mechanics after content passes), toolkit-change-control (ship
gate), adapting-skills (external templates first — and the owner of these
standards applied to skills in other projects), toolkit-debugging-playbook
(live trigger failures).
Provenance and maintenance
Re-verify volatile claims with:
node --test tests/skill-invariants.test.mjs— budgets/name enforcementnode --test tests/skill-routing-contracts.test.mjs— the guarded collision pairsgrep -l 'when_to_use' skills/*/SKILL.md— which skills use the two-field contract
Last generated: 2026-07-08 (owners/counts + routing-test enforcement noted 2026-08-04) Known uncertainty:
- How each host tool weights
descriptionvswhen_to_usefor auto-triggering is unverified — treat front-loading BOTH fields as the safe default.
04 同仓库更多 Skills
orphan
暂无简介
no-blurb
暂无简介
workflow
Routes any dev task into the right execution tier (Small/Medium/Large) and carries condux's operating rules — proportional effort, lazy skill loading, soft gates, implement-yourself-by-default.
usage-trace
Checks and manages durable, local usage capture — ingest, health status, and the opt-in limit snapshot — for Claude Code and Codex. Capture itself runs automatically at session start.
toolkit-research-frontier
Use when planning improvement work on jabworks/agentic-toolkit itself — open problems (trigger-collision automation, YAML-strict frontmatter checks, docs-catalog enforcement), existing assets, the next three concrete steps, and the four-front library-health campaign with commands and success criteria. Triggers include "let's improve our toolkit", "let's improve this repo", "what should we improve next", "toolkit roadmap", "open problems", "run the health campaign".
toolkit-plugin-reference
Use when writing or editing plugin.json, marketplace.json, or package manifests in jabworks/agentic-toolkit and the exact schema matters — required fields, the .claude-plugin/.codex-plugin pairing and where it diverges (interface, hooks), the skills-path form, how the four install channels consume the repo, and which SKILL.md frontmatter fields are real. Triggers include "what fields does plugin.json need", "claude vs codex manifest", "marketplace entry format", "how opencode loads skills".