7ddf94220d
Interpreter now returns a real per-detection confidence (source stays "auto"), so curator can reject the mis-detections it was blindly storing — e.g. a short English title mis-labelled as German and rewritten into the archive. The gate consumes ONLY Interpreter's own reported detection — curator does no language detection of its own (Scribe rule 133): a field is stored when the engine actually translated it AND either the detected language is CJK (script-detected, reliably high — ja/ko/zh trusted outright, incl. pure-kanji Japanese that lands as zh ~0.75) or the reported confidence clears a latin-script floor (_MIN_LATIN_CONFIDENCE = 0.90). A latin detection below the floor keeps the original and marks the post handled; a missing confidence fails open. The client already sent source="auto" and parsed confidence, so this is purely the gate + tests. Tests: pinned interpreter-client test now asserts source stays "auto"; new pure-unit gate tests (CJK trusted / latin floor / case-insensitive / fail-open) in the fast lane; end-to-end reject-low-latin, accept-high-latin, accept-low-cjk sweeps. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CgZP9v2otxVJymiYsnVuMy
34 lines
1.4 KiB
Python
34 lines
1.4 KiB
Python
"""Translation acceptance gate (#1376) — pure unit tests for ``_accept``, which
|
|
decides whether curator stores Interpreter's translation or keeps the original.
|
|
Curator does no detection of its own; it only thresholds Interpreter's reported
|
|
detected language + confidence (Scribe rule 133). No DB, no network."""
|
|
from backend.app.tasks.translation import _MIN_LATIN_CONFIDENCE, _accept
|
|
|
|
|
|
def test_accept_trusts_cjk_regardless_of_confidence():
|
|
# ja/ko/zh are script-detected — accepted even at a low reported number
|
|
# (pure-kanji Japanese can come back labelled zh ~0.75, still translated).
|
|
assert _accept("ja", None) is True
|
|
assert _accept("ja", 0.10) is True
|
|
assert _accept("ko", 0.99) is True
|
|
assert _accept("zh", 0.75) is True
|
|
assert _accept("zh-CN", 0.20) is True # region suffix is still CJK
|
|
|
|
|
|
def test_accept_requires_floor_for_latin():
|
|
assert _accept("de", 0.98) is True
|
|
assert _accept("de", _MIN_LATIN_CONFIDENCE) is True # exactly at floor
|
|
assert _accept("de", _MIN_LATIN_CONFIDENCE - 0.01) is False
|
|
assert _accept("fr", 0.40) is False # short mis-flag
|
|
|
|
|
|
def test_accept_is_case_insensitive():
|
|
assert _accept("JA", None) is True
|
|
assert _accept("DE", 0.40) is False
|
|
|
|
|
|
def test_accept_missing_confidence_fails_open():
|
|
# No confidence reported → don't silently drop a translation.
|
|
assert _accept("de", None) is True
|
|
assert _accept("", None) is True
|