the-controller-e2e-eval
Use when validating UI changes end-to-end before claiming work is complete — spawns a fresh server pair from the worktree and runs Playwright tests against it
Skill by kwannoel
Chalk Labs
Need help deploying the-controller-e2e-eval?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
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-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.
About
Use cases: design, backend, testing
Reviews
Write a reviewNo 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-e2e-eval
What's inside
- Skill name
the-controller-e2e-eval- Description
- Use when validating UI changes end-to-end before claiming work is complete — spawns a fresh server pair from the worktree and runs Playwright tests against it
- License
- MIT
- Instructions
- 181 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# E2E Eval — User Story Validation
## When to Use
You've made a UI change 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."
## 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 user in Architecture mode")
- **Action**: What they physically do (e.g., "presses `r`")
- **Outcome**: What they expect to see (e.g., "an architecture diagram renders in the diagram pane")
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 presses Space to open the workspace picker, the test presses Space.
- **No synthetic `dispatchEvent(new KeyboardEvent(...))`** — use `page.keyboard.press()`.
- **No stubbing API responses** — the test runs against real servers via `eval.sh`.
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(".diagram-pane")).toBeVisible();
await expect(page.locator(".generate-action")).toBeVisible();
```
**RIGHT** — asserting what the user sees after the action:
```typescript
// This proves the feature works end-to-end
await page.keyboard.press("r");
await expect(
page.locator(".diagram-pane").locator("svg, canvas, .mermaid, img")
).toBeVisible({ timeout: 60_000 });
```
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 "switch to architecture mode AND generate a diagram AND switch back" into one test. The switch-back is cleanup, not a story.
### 6. Timeouts reflect reality
If an action triggers an async operation (e.g., AI-generated diagram, API call), 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. Commit your changes
`eval.sh` requires a clean worktree. Commit all your work before proceeding.
### 2. Determine the worktree path
```bash
WORKTREE_PATH=$(pwd)
```
Verify it's a git worktree (not the main repo):
```bash
if [[ -f "$WORKTREE_PATH/.git" ]]; then
echo "Worktree: $WORKTREE_PATH"
else
echo "WARNING: Not a worktree — you may be in the main repo. Proceeding anyway."
fi
```
**Do NOT** look up `staged_session` in project.json or ask the user to press `v` — that is unrelated to e2e eval.
### 3. Define the core user story
State the user story explicitly before writing test code:
```
Actor: A user in Architecture mode with a project loaded
Action: Presses 'r' to generate the architecture diagram
Outcome: An architecture diagram (SVG/canvas/image) appears in the diagram pane within 60 seconds
```
This is the contract. The test must not pass unless this outcome is achieved.
### 4. Write the test
Create a spec file in `e2e/specs/` that follows the hard rules above:From kwannoel/the-controller, MIT.
More from kwannoel/the-controller
- 0.486score
agent-browser
kwannoel
Use when the user wants browser automation against an existing Chrome or Chromium tab, especially to reuse a real logged-in session without reauthenticating.
SkillDFreshness: D★ 13Claude Code +9 - 0.485score
the-controller-writing
kwannoel
Remove AI writing patterns from prose.
SkillDFreshness: D★ 13Claude Code +9 - 0.481score
the-controller-general-e2e-eval
kwannoel
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…
SkillDFreshness: D★ 13Claude Code +9 - 0.481score
the-controller-finishing-a-development-branch
kwannoel
Use when implementation is complete and you need to merge the branch — verifies tests, rebases, creates PR, squash merges, deletes remote branch, syncs local…
SkillDFreshness: D★ 13Claude Code +9 - 0.481score
the-controller-setting-credentials
kwannoel
Use when an agent needs to set an API key, secret, or credential in a project .env file — ensures secrets never leak into terminal output or conversation…
SkillDFreshness: D★ 13Claude Code +9 - 0.481score
the-controller-validating-agent-applications
kwannoel
Use when building or modifying applications that use AI agents, before shipping or claiming the application works - requires end-to-end validation that…
SkillDFreshness: D★ 13Claude Code +9 - 0.480score
the-controller-autonomous-execution
kwannoel
Use when executing an implementation plan fully autonomously without human interaction
SkillDFreshness: D★ 13Claude Code +9 - 0.477score
the-controller-debugging-ui-with-playwright
kwannoel
Use when a UI behavior doesn't work as expected (key not responding, focus lost, mode not changing) and code reading alone isn't enough — runs Playwright in…
SkillDFreshness: D★ 13Claude Code +9 - 0.476score
the-controller-synchronizing-skills
kwannoel
Use when a new skill has been added to the repo and needs to be symlinked into ~/.claude/skills/ and ~/.codex/skills/custom/ so Claude Code and Codex can…
SkillDFreshness: D★ 13Claude Code +9 - 0.472score
firefox-browser
kwannoel
Firefox browser automation for AI agents using Playwright.
SkillDFreshness: D★ 13Claude Code +9 - 0.472score
the-controller-feedback-widget
kwannoel
Set up an in-app feedback widget with screenshot capture, canvas annotation, and GitHub issue creation.
SkillDFreshness: D★ 13Claude Code +9 - 0.456score
the-controller-receiving-code-review
kwannoel
Use when receiving code review feedback, before implementing suggestions, especially if feedback seems unclear or technically questionable - requires…
SkillDFreshness: D★ 13Claude Code +9
Signals
- Stars
- 13
- Forks
- 2
- Open issues
- 60
- Last commit (this folder)
- Mar 16, 2026 (7 months ago)
- Last release
- Mar 8, 2026 (7 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/kwannoel/the-controller
- Website
- noelkwan.xyz/ctrl
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from kwannoel
- 0.486score
agent-browser
kwannoel
Use when the user wants browser automation against an existing Chrome or Chromium tab, especially to reuse a real logged-in session without reauthenticating.
SkillDFreshness: D★ 13Claude Code +9 - 0.485score
the-controller-writing
kwannoel
Remove AI writing patterns from prose.
SkillDFreshness: D★ 13Claude Code +9 - 0.481score
the-controller-general-e2e-eval
kwannoel
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…
SkillDFreshness: D★ 13Claude Code +9 - 0.481score
the-controller-finishing-a-development-branch
kwannoel
Use when implementation is complete and you need to merge the branch — verifies tests, rebases, creates PR, squash merges, deletes remote branch, syncs local…
SkillDFreshness: D★ 13Claude Code +9 - 0.481score
the-controller-setting-credentials
kwannoel
Use when an agent needs to set an API key, secret, or credential in a project .env file — ensures secrets never leak into terminal output or conversation…
SkillDFreshness: D★ 13Claude Code +9 - 0.481score
the-controller-validating-agent-applications
kwannoel
Use when building or modifying applications that use AI agents, before shipping or claiming the application works - requires end-to-end validation that…
SkillDFreshness: D★ 13Claude Code +9
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get the-controller-e2e-eval running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
the-controller-e2e-eval skill. Agent Mart. https://agentmart.dev/skills/kwannoel-the-controller-e2e-eval (last updated 2026-10-24)