Канбан экспериментов

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

kanban hero

Как работает

Канбан появляется только у узла типа «метод». Одна доска — один способ проверки (доказательство причины или гипотеза устранения). Карточка — один запланированный или идущий эксперимент; отдельный лист дерева для прогона не создаётся.

На доске всегда четыре колонки. В интерфейсе заголовки такие:

Заголовок в 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.*.