Session workflow: pickup and wrap around the task flow #85
Reference in New Issue
Block a user
Delete Branch "task/445-session-workflow"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes Vikunja #445.
Two git hooks (master guard, 300-line cap, V-ref) and two skills (
/pickup,/wrap) around the existingtaskCLI. CLAUDE.md now documents the whole flow, which it did not before.The grammar examples in chatSystemPrompt were full clauses — ("я подумала", "я рада") for her, ("ты сказал", "ты забыл") for him. A 1.7B copies those instead of generalising from them. Observed on homesrv 2026-08-01, in one session: all three chat replies opened with "Я подумала, что ...", and one ended "...немного тревожусь. ты сказал" — the second example pasted onto a finished sentence, which reads as a truncation and is not one. Contrastive pairs replace the openers, so the rule reads as a correction rather than a template. The him-examples are dropped; the "ты" instruction carries that on its own, and those two produced the worst output. A closing line tells her not to echo the instructions, because a small model treats a quoted string as licence to reuse it. Verified after rebuild: three chat turns, no "Я подумала" opener, no dangling example, feminine forms intact. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TrVSBKe3RFDF4fGYKWYQnXThe clarify gate thinned any one-word utterance to 0.3 confidence, which trips the stage-3 gate and comes back as "не совсем поняла". That is an English intuition. Russian packs subject, tense and gender into one word, so "поужинал" is a complete report and "привет" a complete greeting, and both got clarified. thinSingleToken keeps the rule for bare nominals, where it is real ("вода" is a fact-or-query coin flip), and spares two classes: a closed lexicon of social and control singles, and any token carrying a verb ending. Both tests are offline. Fixture: false clarifies 3 → 2, intent-only 74.0% → 75.3%, full accuracy unchanged at 70.1%, missed clarify still 1. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TrVSBKe3RFDF4fGYKWYQnXThe pre-route toggle knew "тихий режим" and every negation of it, but not the two phrasings that get spoken most: "включи режим тишины" (the setting named as a noun) and "сделай потише". Both fell through to the router, which has no quiet intent, so the command did nothing at all. Adds those as stem pairs, plus a quietWordStems list so the negated-but-unmatched fallback recognises "хватит тишины" the way it already recognised "хватит тихого режима". Locks the English phrasings from the routing fixture in the test table ("turn quiet mode back on", "turn off quiet mode", "stop quiet mode") — all three already behaved, none were covered. "на улице стало потише" and "в тишине лучше думается" stay inert: a single-word pattern still only matches a single-word utterance. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TrVSBKe3RFDF4fGYKWYQnX"во сколько у меня встреча" fell past the calendar, reached Kiwix, matched an article on the 2015 CPISRA World Games and came back phrased as his meeting. Inventing is worse than refusing, and as `system` this used to say "пока не умею". A new source sits between the notes pass and Kiwix: a question carrying a possession marker ("у меня", "мой", "my", "do i have", "did i") that his own data did not answer has no answer outside it either, so the walk stops there. The markers are possession, not first person, so "как мне сварить борщ" still reaches the encyclopedia. This is also where CLAUDE.md's privacy line lands: only the utterance may leave the box, and a question about him carries his life in the utterance. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TrVSBKe3RFDF4fGYKWYQnXThe replier and the meeting summariser were the two call sites without a GBNF. Both are exactly the shape that makes a Thinking variant answer with its reasoning as prose, and neither had anything downstream that could remove it. The replier already parses {"response","mood"}, so it now sends the phraser's grammar for that contract, exported once as phraser.ResponseGrammar so the two definitions cannot drift. The summariser stays text-in/text-out. The JSON wrapper is attached and unwrapped in the daemon's Completer, so internal/capture is unchanged and a Completer without a grammar still works. The simulator told routing from phrasing by "has a grammar", which stopped being true here; it now looks for the intent enum. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>8d1209c392toc0d61a71a4good to merge.