Атанор: что построено, что стоило, что сломано
Лаборатория из 19 проектов, 474 тикетов и
1089 запусков агентов за восемь дней. Ниже — состояние на
2026-08-18T14:36:14Z: устройство, закрытые дефекты, деньги с указанием покрытия,
изменившиеся правила и незакрытое.
Каждое число на этой странице получено командой. Команды и их вывод —
в приложении /home/atanor/vault/projects/showcase/NUMBERS.md; журнал
зафиксирован на строке 35567, доска — снимком того же момента, поэтому
любая команда воспроизводит ровно то, что здесь напечатано.
1. Что такое лаборатория
Очередь тикетов и цикл, который её исполняет. Работа не передаётся разговором: единственный
носитель — тикет в state/tickets/, единственный след — событие в
state/events.jsonl.
- тикЯдро просыпается, читает доску и решает, кого запускать. Отказ запуска —
тоже запись:
gate_closed с причиной.
- гейтПроверка расхода и потолков до запуска. За неделю гейт отказал
31093 раз — это не сбой, это работающий предохранитель.
- рольДиректор режет заказ на проекты, лидер — на волны, кодер делает,
ревьюер проверяет приёмкой, аудитор меряет проект против спецификации, методист правит
правила. Роль — это промпт и границы, а не человек.
- прогонАгент получает тикет, границы и последние заметки; пишет результат
в файл. Что не попало в файл, того не было: прогон переживает только записанное.
- приёмкаТикет закрывает проверка, а не слово исполнителя. Правило приёмки
формулируется наблюдаемо: команда на входе, результат на выходе.
- сторожПрогон живёт не дольше 45 минут, тикет —
не дороже 12 USD; превышение обрывается, а не копится.
- 341тикетов закрыто приёмкой
- 91прогонов приёмки
- 17аудитов этапа
- 40дефектов закрыто
Доска проектов, как её печатает команда$ 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-11 | | 6.45 |
|---|
| 08-12 | | 371.98 |
|---|
| 08-13 | | 186.28 |
|---|
| 08-14 | | 181.52 |
|---|
| 08-15 | | 119.41 |
|---|
| 08-16 | | нет данных |
|---|
| 08-17 | | нет данных |
|---|
| 08-18 | | 98.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. Что изменилось в правилах, под которыми вы работаете
- Судо больше не ваше. С 13 августа корневые команды переданы управляющему
насовсем. Вам не нужно заходить под root, чтобы лаборатория поставила себе исправление.
- Решения, требующие вашей команды, стоят в одном файле.
vault/Decisions-for-Vsevolod.md: одна строка — одно решение и одна команда
проверки. Строку снимает тот прогон, который увидел совпадение состояния, и цитирует вывод.
Вам не нужно помнить, что кому вы обещали: список пуст ⇔ всё исполнено.
- Любое сообщение становится тикетом. Проект
errand-track: один адрес
принимает произвольную просьбу, ответ возвращается по ней же. Вам не нужно знать, какому
проекту адресовать вопрос.
- Число называется командой, а не прилагательным. Правило приёмки требует
наблюдаемой формулировки: «работает корректно» — не правило. Поэтому у этой страницы есть
приложение, а не список утверждений.
- Отсутствие находки — законный результат. Заводить тикет ради полноты запрещено,
и отчёт «ничего не разошлось» — это отчёт, а не пустая работа.
- Лаборатория работает по-английски. Все внутренние документы, тикеты и заметки —
английские; по-русски пишется то, что адресовано вам, как эта страница. Причина ваша:
язык директора протекает внутрь проектов.
5. Что не сделано
Открытых дефектов — 20, тикетов в работе и в очереди —
67 при 341 закрытых. Ниже доска, а не выборка.
В работе прямо сейчас
T-3303b9e1 showcase — Spec rule 9 fails: the page shows two quoted state snapshots, not three
Открыты и не начаты
T-0b70b802 runguard — Resume-failure path unprobed, and the SPEC sentence misstates what attempts gainsT-1c7579c5 cliguard — A wrong ticket title cannot be corrected: 'atanor ticket set' has no --titleT-26a575cb blocked-return — CT.4 counts as safe a status write it does not classify: a != / not-in guard, a tuple target, a match bodyT-36d7c593 errand-track — The Boundaries block forbids the two vault-root writes the director's role text ordersT-3db1bd6e allowance — The stuck-project alert never reads the gate: a shut ceiling files one priority-1 director question per active project per dayT-4630c753 allowance — SPEC.md line 160: the acceptance rule tests a number Vsevolod moves, so it can neither pass nor failT-4c876803 runguard — The running core has no rollback point: the 2026-08-15 install left no atanor.py.backupT-71c90f15 runguard — SPEC.md does not name the starvation report its own acceptance measuresT-808d85ef killclock — advance_projects() counts a closed audit as a silent round without checking it produced a reportT-80f36730 labshape — Audit runs per ticket against his decision that it runs per stageT-81ee750b cliguard — SPEC.md check 5 names state/cfg/<ticket>/prompt.txt, a path the installed core no longer writesT-98d9db22 coremerge — MEMORY.md: killclock differential claims controls 1.2 and 2.2 pass on the runguard copy; both failT-9ebb20fa killclock — acceptance.py: промпт() and its failure message name state/cfg/<ticket>/prompt.txt, which the core never writesT-b0d6c413 auditlock — The audit template names a 12.8 minute run window and stale_minutes 12: config.json and the core both say 45T-b2543b18 runguard — A mid-stream stall pauses the whole lab as a provider refusal: api_error arrived without a 429T-cb23ff4e runguard — negative-control.py has no corruption for sections 5 and 6: the power of six probes lives only in a transcriptT-e5bd7c01 runguard — The near wall is invisible: Status.md reports 10 % of a quota the lab cannot reachT-eeaa4f94 вне проекта — ticket_budget_usd is written onto every ticket and read by nothing: 24 runs of 1009 spent more than the ceiling they carryT-fd4146dc labshape — A role-file edit deletes every session of that role: the memory he asked for three times is wired to the lab's most-edited file
Прочее, что лаборатория знает про себя
- Активных проектов 16 при потолке 10.
Потолок записан в
state/config.json как max_active_projects и
сейчас превышен: проекты ставились на паузу и снимались с неё несколько раз за сутки.
На паузе стоят auditlock blocked-return cli-surface — их предмет ждёт очереди и в эту
неделю не входит.
- Долларовый гейт открыт полностью —
budget_normal_pct и
budget_emergency_pct стоят на 100 по вашему прямому указанию от 18 августа,
с возвратом к 20/30 после 19-го. Пока он открыт, ограничителем служит реальный лимит
провайдера, а не внутренняя оценка.
- Собственная оценка расхода неточна по построению — см. блок 3: покрытие
34 %. Пока
T-25b84520 не закрыт, любое число про деньги здесь —
нижняя граница.
- Отменённых тикетов 63
при 341 закрытых. Часть из них — работа, переформулированная после провала,
и лаборатория не отделяет одно от другого автоматически.