stcc-mcp
stcc-mcp — телефонная триажная сортировка: расчёт детерминированными правилами, 0.6B только сверяет критерии
Вводится запись опроса — на выходе уровень L1–L5 + формулировка действий + построчные цитаты + каких критериев ещё не хватает.
Сортировка вычисляется детерминированным движком правил (225 протоколов STCC / 849 ветвей / 4 168 критериев, поставляется в комплекте),
Qwen3-0.6B отвечает только на один вопрос: по данной записи и одному критерию — yes / no / unknown.
Модель не выбирает ветви, не определяет уровень, не генерирует формулировки действий, не совершает tool call.
⚠️ Это не система экстренной триажной сортировки, не ставит диагноз и не заменяет врача. L1–L5 — это ступени действий (вызвать скорую / немедленно в неотложку / обратиться сегодня / амбулаторно в ближайшие два дня / наблюдение дома). При неотложном состоянии звоните 112.
Три шага для запуска
pip install stcc-mcp # 或 uvx stcc-mcp …
ollama pull hf.co/chenhaodev/stcc-checker-0.6b-GGUF:Q8_0 # 640MB 核对器
stcc-mcp doctor # 自检:索引 / Ollama / 模型
stcc-mcp triage --protocol Chest_Pain.md "$(cat 记录.txt)"Ноль постоянно работающих процессов, ноль Docker, без интернета. Движок — чистая стандартная библиотека, без сторонних зависимостей.
При первом запуске с высокой вероятностью увидите tier: L1 + certain: false — это нормально
Если подать обычную запись опроса, скорее всего получите самый срочный уровень и список unresolved. Это не ошибка:
движок исключает ветвь только когда все условия в ней равны no, а реальный опрос не задаёт все критерии одной ветви.
Например, в записи о лёгкой лихорадке медсестра спросила про сознание/дыхание/ригидность затылочных мышц/сыпь, но никогда не спрашивала про признаки обезвоживания
(уменьшение мочеиспускания, запавшие глазные яблоки, снижение тургора кожи, жажда), поэтому ветвь не исключается, и вывод останавливается на верхней границе её уровня.
unresolved — это и есть список «дозадай эти пункты — и можно сузить».
Дополните ответы в запись и перезапустите — unresolved будет монотонно укорачиваться; но уровень снизится только когда какая-то ветвь будет полностью исключена —
на практике та же запись о лихорадке после дополнения признаков обезвоживания сократила unresolved с 8 до 2, а уровень остался L1,
потому что оставшийся ствол (обрывки вида пожилые или иммунокомпрометированные… проявления обезвоживания:) проверяющая модель оценила как unknown.
Здесь нужно крутить ручку порога ниже, а не продолжать опрос. Подробнее см. границы ①②.
Подключение к агенту (Claude Code / любой MCP client):
pip install "stcc-mcp[mcp]" && stcc-mcp serve # stdio MCPOllama не поддерживает MCP, и для этой архитектуры это не проблема: маленькая модель никогда не делает tool call, оркестратор отдельно вызывает Ollama (HTTP) и движок правил (в процессе), они друг о друге не знают. Автономный tool-calling у 0.6B — известная зона бедствия, эта архитектура обходит её по построению.
Related MCP server: Quellgeist
Выход
Поле | Значение |
|
|
| формулировка действий для этой ветви (из таблицы правил, не сгенерирована моделью) |
|
|
| критерии, на которых основано решение + номера строк, аудируемо |
| каких критериев ещё не хватает — дозадав их, можно сузить уровень |
Отображение уровня на действия определяет ваш оркестратор; этот пакет даёт только уровень и формулировку действий.
Порог для no — это ручка
--no-threshold (по умолчанию 0.63): P(no) ≥ τ ⇒ no, иначе берётся больший из yes/unknown.
Полная кривая компромиссов той же модели на дистрибуции релиза (n=3225):
τ | acc |
|
|
0.63 (по умолч.) | 0.9426 | 0.0000 | 0.9027 |
0.50 | 0.9457 | 0.0000 | 0.9189 |
0.40 | 0.9495 | 0.0024 | 0.9378 |
0.30 | 0.9498 | 0.0084 | 0.9432 |
0.10 | 0.9516 | 0.0120 | 0.9635 |
Та же запись опроса о лихорадке, меняется только τ:
$ stcc-mcp triage --protocol Fever_Adult.md --no-threshold 0.63 "$(cat 记录.txt)"
tier L1 · 拨打救护车 · unresolved 2
$ stcc-mcp triage --protocol Fever_Adult.md --no-threshold 0.40 "$(cat 记录.txt)"
tier L3 · 2小时内接受医疗护理 · unresolved 5τ ниже ⇒ проверяющая модель смелее оценивает «спрошено и отрицается» как no ⇒ ветвь исключается ⇒ уровень снижается.
Это не делает модель точнее — это смена рабочей точки на той же кривой компромиссов — ценой роста риска пропущенного диагноза.
false_no (должно быть истинно, а оценено как no) — жёсткое ограничение — ложное no исключает истинную ветвь из безопасной сходимости.
Недобор no даёт лишь пересортировку — это ручка стоимости.
Значение по умолчанию выбрано на dev по false_no ≤ 0.0036 (этот dev содержит лишь 495 положительных примеров, разрешение 0.0020,
систематически консервативен). Поэтому жёстко зафиксированного «оптимального значения» нет — кривая приведена целиком, выбирайте точку по своей матрице затрат.
Воспроизведение: python -m scripts.threshold_sweep --model <m> --split <s> --collect --report.
🔴 Известные границы (прочитайте сначала, потом решайте, использовать ли)
① Вход должен быть записью «опроса, проведённого по протоколу», а не сырым самоповествованием.
Короткая жалоба — доля unknown 94%; реальный насыщенный диалог (IMCS-21, 748 слов / 40 раундов) — всё ещё 88%.
Причина: префиксные ветви STCC отсеивают красные флаги неотложных состояний (подавился, посинел, без реакции),
а естественно возникающие корпусы по определению не содержат таких случаев, и врач их не спрашивает — это эффект отбора, замена на более насыщенный корпус не поможет.
② Реальный опрос не задаёт все критерии одной ветви, поэтому уровень останавливается на верхней границе этой ветви.
Это worst_case работает правильно, но степень зауженности верхней границы полностью определяется полнотой опроса.
③ Безопасность worst_case основана на предпосылке «не порождать ложных no».
Выход — наиболее срочный уровень, который нельзя исключить при имеющихся доказательствах (ветвь исключается только если все её условия равны no),
поэтому недосортировка всегда равна 0, и с каждым дополнительным no в доказательствах результат монотонно сужается (обе инварианты охраняются tests/).
При нехватке информации он вырождается в «всем вызывать скорую» — это проектный выбор (недосортировка 10·d² против пересортировки d), а не баг.
④ Сама сортировка — silver: эталонные метки на уровне ветвей финализированы сильной моделью + ручная проверка, окончательный вывод всё ещё не имеет золотого стандарта от реальной медсестры.
Почему unknown — первоклассное состояние
Семантика ветви STCC: «любое условие в этой ветви = да ⇒ попадание; все = нет ⇒ переход к следующей ветви».
«Не упомянуто» ≠ «сказано нет»: первое обязано запускать уточняющий вопрос, второе позволяет перейти к следующей ветви.
Сжать unknown в no — значит сфабриковать отрицание из воздуха, и движок уйдёт в неверную ветвь.
Тексты критериев
Критерии в индексе — поштучно переписанные версии (5 214/5 214). Чистые пороги и отдельные медицинские термины («кашель», «температура >100.4°F») сохранены по факту. Переписывание прошло три шлюза: формальная проверка чисел/отрицаний/длины/похожести, воспроизведение oracle, побитово совпадающее с оригиналом, и отсутствие падения метрик нижестоящего проверяющего.
Разработка
uv sync
uv run pytest -q # 27 条回归
uv run python -m scripts.mcp_selfcheck # oracle 回放 4,168 条判据,<1 秒scripts/mcp_selfcheck.py — самопроверка верности движка: каждый критерий по очереди ставится в yes, остальные в no,
проверяется, в какую ветвь и с какими действиями приходит движок. Это не оценка модели — расхождение означает дыру в компиляции или вычислении.
Модель
chenhaodev/stcc-checker-0.6b-GGUF
(Q8_0 / Q4_K_M). На уровне критериев false_no 0.0024, медианная задержка ~250 мс, сквозное время 1.25 с/запись.
Apache-2.0.
This server cannot be deployed
Maintenance
Related MCP Connectors
Medical RAG: semantic search for clinical guidelines, drug interactions, diagnoses & EHR data.
Medical RAG: semantic search for clinical guidelines, drug interactions, diagnoses & EHR data.
Physician-reviewed medical opinions and prescriptions for AI agents.
Author rules from policy docs, then decide: a Rete engine gives the verdict, an LLM explains why.
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceAn agentic AI system that enables healthcare professionals to log patient symptoms, retrieve similar clinical cases, and search medical documents using RAG. It integrates a Chroma vector database with the Model Context Protocol to provide real-time clinical decision support.-
- AlicenseAqualityCmaintenanceFirst-line incident triage you can trust: ranked root-cause hypotheses where every claim cites a real evidence handle — and the agent abstains rather than guess.11MIT
- AlicenseAqualityAmaintenanceAuthor rules from policy docs, then decide: a Rete engine gives the verdict, an LLM explains why.9MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP-integrated prescription review with incomplete laboratory evidence, using deterministic rules and language-model guardrails to enforce approval authority boundaries.MIT