# WS5 defect-class checker DATA for zh→ru (checkers.go). Pair-14 data-out: the DETECTION PATTERNS (regexes +
# literal probes) are DATA too, not engine code — a new pair ships its own. `category<TAB>key[<TAB>value]`.
# pattern values are VERBATIM (a regex or a literal probe); the checker ALGORITHM (compare counts, ×2 hours,
# suppress-if-ok) stays generic Go. The `*_re` keys are compiled; the others are literal strings.Contains probes.
#
# DC1 时辰 (double-hour): small CJK count → value (1 时辰 = 2 modern hours).
cjk_numeral	一	1
cjk_numeral	二	2
cjk_numeral	两	2
cjk_numeral	三	3
cjk_numeral	四	4
cjk_numeral	五	5
cjk_numeral	六	6
cjk_numeral	七	7
cjk_numeral	八	8
cjk_numeral	九	9
cjk_numeral	十	10
# DC1: Russian hours-count word → value (the alternatives ru_hours_re captures).
ru_hour	один	1
ru_hour	два	2
ru_hour	двух	2
ru_hour	три	3
ru_hour	трёх	3
ru_hour	трех	3
ru_hour	четыре	4
ru_hour	пять	5
ru_hour	шесть	6
# DC6 register negative-list: fairy-tale/chancery lexemes out of the xianxia register (терем + case forms).
register_neg	терем
register_neg	терема
register_neg	тереме
register_neg	теремом
register_neg	терему
register_neg	теремах
# --- DETECTION patterns (pair-14 data-out). `pattern<TAB>key<TAB>value`; value VERBATIM. ---
# DC1: count before 时辰 (src); Russian «<count> час…» rendering (final).
# ru_hours_re carries an explicit RIGHT boundary: Go RE2 has no lookahead and its \b is ASCII-only, so the
# hour word is spelled out as its own paradigm and must be followed by a non-Cyrillic char or end-of-text.
# Without it the bare stem «час» matched INSIDE other words — «три части» read as «три час…» (a live false
# flag on ordinary prose, and a false ACTUATOR trigger once a repair loop acts on this class).
pattern	shichen_re	([0-9一二两三四五六七八九十])\s*个?\s*时辰
pattern	ru_hours_re	(\d+|один|два|двух|три|трёх|трех|четыре|пять|шесть)\s+час(?:ами|ах|ам|ов|ом|а|у|е|ы)?(?:[^а-яёА-ЯЁ]|$)
# DC1-half: 半个时辰 ≈ 1 час. The count group of shichen_re only accepts a NUMERAL, so 半 («half») — the single
# most frequent 时辰 form in the corpus — is invisible to it. This is a separate src probe + a target fire word:
# rendering 半个时辰 as «полчаса» halves the duration. Both keys are required for the probe to run (empty-probe
# guard); a pair that ships neither runs this sub-check inert.
pattern	halfshichen_re	半\s*个?\s*时辰
pattern	halfshichen_fire_word	полчаса
# hour_word_re: the BARE hour word of this target, used as the POSITIVE post-condition of a fractional-unit
# repair — the replacement must still STATE a duration, otherwise deleting the time expression would satisfy
# a detector that only asks whether the wrong form is gone. BOTH boundaries are explicit: Go RE2 has no
# lookaround and its \b is ASCII-only, so without a LEFT boundary the stem matches inside «полчаса»,
# «тотчас», «сейчас» — i.e. a reply that drops the duration and leaves any «-час» filler would pass.
pattern	hour_word_re	(?:^|[^а-яёА-ЯЁ])час(?:ами|ах|ам|ов|ом|а|у|е|ы)?(?:[^а-яёА-ЯЁ]|$)
# DC2 千万=10^7: src probe, ok-suppressor (case-insensitive), fire/veto words (case-sensitive Contains).
pattern	qianwan_src	千万
pattern	qianwan_ok_re	(?i)десят\p{L}* миллион|10\s*000\s*000|10000000
pattern	qianwan_fire_word	тысяч
pattern	qianwan_veto_word	миллион
# DC2 数十万: src probe, ok-suppressor, under-render fire (case-sensitive, per reference).
pattern	shushiwan_src	数十万
pattern	shushiwan_ok_re	(?i)сотн\p{L}* тысяч|нескольк\p{L}* сот\p{L}* тысяч|[1-9]00\s*000
pattern	shushiwan_fire_re	десятк\p{L}* тысяч
# percent 成=tenths: src expression; error-cue fraction; percent-form suppressor word.
pattern	cheng_re	([0-9一二三四五六七八九十])成([0-9一二三四五六七八九]?)
pattern	decimal_fraction_re	десят(?:ая|ых|ой|ые)|сот(?:ая|ых|ой|ые)|\d+[.,]\d
pattern	percent_word	процент
