18 KiB
Автономное тройное ревью П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
проходит сквозной путь:
- сохраняется в
sourceOfTruth; - ставится в
ingestQueueпо ключуid:version; - повторная постановка того же ключа получает
duplicate-ingest-suppressed; - актуальное событие попадает в
pendingIndex; - query до refresh возвращает ноль попаданий;
refreshSearchпереносит ту же version вvisibleIndex;- тот же 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 | Официальный анонс датирован 25 мая 2021 года. Поэтому 7.13 — корректная историческая рамка для июльских текстов; 7.15 для неё не используется. |
| В Elasticsearch 7.13 refresh делает операции с индексом доступными search, а near-real-time не означает мгновенную видимость | Elasticsearch 7.13: Near real-time search | Источник описывает поведение линии 7.13, выпущенной до июля 2021 года. Статьи не переносят его интервал, стоимость или режим на fixture и не объявляют SLA. |
| Index API 7.13 отдельно описывает refresh и versioning | Elasticsearch 7.13: Index API | Учебная проверка version не является вызовом API, external versioning или заменой optimistic concurrency control. |
| Get API 7.13 по умолчанию realtime и отделён от момента search visibility | Elasticsearch 7.13: Get API | Source Map не моделирует Get API. Факт используется только для объяснения, почему чтение по id и полнотекстовый query требуют отдельных доказательств. |
| Refresh parameter различает отсутствие действия, запрос refresh и ожидание перехода | Elasticsearch 7.13: The refresh parameter | Пакет не рекомендует включать режим на любой 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
Основной редактор не принял исходный пакет без изменений.
- Историческая рамка была исправлена с Elasticsearch 7.15 на 7.13. Официальный выпуск 7.13 датирован 25 мая 2021 года, а 7.15 — 22 сентября 2021 года; последний не мог быть источником июльского автора. Все ссылки, названия и упоминания в revision заменены на 7.13.
- В fixture обнаружена слабая проверка:
pendingIndex.sizeчитался послеrefresh. Теперь размер pending фиксируется до refresh. Также добавлен учебный receipt-set: повтор одногоid:versionподавляется и после consume; это явно ограничено in-memory моделью, а не выдано за гарантию broker. - Имена временных 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.