# 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.