Кто кого проверяет
Приёмка держится на простом устройстве: у результата есть получатель, которому он нужен, и получатель замечает брак. Дефекты выживают там, где получателя нет — результат не адресован никому конкретно либо адресат не отличит хорошее от плохого.
| Что портится | Почему незаметно | Кого назначить приёмщиком |
|---|---|---|
| Раздача задач по зонам | У чужой задачи по бумаге уже есть ответственный | Получатель пакета: явное «моё / не моё» по содержанию |
| Правило, введённое координатором | Его собственную работу никто не принимает | Он сам: тот же чек-лист до рассылки |
| Автозапуск по расписанию | Тишина читается как «нечего сообщить» | Монитор: ненулевой код и знаменатель в итоге |
| Гард и блокировки | Ложное срабатывание выглядит строгостью | Регрессия из случаев, включая «должен пропустить» |
Раздача по метке вместо содержания
Сортировка шла по полю «чат» и по префиксу идентификатора, и ошиблась в обе стороны сразу. Чужое выглядело своим: восемь задач с профильным префиксом оказались продвижением основного сайта — абонемент на вывоз, дубль страницы на соседнем сайте, защита бренд-сущности от постороннего агрегатора, сверка расстояний межгорода. Префикс означал не тему, а автора карточки.
Своё выглядело чужим: четырнадцать задач одного продукта, среди них две высшего приоритета, несли метку с именем чата, который их завёл. По содержанию — профильная зона, но в раздачу они не попали и месяц не велись никем.
Почему это дороже обычной ошибки сортировки. У задачи, уехавшей не в ту зону, по бумаге уже есть ответственный — поэтому её никто не хватится. Чужая встанет молча, своя не попадёт в реестр вообще. Тот же класс, что «сделано, но не доехало», только на уровне распределения.
Рабочее правило: зона определяется по содержанию — какие файлы правит задача и чей это источник истины. Классификатор по ключевым словам годится как черновик, но его выход обязан проходить через получателя. Увидел чужой файл в своей карточке — вернуть распорядителю, а не молча делать; увидел свою тему под чужой меткой — попросить забрать. Возврат фиксируется в самой панели задач, иначе передача живёт в переписке, а переписка исчезает вместе с чатом. Измеримый признак поломки — доля возвратов: расхождение восьми «по метке» и одной «по содержанию» означает, что раздачу переделывают целиком, а не правят пару карточек.
Правило вводится с себя, в тот же ход
Координатор разослал всем зонам требование прогонять проверку «не делали ли это уже» перед любой задачей. Через час он раздал добор из 46 чатов, не прогнав её ни разу. Владелец указал на это четырежды подряд, и все четыре раза был прав: анализ вакансий — задача давно закрыта; один клиентский проект — 5 коммитов в основной ветке; другой — 3 закрытые задачи; межгородний тариф — коммит есть, 89 страниц.
Цена одного пропущенного прогона. Шесть чатов из десяти в этом доборе закрылись доказательством без единой строки работы. Проверка занимает минуты, добор занимал день.
Координатор освобождён от исполнения задач, но не от собственных правил, и нарушаются они на нём незаметнее всех: его работу никто не принимает. Лечится порядком, а не силой воли — прежде чем требовать проверку от зон, прогнать её на своей раздаче тем же чек-листом.
Автоматика без обратной связи: тишина и размножение — одна болезнь
Два зеркальных случая за двое суток. Сборщик материалов «работал», пока планировщик отклонял запуск: результат последнего прогона никто не смотрел, а тишина читалась как «новых материалов нет». Через день два сторожа в планировщике поднимали новые сессии, не проверяя, жив ли предыдущий экземпляр: 21 процесс приложения примерно на 12 реальных чатов, свободно 2 ГБ из 16, машина падала.
Симптомы противоположны — не отработала ни разу против отработала слишком много раз, — а первопричина одна: у автоматики нет обратной связи. Отсюда три требования к автозапуску.
- Знаменатель в итоге и ненулевой код при провале. «Опрошено 23 из 23 источников» вместо «собрано 9» — тогда отказ виден в штатном мониторе, а не только в логе, который не читают.
- Проверка живости предыдущего экземпляра перед стартом и громкое падение, если он жив: в планировщике это политика «не запускать новый», для скриптов — файл блокировки с идентификатором процесса.
- Закрывать за собой тяжёлые ресурсы. Где хватает запроса из командной строки, браузер не поднимать вовсе.
Проверяется всё это счётчиком процессов и свободной памятью до и после запуска. У нас это стало нулевым тактом конвейера — «здоровье среды», с порогами 14 процессов приложения, 30 браузерных, 8 интерпретатора и минимумом 2 ГБ свободной памяти. Первый прогон сразу дал красное — 21 при пороге 14 и 53 при пороге 30 — при том, что все три рабочих такта цикла были зелёными. Отсюда формулировка вердикта: «такты давно не выполнялись» и «среда нездорова» — разные болезни, в одну строку их сливать нельзя.
Гард, который сам никем не принят
Гард выкладки взял рабочий каталог сессии, посмотрел ветку основного проекта, увидел отставание на один коммит и заблокировал заливку совсем другого репозитория — того, к которому эта ветка отношения не имеет. У целевого репозитория удалённого хранилища не было вообще: работа жила в единственном экземпляре, и гард мешал ровно тому действию, которое эту дыру закрывало.
Вторая мина того же гарда. Он срабатывал и на текст: запись самого урока о нём через многострочную вставку блокировалась как настоящая выкладка — внутри вставки строка начинается с новой, и стартовый шаблон принимал её за команду. Инструмент дисциплины запрещал документировать то, что сам же требует описывать.
Починили, а не обошли: каталог берётся из самой команды, при отсутствии основной ветки у цели сравнение «позади основной» пропускается с явной пометкой, а тело многострочной вставки вырезается перед проверкой — кроме случая, когда оно скармливается оболочке. Приёмка правки — регрессия из четырёх случаев, два из них про «должен пропустить»: заливка стороннего репозитория — пропуск; отставшая ветка основного — блок; текст урока во вставке — пропуск; команда внутри вставки для оболочки — блок. Защита не ослабла ни в одном, а набор «должен пропустить» тут важнее: обходить прибор учат именно ложные срабатывания.
Что делать у себя
- Раздачу принимает получатель. Пакет считается розданным после явного «моё / не моё» по содержанию, а не после отправки.
- Для каждой задачи назвать файл или каталог, который она меняет. Не называется — зона не определена, и метка тут не поможет.
- Своё правило прогонять на себе до рассылки. Требование, введённое без собственного прогона, читается как формальность и исполняется так же.
- У автозапуска — знаменатель, код возврата и защита от второго экземпляра. Молчание не сигнал: сигналом становится только явный итог.
- Гардам — регрессионный набор с ложными срабатываниями. Прибор, который блокирует лишнее, обходят, и через месяц он не защищает ничего.
- Передачи и статусы держать в панели, а не в переписке: всё, что живёт в чате, исчезает вместе с чатом.
Ошибка исполнителя стоит одной задачи. Ошибка того, кого никто не принимает, — раздачи, правила, автомата, гарда — тиражируется на всех и всплывает через месяц.