Split FR-EXP-1, so its tag stops standing for a deferral as well

FR-EXP-1 listed four things in one sentence: JPEG, PNG, TIFF at both depths,
and AVIF or JPEG XL. Three of them are built, encode, embed an ICC profile, and
are covered by tests that walk every offered format. The fourth is a deliberate
deferral — `export` returns `FormatUnsupported` for AVIF and JPEG XL, and
`the_formats_without_an_encoder_say_so` pins that behaviour in place.

Fused, the requirement could only be tagged dishonestly or not at all, and not
at all is worse: it would delete the register's record of the part that is
finished, which is most of it.

So the v1 scope is now JPEG, PNG and TIFF with the configurability clause, and
AVIF and JPEG XL are stated as post-v1 with the condition that already holds —
either may appear in the settings page before its encoder does, provided
choosing it fails with a typed error naming the format rather than producing a
file. That is what `every_offered_format_either_encodes_or_explains_itself`
exists to guarantee, and it is why a format cannot be added to the picker and
quietly reach an encoder that does not handle it.

No intent is dropped. AVIF and JPEG XL remain wanted; they are now scheduled
rather than silently outstanding.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-30 10:23:03 +02:00
co-authored by Claude Opus 5
parent e0da93c59a
commit 8865743db6
+17 -2
View File
@@ -542,8 +542,23 @@ region.
### 3.6 Export ### 3.6 Export
**FR-EXP-1 — Formats.** Export to JPEG, PNG, TIFF (8 and 16-bit), and AVIF or JPEG XL. Quality, **FR-EXP-1 — Formats.** Export to JPEG, PNG, and TIFF (8 and 16-bit). Quality, chroma subsampling,
chroma subsampling, and bit depth are configurable. and bit depth are configurable.
**AVIF and JPEG XL are post-v1** and are not part of this requirement's acceptance. Either may still
be listed in the settings page before its encoder exists, on one condition: choosing it shall fail
with a typed error naming the format, never with a file. `every_offered_format_either_encodes_or_explains_itself`
walks every format the page offers and enforces exactly that, so a format cannot be added to the
picker and quietly reach an encoder that does not handle it.
*On splitting this requirement.* It read as one undifferentiated list — "JPEG, PNG, TIFF (8 and
16-bit), and AVIF or JPEG XL" — which left it neither met nor unmet. Three formats, both TIFF
depths, and the configurability clause are built, encode, embed their profile, and are tested; the
fourth item is a deliberate deferral, and the encoders for it are the two with the least settled
library support. Fused into one sentence, the only choices were a tag asserting something untrue or
no tag at all, and the second is the worse of the two: it would have removed the register's record
of four-fifths of a requirement that is finished. The deferral is now stated where it can be read as
a decision rather than inferred from an error variant.
**FR-EXP-2 — Colour space.** Export in a selectable output colour space (sRGB, Display P3, **FR-EXP-2 — Colour space.** Export in a selectable output colour space (sRGB, Display P3,
Adobe RGB, ProPhoto), with the correct ICC profile embedded. Adobe RGB, ProPhoto), with the correct ICC profile embedded.