DB: Absorb() merges body (newline-separated), unions tags, demotes crystallized sources, soft-deletes source. Rejects crystallized targets. API: POST /api/entities/:id/absorb { source_id } CLI: nib absorb <target> <source> with prefix ID resolution Web: absorb button on fluid entities, 'a' keyboard shortcut, source picker modal
Foundation layer: entities table with card support, entity_tags join table, WAL mode, busy_timeout, full CRUD operations including promote/demote lifecycle and soft/hard delete. 33 tests passing.