## Summary Follow-up after **#2164** and main’s **FN-8103 / FN-8104** (Postgres-only data access / SQLite retirement). Main already routes Quality through `AsyncQualityStore` + `getAsyncLayer()`. This PR keeps the **review hardening** that was still missing: - **Project binding** — reject request `projectId` mismatches vs bound AsyncDataLayer; all SQL uses bound project - **`createRunIfNoActive`** — advisory lock so concurrent starts cannot double-queue - **Cancel-safe runner** — cancel slot registered before the running write; pre-spawn cancel skips process - **`finalizeRun`** — never overwrites a `cancelled` terminal status - **Detached execute** — catch only execution failures; prune fail-soft in `finally` - Guardrail tests + Quality v2 plan doc ## Test plan - [ ] Task QA loads under PostgreSQL (no SQLite/backend-mode error) - [ ] Concurrent start for same task → 409 second start - [ ] Cancel during start does not leave a live orphan process - [ ] Cancelled run stays cancelled after process exit - [ ] `pnpm --filter @fusion-plugin-examples/quality test` (37 tests)
fusion-plugin-quality
First-party Fusion plugin that makes task QA easy and visual.
Surfaces
- Quality hub (left sidebar): project-wide test run history and plans
- Task QA tab: action-first task quality work
- Task-scoped preview / test server (worktree cwd)
- Allowlisted targeted tests + report viewer
- Screenshots / visual evidence (task artifacts)
- Suggested test cases (advisory checklist)
- PR checks, browser verification handoff
Design principles
- Orchestrates existing verification (
testCommand, gate, verify-fast) — does not replace the merge gate - Composes Dev Server process patterns and the artifact registry
- Composes
fusion-plugin-agent-browserfor browser verification (soft dependency) - Never uses port 4040; never free-form shell as the default path
- Advisory results only — does not change merge eligibility
Settings
See plugin settingsSchema in src/settings.ts.