Files
fusion/plugins/fusion-plugin-quality
gsxdsm 446c969968 fix(FN-2127): harden Quality Postgres store (project scope, races) (#2230)
## 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)
2026-07-16 11:38:34 -07:00
..

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-browser for 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.