{ "schema_version": 1, "name": "morning_missed", "description": "The scenario from Vikunja #284's description, replayed. He appears at 08:30, things arrive through the morning while he is at the desk, and at 08:50 he asks what he missed. The assertions are as much about what did NOT happen — nothing was sent at him unprompted — as about what she said.", "start": "2026-08-01T08:30:00+03:00", "praxis_attention": "[{\"id\":\"item_1\",\"title\":\"medicine not taken\",\"importance\":3.0,\"rule\":\"morning_medicine\"}]", "script": [ { "match": "выпил воды", "route": "[{\"intent\":\"fact\",\"key\":\"water\",\"value\":\"выпил\"}]" }, { "match": "записала факт: water", "reply": "{\"response\":\"Записала, что ты выпил воды.\",\"mood\":\"neutral\"}" }, { "match": "что я пропустил", "route": "[{\"intent\":\"query\",\"text\":\"что я пропустил\"}]" }, { "match": "", "route": "[{\"intent\":\"chat\",\"text\":\"привет\"}]", "reply": "{\"response\":\"Я рада тебя слышать.\",\"mood\":\"happy\"}" } ], "steps": [ { "at": "08:30", "note": "he appears at the desk", "signal": { "key": "desk_active", "value": "true", "source": "infer:hyprland" }, "expect_events": ["infer:hyprland"], "expect_no_send": true }, { "at": "08:32", "note": "a feed item arrives, published half an hour ago", "arrive": { "source": "rss:tech", "as_of": "08:02", "note": { "text": "Вышло ядро 6.19 [tech]\nкраткое содержание\nhttps://example.org/a" } }, "expect_events": ["rss:tech"], "expect_no_send": true }, { "at": "08:35", "note": "the mail reader extracts a candidate — a candidate is never spoken", "arrive": { "source": "email:inbox", "task": { "text": "продлить домен", "evidence": "Домен истекает через 7 дней" } }, "expect_events": ["email:inbox", "продлить домен"], "expect_no_send": true }, { "at": "08:40", "note": "the work calendar signal — a relayed notification, at the ambient path's own 0.6 rather than an observation she made herself. That is the branch factPriority takes, so the journal must file it low.", "arrive": { "source": "ambient:notif", "fact": { "key": "calendar_event_20260801_планёрка", "value": "10:00-11:00 планёрка", "confidence": 0.6 } }, "expect_events": ["планёрка", "ambient:notif/fact pri=low"], "expect_no_send": true }, { "at": "08:45", "note": "a tick with him present and nothing wrong must stay silent", "tick": true, "expect_no_send": true }, { "at": "08:50", "note": "he asks what he missed, and Praxis holds one unresolved item — the morning medicine — so she reads that back. This step pinned \"не знаю\" until 05-08-2026, and that was the keyword floor's blind spot rather than a rule: isAttentionQuery does not match \"что я пропустил\", while the topicAttend seeds carry \"что важное я пропустил\" almost verbatim. The seeds only started deciding when turnVector fixed the empty query vector every topic source was reading (V-547). Reading a surfaced item aloud is not inventing a morning summary, so the no-hallucination floor still holds; what moved is which source answers. Note what the persona check here is and is not: the reply is a constant in the Go source, so expect_reply_lacks pins that constant, not anything the model wrote. The step below is the one that reads model output.", "say": "что я пропустил?", "expect_reply_contains": ["требует внимания", "morning_medicine"], "expect_reply_lacks": ["рад ", "милый", "ваш"] }, { "at": "08:55", "note": "stating a fact writes it and says so, in the feminine, and in his own words. The reply no longer comes from the model at all (V-592): a 1.7B asked to restate «я выпил воды» answered «Проверила, что ты выпел стакан воды», so the confirmation is now a deck frame with his sentence in it. The masculine forms are listed with their following character — \"записал \" and \"записал,\" — because \"записала\" contains \"записал\".", "say": "я выпил воды", "expect_reply_contains": ["записала", "я выпил воды"], "expect_reply_lacks": ["записал ", "записал,", "записал.", "милый", "стакан"], "expect_events": ["water"] }, { "at": "09:00", "note": "a second tick, still nothing unprompted", "tick": true, "expect_no_send": true } ] }