WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-652 · Дефект · Инфраструктура · web

P1 [bus factor]: раздел F — входы получаются и проверяются НЕ так, как обещает текст (подпись, SHA256SUMS, verified.json, переносимость теста)

Закрыт P1 · важно ведёт: — эпик: WEB-641
Суть
Правила обогащения: WEB-449. Parent WEB-641. Заведено координатором 13.09 по внешнему разбору архива (файл review-web641/WEB641-REVIEW-ACCESS-PLAN-20260913.md, подзадачи BF-FIX-1/2/3/5).

## Суть
Раздел F книги v9 («пакет доступов для второго человека») обещает проверки, которые команды раздела на самом деле не делают. Это и есть единственный корневой блокер, из-за которого Codex в финальном раунде поставил EXAM=FAIL при двух PASS.

## Что именно не так
1. Цифровая подпись разрешения на выпуск НЕ проверяется: команда сравнивает поле artifactSha256 в JSON, а это не проверка подписи. Нужно звать штатный verifier с доверенным публичным ключом.
2. SHA256SUMS: инструкция требует сверить список контрольных сумм, но его получение этой же командой не предусмотрено — сверять нечего. Список должен относиться к конкретной актуальной линии, а не к исторической.
3. verified.json цели отката: путь предлагается по шаблону вида <линия>-deploy, вместо того чтобы читать точный путь из поля old.verifiedJson выбранного манифеста. На compat-релизе, где каталог называется иначе, шаблон не сработает.
4. Тест полноты раздела F слишком слабый: проверяет «10 строк × 5 колонок», а не соответствие полей манифесту и реальное поведение команд.
5. Переносимость: в тесте эквивалентности сборочной цепочки зашит абсолютный путь к фикстуре из прежней рабочей среды, поэтому класс из трёх проверок молча пропускается. Внешний рецензент подтвердил: при перенаправлении указателя на файл из этого же архива все три проходят. Путь сделать относительным внутри пакета.

## Почему это важно
Нулевой агент, следуя книге буквально, будет думать, что проверил подпись и суммы, а на деле не проверит. Это хуже, чем отсутствие проверки, потому что создаёт ложную уверенность.

## Приёмка
По каждому пункту — тест, который краснеет без фикса: подложить неправильную подпись → отказ; убрать SHA256SUMS → отказ; манифест с нестандартным каталогом отката → путь взят из манифеста; тест F проверяет поля против манифеста; прогон `python3 -m unittest discover -s ops/line-factory/tests` даёт 126 без пропусков на чистой распаковке архива.

## Источники
Внешний разбор: shift-20260912-resume/review-web641/WEB641-REVIEW-ACCESS-PLAN-20260913.md (раздел 3). Отчёт Codex: busfactor-archive/exams/3618BF05EXAM6CODEX-REPORT.md строки 1-19, 54-97. Протокол прогона тестов: review-web641/WEB641-OFFLINE-TESTS-20260913.txt.
Лента
2026-09-13T09:55:53.925Z · coordinator
[13.09 09:55Z координатор] Взято в работу 13.09: волна 3644 (Codex Luna, A1) — делает проверки раздела F настоящими (штатный верификатор подписи, получение SHA256SUMS для актуальной линии, путь verified.json из манифеста, усиленный тест F, относительный путь фикстуры). Приёмка: на чистой распаковке пакета 126 тестов и ноль пропусков, плюс негатив на каждый пункт.
2026-09-13T10:20:48.881Z · coordinator
[13.09 10:20Z координатор] Волна 3644 (Codex Luna, A1) — GO: корневой блокер Codex из финального раунда закрыт по существу (refs/waves/3644 = 2c8deeade, BASE = книга v9).
Что стало настоящим:
• Подпись разрешения на выпуск теперь ПРОВЕРЯЕТСЯ штатным верификатором с доверенным публичным ключом. Раньше книга говорила «подпись проверена», а команда смотрела только на число SHA в JSON — это была ложная уверенность, ровно то, на что указал внешний разбор.
• SHA256SUMS теперь реально получаются для конкретной актуальной линии, а не сверяются с пустым местом.
• Путь verified.json цели отката читается из поля манифеста, а не угадывается по шаблону — с тестом на compat-релизе, где каталог называется иначе.
• Тест полноты раздела F усилен: проверяет соответствие полей манифесту и поведение команд, а не «10 строк на 5 колонок».
• Переносимость: фикстура сборочной цепочки перенесена внутрь пакета (ops/line-factory/tests/fixtures/), указатель стал относительным.
ЧЕСТНЫЕ ЦИФРЫ ТЕСТОВ (важно, потому что раньше я их называл неверно): на чистой распаковке исходного пакета было 123 прогона и один молча пропущенный класс из трёх проверок. После исправления — 132 прогона, 0 пропусков. То есть прибавка не только от разблокированных трёх, но и от новых негативных тестов на подпись, суммы и путь отката.
Карточки WEB-653 и WEB-654 закрываются этой же волной — смотри их комментарии.
2026-09-15T10:33:01.964Z · coordinator
[15.09 10:33Z координатор] Независимая приёмка 3970: VERDICT=NO-GO. Кандидат 3968 остаётся непосаженным.

Блокер: F10 берёт путь old.verifiedJson из манифеста, но artifactSha256/sourceCommit сравнивает только с дублирующими CLI-аргументами. Минимальный отрицательный сценарий «манифест=A, verified.json=B, CLI=B/B» дал rc=0 и PASS. Значит чужая rollback-квитанция может быть принята.

Что подтверждено: targeted section-F 10/10, весь busfactor-kit 63/63; F1–F7, F9 и обычный mismatch F10 честно отказывают без traceback. Evidence 7/7 прошли SHA256.

Исправление уже отдано узкой волне 3972 на M4/Luna: ожидания F10 должны браться из того же manifest.old, плюс отрицательный тест A/B/B. До её отдельной повторной приёмки WEB-652 остаётся review.

Отчёт: A2 /home/ubuntu/waves/3970SECTIONFACC-REPORT.md
Evidence: A2 /home/ubuntu/waves/3970SECTIONFACC-evidence/
2026-09-15T10:44:04.896Z · coordinator
[15.09 10:44Z координатор] Починка после NO-GO 3970: волна 3972, авторский VERDICT=GO. Это ещё не финальная приёмка.

F10 теперь берёт expected artifactSha256/sourceCommit из того же manifest.old, что и путь verifiedJson. Совместимые CLI-аргументы сохранены, но больше не могут переопределить манифест. Сценарий manifest=A, target=B, CLI=B/B: до правки rc=0/PASS, после правки rc=2/ОТКАЗ F10.

Проверки автора: section-F 12/12, busfactor-kit 65/65, BF-06 17/17, BF-10 12/12, round-4 8/8; полный line-factory не добавил failures относительно базы. Evidence и bundle проверены координатором; HEAD 23be8736aefc6e6b68455d735a9e3cbb5099f038, prerequisite 8f0f45f49d85b32035987de761d6ecd748a06637.

Повторная независимая приёмка 3975 поставлена на A2/Luna. До её GO и дальнейшей посадки WEB-652 остаётся review.
2026-09-15T10:56:50.475Z · coordinator
[15.09 10:56Z координатор] Повторная независимая приёмка 3975: VERDICT=GO. Кандидат F10 принят для следующей посадки, но production-проверка ещё не выполнена.

Независимый disposable harness подтвердил корневой дефект и исправление:
- prerequisite: manifest=A, target=B, CLI=B/B → ложный PASS, rc=0;
- candidate 23be8736aefc6e6b68455d735a9e3cbb5099f038: тот же сценарий → ОТКАЗ F10, rc=2;
- A/A/A проходит;
- target mismatch, CLI mismatch, missing/invalid manifest fields, missing/invalid target fields и неверный путь — все отказывают rc=2 без traceback и без печати identity.

Регрессия: section-F 12/12, busfactor-kit 65/65, BF-06 17/17, BF-10 12/12, round-4 8/8. Полный line-factory на prerequisite и candidate одинаков: 147 pass, 2 известных baseline fail, 3 skip; новых failures нет. Evidence 7/7 SHA256 проверены.

Отчёт: A2 /home/ubuntu/waves/3975F10ACC-REPORT.md
Evidence: A2 /home/ubuntu/waves/3975F10ACC-evidence/

WEB-652 остаётся review до включения кандидата в линию и live-проверок F5/F6/F8/F9 после посадки.
2026-09-15T22:16:59.019Z · coordinator
ENRICH-4135-WEB-652

DRAFT_DELTA (append-only; правила обогащения: WEB-449, блок KNOWN ISSUES — канон
`web_issues.body id=WEB-449`, дамп `_extract/WEB-449.canon.txt` строки 85–86).
Волна 4135, M1/DeepSeek Flash 4.1, read-only аудит.
Источник: `/Users/poolpooly/waves-ds/4130/4130ENRICHBUSFACTOR-REPORT.md` + `_extract/`.

## 1. UTC / КТО / ВЕРДИКТ и точный статус

Тело датировано 13.09 (`updated=2026-09-13T10:20:49.357Z`) и вердикта не несёт. Живая
цепочка вердиктов лежит только в комментариях:

| UTC | Что |
|---|---|
| `2026-09-15T10:33:01.964Z` | независимая приёмка 3970: **`VERDICT=NO-GO`**, кандидат 3968 не посажен |
| `2026-09-15T10:44:04.896Z` | авторский GO 3972, HEAD `23be8736aefc6e6b68455d735a9e3cbb5099f038`, предусловие `8f0f45f49d85b32035987de761d6ecd748a06637` |
| `2026-09-15T10:56:50.475Z` | независимая приёмка 3975: **`VERDICT=GO`** |

Точный статус в живой доске: **`review`** (5 комментариев, последний —
`2026-09-15T10:56:50.475Z`). Формулировка закрытия в последнем комментарии дословна:
«WEB-652 остаётся review до включения кандидата в линию и live-проверок F5/F6/F8/F9
после посадки».

## 2. МЕХАНИЗМ / КОРЕНЬ

Корень (тело, «Суть»): раздел F книги v9 обещает проверки, которых команды раздела
**на самом деле не делают** — «единственный корневой блокер, из-за которого Codex
в финальном раунде поставил EXAM=FAIL при двух PASS». Пять дефектов названы в теле:
(1) подпись разрешения на выпуск не проверяется — команда сравнивает поле `artifactSha256`
в JSON; (2) `SHA256SUMS` требуется сверить, но его получение не предусмотрено; (3) путь
`verified.json` предлагается по шаблону `<линия>-deploy`, а не из поля `old.verifiedJson`
манифеста; (4) тест полноты раздела F проверяет «10 строк × 5 колонок», а не соответствие
полям манифеста; (5) в тесте эквивалентности сборочной цепочки зашит абсолютный путь
к фикстуре, из-за чего класс из трёх проверок **молча пропускается**.

**Устройство исправления**, добытое 15.09 (не в теле): F10 берёт **expected**
`artifactSha256`/`sourceCommit` из того же `manifest.old`, что и путь `verifiedJson`;
совместимые CLI-аргументы сохранены, но **больше не могут переопределить манифест**
(`2026-09-15T10:44:04.896Z`).

Правило одной папки: `2026-09-14T20:49:32.326Z` — «мне нужна одна единственная папка,
а не куча мест».

## 3. КАРТА ДОКУМЕНТОВ (точные пути)

Тело даёт только «Источники». Действующие пути:

- Внешний разбор: `shift-20260912-resume/review-web641/WEB641-REVIEW-ACCESS-PLAN-20260913.md`
  (раздел 3)
- Отчёт Codex: `busfactor-archive/exams/3618BF05EXAM6CODEX-REPORT.md` строки 1–19, 54–97
- Протокол прогона тестов: `review-web641/WEB641-OFFLINE-TESTS-20260913.txt`
- Волна исправления: 3644, `refs/waves/3644` = `2c8deeade`, BASE = книга v9
  (`2026-09-13T10:20:48.881Z`)
- Отчёт NO-GO: `A2 /home/ubuntu/waves/3970SECTIONFACC-REPORT.md`; evidence
  `A2 /home/ubuntu/waves/3970SECTIONFACC-evidence/`
- Отчёт независимой приёмки: `A2 /home/ubuntu/waves/3975F10ACC-REPORT.md`; evidence
  `A2 /home/ubuntu/waves/3975F10ACC-evidence/`
- Отчёт этой волны: `/Users/poolpooly/waves-ds/4135/4135ENRICHBUSFACTORCOMMENTS-REPORT.md`

## 4. ЭВОЛЮЦИЯ и отозванные утверждения

1. **Канон-число тестов в теле отозвано.** Тело требует «126 без пропусков». Комментарий
   `2026-09-13T10:20:48.881Z` даёт честные цифры: на чистой распаковке исходного пакета
   было **123 прогона и один молча пропущенный класс из трёх проверок**; после исправления —
   **132 прогона, 0 пропусков**. Прибавка не только от разблокированных трёх, но и от новых
   негативных тестов на подпись, суммы и путь отката. Та же поправка повторена в WEB-648
   `2026-09-13T10:46:49.138Z` и WEB-649 `2026-09-13T10:46:49.148Z`.
2. **Ложная уверенность названа прямо**: «Раньше книга говорила «подпись проверена»,
   а команда смотрела только на число SHA в JSON — это была ложная уверенность, ровно то,
   на что указал внешний разбор» (`2026-09-13T10:20:48.881Z`).
3. **Отозван первый кандидат.** Независимая 3970 `2026-09-15T10:33:01.964Z` —
   `VERDICT=NO-GO`: F10 берёт путь `old.verifiedJson` из манифеста, но
   `artifactSha256`/`sourceCommit` сравнивает только с дублирующими CLI-аргументами;
   минимальный отрицательный сценарий «манифест=A, verified.json=B, CLI=B/B» дал **rc=0 и
   PASS**. Следствие, названное дословно: «чужая rollback-квитанция может быть принята».
4. **Отзыв снят починкой 3972** (`2026-09-15T10:44:04.896Z`): тот же сценарий до правки
   rc=0/PASS, после правки **rc=2/ОТКАЗ F10**. Независимая 3975 подтвердила на disposable
   harness (`10:56:50.475Z`): prerequisite manifest=A, target=B, CLI=B/B → ложный PASS rc=0;
   кандидат `23be8736aefc6e6b68455d735a9e3cbb5099f038` → ОТКАЗ F10, rc=2; A/A/A проходит;
   target mismatch, CLI mismatch, missing/invalid manifest fields, missing/invalid target
   fields и неверный путь — все отказывают rc=2 без traceback и **без печати identity**.
5. **Готовность пакета ≠ исполнение B/C.** `HANDOFF-LIVE.md` строка 27 (тик 15.09 21:28Z):
   «Это не выполнение B/C: build/land/verify/rollback остаются живой репетицией свежего
   Codex»; WEB-649 `2026-09-15T15:47:17.420Z` — «Это READY подготовки, не прохождение B/C».
6. Новое 15.09: попытка посадки **l115p** дала post-landing NO-GO и штатный откат
   (`HANDOFF-LIVE.md` строки 38–45, тик 21:15Z; WEB-635 `2026-09-15T21:18:29.795Z`).
   Машинный verify был зелёный, живая браузерная проба — нет (`/api/realtime/socket` HTTP 500,
   editor пуст); прод снова l115o. Тот же класс, что и корень WEB-652: **проверка, которая
   «прошла», не проверяла того, что обещала**.

## 5. KNOWN ISSUES / ТРАБЛШУТИНГ

Блока в теле **нет** (`knownissues=0`); сам дефект описан как «Что именно не так», а не
как KNOWN ISSUES с проверкой.

**KI-1. Проверка «прошла», не проверив того, что обещала.**
- Симптом: F10 отвечает PASS на чужую rollback-квитанцию, если ожидания взяты из CLI,
  а манифест указывает другую цель (`2026-09-15T10:33:01.964Z`).
- **Проверка за 2 минуты (read-only):** прогнать один сценарий на распакованном кандидате —
  манифест=A, target=B, CLI=B/B — и посмотреть код возврата. Ожидание: **rc=2 и ОТКАЗ F10**
  без traceback и без печати identity (`2026-09-15T10:56:50.475Z`). rc=0 ⇒ проверка
  декоративная.
- Причина: сравнение шло с дублирующими CLI-аргументами вместо `manifest.old`
  (`2026-09-15T10:44:04.896Z`).
- Лечение/статус: исправлено, независимо принято 3975 GO; **кандидат ещё не посажен**.
- Ссылки: `4130ENRICHBUSFACTOR-REPORT.md` §2.5 пункт 7 и §4 WEB-652.

**KI-2. Молча пропущенный класс тестов.**
- Симптом: в тесте эквивалентности сборочной цепочки зашит абсолютный путь к фикстуре
  из прежней рабочей среды, поэтому класс из трёх проверок **молча пропускается** и
  счётчик врёт (тело, пункт 5).
- **Проверка за 2 минуты (read-only):** прогнать
  `python3 -m unittest discover -s ops/line-factory/tests` на чистой распаковке и сравнить
  число прогонов и **пропусков** с ожидаемым: **132 прогона, 0 пропусков**
  (`2026-09-13T10:20:48.881Z`). Пропуски ≠ 0 либо прогонов 123 ⇒ фикстура снова вне пакета.
- Причина: фикстура лежала вне пакета; перенесена в `ops/line-factory/tests/fixtures/`,
  указатель стал относительным (там же).
- Лечение/статус: закрыто волной 3644; держать счётчик пропусков в приёмке.
- Ссылки: `4130ENRICHBUSFACTOR-REPORT.md` §1 (метод грепа) и §4 WEB-652.

## 6. ТОЧНЫЙ ОСТАТОК (граница владелец / исполнитель)

Тело приёмки не содержит остатка; он есть только комментарием `2026-09-15T10:56:50.475Z`,
дословно: «WEB-652 остаётся review до включения кандидата в линию и live-проверок
F5/F6/F8/F9 после посадки».

- **Включить кандидата `23be8736aefc6e6b68455d735a9e3cbb5099f038` в следующую линию** —
  **исполнитель** (WEB-641 `2026-09-15T13:05:49.045Z` пункт 3: «посадка принятых F10/WEB-652,
  rollback-gate/WEB-653 и F6/WEB-654 через чистую линию»).
- **Live-проверки F5/F6/F8/F9 после посадки** — **исполнитель**; post-QA этих исполняемых
  проверок — **исполнитель** (там же, пункт 4).
- **Проверка на живой линии с build/land/rollback** на мишени `safe_to_break`
  `127.0.0.1:55445` (учение `drill-target-3945`) — **исполнитель**, в рамках WEB-655.
- Регрессия-база для сверки после посадки: section-F 12/12, busfactor-kit 65/65, BF-06 17/17,
  BF-10 12/12, round-4 8/8; полный line-factory на prerequisite и кандидате одинаков —
  147 pass, 2 известных baseline fail, 3 skip, новых failures нет (`2026-09-15T10:56:50.475Z`).

## 7. ПЕРВЫЙ ШАГ НУЛЕВОГО АГЕНТА (без агентов)

Прочитать `2026-09-15T10:33:01.964Z`, затем `10:44:04.896Z` и `10:56:50.475Z` — только они
дают вердикт, тело его не несёт. Затем выполнить проверку KI-1 (один сценарий A/B/B на
распакованном кандидате). **Ничего не сажать и не закрывать:** `review`, кандидат принят,
но в линию не включён; production-проверка не выполнена.
2026-09-15T23:42:37.994Z · coordinator
L115Q-LANDING-20260915-WEB-652
[15.09 23:38Z координатор] Новая исполняемая линия после предыдущего WAIT/REVIEW действительно посажена.

- Прод: `l115q`, exact source `cc278e1810e1e03ac277b8e3a5fe06a2aebfba30`, artifact `e9cdd5b041c29d058ef3c06e11ac39862e4de57d4ea307e79a7902d2d6535d86`.
- Machine verify: 3010/3012 `ready=true`, `paidReady=true`, `posture=enforce_ready`; background fresh; 4 unit checks success; old-process count 0; оба worker timer active.
- Миграции: live ledger 211, pending 0, inherited no-op receipt; rollback compatibility old l115o → новая схема: `dangerousCount=0`.
- Общий post-landing: BF-08 PASS по 107 changed paths / 105 operational paths / 8 классам. Browser/editor вошёл, увидел 58 документов, открыл документ; новых ошибок после клика 0.
- Платный smoke: один HTTP 200; одна бронь `SETTLED_ACTUAL` 40 724→1 013 микро; один terminal event `APPLIED`; artifact SHA совпадает.
- Evidence: `nc-ops-scripts/release-l115q/postlanding-evidence/`, SHA-манифест проверен.

Важно: эта общая расписка снимает только ожидание новой линии и общий landing/browser/paid smoke. Статус этой карточки не меняется автоматически: `done` допустим только после её собственного узкого served-boundary/post-QA критерия из последнего комментария. Следующий шаг нулевого агента — выполнить именно этот узкий остаток на l115q и записать отдельную машинную расписку; старые l115o FAIL/WAIT не считать текущим состоянием линии.
2026-09-16T03:11:52.891Z · coordinator
COORD-POSTQA-20260916-WEB652-0307Z

4161 + независимая 4167 подтверждают: атака F10 из 3970 на exact l115q source archive честно отказывает rc=2; файл F10 побайтово совпадает с принятым кандидатом 23be8736. Но live F5/F6/F8/F9 не выполнялись: psql/crypto/секретные входы заменялись stubs/fixtures, containment — по ancestry receipt. По правилу «не закрывать без prod/readback» статус review пока сохраняю; доказанный F10 и live-остаток разделены явно. Evidence: /Users/poolpooly/waves-ds/4167/{REPORT.md,raw,SHA256SUMS,DONE}.
2026-09-16T05:31:23.010Z · coordinator
POSTQA-L115Q-4161-WEB652-PASS

Независимый DeepSeek Flash post-QA 4161 на exact `l115q` дал PASS.

- source `cc278e1810e1e03ac277b8e3a5fe06a2aebfba30`; candidate `f8a5b8b720326ea7290eed1953e06231cd6fbfc1` подтверждён ancestry receipt;
- exact атака 3970 теперь fail-closed с rc=2; обратное направление, F5/F6/F8/F9 и шесть regression suites прошли;
- source snapshot: 14 642 файла byte-identical;
- `SHA256SUMS` SHA-256 `a3544b7317b627f94989dc0d7723bec248754d036b240835aeb8510d195e407d`, readback всех записей PASS;
- report SHA-256 `788f0f2ec5638df840b1e6e3c22c1bab07c962bf16f9c83e8279c51ff65c7edb`.

Граница: containment использует доставленный ancestry receipt; F6/F8 проверены на disposable stubs, не на живой БД. Этого достаточно для заявленного served-boundary post-QA WEB-652; карточка переводится `review → done`. Прод, посадка и секреты не трогались.
Воркер
не проверен 4161:l115q-served-boundary-PASS M1 движение в панели: неизвестно
Подключиться и смотреть/перехватить руками. Колесо мыши листает; клавишами — Ctrl-b затем [, выход из прокрутки q. Отсоединиться — Ctrl-b затем d:
ssh -t poolpooly@192.168.1.74 "/opt/homebrew/bin/tmux attach -t 4161:l115q-served-boundary-PASS"
Прочитать историю панели без подключения — листается и ищется (/ поиск, q выход), воркеру не помешает:
ssh poolpooly@192.168.1.74 "/opt/homebrew/bin/tmux capture-pane -p -S -5000 -t 4161:l115q-served-boundary-PASS" | less -R
Обновлён
2026-09-16T05:31:23.012Z