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:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user