算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
test-qa【设计与创意】Web-app CRUD and story QA when no project-specific skill applies. Use when "QA the app", "test CRUD", or "smoke test". Native → mobile-emulator-test. Guest vs logged in → test-exploratory. Pixel diffs → test-visual-regression.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Degree of freedom: MIXED — story generation and severity [HIGH freedom];
session, anti-stall, and CRUD verify-after-refresh [LOW freedom — run exactly].
Driver is playwright-cli, never Playwright MCP. Guest-vs-authed wander is
test-exploratory — do not reclaim it.
Full QA of a live webapp as a senior QA engineer preparing a production release: user-story-driven coverage, CRUD, data-pipeline integrity, UX, and edge cases. This is not a page-navigation monkey test. Your turn ends after Phase 5 with every discovered route crawled and every CRUD entity proven after refresh — not after the crawl with CRUD still owed, and not with an auth-required page silently skipped instead of marked BLOCKED.
Read protocol-browser-anti-stall before any browser step (Rule 0: manual &
headed). Also references/playwright-session-coordination.md in that folder.
| Skill | Owns |
|---|---|
| test-qa (this) | Story-driven CRUD + smoke; persist after refresh (+ DB) |
test-exploratory | Unscripted wander + guest vs authed diff |
test-playwright | This-diff PDCA + fix-as-you-go |
test-red-team | Hostile feature×dimension matrix |
test-visual-regression | Pixel baselines |
plan-stub-checker | Dead buttons / fake components (plan) |
Observe: POST /api/items 201; list shows "QA-TEST-Widget"; after hard
gotothe row is gone. Console clean. Interpret: optimistic UI; write never persisted. Classify: FAIL — data pipeline (ghost create). Severity: Critical — CRUD not verified E2E.
playwright-cli action at a time.
eval / run-code inspection-only. No *.spec.ts, no npx playwright test.QA-TEST- data. Leave auth session intact.Read the dependency manifest (package.json, requirements.txt,
pyproject.toml, Cargo.toml, go.mod). Record framework, UI lib, auth,
DB/ORM, state, CSS, and scripts.dev port (3000 / 3001 / 5173 / 5174).
| Framework | Scan Pattern |
|---|---|
| Next.js App Router | app/**/page.tsx or app/**/page.js |
| Next.js Pages | pages/**/*.tsx (excluding _app, _document) |
| Remix | app/routes/**/*.tsx |
| SvelteKit | src/routes/**/+page.svelte |
| Nuxt | pages/**/*.vue |
| React Router (SPA) | Grep for <Route or createBrowserRouter |
| Django | urls.py files |
| Rails | config/routes.rb |
For each route: path, dynamic segments, layout nesting, auth guard.
| Source | Where |
|---|---|
| Supabase migrations | supabase/migrations/*.sql — tables, RLS |
| Prisma schema | prisma/schema.prisma |
| Drizzle schema | drizzle/schema.ts or src/db/schema.ts |
| TypeScript types | types/*.ts, **/types.ts |
| API routes | app/api/** — CRUD endpoints |
| Feature files | features/*/ — services, hooks, components |
For each entity: name, key fields, CRUD capabilities, relationships.
Provider config (createClient, NextAuth, ClerkProvider, Auth0Provider);
login (signIn / login / authenticate); test credentials (.env.local,
.env.test, .env.example, README); protected routes (middleware, guards).
Feature-directory READMEs (@_*-README.md, docs/) for expected behavior.
APP DISCOVERY:
- Framework: [name + version]
- Dev server: http://localhost:[port]
- Auth: [provider + method]
- Test account: [email / password, or "none found — ask user"]
- Routes discovered: [count]
- Public: [list]
- Auth-required: [list]
- Dynamic: [list with param patterns]
- Data entities: [list with CRUD capabilities]
- API endpoints: [count]
Check the terminals folder for npm run dev / pnpm dev / next dev. If
none, tell the user and stop.
-s=qa-<app>; never reuse another agent's name.--persistent --profile if login is required:PW="npx --yes @playwright/cli@latest"
$PW -s=qa-<app> open --headed http://localhost:3000
sleep 2
$PW -s=qa-<app> snapshot
$PW -s=qa-<app> screenshot --filename .playwright-mcp/qa-baseline.png
$PW -s=qa-<app> console
$PW -s=qa-<app> requests
Blank after 3 incremental waits (6s) → blocker.
Follow protocol-browser-anti-stall/references/playwright-session-coordination.md.
state-load .playwright-mcp/auth/<host>.json if it exists (or reuse the
--persistent --profile directory)..env.test / README (never paste secrets).state-save .playwright-mcp/auth/<host>.json.If auth is impossible, mark auth-required pages BLOCKED and test public only.
BASELINE:
- URL: [current URL]
- Console errors: [count — list if any]
- Network failures: [count — list if any]
- Visible content: [brief description]
- Screenshot: [reference]
For EVERY route from Phase 0b:
goto → anti-stall (2s → snapshot → verify) → screenshot → console →
requests.
| Classification | Signals |
|---|---|
| CRUD page | Forms, edit/delete, data tables |
| Display page | Data, no mutation (dashboards, profiles) |
| Settings page | Toggles, selects, save for preferences |
| Auth page | Login, register, forgot password |
| Static page | About, terms, privacy |
| Navigation hub | Links to children (home, index) |
| Check | What to Look For |
|---|---|
| Dead page | 404, error boundary, blank |
| Console errors | JS / React errors, failed assertions |
| Network failures | 4xx/5xx, CORS, timeouts |
| Missing content | "undefined", "null", "NaN", "[object Object]" |
| Mock data | "Lorem ipsum", "TODO", "test", "example@" |
| Dead buttons | No onClick / navigate nowhere (snapshot) |
| Missing metadata | Empty or generic document.title |
| Loading stuck | Spinner/skeleton after 6s |
| Empty state | No data AND no helpful empty message |
| Broken images | Missing/broken src or error fallback |
| Overflow | Text/elements past their containers |
FEATURE MAP:
- CRUD pages: [entity + operations]
- Forms found: [page + purpose]
- Data displays: [tables, lists, cards, charts]
- Interactive elements: [buttons, toggles, dropdowns per page]
- Search/filter: [pages]
- Settings: [configurable preferences]
- Dead buttons found: [page + element]
- Pages with errors: [list]
Stories come from the feature map, not a canned list.
| Cat | Story | Drive |
|---|---|---|
| A | First impression | Home: value prop in 3s, CTA, guest-reachable nav, trust |
| B | Core journey | Primary purpose from Phase 0, start to finish |
| C | CRUD per entity | Phase 4 — verify persist after refresh (+ DB) |
| D | Navigation | Every nav link, back/forward, breadcrumbs, no dead ends |
| E | Search/filter | Known hit, empty miss + helpful empty, filters |
| F | Errors | Empty required, invalid input, /nonexistent 404, network fail |
| G | Settings | Change, navigate away, come back — preference persisted |
For each CRUD-capable entity, run the lifecycle.
snapshotQA-TEST-[field]-[timestamp]; domain-sane
numbers/dates; valid select; non-default togglescreenshot before submitrequests must be 2xx; snapshot + screenshot for success
feedback (toast, redirect, confirmation)Record the item's ID, name, and URL.
List view → find the item → displayed fields match → detail view (if any)
matches → screenshot.
Edit 1–2 fields → screenshot before save → save → requests 2xx → UI
updates → hard-refresh (goto same URL) → changes still there.
screenshot before → delete (+ confirm if any) → requests 2xx → gone from
list → detail URL is 404 or redirect.
<script>alert('xss')</script>, '; DROP TABLE,
emoji, UnicodeAfter each mutation:
requests: call made? status?goto same page, still visible?supabase:execute_sql
{
"query": "SELECT * FROM <table> WHERE <identifying_column> LIKE 'QA-TEST-%' ORDER BY created_at DESC LIMIT 5"
}
Pipeline failures: optimistic UI but API failed; stale cache; missing invalidation (item appears only after refresh); ghost data (deleted item returns); silent 4xx/5xx.
Assess each page. Layout breakage → audit-responsive. Empty/error chrome →
audit-ui-states. Do not re-own those audits.
| Check | How to Verify |
|---|---|
| Consistent spacing | Screenshot — no irregular gaps or cramped areas |
| Typography | No mixed sizes where they should match; no orphaned headings |
| Truncation | Ellipsis where appropriate, not clipped |
| Image loading | All images render; no broken-image icons |
| Icons | All icons render (no missing squares) |
| Dark mode | If supported: toggle; no white flashes |
| Responsive | 1280 / 768 / 375 — layout adapts without breaking |
| Check | How to Verify |
|---|---|
| Dead buttons | Click every button. Does it do something? |
| Form labels | Every input has a visible label or accessible name |
| Loading states | Data fetch shows a loading indicator |
| Success feedback | After mutations — toast, confirmation, or visual change |
| Error feedback | Failures — helpful, visible |
| Disabled states | Visually distinct; reason clear |
| Focus management | After modal close or submit, focus moves |
| Check | How to Verify |
|---|---|
| Page titles | document.title descriptive and unique |
| Active nav state | Current page highlighted |
| Dead ends | Any page with no way forward or back? |
| Empty states | No data — helpful message? |
| 404 page | /nonexistent-page — helpful 404? |
QA-TEST- rows gone; auth session left intacttest-exploratory; pixel →
test-visual-regression; hostile → test-red-team