# Hopper Labs site graph Read /sitegraph.json first, then /sitegraph/pages.json to retrieve one page's bounded neighborhood. /sitegraph/graph.json contains the whole public graph. Views reference their exact parent graph digest; they are not independent authorities. Stable IDs distinguish pages, products, applications, demos, operations, collections, discoveries, resources and threads. Typed edges preserve factual, editorial, personal and navigation bases. Owner semanticRef values and the published Tapestry digest remain attached. Full source text and evidence: /likes-collection.json. Local queries: bun run sitegraph:query '{"operation":"search","text":"Theo"}' For traversal use operation=reachable, an exact id, depth=1..8, limit=1..100, optional basis and navigationOnly. Follow nextOffset for result pagination. Results include graphDigest. Search matches direct names and aliases first, then existing direct content relationships; connected matches include their exact edges and bases. Neighbors include fromNode/toNode titles and URLs, so agents need not resolve bare IDs. Shared tags do not imply a relationship. Validate requests against /sitegraph/query-schema.json. Reachability uses the existing graph-derive/Souffle package and the published navigation.dl rules. There is no hosted query or authoring endpoint. Automatic refresh: bun run agents:refresh; development: bun run agents:watch. Builds and owner imports refresh and validate discovery. Matching proofs are reused only for exact graph and proof-input digests. Verification: bun run agents:check; force proof replay: bun run sitegraph:prove. Lean checks finite graph structural invariants and modeled page paths; it does not verify historical claims, actual UI hyperlinks or live HTTP behavior. This is a Hopper convention, not a universal sitegraph standard. robots.txt is crawler guidance, not access control. llms.txt, agents.md, agent-manifest.json and sitemap.xml provide complementary discovery.