# Task Board _Updated: 2026-05-04_ ## 🟢 v2-p2-async-bridge — AsyncEventBridge: sync EventEmitter → asyncio.Queue **Status:** done **Where I stopped:** Complete --- ## 🟢 v2-p2-fastapi-app — FastAPI app + REST API (sessions, start, inject, roles, providers) **Status:** done **Where I stopped:** Complete --- ## 🟢 v2-p2-websocket-sse — WebSocket + SSE streaming endpoints **Status:** done **Where I stopped:** Complete --- ## 🟢 v2-p2-web-ui — Minimal HTML/CSS/JS frontend **Status:** done **Where I stopped:** Complete --- ## 🟢 v2-p2-serve-command — `meeting-room serve` CLI subcommand **Status:** done **Where I stopped:** Complete --- ## 🟢 code-review-p2 — Code review fixes after Phase 2 **Status:** done **Where I stopped:** All critical/important issues fixed **Next action:** N/A --- ## 🟢 v2-p1-deps — Обновить зависимости (pydantic, pytest, [web]) **Status:** done --- ## 🟢 v2-p1-models — Pydantic модели данных **Status:** done --- ## 🟢 v2-p1-events — EventEmitter и типы событий **Status:** done --- ## 🟢 v2-p1-api-client — Рефактор APIClient **Status:** done --- ## 🟢 v2-p1-tools — Рефактор ToolRegistry **Status:** done --- ## 🟢 v2-p1-engine — DiscussionEngine **Status:** done --- ## 🟢 v2-p1-config-cli — config.py + CLI рефактор **Status:** done --- ## ⚪ [secrets-path-off-by-one] — Bug в `meeting_room/config.py:35` — off-by-one в количестве вызовов `os.path.dirname()`. `PACKAGE_DIR` = `~\projects\meeting-room\meeting_room` (resolved через `os.path.abspath(__file__)` в строке 17). Текущий код: `_common_root = os.path.dirname(os.path.dirname(os.path.dirname(PACKAGE_DIR)))` — 3 вызова — резолвит в `~\` (user home), а должно быть в `~\projects\`. Соответственно `_secrets_path = os.path.join(_common_root, ".common", "secrets", "interns.env")` указывает на `~\.common\secrets\interns.env`, который **не существует**. Реальный файл: `~\projects\.common\secrets\interns.env` (создан в рамках `[unify-llm-secrets]`, закрыт 2026-05-05). Эффект: `load_dotenv(_secrets_path)` молча возвращает False, `OLLAMA_CLOUD_API_KEY` env-var НЕ загружается, regex-substitution в `_env_replace` (config.py:46-50) оставляет литеральную строку `${OLLAMA_CLOUD_API_KEY}` в `providers.ollama_cloud.api_key`, OpenAI-client дёргает Ollama с этой строкой как Bearer-токеном → 401. Тесты не ловят: `tests/test_config.py:107,114,242` используют `monkeypatch.setenv()` — путь до secrets-файла не задействуется. Surfaced код-ревью 2026-05-07. Fix: либо `dirname` дважды (`os.path.dirname(os.path.dirname(PACKAGE_DIR))` → `~\projects\`), либо паритет с `interns-mcp/server.py:17`: `Path(__file__).resolve().parents[2]`. Acceptance: убрать env-var из shell, прогнать `python -c "from meeting_room.config import load_config; print(load_config()['providers']['ollama_cloud']['api_key'][:10])"` — должен вернуть начало реального ключа `02a8f6e9f9...`, а не `${OLLAMA_CLOU`. Добавить regression-тест: монкипатч-PACKAGE_DIR и ассерт что resolved path попадает в `/.common/secrets/interns.env`. Регрессия impacted closure: [unify-llm-secrets] в `common/.tasks/STATUS.md` (closed 2026-05-05) — claim'ил «meeting-room config.py → load_dotenv()» но fixture-only-tested. **Status:** ready **Where I stopped:** (not started) **Next action:** Открыть `~\projects\meeting-room\meeting_room\config.py:35`. Заменить тройной `os.path.dirname(...)` на двойной (или `Path(__file__).resolve().parents[2]`). Добавить regression-тест в `tests/test_config.py` который реально читает env-var из временного `.common/secrets/interns.env` через `monkeypatch.chdir` + временный layout. Пуш PATCH bump в `meeting-room/pyproject.toml`. **Branch:** n/a --- ## 🔵 [bootstrap-upgrade-canonical-triggers] — Прогнать `project-bootstrap` v1.10.0 в upgrade-режиме на этом проекте. Цель — дописать в `CLAUDE.md` 3 недостающих канонических триггера: `follow tdd-criteria`, `delegate to interns when allowed`, `recommend, don't menu`. Уже присутствуют: `pull remote before work`, `follow project discipline`, `we're on Windows`. ВНИМАНИЕ: это `meeting-room` (без точки) — обычный код-проект, не путать с `.meeting-room` workspace-комнатой (которая в раскатку не входит). Аудит 2026-05-07 через `bulk_text_read`. Контекст — координатор `[bootstrap-rollout-canonical-triggers]` в `_meta` (commit dd933fd). Пилот на `books` подтвердил идемпотентность (158fc95). **Status:** blocked **Where I stopped:** Создана 2026-05-07. Blocked — ждёт разблокировки от координатора `bootstrap-rollout-canonical-triggers`. **Next action:** 1) Открыть свежую сессию в `~/projects/meeting-room/` (без точки). 2) `upgrade project`. 3) Подтвердить план — должно быть ровно 3 вставки (`follow tdd-criteria`, `delegate to interns when allowed`, `recommend, don't menu`). 4) Прогнать. 5) `git diff CLAUDE.md` — 3 вставки, остальное нетронуто. 6) Повторный прогон — no-op. 7) Закрыть таску при успехе; при кривом результате — фикс-таска в `claude-skills`. **Blocker:** bootstrap-rollout-canonical-triggers **Branch:** n/a ---