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

186 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Автономное тройное ревью П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**.