LifeLab · summoning & lenses

Summon a set, refine it with a lens, name the lens

Vocabulary: every name denotes a set of blocks. A page is the set that lives there; a tag is the set marked so; a lens is a saved refinement (filter + sort + render) over any set. ![[ summons named sets — never syntax. The funnel on any region header refines it in place. Naming a refinement files it under lens/, which makes it summonable. The word "query" never appears.

Same name, two sets

project/lifelab the page vs :project/lifelab: the tag — both complete, one arrow-key apart, counts + badge say which contract you get.

Tags get a face

Summoning a tag renders a computed region — Logseq's tag-page, done honestly: badge, provenance, no fake ownership.

Funnel, not grammar

Filtering is direct manipulation on the region header. Date values complete from vocabulary with resolved ranges — never enumerate 50 years of data.

Name closes the loop

Refined region → lens/lifelab-now → appears in the picker like any page. Delete a lens, lose a lens — samples untouched.

1SUMMON

![[lifelab — page, tag, and union, one arrow-key apart

The picker completes named sets: pages (lives-there), tags (marked), lenses (saved refinements), and the union row when both exist for one name. Kind badges carry the contract — page summons referenced, tag summons computed. Counts come from the small property index, never a scan.

2026-07-12

[all] · [page] 2 · :project/lifelab: 4

*planning sunday
reviewing the week. ![[lifelab
![[ lifelab 6 sets match
pages · blocks that live there
project/lifelab page 31 blocks · 3 subpages
project/lifelab/mcp page 6 blocks
tags · blocks marked so
# :project/lifelab: tag 23 blocks · across 6 pages
combined
project/lifelab — lives-there or tagged union 42 distinct
lenses · saved refinements
none yet — refine a region, then name it
summon ,add another esccancel badge = what the × will mean
ijournal/2026-07-12 summon · names only
a page and a tag can share a name — they are different sets; the badge says which
2THE TAG'S FACE

:project/lifelab: as a region — computed, honest

Page region above (yesterday's ![[project/lifelab]]): page order, ghost-add writes there. Tag region below: provenance groups, no fake ownership — add is born matching (tag pre-applied, homed to journal/today). Both carry the funnel icon; both × to close the window.

2026-07-12

[all] · [page] 3 · :project/lifelab: 4

[-] project/lifelab page · referenced 31 blocks · page order ⋎ filter ×
*TODO ship lens spec:project/lifelab:
* max runtime notes — python sandboxing
+ Add to project/lifelab
[-] :project/lifelab: tag · computed 23 blocks · 6 pages ⋎ filter ×
journal/2026-07-112
*TODO wire sql views for tags + links:sql:
* notes on region badge copy
journal/2026-07-051
*TODO benchmark wasm sqlite on mobile
+ New block → journal/today · :project/lifelab: applied
njournal/2026-07-12 referenced + computed
same name, two contracts. page: order + write-home are the page's · tag: membership is the mark
3THE FUNNEL

Refine in place — dates complete from vocabulary, resolved live

Funnel open on the tag region: todo chip already on, when: completing. Values are words and arithmetic, not data — each row shows its resolved range so "next week" can never disagree with you silently. org's +2w vocabulary, with the range operator org never had. An unsaved lens pill appears the moment the region diverges from the bare set.

2026-07-12

[all] · [page] 3 · :project/lifelab: 4

[-] :project/lifelab: tag · computed unsaved lens 23 → 7 ⋎ filtering ×
todo× when: + sort · group · render
when: -3w
arithmetic · d w m y · .. for ranges, ends may stay open
-3w.. Jun 21 → now 6 of current
-3w..-1w Jun 21 – Jul 5 3
words
this-week Jul 6 – Jul 12 4
next-2w Jul 13 – Jul 26 2 reminders land
2026-07 whole month, anchored 9
also: remind:overdue ≡ remind:..yesterday + still todo -- accepted as .. (org habit)
*TODO wire sql views for tags + links:sql: Jul 11
*TODO benchmark wasm sqlite on mobile Jul 5
njournal/2026-07-12 funnel · 7 match · lens unsaved
when: -3w..resolves to Jun 21 → now — shown before you commit. task chips: todo · done · -task (no marker)
4NAME IT

lens/lifelab-now — and the picker learns a new name

Naming files the refinement under lens/: source (:project/lifelab:) + chips (todo, when:-3w..) + shape. The region header now shows the lens name; the same picker from frame 1 now completes it — the loop closes with zero new syntax. Deleting the lens deletes a lens; the 7 blocks never notice.

2026-07-12

[all] · [page] 3 · :project/lifelab: 4

[-] :project/lifelab: todo when:-3w.. 7 blocks
name lens lens/lifelab-now ↵ save · esc keep unsaved
![[ lifelab 7 sets match
lenses · saved refinements
lens/lifelab-now lens :project/lifelab: · todo · -3w.. → 7
pages
project/lifelab page 31 blocks
tags
# :project/lifelab: tag 23 blocks
summon a lens is a name now — journals, other pages, MCP can all summon it
njournal/2026-07-12 lens/lifelab-now saved
saved lens/lifelab-now. source + chips + shape · delete the lens, samples untouched

The whole system in one sentence: names denote sets (page = lives-there, tag = marked, lens = saved refinement), ![[ summons any named set as a region with an honest badge, the funnel refines any region in place with chips whose date values resolve visibly, and naming a refinement mints a new summonable name. No query language ever appears in markdown — the entry line's grammar (frames in Entry Line — Metadata Facets) exists only inside pickers and funnels, where completion carries it.