Commit Graph
133 Commits
Author SHA1 Message Date
Alex-GilbertandClaude Opus 4.6 a4863350ef fix: remove blue box overlay from approved redactions
Only the merged blue text is drawn — no box overlay needed.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 15:35:09 -06:00
Alex-GilbertandClaude Opus 4.6 bff50a1315 fix: drawRedactionApproved draws box overlay + distinct green badge
The approved draw function was only drawing text with no overlay on the
redaction box area, making it look like the redaction disappeared.
Now draws a blue semi-transparent box over the redaction area (like
other states) plus the merged blue text along the line.

Also made the approved CSS badge green (--accent) to distinguish it
from the blue analyzed badge.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 15:08:20 -06:00
Alex-GilbertandClaude Opus 4.6 0ffae2aeae feat: blue CSS badge for approved status
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 14:49:12 -06:00
Alex-GilbertandClaude Opus 4.6 651b7eee33 feat: popover handles approved redactions with solution pre-populated
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 14:49:02 -06:00
Alex-GilbertandClaude Opus 4.6 0873120775 feat: update main.js references from solved to approved status
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 14:48:51 -06:00
Alex-GilbertandClaude Opus 4.6 7bc5aa3239 feat: replace drawRedactionSolution with drawRedactionApproved (blue merged text)
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 14:48:32 -06:00
Alex-GilbertandClaude Opus 4.6 531693653a feat: acceptSolution produces 'approved' status with merged text
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 14:48:05 -06:00
Alex-GilbertandClaude Opus 4.6 9f5ceb38ae fix: remove inline-edit feature and backspace delete keybinding
- Delete inline-edit.js and all references
- Remove backspace/delete key handler for redaction deletion
- Clean up popover.js syncInlineEdit references

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 14:46:50 -06:00
Alex-GilbertandClaude Opus 4.6 f1e25f9712 feat: add LLM boundary detection for spot redaction path
analyze_spot_redaction is now async and calls identify_boundary_text()
to use Claude Haiku for clean left/right text extraction instead of
center-point character filtering. Falls back to center-point if LLM
is unavailable.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 14:46:45 -06:00
Alex-GilbertandClaude Opus 4.6 163a450720 docs: add redaction approval implementation plan
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 14:45:39 -06:00
Alex-GilbertandClaude Opus 4.6 f04bacd961 docs: add redaction approval design
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 14:44:32 -06:00
Alex-GilbertandClaude Opus 4.6 e9ec2ff7f3 feat: add inline-edit.js and sync popover with inline inputs
Missed files from the inline text editing task — adds the inline-edit
module and wires up bidirectional sync between popover text bar and
inline canvas inputs.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:55:25 -06:00
Alex-GilbertandClaude Opus 4.6 3d07faadc8 style: add OCR status indicator and edge case handling
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:52:14 -06:00
Alex-GilbertandClaude Opus 4.6 43e7f80bbe feat: drag handles for resizing redaction bounding boxes
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:49:52 -06:00
Alex-GilbertandClaude Opus 4.6 9b9618d9fa feat: spot redactions now created as analyzed with full data
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:44:35 -06:00
Alex-GilbertandClaude Opus 4.6 7331fc5936 feat: add OCR-on-upload and Detect Redactions button
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:43:09 -06:00
Alex-GilbertandClaude Opus 4.6 2783ed2615 feat: spot endpoint returns full analysis data
Enrich POST /api/doc/{doc_id}/page/{page}/spot to call
analyze_spot_redaction when OCR data is cached, returning full
analysis JSON (segments, gap, font, line, offsets) alongside the
bounding box. This makes spot redactions first-class, matching the
analysis format returned by get_page_data for auto-detected redactions.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:42:18 -06:00
Alex-GilbertandClaude Opus 4.6 8857793759 feat: add analyze_spot_redaction for single-box analysis
Add a synchronous function that runs the analysis mini-pipeline on a
single known bounding box using cached OCR data. This enables spot
redaction endpoints to get full analysis (font, left/right context text,
pixel alignment offsets) without needing LLM detection.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:39:57 -06:00
Alex-GilbertandClaude Opus 4.6 03333e212c feat: wire analyze endpoint to use cached OCR data
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:38:31 -06:00
Alex-GilbertandClaude Opus 4.6 f24a710b9e feat: allow analyze_page to accept pre-computed OCR lines
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:36:58 -06:00
Alex-GilbertandClaude Opus 4.6 ced68f2321 feat: add /api/doc/{id}/ocr SSE endpoint for cached OCR
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:36:46 -06:00
Alex-GilbertandClaude Opus 4.6 87a59802bf feat: add ocr_lines field to page_data structure
Add an ocr_lines slot (initially None) to each page's data dictionary
in the upload endpoint. This prepares for OCR caching so results can
be reused between the auto-detect and spot-redaction pipelines.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:34:58 -06:00
Alex-GilbertandClaude Opus 4.6 3345dde096 docs: add redaction workflow redesign implementation plan
13 tasks covering: OCR caching, spot analysis, detect button,
inline canvas editing, drag handles, and full integration.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:30:56 -06:00
Alex-GilbertandClaude Opus 4.6 050907ae89 docs: add redaction workflow redesign design
Captures the plan to decouple auto-detection from upload, make manual
(double-click) redactions first-class with full analysis, and move to
inline-on-canvas editing.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 12:22:17 -06:00
Alex-GilbertandClaude Opus 4.6 2a5db8f990 fix(frontend): update associates.js to use renamed dom exports
The rename from solveFilterPrefix/Suffix to solveKnownStart/End missed
associates.js, breaking the entire JS module tree and disabling upload.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 13:23:55 -06:00
Alex-GilbertandClaude Opus 4.6 4a92cb8463 fix: update app tests for mode/charset restructuring
Replaced test_solve_endpoint_dictionary and test_dictionary_crud with
test_solve_endpoint_name_mode testing the new name mode.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 13:16:57 -06:00
Alex-GilbertandClaude Opus 4.6 65865da28a feat: restructure solve endpoint with mode-based dispatch
Modes: name (default), full_name, email, enumerate
Renamed filter_prefix/suffix to known_start/known_end
Removed DictionaryStore and dictionary API endpoints

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 13:14:00 -06:00
Alex-GilbertandClaude Opus 4.6 bde5fce636 feat: update frontend JS for new modes, known start/end, and filter visibility
Renamed solveFilterPrefix/Suffix to solveKnownStart/End. Word filter
label hidden by default, shown only when enumerate mode is selected.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 13:12:54 -06:00
Alex-GilbertandClaude Opus 4.6 a9117e3876 feat: update HTML with new modes, charsets, and known start/end fields
Modes: Name (default), Full Name, Email, Enumerate
Charsets: lowercase, UPPERCASE, Capitalized
Renamed filter prefix/suffix to known start/end
Word filter hidden by default (shown only for enumerate mode)

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 13:12:17 -06:00
Alex-GilbertandClaude Opus 4.6 d0bd7967e4 feat: update solve_full_name_dictionary with casing and known_start/known_end
Replaces uppercase_only bool with casing string parameter. Adds
known_start/known_end support for filtering and gap-width measurement.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 13:11:53 -06:00
Alex-GilbertandClaude Opus 4.6 d32f27cb8d feat: add solve_name_dictionary for single-word associate name matching
Supports casing (lowercase/uppercase/capitalized), known_start/known_end
filtering with gap-width measurement of the unknown portion only.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 13:11:13 -06:00
Alex-GilbertandClaude Opus 4.6 57650af1fe docs: add mode/charset restructuring design and implementation plan
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 13:07:54 -06:00
Alex-GilbertandClaude Opus 4.6 c04dc589f4 feat: wire dictionary full-name solver into solve endpoint
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 12:01:53 -06:00
Alex-GilbertandClaude Opus 4.6 7b0802d005 feat: add solve_full_name_dictionary with Cartesian product matching
Generate first x last name combinations from associate lists, apply
Title Case or UPPER casing, measure rendered widths, and return matches
within tolerance. Also checks associate name variants (initials,
nicknames) with deduplication.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 12:00:45 -06:00
Alex-GilbertandClaude Opus 4.6 72df8d3579 feat: extract associate first/last name lists from registry
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 11:55:33 -06:00
Alex-GilbertandClaude Opus 4.6 921d702c07 feat: add lazy loaders for associate name lists
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 11:55:09 -06:00
Alex-GilbertandClaude Opus 4.6 291eadaba8 docs: add dictionary full-name solver implementation plan
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 11:52:39 -06:00
Alex-GilbertandClaude Opus 4.6 04aa089c7f docs: add dictionary-based full name solver design
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 11:50:50 -06:00
Alex-GilbertandClaude Opus 4.6 b50a32a038 fix(solver): add max_results cap to prevent OOM in full-name solver
The full-name solver collected all results into a Vec with no limit,
causing OOM crashes for realistic targets where millions of valid
first×last combinations exist. Thread max_results through
solve_subtree, dfs_first, and the Cartesian product loop so the
search stops early once enough results are found.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 11:20:16 -06:00
Alex-GilbertandClaude Opus 4.6 11339d0ecc test(solver): add 3-char equivalence expansion integration test
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 10:52:54 -06:00
Alex-GilbertandClaude Opus 4.6 25a8d47d53 feat(solver): wire equiv classes into DFS pipeline
Thread EquivClasses and deduped_allowed through solve_subtree, dfs,
generate_prefixes, handle_solve, and dfs_first (full_name). The DFS
hot loop now iterates deduped representatives instead of all allowed
chars, and expand_match restores full class-member variants at match
time. This reduces branching factor for charsets with metrically
identical glyphs while preserving complete result sets.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 10:50:31 -06:00
Alex-GilbertandClaude Opus 4.6 700a76eeee feat(solver): add dedup_state_allowed, build_byte_to_idx, expand_match
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 10:43:57 -06:00
Alex-GilbertandClaude Opus 4.6 be9dd07a66 feat(solver): add EquivClasses struct and compute_equiv_classes
Foundation for glyph equivalence class optimization. Groups charset
characters with identical metric signatures (width table columns/rows,
left/right edges, optional extra columns) into equivalence classes
using exact f64::to_bits() comparison. Includes 3 unit tests covering
duplicate detection, all-unique case, and extra column splitting.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 10:39:23 -06:00
Alex-Gilbert a5505c1fbb attempting to make redaction guessing better 2026-02-18 10:35:42 -06:00
Alex-GilbertandClaude Opus 4.6 cddbf74492 docs: add glyph equivalence classes implementation plan
7 bite-sized tasks with TDD steps: EquivClasses struct, dedup/expand
functions, DFS wiring, prefix generation, full_name integration, and
end-to-end testing.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 10:34:58 -06:00
Alex-GilbertandClaude Opus 4.6 23f535a614 docs: add glyph equivalence classes design
Group metrically identical characters into equivalence classes to reduce
the DFS branching factor from N to K per node, with Cartesian product
expansion on matches to recover all solutions.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-18 10:28:41 -06:00
Alex-GilbertandClaude Opus 4.6 b577f2b52e feat: update frontend to use SSE analysis and pre-computed redaction data
Replace the click-to-analyze and spot-detection flows with an automatic
SSE-driven analysis pipeline. After upload, an EventSource connects to
/api/doc/{id}/analyze and reloads page data as each page completes,
consuming pre-computed analysis from the page data endpoint.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-17 15:38:13 -06:00
Alex-GilbertandClaude Opus 4.6 1a65cb9a87 refactor: replace per-redaction endpoints with SSE upload analysis pipeline
Replace the old /api/redaction/analyze and /api/redaction/spot endpoints
with a new /api/doc/{id}/analyze SSE endpoint that pre-computes all
analysis during upload. The page data endpoint now returns pre-computed
analysis results instead of requiring per-redaction API calls.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-17 15:35:09 -06:00
Alex-GilbertandClaude Opus 4.6 0f9c7ff858 feat: add page analysis pipeline orchestrating OCR, LLM, OpenCV, and font detection
Wire together the per-page pipeline: OCR -> LLM redaction detection ->
guided OpenCV search -> font detection with masking -> pixel alignment.
Includes font caching per line and progress callbacks.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-17 15:31:17 -06:00
Alex-GilbertandClaude Opus 4.6 8b5511e7fd feat: add detect_font_masked for redaction-aware font detection
Adds a new detect_font_masked() function that masks redaction boxes to
white (255) before running pixel-based font detection on the full line
crop. This replaces the fragile approach of cropping just the left/right
portion of a line, which lost signal from narrow crops and coordinate
mismatches. The Dice-based scoring naturally ignores masked (white)
regions since they contain no ink pixels.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-17 15:26:14 -06:00