Files
suaveplan/openspec/archive/2026-04-19-enterprise-exif/specs/exif/spec.md
2026-05-27 23:29:53 +01:00

2.3 KiB

Capability Spec: exif

Package: @suaveplan/exif Version: 0.0.0 (genesis) Status: ADDED


ADDED Requirements

EXIF-01 — Format detection

detectImageFormat(bytes) MUST identify JPEG, PNG, WebP, TIFF, HEIC (ISOBMFF), and the RAW families (CR2, CR3, NEF, ARW, RAF, ORF, RW2, DNG) by magic-byte sniffing. Unknown inputs MUST return 'unknown', not throw.

EXIF-02 — Read / write / strip dispatch

readMetadata(bytes, options?) MUST dispatch to the format-specific reader and return a unified ImageMetadata. writeMetadata(bytes, patch) MUST apply a MetadataPatch and return a new buffer. stripMetadata(bytes, options?) MUST produce a buffer containing image data only; running it twice MUST be idempotent.

EXIF-03 — IFD codec

parseTiff(bytes, options?) MUST return ParsedTiff with every IFD, entry, and sub-IFD. buildTiff(input) MUST produce a byte buffer that round-trips through parseTiff to an equal ParsedTiff. Entry type widths MUST follow TIFF_TYPE_SIZE.

EXIF-04 — GPS

decimalToDms and dmsToDecimal MUST round-trip within 1e-7 degrees. gpsToIsoTimestamp and isoToGpsFields MUST round-trip to second precision.

EXIF-05 — ICC

readIccProfile MUST return IccProfile with header, tag table, and parsed tag values. validateIccProfile MUST reject profiles with invalid size, version, or checksum. classifyProfile MUST detect sRGB, AdobeRGB, DisplayP3 reliably for canonical profiles.

EXIF-06 — IPTC / XMP

readIptc / writeIptc MUST support IIM records 1, 2 with UTF-8 and ISO-8859-1 charsets. readXmp MUST return an XmpData tree (scalars, structs, language-alternatives). XMP_NAMESPACES MUST expose the canonical URI per prefix.

EXIF-07 — MakerNotes

decodeMakerNote MUST dispatch to the correct vendor decoder. Nikon and Sony encrypted MakerNote tags MUST be decoded via nikonDecrypt / sonyDecrypt using the serial+shutter-derived keys. decodeAppleMakerNote MUST decode embedded bplist via decodeBplist.

EXIF-08 — Safety

All readers MUST operate on bounded ByteReader views and MUST throw EXIF.BUFFER_OVERRUN rather than reading past the buffer end. No reader MUST allocate buffers larger than the input.

EXIF-09 — Observability

Every read/write/strip MUST record the corresponding OTel histogram with label format.