The loader collects every fail-fast defect and honors per-open skips
Phase 1 of the decision surface (01 ▸ Malformed input, settled
2026-07-31): BoardLoadFailure aggregates the walk's defects in walk
order — stop-at-first retires. Environmental failures (unreadable root,
not-a-directory) stay immediate single-defect throws: there is no walk
to collect from. A defective root index is recorded and the walk
continues into the children (nothing in the walk consults the parsed
root document — verified); a defective lane, card, or trash-entry index
records and skips its subtree, Re-check's whole-walk re-aggregation
being the designed loop for what hides beneath. load(skipping:) is the
per-open skip channel: a skipped path's item is omitted from the model
and surfaces as LoadWarning.userSkipped; root paths are unskippable by
construction. The reload-breakage banner carries the aggregate ("…and
N more"), single-defect sentences byte-identical to before. Two new
multi-defect fixture boards; suite 2591 green.
Claude-Session: https://claude.ai/code/session_01CqjXB7ASoWtbyoGod68k97
This commit is contained in:
+8
@@ -0,0 +1,8 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: card
|
||||
order: 1024
|
||||
title: Intact Card
|
||||
---
|
||||
Nothing wrong with this one. It is here so the broken sibling below is a *card* defect rather
|
||||
than the only thing in its lane.
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
---
|
||||
schema: 2
|
||||
kind: card
|
||||
order: 2048
|
||||
title: From A Newer Lanework
|
||||
---
|
||||
Defect #2: a schema newer than this app, below the root — the one `schema` rule the optional-key
|
||||
ruling left alone. Unfixable, so the surface offers only Skip.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: lane
|
||||
order: 1024
|
||||
title: Intact Lane
|
||||
---
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
---
|
||||
schema: 3
|
||||
kind: card
|
||||
order: 1024
|
||||
title: Hidden Behind The Broken Lane
|
||||
---
|
||||
Broken too, and deliberately *not* in the aggregate: its lane was skipped before this folder was
|
||||
ever listed. Fix the lane and the next walk reports this one.
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: lane
|
||||
order: 2048
|
||||
title: A Lane That Will Not Parse
|
||||
labels: [red, green
|
||||
---
|
||||
Defect #3: unparseable YAML — an unterminated flow sequence, the same shape
|
||||
`unparseable-yaml.kanban` uses one level up. The card below is never enumerated: a broken lane
|
||||
takes its subtree with it, and repair-then-re-check is what reveals what it was hiding.
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: card
|
||||
order: 1024
|
||||
title: Last Card
|
||||
---
|
||||
The walk reaches here, which is the point: a defect in an earlier lane does not end the walk.
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: lane
|
||||
order: 3072
|
||||
title: Also Intact
|
||||
---
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Many Defects
|
||||
created: 2026-07-31T09:00:00Z
|
||||
---
|
||||
The root's own `schema` is missing — the this-really-is-a-board gate, and defect #1.
|
||||
|
||||
The walk does not stop here: lanes are enumerated by folder shape, so everything below is still
|
||||
read and reported in the same aggregate.
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: card
|
||||
order: 1024
|
||||
title: Intact Card
|
||||
---
|
||||
Stays on the board whatever is skipped — a skip omits the item it names, never its siblings.
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
---
|
||||
schema: 2
|
||||
kind: card
|
||||
order: 2048
|
||||
title: From A Newer Lanework
|
||||
---
|
||||
Unfixable, so Skip is the only choice the surface offers for it. Skipped, the card leaves the
|
||||
board and this file stays on disk untouched.
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: lane
|
||||
order: 1024
|
||||
title: Intact Lane
|
||||
---
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: card
|
||||
order: 1024
|
||||
title: Perfectly Fine, Behind A Broken Lane
|
||||
---
|
||||
Nothing at all is wrong with this card. It is never in the snapshot regardless: its lane is either
|
||||
a defect or a skip, and both take the subtree.
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: lane
|
||||
order: 2048
|
||||
title: A Lane That Will Not Parse
|
||||
labels: [red, green
|
||||
---
|
||||
Unparseable YAML. Skipping it takes the whole lane out of the board — the intact card below
|
||||
included, which is the honest cost of the tolerance and why the notice names what left.
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: card
|
||||
order: 1024
|
||||
title: Last Card
|
||||
---
|
||||
Proof the walk kept going past the broken lane.
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
---
|
||||
schema: 1
|
||||
kind: lane
|
||||
order: 3072
|
||||
title: Also Intact
|
||||
---
|
||||
@@ -0,0 +1,11 @@
|
||||
---
|
||||
schema: 1
|
||||
title: Skippable Defects
|
||||
created: 2026-07-31T09:00:00Z
|
||||
---
|
||||
Every defect on this board is **below the root**, which is what makes it the skip channel's golden
|
||||
case: the root is never skippable, so a board whose only defects are skippable has to have an
|
||||
intact root.
|
||||
|
||||
Skip both and it opens — without the broken lane, without the newer-schema card, and without the
|
||||
perfectly good card that lives under the broken lane.
|
||||
+3
-1
@@ -26,7 +26,7 @@ Lane/card folder names are fixed literal lowercase-UUIDv4-shaped strings (never
|
||||
|
||||
## Malformed/ — one board per fail-fast case
|
||||
|
||||
Each board is minimal: one broken thing.
|
||||
Each board is minimal: one broken thing. The two multi-defect boards at the bottom are the deliberate exceptions — they exist precisely because the loader collects rather than stops (01-storage-format.md § Malformed input, settled 2026-07-31), which is a claim no one-broken-thing board can make.
|
||||
|
||||
| Board | Case |
|
||||
|---|---|
|
||||
@@ -34,5 +34,7 @@ Each board is minimal: one broken thing.
|
||||
| `missing-schema.kanban` | Board root `index.md` has no `schema` key — the **root only**; below it a missing `schema` reads as 1 (`Valid/optional-keys.kanban`). |
|
||||
| `schema-newer-than-app.kanban` | Board root `schema: 2`, newer than `BoardLoader.supportedSchema`. |
|
||||
| `board-root-missing-index.kanban` | The board root folder itself has no `index.md`. |
|
||||
| `many-defects.kanban` | **The collect-all board.** A root with no `schema`, a card with `schema: 2`, and a lane whose frontmatter will not parse — three fail-fast classes on one board, reported as one `BoardLoadFailure` in walk order (root, then lanes by folder name with their cards inside them). The broken lane also holds a broken card, which is deliberately **not** in the aggregate: a broken lane takes its subtree with it, and the repair's re-check is what reveals what it was hiding. Two further lanes load fine, which is what proves the walk kept going. |
|
||||
| `skippable-defects.kanban` | **The skip channel's board.** `many-defects.kanban` minus the root defect — the root is never skippable, so a board whose defects are all skippable must have an intact root. Skip both (the newer-schema card and the unparseable lane) and it opens: without them, without the broken lane's own perfectly valid card (the subtree goes too), and with a `LoadWarning.userSkipped` per skip as the loud mark the opened board's notice is written from. |
|
||||
|
||||
The four `order` boards that used to live here — `missing-order-lane`, `missing-order-card`, `explicit-null-order`, `non-numeric-order` — were retired on 2026-07-31, when `order` became optional below the board root. Their shapes all live on in `Valid/optional-keys.kanban` as coercion cases.
|
||||
|
||||
Reference in New Issue
Block a user