/query-companies — answer from the company store, not the live web
Router + guardrails over QUERYING.md. Read-only; never scrapes, never spends.
Recipes live in QUERYING.md; this file only fixes order of operations and
points at the trust rules.
Steps
- Resolve the store:
$WEB_RESEARCH_HOMEfirst; if unset (harnesses that skip the shell profile), fall back to the canonical single-user path"/Users/brianbolze/Library/Mobile Documents/com~apple~CloudDocs/Web Research". Quote it — the path has spaces. - Resolve names -> slugs, always:
python "$WEB_RESEARCH_HOME/scripts/store.py" find <each>. Report per-company status before answering: clocks per layer /STUB/ not in store. Iffindprintslikely candidate, inspect that slug before calling it a miss. If it printsambiguous candidates, do not pick silently: use nearby context only if it clearly disambiguates; otherwise ask the user which company they meant, listing the candidate slugs/names. - Route via
QUERYING.md's one-rule table: for a human-facing ask about one profiled company, runrender.pyand paste the link line it prints into your reply (rendering without linking buries the artifact);rgfor locate; PyYAML parse for structure;store.dbonly for many-pivot asks, and rebuild it first. - Group answers wear the §0 stamp: if the answer covers more than one company,
open with
QUERYING.md§0's one-line stamp (Group · Set · Leaves out · Claim). The set-type caps the claim; a question that needs more than the type allows becomes "open question," not a clean number. - Answer captured state from store files only. No WebSearch/browser/curl. Cite path
- governing clock; prices use the offerings clock when they come from
offerings.md.
- governing clock; prices use the offerings clock when they come from
- Gaps are hand-offs, never silent live fallback: cold -> suggest
/research-company; thin roster ->/deepen-offerings; external signal -> the specifictools/*.py.
Trust Rules
- Negatives: apply
QUERYING.md's before-trusting-a-negative check first. - Counts: enumeration-gated (
QUERYING.mdRecipe 4); floors are floors. - Prices: verbatim + intra-cohort + hand-normalized; never a sorted
$ / motable. - Cohort cuts: unclear/empty = "couldn't tell," not "no."
- Groups: every multi-company answer opens with the §0 stamp; the set-type caps the claim (store coverage ≠ market; empty field = "at least N," not "the rest don't"; outside-list miss = "not in our store," not "not in the market").
Scope
State only. Events, judgments, and financials are out of store scope; say so.