docs: add manual QA test plan #136

Open
Ghost wants to merge 5 commits from docs/manual-qa-test-plan into develop

Adds docs/manual-qa-test-plan.md — the structured manual test plan I followed during the full-product QA pass on develop (the pass that produced issues #122–#134).

~190 numbered test cases (TC-…) across: auth/setup/session, account/workspace settings, members/groups, spaces, pages & tree, trash/history/favorites/labels, the editor & all slash-menu blocks, media/links/mentions/embeds, comments, search, notifications, AI chat & dictation, public sharing, a permission-tier matrix, cross-feature interactions, console/a11y/mobile, and a cross-cutting UI/consistency sweep. Each case is steps → expected, oriented toward surfacing bugs, UI inconsistencies, error states and edge cases.

Docs-only; no code changes.

🤖 Generated with Claude Code

Adds `docs/manual-qa-test-plan.md` — the structured manual test plan I followed during the full-product QA pass on `develop` (the pass that produced issues #122–#134). ~190 numbered test cases (TC-…) across: auth/setup/session, account/workspace settings, members/groups, spaces, pages & tree, trash/history/favorites/labels, the editor & all slash-menu blocks, media/links/mentions/embeds, comments, search, notifications, AI chat & dictation, public sharing, a permission-tier matrix, cross-feature interactions, console/a11y/mobile, and a cross-cutting UI/consistency sweep. Each case is steps → expected, oriented toward surfacing bugs, UI inconsistencies, error states and edge cases. Docs-only; no code changes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- state:review reviewed_head: 2a32077a4266e9e2fe64f91c4cfec1519bea796c baseline_head: 2a32077a4266e9e2fe64f91c4cfec1519bea796c verdict: approved round: 1 max_rounds: 6 open_findings: [] reopened: {} -->
Ghost added 1 commit 2026-06-22 21:09:40 +03:00
Add docs/manual-qa-test-plan.md — the structured manual test plan used for the
full-product QA pass against develop: ~190 cases across auth, spaces, pages/tree,
editor & blocks, media/embeds, comments, search, notifications, AI chat &
dictation, public sharing, permission matrix, cross-feature interactions, and a
cross-cutting UI/consistency sweep. Intended as a reusable manual-QA checklist.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
vvzvlad added 1 commit 2026-06-23 00:26:30 +03:00
Append Section V — ~75 additional manual/integration cases surfaced by a
code-grounded gap audit (8 read-only zone audits) of this plan, and correct
two now-stale cases:
- TC-TRASH-01: no confirm dialog / "30-day note" anymore — delete is
  immediate with an 8s Undo toast (page-query.ts:132-144).
- TC-SPACE-03: server slugExists does not exclude self (bug to verify),
  see new TC-SPACE-11.

New cases cover the fork's recently shipped, uncovered behavior (AI-chat
message queue / stopped-notice / partial-answer persistence, streaming
dictation via Silero VAD, trash undo-toast, MCP write-only headers) and
code-grounded server branches (notification CASL count leak, 3s
restriction-cache realtime leak, MovePageDto bound vs fractional-index
keys, to_tsquery 500, import zip-bomb / HTML-XSS, attachment download
authZ). Cases tagged [BUG?] double as candidate defects. Full rationale in
docs/qa-plan-gaps-pr136.md.

Docs-only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
vvzvlad added 1 commit 2026-06-23 00:49:08 +03:00
The first pass dropped 8 gap-audit findings "to keep it tight" — but those
ARE forgotten cases, so they belong in the plan. Add them with full context
(scenario → expected, file:line, defect caught):

- TC-DICT-12  encodeWavPcm16 WAV header/clipping (unit)
- TC-EMBED-05 getEmbedUrlAndProvider 11-provider URL parsing (unit+manual)
- TC-LINK-03  sanitizeUrl/isInternalFileUrl XSS gate (unit+manual, security)
- TC-SPACE-12 space slug @IsAlphanumeric rejects hyphen/underscore/unicode [BUG?]
- TC-ATT-DEDUP-01 diagram attachmentId overwrite authorization
- TC-STOR-DIV-01  local vs S3 missing-file behavior divergence
- TC-LIMIT-QUOTA-01 no per-workspace storage quota (verify-only)
- TC-CMT-09  realtime commentCreated appends only to last loaded page

Docs-only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
vvzvlad added 1 commit 2026-06-23 00:53:37 +03:00
The standalone gap-audit doc was a working artifact (never part of this
PR branch) and has been removed; all its cases now live in Section V, so
the "full rationale in docs/qa-plan-gaps-pr136.md" pointer is dropped to
avoid referencing a deleted file.

Docs-only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
vvzvlad added 1 commit 2026-06-23 00:58:02 +03:00
The backlog file docs/backlog/qa-plan-unit-test-candidates.md was moved
into Gitea issue #139 and removed, so repoint the only reference to it.

Docs-only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Owner

если создать чат со скиллом например корректора, а потом пока агент пишет, нажать new chat, то у чата просто пропадает "корректор", но чат останется тем же, и сессия тоже. чат сбросится только если на новый чат после конца работы агента —добавить такой и подобные тесты

если создать чат со скиллом например корректора, а потом пока агент пишет, нажать new chat, то у чата просто пропадает "корректор", но чат останется тем же, и сессия тоже. чат сбросится только если на новый чат после конца работы агента —добавить такой и подобные тесты
Owner

проверка создания mcp инструмента обязательно с указанием вайтлиста

проверка создания mcp инструмента обязательно с указанием вайтлиста
Owner

Code review — PR #136: добавление плана ручного QA-тестирования (docs/manual-qa-test-plan.md)

Вердикт: Approve with comments. Чистый docs-only PR (+443/−0, один файл) — релизных рисков нет, но план не покрывает явно запрошенный сценарий «New chat во время стриминга» и не проверяет фактическую фильтрацию MCP-allowlist. Это пробелы покрытия в самом плане, а не блокеры мержа документа.

Объём: дифф developdocs/manual-qa-test-plan (merge-base f6a4df1b), 1 файлов, +443/−0. Прогнаны параллельные аспектные ревьюеры (documentation, conventions, test-coverage) + judge-проход.

Must fix before merge

Нет.

Non-blocking

  • [documentation] Восстановить непрерывность буквенной нумерации верхнеуровневых секций (пропущены P и Q)docs/manual-qa-test-plan.md:189,255,264
    Весь организующий принцип документа — сквозная буквенная схема ##-секций A…O, но после O идёт сразу ## R. Additional flows (189), затем S/T/U/V, а буквы P и Q существуют только как ###-подсекции (### P. Half-wired / absent под ## R, ### Q. Permission matrix sweep под ## S). Читатель видит дыру O→R и одни и те же буквы на двух уровнях. Косметика (у каждого кейса есть стабильный TC-ID — реальный хэндл), но это единственное место, где собственная структурная конвенция документа внутренне противоречива. Fix: либо промотировать P/Q до собственных ##-секций и переименовать ## R## P, ## S## Q, далее ## T## R и т.д., либо убрать буквенные префиксы из блока ## R..## V и опираться на TC-ID.

Test coverage

  • [test-coverage] Добавить явно запрошенный кейс «New chat во время стриминга агента»docs/manual-qa-test-plan.md:328-336 (грунт: use-chat-session.ts:166-224, ai-chat-window.tsx:216-223)
    Кейс просили добавить явно, и он отсутствует. Поведение реально и привязано к коду: новый чат принимает свой server-id IN PLACE на start-чанке, а строка ассистента персистится сразу и пошагово (#183). Нажатие New chat ВО ВРЕМЯ стрима запускает startNewChat (сброс selectedRoleId→null, activeChatId→null), из-за чего render-фазный реконсилятор видит activeChatId(null) !== thread.chatId(adopted) и пересоздаёт UI — привязка роли/«скилла» тихо слетает из UI, но строка чата и его серверный turn остаются. Ближайшие TC-AI-11 (queue при переключении) и TC-AI-15 (хвост при switch mid-stream) покрывают ПЕРЕКЛЮЧЕНИЕ на другой чат, а не нажатие New chat, и ни один не покрывает эффект «скилл слетел, но чат жив» и различие «полный сброс только если New chat нажат ПОСЛЕ завершения агента». Fix: добавить TC-AI рядом с TC-AI-09..16 со ссылкой на use-chat-session.ts:166-224 и ai-chat-window.tsx:216-223: (1) новый чат, выбрать скилл/роль, отправить первое сообщение; (2) во время стрима нажать New chat → ожидать тихий сброс скилла/роли из UI при сохранении только что созданного чата и его серверного turn; (3) нажать New chat ПОСЛЕ завершения агента → ожидать полный сброс (пустая role-card, очищенный черновик).
  • [test-coverage] Усилить TC-AI-08: проверять, что MCP tool-allowlist реально фильтрует, а не только конфигурируетсяdocs/manual-qa-test-plan.md:248 (грунт: mcp-clients.service.ts:263-265,280-291)
    Разработчик требовал, чтобы тест создания MCP-сервера включал задание whitelist. TC-AI-08 перечисляет «tool allowlist» среди настраиваемых полей, но не утверждает наблюдаемого эффекта — то есть не проверяет, что allowlist работает. Поведение фильтра реально: непустой toolAllowlist оставляет только названные инструменты, пустой/null отдаёт все, а guidance сервера опускается, если allowlist отфильтровал всё. Fix: добавить шаг — создать MCP-сервер с НЕПУСТЫМ toolAllowlist, называющим подмножество инструментов → проверить, что в чате доступны/вызываемы только разрешённые (и что guidance опускается, если allowlist отфильтровал все, по mcp-clients.service.ts:280-291); контраст с пустым allowlist, отдающим все инструменты.

Architecture & design (forward-looking, non-blocking)

Нет.

## Code review — PR #136: добавление плана ручного QA-тестирования (docs/manual-qa-test-plan.md) **Вердикт: Approve with comments.** Чистый docs-only PR (+443/−0, один файл) — релизных рисков нет, но план не покрывает явно запрошенный сценарий «New chat во время стриминга» и не проверяет фактическую фильтрацию MCP-allowlist. Это пробелы покрытия в самом плане, а не блокеры мержа документа. _Объём: дифф `develop`…`docs/manual-qa-test-plan` (merge-base `f6a4df1b`), 1 файлов, +443/−0. Прогнаны параллельные аспектные ревьюеры (documentation, conventions, test-coverage) + judge-проход._ ### Must fix before merge Нет. ### Non-blocking - **[documentation] Восстановить непрерывность буквенной нумерации верхнеуровневых секций (пропущены P и Q)** — `docs/manual-qa-test-plan.md:189,255,264` Весь организующий принцип документа — сквозная буквенная схема `##`-секций A…O, но после O идёт сразу `## R. Additional flows` (189), затем S/T/U/V, а буквы P и Q существуют только как `###`-подсекции (`### P. Half-wired / absent` под `## R`, `### Q. Permission matrix sweep` под `## S`). Читатель видит дыру O→R и одни и те же буквы на двух уровнях. Косметика (у каждого кейса есть стабильный TC-ID — реальный хэндл), но это единственное место, где собственная структурная конвенция документа внутренне противоречива. Fix: либо промотировать P/Q до собственных `##`-секций и переименовать `## R`→`## P`, `## S`→`## Q`, далее `## T`→`## R` и т.д., либо убрать буквенные префиксы из блока `## R`..`## V` и опираться на TC-ID. ### Test coverage - **[test-coverage] Добавить явно запрошенный кейс «New chat во время стриминга агента»** — `docs/manual-qa-test-plan.md:328-336` (грунт: `use-chat-session.ts:166-224`, `ai-chat-window.tsx:216-223`) Кейс просили добавить явно, и он отсутствует. Поведение реально и привязано к коду: новый чат принимает свой server-id IN PLACE на `start`-чанке, а строка ассистента персистится сразу и пошагово (#183). Нажатие New chat ВО ВРЕМЯ стрима запускает `startNewChat` (сброс `selectedRoleId`→null, `activeChatId`→null), из-за чего render-фазный реконсилятор видит `activeChatId(null) !== thread.chatId(adopted)` и пересоздаёт UI — привязка роли/«скилла» тихо слетает из UI, но строка чата и его серверный turn остаются. Ближайшие TC-AI-11 (queue при переключении) и TC-AI-15 (хвост при switch mid-stream) покрывают ПЕРЕКЛЮЧЕНИЕ на другой чат, а не нажатие New chat, и ни один не покрывает эффект «скилл слетел, но чат жив» и различие «полный сброс только если New chat нажат ПОСЛЕ завершения агента». Fix: добавить TC-AI рядом с TC-AI-09..16 со ссылкой на `use-chat-session.ts:166-224` и `ai-chat-window.tsx:216-223`: (1) новый чат, выбрать скилл/роль, отправить первое сообщение; (2) во время стрима нажать New chat → ожидать тихий сброс скилла/роли из UI при сохранении только что созданного чата и его серверного turn; (3) нажать New chat ПОСЛЕ завершения агента → ожидать полный сброс (пустая role-card, очищенный черновик). - **[test-coverage] Усилить TC-AI-08: проверять, что MCP tool-allowlist реально фильтрует, а не только конфигурируется** — `docs/manual-qa-test-plan.md:248` (грунт: `mcp-clients.service.ts:263-265,280-291`) Разработчик требовал, чтобы тест создания MCP-сервера включал задание whitelist. TC-AI-08 перечисляет «tool allowlist» среди настраиваемых полей, но не утверждает наблюдаемого эффекта — то есть не проверяет, что allowlist работает. Поведение фильтра реально: непустой `toolAllowlist` оставляет только названные инструменты, пустой/null отдаёт все, а guidance сервера опускается, если allowlist отфильтровал всё. Fix: добавить шаг — создать MCP-сервер с НЕПУСТЫМ `toolAllowlist`, называющим подмножество инструментов → проверить, что в чате доступны/вызываемы только разрешённые (и что guidance опускается, если allowlist отфильтровал все, по `mcp-clients.service.ts:280-291`); контраст с пустым allowlist, отдающим все инструменты. ### Architecture & design (forward-looking, non-blocking) Нет.
Ghost added the review/approved label 2026-06-28 22:31:31 +03:00
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin docs/manual-qa-test-plan:docs/manual-qa-test-plan
git checkout docs/manual-qa-test-plan
Sign in to join this conversation.