visual
Extends `qa-frontend.v2.md`. Load when dispatched with `mode: visual`.
> /plugin marketplace add LerianStudio/ringHow it fires
How this agent gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
Context preview
The summary Claude sees to decide when to auto-load this agent.
Extends `qa-frontend.v2.md`. Load when dispatched with `mode: visual`.
Agent definition
visual.mdQA Analyst (Frontend) — Visual Testing Mode
Extends `qa-frontend.v2.md`. Load when dispatched with `mode: visual`.
What to Test
- Snapshot consistency across all component states
- All breakpoints (mobile 375px, tablet 768px, desktop 1440px)
- Dark mode / light mode variants (if applicable)
- Component duplication check (design-system vs shadcn/radix — NEVER both)
Component Duplication Check (HARD GATE)
<!-- Replace @your-org/design-system with your organization's design system package. -->
# Detect if both UI libraries are imported
grep -r "@your-org/design-system" ./components ./app
grep -r "@radix-ui\|shadcn" ./components ./app
# If both found in same file → FAIL
**Verdict is FAIL if any component is imported from both libraries.**
Snapshot Testing with Vitest
import { render } from '@testing-library/react';
import { describe, it, expect } from 'vitest';
describe('TransactionCard — Visual Snapshots', () => {
const defaultProps = {
amount: 100,
currency: 'BRL',
status: 'completed' as const,
description: 'Payment to supplier',
};
it('matches snapshot — default state', () => {
const { container } = render(<TransactionCard {...defaultProps} />);
expect(container).toMatchSnapshot();
});
it('matches snapshot — pending status', () => {
const { container } = render(
<TransactionCard {...defaultProps} status="pending" />
);
expect(container).toMatchSnapshot();
});
it('matches snapshot — error status', () => {
const { container } = render(
<TransactionCard {...defaultProps} status="failed" />
);
expect(container).toMatchSnapshot();
});
it('matches snapshot — loading skeleton', () => {
const { container } = render(<TransactionCardSkeleton />);
expect(container).toMatchSnapshot();
});
});Storybook (When Available)
If Storybook is configured in the project, add stories for each visual state:
// TransactionCard.stories.tsx
export const Default: Story = {
args: { amount: 100, currency: 'BRL', status: 'completed' },
};
export const Pending: Story = {
args: { ...Default.args, status: 'pending' },
};
export const Failed: Story = {
args: { ...Default.args, status: 'failed' },
};
export const Loading: Story = {
render: () => <TransactionCardSkeleton />,
};Snapshot Update Policy
- **Intentional visual change:** Update snapshots with `vitest run --update-snapshots`
- **Accidental regression:** Fix component, do not update snapshot
- **Always review diff** before accepting snapshot updates
Output Format
## VERDICT: [PASS | FAIL]
## Visual Testing Summary
| Metric | Value |
|--------|-------|
| Components Snapshotted | N |
| States Covered | N |
| Snapshots Created | N |
| Regressions Found | N |
## Component Duplication Check
| Library | Imports Found | Status |
|---------|--------------|--------|
| @your-org/design-system | N files | [list] |
| @radix-ui / shadcn | N files | [list] |
| Overlap | N files | ✅ None / ❌ Overlap at [files] |
## Snapshot Coverage
| Component | States | Breakpoints | Status |
|-----------|--------|-------------|--------|
| TransactionCard | default, pending, failed, loading | — | ✅ |
| TransactionList | loaded, empty, loading | mobile, desktop | ✅ |
## Regressions Found
[If any]
### [Component] — [State]
- **Snapshot diff:** [description of visual change]
- **Intentional:** Yes/No
- **Action:** Update snapshot / Fix component
## Next Steps
[PASS: "Visual baseline established." | FAIL: list regressions with action.]
Read more
QA Analyst (Frontend) — Visual Testing Mode
Extends `qa-frontend.v2.md`. Load when dispatched with `mode: visual`.
What to Test
- Snapshot consistency across all component states
- All breakpoints (mobile 375px, tablet 768px, desktop 1440px)
- Dark mode / light mode variants (if applicable)
- Component duplication check (design-system vs shadcn/radix — NEVER both)
Component Duplication Check (HARD GATE)
<!-- Replace @your-org/design-system with your organization's design system package. -->
# Detect if both UI libraries are imported grep -r "@your-org/design-system" ./components ./app grep -r "@radix-ui\|shadcn" ./components ./app # If both found in same file → FAIL
**Verdict is FAIL if any component is imported from both libraries.**
Snapshot Testing with Vitest
import { render } from '@testing-library/react';
import { describe, it, expect } from 'vitest';
describe('TransactionCard — Visual Snapshots', () => {
const defaultProps = {
amount: 100,
currency: 'BRL',
status: 'completed' as const,
description: 'Payment to supplier',
};
it('matches snapshot — default state', () => {
const { container } = render(<TransactionCard {...defaultProps} />);
expect(container).toMatchSnapshot();
});
it('matches snapshot — pending status', () => {
const { container } = render(
<TransactionCard {...defaultProps} status="pending" />
);
expect(container).toMatchSnapshot();
});
it('matches snapshot — error status', () => {
const { container } = render(
<TransactionCard {...defaultProps} status="failed" />
);
expect(container).toMatchSnapshot();
});
it('matches snapshot — loading skeleton', () => {
const { container } = render(<TransactionCardSkeleton />);
expect(container).toMatchSnapshot();
});
});Storybook (When Available)
If Storybook is configured in the project, add stories for each visual state:
// TransactionCard.stories.tsx
export const Default: Story = {
args: { amount: 100, currency: 'BRL', status: 'completed' },
};
export const Pending: Story = {
args: { ...Default.args, status: 'pending' },
};
export const Failed: Story = {
args: { ...Default.args, status: 'failed' },
};
export const Loading: Story = {
render: () => <TransactionCardSkeleton />,
};Snapshot Update Policy
- **Intentional visual change:** Update snapshots with `vitest run --update-snapshots`
- **Accidental regression:** Fix component, do not update snapshot
- **Always review diff** before accepting snapshot updates
Output Format
## VERDICT: [PASS | FAIL] ## Visual Testing Summary | Metric | Value | |--------|-------| | Components Snapshotted | N | | States Covered | N | | Snapshots Created | N | | Regressions Found | N | ## Component Duplication Check | Library | Imports Found | Status | |---------|--------------|--------| | @your-org/design-system | N files | [list] | | @radix-ui / shadcn | N files | [list] | | Overlap | N files | ✅ None / ❌ Overlap at [files] | ## Snapshot Coverage | Component | States | Breakpoints | Status | |-----------|--------|-------------|--------| | TransactionCard | default, pending, failed, loading | — | ✅ | | TransactionList | loaded, empty, loading | mobile, desktop | ✅ | ## Regressions Found [If any] ### [Component] — [State] - **Snapshot diff:** [description of visual change] - **Intentional:** Yes/No - **Action:** Update snapshot / Fix component ## Next Steps [PASS: "Visual baseline established." | FAIL: list regressions with action.]
Proven engineering practices, enforced through skills. Ring is a comprehensive skills library and workflow system for AI agents that transforms how AI assistants approach software development.
Repo: LerianStudio/ring
Other agents on ring.
- codebase-explorer
Deep codebase exploration agent for architecture understanding, pattern discovery, and comprehensive code analysis. Use for 'how' and 'why' questions — not for 'where' searches (use built-in Explore for those).
Open agent - review-slicer
Review Slicer: Adaptive classification engine that evaluates semantic cohesion to decide whether slicing improves review quality. Sits between Mithril pre-analysis and reviewer dispatch. Classification-only — does NOT read source code.
Open agent - backend-go
Senior Backend Engineer specialized in Go for high-demand financial systems. Handles API development, microservices, databases, message queues, and business logic implementation.
Open agent - backend-ts
Senior Backend Engineer specialized in TypeScript/Node.js for scalable systems. Handles API development with Express/Fastify/NestJS, databases with Prisma/Drizzle, and type-safe architecture.
Open agent - bff-ts
Senior BFF (Backend for Frontend) Engineer specialized in Next.js API Routes with Clean Architecture, DDD, and Hexagonal patterns. Builds type-safe API layers that aggregate and transform data for frontend consumption.
Open agent - code-reviewer
Foundation Review: Reviews code quality, architecture, design patterns, algorithmic flow, and maintainability. Runs in parallel with other reviewers at Gate 8.
Open agent

