← All posts

One list, and a Search you can read

Search, Needs you, Artifacts and Learnings now render the same row. Search lost its form-and-cards layout for a one-line header, a single filter row that measures itself and folds what does not fit into a working dropdown, and a document detail page you can open, read and ask about. Release notes 2026-09-16 — vocion-core#339.

Vocion Teamvocion-v2.88.0

Status: shipped. #339, commit 2adabee9, cut as v2.84.0. No migrations, no environment variables, no flag — this shipped to every surface at once. Part of Vocion 2.88. The archetypes behind it are in A pattern library for list, detail and ledger, written when this work was still on a release branch.

Four pages in the dashboard are lists of records with a title, a line of context, a number or two, a status and some verbs. Until this release, four pages implemented that four times.

One row

Search, Needs you, Artifacts and Learnings all render the same row component now — along with the personalization queue, which came along in the same pass. One title, one subline whose segments are joined for you and whose empty segments simply vanish, right-aligned columns from a fixed width table so a score in one list lines up with a score in another, one always-visible chip for state, and verbs that appear on hover and on keyboard focus — and are always visible on touch, because hover is not a thing you can do with a thumb.

Rows are 44 pixels tall at minimum, which is the size of a fingertip rather than the size of a line of text.

One detail worth knowing, because it is the sort of thing that quietly breaks a page: a row that both navigates and carries verbs cannot put the verbs inside its link. A button nested in an anchor is invalid markup and the click navigates instead of acting. So the link covers the record and the verbs sit beside it.

And the duplicate is gone. There was a second row component in the codebase — a navigational row written for catalogue pages, with its own props and a hard-coded chevron — and it was deleted rather than left importable. (The pull request also describes deleting a second chip implementation; in the merged history that chip was introduced and removed within this same change, so the honest count is one pre-existing duplicate removed, not two.)

Search stopped looking like a form

The Search page used to be a bordered form with a submit button, a wrapping row of pill links that spilled onto a second line as soon as a workspace had a few connectors, and one bordered card per result with the word score printed under a number.

It is now:

The filter row measures itself

This is the small thing that makes the page feel finished. The chip row renders an invisible copy of itself, measures the real width of every chip and of the overflow control, watches the container for resize, and decides how many actually fit.

What does not fit is not dropped and not scrolled off the edge. It collapses into a +N more dropdown where every hidden filter is still a working checkbox, still showing its count. And the order is arranged before the cut: All is pinned first, then the filters you have turned on, then the rest — so a chip you have selected is never the one that gets hidden.

A document you can actually open

Search results used to be a destination with nowhere to go. There is a document detail page now.

It shows the document's title and connector, when it was modified, how many chunks are indexed, and a link out to the original. The body is the indexed chunks, joined in order — which is deliberate, because that is exactly what retrieval reads. If the page looks thin, that is the honest answer to "why didn't the agent find this?". Down the right: the source, the ingestion details, and up to eight metadata fields.

Permissions are not decoration here. A document another organisation owns, or one whose source your own access does not reach, is a 404 rather than a redacted page.

Ask about this

The detail page carries Ask about this, the same control the briefing has. It opens the conversation rail with the document attached as context — it does not put words in your mouth, because the composer is left empty and only the record goes along with it.

Highlight a passage in the body and you get a floating pill over the selection that opens the same surface with the passage quoted, which is the shorter path to "what does this paragraph mean for us?".

Written down, and honest about what is left

The pattern library that came with this is documentation — three archetypes, their anatomy, and a rule that a new page renders its rows through the shared row component or its pull request says why not. Nothing in the build enforces it; the rule lives in the repo's contributor instructions and in the reviewer's hands.

The document also carries a dated audit of every list in the dashboard and where it stands, which is the part worth reading if you are wondering how much of this you will actually see. Still owed: Conversations, Activity, Briefings, the Skills / Tools / Models catalogues, the Teams / Agents / Missions / Workflows / Objects / Evals / Automation pages, Members — and Connectors, which is named as the largest single migration left because it is one 2,800-line component.

Deliberately left as tables: the team report roster and the adoption, autonomy and automation matrices. Those are matrices with sortable columns, not queues of records, and forcing them into a row would be worse.

Four surfaces down, then. The list is long and it is written down, which is more than it was yesterday.

Where this lives