The in-browser pixel-render fixture test was green locally but flaky in CI: the real pdf.js worker could not fetch /pdfjs-wasm/ in the CI Chromium container, so the CCITT canvas stayed blank (0 sampled pixels) and failed the suite — green locally, red in CI, root cause not locally reproducible. A flaky gate is worse than none. This bug is a build/serve parity failure, so guard it deterministically where it actually breaks: a postbuild assertion that jbig2.wasm and openjpeg.wasm shipped into build/client/pdfjs-wasm/ (non-empty). It runs after `npm run build` — including the Docker build stage — and fails the build loudly if a future pdfjs bump makes the static-copy glob match nothing. Combined with the getDocument(wasmUrl) unit guard and the negative-path render test, the regression is covered without CI flake. Addresses re-review: Tobias (no automated parity check), Sara (pixel test not pinned). Render-decode correctness verified manually via `node build` serving /pdfjs-wasm/jbig2.wasm as application/wasm. Refs #708 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
document (frontend)
UI for the archive's core concept: viewing, uploading, editing, searching, bulk-selecting, and transcribing documents.
What this domain owns
Components: DocumentRow, DocumentThumbnail, DocumentTopBar, DocumentViewer, DocumentMetadataDrawer, DocumentEditLayout, DocumentStatusChip, UploadZone, BulkSelectionBar, BulkDropZone.
Utilities: search.ts (search-param helpers), filename.ts (filename formatting), documentStatusLabel.ts (i18n label mapping), validateFile.ts (upload validation), groupDocuments.ts (list grouping).
Sub-folders: annotation/, transcription/, viewer/.
What this domain does NOT own
- Person typeahead —
person/PersonTypeahead.svelte(cross-domain import, allowed by ESLint rule) - Tag input —
tag/TagInput.svelte(cross-domain import, allowed) - Shared discussion —
shared/discussion/(comment/mention editor)
Key components
| Component | Route used in | Notes |
|---|---|---|
DocumentRow.svelte |
/ (search results), admin queues |
Compact document card with thumbnail |
DocumentViewer.svelte |
/documents/[id] |
PDF/image inline viewer |
DocumentEditLayout.svelte |
/documents/[id]/edit |
Full edit form with sticky save bar |
UploadZone.svelte |
/documents/new, bulk upload |
Drag-and-drop file drop area |
BulkSelectionBar.svelte |
/documents bulk mode |
Multi-select action bar |
Cross-domain imports
person/PersonTypeahead.svelte— sender / receiver selectiontag/TagInput.svelte— tag chip inputocr/OcrProgress.svelte— job status indicator in the document headershared/primitives/BackButton.svelte,shared/discussion/— shared UI
Backend counterpart
backend/src/main/java/org/raddatz/familienarchiv/document/README.md