docs: список остатков и приёмочный лист СМС ложатся в историю

Оба файла жили только на диске - ровно тот риск, о котором сам список
и предупреждает. Кладём в историю.

Список остатков дополнен итогами вечера 01.08:
- мина статанализа закрыта, разбор оказался шире вчерашнего диагноза;
- галочки 5.5 и Н.4 проставлены;
- 62 обломка сорвавшихся команд убраны из корня;
- копии веток владелец решил не делать, риск остаётся;
- найден новый хвост: db/schema.sql отстал от миграций примерно на
  28 столбцов и 3 таблицы. Дрейф признан в шапке самого файла, прод от
  него не падает - он собирается миграциями. Проверено по живой базе,
  а не по именам миграций: имя add_contacts_and_legal_name_to_* не равно
  именам столбцов, слабый датчик тут врёт в обе стороны;
- числа долга документации пересчитаны: 73 файла, 813 разметки,
  43 орфографии - прежние 192/282/14 были по другому охвату.

В правила добавлена граблина про метку BOM. Она обоюдоострая: в файле
настроек убивает статанализ молча, а в своём скрипте .ps1 с русскими
буквами наоборот обязана быть, иначе powershell -File читает его как
ANSI и падает на разборе.

Живых номеров в обоих файлах нет - проверено, все синтетические.

Сторож секретов запись сначала ОСТАНОВИЛ, и правильно: приёмочные листы
лежат не в подпапке, а прямо в docs/superpowers/, поэтому под прежние
разрешения для plans/specs/audits/runbooks не подпадали. Разрешение
дописано узко, по имени PRIEMKA, с перечислением всех четырёх найденных
номеров прямо в комментарии - 79995550123, 79995550001, 79995551234,
79995562002, все из тестового диапазона проекта.

Узость проверена вырезанием: настоящий с виду номер, подложенный в
СОСЕДНИЙ файл той же папки, ловится по-прежнему. Первая проба провалилась
и это тоже урок: я взял номер с хвостом 1234567, а он давно разрешён как
тестовый - подложка должна не попадать ни под одно прежнее разрешение,
иначе "не поймал" означает только, что плохо выбрана подложка.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-08-01 17:16:06 +03:00
parent 64fdf5f424
commit 868a681cfe
3 changed files with 4262 additions and 0 deletions
+6
View File
@@ -153,6 +153,12 @@ paths = [
# Internal design specs — внутренние проектные доки с демо-данными (демо-телефоны
# в примерах, напр. spec про log-PII-scrubbing), не реальные ПДн. Как plans/audits.
'''docs/superpowers/specs/.*\.md''',
# Приёмочные листы (PRIEMKA) лежат не в подпапке, а прямо в docs/superpowers/,
# поэтому под разрешения выше не подпадали. Содержат те же синтетические номера
# 7999… из живых прогонов рассылки. Проверено поимённо 01.08.2026: 79995550123,
# 79995550001, 79995551234, 79995562002 — все из тестового диапазона проекта,
# живых номеров в файле нет. Та же категория, что plans/specs/audits/runbooks.
'''docs/superpowers/.*-PRIEMKA-.*\.md''',
# Файл-образец, который клиент скачивает перед загрузкой своего списка номеров.
# Номера синтетические — 79001234567, 79161112233, 79995551234 и т.п. На main он
# уже разрешён по коммиту 5a4c0e02, но при сведении ветки тот же текст приходит
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,186 @@
# ПРОМТ следующей смене — сначала покажи владельцу список, потом работай
**Дата составления:** 01.08.2026, вечер. Составлен сменой, оживившей сторожей текста и
починившей статанализ.
🔵🔵 **ВЛАДЕЛЕЦ СКАЗАЛ: первым делом НЕ начинай чинить. Составь и покажи список того, что
осталось — коротко, человеческим языком, у каждого пункта цена и риск, — и ЖДИ, что он
выберет.** Список ниже готов, но не вываливай его как есть: перескажи своими словами, проверив
числа командой. Числа в этом файле — снимок на вечер 01.08, они устаревают.
---
## 0. Где мы сейчас (проверить командой, не верить на слово)
- **Главная рабочая папка** `c:\моя\проекты\портал crm\Документация`, ветка
**`feat/prospects-manual-testing-kp`**, вершина на момент составления `97517575`.
Отстаёт от `main` на 1 коммит. **Удалённой копии у ветки нет.**
- 🔴 **В этой же папке параллельно работает другая смена.** Коммит `97517575` сделан ею через
минуту после моего. Значит: перед любой правкой перечитывай `git log` и `git status`, не
коммить `-A`, перечисляй пути поимённо, и не удивляйся чужим подготовленным к записи файлам.
- **Рабочая папка ветки СМС** `.claude/worktrees/client-sms`, ветка
**`feat/client-sms-broadcast`**, вершина `19d9eda3`, отстаёт от `main` на **185 коммитов**,
удалённой копии нет.
- Своя тестовая база ветки СМС — `liderra_testing_sms`. Гонять:
`DB_DATABASE=liderra_testing_sms php artisan test <путь>`. На общую `liderra_testing`
не возвращаться — в неё пишут чужие рабочие папки.
### Дописано вечером 01.08 — что сделано после составления списка
-**Мина «статанализ падает молча» закрыта** — коммит `821f9660`. Разбор оказался шире:
вчерашний диагноз был **неполон, а способ его доказательства неверен**. Убивают молча ЧЕТЫРЕ
вещи, а не одна: нет файла из `scanFiles`; **метка BOM в `phpstan.neon`** (её ставит
`Set-Content -Encoding utf8` — то есть любой, кто правит настройку скриптом); подсказчик,
собранный без ключа `-M`; подсказчик, просто устаревший. Вчера временную настройку записали
с меткой и молчание списали на пропавший файл — вывод совпал случайно.
Поставлен сторож `tools/storozh-statanaliza.mjs` (13 тестов, писались до него), встроен в
`composer stan` и в хук перед larastan. Доказан вырезанием на всех четырёх поломках.
-**Галочки 5.5 и Н.4 проставлены.**
-**62 обломка сорвавшихся команд убраны** из корня (перенесены, не удалены).
-**Копии веток владелец делать не стал** — риск «всё живёт на одном диске» остаётся в силе.
- 🆕 **Найден новый хвост: `db/schema.sql` отстал от миграций.** Порядка **28 столбцов и
3 таблиц** есть в живой базе и в миграциях, но нет в каноне схемы (проверено выборочно по
живой базе: `ad_campaigns.shows_until/revived_at/banners_approved_at/yandex_creative_id/
landing_url`, `client_tg_campaigns.mts_campaign_id/moderator_file_path/status_reason`,
`saas_transactions.credit_target`, таблицы `sales_prospect_notes`, `personal_access_tokens`).
Дрейф **известен и признан в самой шапке файла** («отдельный canon-sync закроет весь бэклог
разом») — то есть это не открытие, а невыполненная работа. Прод от этого не падает: он
собирается миграциями. Страдают те, кто читает канон, — в том числе проверка разграничения
доступа. 🪤 Считать дрейф по ИМЕНАМ миграций нельзя: имя `add_contacts_and_legal_name_to_*`
не равно именам столбцов. Мерить по живой базе.
### Что закрыто 01.08 и переделывать не надо
- **Сторожа текста живы**: `markdownlint`, `cspell`, `stylelint` запускаются и доказаны
вырезанием. Причина смерти — оборванная установка пакетов, а НЕ «ставит десятую часть»;
вылечено `npm ci --ignore-scripts`. Правок в git нет, только папка `node_modules`.
- **Статанализ в главной папке даёт НОЛЬ** замечаний (было 42). Коммит `de144776`.
- **Сторож наблюдателя** больше не врёт про пропавший `post-commit`. Коммит `8f004496`.
- 🔑 **`LEFTHOOK_EXCLUDE` больше не нужен.** Если возникнет соблазн что-то исключить —
сперва замерь, было ли это до тебя, и скажи вслух. Три смены подряд исключали вслепую.
---
## 1. ПЕРВОЕ ДЕЙСТВИЕ
Перепроверь числа, составь список и покажи владельцу. Ничего не чини, пока он не выберет.
Формат — как он любит: простым языком, без программистских слов, коротко, с ценой каждого
пункта. Обязательно раздели: **что мешает работе сейчас** и **что просто ждёт**.
---
## 2. ЧТО ОСТАЛОСЬ (каталог для тебя, не для владельца дословно)
### А. Свести ветку СМС с main — 185 коммитов позади
Самое крупное и самое рискованное. Чем дольше ждёт, тем хуже.
🪤 При сведении столкнутся номера записей журнала схемы: наша — **v9.32**, взята с запасом
именно поэтому. **Обе стороны столкновения — настоящие записи, сторону выбирать нельзя,
надо разносить по номерам.** Так уже делали 01.08, см. память.
Побочная польза: ветка получит починку статанализа (у неё сейчас 773 замечания против нуля
в главной) и слово «досыл» в словаре, которого ей не хватает.
### Б. Полный прогон всех тестов ветки СМС
Не делали ни разу — мерили только область СМС и рекламу. Стенд починен коммитом `dc56c95e`,
так что прогон теперь осмыслен. Гонять в своей базе ветки.
### В. Проверка разграничения доступа по миграциям ветки СМС
В приёмке Этапа 5 её не звали. Есть отдельный помощник `rls-reviewer`.
### Г. ✅ ЗАКРЫТО вечером 01.08 — см. блок выше
### Д. Обработчик наблюдателя не подключён
`observer-coverage-checker` честно пишет: `observer-stop-hook NOT registered in
.claude/settings.json`. Это правда — я проверил, в настройках его нет вовсе. Сторож
предупреждает, но коммит не блокирует. Решение владельца: нужен ли наблюдатель вообще,
раз управляющий слой вынесен в отдельный репозиторий.
### Е. `l1-watcher` красный по делу
Плагин `ruflo-core` включён в настройках, но не оформлен в реестре инструментов.
Блокирует только коммиты, трогающие сами настройки или реестр. Оформлять — **только** через
`claude-md-management`, либо добавить алиас в `tools/.l1-watcher-aliases.txt`.
### Ж. Долг документации, накопленный пока сторожа молчали
Пересчитано вечером 01.08, прежние числа (192/282/14) были по другому охвату. По-настоящему:
**73** изменённых и новых файла `.md`, в них **813** находок разметки и **43** орфографии
(орфография — всего в 3 файлах, остальные папки сторож не смотрит по своим настройкам).
Из разметки руками надо примерно **57** — сбитые таблицы (MD056), остальное машина чинит сама.
Разметка почти вся из тех, что машина чинит сама, — коммит она не остановит. Орфография — 126
разных слов, в основном законные слова дела, им место в `cspell-words.txt`.
🔑 Большинство этих файлов — новые рабочие записки, **ещё не в git**. То есть долг не мешает
обычной работе: сторожа проверяют только то, что кладут в коммит.
### З. ✅ ЗАКРЫТО вечером 01.08 — галочки 5.5 и Н.4 проставлены
### И. 🔴 Висящий риск, не техническая задача
**Ветка СМС живёт только на этой машине**, удалённой копии нет, своих коммитов больше семидесяти.
Приёмочный лист тоже не в git. У ветки `feat/prospects-manual-testing-kp` удалённой копии
тоже нет. Отказ диска — потеря всего. Сказать владельцу прямо.
### К. Сторона владельца, не наша
- Письмо в поддержку МТС (`supmarketolog@mts.ru`): канал не отправляет; заодно попросить
образец письма-отчёта о доставке.
- Договорная цена в боевые настройки (`SMS_MTS_PRICE_KOP`).
- 🔴 **Выкат СМС-модуля бессмысленен, пока канал МТС на бою не отправляет:** рассылки будут
создаваться и оплачиваться, а до людей не дойдёт ничего.
---
## 3. ОБЩИЕ ПРАВИЛА
- 🔑 **Сначала замер, потом лечение, потом замер снова.** Числа записывать.
- 🔑 **Хук остановил — сперва проверь, было ли это ДО тебя:** спрятать свои правки
(`git stash push -- <пути>`), прогнать, вернуть, сравнить.
- 🔑 **Приёмка вырезанием обязательна.** Зелёный прогон без вырезания — не доказательство.
- 🪤 **Не принимай на веру диагноз из промта — повтори замер у себя.** 01.08 промт называл
корнем подмену моделей подсказчиком: в ветке это было правдой, в главной папке — нет,
и одинаковый код давал **1865 и 42** замечания в двух папках. Лечение оказалось другим.
- 🪤 **Одна точка замера не задаёт правило.** Запись «npm ставит десятую часть» родилась из
одного наблюдения, пережила смену и увела следующую не туда.
- 🪤 **Печать пути — не доказательство, что файл на месте.** Проверять содержимым, размером
или хешем.
- 🪤 `phpstan` на одном файле печатает пусто при коде возврата 1 — добавлять
`--error-format=json -v`, иначе решишь, что ошибок нет.
- 🪤 Вывод `phpstan` в этой среде **обрезается** до сводки; полный отчёт — с ключом `-v`.
Надёжные признаки — **код возврата и размер вывода в байтах**, а не сам текст.
- 🪤 **Метка BOM в Windows PowerShell 5.1 — обоюдоострая.** `Set-Content -Encoding utf8`
ставит её всегда: в `phpstan.neon` она убивает статанализ молча, а вот скрипт `.ps1`
с русскими буквами **без неё** не читается вовсе (`powershell -File` берёт его как ANSI).
Правило: файлы настроек писать `[System.IO.File]::WriteAllText(путь, текст,
(New-Object System.Text.UTF8Encoding($false)))`, а свои `.ps1`с `$true`.
---
## 4. ЦЕРЕМОНИЯ КОММИТА
- Коммит делает смена сама, **попросив эскейп**: вызвать `AskUserQuestion`, где **метка опции —
ТОЧНАЯ команда git**.
- Сообщение держать **в файле**, звать `git commit -F <файл> <конкретные пути>`.
Для новых файлов нужен `git add`.
- В командной строке **не должно быть круглых скобок**.
- Коммитить **перечисленные пути**, не `-A`. `docs/observer/STATUS.md` не пре-стейджить.
🔴 Особенно важно теперь, когда в папке работает вторая смена: у неё бывают свои
подготовленные к записи файлы, и `-A` заберёт их себе.
- 🪤 После коммита хуки иногда оставляют `docs/observer/.pii-counters.json` и
`docs/observer/episodes-*.jsonl` со следами столкновения. **Обе стороны там настоящие,
надо склеивать обе, а не выбирать.**
---
## 5. ЧЕГО КАСАТЬСЯ НЕЛЬЗЯ
- 🔴🔴 **Боевой liderra.ru** — любое действие только с разрешения владельца, база по умолчанию
только чтение.
- Не пушить ветки и не вливать в `main` без отдельного разрешения.
- Не понижать уровень проверки статанализа и не заметать замечания в `phpstan-baseline.neon`:
01.08 оттуда как раз убрали 672 записи из 936, все — один ложный класс со счётчиками.
- Не расширять правило `ignoreErrors` в `app/phpstan.neon`. Оно намеренно узкое: ровно три
формулировки, ровно про `Pest\PendingCalls\TestCall`, ровно в `tests/`. Узость доказана
вырезанием — подложенные настоящие поломки ловятся.