Standard-to-check coverage
Reference: Standard-to-check coverage
Section titled “Reference: Standard-to-check coverage”Generated by scripts/gen-standard-coverage.mjs. Do not edit this page. A drift guard in npm test fails when this file, STANDARD.md and the check registry disagree, which is what stops the mapping going stale (ADR 0059, every MUST maps to a check, a SHOULD or a stated gap).
Standard version 0.17. 139 MUST / MUST NOT tokens in STANDARD.md, of which 123 become the 103 clause rows below and 16 are excluded for a stated reason. The two numbers reconcile exactly, on every run: a clause the parser loses would otherwise be a MUST this page silently declares covered, which is the failure ADR 0059 names as the risk of its own fix.
What a disposition means
Section titled “What a disposition means”| Disposition | Count | Meaning |
|---|---|---|
checked |
29 | A named spine check enforces the clause. |
partial |
14 | A named spine check enforces PART of it. The note says what is not checked. |
house |
10 | Enforced outside the graded spine, by a named guard in this repository. A third-party plugin gets no such check. |
ruled |
7 | ADR 0059 (every MUST maps to a check, a SHOULD or a stated gap) ruled its disposition. The ruling is quoted in the note and is not yet applied, so the clause still reads MUST. |
gap |
23 | No check enforces it and no ADR has ruled it. A gap is not a defect list. It is the list of clauses that need a ruling. |
grader-facing |
14 | The clause’s own subject is the tooling, not a graded plugin, so no reqId can enforce it. Classified from the clause’s grammar, not by judgement. |
list-stem |
4 | Introduces the bullets that carry the requirement; each bullet has its own row. |
table-header |
2 | A table header or schema cell, not a requirement clause. |
Agreement with ADR 0059
Section titled “Agreement with ADR 0059”ADR 0059 ruled seven clauses. Each is carried by a row below, and generation FAILS if any is not, so this page cannot quietly drift away from the decision it implements. One of the seven has been applied to STANDARD.md: the sec 7.3 HISTORY.md demotion, at Standard 0.17. Its row reads gap, because the MUST left on that line is the metadata.version half, which nothing checks and no ADR has ruled. The other six still read MUST in the Standard, which is why each appears as ruled rather than as checked or as a SHOULD.
| ADR 0059 clause | Carried by |
|---|---|
sec 7.3 HISTORY.md at Silver+ |
sec 7.3 line 319 |
sec 5.1 entry path and version agree with disk |
sec 5.1 line 291 |
sec 3.10 AGENTS.md links resolve |
sec 3.10 line 229 |
sec 3.10 AGENTS.md counts agree |
sec 3.10 line 229 |
| sec 7.2 a drifted sample is an error | sec 7.2 line 316 |
| sec 7.4 version propagation is verifiable | sec 7.4 line 324; sec 7.4 line 329 |
| sec 8.2 name collisions | sec 8.2 line 378 |
Excluded tokens
Section titled “Excluded tokens”| Reason | Tokens |
|---|---|
| Appendix A decision log (each entry restates a clause that lives in its own section) | 3 |
| the RFC 2119 key-words definition | 2 |
| version-history note (the front-matter blockquote) | 11 |
Every MUST
Section titled “Every MUST”Ordered by section. Line is the line in STANDARD.md at the time of generation.
| Clause | Line | Disposition | Checks | Note |
|---|---|---|---|---|
| sec 1 - Composable over monolithic. Each component MUST do one thing and be usable independently. | 59 | gap |
- | No check tests whether a component does one thing. |
| sec 1 - every instruction MUST earn its place. | 60 | checked |
U7 |
U7 (instruction-budget) enforces it as a body-line-count proxy and cites sec 1 in its own finding. |
| sec 1 - Progressive disclosure. Detail MUST load on demand (references, scripts, assets), not up front. | 61 | partial |
U7 |
U7 caps the SKILL.md body and its remediation is to move deep content into references/. Nothing verifies that the content moved there is actually loaded on demand. |
| sec 1 - Agent-native. Components MUST be written for an agent reader, not as human docs an agent happens to consume. | 62 | gap |
- | A judgement about the reader a component is written for; no deterministic check exists. |
| sec 1 - Portable by default, advanced by choice. A plugin MUST be usable at the Universal tier on any compliant agent, and MAY add agent-specific power at higher tiers. | 63 | gap |
- | The Universal tier’s checks operationalize portability; no check tests this clause. |
| sec 1 - A la carte adoption. Any single component MUST be usable without adopting the rest of the plugin or the Standard. | 65 | gap |
- | Nothing installs a component in isolation to test it. |
| sec 2.1 - A Universal-tier plugin MUST: | 79 | list-stem |
- | Introduces the bullets that carry the requirement; each bullet has its own row. |
| sec 2.1 - Keep its authored markdown structurally valid where it carries diagrams: every fenced mermaid block MUST be structurally well-formed (a recognized diagram keyword, balanced brackets, no tabs), so i… | 84 | checked |
U12 |
The clause names U12 (mermaid-valid). |
| sec 2.1 - Register every skill it ships: where the plugin’s manifest enumerates skills (library.json components.skills, or a .claude-plugin/marketplace.json plugins[] catalog whose entries point under skills… | 85 | checked |
U13 |
The clause names U13 (skill-registration). |
| sec 2.1 - Ship no agent that declares a field the runtime refuses: an agent under the plugin’s agents/ directory MUST NOT declare hooks, mcpServers or permissionMode (U14, agent-restricted-fields). | 86 | checked |
U14 |
The clause names U14 (agent-restricted-fields). |
| sec 2.2 - Concepts both CC and CX support, but in different formats, so they MUST be emitted per agent target. | 89 | partial |
S6, S7 |
S6 checks only that each declared target’s native manifest exists, plus the mcpServers pointer when .mcp.json is present; S7 checks the command contract. No check verifies that a subagent or a workflow is emitted in each target’s format. |
| sec 2.2 - A Convergent-tier plugin MUST, in addition to Tier 1: | 92 | list-stem |
- | Introduces the bullets that carry the requirement; each bullet has its own row. |
| sec 2.2 - Declare chain contracts for any skill or subagent that invokes another (Section 3.6) - a conditional MUST: required when chaining is used, not otherwise. | 95 | checked |
S4 |
S4 (chain-contract) is conditional on chaining being used, as the clause requires. |
| sec 2.3 - An Advanced-tier plugin MUST, in addition to Tier 2: | 103 | list-stem |
- | Introduces the bullets that carry the requirement; each bullet has its own row. |
| sec 2.4 - Tooling MUST be able to verify a claimed tier and MUST report the highest tier a plugin actually satisfies. | 109 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 2.4 - Report format. Tooling MUST emit both a machine-readable and a human-readable form. | 111 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 2.6 - A plugin claiming Gold MUST satisfy every item below, and tooling MUST verify each. | 129 | partial |
G1, G2, G3, G4, G5, G6, G7, G8, G9, G10 |
A check module exists for each of the ten items, so every item is NAMED by the spine. G1, G2, G3 and G4 each enforce only PART of theirs, which is why this is partial and not checked. G1: hook scope and failure behaviour are not read - see the sec 3.5 row; open question HC-08 (G1’s clause requires hook scope and failure behaviour the check never reads). G3: nothing EXECUTES a case - see the sec 8.3 row; open question HC-07 (G3’s clause promises CI execution the check never looks for). G4: manifest.generated.json is read by no SPINE check - see the sec 5 package.json-precedent row. G2: self-hosting.mjs reads workflow TEXT offline, so it cannot observe a run, a trigger firing, or whether CI is green (its own docblock); unlike the other three, G2 has no row dedicated to this limit - sec 4.1 mentions G2 but records a different one - so its gap is recorded by this note and by backlog E64 (G2 reads workflow TEXT, so four ways CI can fail while the check passes). Nothing is claimed here about the remaining items, in either direction. |
| sec 2.6 - | # | Requirement (MUST, in addition to Bronze + Silver) | Satisfied by | Deferred elaboration (NOT required at Gold) | | 131 | table-header |
- | A table header or schema cell, not a requirement clause. |
| sec 2.6 - The toolkit targets Gold at v1 and MUST pass G1-G10 against itself before release. | 146 | house |
- | A clause about this repository rather than a graded plugin. package.json prepublishOnly runs npm test && node scripts/check.mjs, so a release cannot be published without passing the gate. |
| sec 3.1 - name (REQUIRED): 1-64 chars, lowercase a-z/0-9/-, no leading/trailing/consecutive hyphen, MUST equal parent directory name. | 158 | checked |
U3, U4 |
U3 enforces the character rules and length; U4 enforces equality with the parent directory. |
| sec 3.1 - MUST state what the skill does AND when to use it, with trigger keywords. | 159 | checked |
U5 |
U5 (description-score) scores the what-and-when rubric of sec 8.1. |
| sec 3.1 - Validation rules: frontmatter MUST validate; | 164 | checked |
U3 |
U3 (frontmatter-valid) parses and validates the frontmatter. |
| sec 3.1 - SKILL.md SHOULD be < 500 lines and instructions < ~5000 tokens; deep content MUST move to references/ (one level deep). | 164 | partial |
U7 |
U7 caps the body line count. Nothing verifies that the moved content is one level deep under references/. |
| sec 3.2 - Rules: a command MUST map to exactly one skill or workflow. | 171 | checked |
S7 |
S7 (command-contract) requires a maps-to resolving to exactly one on-disk skill or workflow. |
| sec 3.2 - Its description MUST be non-empty and state what invoking the command does, and it SHOULD agree with the backing skill’s intent. | 171 | partial |
S7 |
S7 checks non-emptiness. The ‘state what invoking the command does’ half is not scored: ADR 0048 demoted the command description from the sec 8.1 bar after 0 of 14 commands in the reference family satisfied it. |
| sec 3.2 - For multi-target plugins, a command MUST be emitted in each target’s format (CC: commands/ |
171 | gap |
- | No check verifies that a command is emitted in each declared target’s format. U18 (command-size-cap) grades a related Codex hazard but not emission. |
| sec 3.2 - Tooling and docs MUST set this expectation rather than implying byte-for-byte command equivalence. | 174 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 3.3 - Rules: a subagent MUST declare its purpose and the narrowest tool set it needs. | 180 | gap |
- | No check reads a subagent’s tool set for narrowness. |
| sec 3.3 - A subagent that may be invoked by skills MUST appear in a chain contract (3.6). | 180 | checked |
S4 |
S4 reports an invocation not covered by the contract (an orphan). |
| sec 3.3 - Every .md file under agents/ MUST be a registered subagent (U15, agents-dir-registerable). | 181 | checked |
U15 |
The clause names U15 (agents-dir-registerable). |
| sec 3.4 - Rules: every skill referenced MUST exist; | 186 | checked |
S5 |
S5 (workflow-skills) reports a step referencing a skill that is not on disk. |
| sec 3.4 - every chaining step MUST be permitted by a chain contract (3.6); | 186 | checked |
S4 |
S4 owns the permitted-edge rule. |
| sec 3.4 - A workflow file MUST be mirrored in the components index: every workflows/ |
186 | checked |
S3 |
The clause names S3 (components-index); the workflow half of the mirror gates at Standard 0.15 (ADR 0047). |
| sec 3.5 - Rules: each hook MUST document its event, trigger, scope, and failure behavior. | 192 | partial |
G1 |
G1 checks a type per action and a matcher for the tool-matched events. Scope and failure behaviour are NOT checked, and hook-documentation.mjs says so in its own docblock. |
| sec 3.5 - A blocking hook (e.g., PreToolUse deny) MUST emit an actionable message. | 192 | gap |
- | Nothing reads a hook’s command for whether it emits an actionable message. |
| sec 3.5 - Hooks MUST be idempotent where the event can repeat. | 192 | gap |
- | Idempotence is a runtime property; no static check can observe it. |
| sec 3.6 - Rules: chain contracts are a conditional MUST - required if and only if chaining is used. | 197 | checked |
S4 |
S4 fires only when chaining is used. |
| sec 3.6 - Any component that invokes another MUST be listed in a chain contract; | 197 | checked |
S4 |
The orphan half of S4. |
| sec 3.6 - Tooling MUST flag invocations not covered by a contract (orphans) and contract entries pointing at missing components (phantoms). | 197 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 3.7 - These keys live under metadata and are not read at the top level. A key named above, declared at the top level of a component’s frontmatter instead of inside the metadata map, MUST be reported (U16… | 205 | checked |
U16 |
The clause names U16 (metadata-placement). |
| sec 3.8 - What that description must ACHIEVE differs by component type, and Section 8.1 is not universal: a SKILL is selected by a model matching its description against a request, so a skill description MUS… | 209 | checked |
U5 |
U5 applies the sec 8.1 bar to skills only (ADR 0049), which is what this clause asks. |
| sec 3.8 - Rules: frontmatter MUST be valid YAML; required keys MUST be present; | 214 | checked |
U3 |
U3 parses the YAML and requires name and description. |
| sec 3.8 - description MUST be non-empty, and a SKILL’s description MUST additionally satisfy the discoverability bar (8.1). | 214 | checked |
U3, U5 |
U3 requires a non-empty description; U5 applies the sec 8.1 bar to a skill. |
| sec 3.9 - Multi-target plugins MUST emit the mcpServers pointer for each declared target. | 220 | checked |
S6 |
per-target-presence.mjs requires "mcpServers": "./.mcp.json" in each declared target’s native manifest when the plugin ships .mcp.json. |
| sec 3.9 - Validation rules: the server entry MUST be present and well-formed; secrets MUST NOT be committed (use env indirection, Section 9); | 221 | checked |
U11 |
U11 (mcp-valid) validates server shape and refuses an inline secret. |
| sec 3.10 - Validation rules: REQUIRED at the repository root at every tier; internal links MUST resolve; | 229 | ruled |
U2 |
U2 covers the presence half (AGENTS.md at the root). ADR 0059 rules the link half a CHECK: ‘sec 3.10 AGENTS.md links resolve - Check - extend U2’. NOT YET APPLIED: no check resolves AGENTS.md’s internal links today. |
| sec 3.10 - its component/count references MUST stay in sync with the manifest and on-disk components (drift is an error, Section 10.3). | 229 | ruled |
- | ADR 0059: ‘sec 3.10 AGENTS.md counts agree - Demote to SHOULD - Link resolution is objective; a count agreeing with prose is a formatting convention, and enforcing it would fire on legitimate phrasing.’ NOT YET APPLIED: the clause below still reads MUST. |
| sec 4.1 - All checks MUST be implemented as portable scripts (single runtime) runnable locally, in any CI, or invoked by a skill. | 237 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 4.1 - A validator/generator has no need for bleeding-edge APIs, but the baseline MUST NOT recommend an end-of-life runtime: Node 20 reached EOL on 2026-04-30 and is below the >=22.12.0 floor that Astro 6… | 237 | gap |
- | A clause about this Standard’s own runtime baseline, not about a graded plugin; nothing verifies it. |
| sec 4.1 - A CI configuration (e.g., GitHub Actions) MUST only shell out to those scripts; | 237 | gap |
- | G2 checks that a workflow INVOKES the gate. Nothing checks that the CI configuration carries no validation logic of its own. |
| sec 4.1 - the plugin MUST NOT depend on a specific CI provider for correctness. | 237 | gap |
- | No check tests a plugin against a second CI provider. |
| sec 4.3 - Versioning MUST be semver. | 245 | checked |
U1, U9 |
U1 requires library.json version to be a semver string; U9 requires package.json to agree with it. |
| sec 4.4 - Every check MUST produce identical results run locally or in CI. | 248 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 4.4 - The CI configuration MUST contain no validation logic of its own; it MUST only invoke the portable scripts. | 248 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 4.5 - Checks MUST emit machine-readable results with a severity of error or warn. | 251 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 4.5 - The aggregate gate MUST fail on any error and MUST NOT fail on warn alone (warnings are surfaced, not blocking). | 251 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 5 - Every conformant plugin, at any tier, MUST carry a library.json with at least name, version, and tier - this is the artifact that makes a directory a plugin (a release unit with a version), per Sec… | 257 | checked |
U1 |
U1 (library-json) requires the file and its required fields at every tier. |
| sec 5 - At Convergent tier and above the manifest MUST additionally declare: | 259 | list-stem |
- | Introduces the bullets that carry the requirement; each bullet has its own row. |
| sec 5 - (The filename follows the package.json precedent: a manifest is named for what it describes - the plugin’s library-conformance metadata - not for an artifact it creates.) The agent-native manifests… | 262 | partial |
U8 |
‘The agent-native manifests MUST be generated from library.json.’ U8 compares the name and version of the two native manifests against library.json and nothing else: a description, license, keyword or component-pointer divergence passes, and manifest.generated.json is read by no SPINE check at all. Both reproduced 2026-09-18, and the manifest half again 2026-09-19. Nothing about a graded plugin changed on 2026-09-19: this repository added a HOUSE guard over its own copy of that file, which carries no reqId and grades nobody else’s plugin. |
| sec 5 - All manifests MUST be consistent with what is actually present on disk and with each other (tooling enforces this). | 262 | partial |
U8, S3, S8 |
S3 and S8 mirror the components index against disk in both directions. U8 covers only name and version of the native manifests. ‘All manifests’ therefore excludes manifest.generated.json, which no SPINE check reads. |
| sec 5.1 - | tier | “universal” \| “convergent” \| “advanced” | REQUIRED | The declared target tier; tooling verifies the tier actually satisfied (Section 2.4) and MUST flag a claim above what is met. | | 271 | table-header |
- | A table header or schema cell, not a requirement clause. |
| sec 5.1 - library.json MUST NOT contain a marketplace listing (Section 12). | 291 | gap |
- | library-json.mjs does not look for a marketplace listing inside library.json (zero matches for ‘marketplace’ in the module). Sec 12’s self-listing prohibition is a different clause and is also a gap. |
| sec 5.1 - Tooling MUST validate library.json against this schema, and MUST flag any component entry whose path, version, or status disagrees with the component on disk. | 291 | ruled |
U1, S3, S8 |
U1 validates library.json against the schema. The path/version-agree-with-disk half is NOT written: S3 matches components entries against disk BY NAME ONLY, and S8 mirrors status and tier against frontmatter, so declaring a skill at version 99.99.99 whose SKILL.md says 0.1.0 passes the whole gate (reproduced 2026-09-18). ADR 0059: ‘Check - extend S3 / S8 - the lowest-cost of the three: components-index and components-mirror already walk both sides, and S3’s own docblock already claims this. The check was described and never written.’ NOT YET APPLIED. |
| sec 6 - Every Universal-tier skill is, by definition, an agentskills.io-compliant skill and MUST pass skills-ref-equivalent validation. | 298 | house |
- | Not in the portable spine. scripts/check-parity.mjs runs the reference validator (agentskills validate) over every skills/* directory in this repository’s CI validator-parity job (ADR 0042), and gates on an undocumented disagreement. |
| sec 6 - Where agentskills.io evolves, the Universal tier MUST track it; higher tiers remain this Standard’s domain. | 300 | house |
- | A maintenance obligation on this Standard, not a plugin property. scripts/standards-watch.mjs is the tracking instrument. |
| sec 7.1 - Each item MUST record: proposed name, component type, target tier, agent-targets, rationale, and status. | 310 | gap |
- | No check reads docs/internal/backlog/new-components.md for the required fields. |
| sec 7.1 - Each item MUST reference the target component and describe the change. | 311 | gap |
- | No check reads docs/internal/backlog/enhancements.md for a target component. |
| sec 7.1 - A new-component proposal SHOULD pass a “why gate” before entering the backlog: it MUST justify why it is warranted and confirm it does not duplicate an existing component. | 313 | gap |
- | The why-gate is a skill’s workflow (askit-backlog), not a graded requirement. |
| sec 7.2 - The count is a SHOULD, not a MUST - a trivial skill is not blocked from conformance over example count - but any sample that IS present MUST remain consistent with the current skill behavior and MU… | 316 | ruled |
- | ADR 0059: ‘sec 7.2 a drifted sample is an error - Stated, unchecked - There is no sample reader. Marking it unchecked is honest; writing a reader to satisfy a clause nobody has asked for is not warranted by any observed defect.’ NOT YET APPLIED: the clause carries no unchecked marker. |
| sec 7.3 - Each component MUST carry its current version (semver) in frontmatter (metadata.version) at every tier, and SHOULD maintain dated change notes in a co-located history file (HISTORY.md beside the co… | 319 | gap |
- | Two halves, and NEITHER is checked. The metadata.version half: NO check requires a component to carry a version at all. S3 matches index entries against disk by name only (reproduced 2026-09-18); U16 reports a version key declared at the top level instead of under metadata but never requires its presence; U9 compares package.json against library.json, not any component. That is the whole result of an exhaustive grep for version handling across scripts/checks/. The HISTORY.md half is ADR 0059’s first ruling: ‘sec 7.3 HISTORY.md at Silver+ - Demote to SHOULD - The requirement was aspirational when written and no adopter has met it, this repository included.’ APPLIED at Standard 0.17 (E67): the history half now reads SHOULD. The row is a gap rather than ruled because what still reads MUST on this line is the metadata.version half, which no check enforces and no ADR has ruled. |
| sec 7.4 - Components and the plugin MUST use semver. | 322 | checked |
U1, U9 |
The same enforcement as sec 4.3. |
| sec 7.4 - Propagation (deterministic, MUST). The plugin’s version bump for a release MUST equal the largest component bump since the last release, mapped one-to-one: | 324 | ruled |
- | ADR 0059: ‘sec 7.4 version propagation is verifiable - Stated, unchecked - release-ready covers it for this repository, but that is a maintainer-only aggregate and not part of the graded spine, so a third-party plugin gets no such check. The clause stands; the gap is named.’ NOT YET APPLIED. |
| sec 7.4 - This is a MUST, not a SHOULD, so tooling can compute the correct plugin version from component histories and verify the release version rather than merely suggesting it. | 329 | ruled |
- | The rationale sentence for the propagation clause above, and it carries the same ADR 0059 ruling: stated, unchecked. |
| sec 7.5 - Deprecated components MUST still validate and function until removed. | 332 | gap |
- | Every check grades a deprecated component exactly as an active one, so the clause holds by construction: grepping scripts/checks/ for ‘deprecated’ outside deprecation.mjs finds only a components-mirror comment about status mirroring and metadata-placement’s key list, and no early return that skips one (2026-09-18). Nothing tests it AS a requirement, and nothing would notice a check that started exempting them. |
| sec 7.5 - Removal MUST be a plugin MAJOR and MUST be announced in the CHANGELOG. | 332 | partial |
G6 |
G6 requires a deprecated entry to declare remove-in. Nothing checks that the removal lands in a MAJOR, or that it reaches the CHANGELOG. |
| sec 7.7 - Burndown (warn-then-error, MUST for tightenings). A newly introduced or tightened tier requirement SHOULD ship as a warn for the one Standard MINOR that introduces it, then become a gate-failing er… | 342 | house |
- | A requirement on how this Standard grows. scripts/lib/standard-ceiling.mjs implements the warn-first ceiling and tests/unit/standard-ceiling.test.mjs covers it; no reqId can enforce it against a plugin. |
| sec 7.7 - Pinned-version grading (MUST). Every check declares the Standard version it was introduced at (its since). | 344 | house |
- | tests/unit/registry-sync.test.mjs asserts every registered check declares a non-empty meta.since (test R-SINCE-1), so a check that forgets it fails CI. |
| sec 7.7 - Tooling MUST read library.json.standard and grade a plugin against the requirement set of the version it pins: a requirement introduced AFTER the pinned version is reported as a warn (surfaced, nev… | 344 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 7.7 - Tightenings are pin-driven too, and the ceiling is ONE mechanism (MUST). A requirement that already existed but is being made stricter - a warn promoted to error, or a rule newly reading a shape it… | 346 | house |
- | One mechanism, scripts/lib/standard-ceiling.mjs, with its own test file. |
| sec 7.7 - A tightened SUBRULE needs its own migration (MUST). A rule added under an existing requirement inherits that requirement’s since, which describes when the CHECK appeared and says nothing about when… | 348 | house |
- | Carried per finding by the migration metadata (ADR 0044) rather than by a check; the subrule caps live in the check modules themselves. |
| sec 7.7 - Consumer configuration cannot outrank the pin (MUST). The ceiling is applied AFTER a consumer’s profile, per-rule overrides and suppressions resolve, so a local override cannot raise a finding abov… | 350 | house |
- | scripts/lib/resolve-config.mjs applies the ceiling after a consumer’s profile, overrides and suppressions resolve. |
| sec 7.7 - A grader MUST report why, rather than letting the override appear silently ignored. | 350 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 7.7 - A PUBLISHED conformance verdict MUST NOT let the graded SUBJECT weaken an objective or vendor-cited finding to dodge it. | 356 | house |
- | The published-verdict clamp in scripts/lib/resolve-config.mjs; surfaced to the reader as clampNotice / trustNotice. |
| sec 8.1 - A description MUST state what the component does AND when to use it, and SHOULD include specific trigger keywords. | 363 | checked |
U5 |
U5 is the scorer for this rubric. |
| sec 8.1 - Anti-patterns (e.g., “Helps with X”) MUST be avoided. | 363 | partial |
U5 |
U5 scores the description, and the clause’s own example was measured rather than assumed: a skill whose description is exactly ‘Helps with X’ scores 0.00 against the 0.7 bar (node scripts/check.mjs on a probe plugin, 2026-09-18). But no rule NAMES the anti-pattern, the finding is a warn rather than an error, and a description can hold the phrase and still clear the bar. |
| sec 8.1 - The scorer reads English and DECLINES rather than fails outside it. Tooling implementing this rubric MUST NOT report a description as failing the bar when it cannot read the description’s language:… | 367 | house |
- | A requirement on the scorer, satisfied by description-score.mjs’s DECLINE path (ADR 0049). |
| sec 8.2 - Names MUST be unique within the plugin. | 378 | ruled |
- | ADR 0059: ‘sec 8.2 name collisions - Check - a new cross-type uniqueness check. The one genuinely new check of the seven. A skill and a command sharing a name is by design; two skills sharing one is a collision.’ NOT YET APPLIED: no such check exists, and the spine is still 35. |
| sec 8.2 - Tooling MUST flag collisions and SHOULD flag taxonomy drift. | 378 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 8.3 - Advanced: MUST provide regression coverage for chains and hooks (does changing one component break another?). | 385 | partial |
G3 |
G3 verifies that an eval set under evals/ declares each chain edge and each hook event, plus the stale-edge signal. Nothing EXECUTES a case, in this repository or in a graded plugin, so the sec 2.6 G3 clause’s ‘CI executes them’ half is unchecked. Open question HC-07 (G3’s clause promises CI execution the check never looks for), unruled: whether the clause weakens or the check strengthens is the maintainer’s call. |
| sec 8.4 - Every published documentation page under docs/ (excluding docs/internal/, which is committed maintainer governance and never published) MUST carry a YAML frontmatter block with: title (non-empty st… | 390 | checked |
G7 |
G7 (docs-frontmatter) enforces the taxonomy on every docs/** page outside docs/internal/. |
| sec 9 - A component MUST request the narrowest tool set it needs. | 394 | gap |
- | No check reads a component’s tool set. |
| sec 9 - Subagents and hooks MUST document why each granted capability is required. | 394 | gap |
- | No check reads a capability rationale. |
| sec 9 - A hook that can block (e.g., a PreToolUse deny) MUST fail safe and MUST emit an actionable message. | 395 | gap |
- | The same gap as sec 3.5 #2; nothing reads a hook’s behaviour. |
| sec 9 - Secrets MUST NOT appear in frontmatter, samples, or committed files; hooks needing credentials MUST use environment indirection. | 397 | partial |
U11 |
U11 refuses an inline secret in .mcp.json. Nothing scans frontmatter, samples or any other committed file, which the 2026-09-04 audit recorded as F-023. |
| sec 10.3 - Every level of the plugin has an agent view and a human view, and structured facts MUST live in exactly one canonical place; | 450 | partial |
G4, S3, S8 |
G4 keeps INDEX.md generated rather than authored, and S3/S8 keep the components index equal to disk. Nothing tests the ‘exactly one canonical place’ rule in general. |
| sec 10.3 - Tooling MUST flag drift (e.g., an INDEX.md entry whose description no longer matches the skill’s frontmatter). | 457 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |
| sec 10.4 - ADRs are internal-audience but MUST be committed. | 460 | partial |
G10 |
G10 requires every ADR under docs/internal/decisions/ to carry a ## TL;DR, which presupposes it is committed. Nothing checks that an uncommitted ADR exists to be found. |
| sec 10.4 - Gitignored, ephemeral working scratch: design drafts, session logs, agent-context material live in a gitignored LOCAL/ directory (the portfolio convention) and MUST NOT pollute the entry surface. | 463 | gap |
- | No check verifies that scratch material is gitignored. |
| sec 10.6 - They are distinct artifacts and MUST NOT be conflated. | 470 | checked |
G5 |
G5 reports a RELEASE-NOTES.md that is byte-identical to CHANGELOG.md. |
| sec 12 - A plugin MUST NOT embed a marketplace that lists itself. | 494 | gap |
- | U17 checks the SHAPE of a marketplace.json. Nothing checks whether its entries list the plugin that ships it: a case-insensitive grep of scripts/ for self-list, ‘lists itself’ and ‘embed a marketplace’ returns no hit outside this generator’s own notes (2026-09-18). ADR 0051 rules that a catalogue-level finding is never a numbered requirement on an individual plugin, which is why this is stated rather than graded, but no ADR has ruled this clause itself. |
| sec 12 - One manifest, one kind. A .claude-plugin/marketplace.json that is present MUST be readable: it MUST parse, it MUST carry a plugins array, and its entries MUST NOT mix kinds - either every entry’s s… | 495 | checked |
U17 |
U17 (catalogue-manifest-shape) covers all four: readable, parses, carries a plugins array, and does not mix kinds. |
| sec 12 - The separation rule applies to BOTH formats: a plugin MUST NOT embed a marketplace that lists itself, regardless of which agent’s marketplace format is used. | 518 | gap |
- | The same gap as sec 12 #1, restated for the Codex format. |
| sec 12 - Tooling MUST warn when it detects a plugin embedding a self-listing marketplace, and SHOULD offer a decoupling path. | 520 | grader-facing |
- | The subject is the tooling, not a graded plugin. The conformance spine grades plugins, so no reqId can enforce it; this repository’s own implementation is what satisfies it. |