# Отчёт приёмки двухуровневого указателя (G0–G7)

Дата: 19.10.2026. Проект: RAGRAF, `RAGRAF`.
Ревизия корпуса RAGRAF: `rev-0183` (679 файлов, 3812 узлов, 48559 рёбер).
Контрольная сумма совпала с записанной; переиндексация не требуется.

## 1. Вердикт

**PASS для G0–G7.** Все восемь этапов плана закрыты кодом, тестами и
документацией. Чекер конвенций: 22 проверки, 0 ошибок, 0 предупреждений.
Новых проверок по плану — 158, все зелёные.

Отчёт не распространяется на метрики M1–M7: в этом цикле они не перемерялись
(см. раздел 5). Числа ниже — измеренные в этой сессии, а не перенесённые из
документов.

## 2. Критерии приёмки

| № | Критерий | Факт | Вердикт |
|---|---|---|---|
| 1 | Карта не входит в `corpus_hash`; скан не меняет сумму | `Test-GlobalMapIsolation`; `tests/test_global_map.py` 23/23 | PASS |
| 2 | Содержимое не читается; маркер секрета не найден ни в базе, ни в WAL | `tests/test_global_map.py`, проверка байтов БД | PASS |
| 3 | Два скана неизменённого дерева дают один отпечаток | `tests/test_global_map.py` | PASS |
| 4 | Маршрут детерминирован; свежесть не создаёт кандидата; исчезнувший корень не рекомендуется | `tests/test_route.py` 22/22 | PASS |
| 5 | Документ адресуется строками извлечённого текста; `live_read` тем же извлекателем; без библиотеки — `metadata_only` | `tests/test_documents_index.py` 10/10, `tests/test_extractors.py` 33/33 | PASS |
| 6 | Экспорт аналитики без путей; удаление без копии невозможно | `tests/test_analytics.py` 15/15, `Test-AnalyticsLocalOnly` | PASS |
| 7 | Полный цикл источников в панели: чтение без токена, изменение с токеном, файлы целы | `tests/test_admin_sources.py` 19/19 (живой запуск) | PASS |
| 8 | Чекер: 0 ошибок, 0 предупреждений | 22 проверки, PASS | PASS |
| 9 | Сеть: только UNC/смонтированный путь с `--network`; URL-коннекторы отклоняются; в новых слоях нет сетевых клиентов | `tests/test_sources_registry.py` 20/20; чекер `new layers stay local` | PASS |

## 3. Этапы

| Этап | Состояние | Чем подтверждён |
|---|---|---|
| G0. Реестр источников и карта | готово | 1 корень `AMD`, 249 файлов, 1 секретное место; тесты 20 + 23 |
| G1. Маршрутизатор | готово | запрос «AMD»: рекомендован корпус AMD, `map_hits=249`; тест 22 |
| G2. Текстовые форматы | готово | `LANG_BY_EXT`, предел 20 МБ для логов; `test_lang_routing` 56 |
| G3. Секретоносные места | готово | путь/правило/размер/дата; содержимое не читается |
| G4. Польза и аналитика | готово | `feedback`, `analytics export/delete`, 30-дневный срез; тесты 16 + 15 |
| G5. Документы | готово | PDF/DOCX/XLSX/PPTX/EML/ODT/RTF; MSG — при библиотеке; e2e 10 |
| G6. Сетевые источники и отправка | закрыто решением | UNC/mounted только с `--network`; URL-коннекторы отклоняются с причиной; отправка аналитики не реализована по инварианту локальности |
| G7. Панель источников и пользы | готово | `/sources`, `/value`, `/api/sources`; живой цикл 19 |

## 4. Измеренные числа

| Что | Значение |
|---|---|
| Корпус RAGRAF | `rev-0183`, 679 файлов, 3812 узлов, 48559 рёбер, 3569 чанков |
| Корпус z.batteryservice.ru | `rev-0260`, 272 файла, 2670 узлов, 30765 рёбер |
| Карта источников | 1 корень, 249 файлов, 1 секретное место |
| Маршрут «AMD» | `map_hits=249`, `recommended.category=AMD`, `available=true` |
| Сквозной документ | PDF/XLSX/ODT: поиск по маркеру и `live_read` совпали |
| Новые проверки плана | 158 |
| Чекер | 22 проверки, 0 ошибок, 0 предупреждений |
| BOM/CRLF | 39 файлов проверено, 39 чистых |
| Java после прогонов | нет |

## 5. Что не подтверждено

1. **M1–M7 в этом цикле не измерялись.** Это метрики бенчмарка (навигация,
   impact по истории, экономия контекста, сжатие среза, свежесть,
   проверяемость, стоимость обновления), и для них нужны артефакты
   `bench/results/*`. В приёмке G0–G7 они не перемерялись; выдавать прежние
   числа за текущие нельзя. Прежние замеры — `docs/03_implementation/RAGRAF_EFFECT_REPORT.md`,
   они относятся к своим ревизиям и корпусам.
2. **Отправка аналитики наружу не реализована** — это решение, а не дефект:
   инвариант локальности. Экспорт остаётся файлом, удаление — после копии.
3. **URL-коннекторы (`ssh://`, `s3://`, `webdav://`, `http://`) не реализованы.**
   `sources add` отклоняет их с причиной; сетевой корень — UNC или смонтированный
   путь с `--network`.
4. **OCR, архивы, `.pst/.ost`, `.evtx/.pcap` не реализованы** — за пределами
   первой версии. `.msg` доступен только при установленной `extract-msg`;
   без неё документ честно помечается `metadata_only`.
5. **Экспорт CPG по-прежнему недоступен.** Связи получены запросами к файлу CPG:
   23360 после фильтрации из 199728, подтверждено в графе 2051. Это граница
   инструмента, а не настройка.
6. **Сетевой корень по UNC живым прогоном не проверялся** (нет доступной
   сетевой шары в этом окружении); проверены отказ без `--network`, отказ
   URL-коннекторов и таймаут проверки доступности.
7. **Отдельного флага режима «Я это ты» нет** — сознательно. Источники
   добавляются явно, карта не читает содержимое, маршрут только читает;
   настройка без проверяемого поведения была бы декоративной.

## 6. Риски и границы

- `test_report_facts` привязан к ревизии z: следующая внешняя правка корпуса
  потребует синхронизировать отчёт и `EXPECT` — это предусмотренная процедура.
- `--kind` при явном виде чанка читает до 200 кандидатов: фильтр применяется
  до лимита, иначе документы вытеснялись образцами слоя баз.
- Поиск карты по имени корня широк по замыслу: запрос «AMD» возвращает все
  файлы корня; в оценке маршрута число попаданий ограничено.
- Секретоносные файлы не читаются; в карте только имя, размер, правило и дата.

## 7. Откат

- Код: откат `src/ragraf/{sources,global_map,route,documents,feedback,analytics}.py`
  и точек входа; схема `.ragraf` не менялась, новые таблицы карты живут в
  `catalog/global_map.sqlite` вне корпуса.
- Документы: откат `ACCEPTANCE.md`, плана и этого отчёта не требует
  переиндексации; откат кода требует `reindex`.
- Навык: копия `ragraf-core.bak-<штамп>` в каждой учётной записи.
- Аналитика: удаление строк необратимо, но перед ним создаётся копия
  `catalog/analytics/analytics-backup-*.json`; без копии операция отказывает.

## 8. Команды приёмки

```powershell
python tools/ragraf.py -p config/ragraf.yaml status
python tools/ragraf.py -p config/ragraf.yaml check
python tools/ragraf.py sources list
python tools/ragraf.py map find AMD --limit 3
python tools/ragraf.py --json -p config/ragraf.yaml query route "AMD" --limit 3
python tests/test_documents_index.py
pwsh -NoLogo -NoProfile -NonInteractive -File tools/Invoke-ProjectDoctrine.ps1
```
