186 lines
18 KiB
Markdown
186 lines
18 KiB
Markdown
# Автономное тройное ревью П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 && 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</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**.
|