# Автономное тройное ревью П41 · июль 2021 · «Индексация и поиск» Статус: **принято к публикации после независимой интеграции**. Первоначально это был sidecar-пакет: три revision для существующих slug подготовлены, но registry, README, articles.json, общие аудиты и Git не менялись. Внутри пакета созданы ровно пять файлов: - web/scripts/upgrade-2021-07.mjs; - web/public/assets/editorial/2021/search-indexing-pipeline-2021.svg; - web/public/assets/editorial/2021/search-indexing-lag-budget-2021.svg; - web/public/assets/editorial/2021/search-indexing-diagnosis-2021.svg; - этот документ. Revision-модуль экспортирует только overlay-поля. В нём нет date, author или подключения к editorialRevisions; исходные архивные поля останутся владельцем базовой записи. Команда --print-revisions печатает тот же JSON, что import-safe export. Команда --verify-fixture выполняет исключительно локальную детерминированную модель в памяти. ## Проход 1. Структура, объём и голос М4 — пройдено | Revision | Симптом и цена в начале | Главный вопрос | Объём основного текста | | --- | --- | --- | --- | | Практика | Карточка открывается, но поиск пуст или stale; цена — дубликат, потерянная история версии и неверное массовое действие | Как договориться о свежести обычной выдачи до выбора настройки движка | **10 440** знаков body | | Механизм | Успешное сохранение ошибочно считают признаком видимости; цена — source с version 7 и выдача с version 6 или без попадания | Где проходит граница source, ingest, pending index, refresh и query | **10 255** знаков body | | Полевой разбор | Source существует, а заданный query пуст; цена — удалить доказательство, создать копию и потерять причину | Как собрать evidence и пройти rollback-safe диагностику | **10 247** знаков body | - Все тексты находятся в диапазоне 5 000–15 000 знаков. В каждом есть проблема и стоимость в первых двух абзацах, минимум пять смысловых разделов, таблица, figure с осмысленным alt/figcaption, рабочие JS-фрагменты, нумерованный маршрут и раздел ограничений. - В каждом маршруте названы четыре звена: симптом, граница причины, проверка version и точек времени, затем действие только для подтверждённого участка. Это сохраняет прагматичный порядок «симптом → причина → проверка → действие», а не даёт один универсальный reindex. - Голос соответствует М4 июля 2021 года: короткая техническая речь, явные владельцы состояния и условия. Новое умение — отделить хранение от поисковой проекции и диагностировать их границу. Оно естественно продолжает материалы о кешах, очередях, event-потоках и согласованности данных. - Убраны признаки позднего техлидского тона: нет выдуманной команды, платформы, пользовательских метрик, SLA, инцидента, production-лога или обещания, что задержка одинаково решается на любой нагрузке. Вердикт: **пройдено**. Вставленные значения 100, 110, 125, 160 и 60 служат только детерминированной арифметике fixture. Текст прямо называет их условными и не переносит в договор production. ## Проход 2. Технические утверждения и сквозная fixture — пройдено Один неизменяемый документ article-2021-07-42 с version 7 проходит сквозной путь: 1. сохраняется в sourceOfTruth; 2. ставится в ingestQueue по ключу id:version; 3. повторная постановка того же ключа получает duplicate-ingest-suppressed; 4. актуальное событие попадает в pendingIndex; 5. query до refresh возвращает ноль попаданий; 6. refreshSearch переносит ту же version в visibleIndex; 7. тот же query возвращает один hit, а диагностика меняется с awaiting-refresh на query-contract. | Инвариант fixture | Фактическая проверка | | --- | --- | | Source сохранён раньше ingest | source-saved → ingest-enqueued входит в утверждённый порядок stages | | Повторная постановка идемпотентна в границах fixture | повтор до consume и повтор после него возвращают duplicate-ingest-suppressed; accepted key остаётся в учебном receipt-set | | Source не равен видимости поиска | query пуст до index и после index до refresh | | Version не теряется при переходе | hit после refresh содержит current version 7 | | Наблюдаемая задержка не выдана за SLA | visibleAtMs − savedAtMs = 60 проверяется как арифметика модели | | Диагностика не разрушает источник | обе пройденные diagnostic-ветки имеют destructiveAction: false | | Конечное действие относится к query | после видимости результат — query-contract, а не новый blind reindex | Fixture содержит десять истинных assertions. Один из них проверяет suppression повтора как до consume, так и после него; receipt-set остаётся только учебной in-memory границей. Она не реализует Elasticsearch, Lucene, базу, broker, сетевой retry, shard, replica, alias, анализатор, права, persistence, concurrency или реальную policy refresh. Поэтому Map в статье не назван настройкой поискового движка и не объявлен доказательством delivery guarantee, near-real-time SLA или производительности. Вердикт: **пройдено**. Пример исполняется без внешней инфраструктуры и проверяет все заявленные результаты: сохранение, ingest, stale выдачу, refresh, query, idempotent re-enqueue, version и безопасную диагностику. ## Проход 3. Точность, визуалы и ссылки — пройдено | Утверждение в материалах | Первичный или официальный источник | Проверенная граница | | --- | --- | --- | | Линия Elasticsearch 7.13 существовала к июлю 2021 года | [Elastic 7.13.0 released](https://www.elastic.co/blog/whats-new-elastic-7-13-0/) | Официальный анонс датирован 25 мая 2021 года. Поэтому 7.13 — корректная историческая рамка для июльских текстов; 7.15 для неё не используется. | | В Elasticsearch 7.13 refresh делает операции с индексом доступными search, а near-real-time не означает мгновенную видимость | [Elasticsearch 7.13: Near real-time search](https://www.elastic.co/guide/en/elasticsearch/reference/7.13/near-real-time.html) | Источник описывает поведение линии 7.13, выпущенной до июля 2021 года. Статьи не переносят его интервал, стоимость или режим на fixture и не объявляют SLA. | | Index API 7.13 отдельно описывает refresh и versioning | [Elasticsearch 7.13: Index API](https://www.elastic.co/guide/en/elasticsearch/reference/7.13/docs-index_.html) | Учебная проверка version не является вызовом API, external versioning или заменой optimistic concurrency control. | | Get API 7.13 по умолчанию realtime и отделён от момента search visibility | [Elasticsearch 7.13: Get API](https://www.elastic.co/guide/en/elasticsearch/reference/7.13/docs-get.html) | Source Map не моделирует Get API. Факт используется только для объяснения, почему чтение по id и полнотекстовый query требуют отдельных доказательств. | | Refresh parameter различает отсутствие действия, запрос refresh и ожидание перехода | [Elasticsearch 7.13: The refresh parameter](https://www.elastic.co/guide/en/elasticsearch/reference/7.13/docs-refresh.html) | Пакет не рекомендует включать режим на любой write-path и не делает утверждение о нагрузке конкретного кластера. | - search-indexing-pipeline-2021.svg показывает источник, ключ id:version, подавленный duplicate, pending state, stale query, refresh и найденный current version. На 375 px проверены карточки, стрелки и нижняя подпись. - search-indexing-lag-budget-2021.svg показывает именно учебные точки 100/110/125/160 и явно отмечает 60 как assertion, а не SLA. На 375 px проверены заголовок, промежуток awaiting-refresh и заключительная карточка. - search-indexing-diagnosis-2021.svg показывает дерево source → ingest → pending → visible → query и действие при отрицательной ветке. После мобильного рендера нижняя предупреждающая карточка была разбита на две строки; clipping и horizontal overflow в финальном варианте не наблюдаются. - Во всех SVG есть title, desc и role="img". Static scan не нашёл script, foreignObject, внешних href/src или raster data URI. Вердикт: **пройдено**. Историческая рамка ограничена документацией Elastic 7.13, существовавшей к июлю 2021 года. В текст не добавлены утверждения о настоящей платформе, SLA, логах, поисковой статистике или результате эксплуатации. ## Фактически выполненные проверки Пакет проверен 31 июля 2026 года:
cd web && node --check scripts/upgrade-2021-07.mjs
cd web && npm run audit:draft -- scripts/upgrade-2021-07.mjs
cd web && node scripts/upgrade-2021-07.mjs --verify-fixture
cd web && xmllint --noout \
  public/assets/editorial/2021/search-indexing-pipeline-2021.svg \
  public/assets/editorial/2021/search-indexing-lag-budget-2021.svg \
  public/assets/editorial/2021/search-indexing-diagnosis-2021.svg
| Проверка | Реальный результат | | --- | --- | | node --check | PASS, code 0 | | Import-safe export и draft gate | PASS: **10 440 / 10 255 / 10 247** знаков body; для трёх slug найдены sections, table, figure, code, route, sources и локальные assets | | In-memory fixture | PASS: десять assertions истинны; source сохранён, duplicate подавлен до и после consume, stale query наблюдаем до refresh, current version видима после refresh, диагностика неразрушающая | | xmllint --noout | PASS, все три SVG — корректный XML | | SVG safety scan | PASS: не найдены script, foreignObject, внешние href/src или raster data URI | | Sharp mobile preflight | PASS: все три финальных SVG отрендерены в PNG шириной 375 px и просмотрены вручную; clipping, overlap и horizontal overflow внутри схем не обнаружены | | Scope/self-review | PASS: П41 создаёт только пять перечисленных файлов; не меняет registry, README, articles.json, общие аудиты, чужие файлы и Git | npm run audit:draft завершилась с code 0. npm напечатал существующие предупреждения о пользовательских store-dir, cache-dir и public-hoist-pattern; они не относятся к П41 и не менялись пакетом. Намеренно не запускались: strict audit через registry, production build, browser, screen reader, Elasticsearch, база, broker, HTTP, CI, deployment, commit, push или публикация. Эти операции остаются независимому интегратору, потому что sidecar не подключает revision и не меняет Git. Выпусковой вердикт автономного пакета: **READY FOR INDEPENDENT INTEGRATION**. ## Независимая редактура и интеграция · 31 июля 2026 Основной редактор не принял исходный пакет без изменений. 1. Историческая рамка была исправлена с Elasticsearch 7.15 на 7.13. Официальный выпуск 7.13 датирован 25 мая 2021 года, а 7.15 — 22 сентября 2021 года; последний не мог быть источником июльского автора. Все ссылки, названия и упоминания в revision заменены на 7.13. 2. В fixture обнаружена слабая проверка: `pendingIndex.size` читался после `refresh`. Теперь размер pending фиксируется до refresh. Также добавлен учебный receipt-set: повтор одного `id:version` подавляется и после consume; это явно ограничено in-memory моделью, а не выдано за гарантию broker. 3. Имена временных evidence синхронизированы между кодом, текстом и схемой: `savedAtMs`, `enqueuedAtMs`, `indexedAtMs`, `visibleAtMs`. Повторные результаты после правок: | Проверка | Результат независимого прохода | | --- | --- | | `node --check` и draft gate | PASS: **10 440 / 10 255 / 10 247** знаков body | | Fixture | PASS: 10/10 assertions; повтор подавлен до и после consume, pending доказан до refresh | | `xmllint` и SVG safety scan | PASS: три XML-диаграммы корректны; не найдены script, foreignObject, внешние URL или raster data URI | | Mobile visual review | PASS: все три SVG повторно отрендерены Sharp на 375 px; длинные временные поля читаемы, clipping и overflow не наблюдаются | | Strict audit через registry | PASS: **10 440 / 10 255 / 10 247** знаков; в каждой revision есть figure, table, code, route, sources и локальный asset | | Production build | PASS: Next.js сгенерировал 374 статические страницы | Три revision подключены к `web/data/editorial-revisions.mjs`; базовые дату, автора и slug сохраняет архив. После подключения строгий охват составляет **127 из 358**, остаётся **231** материал. Финальный вердикт: **ACCEPTED FOR PUBLICATION**.