# Parallel QA Orchestra

> Parallel QA Orchestra — Concurrent Validation

- Skill: `ar9av/parallel-qa-orchestra` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add ar9av/parallel-qa-orchestra`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ar9av/parallel-qa-orchestra/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Ar9av (https://skillmd.com/u/ar9av)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ar9av/parallel-qa-orchestra

---


# Parallel QA Orchestra — Concurrent Validation

Orchestrates 4 independent QA checks that run simultaneously, each on its own dev-server port. The refiner gets a single merged failure report with every issue in one pass, cutting the number of refine-iterate cycles needed.

## When to use

Replace the sequential `playtester → gap-checker` calls in the main pipeline with a single call to this skill. Use after codesmith and the manifest-auditor + mobile-compat-checker linting passes.

## The 4 workers

| Worker | Browser? | What it catches |
|---|---|---|
| **static** | No | BFS reachability, border holes, jump-arc gaps, spawn collision |
| **golden-path** | Yes (port A) | Boot, walk, jump, attack scenarios; win-condition reachability |
| **fuzzer** | Yes (port B) | Stuck state, spawn-trap, no-progress, out-of-bounds, NaN state |
| **physics-debug** | Yes (port C) | Hitbox misalignment, body offset bugs |

All 4 run concurrently. Total wall-clock time ≈ max(individual times) ≈ 30–45s.

## Output contract

```jsonc
{
  "ts": "<ISO>",
  "ok": false,
  "failCount": 3,
  "workers": {
    "static":       { "ok": true,  "errors": 0, "warnings": 1, "issues": [...] },
    "golden-path":  { "ok": false, "passed": false, "failures": [...] },
    "fuzzer":       { "ok": true,  "issues": [] },
    "physics-debug": { "ok": true, "misalignedCount": 1, "bodies": [...] }
  },
  "merged": [
    { "kind": "border-hole",         "source": "static",  "severity": "error",   "message": "..." },
    { "kind": "screenshot-diff",     "source": "golden",  "severity": "error",   "message": "..." },
    { "kind": "hitbox-misaligned",   "source": "physics", "severity": "warning", "message": "..." }
  ]
}
```

Written to `qa/orchestra-report.json`. Also appended to `state.qa[]` (keeping last 5).

Exit code `0` if `ok`, else `5`.

## Port allocation

Each browser worker gets its own vite dev-server port. The script finds 3 free ports automatically using Node's `net` module before launching workers.

## Integration with the pipeline

Replace steps 7–8 in the gameforge orchestrator:

```
// Before:
playtester → refiner (loop) → playtester (loop)

// After:
manifest-auditor → mobile-compat-checker → parallel-qa-orchestra → refiner (loop) → parallel-qa-orchestra (loop)
```

Max 3 refiner iterations, same as before.

## Process

1. Run `scripts/orchestrate_qa.mjs <project-dir>`
2. Script allocates 3 free ports.
3. Spawns 4 workers concurrently via `Promise.all` + `child_process.spawn`.
4. Collects stdout JSON from each worker as it finishes.
5. Merges into `orchestra-report.json`.
6. Exits with combined pass/fail.

## Scripts

- `scripts/orchestrate_qa.mjs <project-dir> [--no-physics]` — run all 4 workers. `--no-physics` skips the physics-debug worker (faster, loses hitbox checks).

