POSA_Copyrighter/web/operator-gui/assets/case-portrait.svg
유창욱 3f7b3a9cf2 chore: initial commit of copyrighter (rights_filter)
Image rights / copyright detection system: SQLite store, HTTP app,
search integrations (Naver, Google Custom Search, Google Cloud Vision
web detection), image analysis (fingerprints, face/person detection,
evidence enrichment, risk scoring), an admin/review layer, governance
and retention policies, batch jobs, and a browser-based operator GUI.

This baseline incorporates a full code-review remediation pass
(46 fixes; 358 tests passing). Highlights:

CRITICAL
- Prevent evidence cascade-delete during the schema-constraint
  migration by disabling FK enforcement around the table rebuild.

Security
- Sandbox served media (neutralize stored XSS from uploaded/collected
  SVGs) via CSP + nosniff on the untrusted media routes.
- Strip embedded EXIF/GPS from external image derivatives before they
  are sent to third-party APIs.
- Return a clean 404 (not an uncaught StopIteration) for PATCH on an
  unknown provider.

Correctness
- LLM-summary failures no longer add +30 to the risk score.
- Decode only explicit JS escapes so Korean image URLs are not mangled.
- Consume search quota only after a successful request.
- Naver/Google adapters map responses inside the failure boundary, so a
  malformed response degrades to evidence instead of crashing enrichment.
- Domain-aware provider attribution; face-box IoU de-duplication; count
  searches (not result items); per-box crop isolation; clamp evidence
  confidence and Google CSE num; real submittedEpoch; and more.

Robustness
- Offline LLM connect fast-fails (short connect timeout) so seed/reload
  requests are not stalled; full read timeout preserved for generation.
- Malformed numeric env vars fall back to defaults instead of crashing
  startup.

Performance
- Per-submission evidence reads (no full-table scan per rescore),
  audit-log LIMIT, lazy active-store lookup, hoisted timestamps.

Tests
- ~24 regression tests added pinning the above fixes.

Runtime data (data/, outputs/, *.sqlite3, *.log), secrets (.env), and
node_modules are gitignored.
2026-06-09 09:50:31 +09:00

16 lines
1.1 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 480" role="img" aria-labelledby="title desc">
<title id="title">Generic portrait submission</title>
<desc id="desc">A stylized non-identifying portrait placeholder for the review console.</desc>
<rect width="640" height="480" fill="#e9e3d6"/>
<rect x="42" y="38" width="556" height="404" fill="#f7f4ee" stroke="#2f3a3d" stroke-width="6"/>
<circle cx="320" cy="170" r="72" fill="#d39a72"/>
<path d="M236 166c12-66 47-102 92-102 58 0 90 42 94 110-48-18-88-18-186-8z" fill="#273135"/>
<path d="M202 376c19-94 65-139 119-139 58 0 101 47 119 139z" fill="#315f72"/>
<path d="M236 376c30-48 58-73 86-73s57 25 84 73z" fill="#f0d6bd"/>
<circle cx="293" cy="170" r="7" fill="#172124"/>
<circle cx="348" cy="170" r="7" fill="#172124"/>
<path d="M288 210c23 18 45 18 66 0" fill="none" stroke="#7b4634" stroke-width="8" stroke-linecap="round"/>
<path d="M80 85h138M80 116h96" stroke="#8c7d68" stroke-width="10" stroke-linecap="round"/>
<rect x="468" y="78" width="78" height="26" fill="#c44b3f"/>
<rect x="468" y="116" width="48" height="18" fill="#d1a339"/>
</svg>