Skip to content
Agentmart
Submit a tool

the-controller-general-e2e-eval

Use when validating UI changes end-to-end in any project before claiming work is complete — runs Playwright tests against the project's dev server to prove…

Skill by kwannoel

IndexedMIT★ 13
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/kwannoel-the-controller-general-e2e-eval

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Use when validating UI changes end-to-end in any project before claiming work is complete — runs Playwright tests against the project's dev server to prove user stories work

Use cases: design, backend, testing

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/the-controller-general-e2e-eval

What's inside

Skill name
the-controller-general-e2e-eval
Description
Use when validating UI changes end-to-end in any project before claiming work is complete — runs Playwright tests against the project's dev server to prove user stories work
License
MIT
Instructions
214 lines in SKILL.md · view on GitHub

Files (1)

  • SKILL.md

SKILL.md (first lines)

# General E2E Eval — User Story Validation

## When to Use

You've made a UI change in any web project and need to prove it works from the user's perspective — not "it compiles" or "the DOM element exists," but "the user can do the thing and see the result."

Use this skill for projects that don't have a custom eval script. If the project has `e2e/eval.sh` or similar, use the project-specific eval skill instead.

## Hard Rules

These are non-negotiable. Every test must follow all of them.

### 1. User story first, always

Before writing a single line of test code, state the user story:

- **Actor**: Who is performing the action (e.g., "a logged-in user on the settings page")
- **Action**: What they physically do (e.g., "clicks 'Save' after changing their display name")
- **Outcome**: What they expect to see (e.g., "a success toast appears and the new name is shown in the header")

The test's **final assertion** must verify the **outcome**. If the outcome doesn't happen, the test fails. No exceptions.

### 2. No silent passes

**BANNED** — the `if (visible)` escape hatch:

```typescript
// NEVER DO THIS — silently passes when the feature is broken
const visible = await foo.isVisible().catch(() => false);
if (visible) {
  await expect(foo).toHaveText("expected");
}
```

**REQUIRED** — unconditional assertion with a timeout:

```typescript
// DO THIS — fails loudly when the feature is broken
await expect(foo).toBeVisible({ timeout: 10_000 });
await expect(foo).toHaveText("expected");
```

If the element should be there, assert it. If it might legitimately not be there, that's a different test or a precondition you need to set up.

### 3. No mocking the interface

- **No `page.evaluate()` to set store state** when a real interaction exists. If the user clicks a button to open a modal, the test clicks the button.
- **No synthetic `dispatchEvent(new KeyboardEvent(...))`** — use `page.keyboard.press()`.
- **No stubbing API responses** — the test runs against a real dev server.

The only acceptable use of `page.evaluate()` is to **read** state for assertions (e.g., checking a computed style), never to **write** state that bypasses the UI.

### 4. Assert outcomes, not implementation

**WRONG** — asserting CSS values and class names:

```typescript
// This proves the DOM exists, not that the feature works
await expect(page.locator(".search-results")).toBeVisible();
await expect(page.locator(".search-input")).toHaveClass(/active/);
```

**RIGHT** — asserting what the user sees after the action:

```typescript
// This proves the feature works end-to-end
await page.locator('[placeholder="Search..."]').fill("playwright");
await page.keyboard.press("Enter");
await expect(
  page.locator('[data-testid="search-results"]').locator("article")
).toHaveCount(3, { timeout: 10_000 });
await expect(page.locator("article").first()).toContainText("playwright");
```

Structure checks (element exists, layout is correct) are fine as **preconditions** or **smoke tests**, but they are not user story validation. The final assertion must be about the **result of the user's action**.

### 5. One story per test

Each `test()` block validates exactly one user story. Don't bundle "log in AND update profile AND log out" into one test. The log-out is cleanup, not a story.

### 6. Timeouts reflect reality

If an action triggers an async operation (e.g., API call, server-side rendering, AI generation), the timeout must be long enough for it to complete in CI. Use 60s for AI/generation operations, 10s for navigation, 30s for server-dependent renders.

## Steps

### 1. Ensure Playwright is installed

Check if the project has Playwright configured:

```bash
ls playwright.config.{ts,js,mjs} 2>/dev/null
```

If missing, initialize:

```bash
npm init playwright@latest
# or: pnpm create playwright / yarn create playwright
```

### 2. Configure the dev server

Playwright can automatically start your dev server. Ensure `playwright.config.ts` has a `webServer` block:

```typescript
// playwright.config.ts
export default defineConfig({
  webServer: {
    command: "npm run dev",      // match your project's dev command
    port: 3000,                   // match your dev server's port
    reuseExistingServer: true,
  },
  // ...
});
```

If the project has **multiple servers** (e.g., a separate API backend):

From kwannoel/the-controller, MIT.

More from kwannoel/the-controller

Signals

Stars
13
Forks
2
Open issues
60
Last commit (this folder)
Mar 17, 2026 (7 months ago)
Last release
Mar 8, 2026 (7 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from kwannoel

Cite this page

the-controller-general-e2e-eval skill. Agent Mart. https://agentmart.dev/skills/kwannoel-the-controller-general-e2e-eval (last updated 2026-10-24)