Skip to content

feat(fleet): land 36 audited worker tags across six formats - #652

Merged
swackhamer merged 7 commits into
mainfrom
claude/fleet-tag-fixes-48b675
Aug 10, 2026
Merged

feat(fleet): land 36 audited worker tags across six formats#652
swackhamer merged 7 commits into
mainfrom
claude/fleet-tag-fixes-48b675

Conversation

@swackhamer

Copy link
Copy Markdown
Collaborator

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

Format New matching tags Worker commit
JPEG +5 (MakerNoteUnknown*, SubfileType, ThumbnailTIFF) fix(jpeg)
CRW +6 (AFInfo block incl. AEBBracketValue) fix(crw)
DCM +6 fix(dcm)
MIFF +6 (incl. Composite:Aperture) fix(miff)
EIP +6 fix(eip)
FIT +8 (audit surfaced 2 the worker mislabeled away) 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:

  • JPEG: the fallback's condition semantics were invented (the patch's comment cites a RawConv that does not exist in MakerNotes.pm) — it failed on the very Samsung corpus files it claimed to wire and fabricated MakerNoteUnknownText on RICOH/JVC/Pentax text makernotes; build_thumbnail_tiff was an invented reconstruction. Now: condition on first-128-bytes exactly, fallback gated behind every preceding @MakerNotes::Main condition, and a faithful RebuildTIFF replication — byte-identical to exiftool -b (sha1-verified). The corpus fallback-emitting file set now matches the oracle's 24 files exactly.
  • FIT: fields 118/119 are right power phase but were emitted under AvgLeftPowerPhase names; 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.
  • DCM: reproduced panic on non-UTF-8 time bytes; undefined-length elements hard-failed the whole file; TM conversion rewrote partial times DICOM.pm leaves alone ("1434" stays "1434", verified by executing both sides); DA/trimming/long-VR aligned to the pinned tables.
  • EIP: member read pre-allocated from the attacker-controlled ZIP uncompressed-size field — capacity-overflow panic on a forged ZIP64 size (CWE-789, reproduced). Now bounded take() + read_to_end behind a 1 GiB cap; hostile repro errors cleanly.
  • MIFF: Composite:Aperture was suppressed for MIFF citing a fabricated ExifTool claim — removed; oracle emits Aperture 3.5 for the sample and so do we. Profile matching now case-sensitive like MIFF.pm.
  • CRW: AFInfo decoded signed where %Canon::AFInfo declares FORMAT => int16u — a latent silent-wrong-value; now unsigned with the table's int16s[] exceptions preserved.

Verification

Rebased onto current main (27be399a) and re-verified post-rebase with the full protocol (before/after tag-comparison snapshots against pinned ExifTool 13.59 on the 4,238-file corpus):

  • +36 net matching tags, regressions: 0 in every format, value_differences unchanged by this branch (the one JPEG delta — EXIF:UserComment on 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 clippy and cargo fmt --check clean.

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

swackhamer and others added 7 commits August 9, 2026 18:40
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>
@swackhamer
swackhamer merged commit e80fb0b into main Aug 10, 2026
10 checks passed
@swackhamer
swackhamer deleted the claude/fleet-tag-fixes-48b675 branch August 10, 2026 01:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant