Reviewer Persona Catalog — selection triggers (SPEC-145 US-3)¶
The single reference for which reviewers /vt-c-4-review selects for a given
change. The deterministic implementation is
../scripts/persona-select.sh — this catalog is
the human-readable spec of the same rules, and test-persona-selection.sh
drives the script (not this prose) so the two cannot silently diverge (AD-7,
anti-theater per structural-test-assertions.md).
Selection set = floor ∪ diff-triggered code reviewers ∪ deliverable-type reviewers.
Floor — always selected (never trigger-droppable)¶
| Reviewer | floor |
Rationale |
|---|---|---|
| security-sentinel | true |
Constitution I mandates a security pass on every review, regardless of diff. Fired in ~100% of historical reviews. |
| spec-compliance-reviewer | true |
Runs on every spec-driven review as the compliance gate. |
The floor is asserted present in 100% of selections as a standalone HARD gate — not inferred from history.
Diff-triggered code reviewers (only when code ∈ deliverable_types)¶
Two are always selected when code is a deliverable type (they fired on ~100%
of historical code reviews); the rest are scoped by the changed-file patterns.
| Reviewer | Trigger | Notes |
|---|---|---|
| code-simplicity-reviewer | code in types |
general code-core, always |
| performance-oracle | code in types |
general code-core, always |
| pattern-recognition-specialist | code in types |
general code-core, always |
| kieran-typescript-reviewer | TS/JS files (*.ts *.tsx *.js *.jsx *.mjs *.cts *.mts) or unknown diff |
default language reviewer; swapped out below |
| angular-reviewer | angular.json in PROJECT_ROOT and (TS files or unknown diff) |
replaces kieran-typescript-reviewer |
| nestjs-reviewer | nest-cli.json in PROJECT_ROOT and (TS files or unknown diff) |
replaces kieran-typescript-reviewer |
| julik-frontend-races-reviewer | frontend files (*.html *.htm *.vue *.svelte *.tsx *.jsx *.scss *.sass *.css *.component.ts) or unknown diff |
UI race/async |
| accessibility-reviewer | frontend files or UI_SCOPE=frontend or unknown diff |
WCAG on UI changes |
| design-implementation-reviewer | UI_SCOPE=frontend |
Figma/design match |
| data-integrity-guardian | DB files (*.sql, *.migration.*, paths under migrations/, db/, schema) |
migration/data safety |
Framework-conditional swap¶
kieran-typescript-reviewer is the default TS reviewer. It is replaced by:
- angular-reviewer when angular.json exists in PROJECT_ROOT,
- nestjs-reviewer when nest-cli.json exists in PROJECT_ROOT.
If both markers exist, both framework reviewers are selected and
kieran-typescript-reviewer is dropped.
Conservative-on-unknown-diff (non-regression safety)¶
When the caller supplies no changed-file list, the diff cannot be scoped, so
the selector is conservative: with code in types it selects the full
code roster (language reviewer + julik + accessibility) rather than under-select.
This mirrors the cache's "over-invalidate on ambiguity" rule and guarantees the
non-regression property: fed a historical review (whose file list we no longer
have), the selector re-selects every code reviewer that review fired. In real
use the orchestrator passes the actual changed files, so the diff is known
and the specialists scope down — that is where the 6→3-4 median reduction comes
from. Scoping is never silent: persona-select.sh logs when it narrows.
Deliverable-type reviewers (by type, independent of diff triggers)¶
Selected by the presence of the type in deliverable_types — never
diff-dependent, because history cannot exercise a type it never saw
(presentation and project-plan fired 0× historically; only the type-based
union can protect them).
| Type | Reviewer |
|---|---|
document |
document-quality-reviewer |
presentation |
presentation-quality-reviewer |
research |
research-quality-reviewer |
project-plan |
project-plan-reviewer |
Bounded dispatch¶
The selected set is dispatched under a concurrency bound — see
bounded-dispatch.md.