revise July 2021 search indexing articles
Build and deploy / deploy (push) Successful in 15s

This commit is contained in:
2026-07-31 12:57:26 +03:00
parent 2da66c5725
commit 2a30c8816c
7 changed files with 1014 additions and 1 deletions
+185
View File
@@ -0,0 +1,185 @@
# Автономное тройное ревью П41 · июль 2021 · «Индексация и поиск»
Статус: **принято к публикации после независимой интеграции**. Первоначально это был sidecar-пакет: три revision
для существующих slug подготовлены, но registry, README, <code>articles.json</code>,
общие аудиты и Git не менялись.
Внутри пакета созданы ровно пять файлов:
- <code>web/scripts/upgrade-2021-07.mjs</code>;
- <code>web/public/assets/editorial/2021/search-indexing-pipeline-2021.svg</code>;
- <code>web/public/assets/editorial/2021/search-indexing-lag-budget-2021.svg</code>;
- <code>web/public/assets/editorial/2021/search-indexing-diagnosis-2021.svg</code>;
- этот документ.
Revision-модуль экспортирует только overlay-поля. В нём нет
<code>date</code>, <code>author</code> или подключения к
<code>editorialRevisions</code>; исходные архивные поля останутся владельцем
базовой записи. Команда <code>--print-revisions</code> печатает тот же JSON,
что import-safe export. Команда <code>--verify-fixture</code> выполняет
исключительно локальную детерминированную модель в памяти.
## Проход 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 с осмысленным <code>alt</code>/<code>figcaption</code>,
рабочие JS-фрагменты, нумерованный маршрут и раздел ограничений.
- В каждом маршруте названы четыре звена: симптом, граница причины, проверка
version и точек времени, затем действие только для подтверждённого участка.
Это сохраняет прагматичный порядок «симптом → причина → проверка →
действие», а не даёт один универсальный reindex.
- Голос соответствует М4 июля 2021 года: короткая техническая речь, явные
владельцы состояния и условия. Новое умение — отделить хранение от
поисковой проекции и диагностировать их границу. Оно естественно продолжает
материалы о кешах, очередях, event-потоках и согласованности данных.
- Убраны признаки позднего техлидского тона: нет выдуманной команды,
платформы, пользовательских метрик, SLA, инцидента, production-лога или
обещания, что задержка одинаково решается на любой нагрузке.
Вердикт: **пройдено**. Вставленные значения 100, 110, 125, 160 и 60 служат
только детерминированной арифметике fixture. Текст прямо называет их
условными и не переносит в договор production.
## Проход 2. Технические утверждения и сквозная fixture — пройдено
Один неизменяемый документ <code>article-2021-07-42</code> с version 7
проходит сквозной путь:
1. сохраняется в <code>sourceOfTruth</code>;
2. ставится в <code>ingestQueue</code> по ключу <code>id:version</code>;
3. повторная постановка того же ключа получает
<code>duplicate-ingest-suppressed</code>;
4. актуальное событие попадает в <code>pendingIndex</code>;
5. query до refresh возвращает ноль попаданий;
6. <code>refreshSearch</code> переносит ту же version в
<code>visibleIndex</code>;
7. тот же query возвращает один hit, а диагностика меняется с
<code>awaiting-refresh</code> на <code>query-contract</code>.
| Инвариант fixture | Фактическая проверка |
| --- | --- |
| Source сохранён раньше ingest | <code>source-saved → ingest-enqueued</code> входит в утверждённый порядок stages |
| Повторная постановка идемпотентна в границах fixture | повтор до consume и повтор после него возвращают <code>duplicate-ingest-suppressed</code>; accepted key остаётся в учебном receipt-set |
| Source не равен видимости поиска | query пуст до index и после index до refresh |
| Version не теряется при переходе | hit после refresh содержит current version 7 |
| Наблюдаемая задержка не выдана за SLA | <code>visibleAtMs − savedAtMs = 60</code> проверяется как арифметика модели |
| Диагностика не разрушает источник | обе пройденные diagnostic-ветки имеют <code>destructiveAction: false</code> |
| Конечное действие относится к query | после видимости результат — <code>query-contract</code>, а не новый blind reindex |
Fixture содержит десять истинных assertions. Один из них проверяет suppression
повтора как до consume, так и после него; receipt-set остаётся только учебной
in-memory границей. Она не реализует Elasticsearch,
Lucene, базу, broker, сетевой retry, shard, replica, alias, анализатор,
права, persistence, concurrency или реальную policy refresh. Поэтому
<code>Map</code> в статье не назван настройкой поискового движка и не
объявлен доказательством 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 и не делает утверждение о нагрузке конкретного кластера. |
- <code>search-indexing-pipeline-2021.svg</code> показывает источник,
ключ id:version, подавленный duplicate, pending state, stale query,
refresh и найденный current version. На 375 px проверены карточки,
стрелки и нижняя подпись.
- <code>search-indexing-lag-budget-2021.svg</code> показывает именно
учебные точки 100/110/125/160 и явно отмечает 60 как assertion, а не
SLA. На 375 px проверены заголовок, промежуток awaiting-refresh и
заключительная карточка.
- <code>search-indexing-diagnosis-2021.svg</code> показывает дерево
source → ingest → pending → visible → query и действие при отрицательной
ветке. После мобильного рендера нижняя предупреждающая карточка была
разбита на две строки; clipping и horizontal overflow в финальном варианте
не наблюдаются.
- Во всех SVG есть <code>title</code>, <code>desc</code> и
<code>role="img"</code>. Static scan не нашёл <code>script</code>,
<code>foreignObject</code>, внешних href/src или raster data URI.
Вердикт: **пройдено**. Историческая рамка ограничена документацией Elastic
7.13, существовавшей к июлю 2021 года. В текст не добавлены утверждения о
настоящей платформе, SLA, логах, поисковой статистике или результате
эксплуатации.
## Фактически выполненные проверки
Пакет проверен 31 июля 2026 года:
<pre><code>cd web &amp;&amp; node --check scripts/upgrade-2021-07.mjs
cd web &amp;&amp; npm run audit:draft -- scripts/upgrade-2021-07.mjs
cd web &amp;&amp; node scripts/upgrade-2021-07.mjs --verify-fixture
cd web &amp;&amp; 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</code></pre>
| Проверка | Реальный результат |
| --- | --- |
| <code>node --check</code> | 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, диагностика неразрушающая |
| <code>xmllint --noout</code> | PASS, все три SVG — корректный XML |
| SVG safety scan | PASS: не найдены <code>script</code>, <code>foreignObject</code>, внешние href/src или raster data URI |
| Sharp mobile preflight | PASS: все три финальных SVG отрендерены в PNG шириной 375 px и просмотрены вручную; clipping, overlap и horizontal overflow внутри схем не обнаружены |
| Scope/self-review | PASS: П41 создаёт только пять перечисленных файлов; не меняет registry, README, <code>articles.json</code>, общие аудиты, чужие файлы и Git |
<code>npm run audit:draft</code> завершилась с code 0. npm напечатал
существующие предупреждения о пользовательских <code>store-dir</code>,
<code>cache-dir</code> и <code>public-hoist-pattern</code>; они не относятся
к П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**.