Silver (Convergent) conformance checks
Reference: Silver (Convergent) conformance checks
Section titled “Reference: Silver (Convergent) conformance checks”Seven checks (S1-S7) earn Silver tier. Each fires findings tagged reqId: "S<n>"; tier-report buckets them into the convergent tier and lists unmet ones in blocked.convergent.
| reqId | Module | What it checks | Standard | Conditional? | Example fix |
|---|---|---|---|---|---|
| S1 | scripts/checks/agent-targets.mjs |
library.json.agent-targets is a non-empty array of claude/codex |
sec 5.1, sec 2.2 | no | Add "agent-targets": ["claude", "codex"] to library.json. |
| S2 | scripts/checks/prefix.mjs |
library.json.prefix is lowercase kebab-case ending in - |
sec 8.2 | no | Add "prefix": "<short>-" to library.json (e.g. "askit-"). |
| S3 | scripts/checks/components-index.mjs |
The library.json.components index and disk list the same skills, subagents, commands and workflows, matched by name in both directions. An entry’s path, version and status are NOT compared against the component on disk (status and tier agreement with frontmatter is S8’s; path/version agreement is unwritten, ADR 0059) |
sec 5.1, sec 10.3 | no | Ensure library.json.components.skills lists each on-disk skill and library.json.components.subagents lists each on-disk subagent, each with {name, path, version, tier, status}. An undeclared component or a dangling declaration both fail S3. |
| S4 | scripts/checks/chain-contract.mjs |
agents/_chain-permitted.yaml has no orphan or phantom entries; contract is present when chaining is in use |
sec 3.6 | yes (chaining-in-use) | Orphan: a frontmatter chain: invocation not listed under the caller in the contract - add the <caller>: [<callee>] entry. Phantom: a contract entry naming a caller or callee that matches no on-disk component - remove the stale entry or create the missing component. |
| S5 | scripts/checks/workflow-skills.mjs |
Workflows reference only on-disk skills | sec 3.4 | yes (workflows exist) | Fix the workflow’s steps: list to reference an existing skill name. |
| S6 | scripts/checks/per-target-presence.mjs |
Each agent-targets entry has its native manifest on disk (.claude-plugin/plugin.json / .codex-plugin/plugin.json), and - when the plugin ships .mcp.json - each of those manifests carries "mcpServers": "./.mcp.json". No other convergent component is checked for per-target emission |
sec 5.1, sec 10.1 | yes (agent-targets declared) | Run npx agent-skills-toolkit gen-manifest . --write --target=all to generate the missing native manifest. |
| S7 | scripts/checks/command-contract.mjs |
Every commands/<name>.md declares a non-empty description and a maps-to that resolves to exactly one on-disk skill or workflow |
sec 3.2, sec 8.1 | yes (commands exist) | Missing description: add a non-empty description to the frontmatter. Missing maps-to: add the key naming the backing skill or workflow. Unresolved maps-to: correct the name or create the missing component. |
Subagents are Claude-only for plugin distribution (Standard sec 3.3). Codex v0.135
plugins cannot ship subagents (plugin.json has no agents field;
[agents.*] is a user-level config.toml concern). A subagent declares
agent-targets: [claude] in its frontmatter. For S3, a subagent’s presence on disk
as agents/<name>.md is what matters - there is no Codex artifact to cross-check.
The S6 dual-target component-level check does not apply to subagents in this phase;
S6 remains a plugin-manifest-level check.
Findings cite their Standard section in the message, so an agent reading a report can navigate to the rule. Convergent errors do NOT fail the gate at the Universal tier - they appear in blocked.convergent until the plugin declares convergent and addresses them.