de0b09331cc1f6cdfbbcfccb7f2a423ece9e12e0
502 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
930e28d2bf |
docs: возвращены в git 16 документов, на которые главная ссылалась, а их там не было
Найдено 07.08.2026 при попытке отправить починку сторожа пульса: проверка ссылок падала на 20 битых ссылках, и ни одна не была моей. Оказалось, что закоммиченные документы ссылаются на файлы, которые лежали только на диске рабочей машины и в git не попали ни разу. То есть главная не проходила проверку сама по себе — и отправка была закрыта ДЛЯ ВСЕХ смен, а не только для меня. У соседней смены на этот момент висело 5 неотправленных коммитов. Что вернулось: разборы и промты смен по клиентской СМС-рассылке (этапы 1-5, задачи 5-9, конец июля) и три промта смен 25-26 по кошельку и телеграму от 06.08. Все 16 — ровно те, на которые ссылались уже сохранённые документы, то есть их отсутствие было пропажей, а не задумкой. Отбор не на глаз: список получен из вывода lychee, каждый файл проверен на диске и на отсутствие в git. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
16d8191d08 |
docs: план переделки вкладки «Активность» под вопрос «жив ли клиент»
11 задач по TDD: два сервиса на бэкенде (вердикт с полоской и лента дел из пяти источников), ручка подгрузки, живая сортировка списка клиентов, типы и маппер, русские фразы, панель Vue, точка состояния в списке, полный прогон, приёмка глазами. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
575b6d6491 |
docs обзвон: приняты З-0.3, З-3.1 и половина З-0.6, в плане нашлась дыра
Три приговора вынесены своей рукой. Плюс в план заведена новая задача по решению владельца и записаны четыре его решения. З-0.3 принята, коммиты |
||
|
|
c7ae012f48 |
docs обзвон: З-0.10 принята, дыра в двери закрыта, три решения владельца
Приговор по З-0.10 вынесен сменой 6 через сутки после работы — то есть отчёт помощника доказательством не служил вовсе, все десять замеров сделаны заново своей рукой. Шесть проверок плана закрыты, из них три главные живым действием: подставил итогу дату 78 часов назад и УВИДЕЛ письмо на ops@liderra.ru, хотя внутри итога всё зелено; подставил красного сторожа и увидел, что письмо назвало его поимённо; на здоровом итоге писем ноль. Вырезанием второго рода нашёл дыру: дверь принимала итог ЗЕЛЁНЫМ, когда тело само говорило "красных 2", а в списке лежал один зелёный. Длина списка нигде не сверялась с объявленным числом, а поле с числом красных не читалось вовсе. Замерено прибором вне хранилища на настоящей двери. Закрыто доделкой |
||
|
|
e377809205 |
docs обзвон: З-2.4 принята, волна 2 закрыта, промт смене 6 написан
Конец смены 5. Здесь приговор по последнему кругу, врезка в план и передача следующей смене. З-2.4 принята, коммиты |
||
|
|
c84b8051b3 |
docs обзвон: хвосты З-0.11 приняты, и дорога владельцу была показана неполной
Добавка к кругу 3. Работу делал помощник, коммиты |
||
|
|
f2f16a70a1 |
docs обзвон: З-0.11 принята, мест лжи оказалось 14 вместо четырёх
Круг 3 смены 5. Работу делал помощник, коммит
|
||
|
|
808928458a |
docs обзвон: Р116 и Р117 — путь итога сторожей и адрес письма о беде
Владелец закрыл оба вопроса, висевших внутри З-0.10 хвостом от Р111. Оба вопроса были заданы с готовым выбором: разведка сделана до вопроса, чтобы владелец выбирал из замеренного, а не из моих догадок. Замерено до вопроса: - ключа от машины робота у портала нет — дороги в эту сторону не существует вовсе; - почтовых программ на самой машине нет, получатель нигде не задан; - у портала УЖЕ есть обе половины нужного: дорога, по которой снаружи стучатся с тайным словом в адресе плюс список разрешённых адресов, и готовый присмотр за пульсом — таблица отметок и ежедневная проверка с письмом при молчании; - тревога о ежедневных работах уходит сегодня на ЛИЧНУЮ почту kdv1@bk.ru, жёстко записанную прямо в коде, а рядом в настройках лежит заведённый и никем не используемый ящик сопровождения ops@liderra.ru. Р116 — машина сама стучится в портал. Раз в сутки гоняет трёх сторожей и отправляет итог той же дорогой, какой уже пользуется поставщик. Порталу не нужен ключ от машины, машине не нужна почта. Отрезано: «портал сам ходит на машину» — пришлось бы дать боевому порталу ключ от машины, где лежат голоса живых людей; «машина шлёт письмо сама» — почты нет, и молчание такой машины не заметил бы никто, а это ровно та болезнь, от которой лечим. Р117 — письмо идёт на ops@liderra.ru через настройку, а не зашитое в коде. Поменять адрес можно, не трогая код и не выкатывая портал. Отрезано: «на личную почту» — смена адреса означала бы правку кода и выкат боевого; «на оба сразу» — два получателя одного письма быстро приводят к тому, что его не читает ни один; «пока не слать вовсе» — модуль и правда не звонит, но уборка записей живых людей работает уже сейчас, и молчащий сторож у неё опаснее отсутствующего. 🔴 Чего решения НЕ закрывают, записано отдельной строкой у каждого: - стук сам по себе новый молчун — проверять надо СВЕЖЕСТЬ итога, а не только содержимое: зелёный итог недельной давности хуже красного сегодняшнего; - тайное слово — новый секрет, порядок его смены не назначен; - личная почта в чужом боевом коде осталась и в рамках обзвона не трогается; - читает ли кто-нибудь ops@liderra.ru — не замерено, писем туда до сих пор не приходило ни одного; - как часто слать при затяжной беде — не назначено. Бумаги: протокол получил Р116 и Р117 с отрезанными ветками; в разделе «осталось открытым» прежний пункт помечен закрытым со ссылкой на оба решения; у задачи З-0.10 в плане прежняя строка «осталось открытым внутри задачи» заменена решениями и списком того, что от них не закрылось. Датчики: решений 117, задач 53, врезок ПОСТРОЕНО 14. Разметка 0 ошибок, правописание чисто. |
||
|
|
dbf2680889 |
docs обзвон: З-0.9 принята, приговор надзирателя и врезка в план
Круг 1 смены 5. Заготовки подбора голоса Лены перенесены в хранилище и возвращаются на машину после перезагрузки. Работу делал помощник, коммиты |
||
|
|
a3fe86b98b |
docs обзвон: Р115 — рамка звонка это пересечение двух окон в разных часах
Владелец поднял развилку при постройке крутилки номеров на АТС: часы получателя 10:00-20:00 по его месту и часы менеджера клиента могут пересекаться едва или не пересекаться вовсе. Клиент в Москве с менеджером 14:00-18:00 и получатель во Владивостоке не пересекаются никак, и Дальний Восток выпадает молча. Замерено: развилки не было ни в одной бумаге. Слов «пересечение», «пояс», «Владивосток», «Дальний Восток» нет ни в спеке, ни в плане, ни в прежних 114 решениях. 🔴🔴 Хуже: построенное правило пересечение считать НЕ УМЕЕТ. SmsQuietHours берёт ОДНУ пару границ и сравнивает её с часом получателя; понятия второго окна в других часах у него нет. Кто добавит часы менеджера, просто сузив те же границы, получит вот что: менеджер из Москвы 14:00-18:00 будет прочитан как 14:00-18:00 по Владивостоку, то есть 07:00-11:00 по Москве — робот переведёт звонок на спящего менеджера. Ошибка выглядит правильной: экран покажет «звоним 14-18», журнал покажет «звонок в 14:07», и всё сойдётся. Задача З-3.1 ещё не построена — ловушка впереди, а не в бою. Решение владельца Р115, четыре части: 1. график приёма звонков на перевод даёт КЛИЕНТ, а не мы по умолчанию; 2. по умолчанию звоним только в пересечении, каким бы узким оно ни было — номера не выбрасываем, сколько успеем, столько успеем; 3. клиента предупреждаем ЗАРАНЕЕ, до обзвона, а не в отчёте после; 4. звонить без перевода — только с явного добра клиента. Отрезано: «звоним без перевода по умолчанию» — звонок платный, а перевода в нём не будет никогда, это выбор клиента; «не звоним и пишем в отчёте» — предупреждать надо ДО; «просто тумблер» — он не говорит, что делать при выключенном положении. Бумаги: - спека получила Т37а пересечение двух окон в разных часах, Т37б график даёт клиент, Т37в звоним сколько успеем и предупреждаем заранее, Т37г без перевода только с добра клиента; - план: у З-3.1 названа ловушка с ножом на неё и добавлены проверки 10-14; - промт смене 5: Р115 в разборе решений, ловушка вынесена в шапку. 🔴 Побочное, записано открытым: шесть попыток в сутки по Р53 выведены из семичасового дня менеджера. При пересечении в два часа шестёрку попыток физически не разложить — глубина дозвона при узком окне не решена. 🪤 Своя оплошность, названная первой: два числа в промте я поправил командой sed, а правило проекта прямое — файлы править только средствами правки, не оболочкой. Целость файла проверил после: 862 строки, концовка на месте, разметка чиста. Проверено приборами: решений 115, требований 112, задач 53; разметка 0 ошибок, правописание чисто, протухших чисел в промте не осталось. |
||
|
|
90993d315d |
docs обзвон: спека, план и промт узнали про решения Р105-Р114
Бумаги стройки приведены в соответствие с десятью решениями владельца от 06.08.2026. Кода не тронуто. Спека: - Т84 переписано под Р112 — итог по номеру стоит верхней строкой и берётся из последнего состоявшегося разговора, недозвоны его не меняют; - заведены Т84а лента всех состоявшихся контактов с датой, длительностью, исходом и записью, недозвоны свёрнуты в счётчик; Т84б прошлое в новом списке видно, но набору не мешает; Т80а робот сам заносит отказника в список; - закрыты пункты 20, 28 и остаток 29 раздела развилок — решениями Р112, Р113, Р114 и Р105. План: - З-2.4 получила устройство поля вместо открытой развилки, плюс седьмая проверка; - заведены три задачи: З-0.9 заготовки робота в хранилище, З-0.10 сторожей машины кто-то зовёт и молчание слышно, З-0.11 правда про флаг в чужих бумагах; - заведён лист выката из двух пунктов: В-1 отдельный работник очереди обзвона, В-2 подпись столбца в боевой базе; - шесть новых хвостов в разделе открытого — их породили ответы владельца. Промт смене 5: разбор решений в новом разделе 5.1, порядок работ пересобран, раздел вопросов переписан — семь закрыты, семь новых. 🔴 Найдена и исправлена сломанная мерка. Датчик числа требований спеки кончался на образце с оговоркой про русскую букву, и эта оговорка не работала вовсе: здешний поиск не понимает диапазона кириллицы. Девять требований с буквой после числа были невидимы, и число 96 держалось месяц. Замерено: старый образец давал 96 и с оговоркой, и без неё. Годный даёт 108, что сходится сложением 96 + 12. Урок записан в грабли: совпадение двух ответов не доказывает верности образца, проверять его надо строкой, которую он обязан поймать. 🪤 Своя оплошность, названная первой: число «полтерабайта записей» в промте было завышено впятеро — считалось без учёта решения Р95. Спека это же число уже несла верным с 04.08. Врал пересказ, а не первоисточник. Проверено приборами: задач 53, построено 13, требований 108, решений 114, хвостов 33; разметка 0 ошибок на четырёх бумагах, правописание чисто, все ссылки промта ведут к живым файлам. |
||
|
|
496008d1be |
docs приёмка: работа 1 смены 4 принята — звук наконец есть куда класть
Приговор вынесен своей рукой. Круг шёл в четыре захода, принят с семью оговорками. Своих ошибок пять, и две из них одного класса: я выдал за замер то, что замером не было. Сказал, что закрытое хранилище бросает отказ на ссылку, — взял это из комментария соседнего круга, а не из прибора; не бросает. Велел помощнику собрать перечень без учёта регистра через grep — а grep в этом окружении кириллицу не складывает вовсе, никаким ключом. Оба раза спас несогласный исполнитель. Ещё раз обжёгся на приборе: считал пустые записи через find по размеру и получил ноль, а их было две. Find округляет размер вверх до целого блока. Помощник трижды пошёл против письма и трижды был прав, каждый раз по замеру. Самое ценное — отказ исполнять способ: он не спорил о словах, а замерил, что мой способ неисполним, и сделал иначе. Нашёл пятое место лжи, молчаливое: подпорка в проверке объёма подменяла настройки портала руками, и сторожа объёма стерегли сами себя. Резал пятью своими ножами. Один показал, что защита выдержала. Второй уронил сторожа пути ударом по одной оси. Третий — вырезание второго рода — положил годную по форме ложь мимо допущения датчика, и датчик остался зелёным: он смотрел три папки из полутора десятков. После расширения тот же нож уронил его и назвал файл и строку поимённо. Зелёный датчик означал не «чисто», а «не смотрел», и это опаснее отсутствия датчика. Полный прогон на выходе красный: четыре падения в третьей территории, не моей. В одиночку она зелена трижды, вместе с моим обзвоном тоже зелена. Причину назвать не могу и записываю это как неразгаданное, а не подгоняю объяснение. |
||
|
|
26746ec1de |
docs приёмка: З-0.8 принята — текстовый след разговора закрыт
Приговор вынесен своей рукой. Задача З-0.8 принята с четырьмя оговорками. Своя главная ошибка первой: я велел чистить журналы тем же способом, что и звук, то есть удалять файлы старше срока. Так нельзя, и помощник отказался. Возраст файла это время последней записи, а в живой журнал дописывают при каждом звонке, и он никогда не станет старше трёх месяцев. Послушное исполнение дало бы лечение, которое выглядит здоровым и не лечит. Вторая моя ошибка: сказал, что мест четыре. Помощник нашёл то, о чём я не подумал вовсе, — имя человека, оно писалось и отдельной строкой, и внутри речи Лены, 64 строки из 242. Третья: мой прибор соврал. Прежнюю версию файла я взял счётом на два коммита назад, а в ту же ветку коммитила соседняя смена, и счёт привёл не туда. Годный прибор — родитель именно того коммита, который правил файл. Мой восьмой нож проверил вопрос, который я сам же и задавал: рождается ли новое место каждой пробой. Сторож ответил двумя проверками разом. Защита выдержала. Сверх нашёл чужой хвост: в корне хранилища лежит неучтённая копия моста от третьего августа, и в ней живая строка, пишущая слова человека. Не тронул, называю вслух. Записанные ранее слова не стёрты: в журнале по-прежнему 128 дословных реплик, уйдут вращением за 90 дней. Течь остановлена, лужа остаётся. |
||
|
|
a69df6a12e |
docs приёмка: работа 1 принята — уборка на машине робота вправду живёт
Приговор вынесен своей рукой. Круг принят с тремя оговорками. Своих ошибок в круге четыре, три из них поймал или поправил помощник: промт утверждал, что не хватает только расписания; мой прибор мерил маску своей оболочки вместо маски службы и занизил беду; сказал непроверенное про то, куда уходит ругань уборки; считал целость заготовок прибором, который смешивал ответ с сообщением об ошибке. Резал двумя своими ножами. Первый вскрыл слепую проверку: она считала имя скрипта по всему файлу и удовлетворялась пояснением в шапке — расписание звало несуществующий файл, а проверка молчала. Одну слепую заменили четырьмя зрячими. Второй нож оставил правило на месте и лишь отнял у него смысл — сторож покраснел живой пробой, а не сверкой текстов. Своё вырезание второго рода нашло то, чего не видели оба: заготовленные фразы робота и папки подбора голоса лежат во временном хранилище, ничем не воссоздаются и в репозитории их нет. Скрипт бережёт их двумя замками, а перезагрузка уносит целиком. Живых записей было 86 и осталось 86. Оба надреза возвращены, слепки совпали знак в знак. Прогон своей рукой 5009 проверок, красных ноль. |
||
|
|
9ac09fb1c1 |
docs,обзвон: приговор по кругу З-2.2 — своя ошибка была не пропуском, а подсказкой в неверную сторону
Своих ошибок две, называю первыми. Пятнадцатая: я не просто пропустил ловушку, я на неё указал. В задании написал «ищи просроченные по этим указателям» и перечислил их поимённо, а указатель отбирает строки, не спрашивая, было ли содержимое вообще. Чистка по моему совету поставила бы след «расшифровка удалена по сроку» строкам, у которых расшифровки не было никогда, а у записей, которые приносит клиент, соврала бы про все разом: расшифровщик живёт в четвёртой волне, текста нет ни у одной. Замки базы такого не ловят. Своя ошибка, вложенная в поручение, становится ошибкой помощника — здесь спас несогласный исполнитель. Шестнадцатая: ложный совет, повторённый за планом. Написал «пустой прогон обязан быть виден в журнале», а на боевом журнал глотает всё ниже предупреждения. Это записано в памяти проекта отдельной находкой, и я всё равно не сверил. Тот же класс, что ошибка двенадцатая прошлой смены: совет, который я не запустил. Мой нож нашёл дыру: заставил срок хранения браться из кода вместо настроек, и все 159 проверок остались зелёными. Сторож с именем «сроки заведены в настройках» проверял, что настройки заведены, но не что их читают. Имя обещало больше, чем защита делает. После починки тот же нож краснеет. Вырезание второго рода и честная граница: обещание «деньги и сухие итоги звонка переживут всё» держится не на устройстве, а на ненастроенной настройке — строка звонка связана со сделкой каскадом, а сброс старых разделов сделок сегодня выключен только тем, что срок хранения для них никто не задал. Что произойдёт, если задать, я не мерил и не берусь гадать. Помощник возразил моей мерке по объёму, и возражение верное: добиваться, чтобы число запросов не росло с числом строк, вредно — пришлось бы отказаться от правила «файл не стёрся, строку не помечаем». Он мерит цену одной строки и добавил сторожа на потолок за заход, которого я не просил, а он и бережёт от «уронить базу ночью». Круг ПРИНЯТ с двумя оговорками: стирание звука работает на бумаге, хранилища ещё нет, и команда об этом честно кричит; расписание на живой машине не заведено — решение владельца не принято. Прогон своей рукой: 4998 проверок, красных ноль, прирост ровно плюс двадцать пять при двадцати пяти новых сторожах. Датчик бумаг сходится: одиннадцать отметок при одиннадцати закрытых задачах. |
||
|
|
f7c59ad747 |
docs,обзвон: приговор по кругу З-2.5 — вырезание нашло невод, который ловит ноль
Своя ошибка названа первой и она четырнадцатая. Перечень мест, где живёт человек, я собрал глазами по одной таблице, а не командой по всем. В задании назвал звук и расшифровку, а мест оказалось четыре: телефон в строке звонка и, тяжелее, телефон в списке, из которого робот набирает. Имя той таблицы я в разведке видел, но внутрь не заглянул. Оставь мы там номер, и человеку позвонили бы снова после отчёта «выполнено»: лежащий голос он не услышит, а звонок услышит ухом. Нашёл не я, а несогласный исполнитель — десятый раз из четырнадцати. Резал двумя своими ножами. Первый снял разделение по клиентам у чужих материалов — и все тринадцать проверок остались зелёными. Это дыра, и не мелкая: стирание работает соединением, которое обходит защиту строк, значит у изоляции здесь одна половина замка вместо двух, и её не сторожил никто. Второй нож убрал след удаления текста — покраснела ровно проверка, что обращение не может стать выполненным, пока слова человека лежат у нас. Вырезание второго рода дало улов крупнее задачи, четвёртый раз подряд. Допущение защиты: человека можно найти в чужих записях по тексту расшифровки. Замер показал, что колонку расшифровки не заполняет никто, а расшифровщик строится задачей из четвёртой волны. Значит невод ловит ноль по построению: человек требует стереть, портал честно отвечает «ваших записей нет», а голос лежит тридцать дней. Тот же ложный отчёт, ради починки которого круг и затевался, на другом основании. Починено не полнотой, а честностью: и карточка обращения, и экран оператора теперь говорят отдельной тревожной строкой, что часть записей проверить было нечем. Помощник нашёл четвёртое место того же класса, своё: проверка запрета обработки сверяла телефон буква в букву, а его вбивает в обращение человек руками. Ни одно написание не совпало бы, и портал молча разрешил бы звонок тому, кто прямо потребовал прекратить обработку. Круг ПРИНЯТ с тремя оговорками: стирание в чужих материалах остаётся частичным и портал говорит это вслух; у читателя запрета зовущего в бою нет, звонилка не построена; канон схемы продолжает утверждать несуществующего охранника. Прогон своей рукой: сервер 4973 проверки, красных ноль, прирост ровно плюс девятнадцать при девятнадцати новых сторожах. Интерфейс 2103, красных ноль. Датчик бумаг сходится: десять отметок при десяти закрытых задачах. |
||
|
|
80d4fa2cfa |
docs,обзвон: приговор по кругу З-2.3 — вырезание нашло ложный отчёт о стирании
Своя ошибка названа первой и она шестая за смену. Я разрешил помощнику построить ручку приёма и назвал папку, куда её класть. Класть было некуда: файла маршрутов в проекте не существует вовсе. Класс тот же, что у пяти предыдущих: утверждение о коде без замера. Я перемерил пять утверждений плана и не перемерил своё собственное. Побочная цена: у построенного ноль зовущих в бою, дорогу кладут задачи волны 4. Резал двумя своими ножами, не теми, какими резал помощник. Первый снял вторую половину замка изоляции — покраснела ровно проверка, что клиент А не может открыть материал клиента Б, держа строку в руках. Второй сломал умолчание срока звука — покраснели две проверки умолчания. Второй нож выбран нарочно: ровно этим классом нас укусило в прошлом кругу, и урок оказался усвоен. Оба возврата доказаны слепком знак в знак. Вырезание второго рода дало улов крупнее задачи, третий раз подряд. Допущение защиты было: стирание по требованию человека — дело будущей задачи. Замер показал, что стирание уже существует, проходит три таблицы и ставит обращению человека отметку «выполнено». Нашего нового склада в том списке нет. Значит человек требует стереть свои данные, портал отчитывается «выполнено», а голос этого человека остаётся лежать: звук месяц, расшифровка полгода. Это не недоделка, а ложный отчёт, причём машинный. Бьёт по самым уязвимым: в складе лежат голоса людей, которые согласия нам не давали вовсе. Честная граница находки: вред заряжен, но ещё не случился — ничего не выкачено, склада на боевом нет. Этим случай отличается от записей разговоров Лены, где вред уже случился. Врезка вписана в задачу З-2.5, её вес меняется: она обязана закрыться до первого живого обзвона. Врезка ПОСТРОЕНО вписана в З-2.3 с шестью расхождениями. Датчик бумаг сходится: девять отметок при девяти закрытых задачах. |
||
|
|
2da4721644 |
docs,обзвон: в плане отмечена одна закрытая задача из восьми — исправлено
Владелец сказал про промт «почти». Пересчёт бумаг командой вскрыл дыру, которой промт не закрывал. Первая смена построила восемь задач, а в плане отметила одну — З-0.2. Семь денежных задач стояли в плане как непостроенные, то есть для следующей смены их не существовало, хотя код лежит в ветке. Ошибка надзирателя номер 11, класс тот же: считал код и не считал бумаги. Врезки «ПОСТРОЕНО» дописаны всем семи, с коммитом, ссылкой на приёмочный лист и тем, чем замер разошёлся с текстом задачи. Главные расхождения теперь видны прямо в задачах: крайняя цена разговора 1252 рубля вместо записанных 602, цена брошенной трубки 12 рублей вместо 2, намеренно оставленный ноль за минуту и молчаливая недостача трёх живых каналов. Датчик сходится: восемь отметок при восьми закрытых задачах. Вторая находка — ложный совет в самом промте. Там было написано гонять проверку правописания руками. Запустил — она отвечает «проверено файлов: 0», потому что исключение лежит в самой настройке. Совет выглядел успехом и не проверял ничего. Это ошибка номер 12, и она опаснее отсутствующего совета: отсутствующий заставляет думать, ложный успокаивает. Записан рабочий способ и оговорка, что улов там почти весь ложный — латинские имена файлов в ссылках. В промт добавлен раздел 0.9 про бумаги — четвёртую обязанность надзирателя, которой в нём не было вовсе. Куда класть свой приёмочный лист и как называть, что обновляется в том же круге, датчик пересчёта и работа в конце смены. Обязанностей в листе стало пятнадцать, правил девять. |
||
|
|
3ed88eeef3 |
docs,обзвон: приговор по кругу З-0.2 и восьмая ошибка надзирателя
Круг записи разговоров принят своей рукой. Сторожа резал сам и шестым способом, которого исполнитель не пробовал: перевернул знак срока. Покраснело 6 проверок из 23 и покраснело в обе стороны — старое осталось, свежее исчезло. Возврат доказан слепком. Прогон сервера своей рукой: 4930 проверок, красных 0, код возврата 0 — сходится с точкой отсчёта. Интерфейсного прогона круг не требует, и это замер: за четыре коммита не тронуто ни одного файла под app и resources. Восьмая ошибка надзирателя того же класса, что первые семь. Найдя слепое место в сверке, я предложил редактору лечение — сравнивать файл целиком — не измерив предмет. Редактор измерил и отверг: выше начала диалплана лежат 57 строк шапки про сам репозиторий, которой на сервере не будет никогда, и сплошная сверка дала бы вечный шум в полсотни строк. Его числа проверены моей рукой и сошлись. Правило: предлагая помощнику способ, меряй предмет так же строго, как чужой отчёт. Из пяти возражений помощников верны четыре, одно ложно, и отличить их можно было только замером. Своей рукой найдены две беды в бумаге исполнителя: неправда про начало серверного файла и обещание числа 3 там, где честное число 5. Отданы другому помощнику по правилу правщик не автор. Вырезание второго рода дало улов крупнее самой задачи. Допущение задачи — разговор живёт в звуковом файле — неверно: мест четыре. Дословная расшифровка речи человека пишется в журналы моста, телефон каждого звонившего лежит в летописи звонков с 23 июля, и ни то ни другое не чистит никто, а перезагрузку они переживают. Звук оказался единственным местом, у которого хоть какая-то чистка была. Заведена задача З-0.8, брать без слова владельца нельзя. Счётчики плана были устаревшими по моей же вине со вчерашнего дня — стояло 47 при 49 задачах. Исправлено, стало 50, и рядом записано, что число уже протухало. |
||
|
|
81f2a77c04 |
docs,обзвон: приговор по двум кругам владельца и седьмая ошибка надзирателя
Круги З-1.8 и З-1.9 приняты своей рукой, а не по отчётам помощников. Сторожа резал сам и оба раза другим ножом, чем исполнитель: у запрета двух нулей покраснели две проверки из шести, у экрана тарифа — ровно одна, та самая, что стережёт оговорку про цену вслепую. Возврат обоих файлов доказан слепком, а не памятью. Прогоны своей рукой: сервер 4930 проверок при нуле красных, интерфейс 2095 проверок в 257 файлах при нуле красных. Вырезание второго рода нашло дыру, которой не видел никто: запрет ловит два нуля разом, но ноль за минуту при ненулевом соединении пропускает, и тогда час разговора стоит клиенту два рубля, а оператору за шестьдесят минут платим мы. Замерено прибором, решение Р90 не переоткрывается — это вопрос владельцу. Седьмая ошибка надзирателя: в проверки задачи З-1.9 записано «видно, кто и когда менял цену и с чего на что», а выполнить это нельзя — ручка отдаёт только дату, ручки чтения журнала админов не существует. Проверка списана с задачи З-1.3, где речь про запись следа, а не про его показ. Класс тот же, что у первых шести: утверждение о коде без замера кода. Нашёл снова исполнитель. Починено в бумагах: проверка переписана на выполнимое, показ истории правок прибавлен в состав З-4.7. Попутно в приёмочном листе разведены три одинаковых заголовка «Приговор» — они мешали разметке и были там до этой правки, крючок этот путь не проверяет. |
||
|
|
1eb56f5b18 |
docs,обзвон: две работы владельца заведены в план, и шестая ошибка надзирателя названа
Решения Р90 и Р91 стали задачами З-1.8 «два нуля в цене нельзя» и З-1.9 «экран тарифа». План вырос с 47 задач до 49. Шестая ошибка надзирателя: промт смене 2 утверждал, что экрана тарифа в плане нет ни одной задачи. Неверно — он был внутри З-4.7 первой строкой состава. Утверждение о плане делалось без сверки с планом, тот же класс, что первые пять. Нашлось при заведении задачи: пошёл смотреть, куда её класть, и увидел, что она уже там. Тариф вынесен из З-4.7 в раннюю З-1.9, потому что причина владельца обратная по сроку — цену придётся менять сразу после первых живых звонков, а З-4.7 стоит в волне 4 за цепочкой из трёх экранов. В З-4.7 оставлена ссылка, чтобы не построили дважды. В таблицу узких горл добавлено то, чего в ней не было вовсе: сквозные проверки перед коммитом — deptrac, статанализ и сторож канона схемы — тоже горло. Они смотрят на всё хозяйство разом, и незаконченный кусок одного круга рубит коммит всем. Проверено дорого на стройке первой смены: два круга с разведёнными файлами заблокировали друг другу коммит. Отсюда правило расстановки: спрашивать не только про разные файлы, но и про новые классы и таблицы. |
||
|
|
90cf01b374 |
docs(обзвон): владелец закрыл ВСЕ хвосты — 11 решений, план перестал врать
Разбор хвостов перед стройкой. Ждущих ответа вопросов у стройки больше нет: шесть «Новое-1…6» из плана закрыты, плюс пять решений сверх них. Протокол 83 решения вместо 72. Что решил владелец: - Р73 этикетка чужого юрлица остаётся как есть; - Р74 дорогу назад для рекламы чинит отдельная смена — до первых живых денег обзвона; - Р75 юриста про голос за границу не спрашиваем, идём как есть. Риск законный и он остаётся — записан прямо, а не спрятан; - Р76 правило часов одно на СМС и обзвон, живой СМС-модуль правим; - Р77 пять номеров арендуем к первому живому обзвону — ОТМЕНЕНО решением Р83; - Р78 тариф 2 плюс 10 остаётся, уточним по замеру; - Р79 длину и содержание речи решает клиент, хвост про опенер снят; - Р80 робота без слов-запиналок слушаем на приёмке; - Р81 телефония уезжает на новую АТС, Манго — только испытание; - Р82 расшифровка чужих записей живёт ШЕСТЬ месяцев, звук 30 дней; - Р83 у Манго ничего не арендуем, переезд робота в план обзвона не заводим. Три решения меняют сам план, и правки внесены: - Р76 разблокировала З-3.1 целиком — развилка «одно правило или второй дом» стояла открытой и ждала ровно этого. Отмечено, что круг на боевой файл отдельный: своя приёмка, свои две строки про соседей, свой выкат; - Р82 отменила мою страховку «расшифровка уходит вместе со звуком». Сроков теперь два, и чистка обязана стереть звук не тронув текст, а требование «сотрите меня» — достать до текста, когда звука уже нет; - Р81 и Р83 превратили «до аренды» в «до новой АТС» в З-3.3. Своя неточность названа вслух: в вопросе про часы я сказал «одна настройка», хотя решается общий код правила. Часы рассылки и часы обзвона остаются разными числами — этого требует Т36 и проверка 8 в З-3.1. Записано и в протоколе, и в плане, чтобы никто не прочитал Р76 как «одни часы на двоих». Найдено при разборе: два вопроса владельцу, добавленные редактором, не попали в промт смене 8 — «с какого кода звоним» и «расшифровки чужих записей». Оба заданы и закрыты. Промт исправлен. Работа, которая теперь не живёт нигде: перевод машины робота на новую АТС. В план обзвона не заводим по решению владельца, но машина прописана на Манго намертво. Названо вслух в протоколе и в промте. ОБА СТОРОЖА ТЕКСТА БЫЛИ МЕРТВЫ — вскрылось при этом же коммите. Пакеты стояли на месте, но внутри пустые: у одного остались только лицензия и схема, у другого файл обрывался посреди строки. Причина — установка, оборванная на пакете, которому нужен компилятор C++, а его на машине нет. Два вывода записаны в промт смене 8: - прежний датчик «посчитай папки в node_modules, должно быть под 750» ЛОЖНЫЙ: он показывал 745 при полностью мёртвых сторожах. Заменён на запуск самих программ; - npx МАСКИРУЕТ поломку: не найдя программу на месте, молча качает чужую версию из сети, и проверка «проходит». Три отчёта «разметка чистая» в этой сессии опирались на неё и доказательством не были. Починено: сломанные пакеты снесены и поставлены заново без сборки. Сторож орфографии показан КРАСНЫМ на подсунутой ошибке — только после этого ему верю. Он же нашёл настоящее: слово «запиналки» отсутствовало в словаре, добавлено. Проверено командой: план 3341 строка, 21 раздел, 47 задач, по волнам 7·7·5·8·9·3·8. Протокол 83 решения, 7 разделов. Разметка и орфография чистые живыми сторожами, а не скачанными. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
c11ee3ad87 |
docs(обзвон): редактор снял пять заплаток из шести — 47 задач, этап 5 закрыт
Метод велит: правщик — не автор. Правило нарушили — шесть находок судьи чинил тот, кто их допустил. Свежий редактор проверил эти заплатки и снял ПЯТЬ ИЗ ШЕСТИ. Замер записан в план: самопроверка автора стоит примерно одну шестую от проверки чужими глазами. Что не выдержало: - «семь заходов в мост»: таблица исправлена, а в самих задачах порядок остался старый — З-4.5 звала себя последней, З-6.7 ждала её. Исполнитель читает задачу, а не таблицу; - имена наставлений робота ВЫДУМАНЫ: по мосту строка 41 — lena-vhodyashchie-promt, а план написал lena-priyomshchik-promt. Плюс в наставления подмешиваются три файла базы знаний, которых план не назвал вовсе; - З-4.8 закрыла Т23 наполовину: требуется четыре заготовки, названа одна; у Т13 молчаливый робот проходил все пять проверок; - З-6.8: имя очереди задаётся внутри задания, а не в routes/console.php — тот же класс ошибки, за который судья ругал соседнюю задачу; и задача стояла последней, хотя задания пишутся в волнах 1, 3, 5; - проверки манеры: «в тексте нет слов про манеру» покраснеть не могла — что считать словом про манеру, не сказано нигде; вторая половина находки судьи не починена вовсе; - порядок по узким горлам: из пяти расхождений судьи три остались, и добавилось новое. Выдержала одна: переписанная проверка дословности каркаса в З-4.3. Редактор нашёл сверх этого: Т17 — четвёртое требование без задачи, пропустили и автор, и судья; «с какого кода звоним» из §18 спеки в плане не было ни слова; Р72 исполнено наполовину. Внёс 33 правки, добавил раздел приёмки шестью сквозными кругами и два вопроса владельцу. Проверил числа командой и нашёл семь неверных: web.php 799 а не 783, чертёж записей на 3780 а не 3776, DealController а не DealsController, «11 задач на схему» на деле 10, «5 в расписании» 4, «восемнадцать хвостов» 24, «Р1-Р70» при 72 решениях. Поверх редактора надзиратель добавил своё: - З-4.9 тумблер видимости модуля — редактор назвал беду, но сказал прямо, что нужна новая задача, а не заплатка. Пункт «ИИ колцентр» уже стоит в меню без адреса; З-4.1 дописывает адрес — и все клиенты видят недостроенный обзвон. Своего включателя у модуля нет, это уже ловили при выкате рекламного модуля. Задача делается ПЕРВОЙ в волне 4, до З-4.1; - две устаревшие ссылки на раздел «Два места, где нужно слово владельца» — раздел переименован, а спор двенадцати и десяти закрыт решением Р71. Проверено командой: 3258 строк, 20 разделов, 47 задач, по волнам 7·7·5·8·9·3·8, висячих ссылок нет, разметка чистая. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
c50b3dbe1e |
docs(обзвон): ворота вслепую и суд пройдены — третья редакция плана, 46 задач
Вторую редакцию проверили трое: двое ворот вслепую и судья. Оба проверяющих
работали по спеке, план им был запрещён словами, оба отчитались «план не
открывал» и оба назвали вещи, которых в плане нет. Судья план читал и искал
ошибки надзирателя.
Проверено командой: план 2801 строка / 19 разделов / 46 задач, спека 2126 / 18 /
96 требований, протокол 2150 / 7 / 72 решения. Разметка чистая во всех трёх.
Полный прогон: 4755 из 4760, упавший тест чужой (коммит
|
||
|
|
78e8a57b8e |
docs(обзвон): план переписан под 21 новое решение владельца — 41 задача в семи волнах
План 2026-08-04 писался, когда закрытых развилок было ноль. Сейчас закрыты 28 из 29, и пометки «заблокировано развилкой» врали в обе стороны. Вторая редакция. Было 32 задачи в шести волнах — стало 41 в семи. Проверено командой: 2292 строки, 18 разделов, 41 задача, разметка чистая, ссылок на файлы ноль. Разблокировано решениями владельца: вход клиента Р66/Р67/Р60, окно часов Р64, письма Р52, каркас и личная правка Р46, обратные звонки Р62/Р63/Р48/Р54, запись менеджера Р61, замок Т31 Р57, источники получателей Р65. Из семнадцати заблокированных задач не осталось ни одной запертой полностью. Прибавилось: - волна 5 «авто-обзвон» целиком — решение Р39, перенос измеренного устройства авто-СМС; - З-0.5 обрыв на 60-й минуте и подсказка менеджеру на 55-й — Р43; - З-1.7 письмо про обе остановки — Р56; - З-3.6 подтверждение согласия при каждой загрузке — Р42; - З-3.7 закрытые номера: тишина, счётчик, бесплатность — Р48, Р49; - З-4.4 личная правка сильнее каркаса — Р46; - З-4.5 манера живёт у робота — Р68; - З-4.2 сборка скрипта машиной — найденная дыра: требование Т7 стоит в спеке с первого дня, а задачи под него не было ни одной. Переписано против первой редакции: - стоп-лист — решение Р45 обратно прежней рекомендации: свой, пятый список; - чистка — три ступени по одной строке вместо одной операции, Р50 и Р51; - заморозка — два режима: авто по поступлению, база пачкой, Р39; - отчёты — по людям, а не по наборам номера, Р47; - З-2.4 первой редакции упразднена: Р50 сняло бессрочную обезличенную расшифровку. Два места, где нужно слово владельца, оба всплыли после закрытия развилок: 1. Двенадцать попыток дозвона требуют двенадцати разных номеров Р53, а арендовать решено десять Р41. Арифметически невыполнимо. 2. У авто-обзвона нет загрузки списка — к чему привязать подтверждение согласия, не решено. Спека выправлена шестью правками: освобождён задвоенный номер Т73 → Т98, снята устаревшая бессрочная расшифровка, названо противоречие десяти и двенадцати номеров в трёх местах. Требований 96, разделов 17, закрытых развилок 28. Промт следующей смене заменяет прежний — очереди развилок больше нет. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
2ce4bbc058 |
docs(обзвон): план стройки, ворота по плану и решения владельца Р39–Р41
План фичи «Обзвон» — 32 задачи в шести волнах, 17 помечены «заблокировано развилкой», в конце таблица «развилка → сколько задач держит». Ворота вслепую по плану, двое разными ходами (по требованиям подряд и «пройди один рабочий день в бою»). Нашли то, чего не видели ни спека, ни надзиратель: - заморозка денег под обзвон гасит клиенту рекламу: выключатель считает «баланс не меньше замороженного», при нарушении слушатель тушит все кампании; - перевод звонка — два плеча у оператора, а клиенту выставляется одно соединение: чем чаще успешный перевод, тем хуже сходится экономика; - обратный звонок сегодня попадает в наш собственный отдел продаж; - «исход» означает две разные вещи — чем кончилась попытка и чем кончилась работа с номером. Развилок в спеке стало 29. Ни одна не разрешена — это решения владельца. Новые решения владельца: - Р39 — режимов обзвона два, морозим по-разному: авто-обзвон по поступлению лида, обзвон базы пачкой. Владелец поймал вопросом ошибку в моей рекомендации: спрятать заморозку от выключателя значило сделать минус ежедневным, а резерв фикцией; - Р40 — звук храним месяц, не полгода (правит Р22): место падает с ~50 ГБ на клиента до ~8, а учит текст, а не звук; - Р41 — пул номеров общий на портал, аренду платим мы. Чинит то, что сегодня человек после робота перезванивает нашему отделу продаж. Спека дополнена авто-обзвоном (Т33а–Т33е) и разведённой заморозкой (Т58/Т58а/Т58б). Поправка к прежнему докладу: тревога «записи положат портал» была ошибочной — по чертежу звук лежит в облачном хранилище, а падение 29.05 было на другой машине. Правдой осталось, что в хранилище сегодня не кладётся ничего. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
a599621a0d |
docs(воронка): план работ — ниша на карточке и фильтр по нише
20 задач по TDD, от колонки в базе до приёмки глазами. Портал: колонка sales_prospects.rubric, ключ сравнения ниш и приклейка к существующему написанию, приём ниши из поиска и из прогрева, список ниш текущей выборки, фильтр и «Без ниши», список всех ниш для подсказок, правка ниши в карточке, сопоставление для разовой проставки, служебная ручка и команда artisan. Фронт: плашка ниши на карточке, фильтр между «Менеджер» и «Происхождение» со сбросом и подписью, поиск похожих ниш, поле «Ниша» с подсказкой. Служба поиска: передача ниши прогона при «отдать менеджеру» и разовый проход по всем сохранённым спискам. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
1c1084013c |
merge: подтянул общую ветку — сторож статанализа готов к переезду в main
Пункт А из промта закрылся сам: ветка заголовка телеграм-объявления уже сведена параллельной сменой, она и main показывают на один коммит. Зато вскрылось другое: общая ветка ушла вперёд на 43 записи, а сторож статанализа в неё не попал. Тяну общую к себе, чтобы моя работа была готова к переезду. Столкнулось пять файлов, каждый разобран по существу. 1. SupplierPortalClient - обе стороны сделали ОДНУ И ТУ ЖЕ починку описания поля tag. Взята моя: она включает чужую целиком плюс пояснение, почему анализатор ругался. 2. Тест площадок рекламы - тоже одна и та же починка с двух сторон. Взят вариант общей ветки: он строже, там есть ещё проверка, что список заглушек не опустел. 3. Список принятых замечаний статанализа - главное столкновение. Общая ветка дописала 37 записей, из них 35 про тот самый ложный класс Pest, который я убрал целиком и закрыл отдельным правилом. Взяты только две настоящие, обе про новый телеграм-модуль, сверены с оригиналом посимвольно. Проверка: если бы я выкинул лишнее, статанализ покраснел бы. Он даёт ноль. 4. Список слов для проверки орфографии - объединение, а не выбор стороны. Моя чистка от дублей плюс 6 новых слов общей ветки. Проверено: ни одного слова ни с одной стороны не потеряно, 2212 слов против 2163 в базе и 2169 в общей. 5. Сторож наблюдателя STATUS.md - файл машинный, взята версия общей ветки, всё равно перегенерируется. Сторож статанализа сразу отработал НА ЖИВОЙ РАБОТЕ: сведение принесло новую модель RobotJob, подсказчик её не знал - сторож назвал её поимённо и не дал запустить анализатор впустую. Ровно то, ради чего он ставился. Подсказчик пересобран, его косметические правки в 48 моделях откачены - в сведение они не входят. Проверено: статанализ 0 ошибок, тесты инструментов 79 из 79, тест площадок рекламы зелёный, тесты телеграм-модуля 250 из 250. Граблина замера: сперва сравнил списки слов через comm и получил "потеряны все комментарии" - врал сам замер, файлы были с разными концами строк. Перемерил с приведением - потерь нет. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
64fdf5f424 |
docs(ночной работник): решения владельца 124-127 и промт на обсуждение стройки
Четыре решения владельца, внесённые в планы кусков 5 и 6: - 124 неясный ответ («может быть») не трогает сделанное — работа ждёт ясного слова - 125 об отказе кнопки «продолжить» владелец узнаёт из окна, письма не строим - 126 угол вставшего работника уборка не трогает, пока владелец не решит - 127 забытый на паузе гасится через сутки, и в письме сказано почему Внесение вскрыло три вещи: - решение 127 потребовало нового блока в круге надзирателя: гасить забытую паузу ночью больше некому — кнопка ждёт руки, письмо ушло в 08:10, отсечка 8:00 паузных не трогает по решению 115; - и этот блок столкнулся с блоком куска 7 по ИМЕНИ: оба назвались 6а, 27 упоминаний против 26. Разведены: 6а — конец задачи (кусок 7), 6б — забытая пауза (кусок 6). Порядок круга 6 -> 6а -> 6б; - у решения 124 нашлось непрописанное следствие: пометить неясный ответ отвеченным значит закрыть пункт, сделанный в расчёте на «да». Числа: кусок 5 — 66 проверок, кусок 6 — 51, кусок 7 — 128. Долгов перед кусками 1-4 стало 11. Вопросов владельцу осталось 13 из 17. Промт следующей сессии — только обсуждение, КАК строить. Строить запрещено прямым указанием владельца. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
9ef688fa8d |
merge: подтянул main после выката починок модерации Яндекса
Мой коммит уехал в main отдельно — пересадкой на актуальную вершину и оттуда на боевой. Возвращаю main к себе, чтобы ветка не разъезжалась. Пришло 9 коммитов, из них главное — работа соседней сессии по воронке продаж, уже влитая в main и запушенная. Конфликта два, оба в общих машинных файлах: - cspell-words.txt — сторону не выбирал, объединил. Все слова обеих сторон на месте; убрана ровно одна строка — мой же дубль «админский», который прошлый коммит добавил дважды. Проверено сравнением с версией до слияния: другого отличия нет; - docs/observer/STATUS.md — машинный файл наблюдателя со столбиком часов процессов, взята своя версия, его всё равно переписывает хук. Замечание на будущее: патч «минимум площадки считается по длине периода» живёт в двух коммитах — |
||
|
|
adc18ce2ae |
docs(ночной работник): семь планов из семи — затея «дело идёт без владельца» допланирована
Бумаги затеи о ночном работнике, который делает работу по плану восемь часов без человека, а утром присылает письмо владельцу. Что лежит: - бумага «что и зачем» (125 проверок, заморожена) и протокол допроса, 123 решения владельца - разрез на семь кусков «тонкой нитью насквозь» и договор о стыках - семь планов: куски 1-4 с кодом, куски 5-7 без кода (решение владельца 121) - записи ворот, правщиков и сквозных ворот, 45 файлов Порядок работы, отработавший впервые целиком: договор, трое пишущих разом, ворота двумя углами на каждый план, правщик, СКВОЗНЫЕ ВОРОТА двумя углами, правщик стыков. Числа: 400 находок ворот за затею, из них 160 за 01.08, ложная одна. Решение 121 (план без кода) проверено замером: планы вдесятеро короче прежних при том же числе проверок, а находок не меньше — но смысловых вместо механических. Сквозные ворота дали 25 находок, ложных ноль, и поймали класс, невидимый изнутри одного плана: приёмка сносила рабочий угол под живым работником, поднятым кнопкой «продолжить». Куски 6 и 7 не назвали друг друга ни разу. Строк настоящего кода — ноль. Ночей отработано — ноль. Стройка не начиналась. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
1acbaf9383 |
Merge remote-tracking branch 'gitea/main' into feat/prospects-manual-testing-kp
# Conflicts: # docs/observer/STATUS.md |
||
|
|
53ebcd9fe0 |
feat(воронка продаж): журнал движений карточки + место под корзину
Стадию меняют два разных места — результат разговора менеджера и автопереезд по деньгам. Джоба не оставляла следа вообще, поэтому «что менялось за день» было не из чего построить. Запись движения перенесена в событие модели: один шов на всех, включая любой будущий третий источник. - sales_prospect_moves — журнал всех движений (append-only, с GRANT'ами ролям); - prev_stage на карточке — откуда приехала (кормит счётчик «69/1» у «Отказа»); - stage += 'trash' — место под колонку «Корзина». Сторож проверен вырезанием: без записи движения краснеют 4 теста, в том числе тест джобы и тест API. |
||
|
|
72db586a12 |
merge: свёл ветку телеграм-робота с основной, разрулил столкновение номеров журнала схемы
Основная ветка ушла вперёд на 23 коммита - приехала чужая работа по воронке продаж, вебхуку поставщика и сверке CSV. Конфликтов было два. 1. Журнал схемы db/CHANGELOG_schema.md. В обеих ветках лежала запись v9.28 от 31.07 про разное: у нас очередь заданий роботу, у них стадии воронки "Тестирование ручное" и "Выслано КП". Обе записи настоящие, поэтому ни одна не выброшена: боевая v9.28 осталась на своём номере, наши две подвинуты на v9.29 очередь заданий и v9.30 грант админ-роли. Поправлены ссылки на номер в шапках двух миграций, перекрёстные ссылки внутри самих записей и врезка "Перенумерация" вверху журнала - там теперь описан и этот случай. 2. docs/observer/STATUS.md - файл авто-генерируемый, взята версия основной ветки, хук перепишет его сам. Заголовок db/schema.sql не трогали: там своя нумерация v8.85, ни одна из веток её не двигала. Плюс одна настоящая находка статанализа, приехавшая с чужой работой: у метода SupplierPortalClient::fetchDeliveredLeads в описании возвращаемого набора не было поля tag, хотя код его уже возвращает и чужой же тест его ждёт. Дописал одно поле в описание, логику не трогал. Список исключений статанализа пересобран - разъехались счётчики ложного класса Pest от новых строк в чужих тестах. Проверено на ОТДЕЛЬНОЙ тестовой базе liderra_testing_tgmerge: телеграм на портале 244 из 244 робот 124 из 124 статанализ 0 замечаний код-стиль чисто полный прогон 4063 теста, 4018 прошло, 17 упало До сведения было 4039 тестов и 20 падений - тестов стало больше, падений меньше. Ни одно падение не касается телеграма или журнала схемы: 13 из 17 в рекламном модуле Яндекса, из них 11 - живой отказ авторизации Яндекс Директа, остальные счётные, от накопленных за прогон данных. Отдельно вскрылось при проверке: общая тестовая база liderra_testing испорчена - в ней 180 записей о применённых миграциях при 146 файлах, то есть в неё пишет не только эта рабочая папка. Из-за этого сборка базы срывалась на первом же шаге. Отдельная база всё вылечила. Это хвост Х2б, лечение в репозиторий не вносил - решение владельца. На бой ничего не выкачено, переключатель TG_ROBOT_TRANSPORT остаётся в process. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
ceb88ab102 |
fix тесты: тестовая база перестала рваться посреди прогона
Корень оказался в Laravel: в конце каждого теста он проверяет, осталось ли соединение в своей черновой транзакции, и если тест её закрыл сам - сбрасывает признак "база собрана". Следующий тест пересобирает базу целиком прямо посреди прогона, снося её под всеми остальными. В проекте полно кода со своими транзакциями, поэтому срабатывало примерно раз на восемь прогонов. Что сделано: - пересборка базы теперь один раз и в самом начале прогона, а не лениво в середине по первому файлу, который её закажет; - признак "собрано" держится взведённым - пересборка посреди прогона стала невозможна; - отказ заливки схемы стал громким: раньше PDO мог вернуть отказ без ошибки, и прогон ехал дальше по неполной схеме; - добавлена сверка полноты сборки: сколько шагов записано против того, сколько их лежит. Приёмка вырезанием: новый тест-сторож зелёный с защитой и падает без неё, прогон без защиты дольше на 12 секунд - это и есть лишняя пересборка. Замер до и после, полный набор портала: без правки 3175 прошло, 837 упало с правкой, прогон 1 3971 прошло, 19 упало с правкой, прогон 2 3971 прошло, 19 упало, списки совпали дословно Оставшиеся 19 - давние и не от базы: 11 падают на неверном токене Яндекса, одна на типе исключения, семь счётных от накопления данных между тестами. Плюс план перевода чтения вердикта и пересдачи на опрос - отдельным файлом, код по нему ещё не писался. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
a57a70268d |
merge: воронка продаж — стадии «Тестирование ручное» и «Выслано КП» в main
Конфликты только в документах: журнал «мозга» взят из main, запись v9.28 переставлена поверх боевого журнала схемы. Код не пересекался. Сторож слоёв проверен отдельно в рабочей папке: 0 нарушений. Сторож секретов gitleaks отработал по-настоящему. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
6ddd2b6717 |
docs(воронка продаж): спека и план двух новых стадий — Тестирование ручное и Выслано КП
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
ae2ee5e59c |
docs телеграм-робот: план переделки связки портал-робот на опрос
Нужна при ЛЮБОМ исходе с адресом: и на сервере, и на машине владельца робот стоит не там, где очередь портала, а сегодня портал запускает его как процесс у себя. Списано с работающего образца - робота креативов Яндекса. 12 задач по шагам с готовым кодом и тестами, переключатель process/poll оставляет старый путь рабочим. Отдельно вынесены красные линии: перезапуск srv_bypass после миграции, номера телефонов не в задании, приёмка сторожей вырезанием. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
|
|
f976de52d7 |
docs: починены 92 битые ссылки — сторож ссылок снова что-то значит
Accessibility (Pa11y live) / a11y (push) Has been cancelled
Проверка ссылок падала на девяноста двух ошибках, поэтому любая отправка в main
шла через обход. Смысл починки не в красоте: пока ошибок девяносто две, новая
битая ссылка тонет среди них и никто её не замечает. Теперь ноль, и пуш проходит
обычным порядком.
Что было внутри девяноста двух:
68 — ссылка написана от корня хранилища, а документ лежит на две-три папки
вглубь. Приписаны шаги вверх. Файлы всё это время лежали на месте.
8 — файл существует, но переехал: Jobs/Billing, Jobs/Supplier, Services.
Адреса переписаны на нынешние места.
8 — файла нет и не будет: ProcessWebhookJob снят при уходе от старого
биллинга, SupplierCsvParser удалён 09.07 как мёртвый, каталог memory
уехал в claude-brain, а HANDOFF прогрева от 25.07 не существует ни
в одном коммите. Ссылки сняты, текст оставлен.
3 — неверное число шагов вверх: две точки вместо трёх.
3 — это вообще не ссылки, а примеры в тексте: http:// как образец мусорного
ввода, https://ваш-сайт.ru из подсказки формы. Обёрнуты в кавычки-код.
1 — адрес с приписанными номерами строк, которых проверятель не понимает.
1 — Россвязь. Сайт мёртв по-настоящему: сервер 194.226.91.2 отдаёт nginx-ову
404 на любой адрес, включая корень, а сертификат выписан не на это имя;
ведомство расформировано. Замену проверить не удалось — преемник
с этой машины не отвечает вовсе. Ссылка снята, адрес читается текстом.
Вопрос «где реестр нумерации живёт теперь» остаётся открытым.
Исключения проверятеля не тронуты ни на строку. Ноль получен починкой, а не
глушением сторожа — иначе вся работа теряет смысл.
Отдельным прибором проверено, что видимый читателю текст не изменился ни в одной
из 81 правленой строки: правились только адреса ссылок. Разметка линтером чистая.
Вместе с починкой ложится промт смены, по которому работа делалась.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
77f61fb1d1 |
merge: сведение ветки «Реклама Телеграм» с боевым main
Слияние feat/client-telegram-ads с main
|
||
|
|
3fdcd88ad3 |
feat реклама за показы: правда про документ, экран «ждёт разбора» и разбор своих ошибок
Задача 16 закрыта решением владельца. Дороги «робот везёт документ в кабинет Яндекса» не существует — доказано двумя нарочными отказами, обычной тематикой и лицензируемой: в окне отказа ноль полей для файла, документы Яндекс принимает только снаружи кабинета. Приём документа оставлен, но портал больше не молчит: клиент приложил файл — в ленту сразу ложится отметка «документ у нас, передать его Яндексу автоматически нельзя, при необходимости отнесём сами и напишем здесь», а владельцу уходит письмо на адрес алертов. Без письма обещание было бы пустым: файл просто лёг бы на диск. Сам файл письмом не отправляем — это чужие бумаги. Обычный ответ без файла ни отметки, ни письма не даёт. Экран «ждёт разбора» в админке: ручка была, экрана не было. Третья карточка на странице «Реклама» — клиент, кампания, что робот делал человеческими словами, номер объявления и на чём споткнулся. В подписи прямо сказано, чего там НЕ будет: обычных отказов, их клиент разбирает сам. Дальше — разбор собственной работы этого дня. Найдено четыре ошибки, все исправлены. 1. ТЯЖЁЛАЯ. Доклад разведки на бою уронил бы очередь заданий целиком. Робот пишет в ленту под служебной ролью, а у неё на этой таблице было только чтение. Отказ по правам, 500 роботу, три повтора — и задание навсегда «в работе». Пока хоть одно задание в работе, выдача отвечает «работы нет» ВСЕМ клиентам. Лечение — запись схемы v9.17: право на запись плюс нумератор. В плане про это было написано прямым текстом, я прошёл мимо. Тесты поймать не могли: ходят суперпользователем. 2. Признак «набор создан» я выдумал: взял метку, которая в нашей же разметке описана как СКРЫТАЯ галочка. Проверка «видно ли её» не сработала бы никогда. Признак с экрана убран совсем: успех определяет портал слепком креативов, а «окно не закрылось» — это норма, так и есть живьём. 3. Сломал ленту для повторного отказа. Поменял защиту от дублей на «такой текст уже когда-либо был» — и клиент, починивший рекламу и получивший тот же отказ, не увидел бы ничего. Вернул сравнение с последним сообщением, а заглушку «причину выясняем» держит теперь сам джоб: показываем один раз, пока сказать нечего. 4. Мой собственный тест оказался пустышкой: оставался зелёным при вырезанной защите. В нём отклонялись ВСЕ объявления, а тогда кампания уходит в «отклонена» и обход её больше не берёт. Сценарий существует только при частичном отказе — тест переписан на два объявления и теперь вырезание защиты его роняет. Портал 391/391, админские экраны 9/9, фронт на затронутых наборах 52/52, робот 74/74, мест снятия заморозки денег по-прежнему четыре. На боевой не выкатывалось, рубильник Директа выключен, живьём разведка не гонялась. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
0ba7890bf9 |
feat реклама за показы: робот-разведчик приносит клиенту причину отказа с экрана кабинета
Задача 15. Программный интерфейс Яндекса причину отказа не отдаёт — на отклонённое объявление приходит «Отклонено на модерации.» и всё. Причина висит только на экране кабинета, и добыть её может лишь тот, у кого есть глаза. Как теперь работает: опрос модерации видит отказ и ставит роботу задание разведки по этому объявлению; робот открывает список объявлений, находит ячейку своего объявления, кликает по статусу, раскрывает строку причины, читает текст и снимает одно окно; доклад уезжает порталу формой вместе со снимком; портал кладёт его в ленту от имени Яндекса слово в слово, клиенту письмо и колокольчик. Робот не понял, что видит — задание сбойное, владельцу письмо, в ленту клиенту ничего не сочиняем. В админке появилась ручка «ждёт разбора». Четыре ловушки, пойманные по дороге и проверенные вырезанием: 1. Дедуп разведки нельзя вешать на кампанию. Отказ никуда не девается, а обход бежит по расписанию: после закрытия первой разведки поставилась бы вторая, и робот ходил бы в кабинет по кругу. Ключ — номер объявления, журнал схемы v9.16. 2. Рубильник держал не выдачу задания, а построение клиента Директа. Разведке слепок креативов не нужен, значит при выключенном рубильнике она получила бы задание, и робот пошёл бы в живой кабинет. 3. Дедуп ленты сравнивал только с последним сообщением Яндекса. После доклада робота обход снова клал бы «причину выясняем» поверх настоящей причины. 4. Постановка разведки шла без tenant-контекста — на бою она не сработала бы ВООБЩЕ и молча: поиск дубля давал бы ноль, запись падала бы на политике доступа, всё это в предупреждение журнала при зелёных тестах. Поймал rls-reviewer. Лечение — своя транзакция с выставлением клиента, рецепт ChargeCampaignSpendJob. Сторож поставлен на сам механизм: обычным тестом это не ловится, они ходят суперпользователем. Заодно: разведке больше не снимается слепок креативов — лишний поход в живой Яндекс внутри открытой транзакции. Портал 382/382, робот 75/75, мест снятия заморозки денег по-прежнему четыре. На боевой не выкатывалось, рубильник Директа выключен. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
23db59bd22 |
docs реклама за показы: экран отказа модерации снят живьём — задача 13 закрыта
Вердикт по нарочно непроходному объявлению пришёл на вторые сутки: «Модератор отклонил объявление · Нет предупреждения: финансовые услуги». Разметка записана в bots/yandex-creatives/docs/cabinet-flow.md §7 вместе со снимком окна отказа. Причина живёт только в списке объявлений — форма объявления знает «Показы не идут» и молчит про модерацию. Окно открывается кликом, не наведением, а подробное пояснение видно лишь после раскрытия строки причины. Два отрицательных ответа важнее найденного: кнопки повторной модерации не существует — Яндекс шлёт на перепроверку сам по факту сохранения правки; прикладывать документ в кабинете некуда — в окне отказа ноль полей для файла, документы уходят наружу через чат или форму обратной связи. Задача 16 остановлена до проверки вторым отказом на лицензируемой тематике — решение владельца. Заодно поправлены даты: работа прошлого захода помечалась 29.07, фактически всё делалось 28.07. Имена миграций не трогали — они уже закоммичены. |
||
|
|
cce04aed86 |
feat реклама за показы: постановка доставки берёт документ только связью от кампании
Второй рубеж защиты документа. Оставлять его на задачу 16 было бы хвостом: сама проверка от экранов кабинета не зависит. enqueueDelivery берёт сообщение связью от кампании, сырой номер в выборку не попадает нигде. Заодно отказывается ставить задание без вложения и не плодит второе, если клиент нажал дважды. Поймана ловушка, заложенная прошлой задачей: постановка обычной заливки искала любое незавершённое задание кампании и с появлением доставки вернула бы её. Запуск решил бы, что креативы уже в очереди, и робот не повёз бы картинки вовсе, молча. Отбор по виду добавлен, тест есть. Нашлось чтением соседнего метода, не тестом и не проверкой. Оба рубежа доказаны вырезанием по отдельности: без проверки в коде чужой документ ловят ключи базы, но уже ошибкой записи вместо понятного отказа. Портал 356/356, робот 60/60, мест снятия заморозки денег по-прежнему четыре. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
a35b28cb15 |
feat реклама за показы: вид задания у робота — отвезти картинки, посмотреть, отвезти документ
Робот умел ровно одно — отвезти картинки в кабинет, и очередь молчаливо означала именно это. Теперь у задания есть вид: upload, inspect, deliver, плюс ссылка на сообщение ленты, документ из которого везём. Умолчание upload обязательно — задания, лежащие в очереди на момент выката, вида не имеют. Внешний ключ на сообщение НЕ защищает от чужого клиента: проверки целостности в PostgreSQL идут в обход RLS, а робот ходит под crm_admin_user с кросс-тенантным доступом. Дыра пока спящая — message_id в бою никто не пишет. Требование проверять принадлежность в коде записано в докблоке миграции, в журнале схемы v9.12 и в приёмочных строках задачи 16. Журнал схемы v9.12, а не v9.11 из плана: тот занят отметкой revived_at. Портал 345/345, робот 60/60, мест снятия заморозки денег по-прежнему четыре. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
bae6b95fda | docs реклама за показы: план работ по отказам модерации — четыре захода с точками компакта | ||
|
|
5211048bce |
feat(телеграм-реклама): Этап 2 закрыт — робот несёт фактическую стоимость (2.2), билинг МТС подтверждён
Задача 2.0 (разведка) — РЕШЕНА без входа в кабинет: ответ уже был в находках Фазы 2. Билинг МТС за «показы своей базе» — НАКОПИТЕЛЬНЫЙ (резерв → списание по факту показов → возврат остатка, экран /payment). Следствие: списание «по факту» (была задача 2.4) на успехе отправки честно сделать нельзя — показов ещё нет; перенесено в Этап 3 (опрос завершения). Этап 2 закрыт составом 2.1 (отмена) + 2.3 (возврат брони) + 2.2. - 2.2 PHP: RobotResult несёт `actualCostRub` (nullable string) — заготовка, чтобы позже (Этап 3) прочитать фактическую стоимость из кабинета и списать её с кошелька клиента. Проброшено в fromRobotJson (робот начнёт класть поле позже; нет поля → null). Мёртвых фабрик launched()/draftReady() не добавлял. - 2.2 Node: чистая утилита `parseCost(text)` в cabinet.js — «Стоимость кампании от 201,6 ₽» → «201.60» (запятая→точка, разделители тысяч включая неразрывный пробел код 160, дробь до 2 знаков без округления, нет числа → null). Вынесена отдельной покрытой функцией; к DOM-потоку НЕ подключена (селектор строки стоимости подтвердим живьём в Этапе 3). - Разведка билинга и решение по 2.4 зафиксированы в FLOW-FINDINGS.md; план Этапа 2 обновлён (2.0 решён, 2.4 → Этап 3, Этап 2 закрыт). TDD, робот замокан, тесты на liderra_testing. Приёмка: Node 40/40 (npm test), Pest RobotResultTest 5/5 + RobotRunnerTest (потребитель) зелёный, регрессия ClientTg 120/120, phpstan RobotResult.php 0, pint чисто, deptrac 0. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
98388ccf26 |
docs(телеграм-реклама): аудит дыр модуля + спека и план закрытия (5 этапов)
Разбор клиентского модуля «Реклама в Телеграме по своей базе» на дыры (4 параллельных код-ревью + личная перепроверка) и план их закрытия. - findings: 14 находок, сгруппированы по серьёзности; главное — вся денежная часть латентна под песочницей, но капканы (залипшая бронь, минимум 367 после freeze, потерянный внешний id, зависшие статусы) сработают при go-live. - spec: решения владельца (бронь→возврат/списание по факту; «своё имя» и авторассылка доделываем; начинаем с безопасности), границы, приёмка по областям. - plan: 5 этапов в порядке 1→2→5→3→4, каждая задача в TDD; этап 3 ждёт живого отказа МТС (Part B). Ревизия 27.07 (разбор самих спеки/плана на дыры): - билинг-модель МТС («от X ₽» = нижняя граница, трата по показам) — выяснить ДО реализации списания (предусловие этапа 2, задача 2.0); - внешний id кампании МТС сохранять РАНО (робот плодит реальные черновики уже на шаге аудитории) — иначе осиротевшие черновики и слепой рефанд; - уборка брошенных черновиков (сегодня чистили руками) — узаконить (задача 3.1b); - уборщик зависших консервативен: при известном mts_campaign_id не рефандит вслепую; - оговорка: тест идемпотентности слабый (dispatchSync последователен). Только документы (docs/superpowers/*). Кода не трогает. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
8053c14665 |
docs(телеграм-модуль): дизайн-спека + план стройки клиентского модуля «Реклама в Телеграме по своей базе»
Модуль-близнец СМС-рассылки, но через робота-в-браузере (у МТС нет API). Спека: цель, что берём из СМС, ключевое отличие (нет провода → робот, пачки ≥367, реальные деньги, модерация), клиентский экран, два режима (ручной + авто с лимитом на объявление), обратная связь по отказу, что требует живой разведки, текст для клиента. План: 6 сессий по ≤250–300k токенов с логичными остановками под /compact, каждая оставляет код рабочим; Сессия 5 (отказ) гейтится живой разведкой Сессии 6. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
1a00e215f5 |
docs робот-грузчик креативов: план работ на 17 задач и промт перезапуска
План — три фазы: ядро переходит на креатив у каждого баннера, канал заданий между порталом и роботом, сам робот-грузчик на Playwright. Попутно чинятся кап веса баннера 150 КБ до 512 КБ и правило модерации, по которому один забракованный баннер валил всю оплаченную кампанию. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |