Skip to content

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 = floordiff-triggered code reviewersdeliverable-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 codedeliverable_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 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.