ZDDC/classifier/js
ZDDC d951c3a5e7 feat(classifier): hash-check same-name files; verify every copy; resume converges
Same tracking number + revision ⇒ same document, so the bytes must match:
- Pre-flight (and a new "Check" button) groups fully-classified files by their
  canonical name and SHA-256s any collisions. Identical bytes collapse to ONE
  copy (deduped); DIFFERENT bytes are a conflict — flagged ≠ in red in the
  By-tracking table (with a tooltip) and held back from the copy so the user
  fixes them first. Flags clear when a placement changes.
- Every file copied this run is VERIFIED: read the written target back, compare
  SHA-256 to the source. One re-copy attempt on mismatch; if it still fails, the
  bad target is removed so a re-run re-copies it — resume converges on a
  fully-correct archive (skip-if-exists stays the fast path for good files).

classify gains transient hash-conflict flags (setHashConflicts/hasHashConflict),
copy gains sourceSha (cached), writeTarget, verifyOne, removeTarget, resolvePlan
and audit(); copyTo runs the verify pass and reports verifyFailed.

Tests: identical pair dedups + differing pair conflicts/flags; a corrupting
write fails verification and is removed (54 green).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 09:01:02 -05:00
..
app.js feat(classifier): hash-check same-name files; verify every copy; resume converges 2026-06-11 09:01:02 -05:00
classify.js feat(classifier): hash-check same-name files; verify every copy; resume converges 2026-06-11 09:01:02 -05:00
copy.js feat(classifier): hash-check same-name files; verify every copy; resume converges 2026-06-11 09:01:02 -05:00
dnd.js feat(classifier): drag-and-drop assignment (phase 3) 2026-06-09 12:23:38 -05:00
excel.js feat(shared): non-blocking toast helper available to every tool 2026-05-09 19:04:41 -05:00
filter.js Initial commit 2026-04-27 11:05:47 -05:00
persist.js feat(classifier): workspaces — scan-once, resume from snapshot (phase 6) 2026-06-09 15:07:40 -05:00
preview.js fix(classifier): pin the xlsx preview's horizontal scrollbar to the window 2026-06-10 16:34:43 -05:00
resize.js Initial commit 2026-04-27 11:05:47 -05:00
scanner.js feat(classifier): zips are single files by default, toggle to expand as a folder 2026-06-10 14:34:25 -05:00
selection.js Initial commit 2026-04-27 11:05:47 -05:00
sort.js Initial commit 2026-04-27 11:05:47 -05:00
spreadsheet.js fix(classifier): drop vestigial Save-All delays that masked a fixed await bug 2026-05-21 17:07:28 -05:00
store.js Initial commit 2026-04-27 11:05:47 -05:00
target-tree.js feat(classifier): hash-check same-name files; verify every copy; resume converges 2026-06-11 09:01:02 -05:00
tree.js feat(classifier): "Partial" Show filter — assigned in the other tab only 2026-06-11 08:27:39 -05:00
utils.js Initial commit 2026-04-27 11:05:47 -05:00
validator.js Initial commit 2026-04-27 11:05:47 -05:00
workspace.js ux(classifier): relabel the two JSON surfaces so their purpose is clear 2026-06-10 13:56:09 -05:00