Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Quick reference for n8n patterns. Full docs /AGENTS.md
.claude/skills/n8n-io-n8n-conventions/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 61% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-14 | ✗→✓ | ▲ Improved | -29% | 0% |
📚 Full Documentation:
/AGENTS.md - Architecture, commands, workflows/packages/frontend/AGENTS.md - CSS variables, timingUse this skill when you need quick reminders on critical patterns.
Technical writing (comments, PRs, issues, docs):
active voice, one instruction for each sentence
TypeScript:
any → use unknownsatisfies over as (except tests)@n8n/api-typesError Handling:
typescriptimport { UnexpectedError } from 'n8n-workflow'; throw new UnexpectedError('message', { extra: { context } }); // DON'T use deprecated ApplicationError
Frontend:
<script setup lang="ts">)/packages/frontend/AGENTS.md$t('key'))data-testid for E2E (single value, no spaces)Backend:
@n8n/di@n8n/configoffset + limit in controllers and services; translate to TypeORM skip/take only inside repositoriesTesting:
N8N_USER_FOLDER before importing settings codepushd packages/cli && pnpm testDatabase:
GitHub Workflows:
permissions: block(usually contents: read); jobs needing more override at job level
Commands:
bashpnpm build > build.log 2>&1 # Always redirect pnpm typecheck # Before commit pnpm lint # Before commit
> Secrets: pnpm command lines may be recorded verbatim (opt-in dev metrics) — > pass sensitive values via env vars, never inline on the command line.
| Package | Purpose | |---------|---------| | packages/cli | Backend API | | packages/frontend/editor-ui | Vue 3 frontend shell | | packages/modules/<name>/frontend | Frontend feature modules. Guide: packages/@n8n/module-cli/frontend-module-guide.md | | packages/@n8n/api-types | Shared types | | packages/@n8n/db | TypeORM entities | | packages/workflow | Core interfaces |
Pinia Store:
typescriptimport { STORES } from '@n8n/stores'; export const useMyStore = defineStore(STORES.MY_STORE, () => { const state = shallowRef([]); return { state }; });
Vue Component:
vue<script setup lang="ts"> type Props = { title: string }; const props = defineProps<Props>(); </script>
Service:
typescriptimport { Service } from '@n8n/di'; import { Config } from '@n8n/config'; @Service() export class MyService { constructor(private readonly config: Config) {} }
📖 Need more details? Read /AGENTS.md and /packages/frontend/AGENTS.md
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 17,964 | 17,879 | -0% | 1 | 1 | 0% | 3,253 | 4,307 | +32% | 0 | 0 | — |
case-02 | fail→fail | 18,749 | 19,472 | +4% | 1 | 1 | 0% | 4,006 | 4,836 | +21% | 0 | 0 | — |
case-03 | fail→pass | 8,779 | 8,453 | -4% | 1 | 1 | 0% | 1,275 | 2,056 | +61% | 0 | 0 | — |
case-04 | pass→pass | 17,365 | 15,693 | -10% | 1 | 1 | 0% | 3,524 | 4,121 | +17% | 0 | 0 | — |
case-05 | pass→pass | 11,453 | 10,956 | -4% | 1 | 1 | 0% | 2,305 | 3,033 | +32% | 0 | 0 | — |
case-06 | pass→pass | 12,147 | 10,738 | -12% | 1 | 1 | 0% | 2,128 | 3,051 | +43% | 0 | 0 | — |
case-07 | pass→fail | 11,394 | 3,936 | -65% | 1 | 1 | 0% | 1,877 | 1,419 | -24% | 0 | 0 | — |
case-08 | pass→pass | 8,968 | 3,087 | -66% | 1 | 1 | 0% | 1,288 | 1,314 | +2% | 0 | 0 | — |
case-09 | fail→pass | 15,070 | 7,019 | -53% | 1 | 1 | 0% | 2,333 | 2,028 | -13% | 0 | 0 | — |
case-10 | pass→pass | 16,700 | 8,392 | -50% | 1 | 1 | 0% | 2,818 | 2,394 | -15% | 0 | 0 | — |
case-11 | pass→pass | 8,952 | 3,817 | -57% | 1 | 1 | 0% | 1,382 | 1,425 | +3% | 0 | 0 | — |
case-12 | fail→pass | 7,352 | 3,259 | -56% | 1 | 1 | 0% | 1,126 | 1,383 | +23% | 0 | 0 | — |
case-13 | fail→fail | 9,553 | 8,887 | -7% | 1 | 1 | 0% | 1,664 | 1,615 | -3% | 0 | 0 | — |
case-14 | fail→pass | 11,082 | 3,107 | -72% | 1 | 1 | 0% | 1,883 | 1,340 | -29% | 0 | 0 | — |
case-15 | pass→pass | 17,271 | 7,542 | -56% | 1 | 1 | 0% | 2,864 | 2,222 | -22% | 0 | 0 | — |
case-16 | pass→pass | 9,592 | 3,805 | -60% | 1 | 1 | 0% | 1,492 | 1,296 | -13% | 0 | 0 | — |
case-17 | pass→pass | 6,374 | 5,517 | -13% | 1 | 1 | 0% | 1,044 | 1,149 | +10% | 0 | 0 | — |
case-18 | pass→pass | 15,227 | 4,235 | -72% | 1 | 1 | 0% | 2,189 | 1,431 | -35% | 0 | 0 | — |
case-19 | fail→pass | 15,611 | 7,085 | -55% | 1 | 1 | 0% | 2,824 | 1,973 | -30% | 0 | 0 | — |
case-20 | fail→pass | 11,254 | 2,920 | -74% | 1 | 1 | 0% | 1,734 | 1,202 | -31% | 0 | 0 | — |
case-21 | fail→fail | 18,399 | 3,069 | -83% | 1 | 1 | 0% | 2,695 | 1,273 | -53% | 0 | 0 | — |
case-22 | pass→pass | 18,150 | 11,502 | -37% | 1 | 1 | 0% | 3,082 | 2,980 | -3% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.