Правила работы: прочитай `C:\Users\Ochenstarik\kagent-tasks\hermes-work-protocol.md`. Каталог: `services/control-plane/src/`. Выполняется после задачи A3. ## Дефект В `package.json` объявлено `"test": "vitest run"`, но тестовых файлов в пакете нет. Vitest завершается с кодом 1, из-за чего падает `pnpm test` для всего монорепозитория. ## Что сделать Добавить файлы `*.test.ts` рядом с исходниками. Минимальный набор: **`domain.test.ts`** — таблица переходов `TASK_TRANSITIONS`: - разрешённый переход принимается; - запрещённый переход отклоняется; - терминальные статусы `done` и `cancelled` не имеют исходящих переходов; - каждый статус присутствует в таблице. **`auth.test.ts`**: - `hashPassword` и `verifyPassword`: корректный пароль проходит, неверный не проходит; - испорченный хеш возвращает `false`, а не бросает исключение; - два хеша одного пароля различаются (соль случайна); - `validateAccessToken`: валидный токен разбирается, подделанная подпись отклоняется, истёкший токен отклоняется; - `authMiddleware`: без заголовка `401`, с чужой схемой `401`, с валидным токеном принципал попадает в запрос. Тесты не обращаются к сети, к PostgreSQL и к внешним сервисам. Для истёкшего токена используй подмену времени средствами vitest, а не ожидание. ## Ограничение Тесты пишутся **по описанному поведению**, а не подгоняются под текущий код. Если тест обнаруживает дефект — не правь тест. Зафиксируй тест как падающий, опиши дефект комментарием к карточке и предложи отдельную карточку. Причина — `docs/adr/0005-test-oracle-integrity.md`. ## Критерий приёмки ```bash pnpm --filter @kagent/control-plane test pnpm --filter @kagent/control-plane typecheck ``` Обе команды проходят, вывод приложить к отчёту.