Правила работы: прочитай `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
```

Обе команды проходят, вывод приложить к отчёту.
