Source profileQuality 91/100Review permissions

EveryInc/compound-engineering-plugin/skills/ce-dogfood/SKILL.md

ce-dogfood

Hands-off, diff-scoped browser QA of the active branch: maps user flows, drives a real browser, autonomously fixes small breakages with regression tests and commits, judges experience against product personas, and writes a durable dogfood report. Manual invocation only.

Source repository stars
23,773
Declared platforms
0
Static risk flags
3
Last source update
2026-08-04
Source checked
2026-08-04

Decision brief

What it does—and where it fits

Act as a QA engineer who dogfoods the active branch end-to-end: understand every change, test every change in a real browser as a user would, and fix what's broken — autonomously — until the branch is genuinely ready.

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/EveryInc/compound-engineering-plugin --skill "skills/ce-dogfood"
    Safe inspection promptEditorial

    Inspect the Agent Skill "ce-dogfood" from https://github.com/EveryInc/compound-engineering-plugin/blob/6a2a0f9940ab0b3577ce26226ee393390470e412/skills/ce-dogfood/SKILL.md at commit 6a2a0f9940ab0b3577ce26226ee393390470e412. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Workflow

      Parse the arguments you were invoked with: a PR number, a branch name, or blank (use current branch). Strip --port PORT if present.

      Identify the target — keep PR identity; do not switch the working tree yet.PR number: the target is the PR — carry the number through every later step (trunk check, isolation, checkout). Read its head only for display (gh pr view --json headRefName,isCrossRepository), but do not reduce it to a…Branch name: the target is that branch.
    2. 02

      Phase 0: Scope and Get on the Right Branch

      Parse the arguments you were invoked with: a PR number, a branch name, or blank (use current branch). Strip --port PORT if present.

      Identify the target — keep PR identity; do not switch the working tree yet.PR number: the target is the PR — carry the number through every later step (trunk check, isolation, checkout). Read its head only for display (gh pr view --json headRefName,isCrossRepository), but do not reduce it to a…Branch name: the target is that branch.
    3. 03

      Phase 1: Analyze Changes

      Derive the trunk ref once, then pull the full diff against it and read it. Do not hard-code main — a repo whose default branch is master (or anything else) would fail with fatal: ambiguous argument 'main...HEAD'.

      Derive the trunk ref once, then pull the full diff against it and read it. Do not hard-code main — a repo whose default branch is master (or anything else) would fail with fatal: ambiguous argument 'main...HEAD'.
    4. 04

      Phase 2: Map the Flows, Then Build the Matrix

      Do not jump straight to a flat list of pages. First understand the user flows the diff touches, then derive the matrix from them. A matrix built without a flow model tests pages in isolation and misses the journey — the email that "sends" but lands in the wrong thread.

      Do not jump straight to a flat list of pages. First understand the user flows the diff touches, then derive the matrix from them. A matrix built without a flow model tests pages in isolation and misses the journey — the…For every user-visible change, trace the complete journey end to end and draw it. Map each flow as a Mermaid flowchart so the journey is explicit and reviewable before any testing happens — entry point, each user action…Email example: it's not enough that "an email sends." Does it go to the right recipient? When the user clicks through, does the app land on and scroll to the right message? Does the content make sense? Does the whole fl…
    5. 05

      Phase 3: Detect Port and Start the Dev Server

      Determine the port (priority: explicit --port a port explicitly stated in your in-context project instructions package.json dev script .env PORT= default 3000). If a server is already listening on it, reuse it. Otherwise start the project's dev command (bin/dev, rails server, np…

      Determine the port (priority: explicit --port a port explicitly stated in your in-context project instructions package.json dev script .env PORT= default 3000). If a server is already listening on it, reuse it. Otherwis…

    Permission review

    Static risk signals and limitations

    Reads files

    low · line 32

    The documentation asks the agent to read local files, directories, or repositories.

    **Read** `docs_root` from `<repo-root>/.compound-engineering/config.local.yaml`, then `config.yaml`; first non-empty value wins (`<repo-root>` = `git rev-parse --show-toplevel`). Unset -> `<root>` is `docs`, exactly as before.

    Reads files

    low · line 85

    The documentation asks the agent to read local files, directories, or repositories.

    Derive the trunk ref once, then pull the full diff against it and read it. Do not hard-code `main` — a repo whose default branch is `master` (or anything else) would fail with `fatal: ambiguous argument 'main...HEAD'`.

    Runs scripts

    medium · line 108

    The documentation asks the agent to run terminal commands or scripts.

    git diff --name-only "$TRUNK...HEAD" # what changed

    Runs scripts

    medium · line 109

    The documentation asks the agent to run terminal commands or scripts.

    git diff "$TRUNK...HEAD" # how it changed

    Network access

    medium · line 153

    The documentation includes network, browsing, or remote request actions.

    agent-browser open "http://localhost:${PORT}"

    Network access

    medium · line 165

    The documentation includes network, browsing, or remote request actions.

    agent-browser open "http://localhost:${PORT}/<route>"

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score91/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars23,773SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    EveryInc/compound-engineering-plugin
    Skill path
    skills/ce-dogfood/SKILL.md
    Commit
    6a2a0f9940ab0b3577ce26226ee393390470e412
    License
    MIT
    Collected
    2026-08-04
    Default branch
    main
    View the original SKILL.md

    Dogfood

    Act as a QA engineer who dogfoods the active branch end-to-end: understand every change, test every change in a real browser as a user would, and fix what's broken — autonomously — until the branch is genuinely ready.

    This is diff-scoped, not whole-app exploration. You test what this branch introduced or modified versus the trunk.

    Use agent-browser Only For Browser Automation

    This workflow drives the browser exclusively through the agent-browser CLI. Do not use Chrome MCP tools (mcp__claude-in-chrome__*), any browser MCP integration, or other built-in browser-control tools. If the platform offers multiple ways to control a browser, always choose agent-browser. Use the direct binary, never npx agent-browser (the direct binary uses the fast Rust client).

    Prerequisites

    User-runnable invocation rendering. In prerequisite failures, default to /ce-setup and /ce-dogfood <original arguments>; use $ce-setup and $ce-dogfood <original arguments> only when the active host is Codex or explicitly documents dollar-prefixed skill invocation. Render only each invocation as inline code and output one form only.

    • A local dev server you can start (bin/dev, rails server, npm run dev, etc.).

    • agent-browser installed. Check:

      command -v agent-browser >/dev/null 2>&1 && echo "Ready" || echo "NOT INSTALLED"
      

      If not installed, stop and tell the user to install agent-browser: print the rendered ce-setup invocation for the current install command, followed by the rendered ce-dogfood <original arguments> invocation to retry. This workflow cannot function without it.

    Artifact Root

    This skill writes dogfood reports under <root>/dogfood-reports/ and personas under <root>/personas/. Resolve <root> when you first compose a <root>/ path (per the block below), never before you need it. A write to <root>/... and a read of <root>/solutions/ both count as composing a <root>/ path, so either one triggers resolution; only a run that touches no <root>/ path at all -- a scratch-only or no-repo flow -- skips it.

    Resolve the CE artifact root <root> before composing any artifact path.

    • Read docs_root from <repo-root>/.compound-engineering/config.local.yaml, then config.yaml; first non-empty value wins (<repo-root> = git rev-parse --show-toplevel). Unset -> <root> is docs, exactly as before.
    • Validate a set value: a repo-relative directory whose real, symlink-resolved path stays inside the repo and is neither the repo root nor under .git/. Otherwise stop with an error naming docs_root and the value -- never fall back to docs.
    • Use <root> as the sole artifact location: create it if absent, compose each path as <root>/<subdir> with this skill's own subdirectory, and never also read docs.

    Reusing Compound-Engineering Skills

    ce-dogfood is an orchestrator. Prefer delegating to existing CE skills over re-deriving their behavior:

    WhenSkillWhy
    Phase 0 isolationce-worktreeRun the dogfood in an isolated worktree so the main checkout stays clean.
    A failure's root cause is non-obviousce-debugSystematic root-cause analysis instead of guess-and-check.
    Committing each fixce-commitConsistent, well-scoped commit messages.
    A bug reveals a reusable lessonce-compoundCapture the learning so the team compounds knowledge.

    Workflow

    0. Scope        Pick the branch, get onto it (offer worktree), never touch the trunk
    1. Analyze      Diff branch vs trunk, understand every change
    2. Map+Matrix   Map user flows as Mermaid flowcharts, then derive the test matrix as a task list
    3. Serve        Detect port, start dev server, open agent-browser
    4. Execute      Work the matrix one item at a time with agent-browser
    5. Fix loop     On failure: fix -> add regression test -> commit -> continue
    6. Report       Write durable doc to <root>/dogfood-reports/ (flows, matrix, fixes, learnings, verdict)
    

    Phase 0: Scope and Get on the Right Branch

    Parse the arguments you were invoked with: a PR number, a branch name, or blank (use current branch). Strip --port PORT if present.

    1. Identify the target — keep PR identity; do not switch the working tree yet.
      • PR number: the target is the PR — carry the number through every later step (trunk check, isolation, checkout). Read its head only for display (gh pr view <number> --json headRefName,isCrossRepository), but do not reduce it to a bare branch name: a fork PR's head can even be named main/master. Do not check out yet.
      • Branch name: the target is that branch.
      • Blank: the target is the current branch.
    2. Refuse to run on the trunk — branch/blank targets only. If a branch-name or blank target resolves to the trunk (main/master/the detected default), stop — there is no diff to dogfood. A PR is always diffable (it has a base), so this check never applies to a PR target; never refuse a ce-dogfood <number> invocation just because the PR's head branch happens to be named main.
    3. Decide isolation by what you're testing; let ce-worktree own the worktree mechanics. Do not re-derive worktree detection or creation here — ce-worktree handles existing-isolation detection, the harness-native tool, attaching to a ref, and the "already checked out" constraint, and reports its decision back. The only call this skill makes is whether to ask for isolation at all:
      • Blank / current-branch target: do not isolate — dogfood in place. You are already on the branch under test, the fix-commits belong on it, and git cannot check the same branch out in a second worktree anyway. (If you happen to already be in a worktree, that is fine — you are simply dogfooding here.)
      • A PR or a different named branch: this is an existing ref to test without disturbing your current checkout. Offer isolation (platform's blocking question tool). On yes, invoke ce-worktree to isolate that target ref — it attaches a worktree to the ref (or, if already isolated, checks it out in place; or reports "already checked out at <path> — work there" when the ref is live elsewhere). Act on ce-worktree's verdict; the primary checkout is never switched. On no, check the target out in place (gh pr checkout <number> for a PR, git checkout <branch> for a branch), confirming first if uncommitted changes would be disturbed.
    4. Resume if a prior run exists. Look for an existing report at <root>/dogfood-reports/*-<branch-slug>-dogfood.md (see the branch-slug rule under Resumability). If one is found with unfinished scenarios, ask whether to resume it or start fresh. To resume, re-hydrate the task list from its matrix: Pass/Fixed/Skipped stay done; Pending and in_progress become the remaining auto-runnable work. The two Blocked states are not auto-runnable — Blocked (needs human verify) and Blocked (human decision) are waiting on a person, so surface them to the user and ask how to proceed rather than silently re-queuing them.

    Resumability (stop and return at any point)

    This workflow is designed to be interrupted and resumed. Two pieces of state make that safe:

    • The task list (the harness's task tool — TaskCreate/TaskUpdate on Claude Code, update_plan on Codex, or the equivalent elsewhere) is the live to-do — one task per matrix scenario. Mark each in_progress when you start it and completed only when it genuinely passes.
    • The report doc at <root>/dogfood-reports/<YYYY-MM-DD>-<branch-slug>-dogfood.md is the durable checkpoint that survives across sessions. <branch-slug> is the branch name lowercased with every run of non-alphanumeric characters (slashes included) collapsed to a single - (e.g. feature/Foo_Bar -> feature-foo-bar). Create it as soon as the matrix exists (end of Phase 2) by instantiating references/dogfood-report-template.md (read that template now if you haven't) so the checkpoint carries the template-owned section shape from the start — then fill in every scenario at Pending, and update it incrementally — after each scenario is judged and after each fix is committed — not only at the end. An interrupted run must leave a template-shaped checkpoint, not a bare matrix.

    Because tasks are session-scoped but the report doc is on disk, the report is the source of truth for resuming. Always keep the two in sync so a later run (or a teammate) can pick up exactly where this one stopped.

    Phase 1: Analyze Changes

    Derive the trunk ref once, then pull the full diff against it and read it. Do not hard-code main — a repo whose default branch is master (or anything else) would fail with fatal: ambiguous argument 'main...HEAD'.

    # Resolve the trunk to a ref that actually exists. Start from the detected
    # default name (origin/HEAD, then gh), then fall back to common names. For each
    # candidate prefer a local branch; else use the remote-tracking ref QUALIFIED as
    # origin/<branch> — an unqualified name resolves via refs/remotes/<name>, NOT
    # refs/remotes/origin/<name>, so a remote-only trunk would otherwise miss. This
    # qualification applies to the detected default too (PR/CI checkouts often have
    # only origin/main, no local main).
    DEFAULT=$(git symbolic-ref --quiet --short refs/remotes/origin/HEAD 2>/dev/null | sed 's@^origin/@@')
    DEFAULT=${DEFAULT:-$(gh repo view --json defaultBranchRef -q .defaultBranchRef.name 2>/dev/null)}
    TRUNK=""
    for cand in "$DEFAULT" main master; do
      [ -n "$cand" ] || continue
      if git show-ref --verify --quiet "refs/heads/$cand"; then
        TRUNK=$cand; break
      elif git show-ref --verify --quiet "refs/remotes/origin/$cand"; then
        TRUNK="origin/$cand"; break
      fi
    done
    TRUNK=${TRUNK:-main}
    
    git diff --name-only "$TRUNK...HEAD"   # what changed
    git diff "$TRUNK...HEAD"               # how it changed
    

    Build a mental model of every change: new features, modified behavior, new routes/views/components, touched data flows. Note anything that produces user-visible behavior — that is what the matrix must cover.

    Ground in the product's personas and vision. Look for persona and vision context so flows can be judged from real users' eyes, not just "does it work." Check, in order: STRATEGY.md (its "Who it's for" section names the primary persona and their job-to-be-done), VISION.md, and any persona docs (e.g. <root>/personas/, PERSONAS.md). Capture the 1-3 primary personas and what each cares about. If none exist, infer a reasonable primary persona from the product and the diff, and say so in the report.

    Phase 2: Map the Flows, Then Build the Matrix

    Do not jump straight to a flat list of pages. First understand the user flows the diff touches, then derive the matrix from them. A matrix built without a flow model tests pages in isolation and misses the journey — the email that "sends" but lands in the wrong thread.

    2a. Map the user flows (required)

    For every user-visible change, trace the complete journey end to end and draw it. Map each flow as a Mermaid flowchart so the journey is explicit and reviewable before any testing happens — entry point, each user action, branch points (success / validation error / empty / permission-denied), side effects (emails, jobs, notifications), and the true end state.

    Email example: it's not enough that "an email sends." Does it go to the right recipient? When the user clicks through, does the app land on and scroll to the right message? Does the content make sense? Does the whole flow align with the product's vision and UX? The flowchart must carry the click-through and its destination, not stop at "email sent."

    flowchart TD
        A[User opens /threads] --> B[Clicks 'Reply']
        B --> C{Form valid?}
        C -->|No| D[Inline validation error shown]
        C -->|Yes| E[Reply saved]
        E --> F[Notification email sent to thread participants]
        E --> G[UI scrolls to new reply, focus on it]
        F --> H[Recipient clicks email link]
        H --> I{Lands on correct thread + scrolls to the reply?}
    

    Produce one flowchart per distinct journey, scaled to the diff: a one-route or copy-only change gets a single small flowchart, a multi-step feature gets several. Cover the happy path and the branch points (error, empty, boundary, permission). Mapping the flows before the matrix is never skipped — these diagrams ARE the understanding; they become the spine of the matrix and belong in the final report.

    2b. Derive the matrix from the flows

    Walk each flowchart and turn every node and branch into one or more test scenarios. Read references/test-matrix-taxonomy.md for the full set of dimensions (journeys, functional checks, experiential checks, edge/error/empty states, accessibility, responsiveness). Cover both functional ("does it work?") and experiential ("does it feel right and align with the product?").

    Map changed files to concrete routes (views -> their pages, components -> pages rendering them, layouts -> all pages, stylesheets -> visual regression on key pages) and attach those routes to the flows that exercise them.

    Load the matrix as a task list (the harness's task tool, as above), one task per scenario, so progress is tracked and nothing is skipped. Order tasks by flow, following the flowcharts, not by file.

    Phase 3: Detect Port and Start the Dev Server

    Determine the port (priority: explicit --port > a port explicitly stated in your in-context project instructions > package.json dev script > .env* PORT= > default 3000). If a server is already listening on it, reuse it. Otherwise start the project's dev command (bin/dev, rails server, npm run dev, etc.) in the background and poll the port until it accepts connections before opening the browser. This skill is hands-off, so start the server automatically without asking — do not block on a confirmation.

    agent-browser open "http://localhost:${PORT}"
    agent-browser snapshot -i
    

    Phase 4: Execute the Matrix

    Work the task list one item at a time. For each scenario, mark the task in_progress, then:

    1. Document what you're testing (the journey and the expected outcome).

    2. Drive it with agent-browser — navigate, snapshot for interactive refs, click, fill, submit, follow the journey to its real end state:

      agent-browser open "http://localhost:${PORT}/<route>"
      agent-browser snapshot -i
      agent-browser click @e1
      agent-browser fill @e2 "value"
      agent-browser screenshot "$(mktemp -d "${TMPDIR:-/tmp}/ce-dogfood-XXXXXX")/<scenario>.png"   # scratch dir, not the repo root
      agent-browser errors      # check console/page errors
      

      Write transient screenshots to OS temp (e.g. mktemp -d "${TMPDIR:-/tmp}/ce-dogfood-XXXXXX"), never the repo root. Only copy a screenshot into the report's location if you intend to embed it in the final report.

    3. Judge both correctness and experience: right data, right destination, sensible content, no console errors, and does it feel aligned with the product?

    4. Walk it as each persona. Re-run the journey in your head from each primary persona's perspective (from Phase 1) and ask where they'd feel a paper cut — a small friction that wouldn't fail a functional test but degrades the experience: a confusing label, an extra click, an unexpected jump, a slow-feeling step, missing feedback, copy that doesn't match how that persona thinks. A scenario can be functionally Pass yet still carry paper cuts. Note each paper cut, which persona feels it, and its severity.

    5. Record pass/fail plus any paper cuts, with specifics. Mark the task completed only when it genuinely passes. Paper cuts do not block a Pass, but a sharp paper cut (one severe enough to fix now) is routed into the Phase 5 fix loop just like a failure — apply the same auto-fix-vs-escalate judgment to it. Log the rest in the report.

    External-interaction flows (OAuth, real email delivery, payments, SMS) can't be fully driven headlessly — pause, ask the user to verify that leg, and mark the scenario Blocked (needs human verify) until they confirm. Then continue.

    Phase 5: Fix Loop (Autonomous)

    When a scenario fails — or a passing scenario carries a sharp paper cut worth fixing now — fix it and prove it, but first decide whether the fix is yours to make autonomously or a human's to decide.

    Judge the size of the fix before touching code. Auto-fix when the change is small, well-understood, and low-risk: a clear bug with an obvious correct fix, contained to a few files, no schema/architecture/product trade-off. Do not auto-fix when the change is large or ambiguous — it requires an architectural or schema decision, changes product behavior or UX intent, spans many files, has plausible competing solutions, or you're not confident the "right" answer is unambiguous. Forcing a big judgment call autonomously is worse than escalating it.

    For autonomous fixes:

    1. Investigate the root cause. If it's non-obvious, use ce-debug.
    2. Apply the fix in the code.
    3. Add an automated regression test that fails before the fix and passes after, so the bug can't return. This is the default for behavioral and code bugs. When an automated test is genuinely impractical — a pure copy, spacing, or visual fix with no behavioral assertion to make — substitute a documented browser-replay or screenshot check and state in the report why no automated test was meaningful. Do not invent a hollow test just to satisfy the step.
    4. Commit the fix with a clear message (use ce-commit). One logical fix per commit.
    5. Re-run the failing scenario in the browser to confirm it now passes; then continue the matrix.
    6. If the bug carried a reusable lesson, capture it with ce-compound.

    For changes too big to make autonomously: do not implement. Record it in the report's Decisions for a human section with: what's broken, why it's not a safe autonomous fix, the options you see (with trade-offs), and your recommendation. Mark the scenario Blocked (human decision) in the matrix, then continue with the rest. Never make a large, irreversible, or product-altering change just to clear a matrix item.

    Keep iterating until every task is completed or in a terminal Blocked state — Blocked (human decision) (escalated here) or Blocked (needs human verify) (set in Phase 4 for external-interaction legs). Both are terminal for the loop: they wait on a person, so do not re-queue them. Re-test anything a fix might have affected (watch for regressions in adjacent journeys).

    Before declaring the branch ready, run the project's automated test suite once (the new regression tests plus everything that already exists). Discover the test command from the project's active instructions and conventions already in your context — do not assume a specific runner. Record the result in the report; a green matrix with a red suite is not "ready."

    Phase 6: Write the Report Artifact

    The report doc was created at the end of Phase 2 and updated incrementally throughout (see Resumability). When the matrix is green (or every remaining item is explicitly blocked), finalize it at <root>/dogfood-reports/<YYYY-MM-DD>-<branch-slug>-dogfood.md in the repo under test, then surface a short summary in chat with the file path.

    Finalize against references/dogfood-report-template.md — the same template the Phase 2 checkpoint was instantiated from, which owns the required sections and what each must carry. Confirm every template-owned section is present and complete; do not reconstruct the section list from memory, as that drifts from the template. Carry forward the cross-phase obligations this skill produced: the Mermaid flowcharts from Phase 2a, a matrix row per scenario with its commit SHA, each fix's root cause and the regression test added (or why none was meaningful), paper cuts attributed by persona, learnings worth feeding to ce-compound, and a final readiness verdict that records the Phase 5 automated-suite result.

    Alternatives

    Compare before choosing

    Computed 10023,781

    alirezarezvani/claude-skills

    app-store-optimization

    App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist

    Computed 9832,606

    K-Dense-AI/scientific-agent-skills

    dask

    Distributed computing for larger-than-RAM pandas/NumPy workflows. Use when you need to scale existing pandas/NumPy code beyond memory or across clusters. Best for parallel file processing, distributed ML, integration with existing pandas code. For out-of-core analytics on single machine use vaex; for in-memory speed use polars.

    Computed 9832,606

    K-Dense-AI/scientific-agent-skills

    neurokit2

    Use NeuroKit2 to build or audit reproducible research workflows for physiological time-series preprocessing, event/interval analysis, multimodal alignment, variability, and complexity. Trigger when code imports neurokit2 or needs its current APIs, schemas, and method-aware validation—not for diagnosis or device validation.

    Computed 9814,225

    wanshuiyin/Auto-claude-code-research-in-sleep

    proof-checker

    Use it for engineering and operations tasks; the detail page covers purpose, installation, and practical steps.