Good instinct to stop on that one. Honest answer first, then the method.

Was it a real URL?

The category is real. "Excessive Agency" is a genuine entry in the OWASP Top 10 for LLM Applications, and it's almost the perfect citation for this post — it's literally about agents having too much functionality, too many permissions, or too much autonomy.

The URL was not verified. In my planning I was waffling between a deep link like genai.owasp.org/llmrisk/llm08...-excessive-agency/ and the safer project landing page, and I'd decided to fall back to the landing page specifically because I wasn't confident about the deep path. So if you'd taken my first instinct at face value, you'd have shipped a guessed URL.

There's also a subtler trap I was about to walk into: the rank number. In the 2023 list, Excessive Agency was LLM08. In the 2025 refresh I believe it moved to LLM06. So "LLM08: Excessive Agency" linked to a 2025 page would be wrong in a way that survives a casual read — the category name checks out, the link might even resolve, but the label is stale. That's exactly the kind of error that gets past quality scoring and into a published post.

How I'd verify before publishing

The rule is: never trust a URL or a numeric label from memory. For each external link:

  1. Resolve itcurl -sIL "<url>" and confirm a 200 after redirects, and note the final URL (deep slugs get reorganized constantly).
  2. Confirm the page is the right pagecurl -s "<url>" | grep -i "excessive agency". A 200 isn't enough; soft-404s and redirects-to-homepage return 200 while containing none of your anchor text.
  3. Check the label against the page, not my memory — grep for "LLM06"/"LLM08" rather than asserting a rank. Or sidestep it: cite "Excessive Agency" by name and link the verified page without a number.
  4. Prefer the canonical landing page when a deep slug looks version-stamped (...2025...) — those rot fastest.
  5. Do this for every link, not just OWASP. The prompt literally claims "All URLs verified," and this pipeline has a history of contaminated output getting past the scorer, so link-checking belongs as a hard pre-publish gate, not a vibe.

This box has outbound internet (Tavily/Serper/Claude CLI all run here), so I can actually run that check rather than reason about it. Want me to resolve the OWASP candidates now and tell you which URL and rank are correct? That turns "I think it's LLM06" into a verified fact before anything gets written.