viewsDerived summaries of the store. They are generated from ledger/ip-ledger.json and are never edited by hand — the value of a view is that it can be regenerated and rejected.
views/fresh-ips.json — criteria: *no observation with a real outcome — pulled, never spent*.views/reusable.json — criteria: *session_tag + url_template present (country selector included when the dialect needs it)*.views/by-project.json — observations grouped by project, with a note explaining the grouping.Each view carries its own provenance — derived_from, criteria, generated_at — so a stale file can be recognised without guessing.
All three views tell the truth as of 22 Sep 2026: fresh-ips.json and reusable.json report count: 0, and by-project.json groups 37 observations into outlook-creator (31) and grok-register (6). The zero for fresh is now a real answer rather than a stale one — the freshness test was repaired that day (see architecture.md) and every row carries a verdict. The zero for reusable remains structural: no row carries both a session_tag and a url_template.
views command to write them; anything that wants a cheap answer without parsing the store.load() path as everything else.generated_at is the only thing that tells you whether it is still true; nothing regenerates it automatically after an observe.views/ to the real directory — a test row carrying a reserved documentation IP and a fabricated future timestamp was found sitting in by-project.json on 22 Sep. Regenerate views after any test run, and read the newest entries before trusting the file.