5 hidden by lens — “MCP test” (done May 15) among them · clear chips to show
LifeLab · lens syntax
The lens is text in the block; chips are how that text renders when your cursor is elsewhere. Same dual-mode trick CodeMirror already plays with ![[: cursor outside the span → widget; cursor inside → raw characters. Chips aren't a second system that could drift from the syntax — every chip click is a macro that edits the text, so grep, sync, MCP, and copy-paste all see one truth.
anatomy — the mapping is the lesson
▲ rendered (cursor elsewhere) · each chip ↔ one token below · ▼ source (cursor inside)
Grammar = the completable set, nothing more: bare closed words (todo · done · -task), self-delimiting :tags:, keyed only where two fields collide (when: remind:) or rare (sort: group: render:). Space = AND, - = NOT — web-search folk syntax.
Your real ![[mcp]] face (river + LINKED), lens applied. Chips sit on the region header: hover shows the ×, the date chip carries its resolved range, the ghost ⋎ + adds. Sections report shown of total — filtering never pretends blocks don't exist.
5 hidden by lens — “MCP test” (done May 15) among them · clear chips to show
Click into the header (or ↵ on it) and the widget de-renders to the line as it lives in the block. The {…} span completes exactly like the picker and the funnel — one grammar, one engine. The region below keeps previewing live per keystroke; you are never editing blind.
cursor inside {…} — widget de-rendered to source · esc or click out to re-render
Top: × on the todo chip literally deletes five characters — shown as the diff it is. Bottom: clicking the date chip's body opens its swap menu (resolved ranges, counts), and the last row of every chip menu is edit as text — the bridge is advertised, not hidden. Nothing a chip does is unavailable to a keyboard or an MCP agent.
a · × on a chip = character deletion
undo is text undo — Mod+Z restores the five characters
b · chip body = swap menu · last row is always the bridge
Why both faces earn their keep:
chips → recognition, visibility of state, safe one-tap edits (mobile);
text → composability, copy-paste sharing, grep, agents, speed past ~3 terms;
and because chips are text edits, there is no builder-vs-code cliff to fall off — the Dataview failure, closed.
The invariant: chips and syntax are projections of one string in one block. Chip clicks are macros over character edits (undo = text undo); the completion engine is shared by picker, funnel, and raw {…} editing; and if a term can't be completed it isn't grammar. Stored lenses stay free: the line is the lens — copy it, transclude the block that holds it, or shelve it on a lens/ page when it earns a name.