Глоссарий¶
Эта страница — терминологическая база документации flower. У одной вещи по всему сайту ровно одно название, соответствие китайского и английского зафиксировано здесь — переводы идут по этой же таблице.
Для каждого термина даётся три вещи: что он означает, чем он является в коде, чем он не является. Третье обычно полезнее всего, потому что большинство недоразумений возникает, когда одно слово принимают за другое.
Фреймворк и прогон¶
Долгий горизонт¶
long-horizon
Один прогон растягивается на часы или дни, охватывает несколько сессий, переживает перезапуски процесса — это не «вопрос-ответ». Все механизмы flower существуют ради того, чтобы такой прогон не развалился на полпути.
Замер для ориентира: HT001 отработал 10.4 часа подряд.
Прогон¶
run
Полный путь одного Runtime от начала до конца. Внутри одного прогона может быть несколько шагов, несколько сессий, его можно прервать и потом продолжить. Записи прогона ложатся в runs/manifest.json и runs/sessions.db.
Не является: одним вызовом API, и не является одной сессией.
Сессия¶
session
Один контекст на стороне модели. У неё есть свой session_id, её можно resume, можно fork. Один прогон может сжечь несколько сессий — при каждом хэндоффе заводится новая.
Шаг¶
step · Step
Исполняемая единица внутри рабочего процесса. Получает словарь контекста, запускает агента, записывает результат обратно в словарь. Step — это класс, см. Python API.
Рабочий процесс¶
workflow · Workflow
Набор шагов, связанных в последовательность, плюс правила передачи состояния между ними и условия досрочного выхода.
Фреймворк не поставляет готовых процессов
flower даёт только механизмы. Процесс пишете вы. См. Проектирование процесса.
Роли¶
Роль — это способ flower разделить труд между агентами. Каждая роль = кусок внедряемого текста правил + набор инструментов + набор hook'ов. Все пять ролей — фабричные функции, см. Python API.
Координатор¶
coordinator · coordinator()
Тот самый агент в главном потоке. Он разбирает задачу, раздаёт работу, читает отчёты, принимает решения, но сам руками не делает — Write / Edit ему не выдаются. Базовые инструменты — Agent, TodoWrite, Read (roles.py:27), но это не итоговый список: по параметрам сверху добавляются ещё три вещи. glance=True (по умолчанию) добавляет урезанный Bash (хватает только на команды вида git status / ls, которые отрабатывают за один взгляд, за этим следит delegate_guard); если задан канал вопросов — добавляются inbox и ask; если у подчинённых исполнителей есть WebFetch / WebSearch, эти два тоже подмешиваются — allowed_tools действует на уровне сессии, и без подмешивания subagent при собственном вызове застрянет на согласовании прав, на которое некому ответить (roles.py:513-526).
Роль задаётся как «человек, умеющий пользоваться Claude Code», а не как исполнитель.
Не является: более умным агентом. По умолчанию он и исполнитель работают на модели одного класса; экономится контекст, а не модель.
Исполнитель¶
worker · worker()
subagent, который реально делает работу: пишет код, гоняет тесты, ищет материалы. Инструменты: Read Write Edit Bash Glob Grep WebFetch WebSearch.
Формат ответа ограничен текстом правил до четырёх разделов — вывод / основания / результат / непроверенное, не более 30 строк, запрещено вставлять содержимое файлов, вывод команд, логи и сырые diff'ы.
Уточнитель¶
clarifier · clarify()
Роль, которая выясняет требования до начала работы. Она ничего не делает, только задаёт вопросы — до тех пор, пока не станет ясно (лимита на число раундов нет), и в конце выдаёт бриф требований. См. Предварительное уточнение.
Судья¶
judge · judge()
Роль, которая решает, «сделано или нет». Она делает одно из двух: до старта ставит цель (выдаёт цель + чек-лист проверки) или после каждого раунда выносит решение по раунду (выдаёт вердикт). См. Страж цели.
Ключевое: судья судит результат, а не исходники.
В HT001 на этом уже прокололись: критерий приёмки был «запускается прямо в терминале macOS», а у сданного артефакта file выдавал ELF 64-bit LSB pie executable, ARM aarch64, GNU/Linux — и вердикт при этом был «пройдено».
Два момента надо проговорить, иначе пример прочитают неправильно:
- Ошибся тогда не страж цели — в HT001 этого механизма ещё не было; ошибся аудитор, которого координатор отправил по собственной инициативе.
- Судья в конфигурации по умолчанию, скорее всего, тоже это пропустит. У
judge()по умолчаниюcan_run=False, инструменты толькоRead/Glob/Grep— он не может запуститьfile, он лишь прочитаетMakefile, увидит там ветку Darwin и признает цель достигнутой.
Реально сработало в HT002: у судьи был включён judge_can_run, он сам запускал file и lsof, смотрел на фактическое состояние и явно обошёл эту яму. То есть фраза «судить результат» встаёт на ноги только при can_run=True.
Оракул¶
oracle · oracle()
Только читающий боковой канал. Пока прогон идёт, вы можете спросить у него «где мы сейчас», он посмотрит последние события и верстак и ответит. Сказанное им не попадает в контекст этого прогона — вопрос не влияет на прогон, ответ выбрасывается сразу после.
subagent¶
Понятие Claude Agent SDK: дочерний агент, которого основной агент отправляет через инструмент Agent. У него собственный transcript, вызовы инструментов и попытки-ошибки пишутся туда, а в главный поток приходит только итоговый отчёт.
Это первый слой экономии контекста в flower и слой, дающий наибольшую экономию. См. Экономика контекста.
Четыре механизма¶
Предварительное уточнение¶
clarify
До начала работы выяснить требования, заморозить их в брифе требований и только потом приступать. Защищает от «сделали не то, что хотели». См. Предварительное уточнение.
Бриф требований¶
brief · Brief
Документ, который уточнитель выдаёт после опроса, ровно четыре раздела. Последующие шаги читают его и больше не гадают, что требовалось.
Не путайте с брифом задачи. Бриф требований — это «чего хочет человек», бриф задачи — «что этот subagent делает вот сейчас».
Бриф задачи¶
task brief
Тот текст, который координатор пишет исполнителю, раздавая работу. Только то, что специфично для этой задачи — дисциплину, которую адресат и так знает, пересказывать не нужно.
Замер: 8/8 брифов задач пересказывали уже известную адресату дисциплину; в самом коротком из них на 521 символ приходилось около 120 символов, специфичных для задачи — примерно 4.8k впустую занятого постоянного контекста за раунд.
Страж цели¶
goal guard
Судья после каждого раунда независимо выносит решение, достигнута ли цель, и если нет — отправляет работу обратно. Защищает от «сказали, что готово, а на деле нет». См. Страж цели.
Вердикт¶
verdict · Verdict
Результат одного раунда судейства, ровно три раздела: вывод / обоснование / что не прошло.
Выводов три вида: ACHIEVED (достигнуто), NOT_YET (ещё нет), UNREACHABLE (в этой среде не проверить). Последние два — разные выводы: «здесь нельзя проверить» никогда не засчитывается как пройдено.
Непрерывность¶
continuity
Повторный запуск в том же каталоге автоматически подхватывает прогресс прошлого раза — так же и после убитого процесса, и после перезагрузки машины. Защищает от «упало после нескольких часов, начинаем сначала». См. Непрерывность.
Не путайте с хэндоффом: непрерывность подхватывает прошлый прогон между процессами, хэндофф заводит новую сессию внутри одного прогона.
Хэндофф¶
handoff
Когда контекст почти заполнен, текущая сессия пишет документ хэндоффа, который человек может прочитать и поправить, после чего дело принимает новая сессия. Защищает от «контекст заполнился, всё сжали в одну сводку». См. Хэндофф.
Это не compact. См. compact.
Документ хэндоффа¶
handoff document · Handoff
Документ, который пишется при хэндоффе, пять разделов: doing (что делается), decided (что решено), deadends (тупиковые пути), next (следующий шаг), scene (обстановка).
Обязательны только doing и next — жёсткое требование непустых «тупиковых путей» заставит модель их выдумывать.
compact¶
compact
Родной приём Claude Code: контекст заполнился — предыдущий диалог сворачивается в сводку.
flower им не пользуется, вместо него — хэндофф. Разница в том, что сводку генерирует модель: её нельзя прочитать и поправить, и вы не знаете, что потеряно; документ хэндоффа структурирован, лежит на диске, вы можете открыть его, поправить строку и дать работе продолжиться.
Управление контекстом¶
Главный поток¶
main thread
Контекст той сессии, в которой находится координатор. Это единственный контекст, проходящий через весь прогон, поэтому экономить его нужно в первую очередь.
Как главный поток определяется в коде: в данных hook'а нет agent_id. У hook'ов subagent'ов agent_id есть.
Верстак¶
workbench · Workbench
Рабочий каталог на диске, три подкаталога:
| Каталог | Что кладётся |
|---|---|
scripts/ | Скрипты, которые понадобится запустить второй раз; в первой строке # desc: одна фраза |
artifacts/ | Длинные результаты свыше 2000 символов |
notes/ | Ключевые решения, одно решение — один файл |
INDEX.md — индекс этих трёх каталогов, он внедряется в system prompt, поэтому агент в каждом раунде знает, что у него на руках.
Две точки входа, два места по умолчанию
Где окажется верстак, зависит от способа его создания — на этом легко споткнуться:
| Способ создания | Корневой каталог верстака |
|---|---|
Workbench(workspace) — этим же путём идут starter_flow() / wake_state() | <рабочая область>/.flower |
Runtime(workbench=True) | <run_dir>/workbench (по умолчанию runs/workbench) |
Командная строка идёт первым путём, поэтому запуск flower даёт .flower/; а вот прямой Runtime(workbench=True) из Python даёт runs/workbench. Хотите задать место — передавайте готовый экземпляр Workbench, не полагайтесь на значение по умолчанию.
Индекс subagent'ам не наследуется
Индекс идёт через system_prompt.append уровня сессии, subagent его не получает. Поэтому правило «длинные результаты пишем в artifacts/» обязан пересказать координатор в брифе задачи — это единственный канал.
Сброс на диск¶
spill
Когда результат инструмента превышает порог (по умолчанию 4000 символов), hook PostToolUse записывает его в <корень верстака>/spill/, а в контексте остаётся одна строка с путём.
Путь идёт следом за верстаком, он не зашит намертво — только когда верстак лежит в месте по умолчанию <рабочая область>/.flower, путь оказывается ровно .flower/spill/. При включённой изоляции, когда верстак уведён за пределы репозитория через home=, spill переезжает вместе с ним.
Режется на месте, а не откладывается до заполнения контекста, чтобы потом делать compact.
Одноразовая команда¶
ephemeral command
Команда, результат которой протухает и не имеет ценности для хранения — ls, git status, ps и подобные. Их результаты не попадают в постоянную запись сессии. Решения «пускать ли главный поток разок глянуть» и «будет ли результат срезан» принимает одна и та же функция, поэтому два множества всегда совпадают.
Усечение¶
trim · TrimmingSessionStore
Перед resume переписывает ту порцию сообщений, которая пойдёт обратно в модель (результаты одноразовых команд, сверхдлинный вывод инструментов).
Оно переопределяет только load(): оригинал в SQLite остаётся нетронутым, срезается лишь та копия, что уходит в контекст при этом resume. Поэтому усечение обратимо — смените стратегию, сделайте resume ещё раз и получите полную запись.
Отсечение¶
prune · PruningSessionStore
Держит сообщения об ошибках вне контекста. Куча ошибок, накопившаяся во время повторов при обрыве сети, не должна занимать контекст после resume.
Не путайте с усечением: усечение выбрасывает по объёму и ценности, отсечение — по признаку «ошибка или нет».
Рантайм¶
Изоляция¶
isolation
Помеченные роли автоматически расходятся по отдельным git worktree, это обеспечивается hook'ом, а не подсказками в промпте. При параллельной правке одного репозитория они не сталкиваются.
Включили изоляцию — уводите верстак из репозитория
При включённой изоляции через worktree верстак обязан быть уведён за пределы репозитория через home=, иначе изолированный агент не сможет писать в общий checkout.
Устойчивость¶
resilience · Resilience
При обрыве сети — висеть и ждать, а не падать с ошибкой: за состоянием следят DNS- и TCP-пробы, после восстановления сети прогон продолжается через resume. Сообщения об ошибках, накопившиеся за время ожидания, отсечение держит вне контекста.
Родословная¶
lineage · Lineage
Межпроцессная запись того, «из какой сессии форкнут этот прогон», лежит в lineage.json. Непрерывность по ней находит, до чего дошли в прошлый раз.
Не путайте с манифестом прогонов — это runs/manifest.json, там ведётся учёт по каждому прогону.
Манифест прогонов¶
run manifest · runs/manifest.json
Учётная запись по каждому прогону: сколько денег потрачено, сколько времени заняло, насколько велик контекст. Все числа со страниц-кейсов пересчитываются отсюда.
Пробуждение¶
wake · wake_state()
Только читающая разведка перед стартом: смотрит, есть ли в этой рабочей области уже бриф требований и цель, и по этому решает, начинается всё с нуля или это продолжение. Не пишет ни байта.
wake_state() — единственное место, где определяется расположение верстака; если драйверу нужно узнать, где лежит бриф, он тоже идёт через него. Собранный вручную путь при ошибке ничего не сообщит — он просто молча не сработает.
Событие¶
event · Event
Поток сообщений SDK, сплющенный в стабильную структуру. Слой взаимодействия знает только Event и не импортирует ни одного типа SDK — это и есть граница, благодаря которой смена UI не требует правки ядра.
Слой взаимодействия¶
interaction layer
Слой UI между человеком и прогоном. По умолчанию терминал, можно заменить на Web, TUI, HTTP или полностью автоматический режим без человека. См. Смена слоя взаимодействия.
Хранилище сессий¶
session store · SessionStore
Бэкенд постоянного хранения сообщений сессии. По умолчанию SqliteSessionStore пишет в runs/sessions.db, поверх можно надеть две обёртки — усечение и отсечение.
Бюджет¶
budget · max_budget_usd
Верхний предел трат на один прогон, при превышении прогон останавливается. Долгогоризонтный прогон без него обходится дорого — HT001 стоил $171.62.
Переносимость¶
Переносимый¶
portable
Переехали на другую машину — поведение то же. Достигается через setting_sources=[] — не читается ни ~/.claude/ хост-машины, ни .claude/ проекта. Предметные возможности едут вместе с репозиторием через plugin, учётные данные приезжают со своим .env.
Цена: учётные данные надо возить с собой, конфигурация хост-машины автоматически не наследуется.
Дописывание¶
append
Предметные инструкции дописываются после родного системного промпта Claude Code, а не заменяют его:
Поэтому специализация не покупается ценой потери общих способностей.
plugin¶
Пакет предметных возможностей, который едет вместе с репозиторием. Подключается через plugins=[local], в каталоге можно держать skills/, agents/, hooks/, .mcp.json. См. Развёртывание.