sweep
Cross-company language sweep via Quartr full-text search — date the adoption curve of a term/phrase across the global transcript+filing corpus, identify which companies (and which speaker roles) use i
SKILL.md.claude/skills/sweep/SKILL.md
GitHubThe mechanised version of the vault's core mandate: connect optically insignificant datapoints to macro-level shifts. Corporate language is a leading indicator — managements adopt a term (capacity auction, asset light, inventory digestion, agentic) before the economics it names show up in reported numbers, and when several companies along one value chain adopt it within a few months, a schelling point is forming ([G-3]). This skill dates that curve from primary sources and names the adopters, producing an immutable Research note.
What the tool can and cannot do (probe-validated 2026-09-09):
search_documentsreturnstotalCount+ company/event/document pointers per date window — but no snippets (text: null). The sweep therefore has a hard two-stage structure: search finds WHERE, summaries/deep reads establish HOW the term is used. No usage claim is ever made from a hit-list alone.- The
documentTypesfilter is loosely honoured (transcript queries return slide hits) — always read each hit's actualdocumentType. - Query syntax is fragile in compounds: an exact phrase AND'd with an extra term can silently 0-hit while each part alone returns hundreds. Keep queries to a single term or a single backtick-quoted phrase; express restrictions via the
filterparameter (GICS, country,speaker.role, companyId), never via extra query words. A 0-hit result on a term you know exists means the query is malformed — simplify and retry once before trusting it. - Terms have prior language communities. Validated live: "capacity auction" ran 45 hits in Jun-Sep 2025 vs 21 in Jun-Sep 2026 — a naive read says the term is dying, but the 2025 base is utilities (RWE, Constellation, Alliant: electricity capacity auctions), and the real signal is Nebius entering that community in 2026 with a new meaning. Raw counts track the blended series; the adoption read requires segmenting the curve by GICS and tracking community composition, not volume.
Arguments
/sweep "<term>" plus optional flags:
--since YYYY-MM-DD— curve start (default 24 months back)--gics "<GICS name>"— segment/restrict to an industry (repeatable up to 2; e.g."Information Technology"at level 1,"Semiconductor Materials and Equipment"at level 3/4)--country XX— ISO country filter--role CEO|CFO|Analyst— transcript speaker-role filter (who says it matters: CEO adoption ≠ analyst questioning)--types transcripts,slides,reports— defaulttranscripts,slides--portfolio— restrict to the Vault Active watchlist companyIds (from.data/quartr_watchlist.json)
Multi-word input without quotes → treat as an exact phrase. Multiple unrelated terms → ask the user to run separate sweeps (comparability of one curve is the product; blended queries are uninterpretable).
Step 0: Pre-flight
- Lock:
vault-wideper_shared/preflight.mdProcedure 1, timeout 10 min (writes one Research note; reads theses + graph). - Quartr probe (hard): per
_shared/quartr.md§1 loadsearch_documents,get_document_summary,get_event_summary,list_companies. Unavailable → abort (❌ /sweep has no fallback source). - Mental models (analytical tier — this skill renders judgements): read
[[Generalist - Overview]]always; the matchingIndustry -/Lens -file(s) when--gics/the term's obvious domain puts a covered sector in play. Apply the READING PROTOCOL: an adoption curve that flatters an existing thesis is a disconfirmation trigger, not a victory lap. - Read
_graph.md(adjacency primer per_shared/graph-primer.md) and.data/quartr_ids.json(build the reverse map companyId→vault ticker) in the same batch.
Step 1: Adoption curve (bounded window scan)
Bucket the lookback into windows: monthly for ≤12 months, quarterly beyond (cap: 14 window queries). Per window:
mcp__quartr__search_documents {query: "`<term>`", documentTypes: [...], startDate, endDate, limit: 1}
totalCount is the datapoint; limit: 1 keeps responses tiny. When --gics/--country/--role is set, pass it via filter (e.g. gics.level1:=["Information Technology"], speaker.role:=[CEO]). When the term shows cross-industry usage (Step 2 reveals a mixed community), re-run the LAST 6 windows with the target-industry filter to produce the segmented curve (cap: +6 queries) — the segmented series is the one the note leads with; the blended series is context.
Curve shape readings (hypotheses, not verdicts): sustained acceleration = diffusion; a step-function = one event echoing (check whether hits cluster on one company's reporting week); flat-high = established vocabulary, no inflection signal; decline in blended + rise in segmented = community handoff (the validated capacity-auction case).
Step 2: Who — the language community
One discovery query on the most recent window at limit: 100 (+1 page if totalCount > 100 and the run is unfiltered). Group hits by company; record documentType (verified per hit), event, date. Then:
- First-mention dating for the most thesis-relevant companies (vault names, graph-adjacent names, repeated hitters): per company,
filter: "companyId:=[<id>]"with a wide date range,orderimplied by windowing — bisect with at most 2 windows per company to date their earliest use. Cap: 6 companies. - Role composition when
--roleunset but transcripts dominate: one extra query withspeaker.role:=[CEO]on the latest window — CEO-mouth adoption is the strong form of the signal.
Step 3: Vault cross-reference
Map hit companyIds → vault tickers (reverse ID map; unmapped hit companies are looked up by name against thesis/watchlist names before being declared outside-vault). Then against _graph.md:
- Adjacency propagation flag (the payoff): ≥2 companies that are graph-adjacent (same cluster, shared supplier/customer edges) adopting the term within a 2-quarter span → flag as a candidate schelling point, naming the chain and the implicated theses.
- Term present in hit companies but ABSENT from the vault's own thesis/sector vocabulary (grep the implicated notes) → vocabulary gap: the market is naming something the vault hasn't framed yet.
- Inverse check: the vault uses the term but the corpus barely does → the vault may be early (good) or idiosyncratic (check which, via Step 4 context).
Step 4: Context verification (the two-stage rule)
For the top ≤5 most load-bearing hits (by thesis-relevance, then recency): get_event_summary (events) or get_document_summary (documents) to establish how the term is actually used — new meaning vs incumbent meaning, offensive vs defensive framing, management-initiated vs analyst-prompted. A hit whose summary is null and whose usage matters → note it as unverified and recommend /transcript TICKER --event <id>; never guess. No figure or usage claim enters the Evidence section without this layer or a deep read behind it.
Step 5: Write the Research note
Research/YYYY-MM-DD - Sweep [term] - data.md — immutable record per Research-note conventions. Frontmatter: date, tags: [research, data, sweep + implicated tickers/sector tags], status: active, source: Quartr search_documents corpus sweep — query "<term>", windows <start>..<end>, source_type: data, publish omitted (Research notes don't carry it).
Body (all 4 required sections):
## Thesis Delta— which theses the curve touches and how (hypothesis language; trigger touches flagged per_shared/trigger-touch.mddiscipline — flag, never auto-action)## Summary— the curve's shape and the community's composition shift, led by the segmented series; the mechanism the term names; what adoption timing implies## Evidence— the curve table (window | blended count | segmented count), the adopter table (company | vault link/outside | first mention | role | verified context), each verified usage tagged[Quartr]with its deep link## Contradiction Check— the strongest mundane explanation (reporting-calendar clustering, one-event echo, incumbent-industry base rate, Quartr coverage growth inflating late-period counts — state this one explicitly every time, since corpus size is not constant over the lookback)## Source Excerpts— the ≤5 verified usages, quoted short with links
Wikilink implicated theses/sectors. No thesis Log writes (multi-thesis fanout is /sync's job — the note's links make it discoverable); remind the user to run /graph last.
Step 6: Release lock + report
Stats line (windows, total hits, community size, vault overlap), the curve in miniature, the adjacency-propagation flags, the deep-read queue, and suggested follow-ups (/transcript --event, /deepen, /monitor if the term deserves a standing alert).
Design constraints (xxx DO NOT VIOLATE xxx)
- Counts are hypotheses. Every curve reading ships with its mundane alternative (Contradiction Check). Corpus-growth inflation is stated in every note.
- Community composition beats volume. A blended count is never presented without the who — the validated failure mode is reading a community handoff as a decline.
- Two-stage always. Hits carry no snippets; usage claims require the summary/deep-read layer. No exceptions for "obvious" terms.
- Simple queries only. One term or one exact phrase; restrictions go in
filter. On unexpected 0-hits, simplify once, then report the anomaly rather than working around it with compound guesses. - Bounded budget. ≤14 curve + ≤6 segmented + ≤2 discovery + ≤12 first-mention + ≤5 summary calls per run. A sweep that wants more is two sweeps.
- No thesis writes. One immutable Research note; propagation stays with
/sync, conviction with/status.