feat(callouts): codec, front matter, collaboration, checker, tests (#1824) #1832

Merged
brenno merged 2 commits from feat/image-callouts-1824 into main 2026-08-28 11:52:43 +00:00
Owner

Summary

De volledige ketting voor image callouts (issue #1824), de eerste stap van het ontwerp in docs/design/IMAGE_CALLOUTS.md (rev 4):

  • Typed slide modelCalloutTarget (punt of rechthoek), ImageCallout, CalloutPresentation, BulletRevealMode (al in de vorige commit)
  • Callout codec — parser en lossless writer voor het ocideck_callouts:-blok in de front matter, met de §2.5 nested merge: alleen bewerkte entries gaan door de canonieke vorm, comments, malformed entries en onbekende tokens blijven byte-voor-byte staan
  • Front matter integratie — parser, serializer, kOwnedFrontMatterKeys, format versie 2 (alleen bij de eerste callout-save)
  • Collaboratie-integratieSlideField.callouts / calloutPresentation / calloutReveal, diff, apply, codec
  • Checker-regels — §2.6 binding table (orphan, duplicate, invalid geometry, missing anchor)
  • Tests — codec (24), checker (11), collab (6), markdown round-trip (5)
  • Vertalingen — 4 nieuwe strings in 30 talen
  • Docs — FILE_FORMAT.md, SOURCE_MAP.md, CHANGELOG.md

Formaatversie 2

Een versie-1 bestand zonder callouts blijft versie 1. Zodra een deck voor het eerst callouts opslaat, schrijft de codec ocideck_format: 2. Een oudere build die het blok niet kent laat het met rust (regel 1 van het formaatcontract) en schrijft versie 2 terug (regel 3).

Bewaker

Deze wijziging raakt het bestandsformaat (nieuw ocideck_callouts:-blok, format v2) en de opslag (front matter). Het ontwerp is bevroren in docs/design/IMAGE_CALLOUTS.md rev 4 en volgt het bestaande formaatcontract: skip-what-you-don't-know, nested merge voor verliesvrije samenwerking, en de versie-sleutel als monotone grens. Geen nieuwe afhankelijkheden, geen uitgaand verkeer, geen publieke belofte die niet al in het ontwerp staat.

Test plan

  • make check groen (10701 tests, 87.2% coverage)
  • make check-secrets groen (gitleaks + trufflehog)
  • make sast groen (semgrep, 0 findings)
  • Callout codec tests (24) — parser, writer, §2.5 nested merge, §8 limits
  • Callout checker tests (11) — §2.6 binding, geometry, orphans, duplicates
  • Callout collab tests (6) — SetSlideField round-trip, diff, InsertSlide
  • Markdown round-trip tests (5) — parse + re-serialise, format v2, comments/unknown tokens
  • Localization tests — 30 talen, geen onvertaalde Engelse zinnen

Generated with Devin

## Summary De volledige ketting voor image callouts (issue #1824), de eerste stap van het ontwerp in `docs/design/IMAGE_CALLOUTS.md` (rev 4): - **Typed slide model** — `CalloutTarget` (punt of rechthoek), `ImageCallout`, `CalloutPresentation`, `BulletRevealMode` (al in de vorige commit) - **Callout codec** — parser en lossless writer voor het `ocideck_callouts:`-blok in de front matter, met de §2.5 nested merge: alleen bewerkte entries gaan door de canonieke vorm, comments, malformed entries en onbekende tokens blijven byte-voor-byte staan - **Front matter integratie** — parser, serializer, `kOwnedFrontMatterKeys`, format versie 2 (alleen bij de eerste callout-save) - **Collaboratie-integratie** — `SlideField.callouts` / `calloutPresentation` / `calloutReveal`, diff, apply, codec - **Checker-regels** — §2.6 binding table (orphan, duplicate, invalid geometry, missing anchor) - **Tests** — codec (24), checker (11), collab (6), markdown round-trip (5) - **Vertalingen** — 4 nieuwe strings in 30 talen - **Docs** — FILE_FORMAT.md, SOURCE_MAP.md, CHANGELOG.md ### Formaatversie 2 Een versie-1 bestand zonder callouts blijft versie 1. Zodra een deck voor het eerst callouts opslaat, schrijft de codec `ocideck_format: 2`. Een oudere build die het blok niet kent laat het met rust (regel 1 van het formaatcontract) en schrijft versie 2 terug (regel 3). ### Bewaker Deze wijziging raakt het bestandsformaat (nieuw `ocideck_callouts:`-blok, format v2) en de opslag (front matter). Het ontwerp is bevroren in `docs/design/IMAGE_CALLOUTS.md` rev 4 en volgt het bestaande formaatcontract: skip-what-you-don't-know, nested merge voor verliesvrije samenwerking, en de versie-sleutel als monotone grens. Geen nieuwe afhankelijkheden, geen uitgaand verkeer, geen publieke belofte die niet al in het ontwerp staat. #### Test plan - [x] `make check` groen (10701 tests, 87.2% coverage) - [x] `make check-secrets` groen (gitleaks + trufflehog) - [x] `make sast` groen (semgrep, 0 findings) - [x] Callout codec tests (24) — parser, writer, §2.5 nested merge, §8 limits - [x] Callout checker tests (11) — §2.6 binding, geometry, orphans, duplicates - [x] Callout collab tests (6) — SetSlideField round-trip, diff, InsertSlide - [x] Markdown round-trip tests (5) — parse + re-serialise, format v2, comments/unknown tokens - [x] Localization tests — 30 talen, geen onvertaalde Engelse zinnen Generated with [Devin](https://devin.ai)
Add CalloutTarget (point/region), ImageCallout, CalloutPresentation
and BulletRevealMode per IMAGE_CALLOUTS.md §3. Callouts live on the
Slide so collaboration, undo, reorder and delete ride existing
machinery — the codec is the only code that knows they are stored
deck-side in front matter keyed by anchor.

No parser, writer or UI yet — this is the dormant data foundation.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
feat(callouts): codec, front matter, collaboration, checker, tests (#1824)
All checks were successful
scans / scans (pull_request) Successful in 3m16s
static-gate / static-gate (pull_request) Successful in 7m37s
22837e9c61
De volledige ketting voor image callouts: parser en lossless writer voor
het ocideck_callouts:-blok (§2.5 nested merge), front-matter integratie
met format v2, samenwerkingslaag (SlideField, diff, apply, codec),
checker-regels (§2.6 binding, geometrie, orphans, duplicates), tests
voor codec/checker/collab/markdown-roundtrip, vertalingen in 30 talen,
en docs (FILE_FORMAT, SOURCE_MAP, CHANGELOG).

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno merged commit 457e6b7384 into main 2026-08-28 11:52:43 +00:00
Sign in to join this conversation.
No description provided.