100 lines
6.6 KiB
Markdown
100 lines
6.6 KiB
Markdown
# 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
|
||
|
||
---
|
||
|
||
<!--
|
||
Фаза 2 завершена + код-ревью пройден. Все таски выполнены.
|
||
-->
|
||
|
||
## ⚪ [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 попадает в `<projects>/.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
|
||
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .meeting-room / 2026-05-06T22:11:53.904Z -->
|
||
|
||
---
|
||
|
||
## ⚪ [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:** ready
|
||
**Where I stopped:** Unblocked 2026-05-07 после успешного прогона `pilonuxt` (commit `e5d45f9`: полный bootstrap — CLAUDE.md + `.wiki/concepts/bootstrap-manifest.md`, скил отработал корректно). 3-строчная группа разблокирована.
|
||
**Next action:** 1) `upgrade project` в `~/projects/meeting-room/` (без точки — обычная репа, не путать с `.meeting-room`). **Запустить скил `project-bootstrap` v1.10.0** — не делать ручной Edit (incident на `pilonuxt` 2026-05-07). 2) Подтвердить план: 2 файла — `CLAUDE.md` (+3: `follow tdd-criteria`, `delegate to interns when allowed`, `recommend, don't menu`) + `.wiki/concepts/bootstrap-manifest.md` (manifest 1.x → 1.10.0). 3) Прогнать. 4) **Verify:** `git diff --stat` показывает 2 файла. Если 1 — переоткрыть. Reference: `books@5ca16d9`. 5) Коммит `chore(bootstrap): upgrade CLAUDE.md — add tdd-criteria, interns, recommend-dont-menu triggers` + body. 6) Повторный — no-op. 7) `tasks_close`.
|
||
**Blocker:** bootstrap-rollout-canonical-triggers
|
||
**Branch:** n/a
|
||
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: meeting-room / 2026-05-07T06:57:21.673Z -->
|
||
|
||
---
|