Commit Graph
32 Commits
Author SHA1 Message Date
Alex-GilbertandClaude Opus 4.6 368df1a35b feat: clickable tier badges with associate detail popup
Badge is now a button — clicking it opens a popup listing all
matching associates with their tier description (flight logs /
inner circle / named in files), category, and match type.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 09:33:27 -06:00
Alex-GilbertandClaude Opus 4.6 921fafc828 fix: sort associates by tier first, boost with prefix/suffix hints
- Sort results strictly by tier (T1 > T2 > T3 > none), then by score
  within the same tier. Previously a T3 full-name match could outrank
  a T1 first-name match.
- Boost associate score by +2 when the person's name matches the
  user's filter prefix/suffix, surfacing likely candidates higher.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 09:30:15 -06:00
Alex-GilbertandClaude Opus 4.6 eb42b0e179 fix: correct scoring inversion, filter garbage names, add Makefile target
- Fix priority scoring: (4 - tier) * weight so T1 ranks above T3
- Filter upstream redaction placeholders like "(b) (6)" from data
- Add build-associates Makefile target
- Rebuild associates.json (1586 persons, 28 garbage entries removed)

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 09:17:48 -06:00
Alex-GilbertandClaude Opus 4.6 dfe78a58f2 feat: frontend associate matching, badges, and priority sorting
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 07:55:47 -06:00
Alex-GilbertandClaude Opus 4.6 4bfe7c85a7 feat: add GET /api/associates endpoint
Lazy-loads associates.json from data dir and serves it at /api/associates,
with fallback to empty dicts if file is missing.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 07:51:07 -06:00
Alex-GilbertandClaude Opus 4.6 b5d2670fa3 feat: generate associates.json with tiered Epstein network data
Fix source_name/target_name field mapping in tier computation, use
compact JSON output (696KB). Stats: 7147 lookups, 1614 persons
(204 tier-1, 38 tier-2, 1372 tier-3).

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 07:49:17 -06:00
Alex-GilbertandClaude Opus 4.6 8011cf4da2 feat: add associates data processor with nickname generation and tiering
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 07:46:56 -06:00
Alex-GilbertandClaude Opus 4.6 a0173a2f40 docs: add implementation plan for associates priority dictionary
7 tasks covering build script, API endpoint, frontend matching/sorting/badges,
and end-to-end testing. TDD approach with exact file paths and code.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 07:26:57 -06:00
Alex-GilbertandClaude Opus 4.6 c914028a0a docs: add design for Epstein associates priority dictionary
Defines tiered prioritization of known Epstein associates in solver
results using rhowardstone/Epstein-research-data as the data source.
Associates are matched by full name, first/last, nicknames, and aliases
with frontend-side sorting and badge display.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-16 07:24:06 -06:00
Alex-GilbertandClaude Opus 4.6 fc9eff2da5 test: add round-trip integration test for solver
Measures a known word's width in font context, then verifies the solver
recovers that word from its width. Proves the width table and solver
work correctly end-to-end.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 22:26:20 -06:00
Alex-GilbertandClaude Opus 4.6 556007f5fb feat: frontend solve panel with SSE streaming results
Add a solve panel UI that lets users attempt to recover redacted text
by finding strings whose rendered width matches the redaction gap.
Includes charset selection, length bounds, tolerance slider, and
dictionary/enumerate/both mode controls. Results stream via SSE and
can be clicked to insert into the gap.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 22:24:30 -06:00
Alex-GilbertandClaude Opus 4.6 d391bfa6d6 feat: SSE solve endpoint with dictionary and enumerate modes
Add POST /api/solve endpoint that streams results via Server-Sent Events,
supporting both enumerate (brute-force) and dictionary solve modes. Add
dictionary CRUD endpoints (POST/GET/DELETE /api/dictionary) and solve
cancellation (DELETE /api/solve/{id}). Move static files mount to end of
app.py so API routes take priority.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 22:20:20 -06:00
Alex-GilbertandClaude Opus 4.6 b357713e5e feat: dictionary solver with in-memory word list store
Add solve_dictionary() for linear-scan matching of dictionary entries
against a target pixel width, and DictionaryStore for managing named
word/name lists. Reuses SolveResult from the solver module.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 22:15:21 -06:00
Alex-GilbertandClaude Opus 4.6 11cc29d3f8 feat: parallel solver with multiprocessing via ProcessPoolExecutor
Distribute branch-and-bound search across CPU cores by generating
depth-2 prefixes and farming each subtree to a worker process.
Includes on_progress callback and automatic prefix depth selection.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 22:12:49 -06:00
Alex-GilbertandClaude Opus 4.6 9021cf8a21 feat: single-threaded branch-and-bound gap solver
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 22:07:41 -06:00
Alex-GilbertandClaude Opus 4.6 696b0165ef feat: width table module with kerning-aware font metrics
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 22:00:12 -06:00
Alex-GilbertandClaude Opus 4.6 fe70bcaa6c docs: constraint solver design for redaction gap enumeration
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 21:44:50 -06:00
Alex-GilbertandClaude Opus 4.6 b9df273521 Add interactive font tuning UI with split-panel layout
Replace static overlay with client-side canvas rendering. Left panel
shows clickable OCR lines with font controls (dropdown + size slider).
Right panel renders green text overlay on the document via canvas.
Fonts loaded from backend TTF files using the FontFace API.

New endpoints: GET /api/fonts, GET /api/font/{id}

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 20:17:57 -06:00
Alex-GilbertandClaude Opus 4.6 9b23ad827b Add .worktrees/ to .gitignore
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 19:41:08 -06:00
Alex-GilbertandClaude Opus 4.6 d2b149f1ba feat: per-line font detection with prior bias
Instead of detecting one font per page, detect the font for each line
independently. The previous line's font is used as a prior — if it
scores within 15% of the best candidate, it's kept for consistency.
This handles documents with mixed fonts (bold headers, regular body,
different sections).

Also: redirect / to the static UI, fix data endpoint to return
per-line font info.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 19:24:48 -06:00
Alex-GilbertandClaude Opus 4.6 605729209b fix: render overlay line-by-line, not word-by-word
Word-by-word rendering hides font detection errors by repositioning
each word at the OCR'd spot. Line-by-line rendering lets the font's
own character spacing determine where each character falls — any
drift reveals that the font/size is wrong. The drift IS the feedback
mechanism.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 19:15:34 -06:00
Alex-Gilbert a9c394151d test: end-to-end smoke test with visual output 2026-02-15 19:06:24 -06:00
Alex-GilbertandClaude Opus 4.6 8d82054b5d feat: overlay calibration with word-by-word rendering
- Render each word at its OCR'd position instead of whole lines,
  so word spacing matches the original document exactly
- Add y-offset correction using glyph bounding box
- Add fine-grained font size search (±3 around coarse best, step 1)
- Add alignment quality test (48.9% hit rate, >30% threshold)
- Add scipy to dev dependencies

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 19:04:40 -06:00
Alex-GilbertandClaude Opus 4.6 3da043046c feat: web UI with document viewer and overlay toggle
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 18:56:51 -06:00
Alex-GilbertandClaude Opus 4.6 c95b6cb9d7 feat: FastAPI backend with upload, overlay, and data endpoints
Adds POST /api/upload (runs full pipeline: rasterize, OCR, font detect,
overlay), GET endpoints for original/overlay images and OCR data JSON.
Also adds python-multipart, anyio, and pytest-anyio dependencies.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 18:53:48 -06:00
Alex-GilbertandClaude Opus 4.6 73320365a3 feat: green text overlay renderer
Add render_overlay() that composites semi-transparent green text on
the original document image using the detected font. This is the
visual proof mechanism for font detection accuracy. Also adds numpy
to project dependencies for test pixel analysis.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 18:49:39 -06:00
Alex-GilbertandClaude Opus 4.6 2a3a0f2076 feat: font detection by comparing rendered vs OCR'd word widths
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 18:46:07 -06:00
Alex-GilbertandClaude Opus 4.6 b79ca81965 feat: OCR module with character-level bounding boxes
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 18:41:05 -06:00
Alex-GilbertandClaude Opus 4.6 420e20a8cf feat: PDF rasterization module
Add rasterize_pdf() that converts PDF pages to PIL images using
pdf2image. Supports configurable DPI and page range selection.
Includes tests verifying multi-page output, high-DPI dimensions,
and single-page extraction.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 18:38:50 -06:00
Alex-GilbertandClaude Opus 4.6 94877952db feat: project scaffolding with dependencies
Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 18:36:10 -06:00
Alex-GilbertandClaude Opus 4.6 75834d4a85 Add Stage 1 implementation plan: font matching overlay
9 tasks covering: project scaffolding, PDF rasterization, OCR with
character bounding boxes, font detection, green overlay renderer,
FastAPI backend, web UI, alignment calibration, and E2E smoke test.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 18:31:26 -06:00
Alex-GilbertandClaude Opus 4.6 3431ea1d30 Add initial design doc for unredact tool
AI-powered redaction analysis tool for Epstein case files.
Image-first pipeline: OCR, font detection, redaction detection,
constraint solving, and Claude API guessing with visual overlay
verification.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-15 18:27:29 -06:00