fix(backend): read a tooth code whatever script its digits are in
The extraction model transcribes Persian speech, so it can hand back "۲۶" in Persian digits or "2 6" from a digit-by-digit dictation. Both were compared literally against /^[1-8][1-8]$/, missed, and fell through to the positional branch with no quadrant — where the tooth was reported as "not understood". The clinician loses a tooth and is told the words were the problem. normalizeFdiCode() now runs at both the branch choice and the final validation, so the two cannot disagree. toLatinDigits moves out of jalali.ts into common/digits.ts: it was exported but unused in production, and a tooth module reaching into the calendar module would read as an accident. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -134,6 +134,14 @@ describe('resolveToothIntents', () => {
|
||||
}
|
||||
});
|
||||
|
||||
it('reads a spoken number as its FDI code, digits in any script', () => {
|
||||
// The product rule: the number the clinician says IS the tooth. 26 = quadrant 2
|
||||
// (patient's upper left) + position 6 = first molar.
|
||||
for (const raw of ['26', ' 26 ', '2 6', '\u06F2\u06F6', '\u0662\u0666']) {
|
||||
expect(resolveToothIntents([explicit(raw, 'x')]).teeth).toEqual(['26']);
|
||||
}
|
||||
});
|
||||
|
||||
it('trims an explicit code, matching normalizeTeeth', () => {
|
||||
expect(resolveToothIntents([explicit(' 14 ', 'x')]).teeth).toEqual(['14']);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user