Канбан экспериментов
Доска прогонов у каждого метода: колонки, карточки, зависимости между ними и отчёты. Таблица лежит в project.md сразу под узлом метода.

Как работает
Канбан появляется только у узла типа «метод». Одна доска — один способ проверки (доказательство причины или гипотеза устранения). Карточка — один запланированный или идущий эксперимент; отдельный лист дерева для прогона не создаётся.
На доске всегда четыре колонки. В интерфейсе заголовки такие:
| Заголовок в UI | Статус | Смысл |
|---|---|---|
| Backlog | «в очереди» | ещё не начали |
| Running | «в работе» | идёт прогон |
| Done | «готово» | закончили; есть или должен быть отчёт |
| Успешные | «Успешные» | отдельная колонка завершения после «готово» |
Четвёртая колонка не опциональна: канонический набор колонок фиксирован. Устаревшая колонка planned при загрузке попадает во «в очереди» (backlog). Карточка с неизвестной колонкой тоже оказывается во «в очереди».
У карточки: заголовок, описание, теги, зависимости от других карточек (рёбра на виде DAG), метки времени создания и правки, закрепление вверху колонки. В колонках «готово» и «Успешные» под заголовком показывается краткий вывод — текст описания. У каждой карточки — отдельный Markdown-отчёт; индекс отчётов ведётся рядом с доской.
В модальном окне метода два режима: классическая доска и вид зависимостей (вкладки Kanban / DAG view). Сверху — фильтры по периоду изменения и тегам, сброс, блок вех с привязкой к карточкам. «Мастер-отчёты» — страницы уровня метода, не карточки.
Живой монитор прогона (графики, логи) — отдельная фича. Кнопка «Live монитор» появляется у карточки «в работе», когда в описании или в содержимом отчёта заданы строки live_log / metrics_dir / live_note. На этой странице — доска, отчёт и связь с очередью разбора после «готово».
Под узлом метода на карте мыслей — полоска сводки: всего карточек / «в работе» / в колонках завершения.
Как человек работает в интерфейсе
Пользователь выбирает проект и на карте мыслей кликает узел метода — открывается модальное окно канбана (тип «Метод»). Двойной клик по методу не открывает доску: камера подлетает к узлу. Контекстное меню у метода тоже открывает канбан.
Типичный ход начинается с карточки. Пользователь нажимает «+» (или «Добавить карточку») — появляется «Новый эксперимент» во «в очереди» — и правит заголовок, описание и отчёт (↗ «Открыть отчёт»; статусы «Загрузка отчёта…» / «Сохранение отчёта…» / «Отчёт сохранён»). Булавка в правом верхнем углу карточки держит её наверху колонки после перезагрузки; повторный клик снимает закрепление. Закрепление переезжает вместе с карточкой в другую колонку.
Дальше карточку перетаскивают во «в работе» (ручка ⠿; пустая колонка — «Перетащите сюда»). Если в описании или отчёте есть live-строки, доступен «Live монитор». Перенос в «готово» ставит карточку в очередь разбора после «готово» (done-research); сценарий агента затем пишет вопрос / ответ / рассказ в research.json.
ResearcherOS сохраняет доску: «Сохранение…», затем «Сохранено в project.md». Закрытие окна возвращает на карту; полоска под методом отражает актуальное состояние. В Hub доска только для чтения: перетаскивание, новые карточки и новые рёбра недоступны; отчёт и фильтры — да.
Подсказки («?» перезаписывает HTML-заглушку, пока окно открыто):
- доска (локально):
⠿ — перетащить · булавка — закрепить сверху · + — новая карточка · двойной клик — правка · ↗ — отчёт - Hub:
Только просмотр · ↗ — отчёт · фильтр · DAG — связи между карточками - DAG:
DAG — → зажать на карточке, отпустить на цели · двойной клик на стрелке — удалить
Какие сценарии агента подключаются
Сценарии агента необязательны: колонки и отчёты можно вести вручную. Они нужны, чтобы отчёт, колонка и вывод в базе знаний не расходились.
| Сценарий агента | Роль относительно канбана |
|---|---|
koi-grill-experiment |
До запуска: интервью по постановке → черновик §1–§3 отчёта и карточка во «в очереди» (или уточнение существующей). |
koi-execute-card |
Закон колонок: сразу «в очереди» → «в работе», по ходу галочки в §3 отчёта, в конце «в работе» → «готово» до ответа человеку. |
koi-report-review |
Четыре критика по отчёту; та же синхронизация колонок, что у execute. |
koi-done-research |
После колонки «готово» (не «Успешные»): вопрос / ответ и рассказ в research.json по методу и карточке. |
koi-card-autoresearch |
Долгий прогон одной карточки (роли manager / researcher / debugger); внутри опирается на koi-execute-card. |
koi-prose-style |
Заголовок и описание карточки в интерфейсе — короткий title, детали в описании. |
При успешном применении разбора отчёта (report_ingest) карточка переходит в «готово»; при явной секции исследовательских вопросов (RQ) в отчёте эти вопросы обновляются у метода. Это отдельный поток от очереди koi-done-research.
Как устроено технически
Хранение в Markdown
В project.md сразу после текста метода:
<!-- koi:kanban board-<method-id> -->
| backlog | running | done | successful |
| --- | --- | --- | --- |
| Заголовок <!-- id:c1 pinned:1 desc:… tags:gpu deps:c0 created:… updated:… --> | | |
Парсинг: koi/core/md_io.py (KANBAN_START_RE, метаданные карточки в HTML-комментарии). Нормализация колонок: normalize_kanban_board — всегда DEFAULT_KANBAN_COLUMNS, legacy planned → backlog, неизвестные id → backlog. Модель: ExperimentCard, KanbanBoard в koi/core/models.py (заголовки колонок: Backlog, Running, Done, Успешные); владелец доски — только method (KANBAN_OWNER_TYPES). Поле linked_node_id в модели есть, в UI канбана не используется. Зависимости карточек — поле depends_on. Закрепление вверху колонки — pinned; в Markdown пишется только если включено (pinned:1).
Отчёты: koi/adapters/card_reports.py, путь reports/{methodSlug}/{card}.md, индекс в reports/index.json. Зависимости: koi/projects/kanban/dependencies.py; раскладка DAG: koi/projects/kanban/layout.py. Команды: koi/projects/commands.py.
Подсказки Live — свободные строки в description или в тексте отчёта (не поля модели): live_log:, metrics_dir:, live_note:.
Очередь разбора после «готово» (done-research) пополняется только когда column_id == "done" (перенос в «Успешные» очередь не ставит). Синхронизация: koi/adapters/done_research_queue.py при сохранении и загрузке проекта.
Разбор отчёта (report_ingest): при успешном применении (не в режиме чернового прогона dry_run) карточка всегда переводится в done — логика в workflow.py; явная секция исследовательских вопросов (RQ) обновляет вопросы метода. Это отдельный поток от очереди koi-done-research.
API (роутер api/routers/projects.py): POST / PATCH / DELETE карточек; POST …/dag/suggest, GET/PUT …/dag-layout; отчёты и live-снимки карточки. Отдельного API для создания произвольных колонок нет.
Клиент
Клиентские модули:
- модалка:
#kanban-modalвweb/index.html; - открытие, перетаскивание, фильтры:
openKanbanModalи соседние функции вweb/app.js; - зависимости:
web/kanban-dag.js; - вехи:
web/milestones.js; - Live-монитор:
web/card-live.js; - полоска под методом: сводка «всего / в работе / готово» (
tot/proc/done, константыKANBAN_BELOW_*).
Элементы UI для справки:
- фильтры: «Период изменения» (чипы «Все», «Сегодня», «7 дней», «30 дней»), «Фильтр по тегам», «Сбросить»;
- вехи: клик фильтрует доску (
Фильтр: <title> · ещё клик — сбросить); пусто —Пока нет вех — добавьте первую по шкале времени; на узле — «Клик — фильтр доски»; - «Мастер-отчёты» с «+ Добавить»;
- DAG view: «Перемещение» / «Направленная связь»; зажать стрелку на карточке и отпустить на другой — зависимость; двойной клик по ребру — удалить.
Сохранение снова пишет project.md (и при необходимости файлы отчёта). Синхронизация между машинами — через Git по ветке исследования, не через отдельный протокол канбана.
Тесты
Бэкенд: test_md_io, test_project_commands, test_dag_*, test_done_research_queue, test_report_ingest, test_card_live. Отдельных фронтенд unit-тестов канбана нет.
Связь с остальным
- Дерево задаёт метод; канбан не создаёт узлов
experimentв дереве. research.jsonссылается наmethod_id+card_idпосле разбора «готово».- Монитор прогона читает артефакты живой карточки — страница монитора.
Ограничения
- Произвольные колонки через UI/API создать нельзя; неизвестные id колонок уходят во «в очереди».
- Колонка «Успешные» не ставит в очередь разбора после «готово»: очередь только при «готово».
- Hub — только просмотр мутаций доски (карточки, рёбра, перетаскивание).
- Live-монитор нужен статус «в работе» плюс строки
live_log/metrics_dir/live_noteв описании или отчёте. linked_node_idв UI канбана не используется.- Двойной клик по методу приближает камеру и не открывает канбан.
Связанные страницы
Текст: content/kanban.md. Медиа: media/kanban-hero.*.