The gate: your relevance rules#
Every domain has a published gate: plain-language inclusion and exclusion rules plus URL patterns. The extraction agent applies it page by page — “include firms whose main business is IT consulting with an office in Linköping or Norrköping; exclude recruitment ads” — and an entity the exclusion rules cover is not extracted even when the page is relevant. Gates are versioned; the judge's refinements become new versions, and a widened gate gives previously rejected pages a second look.
No HTML ever reaches a model. Each page is converted to markdown with navigation, footers and scripts removed and links kept inline. The extraction model returns a structured verdict: is the page relevant, how confident is it, is it a catalog, an article or an entity's own page — and the entities, facets, relationships and up to ten links worth following. A shaky verdict, especially a shaky rejection, is re-read by a stronger model.
Every entity and relationship is stored with the page and a verbatim snippet it came from. Relationships are normalized to 15 canonical predicates, and names are deduplicated against the graph — including by canonical URL, so two names for the same official site become one entity with an alias.
Change detection: pay only for what changed#
Re-scraping is where knowledge graphs usually get expensive. Nolvin re-reads every page in tiers and stops at the first one that answers:
- Hash — the normalized markdown has not changed: done, no model call.
- Catalog — a changed calendar or directory: links that were not in the stored snapshot are new items and are queued directly.
- Diff — the page was read before: it is diffed against its snapshot. Removals are reconciled in code (entities that vanished lose the page's support); small additions go to the model as just the added lines with their context, and its output is grounded in that text.
- Full read — most of the page changed, or its last full read is more than 30 days old.
In production, diff reads cost about a third of a full read, and unchanged pages cost nothing — keeping all of Nolvin's live graphs current runs well under a dollar a day.
Assessment and self-correction#
Graphs built from the web drift toward noise: navigation labels, near-duplicates, adjacent topics. Each autopilot cycle cleans before it grows:
- Hygiene — deterministic rules drop junk names and merge exact and fuzzy duplicates (never across differing digits: “Festival 2025” and “Festival 2026” stay apart).
- Precision sweep — every entity is checked against the brief in batches; events and locations tied to in-scope actors are protected.
- Scorecard — a deterministic score from coverage of expected examples, precision, connectivity, corroboration across sources, facet completeness and source diversity.
- Judge — proposes deletes, merges, gate tightening and gap searches; code re-validates every id and caps deletes.
Steady state#
Once built, a domain maintains itself. The scheduler requeues due pages every six hours, a frontier planner ranks unexplored links weekly and runs gap searches, new entities are swept daily, and entities that lose all support expire after 21 days. Webhooks and a server-sent event stream report what changed.
Guardrails#
- Spend
- Every model call is metered per domain; a monthly spend cap pauses the domain when reached.
- Scope
- Crawls stay on registered source hosts (and sanctioned official sites of entities already in the graph), within a depth and page budget.
- Etiquette
- robots.txt, Crawl-delay and per-host spacing across all workers. About NolvinBot.
- Failures
- Failed extractions retry three times, then land in a dead-letter queue you can inspect and requeue through the API.
Questions#
Which language models does Nolvin use?
Page extraction runs on Claude Haiku 4.5, a fast and inexpensive model; pages where it is unsure are re-read by Claude Opus. Judgement-heavy steps — the domain brief, source discovery, the frontier planner and the graph judge — run on Claude Opus. Every model call is metered per domain.
Does Nolvin respect robots.txt?
Yes. NolvinBot reads robots.txt before crawling a host (cached for 24 hours), honors Allow, Disallow and Crawl-delay, and spaces requests to the same host — at least 1.5 seconds apart by default, longer if the site asks. See NolvinBot.
How fresh is the graph?
A scheduler runs every six hours. Catalog pages (calendars, directories, member lists) are re-checked daily; other pages back off to at most weekly while they keep yielding nothing new. You can force a re-scrape of a whole domain through the API at any time.
What does it cost to keep a graph up to date?
Most of the time, very little: an unchanged page is detected by its hash and costs no model call at all, and a changed page is usually read as a diff of the added lines. A domain can carry a monthly spend cap: when it is reached the domain's crawling pauses and a budget.hit event is sent.
Can I bring my own sources instead of using autopilot?
Yes. Create a domain, publish a gate (your relevance rules), register source URLs and start a crawl. Autopilot is the same pipeline with the brief, discovery and assessment steps done for you.