Skip to content

fix(ea1): reject footnote-legend '*', bound pre-colon gap, detect YAML block-list and JSON wildcard grants - #447

Open
yashrajp22 wants to merge 2 commits into
mainfrom
yashrajp22/ea1-wildcard-remaining-gaps
Open

fix(ea1): reject footnote-legend '*', bound pre-colon gap, detect YAML block-list and JSON wildcard grants#447
yashrajp22 wants to merge 2 commits into
mainfrom
yashrajp22/ea1-wildcard-remaining-gaps

Conversation

@yashrajp22

Copy link
Copy Markdown
Collaborator

Summary

Follow-up to #405 / #417 (and duplicate #438). #417 correctly bounded the EA1 wildcard-grant regex to a single line and a standalone *, but an execution-verified edge-case audit of the merged pattern found two remaining false-positive paths and three detection gaps. This PR fixes all five.

Fixes #444. Fixes #445. (Systemic paragraph-crossing across all 15 pattern files is tracked separately in #446 — out of scope here.)

Cases and how each is solved

False positives removed (#444)

Case 1 — footnote/legend text after a Tools: label.

Tools: * = requires authentication
Tools: * marks optional parameters

The (?!\*|\w) lookahead rejects ** and *word, but a standalone * followed by a space passed — both lines fired EA1/MEDIUM on benign docs.
Solution: a bare (unquoted) * now only counts when it ends the line, optionally closed by ] and/or a # comment. A real bare-scalar grant (tools: *, tools: [*], tools: * # allow all) has nothing else after the value; a footnote legend always does. Quoted forms ("*", '*') are unambiguous and keep matching anywhere on the line.

Case 2 — blank-line gap before the colon.

several tools

: * item

#417 bounded the whitespace after the colon, but \s*: before it still crossed newlines, so a markdown definition-list line two paragraphs later still bridged (matched text tools\n\n: * ).
Solution: [ \t]*: — the key and colon must share a line. No real YAML/JSON/TOML syntax breaks a line between key and colon.

Detection gaps closed (#445)

Case 3 — JSON quoted keys never matched.

"tools": ["*"]
"permissions": "*"

The old prefix required the colon directly after the key word, so the closing quote of a JSON key broke the match — despite JSON being the most common encoding for MCP/agent configs.
Solution: the key may be wrapped in optional quotes: ['\"]?(?:tools?|permissions?)['\"]?.

Case 4 — the idiomatic YAML block-list form never matched.

tools:
  - "*"

The block-sequence dash was never part of the pattern.
Solution: a second pattern matches a key followed by exactly one newline and a first list item that is a standalone wildcard. A blank line still breaks the match (the #405 cross-heading bridge cannot return), and the standalone-* lookahead keeps markdown lists (- **Read**, - *note*) out. Later items are intentionally out of scope until seen in practice — matching arbitrary positions across lines widens the false-positive surface.

Case 5 — wildcard not in first position of an inline list.

tools: ["search", "*"]

The old pattern required * immediately after [.
Solution: a quoted * anywhere inside same-line brackets now matches (\[[^\]\r\n]*['\"]\*['\"]). Quoted-only on purpose: markdown link/bold text inside [...] cannot satisfy it, and an unquoted * mid-list in YAML is an alias, not a wildcard.

Validation

Risk

  • Confidence stays 0.85 for both patterns; severity mapping unchanged.
  • Known accepted non-detections (unchanged from current main): multi-line flow lists (tools: [\n "*"\n]) and wildcards in later block-list items.

…ck-list and JSON wildcard grants

Fixes #444. Fixes #445. Follow-up to #405/#417.

Remaining false positives (#444):
- A bare '*' now counts only when it ends the line (optionally ']' and/or
  a '#' comment), so footnote legends like 'Tools: * = requires auth' no
  longer fire. Quoted '*' stays unambiguous anywhere on the line.
- The gap before the colon is bounded to the same line ([ \t]*:), so a
  blank line followed by a markdown definition-list ': *' can no longer
  bridge paragraphs.

Detection gaps (#445):
- The key may be quoted, catching JSON forms: "tools": ["*"] and
  "permissions": "*".
- New block-list branch catches the idiomatic YAML form (tools: newline
  '- "*"'), bounded to a single newline with a standalone-star item so
  markdown lists of bold/italic names cannot collide.
- A quoted '*' anywhere in a same-line bracket list now matches
  (tools: ["search", "*"]).

Validated against a 46-case matrix (20 genuine grant forms, 11 new
detections, 15 false-positive classes); full suite 2963 passed, ruff
check/format clean.
@yashrajp22
yashrajp22 requested a review from rng1995 August 27, 2026 11:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant