docs,обзвон: приговор по кругу З-2.3 — вырезание нашло ложный отчёт о стирании

Своя ошибка названа первой и она шестая за смену. Я разрешил помощнику построить
ручку приёма и назвал папку, куда её класть. Класть было некуда: файла маршрутов
в проекте не существует вовсе. Класс тот же, что у пяти предыдущих: утверждение о
коде без замера. Я перемерил пять утверждений плана и не перемерил своё
собственное. Побочная цена: у построенного ноль зовущих в бою, дорогу кладут
задачи волны 4.

Резал двумя своими ножами, не теми, какими резал помощник. Первый снял вторую
половину замка изоляции — покраснела ровно проверка, что клиент А не может
открыть материал клиента Б, держа строку в руках. Второй сломал умолчание срока
звука — покраснели две проверки умолчания. Второй нож выбран нарочно: ровно этим
классом нас укусило в прошлом кругу, и урок оказался усвоен. Оба возврата
доказаны слепком знак в знак.

Вырезание второго рода дало улов крупнее задачи, третий раз подряд. Допущение
защиты было: стирание по требованию человека — дело будущей задачи. Замер
показал, что стирание уже существует, проходит три таблицы и ставит обращению
человека отметку «выполнено». Нашего нового склада в том списке нет. Значит
человек требует стереть свои данные, портал отчитывается «выполнено», а голос
этого человека остаётся лежать: звук месяц, расшифровка полгода. Это не
недоделка, а ложный отчёт, причём машинный. Бьёт по самым уязвимым: в складе
лежат голоса людей, которые согласия нам не давали вовсе.

Честная граница находки: вред заряжен, но ещё не случился — ничего не выкачено,
склада на боевом нет. Этим случай отличается от записей разговоров Лены, где вред
уже случился.

Врезка вписана в задачу З-2.5, её вес меняется: она обязана закрыться до первого
живого обзвона. Врезка ПОСТРОЕНО вписана в З-2.3 с шестью расхождениями. Датчик
бумаг сходится: девять отметок при девяти закрытых задачах.
This commit is contained in:
Дмитрий
2026-08-05 20:53:58 +03:00
parent efd08a82e8
commit 80d4fa2cfa
2 changed files with 179 additions and 1 deletions
@@ -1477,6 +1477,40 @@ Asterisk и читает свой файл. Общий файл остаётся
### З-2.3. Материалы клиента на входе: приём, изоляция, срок, надпись
> ✅ **ПОСТРОЕНО 05.08.2026** — коммит `2b401298d`. Приговор:
> [priyomka/stroyka-1/z-2-3-materialy-klienta-2026-08-05.md](../priyomka/stroyka-1/z-2-3-materialy-klienta-2026-08-05.md).
> **Третий заход в узкое горло схемы**, счётчик таблиц канона 42→43.
>
> 🔴 **Разведка перед круго́м разошлась с текстом задачи ниже в пяти местах —
> верны замеры, а не текст:**
>
> 1. **«То же хранилище, что и звук обзвона» — такого хранилища не было.** Звук
> переезжает в портал задачей З-2.1, а она не построена. ⇒ хранилище завёл
> **этот** круг, узко, только под материалы клиента.
> 2. **Канон схемы разбит надвое с 02.08.** Таблица описана в
> `db/schema_modules.sql`, а не в `db/schema.sql`, — там таблиц обзвона нет ни
> одной.
> 3. **Проверка «убрать старый отказ „меньше пяти“» беспредметна:** такого отказа
> в коде нет вовсе, снимать было нечего.
> 4. **Журнал ПДн есть, зовётся иначе**`pd_processing_log`, пишем готовым
> `PdAuditLogger`. Своего не заводили.
> 5. **Хозяин стирания — З-2.2, и она не построена.** ⇒ даты истечения
> проставляются, а стирать их пока **некому**.
>
> 🔴 **Шестое расхождение — моё собственное, не плана.** Я разрешил построить
> ручку приёма, а класть её некуда: файла маршрутов `app/routes/api.php` в
> проекте **не существует**. ⇒ **у построенного ноль зовущих в бою:** приём
> работает и проверен, но дороги к нему нет — её кладут задачи волны 4.
>
> 🔴 **Изоляция чужого голоса — ДВЕ половины замка, и обе нужны.** Защита по
> строкам стережёт **строку**, а путь к файлу — обычный текст, база про файлы не
> знает. Вторая половина — явная сверка клиента при открытии: на разработке
> портал ходит правами, которые защиту по строкам обходят.
>
> 🔴 **Найдено вырезанием второго рода — улов крупнее задачи:** стирание по
> требованию человека **уже работает** и уже ставит «выполнено», не тронув наш
> новый склад. **См. врезку в З-2.5** — её вес из-за этого меняется.
**Что делать.** Клиент отдаёт записи своих холодных разговоров. Их надо принять,
положить в то же защищённое хранилище, что и звук обзвона, **изолировать между
клиентами** и удалить через 30 дней.
@@ -1624,6 +1658,31 @@ Asterisk и читает свой файл. Общий файл остаётся
Это не мелочь и не «доделаем потом»: именно на этом строится претензия.
> 🔴🔴 **ЗАМЕР 05.08.2026 — беда ТЯЖЕЛЕЕ, чем описано выше.** Найдено вырезанием
> второго рода при приёмке круга З-2.3
> ([приговор](../priyomka/stroyka-1/z-2-3-materialy-klienta-2026-08-05.md), §6.5).
>
> Дело не только в том, что стирание «не знает» про звук. Замерено: служба
> `app/app/Services/Pd/PdErasureService.php` проходит `users`, `supplier_leads`,
> `deals` — и по окончании ставит обращению человека **`status = 'completed'`**.
>
> ⇒ Человек требует стереть его данные, портал отмечает **«выполнено»**, а голос
> этого человека остаётся лежать: звук месяц, расшифровка полгода. **Это не
> недоделка, а ложный отчёт** — и отчёт машинный, то есть он не забыт, а
> утверждает обратное.
>
> 🔑 **Бьёт по самым уязвимым:** в складе материалов клиента (З-2.3, построена
> 05.08) лежат голоса людей, которые согласия нам не давали вовсе — они
> собеседники клиента, не наши. Именно они и приходят с требованием «сотрите
> меня».
>
> ⚠️ **Честная граница: вред ЗАРЯЖЕН, но ещё НЕ СЛУЧИЛСЯ** — ничего не выкачено,
> склада на боевом нет. Тем этот случай отличается от записей разговоров Лены
> (З-0.2), где вред уже случился.
>
> ⇒ 🔴 **Эта задача обязана быть закрыта ДО первого живого обзвона**, а не «когда
> дойдёт очередь волны 2».
**И вторая половина той же беды:** звук живёт **месяц** (Т70), а обращение
человека может прийти **через два**. К тому времени у нас не будет ни записи, ни
доказательства, что она была и стёрта по сроку, — только пустое место, которое от
@@ -18,7 +18,11 @@
| вершина на входе круга | `1fd0170de` | `git rev-parse --short HEAD` |
| чужое несведённое в индексе | **0** | `git ls-files -u` |
| сторожа текста живы | **да**`markdownlint-cli2 v0.22.1`, `cspell 10.0.0` | запуск самих проверялок, не счёт папок |
| прогон сервера | запущен на входе круга, своя база `liderra_testing_obzvon` | `php artisan test`, без трубы |
| прогон сервера на входе круга | **4930 проверок, 4926 зелёных, 4 пропущено, 15 435 утверждений, красных 0**, код возврата 0, 19 мин 27 с | `php artisan test` из `app`, своя база `liderra_testing_obzvon`, **без трубы** |
🔑 **Число совпало знак в знак с замером конца прошлого круга** — 4930/4926/4. Это
и есть доказательство, что за три чужих и три моих коммита в коде не изменилось
ничего: сверка чисел прогона надёжнее, чем чтение списка изменённых файлов.
🪤 **Вершина уехала под ногами ещё до начала круга:** после моего `2da472164`
легла чужая смена `1fd0170de` — приёмка Яндекса. Замерено: **кода не касается**,
@@ -128,3 +132,118 @@
вырезание второго рода, и только затем сам приговор.
---
## 6. ПРИГОВОР
### 6.1. 🔴🔴 СВОЯ ОШИБКА — ШЕСТАЯ ЗА СМЕНУ, И ОНА В САМОМ ЗАДАНИИ
Я разрешил помощнику построить ручку приёма и назвал папку, куда её класть.
**Класть было некуда:** файла маршрутов `app/routes/api.php` в проекте
**не существует вовсе** — есть только `console.php` и `web.php`. Перемерил сам:
возражение помощника верно.
Класс тот же, что и все предыдущие пять: **утверждение о коде без замера.**
Я перемерил пять утверждений плана и не перемерил **своё собственное**.
🔑 **Правило из этого:** разведка перед заданием обязана покрывать не только то,
что утверждает план, но и то, что дописал от себя надзиратель. Своё утверждение
проверять труднее — оно не выглядит чужим и не вызывает подозрения.
**Побочная цена, говорю сам:** из-за этого у построенного **ноль зовущих в бою**.
Приём материалов работает и проверен, но человек им пока воспользоваться
не может — дороги к нему нет. Это не поломка, а порядок стройки: дорогу кладут
задачи волны 4. Но назвать это вслух обязан я, а не владелец.
### 6.2. Возражения помощника — пять, проверил каждое
| # | возражение | мой замер | исход |
|---|---|---|---|
| 1 | ручку класть некуда: `app/routes/api.php` нет | `ls app/routes/` → только `console.php` и `web.php` | ✅ **верно**, см. 6.1 |
| 2 | защита по строкам стережёт **строку, а не голос**: путь к файлу — обычный текст, база про файлы не знает | верно по устройству | ✅ **верно**, и он достроил вторую половину замка сверх задания |
| 3 | моя мерка изоляции — половина мерки: запрос в базу доказывает «не видит», но не «не может открыть» | ✅ **верно** — и это моя же оплошность в приёмочном листе | принято |
| 4 | мой довод про сторожа служебной роли верен наполовину | согласен: «ноль до лечения» дыру доказывает, а запуск файла на боевом — нет | принято |
| 5 | проверка «удаляются на 31-й день» не проверяется ничем: стирает З-2.2 | так и есть | принято, изображать не даю |
🔑 **Пять из пяти по существу, ложных ноль.** Но напоминаю себе прошлый круг: там
из пяти возражений **одно было ложным**, и отличить его удалось только замером.
Проверять надо каждое, а не доверять счёту.
### 6.3. Свои находки — то, чего помощник не называл
- **Мусор в дереве.** Помощник оставил три пустых файла-обломка от неудачных
команд оболочки. Снёс, снос проверил командой. Мелочь, но метод требует
убирать за собой;
- **Чужое в указателе не тронуто:** `docs/observer/STATUS.md` и чужой промт как
лежали застейдженными, так и лежат — поимённый коммит их не забрал ни разу;
- **Точка отсчёта сошлась знак в знак** с концом прошлого круга — 4930/4926/4.
Значит за шесть коммитов между кругами код не менялся.
### 6.4. Четыре мерки — своей рукой
**1. Сторож показан красным — ДВУМЯ СВОИМИ НОЖАМИ, не теми, какими резал
помощник.**
| нож | что резал | что вышло |
|---|---|---|
| **1** | снял вторую половину замка изоляции — явную сверку клиента в `otkryt()` | 🔴 **1 из 24 красная**, код возврата 1. Покраснела ровно та: «клиент А не может **ОТКРЫТЬ** материал клиента Б, даже держа строку в руках» |
| **2** | сломал **умолчание** срока звука: 30 дней → 180 | 🔴 **2 из 24 красные**, код возврата 1. Покраснели «решение владельца: звук 30 дней, текст шесть месяцев» и «негодное значение настройки не принимается всерьёз». Дата уехала с 04.09.2026 на 01.02.2027 |
🔑 **Второй нож был выбран нарочно:** ровно этим классом — «сторож всюду задаёт
значение явно и умолчание не проверяет вовсе» — нас укусило в прошлом кругу.
**Урок усвоен:** здесь умолчание под охраной.
**Возврат доказан слепком, оба раза:** `git hash-object` до надрезов и после
возвратов — `cd70ab8b4efee4107be2327908c8b7423e7d1a10` знак в знак, дерево по
коду чисто.
**2. Полный прогон своей рукой** — числа ниже, в 6.6.
**3. Две строки про соседей:**
- «моего имени нет ни в одном выводе ни одного сторожа»;
- «чужие файлы в дереве не тронуты» — с одной честной оговоркой: тронут общий
`SchemaDeltaTest`, счётчик таблиц канона 42→43. Это не самовольство: ровно так
же его трогали закрытые круги З-1.1 и З-1.3, у которых тоже была новая таблица.
**4. Зовущие поимённо — глазами, не числом.** Замерил сам: у новой службы и
модели **ноль зовущих в бою**, только собственные сторожа. Единственные совпадения
вне их — служебный кэш анализатора, не код. Это следствие моей ошибки 6.1.
### 6.5. 🔴🔴 ВЫРЕЗАНИЕ ВТОРОГО РОДА — УЛОВ КРУПНЕЕ ЗАДАЧИ, ТРЕТИЙ РАЗ ПОДРЯД
**Допущение, на котором стоит защита:** «стирание записи по требованию человека —
дело будущей задачи З-2.5, сегодня его просто нет».
**Годный по форме случай мимо этого допущения:** стирание по требованию
**уже существует и уже работает.** В портале живёт `PdErasureService`. Замерил,
до чего он дотягивается: `users`, `supplier_leads`, `deals` — и по окончании
ставит обращению человека **`status = 'completed'`**.
🔴 **Нашего нового склада в этом списке нет.** Значит с той минуты, как модуль
поедет в бой, картина такая:
> человек требует стереть его данные → портал честно проходит свои три таблицы →
> отмечает обращение **«выполнено»** → **а голос этого человека остаётся лежать у
> нас**: звук месяц, расшифровка полгода.
**Это не недоделка будущей задачи. Это ложный отчёт человеку, реализующему своё
право** — и, что хуже, отчёт **машинный**: он не забыт, он утверждает обратное.
🔑 **И бьёт он ровно по тем, кто уязвимее всех.** В этом складе лежат голоса
людей, которые нам согласия не давали вовсе — они собеседники клиента, не наши.
Именно они и приходят с требованием «сотрите меня».
⚠️ **Честная граница находки: вред ЗАРЯЖЕН, но ещё НЕ СЛУЧИЛСЯ.** Ничего не
выкачено и не запушено, склада на боевом нет. Тем этот случай и отличается от
записей разговоров Лены в прошлом кругу, где вред **уже** случился. Порох сухой,
но выстрела не было.
⇒ Задача **З-2.5 уже есть в плане**, новую заводить не надо. Но её вес меняется:
это не «дотянуть стирание до звука», а **закрыть ложный отчёт**. Вписываю это
в план прямо в задачу З-2.5.
### 6.6. Полный прогон и приговор
*(заполняется по окончании прогона)*
---