WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-399 · Задача · — · web

[WEB370-A] Инвентарь Pi и карта состояния

Закрыт P1 · важно ведёт: — эпик: WEB-395
Суть
Источник: A1:/home/ubuntu/waves/WEB370PLAN2-REPORT.md. Зависимости: нет. Оценка: 1 инженерный день. ПЕРВЫЙ БЕЗОПАСНЫЙ ШАГ: только read-only инвентарь и evidence; без cutover, без platform-facing действий, без подключения production identities/secrets на A1.
Чем закрывается (приёмка)
Подписанный manifest path/owner/mode/sha256/arch/version/port/secret-name; известны writable paths; для каждого Telegram consumer записан webhook/polling mode; state→backup→restore owner mapped; iMessage явно M1-only/out of scope.
Доказательства
[2026-08-27 00:15Z] Диспатчнут на M1 (codex sol/high, read-only инвентарь по DoD WEB370-A).
[2026-08-26T23:19Z] WEB370-A read-only Pi inventory complete. Artifacts: /Users/poolpooly/WEB399-REPORT.md and /Users/poolpooly/web399-manifest.json. Manifest sha256=bc57fe247626cc0ef77224282ece197264244957676f041bedf796f6491bee78. Covered path/owner/mode/hash/arch/version/ports/secret-NAME locations, writable state, TG modes, and iMessage=M1-only/EXCLUDED. Review gates: restore owners UNASSIGNED and no verified backup->restore chains for WEB370 services; shared-pi services have unbounded writable surface; expected PG x3 plus extra out-of-scope blw-menu PG observed. Pi/A1 mutations=none; provider calls=none.
[2026-08-27 01:35Z] Инвентарь принят волной в review с находками: P0 backup/restore ownership отсутствует (закрывается WEB-400); P1 secrets 0644, deploy-pg-1 на 0.0.0.0:5433, fencing должен целить supervisor-юниты (не asterisk.service); P2 nginx *.bak долг, 4-й postgres вне скоупа. Манифест web399-manifest.json (sha в отчёте).
[2026-08-27 01:50Z] ДОКУМЕНТЫ (путь эволюции): манифест M1:/Users/poolpooly/web399-manifest.json (sha в отчёте); отчёт M1:/Users/poolpooly/WEB399-REPORT.md; копии на ноуте ~/waves-local/; родословная: WEB-395 эпик -> THREAD3MIG-REPORT.md (M1) -> нарезка A..O.
[2026-08-27 20:29:19Z tickacc5] ВЕРДИКТ: частично доказано
Что проверил: GET тикета; открыл WEB370PLAN2-REPORT.md; проверил наличие локальных /Users/poolpooly/WEB399-REPORT.md и /Users/poolpooly/web399-manifest.json; проверил на A1 /etc/web370/{ACTIVE,host-id}, /run/web370/lease/ACTIVE_HOST.lease и /var/lib/web370/lease/accepted-epoch.
Что увидел: WEB370PLAN2-REPORT.md является планом, не подписанным inventory manifest; M1/Pi файлы недоступны. На A1 host-id есть, ACTIVE, lease и accepted-epoch отсутствуют. Исходное evidence указывает UNASSIGNED restore owners и отсутствие проверенных backup→restore chains.
Отрицательный тест: поиск первичного manifest/report и текущих marker/lease не дал доступных файлов; прямой M1/Pi доступ недоступен.
Чего не хватает: первичные M1/Pi manifest/report с path/owner/mode/sha256/arch/version/port/secret-name; текущий inventory; назначенный restore owner и проверенная backup→restore chain.
[2026-08-27 22:03Z EVID399] ВЕРДИКТ: частично доказано
Что проверил: read-only probes A1; Pi SSH -p2046; M1 SSH; A1 systemd units/status, /etc/web370 markers, release/state/config/secrets metadata, ss listeners, PostgreSQL SELECT-only settings, gate14bk receipts/verify, current Restic snapshot restore в /tmp; GET live ticket.
Что увидел: Pi и M1 получили TCP timeout до SSH banner (rc=255), поэтому current Pi inventory/ports/secrets/modes не выдумываются. На A1 host-id PRESENT (644 root:root, sha256 0111f7554519f7126c570c154b894f1fbcddf4faa126f6d644b974dab6c77411), но ACTIVE, ACTIVE_HOST.lease и accepted-epoch ABSENT; expected /opt/nc-landing/releases/web370-a1 ABSENT. WEB370 units loaded but inactive/dead, conditions denied; WEB370 ports не слушаются. Staged web401c candidate и A1 state/secrets directories существуют, но это не accepted/active Pi-equivalent runtime.
Backup→restore: current A1 gate14bk base service failed rc=68 и verify failed rc=93; latest verify reports 3 unrestorable bases due missing WAL start segments. Свежий A1 Restic snapshot 5ed669ee... от 2026-08-27 03:02:49Z восстановлен только в /tmp: 20 objects, data manifest 12 files/419430400 bytes, sha256sum -c PASS. HETZBK full base+11 WAL→disposable target test PASS with four rows and pg_is_in_recovery=false, но это test contour, не Pi production chain.
Restore owners: для Pi noteclone/PostgreSQL, Signal, SIP/Asterisk, FreeSWITCH, Telegram, bookbot, gptbot live evidence оставляет UNASSIGNED; iMessage M1-only/EXCLUDED, named owner не предъявлен. Для A1 test contours виден executor ubuntu/systemd, accountable production owner не назначен.
Отрицательный тест: отсутствие ACTIVE действительно даёт ConditionResult=no и сервисы не стартуют; base/WAL verify отрицателен по трём bases; Pi/M1 reachability отрицательна timeout.
Чего не хватает: current read-only Pi/M1 primary manifest/report; current Telegram webhook/polling modes; production Pi backup→restore receipt; restore owners; A1 ACTIVE/lease/accepted epoch. Полный evidence: /home/ubuntu/waves/EVID399-REPORT.md. Статус оставлен in_progress.

## 2026-08-28 ~12:40Z — карта НЕ принята, снята недостающая связь процесс↔служба (координатор Фабл)
ACC399B = NO-GO. Причины: (1) прямое противоречие снимку — карта утверждала, что `nginx.service` не входит в enabled-list, тогда как он **enabled и active**; (2) недоказанная принадлежность Asterisk к unit — в снимке не было PPID/cgroup/command-line связи; (3) неполная классификация полного инвентаря.
Пробел (2) был по вине координатора. Снята карта `pi-proc-map.md`: pid → PPID → команда → служба (через `/proc/*/cgroup`) + владельцы портов.
ДОКАЗАНО ТЕПЕРЬ:
- 5060 → pid 871150 → **`ag-sip-native.service`** (базовый SIP); 4080 и 4573 → pid 871353; 4084 → pid 871376 — та же служба.
- 5076 → pid 2310433 → **`ag-sip-native-opus-live-experimental.service`** — ТРЕТЬЕ имя. Отдельно существует `ag-sip-native-opus-experimental.service` со своими процессами (bash 2304235, asterisk 2304325, node 2304489/2304516), но порт 5076 принадлежит НЕ ей. То есть одна из опытных веток, вероятно, работает вхолостую и держит память. Нужен ответ владельца, зачем заведены обе.
- 3010 → pid 340267 → `note-clone-3010.service`.
- `hetzbk-wal-stream.service`: bash 2573533 + **`pg_receivewal` 2573539** — поток архива WAL реально работает (важно для WEB-082: не хватает не потока, а доказанного восстановления).
- `myapp.service` — `uvicorn` pid 1142, принадлежность (наше/чужое) определяет волна.
ДЕЙСТВИЕ: волна `web399c` исправляет карту на доказанных данных; правило — ни одного утверждения без ссылки на строку в `pi-inventory-full.md` или `pi-proc-map.md`.


## 2026-08-28 — ПОЛНЫЙ СЛЕД ДЛЯ ПОДХВАТА (координатор Фабл)
Чтобы новый агент не играл в детектива: ниже вся эволюция, где лежат отчёты и что делать дальше.

**Линия:** инвентарь и карта состояния малинки для переезда (WEB-370-A).
**Эволюция:**
1. `web399` — карта на ОБРЕЗАННОМ снимке (моя ошибка: `head -40` срезал `note-clone-3010.service` и `telegram-call-native.service`). Волна честно пометила пункты как недоказанные. Отчёт: `A1:/home/ubuntu/waves/WEB399-REPORT.md`.
2. Координатор снял ПОЛНЫЙ снимок: `A1:/home/ubuntu/waves/pi-inventory-full.md` (483 строки, значения env намеренно не запрашивались, секретов 0).
3. `web399b` → `ACC399B` = **NO-GO**: ошибка факта про `nginx.service` (он enabled+active) и недоказанная привязка Asterisk к unit. Отчёты: `A1:/home/ubuntu/waves/WEB399B-REPORT.md`, `A1:/home/ubuntu/waves/ACC399B-REPORT.md`.
4. Координатор снял недостающую связь: `A1:/home/ubuntu/waves/pi-proc-map.md` — pid → PPID → команда → служба через `/proc/*/cgroup` + владельцы портов.
   **Доказано:** 5060 → pid 871150 → `ag-sip-native.service`; 4080/4573 → 871353; 4084 → 871376; 3010 → 340267 → `note-clone-3010.service`; 5076 → pid 2310433 → **`ag-sip-native-opus-live-experimental.service`** (ТРЕТЬЕ имя — отдельно существует `ag-sip-native-opus-experimental.service` со своими процессами, но 5076 не её). `hetzbk-wal-stream` = bash 2573533 + `pg_receivewal` 2573539.
5. `web399c` → `ACC399C` = **NO-GO**. Отчёты: `A1:/home/ubuntu/waves/WEB399C-REPORT.md`, `A1:/home/ubuntu/waves/ACC399C-REPORT.md`.
6. `web399d` — **идёт сейчас**. Третий круг → изменена ФОРМА: карта строится таблицей, где каждая строка обязана иметь колонку «источник» со ссылкой `файл:строка`. Факт без источника уходит в раздел «нужно снять», а не в карту.
**Решение владельца 28.08:** три SIP-ветки пока не трогаем, только описываем.
**Дальше:** `web399d` → `acc399d` → на карте строятся WEB-401/402/403.

[28.08 ~12:10Z Фабл] Третий круг сдан: **WEB399D-REPORT.md** (65 КБ) — карта переписана таблицей, каждая строка с колонкой «источник» файл:строка; все 8 замечаний ACC399C закрыты построчно (86 служб по одной строке, все контейнеры I:426–460, все 15 timer pairs I:469–483, unknown отделён от доказанного). SIP: команд stop/start/cutover в карте нет (запрет владельца соблюдён). Заряжена приёмка **acc399d** (очередь 255): сверка ≥30 строк с источниками, поиск пропущенных объектов снимка, проверка честности раздела «нужно снять». Отчёты: A1:/home/ubuntu/waves/WEB399D-REPORT.md, pi-inventory-full.md, pi-proc-map.md, будет ACC399D-REPORT.md.

[28.08 ~13:35Z Фабл] ACC399D = **NO-GO** (4 блокера): карта оставляла только «относящиеся» слушатели вместо ВСЕХ портов; источники подтверждали имя unit, но не утверждение о границе («не application scope»); nginx worker PID 3 из 4 без ссылок; «нет в enabled-списке» без ссылки на полный список. Приёмщик сверил 39 строк с источниками. Это ПЯТЫЙ круг одного узла → по правилу третьей находки УСТРОЙСТВО ИЗМЕНЕНО: заряжен **web399e** (очередь 258) — карта в два слоя: скелет порождается КОМАНДАМИ из снимка (полнота по построению, гейт wc -l), классификация поверх — либо источник, доказывающий именно границу, либо честное «не выводится из снимка → решение владельца». Отчёты: ACC399D-REPORT.md, будет WEB399E-REPORT.md.

[28.08 14:30Z Фабл] Круг 5 сдан: WEB399E-REPORT.md (207 КБ) — двухслойное устройство исполнено: скелет порождён командами (§2.6: enabled units 86, containers 35, timers 15 — числа из awk|wc, не руками), классификация поверх. Заряжена приёмка acc399e (очередь 260): воспроизведение команд скелета, равенство скелет=карта, ≥30 строк классификации на доказательство ИМЕННО границы. Связка с эпиком: карта = основание досъёмов WEB-282 (почта, мессенджеры), не только тумблера. Будет ACC399E-REPORT.md.

[28.08 15:40Z Фабл] **ACC399E = GO — карта ПРИНЯТА с пятого круга.** Приёмщик независимо воспроизвёл команды скелета и сверил числа; evidence-complete, неизвестный scope выделен явно. Формула вердикта: карта годна как read-only baseline и основание планирования тумблера/досъёмов WEB-282 (почта, мессенджеры); НЕ разрешение на cutover до досъёмов и решения владельца. Эволюция закрыта: 399 → 399b/c (NO-GO, факты без опоры) → 399d (NO-GO, полнота/границы) → **399e GO** (двухслойное устройство: скелет командами + классификация с источником границы). Владельцу доложено. Отчёты: WEB399E-REPORT.md (207 КБ), ACC399E-REPORT.md.

[29.08 ЗАКРЫТ] Инвентарь Pi и карта состояния приняты (ACC399E GO, двухслойное устройство: скелет командами + классификация с источником границы). Это read-only baseline и основание планирования тумблера, НЕ разрешение на переключение — cutover остаётся за досъёмами WEB-282 (почта, мессенджеры) и решением владельца. Кода тикет не несёт, посадки не требует, поэтому закрывается без ожидания линии.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-399","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-29T10:03:25.075Z