Фабрика проектов · устройство · черновик 15.11.2026
Вся работа лежит в одной книге учёта. Двигает её одна программа, диспетчер. Агенты живут в Herdr. Сергей говорит только с pi.
Состояние на 15.11.2026. Фабрика собирается. На mini ничего не включено.
01 · Обзор
Частей пять. Между собой они не переписываются. Каждая читает книгу учёта и пишет в неё. Если часть упала, после запуска она видит в книге то же состояние и продолжает с того же места.
02 · Одна просьба
Сергей говорит pi: «перекрасить кнопку в зелёный». Схема показывает путь этой просьбы до слова «сделано». Номер слева на схеме совпадает с номером шага под ней.
На схеме нет трёх вещей. После второго возврата диспетчер запускает арбитра на третьей модели. Арбитр решает под своим именем, и спор на этом кончается.
Если задача требует выкладки и откат проверен, диспетчер запускает выкладку. После неё задача становится сделанной.
Если работа встала на любом шаге, в книге записана причина и чего задача ждёт. О беде диспетчер сообщает сразу.
03 · Задача
Состояние задачи меняется только по списку разрешённых переходов. Список лежит в базе, и база отклонит любой другой переход. У каждого перехода записано, кто имеет право его сделать.
| Переход | Кто может | Что это закрывает |
|---|---|---|
| Взять задачу в работу | Только диспетчер | Двое не берут одну задачу. Взятие не зависит от памяти исполнителя. |
| Сдать работу | Только исполнитель, с доказательством | Слово «готово» без доказательства сдачей не считается. |
| Принять или вернуть | Только приёмщик. Тот, кто сдал, принять не может | Никто не закрывает свою работу сам. |
| Решить спор | Только арбитр, после второго возврата | Спорная сдача не крутится без конца. |
| Поставить «ждёт» | Тимлид, pi, исполнитель или диспетчер. Причина и чего ждёт обязательны | Ничто не стоит без записанной причины. |
| Снять | Тимлид или pi, под своим именем и с причиной | Ничто не закрывается само. Сергей видит список снятого. |
| Вернуть снятое | pi или нить, по слову Сергея | Сергей возвращает любое снятое одним словом. |
04 · Диспетчер
Диспетчер повторяет один и тот же круг из девяти шагов. Всё, что ему нужно, лежит в книге. Поэтому после сбоя он продолжает с того же места.
Одну задачу диспетчер перезапускает не больше трёх раз. Дальше он ставит вопрос pi.
Число исполнителей одновременно ограничено нагрузкой mini. Это число видно в сводке.
05 · Книга
Агент не пишет в базу напрямую, только командой board. Запреты записаны в самой базе, а не в программе.
06 · Прошлое
Ничего не выбрасываем. Старые доски и файл бэклога один раз переносятся в книгу. Все записи остаются архивом для чтения. Всё открытое получает пометку «на разборе» и тимлида проекта.
После переноса бэклог проекта равен списку его задач в книге. Другого места нет.
Повторный перенос без слова Сергея невозможен. Книга помнит, что перенос был.
Задачи без проекта разбирает pi. Поручения, которые раньше до pi не дошли, тоже попадают к нему на разбор.
Что готово сегодня: в сборке перенос открытых записей. Перенос всего архива в книгу добавляется следующим шагом.
07 · Сергей
От Сергея нужно только слово, и говорит он его одному агенту, pi. Фабрику он видит тремя способами. Ночью всё приходит так же, как днём.
| Счётчик в каждой сводке | Цель |
|---|---|
| Потерянные просьбы | ноль |
| Сделанное повторно | ноль |
| Закрытое без приёмки | ноль |
| Решения и письма от имени Сергея без его слова | ноль |
| Задачи, которые стоят без записанной причины | ноль |
| Брошенные задачи | ноль |
| Проекты без движения, по которым Сергею не принесён вопрос | ноль |
| Повторные слова Сергея об одном и том же | ноль |
| Сорванные сроки | видны все |
| Вопросы, которые ждут слова Сергея | видны все |
08 · Поломки
Каждая часть после запуска читает книгу и продолжает. Поэтому поломка одной части не теряет работу.
| Что сломалось | Что происходит |
|---|---|
| Умер исполнитель | Диспетчер видит это при сверке с Herdr. Задача возвращается в очередь с причиной, её берёт другой исполнитель. |
| Умер тимлид | Диспетчер запускает нового и выдаёт ему «что на тебе» из книги. |
| Упал диспетчер | Операционная система запускает его снова. Он читает книгу и продолжает. Сторож проверяет отметку «диспетчер жив» и шлёт беду, если она устарела. |
| Перезагрузился mini | Диспетчер стартует сам, сверяет книгу с Herdr, поднимает тимлидов и возвращает в очередь задачи умерших исполнителей. |
| Молчит pi | Диспетчер шлёт Сергею сообщение о беде напрямую, мимо pi. |
| Кончился лимит подписки | Диспетчер записывает это отдельным состоянием. Агентов не убивает. |
| Испортилась база | Каждый час делается снимок базы. Хранятся пять последних. |
| Код фабрики поправили мимо git | Диспетчер на каждом круге сверяет свою версию с git и пишет расхождение в состояние. |
09 · Решения
Сергей выбрал три вещи: своя книга и диспетчер, один собеседник pi, команда board остаётся и пишет в книгу. Четырнадцать решений ниже приняла нить bb. Сергей вычёркивает любое.
| № | Решение | Где сломается |
|---|---|---|
| 01 | База SQLite одним файлом, программа на Python без сторонних пакетов | Один файл на одной машине. Защита: ежечасные снимки. |
| 02 | Запреты стоят в самой базе | Запрет, который забыли записать, не сработает. Защита: каждый плохой случай стал проверкой. |
| 03 | Взятие записывает диспетчер, а не исполнитель | Исполнитель, запущенный мимо диспетчера, в книге не виден. Защита: сверка с Herdr на каждом круге. |
| 04 | Задача в работе, только пока жив её исполнитель | Агент жив, но стоит. Защита: простой меряется тишиной. |
| 05 | Тимлид без постоянной памяти, с выдачей «что на тебе» | Причину решения, которую тимлид не записал, не восстановить. |
| 06 | Приёмщик всегда на другой модели | Обе модели ошиблись одинаково. Защита: арбитр на третьей. |
| 07 | Вопрос к Сергею не имеет ответа по умолчанию и повторяется в каждой сводке | Вопросов накопится много. Защита: счётчик в сводке. |
| 08 | Сводку и ответ «что сделано» собирает программа, pi только передаёт | Программа пишет сухо. pi может дописать от себя, факты менять не может. |
| 09 | Лимит подписки записывается отдельным состоянием | Лимит не всегда отличим от зависания. |
| 10 | Предел исполнителей одновременно, по нагрузке mini | При малом пределе очередь растёт. Число видно в сводке. |
| 11 | Не больше трёх перезапусков одной задачи, дальше вопрос pi | Задача с настоящей трудностью уйдёт к pi рано. |
| 12 | Перенос старого однократный | Забытое при переносе придётся вносить руками. |
| 13 | Имя агента задаёт запускающая программа, а не сам агент | Без отдельных учётных записей системы агент может подделать имя. Защита: всё, что записано от имени Сергея, видно в сводке. |
| 14 | pi durable в фабрике сегодня не используется | Тимлида можно заменить позже, не трогая книгу. |
10 · Слово Сергея
Фабрика собирается. На mini ничего не установлено и не включено. Без слова Сергея не делаются три вещи.
Приёмка сегодня: шесть плохих случаев на настоящей задаче. Одну просьбу подали дважды. Исполнителя убили посреди работы. Фабрику перезапустили. Агент пытается записать решение от имени Сергея. Агент говорит «готово» о несделанном. Задачу бросили.