Gate
plugin87/ux-ui-agent-skills
Run the one-command quality gate and report the real N/N result.
How to use the @gate / @force-gate test directives instead of it.skip or fake-green skip patterns.
$ npx skills add vercel/next.js --skill gate-tests -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install vercel/next.js gate-tests --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/vercel/next.js.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/gate-tests .claude/skills/gate-tests && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "gate-tests" agent skill from https://github.com/vercel/next.js/tree/canary/.agents/skills/gate-tests into .claude/skills/gate-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gate-tests", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/vercel/next.js/tree/canary/.agents/skills/gate-testsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add vercel/next.js --skill gate-tests -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install vercel/next.js gate-tests --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vercel/next.js.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/gate-tests .agents/skills/gate-tests && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "gate-tests" agent skill from https://github.com/vercel/next.js/tree/canary/.agents/skills/gate-tests into .agents/skills/gate-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gate-tests", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add vercel/next.js --skill gate-tests -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install vercel/next.js gate-tests --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vercel/next.js.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/gate-tests .cursor/skills/gate-tests && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "gate-tests" agent skill from https://github.com/vercel/next.js/tree/canary/.agents/skills/gate-tests into .cursor/skills/gate-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gate-tests", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/vercel/next.js.git --path .agents/skills/gate-tests--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add vercel/next.js --skill gate-tests -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install vercel/next.js gate-tests --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vercel/next.js.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/gate-tests .gemini/skills/gate-tests && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "gate-tests" agent skill from https://github.com/vercel/next.js/tree/canary/.agents/skills/gate-tests into .gemini/skills/gate-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gate-tests", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install vercel/next.js gate-testsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add vercel/next.js --skill gate-tests -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/vercel/next.js.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/gate-tests .github/skills/gate-tests && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "gate-tests" agent skill from https://github.com/vercel/next.js/tree/canary/.agents/skills/gate-tests into .github/skills/gate-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gate-tests", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add vercel/next.js --skill gate-tests -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install vercel/next.js gate-tests --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vercel/next.js.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/gate-tests .opencode/skills/gate-tests && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "gate-tests" agent skill from https://github.com/vercel/next.js/tree/canary/.agents/skills/gate-tests into .opencode/skills/gate-tests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gate-tests", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
gate-testsHow to use the @gate / @force-gate test directives instead of it.skip or fake-green skip patterns.
Gate Tests is an agent skill from vercel/next.js, published by the product's own GitHub organization. How to use the @gate / @force-gate test directives instead of it.skip or fake-green skip patterns. Use when a test is known-failing under some test-matrix dimension (dev mode, a bundler, an experimental flag like cacheComponents), when converting if (isNextDev) return guards or env-var describe.skip branches, when adding a condition to test/lib/gate/conditions.ts, or when keying a fixture's experimental flag on a NEXTTESTAXIS letter. Covers directive choice, condition tiers, the test-axis fixture pattern…
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 6469906. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Gate Tests loads about 2.7k tokens when it runs. Until then it costs about 143 tokens; SKILL.md has 1,249 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from vercel/next.js at commit 6469906, republished under its MIT licence (© vercel). 1,249 words, ~2,651 tokens.
.claude/skills/gate-tests/SKILL.md (or your agent's skills folder).@gate / @force-gateFull reference: test/lib/gate/README.md.
This skill is the decision guide: which directive to reach for, the standard
conversion patterns, and how to verify.
| Anti-pattern | Replacement |
|---|---|
it.skip('...') for a known failure | // @gate <cond> (or @gate FIXME if no condition explains it) |
if (isNextDev) { test('skipped in dev mode', () => {}); return } | // @force-gate prefetching (or !dev) on the describe |
(flagEnabled ? describe.skip : describe)(...) keyed on process.env | // @force-gate <cond> (lazy) on the describe |
| Duplicating a fixture directory per flag state | one fixture keyed on __NEXT_TEST_AXIS + a @gate/@force-gate |
Branching expectations on process.env.__NEXT_CACHE_COMPONENTS | if (await gate((c) => c.cacheComponents)) (gate from next-test-utils) |
The skip patterns are fake-greens: nothing tells you when the bug they hide is
fixed. @gate still runs the body and fails the suite the day the "known
failure" starts passing, so stale workarounds get deleted instead of rotting.
Ask what kind of difference you're encoding:
gate() —
same condition registry, no inversion — which pinpoints exactly what
differs, and also covers it.each, where a pragma cannot attach:
if (await gate((c) => c.cacheComponents)) { ... } else { ... }. It
mirrors React's gate(flags => ...); a pragma expression string works
too (await gate('cacheComponents && !dev')). A suite-level pragma is
too coarse here — it hides what is different between the states.cacheComponents, optimisticRouting) and the suite is written for one
state. // @gate <cond> on the test or describe. The body runs; a
false condition inverts the expectation (failure absorbed, a pass fails as
"stale gate"). The off state fails for a meaningful reason — the behavior
differs — so a pass is real information: the gate is stale, delete it.// @force-gate <cond> (lazy) on the describe. An API that throws when
its flag is off — or is inert, like useOffline(), which compiles to a
hook that always reports online — can only fail vacuously (often slowly,
by timing out), and browser e2e time is considerable, so skip the run
(and the fixture build) instead of paying for it. Working example:
test/e2e/app-dir/use-offline/. This is discretion, not a rule: when the
flag changes behavior the suite can observe, the off state is meaningful
and @gate buys the staleness check.@force-gate <cond> also when running the body is impossible, not
merely failing: prefetching is off in dev, deploy has no local build
output, the fixture cannot even build under the condition.!dev, bundler…) → real Jest ○ skipped at
collection.describe → the fixture build is skipped when
false; tests report passed-with-⚠ skipped by @force-gate (Jest cannot
skip at runtime). Build-skipping covers start/dev suites where
nextTestSetup owns the build — not skipStart suites, not deploy.// @force-gate prefetching plus
a lazy // @gate <flag> on the same describe.Browser e2e time is not free, so weigh what the gated-off run buys. For a
behavior flag it usually replaces a run that was already being paid for — a
fixture that pins its flags runs identically with and without the axis set,
so keying the flag on an axis converts a redundant duplicate into coverage —
and it is what proves a pass isn't vacuous: a test that passes with the
feature off wasn't testing the feature. Absorbed failures also fail fast, so
the off-state run is cheaper than it sounds. For a new API the calculus
flips: the off state can only throw, which proves nothing, so use a lazy
// @force-gate <flag> on the describe — the fixture build is skipped
too, so the off state costs almost nothing.
Every name in a pragma must be declared in test/lib/gate/conditions.ts
(typos fail the suite at collection). Two tiers:
dev, start, deploy, mode, turbopack,
rspack, webpack, bundler, react18, wasm, linux, macos,
windows, ci; specialized CI variants adapter, nodeMiddleware,
standaloneOutput, turbopackDev, and turbopackBuild; plus the
always-false FIXME/TODO.
prod and prefetching are semantic aliases for !dev — prefer the name
that states why the suite cannot run.next.config
(cacheComponents, ppr, useOffline, output, …).Adding one is a two-line change; follow the guidance at the top of
conditions.ts. The rule that matters: lazy conditions read the resolved
config, never process.env — env vars don't survive config resolution
(__NEXT_CACHE_COMPONENTS only applies when the fixture doesn't set
cacheComponents itself, and resolution implies flags the fixture never
mentions).
Instead of pinning a flag on (which makes the plain and axis runs identical),
key it on a test axis and gate the suite. Axes are lettered (A, B, …) —
a fixed enumeration, not a boolean and not a sharding bucket. Key the flag so
it is enabled by default — then the suite exercises the feature in plain
local runs with no special env, and the axis run covers the off state:
// next.config.js — pin every dimension except the one under test
const nextConfig = {
cacheComponents: true,
experimental: {
concurrentRouterQueue: process.env.__NEXT_TEST_AXIS !== 'A',
},
}// @gate concurrentRouterQueue
it('fails loudly on link navigation', async () => { ... })The plain run exercises the feature; the axis-A run covers the off state —
the gated tests are expected to fail there, and the suite fails the day they
start passing. Working example: test/e2e/app-dir/concurrent-router-queue/
(tests whose expectations hold in both states stay ungated). The same keying
pairs with a lazy @force-gate when the off state proves nothing —
test/e2e/app-dir/use-offline/ — which skips the redundant axis run (build
included) instead of covering it. Axis A aliases __NEXT_CACHE_COMPONENTS
for now (see scripts/run-jest.sh) — fine, because these fixtures pin
cacheComponents explicitly, so that run's env default is a no-op for them.
Keep exactly one flag varying per fixture. A red shard must attribute to a single dimension.
it(, it.each/it.failing, or a pragma inside a
JSDoc block. Prose comments must not begin with @gate. A pragma on a
skipped test (it.skip, xit, …) errors as ambiguous — remove the skip or
the pragma. A skip without a pragma is respected.describe-level gate does not reach it.each tests.test.failing, which does absorb timeouts). Bodies that fail via retry()
timeouts also make the off-state run slow; a fast first assertion is worth
having.afterEach failures (e.g. redbox matchers) are not gated, only the body is.
Hooks under a false lazy @force-gate are the exception: they are skipped
with the suite instead of running against a fixture that was never booted.⚠ gated test failed as expected log line is the only signal.pragma-transform.js bails out early on files containing neither @gate
nor @force-gate as substrings — keep both checks if you touch it.# plain run (flag on): expect normal passes, no warnings
NEXT_SKIP_ISOLATE=1 pnpm test-start-webpack test/e2e/app-dir/<suite>/<suite>.test.ts
# axis run (flag off): expect `⚠ gated test failed as expected (@gate …)`
__NEXT_TEST_AXIS=A NEXT_SKIP_ISOLATE=1 pnpm test-start-webpack test/e2e/app-dir/<suite>/<suite>.test.ts
# dev (static @force-gate !dev): expect `○ skipped` at collection, no fixture boot
NEXT_SKIP_ISOLATE=1 pnpm test-dev-webpack test/e2e/app-dir/<suite>/<suite>.test.tsA suite with a lazy @force-gate on the describe should additionally show
skipping build behavior (no next build) in the state where the condition
is false.
Unit tests for the infrastructure itself: pnpm test-unit test/unit/gate/.
$flags — adding the experimental flag itself (config-shared, schema,
define-env)$router-act — the prefetch-timing patterns most gated suites also use© vercel, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/gate-tests of vercel/next.js.
Open the folder on GitHubat commit 6469906
Gate Tests next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Gate Tests this skillvercel/next.js | 143k | — | ~2.7k | Automated safety check: Pass | MIT | |
| Gateplugin87/ux-ui-agent-skills | 1.6k | — | ~532 | Automated safety check: Pass | MIT | |
| Direction Pickernexu-io/open-design | 100k | — | ~472 | Automated safety check: Warn | Apache-2.0 | |
| Frontend Design Directionaffaan-m/ECC | 276k | 1 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Brain Ingest Gategarrytan/gbrain | 31k | — | ~3.9k | Automated safety check: Pass | MIT | |
| Direction Attributethedaviddias/Front-End-Checklist | 74k | — | ~534 | Automated safety check: Pass | MIT |
plugin87/ux-ui-agent-skills
Run the one-command quality gate and report the real N/N result.
nexu-io/open-design
Resolves the visual direction at the plan stage from the brief and design system, without asking the user.
affaan-m/ECC
Set an ECC-specific frontend design direction for production UI work.
garrytan/gbrain
Pre-write quality gate for content entering the brain. An agent skill from garrytan/gbrain.
thedaviddias/Front-End-Checklist
A skill your agent uses when reviewing templates, rendered HTML, or shared components related to Set text direction for RTL languages.
affaan-m/ECC
Stop hook that blocks Claude from finishing until quality checks pass.
vercel/next.js
Manages stacked PRs and splits multi-part work into reviewable branches with gh-stack.
vercel/next.js
Benchmark React or Next.js changes on Vercel Sandbox VMs with paired A/B statistics: react PR/commit vs base, or Next.js PR/commit vs base, measured end-to-end through the bench/render-pipeline app…
vercel/next.js
Verify Next.js runtime behavior after editing app code. An agent skill from vercel/next.js.
vercel/next.js
Draw diagrams for the Next.js docs in the style of the ones already published there: the light/dark PNGs an mdx references with <Image srcLight="/docs/light/<name.png" srcDark="/docs/dark/<name.png".
vercel/next.js
Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces.
vercel/next.js
Build local React changes in the bundle variants consumed by Next.js, sync them into a local Next.js checkout, and test the resulting integration.
How to use the @gate / @force-gate test directives instead of it.skip or fake-green skip patterns. js, published by the product's own GitHub organization.skip or fake-green skip patterns.
Gate Tests fits situations like: A test is known-failing under some test-matrix dimension (dev mode; an experimental flag like cacheComponents); converting if (isNextDev) return guards; env-var describe.skip branches.
Run `npx skills add vercel/next.js --skill gate-tests -a claude-code`. Or copy the skill folder (.agents/skills/gate-tests in vercel/next.js) into .claude/skills/gate-tests in your project. Claude Code loads it when a task matches its description.
Run `npx skills add vercel/next.js --skill gate-tests -a codex`. Or copy the skill folder (.agents/skills/gate-tests in vercel/next.js) into .agents/skills/gate-tests in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add vercel/next.js --skill gate-tests -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/gate-tests, .gemini/skills/gate-tests, .github/skills/gate-tests and .opencode/skills/gate-tests in your project.
Going by SKILL.md and its folder, Gate Tests needs the command-line tools its instructions call (pnpm).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Gate Tests is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Gate Tests: Gate (plugin87/ux-ui-agent-skills, 1.6k stars), Direction Picker (nexu-io/open-design, 100k stars), Frontend Design Direction (affaan-m/ECC, 276k stars) and Brain Ingest Gate (garrytan/gbrain, 31k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
vercel (a GitHub organization, an official publisher) maintains it in vercel/next.js, which has 143,038 GitHub stars. The repository holds 27 skills in this directory. The repository was last updated on October 9, 2026.
Source: vercel/next.js on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.