Files from Finder land on the board per 04-interactions.md § Drag & drop:
- Dropped on a card, they copy into its attachments/ (any type, multi-file),
the face highlighting while hovered; the hovered card is resolved by
hit-testing the same analytic masonry frames the card zones are built
from, so attach-beats-create adds no drop region and cannot drift from
the dispatch.
- Dropped on lane empty space, one card per file — filename minus extension
as the title (a blank stem omits the key), fresh GUID, rank at the drop
position through the ordinary insertion machinery, the file attached —
all in one bracket; a failed import removes the just-minted card, so
creating-then-abandoning never leaves an empty card behind.
- Every board drop surface now declares .fileURL beside the two board
types (the single-target-dispatch rule); tombstoned surfaces are inert;
file sessions ride a distinct session mode with their own watchdog and
no hysteresis, leaving the board-drag machinery untouched.
- Also: four empty fixture directories pinned with .keep files so git
preserves them, and a test-only visibility fix in DragSessionTests.
811 unit tests (12 new).
Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
18 golden fixture boards as real on-disk trees under Fixtures/ — ten
valid/tolerated cases (rich board, interrupted create, non-UUID strays,
stray files, tombstones, tie-breaks, unknown-key order, coercion,
last-wins duplicates, board-level deleted) and eight fail-fast cases,
each pinned to its exact error reason and path; the rich board's whole
tree round-trips byte-identically. Pins two contract subtleties now
recorded in the design: tombstone flags are not inherited (renderers
walk ancestors) and last-wins resolves before order strictness. README
gains the storage-foundation feature entry. 146 tests total.
Claude-Session: https://claude.ai/code/session_018BjQRYBR6jQja3jCRi5S3A