{"slug":"audit-docs","title":"audit-docs","summary":"Audit repository documentation: detect drift between code and docs, report coverage by category. Run manually or on triggered drift critical.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-27T16:56:14.735269Z","repo":{"url":"https://github.com/TserenTserenov/FMT-exocortex-template","stars":60,"forks":152,"license":"MIT","updatedAt":"2026-09-24T08:59:39Z"},"bodyHtml":"<hr>\n<h2>name: audit-docs\ndescription: \"Audit repository documentation: detect drift between code and docs, report coverage by category. Run manually or on triggered drift critical.\"\nargument-hint: \"--repo </h2>\n<h1>Audit Docs (R24 Аудитор)</h1>\n<blockquote>\n<p><strong>Роль:</strong> R24 Аудитор. Полное описание: <code>PACK-digital-platform/pack/digital-platform/02-domain-entities/DP.ROLE.024-auditor.md</code> (WP-224). Маппинг: R24 = VR.R.002.\n<strong>Метод:</strong> R24 coverage по категориям + R23 pair-diff между парами <code>код файл ↔ docs файл</code>.\n<strong>Получатель отчёта:</strong> владелец репо в другой временной позиции (категория 3 — внешняя проектная роль). Это аудит в строгом смысле — не автор кода, не ты сейчас.\n<strong>Тип роли (DP.D.080):</strong> R24 — контрольная роль. Read-only к аудитуемым артефактам. Отчёт = output-канал, не изменение аудитуемого.</p>\n</blockquote>\n<p>Аргументы: $ARGUMENTS</p>\n<h2>Что делает</h2>\n<p>Проходит указанный репо и формирует <strong>отчёт</strong> о расхождениях между кодом и документацией. <strong>Не правит ни код, ни docs</strong> — только отчёт.</p>\n<h2>Параметр</h2>\n<ul>\n<li><code>--repo &lt;path&gt;</code> (обязателен) или <code>.</code> (текущая директория).</li>\n<li><code>--init --repo &lt;path&gt;</code> — направляемая подготовка конфигурации; аудит не запускает.</li>\n</ul>\n<h2>Владение конфигурацией</h2>\n<table>\n<thead>\n<tr>\n<th>Ответственность</th>\n<th>Подотчётная роль</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Решить, что покрытие документацией требуется, и утвердить модель репозитория</td>\n<td>Владелец репозитория</td>\n</tr>\n<tr>\n<td>Определить категории документации и пары «источник ↔ документация»</td>\n<td>R5 Архитектор совместно с владельцем</td>\n</tr>\n<tr>\n<td>Материализовать утверждённый YAML</td>\n<td>Мейнтейнер или агент-исполнитель</td>\n</tr>\n<tr>\n<td>Потреблять YAML и сообщать о расхождениях</td>\n<td>R24 Аудитор / <code>audit-docs</code></td>\n</tr>\n<tr>\n<td>Поставить шаблон, схему, bootstrap и утверждение о владении</td>\n<td>Мейнтейнер платформы / FMT</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Блокирующее ограничение:</strong> агент вправе создать <code>docs/.audit-context.yaml</code>\nтолько после того, как владелец утвердил категории и маппинги. R24 Аудитор не\nизобретает семантическую модель ни во время аудита, ни перед ним.</p>\n<h2>Bootstrap (<code>--init</code>)</h2>\n<ol>\n<li>Прочитать <code>&lt;repo&gt;/CLAUDE.md</code>; определить владельца и R5 Архитектора.</li>\n<li>Показать им пример <code>.claude/skills/audit-docs/.audit-context.yaml.example</code>.</li>\n<li>Получить от владельца явное утверждение списка категорий и каждой пары\n<code>source_patterns</code> ↔ <code>docs_patterns</code>/<code>file_naming</code>. Без утверждения остановиться.</li>\n<li>Материализовать утверждённую модель в <code>&lt;repo&gt;/docs/.audit-context.yaml</code>,\nпоставить <code>owner_approved: true</code>, <code>approved_by</code> и реальную дату.</li>\n<li>Выполнить валидацию ниже. Только успешный файл становится входом аудита.</li>\n</ol>\n<h2>Схема и валидация</h2>\n<p>Корень — mapping со строгими ключами <code>schema_version: 1</code>,\n<code>owner_approved: true</code>, <code>approved_by</code>, <code>approved_at</code>, <code>categories</code>. <code>categories</code> —\nнепустой список; каждая категория содержит уникальный <code>id</code>, непустые списки строк\n<code>source_patterns</code> и <code>docs_patterns</code>, строку <code>file_naming</code>; <code>drift_days</code> —\nнеобязательное положительное целое. Неизвестные ключи и пустые glob-паттерны — ошибка.</p>\n<p>Перед аудитом выполнить этот валидатор (требуется PyYAML):</p>\n<pre><code>python3 - \"$REPO/docs/.audit-context.yaml\" &lt;&lt;'PY'\nimport datetime as dt\nimport sys\nimport yaml\n\npath = sys.argv[1]\ndata = yaml.safe_load(open(path, encoding=\"utf-8\"))\nroot_keys = {\"schema_version\", \"owner_approved\", \"approved_by\", \"approved_at\", \"categories\"}\ncategory_keys = {\"id\", \"source_patterns\", \"docs_patterns\", \"file_naming\", \"drift_days\"}\nassert isinstance(data, dict) and set(data) == root_keys, \"invalid root keys\"\nassert data[\"schema_version\"] == 1, \"unsupported schema_version\"\nassert data[\"owner_approved\"] is True and data[\"approved_by\"], \"owner approval missing\"\nassert isinstance(data[\"approved_at\"], (str, dt.date)), \"approved_at missing\"\ncategories = data[\"categories\"]\nassert isinstance(categories, list) and categories, \"categories must be non-empty\"\nids = []\nfor category in categories:\n    assert isinstance(category, dict) and set(category) &lt;= category_keys, \"invalid category keys\"\n    assert {\"id\", \"source_patterns\", \"docs_patterns\", \"file_naming\"} &lt;= set(category), \"category keys missing\"\n    ids.append(category[\"id\"])\n    for key in (\"source_patterns\", \"docs_patterns\"):\n        assert isinstance(category[key], list) and category[key] and all(isinstance(v, str) and v.strip() for v in category[key]), key\n    assert isinstance(category[\"file_naming\"], str) and category[\"file_naming\"].strip(), \"file_naming\"\n    assert \"drift_days\" not in category or isinstance(category[\"drift_days\"], int) and category[\"drift_days\"] &gt; 0, \"drift_days\"\nassert len(ids) == len(set(ids)) and all(isinstance(v, str) and v.strip() for v in ids), \"category ids\"\nprint(\"audit-context: valid\")\nPY\n</code></pre>\n<h2>Шаг 0. Загрузка контекста</h2>\n<p>При старте обязательно прочитать:</p>\n<ol>\n<li><code>&lt;repo&gt;/CLAUDE.md</code> целиком — как любой агент в этом репо. В частности § 10 «Известные ловушки/инварианты» (если есть).</li>\n<li><code>&lt;repo&gt;/docs/.audit-context.yaml</code> — категории docs, source patterns, file_naming. Без файла сообщить о <code>--init</code> и остановиться; самостоятельно создавать модель запрещено. Файл есть → выполнить схему-валидатор выше, ошибка блокирует аудит.</li>\n<li><code>${IWE_ROOT:-$HOME/IWE}/.claude/sync-manifest.yaml</code> — найти пары, где <code>source</code> или <code>derived</code> пересекают этот репо. Использовать как дополнительный источник связей «код ↔ docs».</li>\n</ol>\n<h2>Шаг 1. R24 coverage по категориям</h2>\n<p>Для каждой категории из <code>.audit-context.yaml</code>:</p>\n<ol>\n<li>Перечислить все source-файлы (по <code>source_patterns</code>).</li>\n<li>Для каждого source-файла найти связанный docs-файл по <code>file_naming</code> или эвристике.</li>\n<li>Посчитать: <code>coverage % = docs_files / source_files</code>.</li>\n<li>Зафиксировать <strong>gaps</strong> (source без docs) и <strong>orphans</strong> (docs без source).</li>\n</ol>\n<h2>Шаг 2. R23 pair-diff (drift детекция)</h2>\n<p>Для каждой существующей пары <code>source ↔ docs</code>:</p>\n<ol>\n<li>Сравнить mtime — если docs старше source более чем на N дней (порог из манифеста или дефолт 7), отметить как кандидат на обновление.</li>\n<li>Если есть git history — посмотреть последние коммиты в source и проверить, упоминаются ли затронутые сущности (функции, таблицы, эндпоинты) в docs.</li>\n<li>Зафиксировать <code>drift_candidates</code> с приоритетом (critical / warn / ok).</li>\n</ol>\n<h2>Шаг 3. Связь с CLAUDE.md § 10</h2>\n<p>Для каждой ловушки/инварианта из § 10 CLAUDE.md репо проверить: упомянута ли в docs? Если нет — добавить в раздел «Неочевидности».</p>\n<h2>Шаг 4. Формирование отчёта</h2>\n<p>Записать отчёт в <code>&lt;repo&gt;/docs/audit-reports/audit-YYYY-MM-DD.md</code> со структурой:</p>\n<pre><code># Audit report — &lt;repo&gt; — &lt;YYYY-MM-DD&gt;\n\n## Coverage по категориям\n| Категория | Source файлов | Docs файлов | Coverage % | Статус |\n|-----------|---------------|-------------|------------|--------|\n\n## Gaps (source без docs)\n- ...\n\n## Orphans (docs без source)\n- ...\n\n## Drift candidates (pair-diff)\n| Source | Docs | mtime lag | Приоритет |\n|--------|------|-----------|-----------|\n\n## Неочевидности (§ 10 CLAUDE.md, не покрыто docs)\n- ...\n\n## Итого\n- Coverage суммарный: X%\n- Drift critical: N\n- Drift warn: N\n- Gaps: N\n- Orphans: N\n</code></pre>\n<h2>Чего НЕ делает</h2>\n<ul>\n<li>НЕ правит код.</li>\n<li>НЕ правит docs.</li>\n<li>НЕ создаёт draft-PR с предложениями (это будет следующий шаг — <code>/auto-docs</code>).</li>\n<li>НЕ принимает решений о категориях docs (новая категория = архитектурное решение, не аудит).</li>\n</ul>\n<h2>Связь с другими скиллами</h2>\n<ul>\n<li><code>/verify</code> — проверка артефакта по эталону Pack (VR.R.001). <code>/audit-docs</code> — кросс-репо coverage аудит (R24/VR.R.002). Разные роли, разные методы.</li>\n<li><code>iwe-drift.sh</code> — детектирует drift между парами в <code>sync-manifest.yaml</code> (S-класс). <code>/audit-docs</code> — углублённый аудит docs/ внутри одного репо. drift→решение «нужно пройтись /audit-docs» — типовой workflow.</li>\n</ul>\n<h2>Связь с SC.024.∞</h2>\n<p>Этот скилл реализует Variant C (manual baseline) из дизайна <code>SC.024.∞ — Auto-update docs/</code>. После 2 недель обкатки и калибровки точности — переход на Variant A (post-merge GitHub webhook). См. README.md рядом.</p>\n","files":[{"path":".audit-context.yaml.example","sizeBytes":882,"isText":false},{"path":"SKILL.md","sizeBytes":10738,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-08T11:56:00.407715Z","sha256":"0F1FD4DD13931392AFDE6882E4CE771D83F8176368B6C7A611B8661EF3DB2669","sizeBytes":4960},"review":null,"source":{"repositoryUrl":"https://github.com/TserenTserenov/FMT-exocortex-template","path":".claude/skills/audit-docs","license":"MIT","commit":"4d7b8f2e95161240a02a028ae5a8b9d2914b7939","subtreeSha":"B7C06C6CD4D8A429A56CC6E208E804861E13B96F57A484DD6D79D37C91AC36E9","lastSyncedAt":"2026-09-25T07:36:52.516704Z"},"reviewedAt":"2026-09-08T11:56:22.712232Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/TserenTserenov/FMT-exocortex-template/tree/main/.claude/skills/audit-docs"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install tserentserenov-fmt-exocortex-template@llmmart"},{"target":"git","command":"git clone https://github.com/TserenTserenov/FMT-exocortex-template.git"}]}