Architecture cleanup · First working slice

One view.
Several ways to work.

A resource view is more than its renderer. Keep its controls, metadata, fields, and commands together—then give each client a useful way to present them.

One named view supplies a query, fields, and commands to browser, CLI, and TUI adapters. NAMED RESOURCE VIEW inbox-thread-review query · fields · commands · composition BrowserCLITUI panels + renderersflags + snapshotskeys + live lists Same meaning. Client-specific presentation.
Shared contracts are working. This report supplies demo adapters; application-wide and native terminal wiring is the next step.

Interactive contract demonstration

Take the same view somewhere else.

Actual headless modules

Expand a conversation, select an API or terminal branch, then collapse it or change clients. The same message IDs, nested relationships, and selected members travel through every presentation.

Query …
Two real API-projected fixture conversations with eight nested messages. Local demo actions do not change live Coleo data.

A portable relationship and selection model

A branch is a relationship, not a renderer trick.

Mail thread API + shared tree model
Delivery blueprint review
└─ Root message from Tim
   ├─ API branch: scoped paging
   │  └─ Verify partial sources
   └─ Terminal branch: one named view
      └─ TUI visibility

Handoff conversation
└─ Root handoff note
   └─ CLI: export the tree
      └─ TUI: keyboard groups
  • Relationships come from the API. Message-ID, In-Reply-To, and References establish actual parent links; input order and neighboring rows do not.
  • Focus, expansion, and selection are separate. A collapsed branch keeps selected descendants. Mixed checkboxes describe partly selected groups.
  • Selection is an explicit snapshot. A branch selects loaded member IDs, including hidden descendants. New replies remain unselected. Query-scope changes clear selection; sorting and client changes preserve it.
  • Coverage stays visible. Unknown children and missing parents are represented explicitly. A complete loaded group is not a promise about future messages.

Thread fixtures are loaded through GET /api/mail/threads. Branch membership is also verified through the revision-guarded selection API.

Failure semantics you can exercise

Unavailable doesn’t mean empty.

Working reconciliation function

Lose a source, and its last loaded section remains visible in that query—including its reply relationships and selected descendants. Confirm the source is genuinely empty, and the old rows disappear. Counts are marked incomplete during an outage.

Mail is healthy. These buttons feed fixture snapshots through the real reconciliation contract.

The experiment uses local fixture snapshots, not a live Maildir or WebSocket disconnect. Socket recovery and fetch scheduling are still a delivery gate.

Eight root resources, including two conversations. Retaining a thread retains its attached hierarchy; nested messages do not become independently paged roots.

Measured on an isolated, migrated SQLite fixture

The first fix changes what you can reach.

Current Hono endpoint
57532

records reached by cursor paging

Before: take a short source prefix, then apply the cursor. Older items disappear from traversal.

Now: apply visibility and cursor boundaries before the limit, then merge in a consistent order.

0 duplicate IDs25 records per page
Cumulative records reached
Old prefix algorithmFixed endpoint
525 blocked tasks + 7 status reports. The blue series is generated by calling the current endpoint. The orange series reproduces the recorded pre-fix algorithm over the same fixture. This is a correctness proof, not a latency benchmark.
…focused tests passed
…assertions
Checkedserver + browser TypeScript
Portableself-contained offline report

One named definition, several adapters

The hierarchy is in the definition.

This named view declares initial expansion and loaded-descendant selection alongside both toolbars, optional metadata, and presentation choices. Valid JSON edits update the local preview; invalid bindings keep the last valid definition active.

inbox-thread-review · resolved definition
Valid definition. Local preview is active.
Inspect the active normalized query, fields, and capability decisions

A foundation with a clear next boundary

From this slice to a shared workbench.

Working now

Contracts + correctness

Query normalization and projection. View validation. Capability fallbacks. Partial-source reconciliation. Durable Inbox paging.

Next API slice

One Messaging projection

Mail threads and retained event adapters. Source freshness, scoped counts, and continuation boundaries through the existing endpoint.

Next client slice

Web recovery + terminal proof

Ordered refresh, socket-only reconnect tests, named-view API resolution, and actual CLI/TUI consumers.

Broader blueprint delivery

Author and ship a workflow

File authority, source-preserving visual editing, schema migrations, editor assistance, and independently configured panels.

Reading the demo correctly

The paging fix is running API code. Query, projection, validation, and reconciliation are imported production modules. Browser grids/cards/timelines and CLI/TUI screens here are lightweight HTML demo adapters—not a claim that the application or native terminal rewrite is complete.