{"record":{"id":"ba630a47ddda3dbd","repo":"n8n-io/n8n","slug":"select-cases-to-push-pass-slugs-changed","errorCode":null,"errorMessage":"select cases to push: pass <slugs...>, --changed, --filter, or --tier","messagePattern":"select cases to push: pass <slugs\\.\\.\\.>, --changed, --filter, or --tier","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/@n8n/instance-ai/evaluations/cli/langtracer-push.ts","lineNumber":126,"sourceCode":"\t\t\t\treturn { helpRequested: true };\n\t\t\tdefault:\n\t\t\t\tif (arg.startsWith('--')) {\n\t\t\t\t\tthrow new Error(`Unknown flag: ${arg.split('=', 1)[0]} (use --help)`);\n\t\t\t\t}\n\t\t\t\tresult.slugs.push(arg);\n\t\t\t\ti += 1;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!result.suite) throw new Error('--suite <slug|id> is required');\n\tconst hasSelector =\n\t\tresult.slugs.length > 0 ||\n\t\tresult.changed ||\n\t\tresult.filter !== undefined ||\n\t\tresult.tier !== undefined;\n\tif (!hasSelector) {\n\t\tthrow new Error('select cases to push: pass <slugs...>, --changed, --filter, or --tier');\n\t}\n\n\treturn { helpRequested: false, args: result };\n}\n\nfunction nextArg(argv: string[], i: number, flag: string): string {\n\tconst value = argv[i + 1];\n\tif (value === undefined || value.startsWith('--')) throw new Error(`Missing value for ${flag}`);\n\treturn value;\n}\n\n/** New/untracked + staged + modified `data/{workflows,agents}/*.json` slugs, from git. */\nfunction gitChangedSlugs(): string[] {\n\tconst out = execFileSync('git', ['status', '--porcelain', '--untracked-files=all'], {\n\t\tencoding: 'utf-8',\n\t});\n\tconst slugs: string[] = [];\n\tfor (const line of out.split('\\n')) {","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/instance-ai/evaluations/cli/langtracer-push.ts#L108-L144","documentation":"The langtracer-push CLI requires at least one case selector to prevent accidentally pushing all on-disk cases to a remote suite. Valid selectors are: positional slugs, --changed (git-modified files), --filter (substring match on slug), or --tier (cases whose datasets include a tier). If none is provided after parsing, the push is rejected as a safety guard at line 125.","triggerScenarios":"Running `pnpm eval:langtracer-push --suite baseline` with no selector. Also fires when only --exclude is given (it is a modifier, not a selector) or only --dry-run is given.","commonSituations":"Developer forgets to specify which cases to push. Uses only --exclude thinking it selects cases. Assumes --dry-run does not need a selector. Assumes --set-kind or --contains-user-data counts as a selector.","solutions":["Add at least one selector: positional slugs, --changed, --filter <csv>, or --tier <name>","Use --changed to push only git-modified case files","Use explicit slugs: pnpm eval:langtracer-push --suite baseline my-case-1 my-case-2"],"exampleFix":"# before\npnpm eval:langtracer-push --suite baseline\n\n# after\npnpm eval:langtracer-push --suite baseline --changed","handlingStrategy":"validation","validationCode":"const hasSelector =\n  result.slugs.length > 0 ||\n  result.changed ||\n  result.filter !== undefined ||\n  result.tier !== undefined;\nif (!hasSelector) {\n  throw new Error('select cases to push: pass <slugs...>, --changed, --filter, or --tier');\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always include at least one selector (--changed, --filter, --tier, or positional slugs)","Remember that --exclude alone is a modifier, not a selector","Use --changed for the common case of pushing recently modified cases"],"tags":["cli","validation","argument-parsing","langtracer-push"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}