feat(fleet): land 36 audited worker tags across six formats - #652
Merged
Conversation
Format: CRW Tag: MakerNotes:AEBBracketValue Tag: MakerNotes:AFAreaHeight Tag: MakerNotes:AFAreaWidth Tag: MakerNotes:AFAreaXPositions Tag: MakerNotes:AFAreaYPositions Tag: MakerNotes:AFImageHeight Sample: /tmp/oxidex-exiftool-cache/combined-samples/CanonRaw.crw Exiftool-Value: 0 Oxidex-Value: '0' Perl-Ref: Canon.pm Verified: recheck-pass gaps=6->0 Worker: CRW
Format: JPEG Tag: EXIF:MakerNoteSamsung1a Tag: EXIF:MakerNoteUnknownBinary Tag: EXIF:MakerNoteUnknownText Tag: EXIF:SubfileType Tag: EXIF:ThumbnailTIFF Sample: /tmp/oxidex-exiftool-cache/combined-samples/Samsung/SamsungPL55.jpg Exiftool-Value: '(Binary data 3072 bytes, use -b option to extract)' Oxidex-Value: '(Binary data 3072 bytes, use -b option to extract)' Perl-Ref: MakerNotes.pm Verified: recheck-pass gaps=5->0 Worker: JPEG
Format: DCM Tag: DICOM:AccessionNumber Tag: DICOM:AcquisitionDate Tag: DICOM:AcquisitionMatrix Tag: DICOM:AcquisitionNumber Tag: DICOM:AcquisitionTime Tag: DICOM:AdditionalPatientHistory Sample: /tmp/oxidex-exiftool-cache/combined-samples/DICOM.dcm Exiftool-Value: '' Oxidex-Value: '' Perl-Ref: DICOM.pm Verified: recheck-pass gaps=6->0 Worker: DCM
Format: MIFF Tag: EXIF:ApertureValue Tag: EXIF:Artist Tag: EXIF:BrightnessValue Tag: EXIF:ColorSpace Tag: EXIF:ComponentsConfiguration Tag: EXIF:CompressedBitsPerPixel Sample: /tmp/oxidex-exiftool-cache/combined-samples/MIFF.miff Exiftool-Value: '3.5' Oxidex-Value: '3.5' Perl-Ref: Exif.pm Verified: recheck-pass gaps=6->0 Worker: MIFF
Format: EIP Tag: EXIF:BitsPerSample Tag: EXIF:CompressedBitsPerPixel Tag: EXIF:Compression Tag: EXIF:CreateDate Tag: EXIF:DateTimeOriginal Tag: EXIF:ExifImageHeight Sample: /tmp/oxidex-exiftool-cache/combined-samples/CaptureOne.eip Exiftool-Value: '8 8 8' Oxidex-Value: '8 8 8' Perl-Ref: Exif.pm Verified: recheck-pass gaps=6->0 Worker: EIP Review-Unverifiable: UNVERIFIABLE:C2
Format: FIT Tag: Garmin:AvgCadence Tag: Garmin:AvgCadencePosition Tag: Garmin:AvgFractionalCadence Tag: Garmin:AvgHeartRate Tag: Garmin:AvgLeftPowerPhase Tag: Garmin:AvgLeftPowerPhasePeak Sample: /tmp/oxidex-exiftool-cache/combined-samples/Garmin.fit Exiftool-Value: '13 rpm' Oxidex-Value: '13 rpm' Perl-Ref: Garmin.pm Verified: recheck-pass gaps=6->0 Worker: FIT Review-Unverifiable: UNVERIFIABLE:C1
Every fleet worker patch was audited hunk-by-hunk against the pinned
ExifTool 13.59 before landing, per the standing rule that fleet patches
are unvalidated drafts. Twenty-seven agents reviewed the seven patches
and adversarially verified every finding; sixteen confirmed defects are
fixed here, each re-verified against the oracle (a seventh patch, WTV,
was dropped outright -- see the PR).
JPEG (tiff_helpers.rs): the MakerNoteUnknown* fallback now evaluates its
condition on the first 128 bytes with no NUL-trimming and splits
text/binary on the untrimmed length (SamsungDigimaxA4/A5/A7 now emit
"(Binary data 460 bytes)" like the oracle; previously a live wrong value
on 3 corpus files), fires only after every preceding @MakerNotes::Main
condition fails (RICOH/JVC/Pentax text notes no longer fabricate
MakerNoteUnknownText), and build_thumbnail_tiff is replaced by a
faithful RebuildTIFF replication -- byte-identical to `exiftool -b`
(sha1-verified) with the SubfileType==1/Compression==1 gates, strip
validation, and PreviewTIFF naming. SubfileType keys under IFD1.
FIT (fit.rs): fields 118/119 were RIGHT power phase emitted under
AvgLeft names -- remapped per %Session with 116/117; invalid sentinels
(0xff/0xffff/...) suppressed exactly like %baseType; only the FIRST
session message extracted (ProcessFIT's %done gate); the invented
field-253 compressed-header skip removed; mid-file malformation keeps
extracted tags; ReadValue semantics for signed/array/big-endian values.
DCM (fits.rs): dicom_time no longer panics on non-UTF-8 (omits, with a
regression test on the repro bytes); undefined-length elements walk on
instead of failing the file; TM/DA conversions mirror DICOM.pm's exact
regexes ("1434" stays "1434"); per-VR trimming and the long-VR set match
the pinned %vr tables.
CRW (raw/metadata.rs): AFInfo record decoded as int16u per the
table-level FORMAT, with the int16s[] exceptions (AFAreaX/YPositions)
preserved -- sample output now matches the oracle exactly.
MIFF (miff.rs, composite/mod.rs): the Composite:Aperture suppression --
justified by a fabricated ExifTool claim -- is removed (oracle emits
Aperture 3.5 for the sample; so do we now); the profile-APP1 match is
case-sensitive like MIFF.pm; the whitelist comment now tells the truth.
EIP (archive/zip.rs): the raw-member read no longer pre-allocates from
the attacker-controlled uncompressed-size field (capacity-overflow
panic / zip-bomb, CWE-789) -- bounded take()+read_to_end behind a 1GiB
cap, hostile repro now errors cleanly where it panicked.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Harvest of today's local fleet run (2 workers): six formats' worth of worker-produced tag fixes, audited hunk-by-hunk before landing per the standing rule that fleet patches are unvalidated drafts — and the audit earned its keep.
What lands
fix(jpeg)fix(crw)fix(dcm)fix(miff)fix(eip)fix(fit)An eighth worker patch (WTV) was dropped: its raw whole-file GUID scan bypasses the WTV sector directory, which happens to work on the single corpus sample but risks wrong values on real fragmented recordings — the omit-don't-approximate rule says that format needs a real sector parser, not a patch-up.
The audit
27 agents reviewed the seven patches against pinned ExifTool 13.59; every finding was adversarially verified (refute-first) before being acted on. 16 confirmed defects were hiding in six confident-looking, gate-passing diffs, fixed in the final commit:
MakerNoteUnknownTexton RICOH/JVC/Pentax text makernotes;build_thumbnail_tiffwas an invented reconstruction. Now: condition on first-128-bytes exactly, fallback gated behind every preceding@MakerNotes::Maincondition, and a faithfulRebuildTIFFreplication — byte-identical toexiftool -b(sha1-verified). The corpus fallback-emitting file set now matches the oracle's 24 files exactly.AvgLeftPowerPhasenames; phantom "255 bpm" sentinels ExifTool suppresses; every-session-last-wins where ExifTool takes the first; an invented compressed-header skip that misframed records; whole-file hard-fail on mid-file malformation.take()+read_to_endbehind a 1 GiB cap; hostile repro errors cleanly.Composite:Aperturewas suppressed for MIFF citing a fabricated ExifTool claim — removed; oracle emitsAperture 3.5for the sample and so do we. Profile matching now case-sensitive like MIFF.pm.%Canon::AFInfodeclaresFORMAT => int16u— a latent silent-wrong-value; now unsigned with the table'sint16s[]exceptions preserved.Verification
Rebased onto current main (
27be399a) and re-verified post-rebase with the full protocol (before/aftertag-comparisonsnapshots against pinned ExifTool 13.59 on the 4,238-file corpus):regressions: 0in every format,value_differencesunchanged by this branch (the one JPEG delta —EXIF:UserCommenton OlympusD450Z — reproduces byte-identically on pure main; pre-existing, tracked separately).cargo test --workspace: 47 suites, 0 failures (including new regression tests for the panic repro, sentinel suppression, TM/DA semantics, RebuildTIFF byte layout, and fallback gating).cargo clippyandcargo fmt --checkclean.Salvaged pre-restart DCM/MIFF worker commits were verified same-tag-list and superseded by the post-restart re-derives; later fleet output (MIE, ICS, VCF, …) rides the next sweep.
🤖 Generated with Claude Code