Space in Finder opens the board — a Quick Look preview extension that outlines a .kanban package

A board is a folder, and a folder previews as a folder. `KanbanQuickLook.appex` gives it a
document's preview instead: the board's name, its tint and its symbol, then its lanes in display
order with each one's card count and its first few card titles.

The reading is `BoardOutline` (Kanban/Storage), deliberately not `BoardLoader.load`. The loader
throws on a half-broken board — right for opening one, wrong for pressing Space, where the honest
answer is the part that reads; it visits every card and lists `attachments/` and counts `comments/`
inside each; and it carries trash, tombstone migration and the defect stream, none of which renders.
This walk never throws and is capped at every level (`BoardOutlineLimits`): 12 lanes shown of at
most 100 considered, 6 card titles per lane of at most 200 parsed, counts by readdir-plus-stat up to
2000 per lane and never a parse. It re-derives nothing that decides *what* the answer is —
`FrontmatterDocument` parses, `IntegrityRules.isIdentityShaped` says what a lane or a card is,
`BoardLoader.directoryCandidates` supplies the stray tolerance, `Ranks` supplies display order,
`Palette` resolves colours — only *how far to look*.

The reply is HTML, the one data-based reply that reflows: a Quick Look panel is resized by the
user and a board outline is a wrapping row of columns, so a drawing block baked at a fixed
`contentSize` would be the wrong size a moment later. It gets vector text, its own scrolling and
light/dark for free. The board tint is a wash under the title and a lane's edge accent — never
under text, because a preview has none of `ContrastMath`'s ink-picking machinery and should not
grow one.

The extension compiles `Kanban/Storage` whole, the `KanbanMobile` arrangement — the directory is
one unit in practice, so a narrower list is not on offer. `STORAGE_ONLY` is new: EchoLedger's
consumer sections speak the live store's vocabulary, and the phone's `#if os(macOS)` cannot exclude
them from a target that *is* macOS. Platform, and layer. Nothing else defines it.

Claude-Session: https://claude.ai/code/session_014PtZdPwqZuqEDLc6wZMtEy
This commit is contained in:
2026-08-09 02:37:10 -04:00
parent da5d310673
commit b18f7ca609
8 changed files with 1260 additions and 2 deletions
+17 -2
View File
@@ -433,7 +433,10 @@ public final class EchoLedger: Sendable {
// here speaks `CommentPath` (LiveStore's comment-thread vocabulary), and its one caller is
// the Mac store's comment reload. The phone's writers stamp comment receipts identically;
// nothing on the phone retires them yet.
#if os(macOS)
//
// `STORAGE_ONLY` is that same gate one axis over see the verdicts section below, which states
// it in full.
#if os(macOS) && !STORAGE_ONLY
func vouchedComments(inCard cardFolder: URL, cardPath: String) -> Set<ItemID> {
let root = Self.key(cardFolder)
let paths = receiptPaths(under: root)
@@ -554,7 +557,19 @@ extension EchoLedger.Receipt {
// phone records receipts through the surface above (BoardWriter stamps identically on every
// platform); its metadata-query observer has no verdict surface yet, and when it grows one this
// gate is the seam it lands behind.
#if os(macOS)
//
// **`STORAGE_ONLY` is the same seam on a second axis** (added 2026-08-09 with the Quick Look preview
// extension, project.yml KanbanQuickLook): `os(macOS)` says which *platform* compiles this, and
// that flag says which *layer* does. A target that wants the storage engine and nothing above it
// a preview extension, and any importer or tool that follows compiles `Kanban/Storage` whole,
// because the directory is one unit in practice (`FrontmatterDocument` `IntegrityRules`
// `BoardLoader`/`BoardWriter` this file's recording surface). What it cannot compile is *this*
// section, which reaches back up into the live store; without the flag the whole of `Kanban/LiveStore`
// would have to come with it, which is the tail wagging a read-only preview.
//
// Nothing in the app or the phone defines it, so both are unchanged by construction: the flag only
// ever *subtracts*, and only from a target that has no caller for any of it.
#if os(macOS) && !STORAGE_ONLY
/// One landing reload's provenance answers, in the two shapes the announcer needs.
public struct EchoVerdicts: Sendable, Equatable {