n8n-io/n8n · error · Error
${String(dropped.length)} case(s) did not round-trip: the fi
Error message
${String(dropped.length)} case(s) did not round-trip: the fields above were sent but are absent from the suite export. A lang-tracer deployment can silently ignore a key it predates (`seed` needs #113, `attach` needs #119) — upgrade it, then re-push. The cases in the suite are NOT what you authored until you do. What it means
After pushing cases to lang-tracer, the CLI re-exports the suite and diffs each case against what was authored. If keys that were sent are missing from the export, it concludes the deployment silently dropped them — known gaps are `seed` (needs lang-tracer PR #113) and `attach` (needs #119). The throw is deliberate because the stored suite is not what you authored.
Source
Thrown at packages/@n8n/instance-ai/evaluations/cli/langtracer-push.ts:294
if (written.length === 0) return;
const after = await client.exportSuite(suiteId);
const dropped = written
.map((item) => ({
fileSlug: item.fileSlug,
keys: comparableDiff(after.files[`${item.fileSlug}.json`], item.testCase),
}))
.filter((result) => result.keys.length > 0);
if (dropped.length === 0) {
console.log(` verified ${String(written.length)} case(s) round-trip intact`);
return;
}
for (const result of dropped) {
console.error(` ! ${result.fileSlug}: server did not store ${result.keys.join(', ')}`);
}
throw new Error(
`${String(dropped.length)} case(s) did not round-trip: the fields above were sent but are absent from the suite export. ` +
'A lang-tracer deployment can silently ignore a key it predates (`seed` needs #113, `attach` needs #119) — ' +
'upgrade it, then re-push. The cases in the suite are NOT what you authored until you do.',
);
}
function printBucket(label: string, slugs: string[]): void {
const pad = label.padEnd(9);
console.log(` ${pad} ${String(slugs.length)}${slugs.length ? ` (${slugs.join(', ')})` : ''}`);
}
main().catch((error: unknown) => {
console.error(error instanceof Error ? error.message : String(error));
process.exit(1);
});
View on GitHub (pinned to 5ac6606e81)
Solutions
- Upgrade the lang-tracer deployment to a version that includes PR #113 (`seed`) and #119 (`attach`).
- Re-run `langtracer-push` after the upgrade so the dropped keys are accepted.
- If you cannot upgrade immediately, temporarily remove `seed`/`attach` from the affected cases so the round-trip is clean, then restore them post-upgrade.
Defensive patterns
Strategy: validation
Validate before calling
// Before pushing, query the lang-tracer deployment version / changelog
// and skip cases using keys it predates:
const supportsSeed = serverVersion.gte('0.x.y'); // post-#113
const safeCases = cases.filter(c => supportsSeed || !('seed' in c)); Try / catch
try { await push(cases); } catch (e) {
if (e instanceof Error && e.message.includes('did not round-trip')) { /* upgrade lang-tracer, retry */ }
else throw e;
} Prevention
- Pin and document the minimum lang-tracer version that supports seed/attach.
- Run the round-trip check in CI against a staging lang-tracer before publishing cases.
- Track which cases use seed/attach so a version bump risk is visible.
When it happens
Trigger: Pushing cases that use `seed` or `attach` fields against a lang-tracer deployment older than the versions that introduced those keys; pointing the CLI at a stale/staging lang-tracer instance.
Common situations: Upgrading the eval CLI but not the lang-tracer server; running against a teammate's older local lang-tracer; CI using a cached older lang-tracer image.
Related errors
- duplicate case slug(s) across data/workflows and data/agents
- Restore was asked to seed ${String(agents.length)} agent(s)
- Eval "${this.evalName}": cannot use both .check() and .judge
- Eval "${this.evalName}" requires either .check() or .judge()
- Eval "${this.evalName}" uses .judge() but no .model() was se
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/9a3f2bb75ecadcc3.
Report an issue: GitHub.