From 568b7ec257f7d40ca03e727f66d0c713701aa343 Mon Sep 17 00:00:00 2001 From: chubihno Date: Mon, 23 Mar 2026 22:24:07 +0300 Subject: [PATCH] init --- .gitignore | 6 + config.template.toml | 487 ++++++++++++++++++ ege-skill | 1 + setup_config.py | 28 + skills/ege-checker/SKILL.md | 119 +++++ skills/ege-checker/ege-checker.skill | Bin 0 -> 6181 bytes skills/ege-checker/env.example | 2 + .../references/english-listening-criteria.md | 30 ++ .../references/russian-essay-criteria.md | 171 ++++++ 9 files changed, 844 insertions(+) create mode 100644 .gitignore create mode 100644 config.template.toml create mode 160000 ege-skill create mode 100644 setup_config.py create mode 100644 skills/ege-checker/SKILL.md create mode 100644 skills/ege-checker/ege-checker.skill create mode 100644 skills/ege-checker/env.example create mode 100644 skills/ege-checker/references/english-listening-criteria.md create mode 100644 skills/ege-checker/references/russian-essay-criteria.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fbf8b58 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.env +config.toml +venv/ +state/ +audit.log +__pycache__/ \ No newline at end of file diff --git a/config.template.toml b/config.template.toml new file mode 100644 index 0000000..84947b6 --- /dev/null +++ b/config.template.toml @@ -0,0 +1,487 @@ +api_key = "API_KEY_PLACEHOLDER" +default_provider = "custom:https://llm.lambda.coredump.ru/v1" +default_model = "qwen3.5-122b" +default_temperature = 0.7 +provider_timeout_secs = 120 +model_routes = [] +embedding_routes = [] + +[model_providers] + +[extra_headers] + +[observability] +backend = "none" +runtime_trace_mode = "none" +runtime_trace_path = "state/runtime-trace.jsonl" +runtime_trace_max_entries = 200 + +[autonomy] +level = "full" +workspace_only = true +allowed_commands = [ + "git", + "npm", + "cargo", + "ls", + "cat", + "grep", + "find", + "echo", + "pwd", + "wc", + "head", + "tail", + "date", + "curl", + "wget", +] +forbidden_paths = [ + "/etc", + "/root", + "/home", + "/usr", + "/bin", + "/sbin", + "/lib", + "/opt", + "/boot", + "/dev", + "/proc", + "/sys", + "/var", + "/tmp", + "~/.ssh", + "~/.gnupg", + "~/.aws", + "~/.config", +] +max_actions_per_hour = 20 +max_cost_per_day_cents = 500 +require_approval_for_medium_risk = true +block_high_risk_commands = true +shell_env_passthrough = [] +auto_approve = [ + "file_read", + "memory_recall", + "http_request", + "browser", + "web_fetch", + "web_search", +] +always_ask = [] +allowed_roots = [] +non_cli_excluded_tools = [] + +[security.sandbox] +backend = "none" +firejail_args = [] + +[security.resources] +max_memory_mb = 512 +max_cpu_time_seconds = 60 +max_subprocesses = 20 +memory_monitoring = true + +[security.audit] +enabled = true +log_path = "audit.log" +max_size_mb = 100 +sign_events = false + +[security.otp] +enabled = false +method = "totp" +token_ttl_secs = 30 +cache_valid_secs = 300 +gated_actions = [ + "shell", + "file_write", + "browser_open", + "browser", + "memory_forget", +] +gated_domains = [] +gated_domain_categories = [] + +[security.estop] +enabled = false +state_file = "~/.zeroclaw/estop-state.json" +require_otp_to_resume = true + +[security.nevis] +enabled = false +instance_url = "" +realm = "master" +client_id = "" +token_validation = "local" +role_mapping = [] +require_mfa = false +session_timeout_secs = 3600 + +[backup] +enabled = true +max_keep = 10 +include_dirs = [ + "config", + "memory", + "audit", + "knowledge", +] +destination_dir = "state/backups" +compress = true +encrypt = false + +[data_retention] +enabled = false +retention_days = 90 +dry_run = false +categories = [] + +[cloud_ops] +enabled = false +default_cloud = "aws" +supported_clouds = [ + "aws", + "azure", + "gcp", +] +iac_tools = ["terraform"] +cost_threshold_monthly_usd = 100.0 +well_architected_frameworks = ["aws-waf"] + +[conversational_ai] +enabled = false +default_language = "en" +supported_languages = [ + "en", + "de", + "fr", + "it", +] +auto_detect_language = true +escalation_confidence_threshold = 0.3 +max_conversation_turns = 50 +conversation_timeout_secs = 1800 +analytics_enabled = false + +[security_ops] +enabled = false +playbooks_dir = "~/.zeroclaw/playbooks" +auto_triage = false +require_approval_for_actions = true +max_auto_severity = "low" +report_output_dir = "~/.zeroclaw/security-reports" + +[runtime] +kind = "native" + +[runtime.docker] +image = "alpine:3.20" +network = "none" +memory_limit_mb = 512 +cpu_limit = 1.0 +read_only_rootfs = true +mount_workspace = true +allowed_workspace_roots = [] + +[reliability] +provider_retries = 2 +provider_backoff_ms = 500 +fallback_providers = [] +api_keys = [] +channel_initial_backoff_secs = 2 +channel_max_backoff_secs = 60 +scheduler_poll_secs = 15 +scheduler_retries = 2 + +[reliability.model_fallbacks] + +[scheduler] +enabled = true +max_tasks = 64 +max_concurrent = 4 + +[agent] +compact_context = false +max_tool_iterations = 20 +max_history_messages = 50 +max_context_tokens = 32000 +parallel_tools = false +tool_dispatcher = "auto" +tool_call_dedup_exempt = [] +tool_filter_groups = [] + +[skills] +open_skills_enabled = true +prompt_injection_mode = "full" +enabled = ["ege-checker"] + +[query_classification] +enabled = false +rules = [] + +[heartbeat] +enabled = true +interval_minutes = 30 +two_phase = false +adaptive = true +min_interval_minutes = 5 +max_interval_minutes = 120 +deadman_timeout_minutes = 0 +max_run_history = 100 + +[cron] +enabled = true +max_run_history = 50 +[channels_config] +cli = true +message_timeout_secs = 300 +ack_reactions = true +show_tool_calls = true +session_persistence = true +session_backend = "sqlite" +session_ttl_hours = 0 +[channels_config.telegram] +bot_token = "TELEGRAM_TOKEN_PLACEHOLDER" +stream_mode = "off" +allowed_users = ["*"] +draft_update_interval_ms = 1000 +interrupt_on_new_message = false +mention_only = false + +[memory] +backend = "sqlite" +auto_save = true +hygiene_enabled = true +archive_after_days = 7 +purge_after_days = 30 +conversation_retention_days = 30 +embedding_provider = "none" +embedding_model = "text-embedding-3-small" +embedding_dimensions = 1536 +vector_weight = 0.7 +keyword_weight = 0.3 +min_relevance_score = 0.4 +embedding_cache_size = 10000 +chunk_max_tokens = 512 +response_cache_enabled = false +response_cache_ttl_minutes = 60 +response_cache_max_entries = 5000 +response_cache_hot_entries = 256 +snapshot_enabled = false +snapshot_on_hygiene = false +auto_hydrate = true + +[memory.qdrant] +collection = "zeroclaw_memories" + +[storage.provider.config] +provider = "" +schema = "public" +table = "memories" + +[tunnel] +provider = "none" + +[gateway] +port = 42617 +host = "127.0.0.1" +require_pairing = true +allow_public_bind = false +paired_tokens = ["enc2:78a946f8656a7b3aae8634282887e0bde369e156b95ed86570ae4b3c08fa17e69a3cdad4d6a331b4c824c4b0b1870e2ca3b10901ca3d2731cfb82facbda531a3b55c16da7b723d335f89178462a2131f720a95c4de46683209cf0826"] +pair_rate_limit_per_minute = 10 +webhook_rate_limit_per_minute = 60 +trust_forwarded_headers = false +rate_limit_max_keys = 10000 +idempotency_ttl_secs = 300 +idempotency_max_keys = 10000 + +[composio] +enabled = false +entity_id = "default" + +[microsoft365] +enabled = false +auth_flow = "client_credentials" +scopes = ["https://graph.microsoft.com/.default"] +token_cache_encrypted = true + +[secrets] +encrypt = true + +[browser] +enabled = true +allowed_domains = ["*"] +backend = "agent_browser" +native_headless = true +native_webdriver_url = "http://127.0.0.1:9515" + +[browser.computer_use] +endpoint = "http://127.0.0.1:8787/v1/actions" +timeout_ms = 15000 +allow_remote_endpoint = true +window_allowlist = [] + +[http_request] +enabled = true +allowed_domains = ["*"] +max_response_size = 100000000 +timeout_secs = 60 +allow_private_hosts = true + +[multimodal] +max_images = 4 +max_image_size_mb = 5 +allow_remote_fetch = true + +[web_fetch] +enabled = true +allowed_domains = ["*"] +blocked_domains = [] +max_response_size = 50000000 +timeout_secs = 30 + +[web_search] +enabled = true +provider = "duckduckgo" +max_results = 25 +timeout_secs = 30 + +[project_intel] +enabled = false +default_language = "en" +report_output_dir = "~/.zeroclaw/project-reports" +risk_sensitivity = "medium" +include_git_data = true +include_jira_data = false + +[proxy] +enabled = true +no_proxy = ["*"] +scope = "zeroclaw" +services = [] + +[identity] +format = "openclaw" + +[cost] +enabled = false +daily_limit_usd = 10.0 +monthly_limit_usd = 100.0 +warn_at_percent = 80 +allow_override = false + +[cost.prices."anthropic/claude-sonnet-4-20250514"] +input = 3.0 +output = 15.0 + +[cost.prices."openai/gpt-4o-mini"] +input = 0.15 +output = 0.6 + +[cost.prices."openai/o1-preview"] +input = 15.0 +output = 60.0 + +[cost.prices."openai/gpt-4o"] +input = 5.0 +output = 15.0 + +[cost.prices."google/gemini-1.5-pro"] +input = 1.25 +output = 5.0 + +[cost.prices."anthropic/claude-3-haiku"] +input = 0.25 +output = 1.25 + +[cost.prices."anthropic/claude-opus-4-20250514"] +input = 15.0 +output = 75.0 + +[cost.prices."google/gemini-2.0-flash"] +input = 0.1 +output = 0.4 + +[cost.prices."anthropic/claude-3.5-sonnet"] +input = 3.0 +output = 15.0 + +[peripherals] +enabled = false +boards = [] + +[agents] + +[swarms] + +[hooks] +enabled = true + +[hooks.builtin] +command_logger = false + +[hooks.builtin.webhook_audit] +enabled = false +url = "" +tool_patterns = [] +include_args = false +max_args_bytes = 4096 + +[hardware] +enabled = false +transport = "None" +baud_rate = 115200 +workspace_datasheets = false + +[transcription] +enabled = false +api_url = "https://api.groq.com/openai/v1/audio/transcriptions" +model = "whisper-large-v3-turbo" +max_duration_secs = 120 + +[tts] +enabled = false +default_provider = "openai" +default_voice = "alloy" +default_format = "mp3" +max_text_length = 4096 + +[mcp] +enabled = false +deferred_loading = true +servers = [] + +[nodes] +enabled = false +max_nodes = 16 + +[workspace] +enabled = false +workspaces_dir = "~/.zeroclaw/workspaces" +isolate_memory = true +isolate_secrets = true +isolate_audit = true +cross_workspace_search = false + +[notion] +enabled = false +api_key = "" +database_id = "" +poll_interval_secs = 5 +status_property = "Status" +input_property = "Input" +result_property = "Result" +max_concurrent = 4 +recover_stale = true + +[node_transport] +enabled = true +shared_secret = "" +max_request_age_secs = 300 +require_https = true +allowed_peers = [] +mutual_tls = false +connection_pool_size = 4 + diff --git a/ege-skill b/ege-skill new file mode 160000 index 0000000..55b4f43 --- /dev/null +++ b/ege-skill @@ -0,0 +1 @@ +Subproject commit 55b4f4360a82e8422aa7def6c6b744719fecd61f diff --git a/setup_config.py b/setup_config.py new file mode 100644 index 0000000..b91d07b --- /dev/null +++ b/setup_config.py @@ -0,0 +1,28 @@ +import os +from pathlib import Path +from dotenv import load_dotenv + + +load_dotenv() + +template_path = Path("config.template.toml") +if not template_path.exists(): + print(" Файл config.template.toml не найден!") + exit(1) + +template = template_path.read_text() + +api_key = os.getenv("ZEROCLAW_API_KEY") +tg_token = os.getenv("TELEGRAM_BOT_TOKEN") + +if not api_key or not tg_token: + print(" Ошибка: Ключи не найдены в .env файле!") + print(f"API_KEY: {'OK' if api_key else 'MISSING'}") + print(f"TG_TOKEN: {'OK' if tg_token else 'MISSING'}") + exit(1) + +config_ready = template.replace("API_KEY_PLACEHOLDER", api_key) +config_ready = config_ready.replace("TELEGRAM_TOKEN_PLACEHOLDER", tg_token) + +Path("config.toml").write_text(config_ready) +print("config.toml готов! Ключи подставлены.") \ No newline at end of file diff --git a/skills/ege-checker/SKILL.md b/skills/ege-checker/SKILL.md new file mode 100644 index 0000000..b889ff4 --- /dev/null +++ b/skills/ege-checker/SKILL.md @@ -0,0 +1,119 @@ +--- +name: ege-checker +description: > + Проверка заданий ЕГЭ с выставлением баллов по официальным критериям ФИПИ. + Используй этот скилл когда пользователь: + - Загружает фото/скан рукописного сочинения ЕГЭ по русскому языку + - Просит проверить сочинение ЕГЭ, выставить баллы, оценить работу + - Загружает аудиозапись или текст ответов по разделу "Аудирование" ЕГЭ по английскому + - Упоминает "ЕГЭ", "сочинение", "критерии К1-К10", "аудирование английский" + - Просит разобрать ошибки в сочинении по критериям ФИПИ + Скилл умеет: OCR рукописного текста через vision, оценку по критериям, подробные комментарии. +--- + +# ЕГЭ-Checker + +## Обзор возможностей + +| Модуль | Статус | Вход | Выход | +|--------|--------|------|-------| +| Сочинение (русский) | ✅ MVP | Фото рукописи или текст | Баллы К1–К10 + комментарии | +| Аудирование (английский) | 🔜 в разработке | Аудиофайл + бланк ответов | Баллы по заданиям | + +--- + +## Модуль 1: Сочинение ЕГЭ по русскому языку + +### Шаг 1 — Получить текст сочинения + +**Если загружено фото/скан:** +1. Внимательно рассмотри изображение +2. Распознай рукописный текст максимально точно +3. Выведи распознанный текст пользователю и попроси подтвердить: *"Вот что я распознал. Если есть неточности — поправьте перед проверкой."* +4. Дождись подтверждения или правок + +**Если текст вставлен напрямую:** +Переходи к Шагу 2 без распознавания. + +### Шаг 2 — Загрузить критерии + +Прочитай файл `references/russian-essay-criteria.md` — там полные критерии К1–К10 с баллами и примерами. + +### Шаг 3 — Оценить по каждому критерию + +Пройдись по всем критериям К1–К10 **последовательно**. Для каждого: +- Процитируй конкретный фрагмент из сочинения (если уместно) +- Объясни своё решение +- Выставь балл + +**Важные правила:** +- Если К1 = 0 (нет формулировки проблемы) → К2, К3, К4 автоматически = 0 +- Если работа ≤ 70 слов → все баллы = 0, только К10 может быть ненулевым +- Считай слова перед проверкой (служебные части речи считаются) + +### Шаг 4 — Итоговый вывод + +Используй этот формат вывода: + +``` +## Результаты проверки сочинения ЕГЭ + +### Распознанный текст +[текст если было фото, иначе пропусти] + +### Количество слов: XX + +--- + +### Оценка по критериям + +| Критерий | Название | Балл | Макс | +|----------|----------|------|------| +| К1 | Формулировка проблем исходного текста | X | 1 | +| К2 | Комментарий к проблеме | X | 3 | +| К3 | Отражение позиции автора | X | 2 | +| К4 | Отношение к позиции автора | X | 1 | +| К5 | Смысловая цельность, связность | X | 2 | +| К6 | Точность и выразительность речи | X | 1 | +| К7 | Орфография | X | 3 | +| К8 | Пунктуация | X | 3 | +| К9 | Языковые нормы | X | 3 | +| К10 | Речевые нормы | X | 3 | +| **ИТОГО** | | **XX** | **22** | + +--- + +### Подробные комментарии + +**К1 — [балл/1]** +[объяснение] + +**К2 — [балл/3]** +[объяснение с цитатами из текста] + +... и так далее по каждому критерию ... + +--- + +### Главные рекомендации +1. [самое важное для улучшения] +2. ... +``` + +--- + +## Модуль 2: Аудирование ЕГЭ по английскому (в разработке) + +Этот модуль требует STT (Speech-to-Text) для обработки аудио. +Пока недоступен. При запросе — сообщи пользователю и предложи ввести ответы текстом вручную. + +Когда будет реализован: читай `references/english-listening-criteria.md` + +--- + +## Общие принципы проверки + +- **Актуальность**: Критерии соответствуют демоверсии ФИПИ 2024–2025 +- **Строгость**: Придерживайся формулировок критериев, не занижай и не завышай +- **Пограничные случаи**: При сомнении между баллами — объясни оба варианта и выбери более обоснованный +- **Тон**: Конструктивный, поддерживающий. Это учебный инструмент, не карательный diff --git a/skills/ege-checker/ege-checker.skill b/skills/ege-checker/ege-checker.skill new file mode 100644 index 0000000000000000000000000000000000000000..2d6c976941407cc1ff8480fb90688343d0cbd339 GIT binary patch literal 6181 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 Q??guf0Eqs61ONd40qn`N8~^|S literal 0 HcmV?d00001 diff --git a/skills/ege-checker/env.example b/skills/ege-checker/env.example new file mode 100644 index 0000000..dd74e8c --- /dev/null +++ b/skills/ege-checker/env.example @@ -0,0 +1,2 @@ +ZEROCLAW_API_KEY= +TELEGRAM_BOT_TOKEN= \ No newline at end of file diff --git a/skills/ege-checker/references/english-listening-criteria.md b/skills/ege-checker/references/english-listening-criteria.md new file mode 100644 index 0000000..33d29b3 --- /dev/null +++ b/skills/ege-checker/references/english-listening-criteria.md @@ -0,0 +1,30 @@ +# Критерии оценивания раздела "Аудирование" ЕГЭ по английскому языку +## Статус: заглушка — будет заполнено в следующей итерации + +### Структура раздела (ЕГЭ 2024–2025) + +**Задание 1** (B1) — установление соответствия: 6 высказываний → 7 утверждений +- 1 балл за каждое верное соответствие +- Максимум: 6 баллов + +**Задания 2–9** (B2) — верно/неверно/не сказано (True/False/Not Stated) +- 1 балл за каждый верный ответ +- Максимум: 8 баллов + +**Задания 10–18** — краткий ответ/выбор из нескольких вариантов +- 1 балл за каждый верный ответ +- Максимум: 9 баллов + +**Итого по разделу "Аудирование": 20 первичных баллов** + +--- + +## STT интеграция (планируется) + +Для обработки аудиозаписей потребуется: +- OpenAI Whisper API (рекомендуется для русской и английской речи) +- Или Deepgram (альтернатива) +- Эндпоинт: `https://api.openai.com/v1/audio/transcriptions` +- Модель: `whisper-1` + +Временное решение для MVP: попросить пользователя ввести ответы текстом. diff --git a/skills/ege-checker/references/russian-essay-criteria.md b/skills/ege-checker/references/russian-essay-criteria.md new file mode 100644 index 0000000..b0df187 --- /dev/null +++ b/skills/ege-checker/references/russian-essay-criteria.md @@ -0,0 +1,171 @@ +# Критерии оценивания сочинения ЕГЭ по русскому языку +## Источник: ФИПИ, демоверсия 2026 + +--- + +## Предварительные проверки + +### Подсчёт слов +- Считаются все слова, включая служебные (предлоги, союзы, частицы) +- Рекомендуемый объём: **150–300 слов** +1. **Минимальный порог**: Если в сочинении **149 слов или менее** — работа оценивается **0 баллов** по всем критериям (К1–К10). Задание считается невыполненым. +2. **Метод подсчета**: + - Считаются самостоятельные и служебные части речи. + - Слова через дефис (всё-таки, по-моему) = **1 слово**. + - Инициалы с фамилией (А.С. Пушкин) = **1 слово**. + - Цифры (5 лет, 2026 год) = **не учитываются**. Числительные словами (пять лет) = **считаются**. + - Информация об авторе текста (биография из задания) = **не учитывается**. +3. **Самостоятельность**: Если текст — это просто пересказ или переписанный исходник без комментариев — **0 баллов**. + + +### Правило нулевого К1 +Если К1 = 0 (проблема не сформулирована или сформулирована неверно): +→ К2 = 0, К3 = 0, К4 = 0 **автоматически** + +--- + +## К1 — Формулировка проблем исходного текста (0–1 балл)(Отражение позицииавтора (рассказчика) по указанной проблеме исходного текста) + +**1 балл**: Позиция автора (рассказчика) по указанной проблеме исходного текста сформулирована верно + +**0 баллов**: Позиция автора (рассказчика) по указанной проблеме исходного текста не сформулирована или сформулирована неверно. + +**Подсказки для проверки:** +- Проблема должна быть сформулирована как вопрос или тезис +- Она должна соответствовать содержанию исходного текста +- Допустимы разные формулировки одной и той же проблемы + +--- + +## К2 — Комментарий к сформулированной проблеме исходного текста (0–3 балла) + +Структура: **2 примера-иллюстрации** из текста + **смысловая связь** между ними. + +- **3б**: Приведено 2 примера-иллюстрации + пояснение к КАЖДОМУ + указана и ПОЯСНЕНА смысловая связь. +- **2б**: 2 примера + 2 пояснения, но связь не указана / не пояснена / пояснена неверно. +- **1б**: Приведен и пояснен только 1 пример. +- **0б**: Пересказ, цитирование без комментария или отсутствие опоры на текст. + +**Важно:** +- Пример-иллюстрация = конкретный фрагмент/факт из текста с объяснением его роли +- Смысловая связь: сравнение, противопоставление, причина-следствие, вывод и т.д. +- Пересказ без анализа = 0 баллов +- Фактические ошибки в комментарии снижают балл (−1 за каждую, но не более −2) + +--- + +## К3 — Собственное отношение к позиции автора (рассказчика) по указанной проблеме исходного текста (0–2 балла) + +- **2б**: Отношение сформулировано, обосновано и ПРИВЕДЕН пример-аргумент. +- **1б**: Отношение сформулировано и обосновано, но БЕЗ примера-аргумента. +- **0б**: Только формальное "Я согласен". +- **ЗАПРЕТ на источники**: Комиксы, аниме, манга, фанфики, граф. романы, компьютерные игры — **не засчитываются** как аргумент. Только жизненный, читательский или историко-культурный опыт. + +**Подсказки:** +- Источником для примера-аргумента служит читательский, историко-культурный или жизненный опыт. + +--- + +## К4 — Фактическая точность речи(0-1 балл) + +- **1б**: Ошибок нет. +- **0б**: 1 и более ошибок. + +**Фактические ошибки:** +- Неверные имена, даты, названия произведений +- Искажение содержания упомянутых текстов +- Неверные факты о реальных событиях/людях + +--- + +### К5 — Логичность речи (0–2 балла) +- **2б**: Ошибок нет. +- **1б**: 1-2 ошибки. +- **0б**: 3+ ошибки. + +--- + +### К6 — Этические нормы (0–1 балл) +- **1б**: Ошибок нет. +- **0б**: Нарушение норм, агрессия, нецензурная брань. +**Этические ошибки:** +- Грубость, оскорбления в адрес кого-либо +- Национальная/религиозная нетерпимость +- Речевая агрессия + +--- + +## К7 — Соблюдение орфографических норм (0–3 балла) + +| Баллы | Количество ошибок | +|-------|-------------------| +| 3 | 0 ошибок | +| 2 | 1-2 ошибка | +| 1 | 3-4 ошибки | +| 0 | 5+ ошибки | + +**Что считается ошибкой:** +- Неверное написание слова +- Слитное/раздельное/дефисное написание +- Прописные/строчные буквы + +**Что НЕ считается ошибкой:** +- Описки (если исправлены) +- Перенос слова + +--- + +## К8 — Соблюдение пунктуационных норм (0–3 балла) + +| Баллы | Количество ошибок | +|-------|-------------------| +| 3 | 0 ошибок | +| 2 | 1–2 ошибки | +| 1 | 3–4 ошибки | +| 0 | 5+ ошибок | + +**Типичные ошибки:** +- Пропуск запятой при однородных членах +- Ошибки в сложных предложениях +- Неверное оформление прямой речи + +--- + +## К9 — Соблюдение языковых норм (грамматика) (0–3 балла) + +| Баллы | Количество ошибок | +|-------|-------------------| +| 3 | 0 ошибок | +| 2 | 1-2 ошибок | +| 1 | 3-4 ошибки | +| 0 | 5+ ошибки | + +**Типичные грамматические ошибки:** +- Ошибки в согласовании (управлении) +- Неправильное образование форм слова +- Нарушение синтаксических норм + +--- + +## К10 — Соблюдение речевых норм (0–3 балла) + +| Баллы | Количество ошибок | +|-------|-------------------| +| 3 | 0 ошибок | +| 2 | 1-2 ошибок | +| 1 | 3-4 ошибки | +| 0 | 5+ ошибки | + +**Типичные речевые ошибки:** +- Тавтология (повтор одного слова/однокоренных слов) +- Плеоназм (масло масляное) +- Неуместное употребление слова +- Употребление слова в несвойственном значении + +--- + +## Таблица максимальных баллов + +| К1 | К2 | К3 | К4 | К5 | К6 | К7 | К8 | К9 | К10 | Итого | +|----|----|----|----|----|----|----|----|----|-----|-------| +| 1 | 3 | 2 | 1 | 2 | 1 | 3 | 3 | 3 | 3 | **22**|