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