# News Search

> Systematic web search for news, media, policy, and industry coverage of FORTIS Lab publications, tools, and research. Use when the user asks for a news audit, media coverage check, broader impact evidence, or visibility search for their work.

- Skill: `yzhao062/news-search` (Agent Skill, multi-file: 13 files)
- Install (CLI): `npx skillmds@latest add yzhao062/news-search`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yzhao062/news-search/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Security
- Author: yzhao062 (https://skillmd.com/u/yzhao062)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/yzhao062/news-search

---


# 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:

1. `data/publications.json` — all papers (titles, venues, years, links)
2. `data/open-source.json` — all tools/libraries (names, stars, URLs)
3. `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:

1. `references/search-queries.md`: query bank (not exhaustive; see triage rules below)
2. `references/outlet-registry.md`: outlet classification and `site:` domain lists
3. `references/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" rule
4. `references/candidate-schema.md`: Phase A and Phase B candidate record contract
5. `references/disclaimer-patterns.md`: AI-generated, aggregator, translation, templated-database, and blocked-page detection
6. `references/domain-registry.md`: seed domains by source class and `outlet_class` values for Phase A
7. `references/disambiguation-registry.md`: cumulative tool-name and person-name collision rules + verified-negative leads from prior rounds (consult before counting any borderline match)
8. `scripts/pdf_term_scan.py`: PyMuPDF-based FORTIS-term scanner with built-in false-positive filters; canonical Phase B PDF-deep-search tool. Run as `python skills/news-search/scripts/pdf_term_scan.py <pdf_path>`.
9. `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.
10. `scripts/dispatch_lanes.sh`: hardened lane dispatcher implementing that checklist. It strips CR from unit ids, verifies each launch by polling for `STATE-DIR`, uses `nohup` rather than the absent `setsid`, and exits non-zero when any dispatched unit has no result. Run as `bash 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`, or `NEWS_SEARCH_LANE_BACKEND=codex`. The `prun` skill reserves its higher-cost quota for the `/vet` gatekeeper 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 file` for Codex, `Agy wrote no final result` for 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_TIMEOUT` against `ANTIGRAVITY_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 no `PRUN_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 plan` nor 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 inherited `PRUN_SCRATCH_CWD` is therefore unset rather than merely left unexported, since the dispatcher rejects a caller-supplied workspace that arrives without an explicit `--mode`.

    `agy --version` and `agy models` run as a preflight before any launch, each bounded by `timeout --kill-after=5s` at `ANTIGRAVITY_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: plain `timeout` sends 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 of `FAILED-START` lines after the launch deadline. The diagnostic distinguishes 124 (expired), 137 (killed after ignoring TERM), and 125 through 127 (`timeout` could 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 names `data/publications.json` or `references/domain-registry.md` by relative path gives the worker nothing; inline the rows the lane needs, and run `scripts/pdf_term_scan.py` on the coordinator side rather than asking a lane to call it.

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:

1. **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`.
2. **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_mention` and continue as coverage. If it does not pass direct mention but clearly covers the same topic area, set `tier: "topic-validation"` and keep it for the Topic Validation appendix, not a coverage ledger. If it is neither direct coverage nor topic validation, set `tier: "dropped"` and record the drop reason in `notes`.

   **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.py` for PDFs, real-UA HTTP for web pages. If the source is gated and cannot be re-fetched, set `tier_guess: phase_b_priority` and leave as a candidate; do not count.
3. **Disclaimer / aggregator detection** (`references/disclaimer-patterns.md`). Run the regex sweep on fetched content. Set entries in the candidate's `flags[]` field. Hard caps:
   - `ai_generated` and `aggregator` are capped at Tier 3 regardless of outlet domain.
   - `machine_translated` is capped at Tier 3 unless `editorial_translation` is also set.
   - `paywall_or_blocked` is held for manual verification, not classified from snippet alone.
4. **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-validation` from step 1.
5. **Registry harvest status**. For each kept coverage row, set `registry_status` to `existing` or `new` after checking the page's registered domain against `references/domain-registry.md`. Leave `registry_status` empty 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 AI` is already in descriptive use by FICO, Fraunhofer HHI, IBM, Rezolve AI, Numbers Protocol, and an unrelated company at `auditableai.com`. `AuditBench` is Anthropic's alignment-auditing benchmark and is a separate project. `FORTIS` is 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 in `references/disambiguation-registry.md`.
- **Company surface.** `auditable.run` is 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

1. **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.
2. **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.
3. **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:**

1. A specific paper title or tool name (PyOD, TrustLLM, Aegis, agent-audit, etc.)
2. The PI by name ("Yue Zhao")
3. The lab ("FORTIS")
4. A co-author by name in the context of the specific paper/tool
5. An institutional attribution ("researchers from USC", "a USC team") in the context of the specific paper/tool
6. 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**:

1. **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 under `mirrors[]` in the candidate record but never count as the load-bearing citation.
2. **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.
3. **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 with `python 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

1. **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
2. **Topic Validation appendix** — articles that cover the same topic but do not name your work
3. **Negative Results table** — outlet types searched with no results (prevents re-searching)
4. **Upcoming Opportunities** — imminent conferences, journalist contacts from prior coverage
5. **Summary Statistics** — separate counts per ledger, not a single aggregate. Report: government/policy total, external media total, ecosystem 

…(truncated)
