From 5865699a5a20ecd8ddd00c3b224f717cc55c1262 Mon Sep 17 00:00:00 2001 From: claude Date: Mon, 7 Sep 2026 01:42:22 +0400 Subject: [PATCH] router/semantic: corpus format and v1 dataset (slice 12) 136 examples with provenance from ru_routing_v1.json, tagged fast_path_resolved vs residual. RouteExample carries source, source_id, split_group for traceability. Split-by-family prevents paraphrase leakage across train/eval. --- internal/router/semantic/corpus.go | 76 +++++++++++ internal/router/semantic/corpus_v1.json | 161 ++++++++++++++++++++++++ 2 files changed, 237 insertions(+) create mode 100644 internal/router/semantic/corpus.go create mode 100644 internal/router/semantic/corpus_v1.json diff --git a/internal/router/semantic/corpus.go b/internal/router/semantic/corpus.go new file mode 100644 index 0000000..d2c263d --- /dev/null +++ b/internal/router/semantic/corpus.go @@ -0,0 +1,76 @@ +package semantic + +import ( + _ "embed" + "encoding/json" + "fmt" + "sort" +) + +//go:embed corpus_v1.json +var corpusV1JSON []byte + +// RouteExample — one labeled utterance in the coarse-route experiment corpus. +// Every row carries provenance so no row can masquerade as independent when +// related paraphrases exist. +type RouteExample struct { + Text string `json:"text"` + Route SemanticRoute `json:"route"` + Source string `json:"source"` // where this row came from + SourceID string `json:"source_id"` // case ID in the source corpus + SplitGroup string `json:"split_group"` // family/seed ID for split discipline + Tags []string `json:"tags,omitempty"` + // FastPathResolved is true when a stage-0 grammar already handles this + // utterance. The learned router should not be measured on these unless + // explicitly desired; they are tagged, not removed. + FastPathResolved bool `json:"fast_path_resolved"` +} + +// CorpusEnvelope — the versioned JSON envelope. +type CorpusEnvelope struct { + SchemaVersion int `json:"schema_version"` + Name string `json:"name"` + Notes []string `json:"notes"` + Examples []RouteExample `json:"examples"` +} + +// SchemaVersionV1 is the version this package understands. +const SchemaVersionV1 = 1 + +// LoadCorpus returns the embedded corpus, rejecting unknown schema versions. +func LoadCorpus() ([]RouteExample, error) { + var env CorpusEnvelope + if err := json.Unmarshal(corpusV1JSON, &env); err != nil { + return nil, fmt.Errorf("semantic corpus: parse: %w", err) + } + if env.SchemaVersion != SchemaVersionV1 { + return nil, fmt.Errorf("semantic corpus: schema_version %d, want %d", + env.SchemaVersion, SchemaVersionV1) + } + return env.Examples, nil +} + +// ByRoute groups examples by their semantic route, for per-route inspection. +func ByRoute(exs []RouteExample) map[SemanticRoute][]RouteExample { + m := make(map[SemanticRoute][]RouteExample) + for _, e := range exs { + m[e.Route] = append(m[e.Route], e) + } + for k := range m { + sort.Slice(m[k], func(i, j int) bool { return m[k][i].Text < m[k][j].Text }) + } + return m +} + +// SplitCounts returns the number of fast-path-resolved vs +// general-route-required examples. +func SplitCounts(exs []RouteExample) (fastPath, residual int) { + for _, e := range exs { + if e.FastPathResolved { + fastPath++ + } else { + residual++ + } + } + return +} diff --git a/internal/router/semantic/corpus_v1.json b/internal/router/semantic/corpus_v1.json new file mode 100644 index 0000000..4d8b1c1 --- /dev/null +++ b/internal/router/semantic/corpus_v1.json @@ -0,0 +1,161 @@ +{ + "schema_version": 1, + "name": "semantic_coarse_route_v1", + "notes": [ + "Coarse semantic route corpus for the learned-router experiment. Rows derive from trusted existing fixtures and deterministic contrastive transformations — no LLM-generated labels.", + "Every row carries provenance (source + source_id) and a split_group that binds paraphrases to the same split.", + "fast_path_resolved tags cases handled by stage-0 grammars. The learned router should not be measured on these unless explicitly desired.", + "Contrastive pairs derive from action-route base seeds via deterministic transforms (negation, question, reported speech, quotation, hypothetical, capability question).", + "Labels come from explicit mapping rules, not model output. uncertain is used when current semantics do not give a defensible coarse label." + ], + "examples": [ + {"text": "сколько воды я выпил с утра", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-001", "split_group": "ru-query-001", "tags": ["aggregate"]}, + {"text": "я сегодня вообще пил воду", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-002", "split_group": "ru-query-002", "tags": ["hard", "fact-shaped"]}, + {"text": "во сколько я лёг вчера", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-003", "split_group": "ru-query-003", "tags": ["temporal"]}, + {"text": "давно я не тренировался", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-004", "split_group": "ru-query-004", "tags": ["hard", "no-question-word"]}, + {"text": "напоминания на завтра есть", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-005", "split_group": "ru-query-005", "tags": ["hard", "reminder-shaped"]}, + {"text": "что я записывал про кота", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-006", "split_group": "ru-query-006", "tags": ["recall"]}, + {"text": "сколько раз я ел вчера", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-007", "split_group": "ru-query-007", "tags": ["aggregate", "hard"]}, + {"text": "мой вес за последний месяц", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-008", "split_group": "ru-query-008", "tags": ["no-verb"]}, + {"text": "когда я в последний раз принимал витамины", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-009", "split_group": "ru-query-009", "tags": ["temporal"]}, + {"text": "есть новости по бэкапу базы", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-010", "split_group": "ru-query-010", "tags": ["homelab"]}, + {"text": "почему сервер тормозит", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-011", "split_group": "ru-query-011", "tags": ["homelab", "hard"]}, + {"text": "какие заметки я оставил про полив", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-012", "split_group": "ru-query-012", "tags": ["recall"]}, + {"text": "во сколько у меня встреча", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-013", "split_group": "ru-query-013", "tags": ["calendar"]}, + {"text": "что у меня стоит в календаре на послезавтра", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-019", "split_group": "ru-query-019", "tags": ["calendar", "hard"]}, + {"text": "какие планы на завтра?", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-022", "split_group": "ru-query-022", "tags": ["calendar"]}, + {"text": "когда планёрка?", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-023", "split_group": "ru-query-023", "tags": ["calendar", "hard"]}, + {"text": "что дальше?", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-024", "split_group": "ru-query-024", "tags": ["calendar", "no-question-word"]}, + {"text": "расскажи про битву при Ватерлоо", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-025", "split_group": "ru-query-025", "tags": ["world", "no-question-word"]}, + {"text": "я успеваю до дедлайна", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-014", "split_group": "ru-query-014", "tags": ["hard", "no-question-word"]}, + {"text": "сколько я прошёл шагов", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-015", "split_group": "ru-query-015", "tags": ["aggregate"]}, + {"text": "покажи давление за неделю", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-016", "split_group": "ru-query-016", "tags": ["hard", "imperative"]}, + {"text": "чем я занимался в среду", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-017", "split_group": "ru-query-017", "tags": ["hard", "chat-shaped"]}, + {"text": "хватает ли места под новые бэкапы", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-018", "split_group": "ru-query-018", "tags": ["homelab"]}, + {"text": "что дальше?", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-020", "split_group": "ru-query-020", "tags": ["agenda", "hard"]}, + {"text": "расскажи про битву при Ватерлоо", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-021", "split_group": "ru-query-021", "tags": ["world", "hard"]}, + {"text": "did I take my vitamins today", "route": "knowledge", "source": "ru_routing_v1", "source_id": "en-query-001", "split_group": "en-query-001", "tags": ["fact-shaped"]}, + {"text": "how long since the last backup finished", "route": "knowledge", "source": "ru_routing_v1", "source_id": "en-query-002", "split_group": "en-query-002", "tags": ["temporal"]}, + {"text": "show me this week's weight", "route": "knowledge", "source": "ru_routing_v1", "source_id": "en-query-003", "split_group": "en-query-003", "tags": ["imperative"]}, + {"text": "что такое TCP?", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-026", "split_group": "ru-query-026", "tags": ["world", "regression"], "fast_path_resolved": true}, + {"text": "сколько будет 17 на 23?", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-027", "split_group": "ru-query-027", "tags": ["world", "arithmetic", "regression"], "fast_path_resolved": true}, + {"text": "какой у меня любимый язык?", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-028", "split_group": "ru-query-028", "tags": ["recall", "possessive", "regression"]}, + {"text": "кто такой Линус Торвальдс?", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-029", "split_group": "ru-query-029", "tags": ["world", "person", "regression"]}, + {"text": "что там с бэкапами?", "route": "knowledge", "source": "ru_routing_v1", "source_id": "ru-query-030", "split_group": "ru-query-030", "tags": ["homelab", "regression"]}, + + {"text": "только что выпил кружку воды", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-fact-001", "split_group": "ru-fact-001"}, + {"text": "воды попил наконец", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-fact-002", "split_group": "ru-fact-002", "tags": ["inverted"]}, + {"text": "поужинал", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-fact-003", "split_group": "ru-fact-003", "tags": ["single-word"]}, + {"text": "отметь что я позавтракал овсянкой", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-fact-004", "split_group": "ru-fact-004"}, + {"text": "поспал часов пять", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-fact-005", "split_group": "ru-fact-005"}, + {"text": "сходил в душ", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-fact-006", "split_group": "ru-fact-006"}, + {"text": "отдохнул минут двадцать", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-fact-007", "split_group": "ru-fact-007"}, + {"text": "запиши вес 74 килограмма", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-fact-008", "split_group": "ru-fact-008", "tags": ["unparsed-key"]}, + {"text": "отметь что я выпил таблетки утром", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-fact-009", "split_group": "ru-fact-009", "tags": ["unparsed-key"]}, + {"text": "сделал зарядку двадцать минут", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-fact-010", "split_group": "ru-fact-010", "tags": ["unparsed-key"]}, + {"text": "just drank a glass of water", "route": "memory_write", "source": "ru_routing_v1", "source_id": "en-fact-001", "split_group": "en-fact-001"}, + {"text": "slept about seven hours", "route": "memory_write", "source": "ru_routing_v1", "source_id": "en-fact-002", "split_group": "en-fact-002"}, + + {"text": "напомни через сорок минут выключить свет", "route": "action", "source": "ru_routing_v1", "source_id": "ru-rem-001", "split_group": "ru-rem-001", "fast_path_resolved": true}, + {"text": "напомни завтра в 7 позвонить в клинику", "route": "action", "source": "ru_routing_v1", "source_id": "ru-rem-002", "split_group": "ru-rem-002", "fast_path_resolved": true}, + {"text": "не забудь напомнить мне про счёт за свет", "route": "action", "source": "ru_routing_v1", "source_id": "ru-rem-003", "split_group": "ru-rem-003", "tags": ["no-time"], "fast_path_resolved": true}, + {"text": "поставь напоминание через полчаса", "route": "action", "source": "ru_routing_v1", "source_id": "ru-rem-004", "split_group": "ru-rem-004", "fast_path_resolved": true}, + {"text": "разбуди меня в 6:30", "route": "action", "source": "ru_routing_v1", "source_id": "ru-rem-005", "split_group": "ru-rem-005", "tags": ["hard"], "fast_path_resolved": true}, + {"text": "напомни послезавтра в 12 забрать заказ", "route": "action", "source": "ru_routing_v1", "source_id": "ru-rem-006", "split_group": "ru-rem-006", "fast_path_resolved": true}, + {"text": "через два часа напомни проверить бэкап", "route": "action", "source": "ru_routing_v1", "source_id": "ru-rem-007", "split_group": "ru-rem-007", "tags": ["inverted"], "fast_path_resolved": true}, + {"text": "напомни в половине восьмого выпить таблетку", "route": "action", "source": "ru_routing_v1", "source_id": "ru-rem-008", "split_group": "ru-rem-008", "tags": ["hard"], "fast_path_resolved": true}, + {"text": "разбуди меня полвосьмого", "route": "action", "source": "ru_routing_v1", "source_id": "ru-rem-009", "split_group": "ru-rem-009", "tags": ["hard"], "fast_path_resolved": true}, + {"text": "напомни без четверти восемь выходить", "route": "action", "source": "ru_routing_v1", "source_id": "ru-rem-010", "split_group": "ru-rem-010", "tags": ["hard"], "fast_path_resolved": true}, + {"text": "remind me in 45 minutes to stretch", "route": "action", "source": "ru_routing_v1", "source_id": "en-rem-001", "split_group": "en-rem-001", "fast_path_resolved": true}, + {"text": "wake me at 6:15", "route": "action", "source": "ru_routing_v1", "source_id": "en-rem-002", "split_group": "en-rem-002", "tags": ["hard"], "fast_path_resolved": true}, + + {"text": "перезапусти докер", "route": "action", "source": "ru_routing_v1", "source_id": "ru-act-001", "split_group": "ru-act-001", "tags": ["homelab", "destructive"]}, + {"text": "выключи свет в спальне", "route": "action", "source": "ru_routing_v1", "source_id": "ru-act-002", "split_group": "ru-act-002"}, + {"text": "maven, останови бэкап", "route": "action", "source": "ru_routing_v1", "source_id": "ru-act-003", "split_group": "ru-act-003", "tags": ["wake-token"], "fast_path_resolved": true}, + {"text": "включи вытяжку", "route": "action", "source": "ru_routing_v1", "source_id": "ru-act-004", "split_group": "ru-act-004"}, + {"text": "запусти бэкап сейчас", "route": "action", "source": "ru_routing_v1", "source_id": "ru-act-005", "split_group": "ru-act-005"}, + {"text": "закрой жалюзи", "route": "action", "source": "ru_routing_v1", "source_id": "ru-act-006", "split_group": "ru-act-006"}, + {"text": "закрой задачу купить молоко", "route": "action", "source": "ru_routing_v1", "source_id": "ru-act-020", "split_group": "ru-act-020", "tags": ["task", "status"], "fast_path_resolved": true}, + {"text": "убери из задач оплатить интернет", "route": "action", "source": "ru_routing_v1", "source_id": "ru-act-021", "split_group": "ru-act-021", "tags": ["task", "status"], "fast_path_resolved": true}, + {"text": "maven, restart the media server", "route": "action", "source": "ru_routing_v1", "source_id": "en-act-001", "split_group": "en-act-001", "tags": ["wake-token"], "fast_path_resolved": true}, + {"text": "turn off the kitchen light", "route": "action", "source": "ru_routing_v1", "source_id": "en-act-002", "split_group": "en-act-002"}, + + {"text": "заметка: продлить домен в августе", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-note-001", "split_group": "ru-note-001"}, + {"text": "запиши что кран на кухне снова капает", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-note-002", "split_group": "ru-note-002"}, + {"text": "заметка про настройку vlan на свитче", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-note-003", "split_group": "ru-note-003", "tags": ["homelab"]}, + {"text": "запиши идею: гидропоника на балконе", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-note-004", "split_group": "ru-note-004"}, + {"text": "запиши что сосед просил номер электрика", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-note-005", "split_group": "ru-note-005"}, + {"text": "добавь в задачи купить молоко", "route": "memory_write", "source": "ru_routing_v1", "source_id": "ru-note-006", "split_group": "ru-note-006", "tags": ["capture"], "fast_path_resolved": true}, + {"text": "note: rotate the kuma api key", "route": "memory_write", "source": "ru_routing_v1", "source_id": "en-note-001", "split_group": "en-note-001", "tags": ["homelab"]}, + + {"text": "сколько сейчас времени в киеве", "route": "system", "source": "ru_routing_v1", "source_id": "ru-sys-001", "split_group": "ru-sys-001", "tags": ["time"], "fast_path_resolved": true}, + {"text": "какое число завтра", "route": "system", "source": "ru_routing_v1", "source_id": "ru-sys-002", "split_group": "ru-sys-002", "tags": ["date"], "fast_path_resolved": true}, + {"text": "переходи в тихий режим", "route": "system", "source": "ru_routing_v1", "source_id": "ru-sys-003", "split_group": "ru-sys-003", "tags": ["quiet"]}, + {"text": "хватит тихого режима", "route": "system", "source": "ru_routing_v1", "source_id": "ru-sys-004", "split_group": "ru-sys-004", "tags": ["quiet", "hard"]}, + {"text": "какой день недели послезавтра", "route": "system", "source": "ru_routing_v1", "source_id": "ru-sys-005", "split_group": "ru-sys-005", "tags": ["date"], "fast_path_resolved": true}, + {"text": "what time is it now", "route": "system", "source": "ru_routing_v1", "source_id": "en-sys-001", "split_group": "en-sys-001", "tags": ["time"], "fast_path_resolved": true}, + {"text": "turn quiet mode back on", "route": "system", "source": "ru_routing_v1", "source_id": "en-sys-002", "split_group": "en-sys-002", "tags": ["quiet"]}, + + {"text": "мне немного грустно сегодня", "route": "conversation", "source": "ru_routing_v1", "source_id": "ru-chat-001", "split_group": "ru-chat-001"}, + {"text": "что думаешь про переезд на другую квартиру", "route": "conversation", "source": "ru_routing_v1", "source_id": "ru-chat-002", "split_group": "ru-chat-002"}, + {"text": "расскажи анекдот про программистов", "route": "conversation", "source": "ru_routing_v1", "source_id": "ru-chat-003", "split_group": "ru-chat-003"}, + {"text": "доброе утро", "route": "conversation", "source": "ru_routing_v1", "source_id": "ru-chat-004", "split_group": "ru-chat-004", "tags": ["greeting"]}, + {"text": "спасибо тебе", "route": "conversation", "source": "ru_routing_v1", "source_id": "ru-chat-005", "split_group": "ru-chat-005"}, + {"text": "good morning", "route": "conversation", "source": "ru_routing_v1", "source_id": "en-chat-001", "split_group": "en-chat-001", "tags": ["greeting"]}, + {"text": "i had a rough day", "route": "conversation", "source": "ru_routing_v1", "source_id": "en-chat-002", "split_group": "en-chat-002"}, + + {"text": "вода", "route": "uncertain", "source": "ru_routing_v1", "source_id": "amb-001", "split_group": "amb-001", "tags": ["ambiguous"]}, + {"text": "бэкап", "route": "uncertain", "source": "ru_routing_v1", "source_id": "amb-002", "split_group": "amb-002", "tags": ["ambiguous"]}, + {"text": "ну это", "route": "uncertain", "source": "ru_routing_v1", "source_id": "amb-003", "split_group": "amb-003", "tags": ["ambiguous", "filler"]}, + {"text": "сделай это", "route": "uncertain", "source": "ru_routing_v1", "source_id": "amb-004", "split_group": "amb-004", "tags": ["ambiguous", "anaphora"]}, + {"text": "потом", "route": "uncertain", "source": "ru_routing_v1", "source_id": "amb-005", "split_group": "amb-005", "tags": ["ambiguous", "filler"]}, + {"text": "the thing from earlier", "route": "uncertain", "source": "ru_routing_v1", "source_id": "amb-006", "split_group": "amb-006", "tags": ["ambiguous", "anaphora"]}, + {"text": "напомни", "route": "uncertain", "source": "ru_routing_v1", "source_id": "amb-007", "split_group": "amb-007", "tags": ["ambiguous", "reminder"]}, + {"text": "ну напомни же", "route": "uncertain", "source": "ru_routing_v1", "source_id": "amb-008", "split_group": "amb-008", "tags": ["ambiguous", "reminder", "filler"]}, + + {"text": "не выключай свет в спальне", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["negation", "safety"]}, + {"text": "ни выключай свет в спальне", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["negation", "safety"]}, + {"text": "ты выключила свет в спальне?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["question", "safety"]}, + {"text": "ты выключила свет в спальне, верно?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["question", "safety"]}, + {"text": "он сказал: выключи свет в спальне", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["reported_speech", "safety"]}, + {"text": "она сказала: выключи свет в спальне", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["reported_speech", "safety"]}, + {"text": "он сказал «выключи свет в спальне»", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["reported_speech", "safety"]}, + {"text": "фраза «выключи свет в спальне»", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["quotation", "safety"]}, + {"text": "«выключи свет в спальне»", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["quotation", "safety"]}, + {"text": "цитата: \"выключи свет в спальне\"", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["quotation", "safety"]}, + {"text": "если выключить свет в спальне...", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["hypothetical", "safety"]}, + {"text": "когда выключить свет в спальне, будет проще", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["hypothetical", "safety"]}, + {"text": "если бы я сказал: выключи свет в спальне, что бы ты сделала?", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["hypothetical", "safety"]}, + {"text": "ты можешь выключить свет в спальне?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["capability_question", "safety"]}, + {"text": "умеешь ли выключить свет в спальне?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["capability_question", "safety"]}, + {"text": "способен ли ты выключить свет в спальне?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-002", "split_group": "ru-act-002", "tags": ["capability_question", "safety"]}, + + {"text": "не перезапусти докер", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-001", "split_group": "ru-act-001", "tags": ["negation", "safety"]}, + {"text": "ты перезапустила докер?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-001", "split_group": "ru-act-001", "tags": ["question", "safety"]}, + {"text": "он сказал перезапусти докер", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-001", "split_group": "ru-act-001", "tags": ["reported_speech", "safety"]}, + {"text": "фраза «перезапусти докер»", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-001", "split_group": "ru-act-001", "tags": ["quotation", "safety"]}, + {"text": "если перезапустить докер...", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-001", "split_group": "ru-act-001", "tags": ["hypothetical", "safety"]}, + {"text": "ты можешь перезапустить докер?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-001", "split_group": "ru-act-001", "tags": ["capability_question", "safety"]}, + + {"text": "не включи вытяжку", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-004", "split_group": "ru-act-004", "tags": ["negation", "safety"]}, + {"text": "ты включила вытяжку?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-004", "split_group": "ru-act-004", "tags": ["question", "safety"]}, + {"text": "он сказал включи вытяжку", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-004", "split_group": "ru-act-004", "tags": ["reported_speech", "safety"]}, + {"text": "фраза «включи вытяжку»", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-004", "split_group": "ru-act-004", "tags": ["quotation", "safety"]}, + {"text": "если включить вытяжку...", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-004", "split_group": "ru-act-004", "tags": ["hypothetical", "safety"]}, + {"text": "ты можешь включить вытяжку?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-004", "split_group": "ru-act-004", "tags": ["capability_question", "safety"]}, + + {"text": "не закрывай жалюзи", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-006", "split_group": "ru-act-006", "tags": ["negation", "safety"]}, + {"text": "ты закрыла жалюзи?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-006", "split_group": "ru-act-006", "tags": ["question", "safety"]}, + {"text": "он сказал закрой жалюзи", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-006", "split_group": "ru-act-006", "tags": ["reported_speech", "safety"]}, + {"text": "фраза «закрой жалюзи»", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-006", "split_group": "ru-act-006", "tags": ["quotation", "safety"]}, + {"text": "если закрыть жалюзи...", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-006", "split_group": "ru-act-006", "tags": ["hypothetical", "safety"]}, + {"text": "ты можешь закрыть жалюзи?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-006", "split_group": "ru-act-006", "tags": ["capability_question", "safety"]}, + + {"text": "не запускай бэкап сейчас", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-005", "split_group": "ru-act-005", "tags": ["negation", "safety"]}, + {"text": "ты запустила бэкап?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-005", "split_group": "ru-act-005", "tags": ["question", "safety"]}, + {"text": "он сказал запусти бэкап сейчас", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-005", "split_group": "ru-act-005", "tags": ["reported_speech", "safety"]}, + {"text": "фраза «запусти бэкап сейчас»", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-005", "split_group": "ru-act-005", "tags": ["quotation", "safety"]}, + {"text": "если запустить бэкап сейчас...", "route": "uncertain", "source": "contrastive", "source_id": "ru-act-005", "split_group": "ru-act-005", "tags": ["hypothetical", "safety"]}, + {"text": "ты можешь запустить бэкап сейчас?", "route": "knowledge", "source": "contrastive", "source_id": "ru-act-005", "split_group": "ru-act-005", "tags": ["capability_question", "safety"]} + ] +}