docs(legibility): write docs/GLOSSARY.md disambiguating overloaded terms (DOC-3) #434

Closed
opened 2026-05-05 21:07:03 +02:00 by marcel · 1 comment
Owner

Part of #394 (Epic 2 — Documentation). Rubric check: C3.3 (Critical).

Problem

The codebase contains terms whose meanings are non-obvious or domain-specific. Without a glossary, Anja's first wrong assumption is that Person and AppUser are the same entity — a mental-model failure that propagates through every later question (e.g. "can a Person log in?" — no, only AppUsers can). Per Markus and Nora, several other terms (Geschichte, TranscriptionBlock, OcrJob family, Permission enum values) cause similar confusion.

Scope

  1. Create docs/GLOSSARY.md.
  2. Required entries (each: one-paragraph definition + cross-reference to source code as path/file.java:42):
    • PersonAppUser — historical letter actor (no login, possibly deceased) vs. application user account. This is the most-confused distinction.
    • Geschichte — rich-text family story tied to one or more documents/persons; not the generic German word for "history."
    • TranscriptionBlock vs. DocumentVersion — positional OCR output (one block per region) vs. file revision (a different concept entirely).
    • OcrJob vs. OcrBatchService vs. OcrAsyncRunner — the three "OCR" classes serve different roles; documenting them prevents misuse.
    • SenderModel — per-person OCR fine-tune profile.
    • Permission enum values — what each grants vs. excludes:
      • READ_ALL — read all documents (whether the user can read this domain at all).
      • WRITE_ALL — modify all documents.
      • ADMIN — global admin (highest).
      • ADMIN_USER — manage users + groups (subset of ADMIN scope).
      • ADMIN_TAG — manage tags only.
      • ADMIN_PERMISSION — manage roles/permissions only.
    • Conversation — Tier-2 view layer over Document sender/receiver; no entity, no table (per Boundary decisions D-FE-3 / Canonical Domain Set).
    • Activity — Tier-2 view layer over Audit + Notification + Document events; no entity, no table.
    • Tag vs. Label — UI labels in German (Etikett) vs. data-layer entity (Tag).
    • Document lifecyclePLACEHOLDER → UPLOADED → TRANSCRIBED → REVIEWED → ARCHIVED (each state defined; what triggers the transition).
  3. Linking: GLOSSARY.md is linked from README.md (DOC-1) and docs/ARCHITECTURE.md (DOC-2).

References

  • Parent: epic(legibility): documentation — make the codebase self-explaining (#394)
  • Rubric: C3.3 (Critical)
  • Canonical Domain Set + Boundary decisions D-OQ-1..8, D-FE-1..4 (#387 first comment)
  • Source-code anchors:
    • backend/src/main/java/org/raddatz/familienarchiv/person/Person.java, user/AppUser.java
    • backend/.../document/Document.java, document/DocumentStatus.java
    • backend/.../document/transcription/TranscriptionBlock.java
    • backend/.../security/Permission.java

Acceptance criteria

  • docs/GLOSSARY.md exists.
  • All 10 entries above present, each with definition + source-code reference.
  • Anja-persona test: stranger correctly answers "Can a Person log in?" → No. "What does Conversation map to in the database?" → No table; it's a view layer.
  • GLOSSARY linked from README.md and docs/ARCHITECTURE.md.
  • Rubric C3.3 PASS verified by reviewer.

Definition of Done

GLOSSARY.md is on main with all 10 entries. Rubric C3.3 PASS.

Part of #394 (Epic 2 — Documentation). Rubric check: **C3.3 (Critical)**. ## Problem The codebase contains terms whose meanings are non-obvious or domain-specific. Without a glossary, **Anja's** first wrong assumption is that `Person` and `AppUser` are the same entity — a mental-model failure that propagates through every later question (e.g. "can a Person log in?" — no, only AppUsers can). Per Markus and Nora, several other terms (`Geschichte`, `TranscriptionBlock`, `OcrJob` family, `Permission` enum values) cause similar confusion. ## Scope 1. Create `docs/GLOSSARY.md`. 2. **Required entries** (each: one-paragraph definition + cross-reference to source code as `path/file.java:42`): - **`Person` ≠ `AppUser`** — historical letter actor (no login, possibly deceased) vs. application user account. This is the most-confused distinction. - **`Geschichte`** — rich-text family story tied to one or more documents/persons; not the generic German word for "history." - **`TranscriptionBlock` vs. `DocumentVersion`** — positional OCR output (one block per region) vs. file revision (a different concept entirely). - **`OcrJob` vs. `OcrBatchService` vs. `OcrAsyncRunner`** — the three "OCR" classes serve different roles; documenting them prevents misuse. - **`SenderModel`** — per-person OCR fine-tune profile. - **`Permission` enum values** — what each grants vs. excludes: - `READ_ALL` — read all documents (whether the user can read this domain at all). - `WRITE_ALL` — modify all documents. - `ADMIN` — global admin (highest). - `ADMIN_USER` — manage users + groups (subset of ADMIN scope). - `ADMIN_TAG` — manage tags only. - `ADMIN_PERMISSION` — manage roles/permissions only. - **`Conversation`** — Tier-2 view layer over Document sender/receiver; **no entity, no table** (per Boundary decisions D-FE-3 / Canonical Domain Set). - **`Activity`** — Tier-2 view layer over Audit + Notification + Document events; **no entity, no table**. - **`Tag` vs. `Label`** — UI labels in German (`Etikett`) vs. data-layer entity (`Tag`). - **Document lifecycle** — `PLACEHOLDER → UPLOADED → TRANSCRIBED → REVIEWED → ARCHIVED` (each state defined; what triggers the transition). 3. **Linking**: GLOSSARY.md is linked from `README.md` (DOC-1) and `docs/ARCHITECTURE.md` (DOC-2). ## References - Parent: #394 - Rubric: **C3.3 (Critical)** - Canonical Domain Set + Boundary decisions D-OQ-1..8, D-FE-1..4 (#387 first comment) - Source-code anchors: - `backend/src/main/java/org/raddatz/familienarchiv/person/Person.java`, `user/AppUser.java` - `backend/.../document/Document.java`, `document/DocumentStatus.java` - `backend/.../document/transcription/TranscriptionBlock.java` - `backend/.../security/Permission.java` ## Acceptance criteria - [ ] `docs/GLOSSARY.md` exists. - [ ] All 10 entries above present, each with definition + source-code reference. - [ ] **Anja-persona test**: stranger correctly answers "Can a Person log in?" → No. "What does `Conversation` map to in the database?" → No table; it's a view layer. - [ ] GLOSSARY linked from `README.md` and `docs/ARCHITECTURE.md`. - [ ] Rubric **C3.3 PASS** verified by reviewer. ## Definition of Done GLOSSARY.md is on `main` with all 10 entries. Rubric C3.3 PASS.
marcel added this to the Codebase Legibility milestone 2026-05-05 21:07:03 +02:00
marcel added the P0-criticaldocumentationlegibility labels 2026-05-05 21:07:09 +02:00
Author
Owner

Duplicate of #397. I created this in error before noticing #397 already existed. #397 carries the persona reviews and per-child Decision Queue; closing this in favor of the existing issue.

**Duplicate of #397.** I created this in error before noticing #397 already existed. #397 carries the persona reviews and per-child Decision Queue; closing this in favor of the existing issue.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: marcel/familienarchiv#434