Summary
The EA1 wildcard-tool-access pattern only matches when the * value sits inline after the key on the same starting position. The two most idiomatic real-world encodings of exactly this grant have never matched — in the pre-#417 pattern or the current one:
Case 1: YAML block list
The block-sequence dash is not part of the pattern, so the value branch fails at -. This is the idiomatic frontmatter form for agent/skill manifests (e.g. allowed-tools: style lists).
Case 2: JSON quoted key
The pattern's key prefix (?:tools?|permissions?)\s*: requires the colon immediately after the key word, so the closing quote of a JSON key breaks the match. MCP server configs and agent manifests are JSON — the quoted-key form is arguably the most common encoding of a wildcard tool grant.
Also related: an inline list where the wildcard is not the first element is missed today:
(the pattern requires the * right after the opening bracket).
Proposed fix
Scope note: the block-list branch intentionally matches only the first item. A wildcard buried later in a multi-item block list stays out of scope until there's evidence it occurs in practice — matching arbitrary item positions across lines widens the false-positive surface for markdown lists.
Summary
The EA1 wildcard-tool-access pattern only matches when the
*value sits inline after the key on the same starting position. The two most idiomatic real-world encodings of exactly this grant have never matched — in the pre-#417 pattern or the current one:Case 1: YAML block list
The block-sequence dash is not part of the pattern, so the value branch fails at
-. This is the idiomatic frontmatter form for agent/skill manifests (e.g.allowed-tools:style lists).Case 2: JSON quoted key
The pattern's key prefix
(?:tools?|permissions?)\s*:requires the colon immediately after the key word, so the closing quote of a JSON key breaks the match. MCP server configs and agent manifests are JSON — the quoted-key form is arguably the most common encoding of a wildcard tool grant.Also related: an inline list where the wildcard is not the first element is missed today:
(the pattern requires the
*right after the opening bracket).Proposed fix
['\"]?(?:tools?|permissions?)['\"]?.:[ \t]*\r?\n[ \t]*-[ \t]+['\"]?\*...) so EA1 wildcard-tool-access pattern crosses blank lines and matches markdown bold syntax Affected rule: EA1 "Unrestricted Tool Access" Affected file: src/skillspector/nodes/analyzers/static_patterns_excessive_agency.py, line 45 #405's cross-heading bridge cannot come back — a blank line still breaks the match, and the standalone-*lookahead still rejects markdown bold/italic in the item.*anywhere inside the same-line brackets (\[[^\]\r\n]*['\"]\*['\"]). Quoted-only, so markdown link/bold text inside square brackets cannot satisfy it.Scope note: the block-list branch intentionally matches only the first item. A wildcard buried later in a multi-item block list stays out of scope until there's evidence it occurs in practice — matching arbitrary item positions across lines widens the false-positive surface for markdown lists.