7.6 KiB
| target | total_score | p0_count | p1_count | p1_count_note | p2_count | timestamp | slug |
|---|---|---|---|---|---|---|---|
| /campanha | 28 | 0 | 3 | filters, kpi-grid, side-tab | 2 | 2026-07-19T10-15-47Z | src-app-campaign-campanha |
Method: dual-agent (A: 89c6189f-1341-4e15-8d45-e1aa7c6f5167 · B: 3e87667e-e21e-4a29-85b4-db65afcc49c5)
Critique: /campanha
Design Health Score
| # | Heuristic | Score | Key Issue |
|---|---|---|---|
| 1 | Visibility of System Status | 3 | Pending/aria-live on filters; no freshness/"as of" on KPI aggregates |
| 2 | Match System / Real World | 4 | Domain language precise (Núcleo vs Zona TSE disambiguated) |
| 3 | User Control and Freedom | 3 | Clear filters/back; limited undo for irreversible paths |
| 4 | Consistency and Standards | 3 | Strong component discipline; role dashboards diverge in max-width/chrome |
| 5 | Error Prevention | 3 | Constrained selects + inline ZE validation |
| 6 | Recognition Rather Than Recall | 4 | Filter state in URL; labels on actions |
| 7 | Flexibility and Efficiency | 2 | No saved views; queues are one-by-one, no bulk |
| 8 | Aesthetic and Minimalist Design | 2 | geral dashboard = even wall of same-weight Cards |
| 9 | Error Recovery | 3 | Forgot-password names fallback; leadership empty does not |
| 10 | Help and Documentation | 1 | Almost no glossary/tooltips for ZE / engajado / estimativa |
| Total | 28/40 | Good |
Anti-Patterns Verdict
LLM assessment: Not classic AI slop. Theme quarantine (data-theme='campaign' + bg-none) and semantic status tokens are deliberate. The tell is the repeated hero-metric Card grid (dashboard / núcleos overview / apoiadores) — exactly the anti-reference named in PRODUCT.md/DESIGN.md — plus icon-per-button and copy-pasted page shells.
Deterministic scan (CLI): 1 finding — side-tab (border-l-4 border-primary) in src/components/campaign/NucleusElectoralBaseline.tsx:79. Real hit, not a false positive; absolute ban in DESIGN.md.
Visual overlays: Injection succeeded on the live dashboard (session redirected login → /campanha). Overlay flagged overused-font / single-font (Inter-by-design → false positive), layout-transition (unverified), and many nested-cards (shadcn Card/CardHeader class-name false positives). No reliable additional anti-pattern beyond the CLI side-tab and the LLM-noted KPI grid density.
Overall Impression
A serious field desk with strong a11y/touch discipline and honest empty-state copy — undermined by a template dashboard of identical metric cards, an always-open 6-filter wall on núcleos, and a leadership empty state that strands the persona the product calls a peer. Biggest opportunity: make hierarchy and triage decisions for the user instead of presenting equal-weight problem scoreboards.
What's Working
- Theme quarantine is real — campaign tokens +
bg-nonekill public-site gradient kitsch. - Systemic touch/a11y —
min-h-11, live regions on filters, properaria-invalidon ZE input. - Scope-honest empty/error copy — "você só vê núcleos no seu escopo"; phone-only reset routes to coordinator.
Priority Issues
[P1] Filter panel decision overload
What: NucleusFilters shows 6 fields at once on desktop (TI, município, ZE, cobertura, estimativa, prioridade) plus search.
Why it matters: Primary triage tool under time pressure; violates clarity-under-pressure and >4 options rule.
Fix: Keep territory + search primary; put coverage/estimate/priority behind "Mais filtros" at all breakpoints.
Suggested command: /impeccable distill / /impeccable layout
[P1] Hero-metric Card grids contradict own anti-references
What: General dashboard, NucleusListOverview, SupporterListOverview all use Card → description → big number grids.
Why it matters: PRODUCT/DESIGN ban identical card grids / hero-metric templates; this is the strongest "template AI" tell.
Fix: Compact secondary metrics into a stat row; reserve Card + priority lift for 1–2 decisive numbers; rank action queues.
Suggested command: /impeccable quieter / /impeccable layout
[P1] Side-tab accent on baseline row (detector)
What: border-l-4 border-primary on highlighted candidate in NucleusElectoralBaseline.
Why it matters: Absolute ban (side-stripe >1px); deterministic AI-tell.
Fix: Full border, background tint only, or leading mark — no thick left stripe.
Suggested command: /impeccable quieter
[P2] Liderança empty state is a dead end
What: "Nenhum núcleo" / "vínculo engajado" + warning icon, no CTA.
Why it matters: Peer persona stranded; jargon without next step.
Fix: Mirror forgot-password — name who to contact (coordenador / WhatsApp).
Suggested command: /impeccable clarify / /impeccable onboard
[P2] No freshness signal on aggregates
What: KPIs/overviews never show when data was computed.
Why it matters: Field decisions need trust in recency.
Fix: Relative "atualizado há…" near overview headers.
Suggested command: /impeccable harden
[P3] Split brand chrome (mobile red bar vs desktop stone rail)
What: Mobile top bar is solid Mandate Red; desktop sidebar is quiet rail.
Why it matters: Breaks Signal Red Rule for Casey/Lia switching devices unless intentional "field mode."
Fix: Document as field-mode signal or quiet the mobile chrome.
Suggested command: /impeccable quieter
Persona Red Flags
Alex (geral/coordenador): No saved filter views; queues are one-by-one with equal weight — must supply triage the UI should do.
Casey (mobile field): Opened accordion still stacks 6 full-width fields; no ambient stale/offline cue in shell; primary CTAs scroll away.
Lia (liderança phone-first): Reset and unlinked-núcleo paths both require a more-privileged human; dashboard opens on "Sem estimativa confirmada" as the boldest line; jargon (engajado, ZE) unexplained.
Minor Observations
- Leadership empty uses
AlertTriangleIconin wrong Empty slot vsEmptyMedia. - Three dashboard max-widths (
2xl/5xl/4xl) without clear intent. - Dual relative-time helpers.
Badge secondaryoverloaded (empty count vs category).- Icon-on-every-button may be decorative filler vs confident-compact.
Cognitive Load
2–3 checklist failures: 6-filter wall; geral dashboard lacks progressive disclosure; no single primary "do this now." Moderate load — address soon.
Questions to Consider
- Why do dashboards converge on the banned hero-metric grid three times — exception or unreviewed?
- Is Lia's human-gated recovery acceptable honesty, or quiet demotion?
- Should the UI pick which fire to put out first among the three equal queues?
- Is the mobile red bar deliberate field-mode, or Signal Red Rule drift?
Emotional Journey
Peak: confirmed estimate / successful update. End/valley: leadership dashboard often closes on absence ("Sem estimativa confirmada"); unlinked empty is a hard stop; problem-scoreboard queues create ambient anxiety without priority.