fix(voice): hear "یادداشت" as a note request, and stop the note at the next instruction

Two reports from live dictation in fa.

The locale trigger vocabulary listed only verbs that ask for a note ("بنویس",
"یادداشت کن"). Naming the field itself — "توی یادداشت‌ها بنویس", "در توضیحات" —
reported no commentTrigger, and the resolver discards a comment without one, so
the note was silently dropped. Added the field-name shape to fa, en and nl.

Where the dictated note ends was never stated, so the model answered it
inconsistently: "توی توضیحات بنویس سلام چطوری و بفرست برای لابراتوآر سانشاین"
sometimes put the lab dispatch inside the comment. Added a no-overlap rule — a
clause reported as a lab, tooth, prosthesis or deadline is an instruction and
must not appear in comment as well — with that sentence as a worked example.

Both rules go in the prompt and in the JSON-schema field descriptions, because
the schema description is what the model reads while filling the field. No code
enforcement for the second: stripping an extracted clause out of free-speech
note text by string matching is guesswork, and the review sheet shows the note
before it is saved.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-11 19:33:49 +08:00
parent b71b4e9ca9
commit 78fd3eb092
4 changed files with 61 additions and 8 deletions

View File

@@ -535,7 +535,21 @@ what was captured, so nothing is hidden by leaving it out.
Per-locale trigger vocabulary lives in the prompt's locale notes, exactly like the tooth
vocabulary. The resolver only checks that a trigger was reported, so it needs no per-locale
knowledge and stays locale-neutral by construction (§6).
knowledge and stays locale-neutral by construction (§6). The vocabulary covers two shapes: a
verb that asks («بنویس که», "noteer") and the *name of the field* the words go into («یادداشت»,
«یادداشت‌ها», «توضیحات», "notes", "comments"). Naming the field is how a clinician usually asks,
and the first version listed only the verbs, so «توی یادداشت‌ها بنویس» produced no trigger and
the note was discarded.
Where the dictated note ends is a second question, and the model answered it inconsistently: for
«توی توضیحات بنویس سلام چطوری و بفرست برای لابراتوآر سانشاین» the note sometimes ran to the end
of the sentence and swallowed the lab dispatch. The rule is that the note ends where the next
instruction begins, stated as a no-overlap invariant: a clause reported as a lab, a tooth, a
prosthesis or a deadline is that instruction and must not also appear in `comment`. It lives in
both the prompt and the JSON-schema field description, because the schema description is what the
model reads while it fills the field. This is a prompt-side rule with no code enforcement —
stripping an already-extracted clause out of the note text by string matching would be guesswork
on free speech, and the review sheet shows the note before it is saved.
### Prosthesis work implies the treatment type