News & Media Coverage Search
Systematically search for external coverage of Yue Zhao / FORTIS Lab work across all outlet types: tech press, security press, business press, government/policy, industry analysts, science press, AI newsletters, and universities.
When to Use
- Periodic audit of media coverage (quarterly recommended)
- Before tenure/promotion materials
- Before grant applications requiring "broader impact" evidence
- After major paper acceptances or tool releases
- When updating the website news section
Inputs
Read these files before starting:
data/publications.json— all papers (titles, venues, years, links)data/open-source.json— all tools/libraries (names, stars, URLs)news-coverage-audit.md— previous audit results (skip known items, update stale entries)
Execution Model
If parallel workers and web search are available, run dimensions in parallel; otherwise process dimensions sequentially. Batch queries conservatively to stay within tool rate limits.
Before building any launcher, read references/fan-out-reliability.md and use scripts/dispatch_lanes.sh. A full round dispatches thirty to forty lanes. The 2026-08-30 round lost lanes four separate times, and the dispatcher reported success on every one. A CRLF in a unit list silently no-opped twelve lanes at exit 0. Editing a launcher mid-flight killed three supervising shells. setsid is absent from Git Bash, so a fire-and-forget rewrite launched nothing while printing success. Truncated stdout from a killed shell was then read as a complete record of what it had dispatched. The one rule that covers all four: an exit code is not evidence that work happened, a result file is. Reconcile every dispatched unit against a complete result before reporting a wave finished or integrating anything from it. Complete means present, non-empty, and not the FALLBACK header dispatch-task writes over a reaped worker. Non-empty alone reports a timed-out lane as a success.
Read these reference files before starting:
references/search-queries.md: query bank (not exhaustive; see triage rules below)references/outlet-registry.md: outlet classification andsite:domain listsreferences/search-strategy.md: techniques for finding indirect coverage, when to persist vs. stop, name disambiguation, Cloudflare/SSR-shell fetch tactics, and the Phase B "snippet alone is not verified" rulereferences/candidate-schema.md: Phase A and Phase B candidate record contractreferences/disclaimer-patterns.md: AI-generated, aggregator, translation, templated-database, and blocked-page detectionreferences/domain-registry.md: seed domains by source class andoutlet_classvalues for Phase Areferences/disambiguation-registry.md: cumulative tool-name and person-name collision rules + verified-negative leads from prior rounds (consult before counting any borderline match)scripts/pdf_term_scan.py: PyMuPDF-based FORTIS-term scanner with built-in false-positive filters; canonical Phase B PDF-deep-search tool. Run aspython skills/news-search/scripts/pdf_term_scan.py <pdf_path>.references/fan-out-reliability.md: the four ways a lane fan-out has silently lost work, and the checklist that prevents each. Required reading before building a launcher.scripts/dispatch_lanes.sh: hardened lane dispatcher implementing that checklist. It strips CR from unit ids, verifies each launch by polling forSTATE-DIR, usesnohuprather than the absentsetsid, and exits non-zero when any dispatched unit has no result. Run asbash skills/news-search/scripts/dispatch_lanes.sh --prompts <dir> --results <dir> --cap 4 <unit> ..., and re-check a detached wave later with--reconcile-only.Lanes go to Agy (Gemini through the Antigravity CLI) by default. Codex stays reachable behind
--backend codex, orNEWS_SEARCH_LANE_BACKEND=codex. Theprunskill reserves its higher-cost quota for the/vetgatekeeper role rather than for ordinary fan-out. Three things depend on which backend is chosen, and the first two were paid for by the 2026-08-30 round:- The FALLBACK header differs by backend:
worker wrote no result filefor Codex,Agy wrote no final resultfor Agy. The completeness test therefore matches the shape^# <unit> result (FALLBACK,rather than either literal. A literal match on one backend grades the other's failure as a success. - The wall-clock knob differs by backend,
CODEX_DISPATCH_TIMEOUTagainstANTIGRAVITY_DISPATCH_TIMEOUT_SECONDS. The script sets whichever the chosen backend reads. Checklist item 5 is only load-bearing while a lane can actually time out. Note that the wall clock is an Agy lane's only deadline: the Agy dispatcher runs no idle check and reads noPRUN_STALL_THRESHOLD, so that knob stays Codex-only. - Retrying an Agy lane needs a path move, not just a re-dispatch. The Agy dispatcher refuses any pre-existing result path, so an incomplete result is moved aside to
<state>/<unit>.previous-result.*before relaunch. The file is kept rather than deleted, because checklist item 10 requires reading a FALLBACK tail before spending tokens again.
An Agy lane gets the dispatcher's own scratch directory and never sees the checkout. Neither
--mode plannor the sandbox stops a headless write. The boundary is that the lane has no workspace and its prompt names no repository path, so the lane's inventory travels in the prompt body instead. An inheritedPRUN_SCRATCH_CWDis therefore unset rather than merely left unexported, since the dispatcher rejects a caller-supplied workspace that arrives without an explicit--mode.agy --versionandagy modelsrun as a preflight before any launch, each bounded bytimeout --kill-after=5satANTIGRAVITY_PREFLIGHT_TIMEOUT_SECONDS(default 60, validated as a positive integer to match the dispatcher, which rejects zero). The kill escalation is what makes the bound real: plaintimeoutsends TERM and keeps waiting, so a CLI that ignores TERM runs to completion regardless. An expired login or a hung CLI therefore fails the run immediately, rather than as a wave ofFAILED-STARTlines after the launch deadline. The diagnostic distinguishes 124 (expired), 137 (killed after ignoring TERM), and 125 through 127 (timeoutcould not run the command) from an ordinary failure, so an auth problem is not reported as a hang. Lane prompts must carry their own inventory. Because the worker never sees the checkout, a prompt that namesdata/publications.jsonorreferences/domain-registry.mdby relative path gives the worker nothing; inline the rows the lane needs, and runscripts/pdf_term_scan.pyon the coordinator side rather than asking a lane to call it.- The FALLBACK header differs by backend:
Run the two-phase pipeline described below. Phase A gathers candidates into news-search-candidates.jsonl and does not edit news-coverage-audit.md. Phase B verifies each candidate, classifies the survivors, records dropped candidates in the candidate file, and writes only kept rows to news-coverage-audit.md using the tier structure in the Output section. If news-coverage-audit.md does not yet exist, Phase B creates it with the full tier structure and negative-results table as a fresh audit.
Query Bank Triage Rules
The query bank in references/search-queries.md is curated, not exhaustive. It covers high-adoption tools and papers with known media hooks.
Full audit mode: search EVERY paper and tool. Read data/publications.json and data/open-source.json and generate at least one smart-keyword search (Dimension 5) for every single entry. Do not skip any paper or tool. Use distinctive claims or method names, not exact titles. This is critical because coverage can appear for any paper, not just high-profile ones (e.g., COPOD has a dedicated book chapter, GLIP-OOD has a tech blog feature, the computing resources paper influenced CVPR policy).
For items not in the query bank, generate queries at runtime:
- Tools with 500+ GitHub stars: add dedicated Dimension 2 queries
- All papers at top venues from the current or prior year: add Dimension 5 smart-keyword entries
- Older papers and low-star tools: still search with at least one Dimension 5 smart-keyword query each
- Preprints: search with distinctive claim keywords
Pipeline: Two-Phase Output
Each audit runs in two phases. Phase A discovers candidates without classifying them. Phase B reads each candidate, runs verification checks, and assigns a tier. Splitting the two lets the candidate list be reviewed before any classification work commits to a row in the audit ledger.
Phase A: Candidate Gathering
Run news-search dimensions D1-D8 plus D10 and emit candidates as JSON-Lines records to news-search-candidates.jsonl at the project root. Handle citation-affiliation evidence through the freshness-gated [[citation-audit]] hook (see "Cross-skill: citation-audit integration" below), not as a Phase A candidate dimension. Do not assign tiers yet. Do not write to news-coverage-audit.md yet.
Each candidate carries the schema in references/candidate-schema.md: URL, title, snippet, surfacing query, outlet class, fetch timestamp, plus empty placeholders for the Phase B fields (flags, direct-mention, tier, notes).
When Phase A completes, present the candidate count grouped by dimension and outlet class to the user. The user (or a reviewer such as Codex) can scan the candidate list and flag wrong query routing or wrong outlet-class tagging before Phase B starts. This is the cheap, parallelizable stage; treat it as re-runnable.
Add news-search-candidates.jsonl to .git/info/exclude (local, untracked) before the first run so git add -A does not stage scratch output.
Phase B: Verify and Classify
Run the ledger check before spending any fetch budget, and run it with
scripts/build_identity_index.py. Measured 2026-09-12: of the nine candidates a round selected for
verification on the strength of their apparent value, four turned out to be already-counted items
reached by a new URL, and a later sweep of the same round put the rate at 5 of 12 on one class.
Verification that checks a candidate against its source but never against the ledger cannot tell new
coverage from a new URL. The check is local and cheap, so it runs first, over every candidate.
python scripts/build_identity_index.py build --audit ../../news-coverage-audit.md \
--out scratch/<date>/identity-index.jsonl
python scripts/build_identity_index.py check --index scratch/<date>/identity-index.jsonl --stdin
Match on document identity, not on URL string. The script extracts every identifier a recorded
document carries: normalized URL, arXiv ID, DOI, language-stripped Google Patents number, OSTI
accession, ISBN, YouTube video ID, and podcast episode. One round lost to the same defect five times
in a day because the index held URL strings only; the write-up in references/fan-out-reliability.md
Failure 14 names all five.
A row that carries no identifier is invisible to the check, so every ledger row needs a URL or an identifier. Two book rows named their titles only, and the O'Reilly reader URLs for those same books read as new candidates until their ISBNs were backfilled.
status and tier_guess are independent fields. tier_guess names how authoritative the outlet
is; status names what was found there. A NIST publication read cover to cover that mentions nothing
is tier_guess: T0 with status: verified-negative. Reading only the tier caused a reader of the
2026-09-12 round to count eleven such documents as Tier 0 coverage, overstating new Tier 0 by a
factor of six. Report outcome from status, always.
Screen self-citations against the co-author list, not against the surname. One round excluded seven co-author works before candidacy and found three apparent per-work zeros were entirely explained by cross-citation inside the PI's own portfolio. Keep the frequent-co-author list to hand and check the citing paper's author block, because a co-author citing the work is not external coverage.
A blocked fetch is a fact about the route, not about the claim. Measured 2026-09-12: 21 of 29
items recorded as paywalled or blocked yielded to a free, legitimate alternate route. Before setting
status: paywall_or_blocked, try the identifier-based API (api.crossref.org/works/<doi> returns the
publisher's full deposited reference list, which answers "does this paper cite X" through a 403 on the
paper), the companion code repository for a book, api.stackexchange.com for a forum thread, and a real
browser User-Agent for a 403 that is bot detection rather than a paywall. Record which routes were tried.
Never bypass access control: no credential sharing, no cookie injection, no paywall-removal mirrors. A
still_blocked that names four failed routes is a usable finding; a bare "blocked" is not.
Check a zero against the record before reporting it. The suppression index exists so lanes do not re-report known coverage, and it is only ever applied to candidates. One round published GRADE as having no external citer while this record already held two, at Ledger 6 row A19 and Ledger 3 row 77. Run the same lookup in the other direction on every per-work zero.
A Phase A tier is a ceiling, not an estimate. Measured over 420 candidates on 2026-09-12: 310 tiers held, 110 moved down, and none moved up. A one-directional 26.2% error rate means Phase A is optimistic rather than imprecise. The bias is worst at the top, where six Tier 0 candidates yielded one Tier 0 row. Report Phase A high-tier counts as claims, and use tier language only for verified rows.
Decide first-party by authorship, not by host. A domain regex covering the lab's own accounts passed 47 first-party records in one round, every one of which Phase B dropped: the lab's own papers on Hugging Face Papers, alphaXiv and ACL Anthology, its own packages on PyPI, its own Spaces under a co-author's account, and a fork of a lab repository under a third-party org. Preprint aggregators and package indexes are first-party surfaces for the lab's own artifacts, and a fork is first-party wherever it sits.
Check the version history, not the indexed date. A survey whose indexed publication date precedes
every work in a line can still cite one in a later revision. arXiv:2510.06445 carries a
publicationDate of 2025-10-07 and cites Agent Audit only in v3, submitted 2026-06-12. Any sweep
filtered on the indexed date drops it silently. Cite the version that carries the reference.
For each candidate in news-search-candidates.jsonl, fetch the page and apply five checks in order:
Pre-tier filter: first-party / already-tracked / disambiguation drops. Before running the citation rule, drop the candidate if it falls into any of these patterns (each was stepped into during the 2026-05-07 round):
- First-party hosting on the PI's current or prior institution (e.g., the PI's CMU PhD-era profile, an NSF PAR record of the PI's own grant output, a journal mirror of the PI's own paper).
- Already-tracked award URL — the canonical landing page for an award already recorded in Ledger 5.
- Coauthor-institution publication listing — a bare research-listing page on a coauthor institution's site (Microsoft Research, Adobe Research, etc.) that is not editorial; demote to Ledger 3.
- Name-collision drop — the match is on a different person ("Yue Zhao" → Yuchen / Siyan / Qingyue / W. / D. Zhao) or a different project ("Aegis" → Forrester AEGIS / NVIDIA Aegis / RedHat aegis-ai; "TrustLLM" → trustllm.eu; "TDC" → TDCJ / J&J Therapeutics Discovery). Consult
references/disambiguation-registry.md.
Direct-mention / topic-validation routing (the citation verification rule in the Output section). If the page names the work, person, lab, co-author, institution, or direct URL per one of clauses 1 to 6, fill
direct_mentionand continue as coverage. If it does not pass direct mention but clearly covers the same topic area, settier: "topic-validation"and keep it for the Topic Validation appendix, not a coverage ledger. If it is neither direct coverage nor topic validation, settier: "dropped"and record the drop reason innotes.Neither a snippet nor a summarizing fetch is verified evidence for Tier 0 / Tier 1 candidates, and reference-list checks are grepped from raw PDF text and raw HTML at every tier. A summarizing fetch on 2026-09-12 reported a bibliography entry absent from a 557 KB page where it exists, and on another paper re-rendered an author-year bibliography as a numbered list and returned a printed reference number that the document does not contain. Record the format with every locator, and expect author-year bibliographies carrying no printed numbers at all. WebSearch summaries can synthesize content that does not appear in the source (the 2026-05-07 round caught this with GAO-26-108695: snippet claimed TrustLLM citation; manual PDF extraction confirmed the PDF says nothing of the sort). Tier 0 / Tier 1 promotion requires direct fetch of the source —
pdf_term_scan.pyfor PDFs, real-UA HTTP for web pages. If the source is gated and cannot be re-fetched, settier_guess: phase_b_priorityand leave as a candidate; do not count.Disclaimer / aggregator detection (
references/disclaimer-patterns.md). Run the regex sweep on fetched content. Set entries in the candidate'sflags[]field. Hard caps:ai_generatedandaggregatorare capped at Tier 3 regardless of outlet domain.machine_translatedis capped at Tier 3 unlesseditorial_translationis also set.paywall_or_blockedis held for manual verification, not classified from snippet alone.
Tier assignment per the tier structure in the Output section. Assign coverage tiers (Tier 0 through Tier 5) only to candidates that pass direct mention; topic-only candidates keep
tier: topic-validationfrom step 1.Registry harvest status. For each kept coverage row, set
registry_statustoexistingornewafter checking the page's registered domain againstreferences/domain-registry.md. Leaveregistry_statusempty on dropped and topic-validation rows.
Phase B writes direct-coverage rows (Tier 0 through Tier 5) to the coverage ledgers, topic-only rows (tier == 'topic-validation') to the Topic Validation appendix, and keeps dropped rows (tier == 'dropped') in news-search-candidates.jsonl for auditability. The full candidates file stays at the project root through the audit so a reviewer can audit drop decisions, not only the kept rows.
Domain Registry and Post-Round Harvest
references/domain-registry.md lists known high-value source classes (gov / policy PDFs, EU research projects, patents, China tech media, security research blogs, AI-newsletter aggregators, and others) with seed domains. Phase A queries fan out to seeded domains in addition to the open dragnet, never instead of it. The registry is a recall floor, not a filter.
After each audit, harvest the domains of every confirmed Phase B hit and append new ones to the registry under the appropriate class. If no class fits, create one (lowercase-hyphenated name). This is the only way the registry stays current as new outlet types appear; without it, the registry freezes and re-discovery cost recurs.
Once a quarter, run a registry-disabled pass (open dragnet only) to surface new outlet classes the registry has not seen yet. This is what catches the next surprise category.
Standing Lane: Auditable AI and Agent Auditability (Mandatory Every Round)
This lane runs in every run mode, including Quick check and Targeted, and it runs in addition to whatever dimensions that mode selects. It never replaces a dimension. If a run is so narrow that only one lane fits, this is the lane. A round that finds nothing here must say so explicitly in the output rather than omit the lane, so the absence stays visible across rounds.
Why it is mandatory. The agent-auditability line is the lab's current research frontier and the axis the public positioning rests on, so coverage there moves fastest and matters most to catch early. It is also the material the dimension sweep is worst at finding. The artifacts are new, several live under co-author GitHub accounts rather than yzhao062, and much of the relevant writing names a concept such as "agent auditability" rather than a tool name that a keyword sweep would match.
Artifacts to Search Every Round
| Work | Identifier |
|---|---|
| Auditable Agents (position paper: five auditability dimensions, three mechanism classes) | arXiv:2604.05485 |
| Aegis (pre-execution firewall for tool calls) | arXiv:2603.12621, github.com/Justin0504/Aegis |
| agent-audit (static security and over-privilege scanner) | arXiv:2603.22853, github.com/HeadyZhang/agent-audit |
| Implicit Execution Tracing (post-hoc attribution after logs are stripped) | arXiv:2603.17445 |
| GRADE (typed two-layer execution and dependency graph) | arXiv:2606.22741, github.com/yzhao062/grade |
| FORTIS (over-privilege benchmark for agent skills) | arXiv:2605.09163 |
| WeClawArena (auditable sandbox and benchmark for cross-user agent collaboration and security) | arXiv:2608.03499 |
| CatchBench (benchmark for when an agent failure can be caught: declared config, trace prefix, finished trace) | arXiv:2608.22808, github.com/yzhao062/catchbench |
auditable (open-source system of record for agent decisions) |
github.com/yzhao062/auditable, pypi.org/project/auditable |
| awesome-auditable-ai (curated knowledge base) | github.com/yzhao062/awesome-auditable-ai |
| Auditability Card (machine-checkable disclosure artifact) | named inside Auditable Agents |
Keep this table current. When a new work ships on this line, add it here in the same commit that adds it to data/publications.json or data/open-source.json.
Concept Vocabulary to Search Every Round
Coverage on this line often names the idea rather than the artifact, so search the vocabulary alongside the tool names: "auditable AI systems", "agent auditability", "accountability layer" for AI agents, "system of record" for agent decisions, decision replay against live state, rollback and compensation for agent actions, tamper-evident agent audit trails, pre-execution mediation, and post-run attribution in multi-agent systems.
Apply the citation verification rule without softening it. Most vocabulary matches will be other people writing about the same idea, which is topic-validation. This lane earns its place by catching the minority that name the work.
Standing Watch Items
- Baseline and prior-art citations. Other agent-firewall or agent-auditing projects that use Aegis or Auditable Agents as a comparison baseline. Praetor (arXiv:2604.26274) is the precedent and is already tracked; it reports 12.8% attack success for Aegis against 2.2% for its own method. Search recent agent-security preprints for the same pattern, since a baseline citation is durable evidence that the work is the reference point in its subfield.
- Standards and regulation. The Agent Auditability Standard (
aas-1.org), EU AI Act Article 12 logging and traceability, NIST work on agent security, OWASP agentic releases, and any ISO/IEC JTC1 SC42 agent-audit item. These are the surfaces where a term turns into a requirement. - Name collisions specific to this line.
Auditable AIis already in descriptive use by FICO, Fraunhofer HHI, IBM, Rezolve AI, Numbers Protocol, and an unrelated company atauditableai.com.AuditBenchis Anthropic's alignment-auditing benchmark and is a separate project.FORTISis the lab name, the benchmark name, and also a bank, a utility, and a hospital chain. Check these before counting any match and record new collisions inreferences/disambiguation-registry.md. - Company surface.
auditable.runis the PI's own company site, so it is first-party and never counts as coverage. External writing about the company does count.
Dimension 1: Person & Lab
Find coverage that names the PI or lab, regardless of which paper or tool.
Search for: name + university + research area + various contexts (news, interview, podcast, keynote, expert quote, award, fellowship, grant). Also search for lab name and industry partner names (Amazon, NVIDIA, Google, Meta, Anthropic, NSF).
See references/search-queries.md § Dimension 1 for the full query list.
Dimension 2: Tools in Non-Academic Contexts
Major tools (PyOD, TrustLLM, agent-audit, Aegis, ADBench) may appear in industry deployments, government reports, textbooks, or enterprise case studies without naming the PI.
Search for: each tool name + context keywords (enterprise, deployment, production, fraud detection, cybersecurity, government, NIST, federal, textbook, course, patent, Walmart, NASA, Tesla).
See references/search-queries.md § Dimension 2 for the full query list.
Dimension 3: Outlet Sweep
Systematically check each outlet category using site: filters. This is the most important dimension for finding coverage the other dimensions miss.
Categories: security press, business press, top tech press, AI newsletters, science press, government/policy, industry analysts, university/institutional press, developer community.
Generation rule: references/search-queries.md § Dimension 3 provides base queries for the highest-priority outlets. For any outlet domain listed in references/outlet-registry.md that does not have an explicit query in the query bank, generate one at runtime using this template: site:{domain} "anomaly detection" OR "AI auditing" OR "AI agent security" OR PyOD OR TrustLLM. This ensures every registered outlet is checked without requiring the query bank to enumerate all 70+ domains.
Dimension 4: Topic Proximity
Search for the broader trending topic and check if the work appears within coverage. This catches indirect coverage where the paper is relevant but not cited by name.
Examples: ChatGPT geolocation trend (connects to DoxBench), OpenClaw security crisis (connects to agent-audit), OWASP agentic AI landscape (connects to agent-audit/Aegis), anomaly detection open-source landscape (connects to PyOD).
See references/search-queries.md § Dimension 4 for the full query list.
Dimension 5: Smart Paper Search
For papers where exact title search fails (most papers), use distinctive result keywords or striking claims from the paper instead.
Examples: "surpassed human performance 95.33% CLADDER" for the causal reasoning paper, "defense training breaks LLM agents 47-77% benign task failure" for The Autonomy Tax.
See references/search-queries.md § Dimension 5 for the full mapping table.
Dimension 6: Citation & Downstream Impact
Track high-level citation metrics, appearances in high-impact journals (Nature, Science), enterprise adoption evidence, and downstream tools built on the work.
See references/search-queries.md § Dimension 6 for the full query list.
Dimension 7: Education, Ecosystem & Global
Search the surfaces where widely-adopted tools spread beyond academic papers and news: education platforms, code ecosystems, non-English press, and developer communities.
Education & courses: Kaggle notebooks, Google Colab examples, Coursera/edX/Udemy course materials, university syllabi, YouTube/Bilibili tutorials, O'Reilly/Manning learning paths Code ecosystem: GitHub code dependents (repos that import PyOD), PyPI/conda-forge download stats pages, Papers with Code tool listings, Hugging Face Spaces built on your tools Dissertations & theses: ProQuest, Google Scholar thesis search, university repository searches Non-English coverage: Chinese tech press (InfoQ CN, CSDN, Zhihu, WeChat public accounts), Japanese (Qiita, Zenn), Korean (Tistory, Velog), European (Heise, Le Monde Informatique, etc.)
See references/search-queries.md § Dimension 7 Education/Ecosystem for queries.
Dimension 8: PDF Deep Search (Government, Think Tank, Industry Reports)
This is critical and cannot be skipped. Web search does not index the text inside PDFs from government reports, congressional testimony, think tank whitepapers, and industry reports. Citations of your work inside these documents are the highest-impact coverage (Tier 0) and are routinely missed by Dimensions 1-6.
Strategy
- Identify candidate PDFs — search for government/think tank reports on topics your work addresses (AI agent security, anomaly detection, LLM trustworthiness, AI auditing). Collect the PDF URLs.
- Fetch and search inside each PDF — download or fetch the PDF, extract text (via PyMuPDF, pdftotext, or the WebFetch tool), and search for: tool names (PyOD, TrustLLM, Aegis, agent-audit, etc.), paper titles, author names ("Yue Zhao", "Zhao et al."), arXiv IDs, and repo URLs.
- Verify and classify — if found, note the exact page, footnote number, and surrounding context.
High-priority PDF sources to search
U.S. Government (highest priority):
- U.S. Senate committee reports — HSGAC, Commerce, Judiciary, Armed Services (AI-related)
- U.S. House committee reports — Science, Homeland Security, Financial Services
- NIST special publications — AI RMF updates, AI agent security, AI 100-series
- GAO reports — AI technology assessments, Science & Tech Spotlight series
- CRS reports — Congressional Research Service AI analyses
- Federal agency AI strategies — DOD (JAIC/CDAO), DOE national labs, HHS, Treasury/OCC, SEC, CFTC, Federal Reserve
- White House — AI executive orders, OMB memoranda, OSTP reports, CEA reports
- NSF — program solicitations, dear colleague letters mentioning anomaly detection or AI safety
International Government (high priority):
- EU — AI Act impact assessments, ENISA reports, EU AI Office publications
- UK — AI Safety Institute reports, DSIT AI regulation papers, Alan Turing Institute policy briefs
- Canada — ISED AI strategy, Canadian Centre for Cyber Security
- Australia — Department of Industry AI reports, eSafety Commissioner
- Singapore — IMDA Model AI Governance Framework
- OECD — AI Policy Observatory reports, OECD AI Principles implementation documents
- UN — UNESCO AI ethics recommendations, ITU AI reports
- G7/G20 — Hiroshima AI Process documents, AI governance communiques
Think tanks & policy institutes:
- Brookings, RAND, CSET Georgetown, Stanford HAI, FLI, CAIS, Partnership on AI
- Center for Data Innovation, Information Technology and Innovation Foundation (ITIF)
- Centre for International Governance Innovation (CIGI)
Foundation model companies (Tier 0 if they cite your work):
- OpenAI — system cards (GPT-4, GPT-5, o1, o3), safety reports, preparedness framework documents, red teaming reports
- Anthropic — model cards, responsible scaling policy documents, safety research reports
- Google DeepMind — technical reports, Gemini system cards, safety evaluations
- Meta AI — Llama model cards, system cards, responsible use guides
- Mistral — model documentation, technical reports
- xAI — Grok system cards and technical reports
- Cohere — model cards, safety documentation
- Microsoft — Phi model cards, responsible AI reports, Azure AI safety documentation
- Amazon — Titan model documentation, AWS AI safety reports
These companies publish system cards and safety evaluations as PDFs or long-form web pages that reference academic benchmarks (TrustLLM, HELM, etc.) and tools. They also publish blog posts with embedded citations. Search both the HTML pages and any linked PDFs.
Standards bodies:
- ISO/IEC (AI standards series), IEEE SA, OWASP (agentic AI PDFs)
- MITRE ATLAS documentation
Industry whitepapers & analyst reports (Tier 0 if they cite your work by name):
- McKinsey, Deloitte, PwC, Accenture, EY, KPMG, BCG, Bain
- Gartner, Forrester, IDC research reports
Known citations found via this dimension
- U.S. Senate HSGAC — "Hedge Fund Use of Artificial Intelligence" (Jun 2024), footnote 119 cites TrustLLM on page 25
- FLI AI Safety Index — Winter 2025 PDF uses TrustLLM as an official benchmark
Why web search misses these
Government PDFs are hosted as static files (e.g., .senate.gov/wp-content/uploads/...pdf). Web search engines index the hosting page but not the text inside the PDF. A search for site:senate.gov TrustLLM returns nothing because the word "TrustLLM" only appears inside the PDF, not on any HTML page. The only way to find these is to identify candidate documents by topic, then search inside the PDFs directly.
Output
Write all results to news-coverage-audit.md at the project root.
Citation Verification Rule
An item only counts as coverage if the article names or cites at least one of:
- A specific paper title or tool name (PyOD, TrustLLM, Aegis, agent-audit, etc.)
- The PI by name ("Yue Zhao")
- The lab ("FORTIS")
- A co-author by name in the context of the specific paper/tool
- An institutional attribution ("researchers from USC", "a USC team") in the context of the specific paper/tool
- A direct link to the project URL, repo, or arXiv paper
Read the article or its snippet to verify before including it. Items attributed to co-authors or institutions should note this in the entry (e.g., "names: first author X, USC affiliation — Yue Zhao is co-author").
Items that only cover the same topic your work addresses (e.g., "AI agent security is important" without naming your tools) are not coverage. These may be useful as context for grant narratives but must be placed in a separate "Topic Validation (Not Direct Coverage)" appendix, clearly marked as not naming your work.
Tier Structure
All tiers below require the citation verification rule above. If a result does not name or cite your work, it does not belong in any tier.
| Tier | Definition | Examples |
|---|---|---|
| Tier 0 | (a) Government reports (U.S. or international: legislative, executive, federal/national agency), international body reports (OECD, UN, EU), or official standards documents; (b) Technical reports, system cards, safety reports, or model cards from major foundation model companies (OpenAI, Anthropic, Google DeepMind, Meta AI, Mistral, xAI, Cohere, etc.); (c) Major consulting/analyst firm reports (McKinsey, Gartner, Forrester, Deloitte, etc.) — all that cite your work by name | U.S. Senate report citing TrustLLM, OpenAI system card citing TrustLLM, Anthropic safety report citing anomaly detection benchmark, Gartner report citing PyOD |
| Tier 1 | Mainstream tech/business/security press, major research institutions (national labs, Hoover, Microsoft Research), or high-impact policy reports that name your work | FLI AI Safety Index using TrustLLM, LLNL article naming TrustLLM, Nature Biotechnology citing DrugAgent |
| Tier 2 | Industry press, institutional PR, or dedicated features that name your work | "DrugAgent" in MarkTechPost, "Yue Zhao" in USC Viterbi News, Databricks blog naming PyOD |
| Tier 3 | Dedicated blog posts, tutorials, or platform integrations naming your tool | KDnuggets PyOD tutorial, Databricks Kakapo built on PyOD, DEV Community Aegis post |
| Tier 4 | Awards, recognitions, encyclopedia entries | Amazon RA, NVIDIA Grant, Grokipedia entry |
| Tier 5 | Academic community only (Hugging Face, alphaXiv, etc.) | Paper pages, GitHub stars, Moonlight reviews |
Separate appendix (not a tier):
- Topic Validation — articles covering the same topic area without naming your work. Useful for grant narratives ("our research addresses concerns raised in McKinsey's 2026 report on agentic AI security") but not website news items.
Tier 0(b) extension: foundation-model-company careers pages
A first-party foundation-model-company job posting that names a FORTIS tool as expected operational tooling (e.g., the OpenAI "Technical Intelligence Analyst" Qualifications block naming PyOD as anomaly-detection tooling) qualifies as Tier 0(b)-equivalent only when all of the following hold:
- First-party host. The canonical URL is the company's own careers domain (
openai.com/careers/...,anthropic.com/jobs/...,deepmind.google/careers/...,ai.meta.com/careers/..., etc.), not a Greenhouse / Lever / Ashby / DFJ Growth / Glassdoor / LinkedIn / Indeed mirror. ATS mirrors are kept undermirrors[]in the candidate record but never count as the load-bearing citation. - Tool named as operational tooling, not background literature. The mention sits in Qualifications, Responsibilities, or Tech Stack as a tool the hire is expected to use, not in a "see also" or "related work" footnote.
- Durable snapshot exists. A Wayback Machine archive URL OR a committed local sidecar pair (HTML + PDF in
news-snapshots/<slug>-<YYYY-MM-DD>.{html,pdf}) is in the repo, with a Markdown index file documenting the live URL, capture date, verification method, and verbatim quote. Sidecars must be captured from a logged-in browser session when the live URL is behind Cloudflare; PDF must be re-verified withpython skills/news-search/scripts/pdf_term_scan.py <pdf_path>.
When all three hold, the candidate goes into Ledger 1 (Government/Policy citations) under Tier 0(b) with a Source URLs row that includes the live URL, mirror URLs, and the snapshot index path. The #8g precedent (news-snapshots/openai-careers-technical-intelligence-analyst-2026-05-07.md) is the reference shape; new entries follow that index format.
If the live URL is reachable but no snapshot exists yet, set tier_guess: phase_b_priority and status: paywall_or_blocked (or candidate with a snapshot-pending note in notes). Do not promote to Ledger 1 from a snippet alone — careers pages go stale within weeks of the role being filled, so an unsnapshotted Tier 0(b) claim becomes unverifiable as soon as OpenAI / Anthropic rotates the URL.
Non-FM-co careers pages (Wells Fargo, Capital One, JPMC, Pfizer, Goldman, etc.) follow the same snapshot-or-hold rule but classify under Ledger 3 (ecosystem adoption — enterprise operational adoption evidence), not Ledger 1 / Tier 0(b). Only foundation-model companies get the Tier 0(b) lift; the rationale is that FM-co operational tooling decisions are themselves treated as authoritative signal in the way GAO / NIST PDFs are. A non-FM enterprise JD naming a tool is operational adoption evidence comparable to a code import or vendor whitepaper, which is Ledger 3 territory; it is not third-party media (Ledger 2) and it is not a government / FM-co citation (Ledger 1).
Required Sections in Output File
- Coverage ledgers (separate counts for each):
- Government/Policy citations — Tier 0: government reports, foundation model system cards, standards documents, analyst reports that cite your work by name
- External media — Tier 1-2: third-party press, institutional features, dedicated blog posts by external authors
- Ecosystem adoption — Tier 3: books, podcasts, enterprise integrations, patents, tutorials, platform integrations by external parties
- First-party/community — self-authored blog posts, GitHub discussions, dataset hosting (not external coverage)
- Awards & recognitions — Tier 4: awards, fellowships, encyclopedia entries
- Topic Validation appendix — articles that cover the same topic but do not name your work
- Negative Results table — outlet types searched with no results (prevents re-searching)
- Upcoming Opportunities — imminent conferences, journalist contacts from prior coverage
- Summary Statistics — separate counts per ledger, not a single aggregate. Report: government/policy total, external media total, ecosystem
…(truncated)