10975eff07
Measured on the box at 04:45: "что дальше?" read 43 entries, 05:45 to 21:12, as one spoken sentence. The rest-of-day path already trimmed to what had not happened yet, and at 04:45 that trim removes nothing — the whole day is still ahead. Trimming was never the narrowing; nothing capped the read. Plan.Next(now, n) is After with a cap, and the overflow is counted rather than dropped. The cap is three. One entry is defensible and reads as an oracle: it says what is next and says nothing about whether the day is full. Three is what the feed already reads back for headlines, it fits in one breath, and the reply is spoken — he cannot scroll it back. Above three the answer stops being an answer and becomes a recital, which is the defect. The sentence says whether more remains: plan_next is "дальше: …" and plan_next_more appends "и ещё 40 дел до конца дня." So a capped answer never implies the day ends after the third line. After is now strictly after now. An entry at exactly the asking minute is the thing happening, not the thing next. "что у меня сегодня?" is untouched and was never on this path: it carries no plan word, so IsDayPlanQuery declines it and the calendar listing answers the whole day. TestWholeDayQuestionIsNotTheRestOfTheDay pins the two apart. The empty case already said the right thing — plan_rest_empty, "на сегодня больше ничего не запланировано", not the whole-day empty line that would deny a day he just lived — and now has a test at the cap boundary too. Routing fixture unchanged, 64/91 (70.3% full, 70.3% intent-only) before and after: no router file is touched. Suite green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
165 lines
6.7 KiB
JSON
165 lines
6.7 KiB
JSON
{
|
|
"schema_version": 1,
|
|
"name": "russian summary sentences v1",
|
|
"notes": [
|
|
"The sentences she builds around aggregated data: the morning plan, the ranked task list, and the habits she reads back out of behaviour records.",
|
|
"Rules: she is feminine about herself, he is a man addressed as ты. Never вы/вас/ваш, never он/его about him. No pet names.",
|
|
"\"I have not seen enough yet\" and \"there is nothing there\" are different claims, and the habit entries keep the first. Three days of taps do not license a statement about his life, so habit_*_none says she does not see a pattern, never that he has no habits.",
|
|
"She reports on the records, not on him. «всё как обычно» is a claim about what she has stored; «у тебя нет ничего особенного» is a verdict on his life, and she does not pass those.",
|
|
"Placeholders: {date} a formatted date, {items} a joined list, {items_sat} and {items_sun} the same for one weekend day each, {day} a weekday name, {span} the stretch of records a habit claim rests on, {line} one already-rendered plan line, {key} a behaviour key she has no gloss for, {gloss} the readable name of one, {time} a clock time, {n} a count, {word} the Russian count form for {n}, built Go-side.",
|
|
"Three parallel entries share one scheme: habit_weekend_both names its two lists {items_sat} and {items_sun}, and habit_weekend_sat and habit_weekend_sun each use {items}, because each of them says one list.",
|
|
"The count forms (день/дня/дней) are morphology, not copy. They stay in Go and arrive here through {word}. An abbreviation is not an option: «дн.» is written shorthand and every line here is spoken, so it reads as garbage or gets spelled out letter by letter.",
|
|
"{line} in plan_uncertain is another rendered line, so the join reads as one sentence only while what arrives starts lowercase. The caller asserts that.",
|
|
"A joined list arrives with its own punctuation, so the entries that end on {items} carry no trailing period. The habit entries keep theirs, because there the list sits mid-sentence.",
|
|
"fixed: true means exactly one variant and no picking. Parallel entries agree on it, and a single-variant entry is fixed — in this file and in every other family. A test holds that."
|
|
],
|
|
"entries": {
|
|
"plan_rest_empty": {
|
|
"fixed": true,
|
|
"variants": ["на сегодня больше ничего не запланировано."]
|
|
},
|
|
"plan_day_empty": {
|
|
"fixed": true,
|
|
"variants": ["на {date} ничего не запланировано."]
|
|
},
|
|
"plan_day": {
|
|
"fixed": true,
|
|
"variants": ["план на {date}: {items}"]
|
|
},
|
|
"plan_uncertain": {
|
|
"fixed": true,
|
|
"variants": ["похоже, {line}"]
|
|
},
|
|
"plan_next": {
|
|
"fixed": true,
|
|
"variants": ["дальше: {items}"]
|
|
},
|
|
"plan_next_more": {
|
|
"fixed": true,
|
|
"variants": ["дальше: {items}. и ещё {n} {word} до конца дня."]
|
|
},
|
|
|
|
"tasks_none": {
|
|
"fixed": true,
|
|
"variants": ["задач нет."]
|
|
},
|
|
"tasks_first": {
|
|
"fixed": true,
|
|
"variants": ["сначала: {items}"]
|
|
},
|
|
"tasks_candidates": {
|
|
"fixed": true,
|
|
"variants": ["нашла ещё, но ты не подтверждал: {items}"]
|
|
},
|
|
|
|
"stall_overdue": {
|
|
"fixed": true,
|
|
"variants": ["{n} {word} просрочено"]
|
|
},
|
|
"stall_sitting": {
|
|
"fixed": true,
|
|
"variants": ["{n} {word} лежит дольше {days} {dayword}"]
|
|
},
|
|
"stall_unconfirmed": {
|
|
"fixed": true,
|
|
"variants": ["{n} {word} ждёт подтверждения"]
|
|
},
|
|
|
|
"reason_overdue": {
|
|
"fixed": true,
|
|
"variants": ["просрочено"]
|
|
},
|
|
"reason_overdue_days": {
|
|
"fixed": true,
|
|
"variants": ["просрочено на {n} {word}"]
|
|
},
|
|
"reason_today": {
|
|
"fixed": true,
|
|
"variants": ["сегодня"]
|
|
},
|
|
"reason_tomorrow": {
|
|
"fixed": true,
|
|
"variants": ["завтра"]
|
|
},
|
|
"reason_in_days": {
|
|
"fixed": true,
|
|
"variants": ["через {n} {word}"]
|
|
},
|
|
"reason_important": {
|
|
"fixed": true,
|
|
"variants": ["важно"]
|
|
},
|
|
"reason_urgent": {
|
|
"fixed": true,
|
|
"variants": ["срочно"]
|
|
},
|
|
"reason_stale": {
|
|
"fixed": true,
|
|
"variants": ["давно в списке"]
|
|
},
|
|
|
|
"habit_weekday": {
|
|
"fixed": true,
|
|
"variants": ["по {day} ты обычно {items}."]
|
|
},
|
|
"habit_weekday_same": {
|
|
"fixed": true,
|
|
"variants": ["по {day} всё как обычно — то же, что и в остальные дни: {items}."]
|
|
},
|
|
"habit_weekday_none": {
|
|
"variants": [
|
|
"по {day} я пока не вижу ничего постоянного.",
|
|
"по {day} постоянного пока не вижу — записей мало."
|
|
]
|
|
},
|
|
"habit_weekend_both": {
|
|
"fixed": true,
|
|
"variants": ["по субботам ты обычно {items_sat}, по воскресеньям — {items_sun}."]
|
|
},
|
|
"habit_weekend_sat": {
|
|
"fixed": true,
|
|
"variants": ["по субботам ты обычно {items}, а по воскресеньям постоянного нет."]
|
|
},
|
|
"habit_weekend_sun": {
|
|
"fixed": true,
|
|
"variants": ["по воскресеньям ты обычно {items}, а по субботам постоянного нет."]
|
|
},
|
|
"habit_weekend_same": {
|
|
"fixed": true,
|
|
"variants": ["по выходным всё как обычно — то же, что и в остальные дни: {items}."]
|
|
},
|
|
"habit_weekend_none": {
|
|
"variants": [
|
|
"по выходным я пока не вижу ничего постоянного.",
|
|
"по выходным постоянного пока не вижу — записей мало."
|
|
]
|
|
},
|
|
"habit_overall": {
|
|
"fixed": true,
|
|
"variants": ["обычно ты {items} — {span}."]
|
|
},
|
|
"habit_overall_none": {
|
|
"variants": [
|
|
"записей пока мало, про привычки не скажу.",
|
|
"пока мало записей, чтобы говорить о привычках."
|
|
]
|
|
},
|
|
"habit_span_today": {
|
|
"fixed": true,
|
|
"variants": ["по записям за сегодня"]
|
|
},
|
|
"habit_span_days": {
|
|
"fixed": true,
|
|
"variants": ["по записям за последние {n} {word}"]
|
|
},
|
|
"habit_unglossed": {
|
|
"fixed": true,
|
|
"variants": ["отмечаешь «{key}»"]
|
|
},
|
|
"habit_at": {
|
|
"fixed": true,
|
|
"variants": ["{gloss} около {time}"]
|
|
}
|
|
}
|
|
}
|