Removed
- Five
AS-*rules with no normative origin (part of #957). A full re-audit of everyAS-*rule against the current agentskills.io spec and itsskills-refreference validator (and, for the platform ones, current Claude Code docs) found five rules with no basis in any spec or vendor doc - they were agnix heuristics producing false positives. Removed: AS-007 (reserved names - no reserved-name list in spec/validator/Claude docs), AS-010 ("Use when" literal trigger phrase - spec endorses the intent but never the literal phrase), AS-014 (backslash/Windows path separator - spec is silent on separators), AS-018 (first/second person in description - spec is silent, andoptimizing-descriptionsactually recommends second-person imperative "Use this skill when…"), and AS-019 (vague skill name - spec defines name format only). Rule count 425 → 420.
Changed
- AS-013 corrected to a SHOULD-level warning (part of #957). The re-audit found AS-013 (file references one level deep) is in the agentskills.io spec but as a SHOULD ("Keep file references one level deep"), not a MUST. Its
normative_leveland severity were wrong (MUST/HIGH/error) - corrected to SHOULD/MEDIUM/warning, and the source fixed fromplatform.claude.comtoagentskills.io/specification.
Added
- agentskills.io spec is now tracked by the release watcher (part of #957). agentskills.io (the source of the
AS-*rules) publishes no GitHub releases or tags, so a newcommit_repo+commit_pathsource type inscripts/check-tool-releases.shwatches the latest commit SHA touchingdocs/specification.mdxinagentskills/agentskills. Any spec change opens a per-tool issue to diff the spec against theAS-*rules - complementing the weeklyspec-drift.ymlcheck. Baselined at the current spec commit. - CDX-REQ-000 / CDX-REQ-001: Codex managed
requirements.tomlvalidation (closes #965). NewFileType::CodexRequirementsdetects Codex's admin-written managedrequirements.toml(system location:/etc/codex/requirements.tomlon Unix,%ProgramData%\OpenAI\Codex\requirements.tomlon Windows; the project.codex/directory is deliberately not matched, since Codex never readsrequirements.tomlfrom there).CodexRequirementsValidatoraddsCDX-REQ-000(HIGH, invalid TOML syntax) andCDX-REQ-001(MEDIUM, unknown top-level key checked against the 19 documentedConfigRequirementsTomlkeys). Upstream has nodeny_unknown_fields, so a typo'd managed constraint is silently ignored by Codex and never enforced -CDX-REQ-001is the only catch. MVP is parse + unknown-key; cross-field invariants are tracked as a follow-up. Covered by 9 unit tests plus detection tests. - Rule count: 423 -> 425 across all derived locations via
scripts/sync-rule-bookkeeping.js(rules.json,crates/agnix-rules/rules.jsonmirror,CLAUDE.md/AGENTS.md,README/docscounts,plugin/skillmetadata, generated website rule pages). Validator count 42 -> 43.
Changed
- Tool baseline:
codexbumpedrust-v0.130.0->rust-v0.133.0(closes #959). Diffed upstreamcodex-rs/core/config.schema.jsonbetweenrust-v0.129.0andrust-v0.133.0and extended the config-key allow-lists soCDX-004/CDX-CFG-026do not false-positive on validv0.133configs. Added (additive only - removed upstream keys are kept for older-version tolerance): top-levelapps_mcp_product_sku,include_collaboration_mode_instructions,model_auto_compact_token_limit_scope, and the opaque[desktop]table;[features]mentions_v2/network_proxy/plugin_sharing;[mcp_servers.*]oauth;[permissions.network]mitm. New hook events (SubagentStart/SubagentStop, compactSessionStart) were already recognized byschemas/hooks.rs; theFileSystemAccessModedeny-canonical change (openai/codex#23493) and per-profile permission keys have no agnix enum to update. New[tui]keys (pet/pet_anchor) were intentionally not added - TUI display tweaks are on the codex irrelevant list. Regression-tested intest_codex_0_133_0_*. - Tool baselines: triaged the auto-opened release-watch issues as agnix-irrelevant and bumped
cursor3.4.17->3.5.33(closes #960) andopencodev1.15.0->v1.15.10(closes #961). Cursor's tracked source exposes only a version marker; OpenCode's sole change was a desktop-app bugfix. No validator, rule,ToolVersions, orSpecRevisionsupdate required..github/tool-release-baselines.jsonandknowledge-base/RESEARCH-TRACKING.mdupdated.
Fixed
- Claude/platform-specific
AS-*rules scoped correctly, and AS-012 re-sourced (part of #957). An audit of everyAS-*rule against the current agentskills.io spec found four that citedplatform.claude.comrather than the generic spec: AS-007 (reserved names), AS-010 ("Use when" trigger phrase), and AS-015 (8 MB upload limit) are genuinely Claude/platform-specific (absent from the agentskills.io spec and its reference validator), so they now fire only for Claude Code (and unscoped) skills and are suppressed for known non-Claude clients. AS-012 (500-lineSKILL.mdbody) is the opposite case - it is in the agentskills.io spec ("Keep your mainSKILL.mdunder 500 lines"), so its evidence was corrected fromplatform.claude.com/claude-code-only toagentskills.io/specificationand it remains a generic rule for all clients. - XML-001 no longer flags placeholders in skill/agent frontmatter (part of #957). The XML balance validator scanned the whole file, so
<name>/<X>-style placeholders in a skill's frontmatterdescription(or any frontmatter value) tripped XML-001 "Unclosed XML tag". The YAML frontmatter region is now masked before the balance check - it is structured metadata, not body XML. Body XML is still validated, with line/column offsets preserved. Applies to all frontmatter file types the validator runs on (Skill, Agent, Copilot, …). - The entire
CC-SK-*family is now scoped to Claude Code skills (part of #957). The Claude Code skill rules previously fired on everySKILL.mdregardless of owning tool, so a Codex/OpenCode/Cursor skill was judged against Claude's model values, tool vocabulary, and frontmatter fields. They now run for Claude Code skills and unscoped skills (no identifiable client) but are suppressed for skills owned by another known tool, which are covered by the genericAS-*rules and the per-client skill validator. - Claude-specific skill/agent rules corrected and scoped (part of #957).
- CC-SK-008 (unknown tool name): refreshed
KNOWN_TOOLSto the current Claude Code built-in set (addsPowerShell- the reported false positive - plusAgent,Cron*,Team*,EnterWorktree/ExitWorktree,ScheduleWakeup,ListMcpResourcesTool/ReadMcpResourceTool/WaitForMcpServers, etc.; legacy names kept). Now scoped with the CC-SK family (Claude Code and unscoped skills; suppressed for known non-Claude clients - see above) - other clients have their own tool vocabularies. - CC-SK-017 (unknown frontmatter field): added the documented
when_to_useandargumentsfields. Now scoped with the CC-SK family (Claude Code and unscoped skills; suppressed for known non-Claude clients - see above) (other clients' fields are checked by the per-client skill validator).aliasesremains correctly flagged - it is not a documented Claude skill field. - CC-AG-007 (agent parse error): sub-agent
tools/disallowedToolsnow accept a comma/space-separated string (the canonicaltools: Read, Glob, Grepform) as well as a YAML list, so the documented string form no longer surfaces as a parse error.
- CC-SK-008 (unknown tool name): refreshed
allowed-toolsas a YAML list no longer trips AS-016 (part of #957). Claude Code acceptsallowed-toolsas a space-separated string or a YAML list; agentskills.io documents a space-separated string. The skill frontmatter parser previously only accepted a string, so the list form failed to deserialize and surfaced as an AS-016 skill parse error. It now deserializes both shapes (a list is joined with spaces for downstream tool parsing). The list form is accepted for every client by design. It is a Claude-specific feature, and the tools that follow agentskills.io (Codex/OpenCode/Kiro) do not constrain the field's shape. Since an unscoped skill using a list is almost certainly a Claude skill, agnix does not warn on it - a warning would re-introduce a false positive with no client to safely attach it to.- Skill rules now scope by owning client, fixing Claude Code false positives (part of #957). Skills are attributed to a client via their path (
.claude/skills/,.agents/skills/, …) or the configuredtarget/tools, and two divergent rules are resolved per client: AS-008 description length is the agentskills.io baseline1024(matched by Codex/OpenCode/Kiro) but1536for Claude Code skills (Claude truncates at 1536); AS-009 (angle brackets in description) now fires only for Codex skills - itsquick_validate.pyrejects</>, but agentskills.io and Claude Code impose no such restriction, so AS-009 no longer false-positives on Claude/generic skills. Verified against agentskills.io, Codex, OpenCode, Kiro, and Claude Code specs. - Codex top-level allow-list drift between the TOML and JSON/YAML backends (closes #966). The Codex config top-level allow-list was maintained twice (
KNOWN_TOP_LEVEL_KEYS+KNOWN_TABLE_KEYSinschemas/codex.rsfor TOML;KNOWN_CONFIG_TOP_LEVEL_KEYSinrules/codex.rsfor JSON/YAML) and had diverged, so the same key was accepted by one backend and flagged by the other:debugandinclude_apply_patch_toolfalse-positived on JSON/YAML (CDX-CFG-006), whilejs_repl_node_path/js_repl_node_module_dirsfalse-positived on TOML (CDX-004). Both backends now consult a singleschemas::codex::is_known_top_level_keypredicate; the duplicate const was removed. Lenient union (102 keys), so strictly fewer false positives.