Files
huncode 2a30c8816c
Build and deploy / deploy (push) Successful in 15s
revise July 2021 search indexing articles
2026-07-31 12:57:26 +03:00

18 KiB
Raw Permalink Blame History

Автономное тройное ревью П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 Официальный анонс датирован 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

Основной редактор не принял исходный пакет без изменений.

  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.