docling-studio/document-parser/domain
Pier-Jean Malandrino 648f2a5c0d feat(#205): promote chunks to first-class entities + audit trail
The data and domain layers for the chunks editor (#219-224 in 0.6.0).
Chunks were previously stored as a JSON blob in analysis_jobs.chunks_json;
this commit makes them first-class persisted entities with stable IDs,
soft-delete, and an immutable audit log.

Domain
- Chunk: persistent entity with id, document_id, sequence, text,
  headings, source_page, bboxes, doc_items, token_count, timestamps,
  deleted_at (soft delete)
- ChunkEdit: immutable audit row (action, actor, at, before, after,
  parents, children, reason)
- ChunkPush: snapshot of which chunk_ids landed in which store at push
- ChunkEditAction enum: insert/update/delete/merge/split
- domain/chunk_editing.py: pure operations on a chunkset (insert,
  update, delete, merge, split). Each returns a new chunkset and the
  affected chunk(s); errors raise ChunkEditingError.

Persistence
- Three new tables: chunks, chunk_edits, chunk_pushes (FK + indexes)
- SqliteChunkRepository (insert, insert_many, update, soft_delete,
  find_for_document, find_by_id; respects deleted_at)
- SqliteChunkEditRepository (append-only audit log; paginated reads
  ordered newest-first; per-chunk history)
- SqliteChunkPushRepository (per-(doc, store) latest snapshot)

Ports
- ChunkRepository, ChunkEditRepository, ChunkPushRepository protocols
  added to domain/ports.py

Tests
- 17 tests for the pure chunk-editing operations covering insert /
  update / delete / merge / split, sequence shifts, lineage, error
  paths (out-of-range, missing id, deleted target, cross-document)
- 11 tests for the three repositories: round-trips, soft-delete
  filtering, history ordering, lineage round-trip, cascade-delete with
  document, find_latest semantics

Service orchestration (ChunkEditingService — atomic chunk + audit
write) and the API endpoints land in a follow-up commit on the same
feature branch / next release. The data + domain foundation here is
what unblocks #219-224.

Refs #205
2026-05-05 09:38:39 +02:00
..
__init__.py Radical architecture change, migration to a more lightweight 2026-03-17 16:06:27 +01:00
chunk_editing.py feat(#205): promote chunks to first-class entities + audit trail 2026-05-05 09:38:39 +02:00
events.py feat(#202): introduce Document lifecycle state machine 2026-05-05 09:38:39 +02:00
exceptions.py feat(#202): introduce Document lifecycle state machine 2026-05-05 09:38:39 +02:00
hashing.py feat(#204): deterministic chunkset hash for auto-stale detection 2026-05-05 09:38:39 +02:00
lifecycle.py feat(#202): introduce Document lifecycle state machine 2026-05-05 09:38:39 +02:00
lifecycle_aggregation.py feat(#203): per (document, store) ingestion state 2026-05-05 09:38:39 +02:00
models.py feat(#205): promote chunks to first-class entities + audit trail 2026-05-05 09:38:39 +02:00
ports.py feat(#205): promote chunks to first-class entities + audit trail 2026-05-05 09:38:39 +02:00
services.py fix(arch): inject repositories and extract domain logic 2026-04-10 11:44:33 +02:00
value_objects.py feat(#205): promote chunks to first-class entities + audit trail 2026-05-05 09:38:39 +02:00
vector_schema.py feat(domain): add VectorStore port and SearchResult value object 2026-04-10 20:40:17 +02:00