TL;DR: A repeatable scrutiny pass for a feature area: N independent review agents (default 3), each launched with zero shared conversation context and an orthogonal lens, each handed the area's prior-findings exclusion list, each required to return evidence-backed, severity-ranked findings — and none of them allowed to fix anything. The orchestrator then runs a convergence step: dedupe across panels, rank, and triage survivors into work items with the user. At most one panelist owns the live device; the rest work from code and captured design docs. The panel's value comes from the isolation and the lens diversity — three copies of the same reviewer is not a panel.
First run: the Flight Finder search area (2026-07-21, AB#2316 era) — used throughout as the worked example. The name comes from the project's existing "fresh-eyes pass" vocabulary (the AB#2301 UX fixes came out of the first single-agent version of this move).
| Property | Rule | Why it exists |
|---|---|---|
| Context isolation | Each panelist is a fresh agent with no shared conversation state. The orchestrator who built the feature never reviews it directly. | The builder's blind spots are structural. Isolation is the point, not a convenience. |
| Lens assignment | Each panelist gets a distinct, orthogonal lens (see catalog) — never the same prompt N times. | Diversity catches failure modes redundancy can't. Identical prompts return the same top-ten findings N times. |
| Exclusion list | Every panelist is handed the area's already-dispositioned findings (audit rows, closed DQs) and told they are off-limits. | Without it, panels re-litigate settled decisions and bury new signal. |
| Evidence discipline | Every finding carries file:line, a DOM probe result, or a screenshot — plus a
severity (High/Med/Low) and the expected behavior. |
Makes convergence mechanical instead of argumentative. |
| Research/execution firewall | Panelists find; they never fix, commit, or deploy. Triage happens after convergence, with the user in the loop. | Keeps the pass honest (no anchoring on "what's easy to fix") and keeps parallel agents from colliding in the working tree. |
| Device arbitration | At most one panelist drives the live simulator (read-only interaction, no logout, no test runs); the rest work from code and captured design docs. | Two agents driving one device produce garbage evidence for both. |
Default panel size is 3 — two lenses agreeing is confirmation; three is the cheapest configuration where a single-lens finding is itself information (it tells you which blind spot the other lenses share). Assign lenses from the catalog, adapted to the area. Decide which single panelist (if any) gets the live device, and verify what binary the simulator is actually running before granting it (see Gotchas).
Launch all panelists in parallel. Every prompt must contain, explicitly:
[severity] [issue] [evidence] [why / expected],
findings only, no preamble.| Bucket | Meaning | Action |
|---|---|---|
| Already decided | Matches a recorded keep-decision or disposition and brings no new evidence. | No action; cite the record in the convergence report. (If the exclusion list was complete this bucket should be near-empty — a full bucket means Phase 1 was sloppy.) |
| Reopens a decision | Matches a recorded deviation but brings new evidence the original decision never saw (real user impact, changed tokens, changed backend behavior). | Reopen deliberately: append the evidence to the existing DQ / audit row rather than filing a duplicate; flag to the user as a reopened decision, not a new finding. |
| Feeds an open question | Bears on a DQ that is still open. | Attach as evidence to that DQ (timestamps per doc rules); no separate work item. |
| Genuinely new | No record covers it. | Goes to triage (next step). |
| Lens | Interrogates | Works from |
|---|---|---|
| Defaults & form logic | Every default value against the real user's expectation; date/time/midnight edges; contradictory field combos; guard-rail communication. | Code + specs (static) |
| Data & state lifecycle | Rendering edge data (overnight, huge values, free-text passthroughs); cache/TTL expiry mid-session; filter/facet traps; silent caps and truncation. | Code + specs (static) |
| Live interaction & design edges | Long content, rapid/conflicting input, keyboard occlusion, dead ends; states the design defines that the app can't reach, and states the app reaches that the design never drew. | Live simulator (the device-holder) + captured Figma docs |
| Optional 4th — Accessibility | Focus order, labels, contrast, touch-target sizes, VoiceOver phrasing. | Code + live |
| Optional 5th — Terminology & copy | Domain-correct language for the audience (pilots), consistency with the comms content source, casing/format conventions. | Specs + comms docs (static) |
maui-devflow list must show the agent
registered from the worktree under review, or the device-holder's evidence is against the wrong
build.MAUI navigate BlazorDevPage, check
cdp webviews — with two instances registered, CDP defaults to the hidden one while
screenshots show the visible one. Target the highest index.