is the page a lens?

thinking doc · 2026-08-16 · follow-on to Views Beyond River and Grid and Table View · touches Lens Spec Draft 3 §3 (PageFace), §9 (storage), Lens Is Not a Container

Half yes, and the half that's no is load-bearing. Split the word "page" into the two jobs it's doing:

page as homepage as face
what it iswhere blocks live — page_idwhat you see when you open it
total?yes — every block has exactly oneno — it can show foreign refs, hide sections
ordermanual, stored (page_order)whatever the view says
a lens? never. It's identity, not a query. already is one — §3 defines it as a set expression

The page's face is a lens. The page's home is what lenses bottom out in.

You're not discovering a coincidence — Draft 3 §3 already writes the face as a query (PageFace = PageRiver + SUBPAGES + LINKED) and already lets you edit it as one (![[mcp]]{-linked -subpages} is in the spec's own examples). The face has been a lens since Draft 3. What's missing is admitting it in the UI, and refusing to let it swallow the home.

1 · The root lens is already on screen

That {filter} chip next to "Home" in the current build is a collapsed lens line. Unfold it and the page header is a lens line whose base is locked.

Home{filter}
![[Home]] ⌷ base — change by navigating{-linked-subpagessort:manualriver}
*open tasks:projects/lifelab:
*article ideas[writing/the agency]
*Lisparium?:projects/lisparium:
subpages 4
linked 3
the base is the address bar · everything after it is the view · Mod+\ replaces one word

The base is the one part you can't edit in place — editing it is navigation (:e other-page). That single distinction is what keeps this from collapsing into nonsense: a page whose base is a query is a saved search, and a saved search cannot be a home, because the blocks inside it live somewhere else. Keep the base literal and the whole idea is safe.

2 · What it buys, concretely

3 · The layering that makes it coherent

notebookall blocks. The only truly total set. Not a page, not addressable, has no order.
homespages partition it. Every block has exactly one page_id and one manual order key. Storage fact, not a view. Not a lens.
lensesqueries over the notebook, each with a base (a page, a tag set) + filters + sort. The root lens is the one whose base is this page's home.
viewsdrawings of a lens result: river · grid · table · board · timeline · chart. Position = f(block), per the last doc.

Read upward and the recursion is well-founded: views draw lenses, lenses resolve against homes, homes partition the notebook. Read the other direction and it's the mistake to avoid — if a home can be a lens, a block can have no home, and the invariant that every block is findable in exactly one place is gone.

4 · Three invariants this must not break

a broken root lens shows everything
Home{due<???} ⚠ invalid
*open tasks
*article ideas
*Lisparium?
invalid-never-broadens, inverted at the root: invalid never narrows

Spec rule §filters says an invalid predicate must never broaden a result. At the root the danger runs the other way: a typo that returns nothing looks exactly like a page that lost its contents. So the root lens's failure mode is the full river, loudly marked — never an empty page.

a filtered page must look filtered
Hometodo · when:today14 hidden
*TODO lens is slow
*TODO fix grid view
count of hidden blocks is permanent chrome, not a tooltip

The single biggest UX risk of a filterable page: someone leaves a filter on, opens the page tomorrow, and concludes their notes are gone. Hidden count in the header, always. And the root lens's filter should default to per-visit (the summon rung), persisting only when explicitly pinned.

Third: the root lens may narrow, reorder and redraw — it may never move a block's home. Dragging inside a filtered or grouped page view writes keys (board) or the manual order key (river), never page_id, unless the drop target is another page's face. Same discipline as the grid's position problem.

5 · Where it genuinely doesn't hold

6 · Verdict

adoptThe page face is the root lens. Unfold the {filter} chip into a real lens line with a locked base. One grammar from page to region.
adoptViews are words in that line. grid/table/board/timeline/grain: at page level for free; Mod+\ becomes sugar for an edit.
neverA page's home is not a lens. The base stays literal; a page based on a query is a saved search and cannot own blocks.
guardRoot failure = full river, marked. Hidden count always visible. Root filters per-visit by default.

The satisfying part: this makes Lens Is Not a Container literally true at every level. The page is the container. The lens — including the root one — is only ever the window.

7 · Open