Russian names a half hour by the hour it is entering, in the genitive, so "половина восьмого" is 07:30 and never 08:30. Neither date parser read that shape, so the reminder parsed to nothing. rewriteHalfPast runs in front of the token pass in SpellOutDigits, so the python parser and the stub both see "в 7:30". It also reads the contracted "полвосьмого" and the quarter-to shape "без четверти восемь", which counts from a cardinal and is 07:45. Minus one is in one place, clockHourBefore, with twelve rather than zero before one. Ordinals eleven and twelve added to the lexicon, because a clock reaches them. Minutes a spoken clock does not use are left alone: a guess here is a missed dose. Classifier + onnx over the routing fixture 58/82 to 62/87, three new cases, none regressed. Python dateparser is not installed on this host, so only the stub was measured. See docs/evals/2026-08-05-half-past-hours.md.
1.8 KiB
Half-past and quarter-to hours, 2026-08-05
Vikunja V-538. rewriteHalfPast in internal/router/halfpast.go, run in front of
the token pass inside SpellOutDigits, so both date parsers see digits.
What the shapes are
Russian names a half hour by the hour being ENTERED, in the genitive. "половина
восьмого" is 07:30. "без четверти восемь" counts the other way, from a cardinal,
and is 07:45. Both are minus one from the word in the sentence, and the arithmetic
lives in one function, clockHourBefore.
Result
| before | after | |
|---|---|---|
| classifier + onnx over the routing fixture | 58/82 (70.7%) | 62/87 (71.3%) |
| new fixture cases passing | — | 2 of 3 |
| stub parser reads a half hour | no | yes |
The three new cases are ru-rem-008, ru-rem-009 and ru-rem-010. No existing case regressed and no new clarify appeared.
ru-rem-009, "разбуди меня полвосьмого", still misses the intent. Its two siblings
without a half hour miss it the same way. ru-rem-005 "разбуди меня в 6:30" routes
to fact, and en-rem-002 "wake me at 6:15" does too. So the miss is the "разбуди"
phrasing against the classifier, not the half hour. The time slot now fills.
Not measured here
Python dateparser. It is not installed on this host, so only the stub was run. The rewrite emits "в 7:30 вечера". The script's own qualifier rewrite turns that trailing "вечера" into "pm", which is the shape it already reads for a whole hour. Judge it on the box.
The LLM arm. No llama-server in this run, so the cascade number is the classifier floor.
Left out on purpose
Minutes a spoken clock does not use. "без семи восемь" is not rewritten, because nobody says it and a guess in this shape is a missed dose. The parsers fail on it as they did before.