Контроль качества и контракт MCP
Рамочные страницы корпуса, отрендеренные из Notion целиком: как стандарт держит качество и какой интерфейс отдаёт MCP-сервер поверх снимка.
Контроль качества стандарта
Приборная панель для проверки золотого стандарта перед выводом в production. Это read-only линзы над корпусом — не отдельные данные, а срезы существующих БД (Нормативы, Источники, Концепты, Метрики). Задача — увидеть дыры раньше, чем стандарт уедет на клиента.
Что показывает каждый прибор:
- Зрелость нормативов — доска по стадии (черновик → валидировано внутри → … → опубликовано). Главный вход в свод зрелости: видно, что ещё в черновике.
- Без обоснования — нормативы, не опирающиеся ни на один концепт. Разрыв провенанса «стандарт без теории».
- Без метрики — нормативы без привязанной EEQ-метрики. Норму нельзя измерить.
- Воронка источников — источники по статусу (нашли → в обработке → интегрировано). Что ещё не доведено до концептов.
- Карта концептов — концепты по зрелости + тип утверждения и источник. Ловит NOTA-синтез без опоры на источник.
- Покрытие EEQ — метрики по категориям Федоренко (результативность / эффективность / качество). Виден перекос.
Пусто в «дырных» приборах = чисто. Это и есть критерий готовности.
Дизайн MCP-сервера (контракт интерфейса)
Это дизайн-контракт первого интерфейса Слоя 1 — MCP-сервера, отдающего золотой стандарт агентам и людям. Статус: дизайн замкнут, реализация не начата. Расширяет раздел 7 README. Опирается на дисциплину корпуса (README раздел 5) как на контракт между корпусом и интерфейсом.
1. Три режима поверх одного корпуса
MCP-сервер — не «оголённые 7 баз как CRUD», а набор глаголов под трёх потребителей корпуса (человек-автор работает в Notion мимо сервера).
Режим генерации (retrieval / few-shot). Агент строит артефакт и спрашивает у стандарта «как должно быть»: концепты, нормы с рубрикой, эталонные примеры, разрешение терминов. Read-heavy, низкий риск.
Режим оценки (diff). Агенту дают артефакт реальной компании — он выносит вердикт против нормы: уровень по рубрике + обоснование + чего не хватает. Ядро ценности продукта.
Режим консультации (guide). Человек ещё думает — стандарт ведёт его сократически по методологическому маршруту. Самый коварный режим: опасность — протечка эрудиции подключённой LLM вместо grounding в корпус. Поэтому каждое содержательное утверждение тянется к концепту→норме→источнику.
Замыкание: консультант = diff (где ты сейчас) + метод-маршрут (как двигаться) + provenance (из стандарта, не из эрудиции). missing_signals из вердикта — это повестка разговора.
2. Архитектурные решения (фундамент)
- Сервер читает не живой Notion, а скомпилированный снимок. Скорость, развязка от Notion rate limits, воспроизводимость (вердикт против снимка известной версии). Notion — авторская среда; снимок — рантайм стандарта.
- Read-only к стандарту. Запись в корпус — работа автора в Notion, мимо сервера.
- Вердикты клиента = Слой 2, не Слой 1. Сервер их возвращает, но не персистит. У себя сервер ведёт только служебный judgment log (телеметрия суждений для калибровки).
- Асимметрия толщины. judge-soft толстый (своя процедура суждения ради контроля и калибровки); guide тонкий (диалог ведёт подключённая модель, сервер stateless). Где нужен воспроизводимый вердикт — процедура внутри; где живой диалог — процедуру ведёт потребитель.
3. Build-пайплайн: Notion → снимок
Контур: Notion (9 баз, авторская истина) → компиляция → иммутабельный версионированный снимок → сервер держит в памяти.
Денормализация в коды. Notion отдаёт relation как page-URL; build переписывает их в канонические коды и собирает разнесённое по 9 базам в самодостаточные документы. Норма встраивает eval-контракт, метрики и few-shot инлайн; метод встраивает шаги по порядку. Цепь провенанса предвычисляется.
Версия снимка. Semver корпуса + хэш + timestamp, ортогонально semver отдельных норм. Снимок иммутабелен, старые хранятся. Вердикт привязан к тройке (norm_code, norm_version, snapshot_version).
Build-gate. Сборка прогоняет инварианты из README раздел 5 (норма без обоснования, концепт без источника, норма без метрики/eval-set, relation на безкодовый узел, дубль кода). Это машинная версия страницы «Контроль качества». prod-канал не соберётся при нарушении; dev-канал предупреждает.
Два канала из одного пайплайна. Фильтр по зрелости — параметр сборки. dev = весь корпус с пометкой зрелости; prod = только зрелость ≥ порога. Совпадает с границей «черновик в Notion / опубликованный стандарт».
Триггер — не realtime. По кнопке (автор закончил, промотировал) + опционально ночная сборка. Стандарт не должен дёргаться от каждой авторской правки.
Хранение. Иммутабельные JSON-документы в immutable store. Корпус мал — сервер грузит prod-снимок целиком в память, get_* отвечают мгновенно. Пересборка → hot reload.
4. Формат снимка
Принцип: строгая нормализация в Notion, контролируемая денормализация в снимке. Единственный источник истины каждой сущности — её документ по коду. В родительские документы build встраивает компактные проекции зависимостей ради ответа одним lookup; проекции порождаются из источника одним проходом, рассинхрон невозможен.
Граница встраивания: рубрика/сигналы/вопросы → внутрь нормы целиком; шаги → внутрь метода; few-shot и метрики → компактной проекцией; концепт-обоснование, источник, термин, граф «опирается на» → только кодом.
Документ нормы (ядро):
{
"code": "COMPASS.DIAGNOSIS.N1", "type": "norm",
"title": "...", "module": "COMPASS", "area": "...",
"as_should_be": "...",
"rubric": [{"level":"отсутствует","signs":"..."}, ...4 уровня],
"signals": "...", "assessment_questions": "...",
"hardness": "soft", // роутер evaluate
"verdict_type": "градация", // шкала level
"version": "0.1.0", "maturity": "валидировано внутри",
"grounding": ["COMPASS.DIAGNOSIS.C1"],
"metrics": [{"code":"...M1","eeq":"качество","measure":"..."}],
"examples": [{"code":"...N1.E1","input":"...","expected_level":"частично"}],
"depends_on": [],
"provenance": "Rumelt 2011 → ...C1 → ...N1"
}Документ метода:
{
"code": "COMPASS.CASCADE.P1", "type": "method",
"goal": "...", "source_concept": "COMPASS.CASCADE.C1",
"steps": [
{"n":1,"title":"Выигрышная аспирация","elicit":"...",
"ready_signal":"...","concept":"...C1","norm":"COMPASS.CASCADE.N1"},
...5 шагов, каждый с привязанной нормой
]
}Остальные типы: концепт (distillation, claim_type, authority_tier, source, depends_on/basis_for, terms, provenance); источник (publisher, authors, year, tier); метрика (eeq, measure); пример (norm, input, expected_level); термин (short_def, concept); модуль (why/how/what + индексы кодов + покрытие EEQ).
5. Контракт глаголов
Сквозное: каждый ответ несёт код узла и snapshot_version; краткий провенанс инлайнится в узлы.
Группа 0 — Навигация
- `list_modules()` → ромб целиком, 5 модулей.
- `get_module(name)` → карта модуля: направления, концепты, нормы, методы, покрытие EEQ.
Группа 1 — Resolve
- `resolve_term(term)` → краткое определение + код концепта (pointer discipline).
- `search_corpus(query, filter?)` → семантический ретрив. Отложен в v2 (единственный глагол, требующий вектора).
Группа 2 — Retrieve
- `get_concept(code)` → узел теории + провенанс + граф зависимостей.
- `get_norm(code)` → полный eval-контракт (рубрика, сигналы, вопросы, жёсткость, метрики, примеры).
- `get_method(code)` → цель + упорядоченные шаги с elicit-вопросами и привязанными нормами.
- `list_methods(module)` → перечень маршрутов (кандидат на схлопывание в get_module).
- `get_examples(norm_code)` → eval-set для few-shot.
- `get_provenance(code)` → полная цепь Источник→Концепт→Норматив→Метрика.
- `get_source(code)` → издатель/авторы/год/тир (опционально для v1).
Группа 3 — Judge
- `evaluate(artifact, norm_code)` → вердикт (ниже). Роутер по жёсткости.
- `evaluate_against_module(artifact, module)` → профиль соответствия по всем нормам модуля. Движок самооценки сайта и диагностики CVD.
Глаголы ложатся на документы снимка один-к-одному; сервер почти не имеет логики сверх чтения индекса по коду. Ум — в компиляции, не в рантайме.
Контракт вердикта
{
norm, norm_version, snapshot_version,
level, // из рубрики; шкала по verdict_type
verdict_type, // machine_deterministic (crisp) | machine_draft (soft)
status, // autonomous | requires_human_confirmation
confidence, rationale,
evidence[], // цитаты из артефакта
missing_signals[], // чего не хватает до следующего уровня
provenance
}crisp → автономный детерминированный вердикт. soft → assisted draft через LLM с зашитым контрактом (рубрика+сигналы+few-shot), статус requires_human_confirmation, пока не открыта автономия (раздел 6).
Compass: все 10 норм — soft. Значит консультация/diff по Compass идёт только через soft-ветку; чистый self-serve по Compass невозможен, пока машина-rater не наберёт κ.
6. Калибровочный контур: машина как rater
Машина входит в существующий протокол межоценочного согласия как ещё один оценщик.
- Правило «оценщик-не-автор» — машина не писала корпус, пара «человек + машина» легитимна.
- Правило слепого пула — критично для машины. few-shot встроены в норму снимка; калибровать κ на тех же примерах = мерить подсмотренный ответ. Инвариант build-gate: eval-set (в снимке, машина видит) и калибровочный пул (вне снимка, как few-shot не подаётся) не пересекаются.
judgment log (служебный mutable store): artifact_id, norm_code, norm_version, snapshot_version, rater=machine, level, confidence, rationale, missing_signals, is_calibration, ts.
БД «Прогоны согласия» (из протокола): строка = (норматив × артефакт × оценщик × уровень × дата). Машина добавляет себя как значение rater. κ Коэна (quadratic-weighted) считается машина↔человек тем же аппаратом, что человек↔человек.
κ привязан к версии. Измеряется для тройки (norm_code, norm_version, snapshot_version) — смена рубрики поднимает версию и обнуляет старый κ.
Лестница автономности (те же пороги, что для людей):
- κ < 0.6 — машина по норме не годится; soft-вердикты всегда requires_human_confirmation. Сигнал: рубрику доработать либо норма CVD-зависимая по природе.
- 0.6 ≤ κ < 0.7 — draft полезен как черновик, статус остаётся requires_human_confirmation.
- κ ≥ 0.7 устойчиво — можно поднять автономию: вердикт autonomous. soft-норма становится self-serve не ослаблением требований, а накоплением доказанного согласия.
Автономность — не глобальный флаг, а вычисляемое поле на тройке (норма, версия, снимок).
Почему это измерение отчуждаемости, а не её обход. Человек-CVD может неосознанно тянуть смысл из головы автора. Машина видит только текст нормы. Согласие машины с человеком на κ≥0.7 = доказательство, что вердикт держится на тексте стандарта, а не на носителе. Машина-rater реализует определение отчуждаемости «без головы автора» в чистом виде.
7. Принятые решения и открытые развилки
Решено:
- Вектор (search_corpus) — отложен в v2. v1 — навигационный сервер на кодах и relation-обходе.
- Judge-цикл — атомарный, без consult_step. Оркестровку ведёт подключённая модель.
- Сервер read-only к стандарту; вердикты клиента — Слой 2.
Открыто на реализацию:
- get_source / list_methods — кандидаты на схлопывание (источник — через провенанс, методы — через get_module).
- Выбор LLM для soft-draft и его стоимость на soft-вызов.
- Порог зрелости для prod-канала снимка.
8. Граница и следующие шаги
Дизайн замкнут без разрыва: дисциплина корпуса → build-gate → снимок → глаголы → judge (soft/crisp) → judgment log → машина-rater в inter-rater → автономность по κ → расхождения растят версию нормы → обратно в дисциплину.
Реализация не начинается, пока Compass не пройдёт inter-rater (финальные ворота в production). При первом прогоне завести БД «Прогоны согласия» с полем rater (человек/машина), чтобы машинная калибровка шла с первого дня тем же аппаратом.