Senior QA (the orchestrator)
The orchestrator that reads your change, decides scope, delegates work, and aggregates results.
The Senior QA is the top-level agent the orchestrator. It’s implemented in src/core/orchestrator.ts.
Senior QA doesn’t explore pages or generate tests. It makes decisions:
- What to test?: maps a natural-language change description to affected pages
- How much?: full regression vs iterative vs smoke vs targeted
- Who runs it?: spins up Junior QA subagents per page
- Is it safe?: enforces terminal guards, budget caps (planned for a future release), scope confirmations
- What did we learn?: aggregates per-page reports into one unified artifact
- What changed?: diffs against the knowledge base
Responsibilities
| Responsibility | Implemented in |
|---|---|
| Load config, credentials, KB | src/utils/config.ts, src/kb/manager.ts |
| Run phases in the correct order | src/core/orchestrator.ts |
| Decide iterative vs full vs smoke | src/core/scope-decider.ts |
| LLM-backed scope inference | src/core/scope-inferrer.ts |
| Human-in-the-loop checkpoint | src/utils/prompts.ts |
| Delegate to Junior QA | src/claude/delegate.ts |
| Run smoke checks | src/agents/smoker.ts |
| Produce the unified report | src/agents/reporter.ts |
| Persist models + bugs + flaky registry | src/kb/manager.ts |
The scope decision
This is the defining decision Senior QA makes. When you run:
nitpick run --scope iterative --change"I modified the task form"
Senior QA:
- Reads the change description
- Calls the configured LLM (with a fast model like Haiku) with the change description, the full page graph, and your known flows
- Gets back structured JSON:
affected_pages[]withconfidenceandreason - Presents the proposal to you, not blindly, but with reasons
- Waits for your confirmation
If the LLM is unavailable or returns nothing parseable, Senior QA falls back to keyword overlap against page IDs and URLs.
Why”Senior”?
Because the decisions Senior QA makes are the ones a senior QA engineer makes on a team:
- “What’s the blast radius of this change?”: scope inference
- “Is this worth deep-testing?”: iterative vs smoke
- “Who should own this?”: which subagent to delegate to
- “Is this a new bug or the one we saw last week?”: bug dedupe
- “Should we ship?”: unified report with pass/fail summary
Juniors execute. Seniors route. That’s the same in real orgs and in Nitpick.
What Senior QA doesn’t do
- Does NOT explore pages, that’s Junior QA
- Does NOT generate Playwright tests, that’s Junior QA
- Does NOT classify individual test failures, Junior QA’s retry loop owns that
- Does NOT manage individual runs’ state,
workflow.tsdoes