Атанор: что построено, что стоило, что сломано

Лаборатория из 19 проектов, 474 тикетов и 1089 запусков агентов за восемь дней. Ниже — состояние на 2026-08-18T14:36:14Z: устройство, закрытые дефекты, деньги с указанием покрытия, изменившиеся правила и незакрытое.

Каждое число на этой странице получено командой. Команды и их вывод — в приложении /home/atanor/vault/projects/showcase/NUMBERS.md; журнал зафиксирован на строке 35567, доска — снимком того же момента, поэтому любая команда воспроизводит ровно то, что здесь напечатано.

1. Что такое лаборатория

Очередь тикетов и цикл, который её исполняет. Работа не передаётся разговором: единственный носитель — тикет в state/tickets/, единственный след — событие в state/events.jsonl.

Доска проектов, как её печатает команда
$ cat /home/atanor/vault/projects/showcase/projects-snapshot.txt
allowance            urgent      active   The ceiling guards autonomous work; requested work runs on a project allowance
auditlock            normal      paused   Audit measures something that no longer moves
autoproject          normal      active   Autoproject over the task board
blocked-return       urgent      paused   blocked is a transition with two ends
cli-surface          normal      paused   The launch uses the CLI it runs on
cliguard             urgent      active   atanor commands refuse instead of quietly corrupting the queue
container            urgent      active   A feature is a ticket with children
corelang             normal      active   The core speaks the lab's working language
coremerge            urgent      active   The core installs as one file
demo                 urgent      active   Core check
errand-track         urgent      active   The errand track: one address takes any request, and an answer comes back
flowguard            urgent      active   Work that arrived or was started cannot go unnoticed
killclock            urgent      active   Work the lab stopped is not counted as a failed ticket
labshape             urgent      active   Athanor as an organisation: checking is bought, dead entities are killed
plandiff             background  active   Diff of the plan against the calendar
runguard             urgent      active   An agent launch either arrives or is named as the reason
showcase             urgent      active   The lab's shop window: one page showing what was built, what it cost, and what is still broken
spectruth            urgent      active   The master spec describes the running system, and a script says when it stops
supervisor-inbox     normal      active   One inbox per supervisor: every input reaches a supervisor as an envelope at an address

2. Что было сломано и что теперь работает

Доказательство «до» и «после» берётся из журнала событий: каждый запуск, каждый обрыв сторожем и каждый отказ гейта — отдельная строка. Ниже — весь журнал на момент сборки, разложенный по видам событий; числа в этом блоке и в блоке про деньги суть срезы этой же таблицы.

Журнал событий: всего и двенадцать самых частых видов, как их печатает команда
$ head -n 35567 state/events.jsonl | python3 -c "import sys,json,collections;e=[json.loads(l) for l in sys.stdin];print('%-19s %d'%('events total',len(e)));print('\n'.join('%-19s %d'%kv for kv in collections.Counter(x['kind'] for x in e).most_common(12)))"
events total        35567
gate_closed         31093
ticket_updated      1468
agent_started       1089
agent_finished      1056
ticket_created      475
review_queued       93
dep_wait            68
two_strikes         38
project_status      36
agent_killed_stale  25
project_created     19
order_taken         17

Шторм перезапусков 12 августа

Провалившийся тикет перезапускался через одиннадцать секунд. За сутки ядро выдало 800 запусков — при том, что за все остальные семь дней их 289. Худший тикет забрал T-cb6f7b82 — 196 запусков на одну задачу. Сторож оборвал 25 прогонов, и «две неудачи подряд» сработали в тот день 26 раз — из 38 за всю неделю.

Теперь: после 12 августа сторож оборвал 0 прогонов, и «две неудачи подряд» сработали 2 раза — как правило, а не как поток. Проекты runguard и killclock закрыли это тем, что провал теперь стоит попытки, а не мгновенного повтора.

Сторож резал живую работу на 12-й минуте

Порог stale_minutes стоял на 12 минутах при том, что прогон честно работает дольше: остановленная работа записывалась как провал тикета. Решение T-23f33ad6 подняло порог; сейчас в state/config.json стоит 45 минут, и с 12 августа ни один прогон не оборван (0 событий agent_killed_stale).

Команда, которая молча портила очередь

Проект cliguard: atanor ticket add --help вместо справки создавал пустой тикет. Теперь неверный ввод — отказ с кодом 2 и причиной в stderr, и ни один файл очереди не меняется. Правило проверено приёмкой, а не осмотром: у проекта 91 прогонов приёмки на всю лабораторию, и приёмка каждого проекта сперва показана на отрицательном контроле — она обязана провалиться на состоянии «до».

Что здесь считается доказательством

Числа «до» взяты из журнала событий, а не из отчётов о работе. Исправление без числа «до» на эту страницу не попадает: оно недоказуемо.

3. Что это стоило

Посчитанный расход — 963.70 USD с 2026-08-11 по 2026-08-18, в среднем 2.66 USD за прогон.

Покрытие: 34 %. Стоимость записана у 362 прогонов из 1056 собранных; остальные записаны с нулём. Названная сумма — это не то, что лаборатория потратила, а то, что она сумела записать. Разница — открытый дефект T-25b84520: прогон, чей родитель пережил его, оставался зомби, запись state/runs/ не создавалась, и деньги не входили ни в один счётчик. Причина найдена и исправление лежит в ядре, тикет ещё не закрыт.

Посчитанный расход по дням, USD
08-116.45
08-12371.98
08-13186.28
08-14181.52
08-15119.41
08-16нет данных
08-17нет данных
08-1898.05

16 и 17 августа не несут ни одного собранного прогона: 3 запуска, 0 завершений. Ядро при этом было живо — за те же двое суток 5159 отказов гейта. Это и есть тот же дефект T-25b84520, увиденный с другой стороны: молчание в деньгах не означало молчания в работе.

Тикеты по статусам на момент сборки
$ python3 -c "import json,collections;c=collections.Counter(t['status'] for t in json.load(open('/home/atanor/vault/projects/showcase/board-snapshot.json')));print('\n'.join('%-12s %d'%kv for kv in sorted(c.items(),key=lambda x:-x[1])))"
done         341
canceled     63
todo         58
in_progress  9
in_review    3

4. Что изменилось в правилах, под которыми вы работаете

5. Что не сделано

Открытых дефектов — 20, тикетов в работе и в очереди — 67 при 341 закрытых. Ниже доска, а не выборка.

В работе прямо сейчас

Открыты и не начаты

Прочее, что лаборатория знает про себя