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:
2026-08-01 09:12:49 -04:00
parent 94e60cd444
commit ba1726fa77
35 changed files with 897 additions and 117 deletions
@@ -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.
@@ -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
---
@@ -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.
@@ -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.