{"record":{"id":"0bcd2e8e8d05e38d","repo":"windmill-labs/windmill","slug":"what-failed-n-output","errorCode":null,"errorMessage":"${what} failed:\\n${output}","messagePattern":"(.+?) failed:\\\\n(.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"backend/windmill-api/src/apps_raw_bundler.ts","lineNumber":72,"sourceCode":"\tfor (const [p, content] of Object.entries(shared_ui ?? {})) {\n\t\tawait write('ui/' + p.replace(/^\\/+/, ''), content)\n\t}\n\n\tconst manifest = path.join(dir, 'package.json')\n\tconst hasPackageJson = Object.keys(files ?? {}).some((p) => target(p) === manifest)\n\t// Piped rather than inherited so the output can go in the error too, then\n\t// echoed either way — the job's log is where someone looks to see what the\n\t// build did.\n\tconst spawn = (argv: string[]) => {\n\t\tconst proc = Bun.spawnSync(argv, { cwd: dir, stdout: 'pipe', stderr: 'pipe' })\n\t\tconst output = proc.stdout.toString() + proc.stderr.toString()\n\t\tconsole.log(output)\n\t\treturn { ok: proc.exitCode === 0, output }\n\t}\n\tconst run = (argv: string[], what: string) => {\n\t\tconst { ok, output } = spawn(argv)\n\t\tif (!ok) {\n\t\t\tthrow new Error(`${what} failed:\\n${output}`)\n\t\t}\n\t\treturn output\n\t}\n\n\tif (hasPackageJson) {\n\t\t// Installed here rather than left to the CLI so it can be --ignore-scripts:\n\t\t// the app's dependencies are compiled, never run, so a package's lifecycle\n\t\t// script has no business executing on the worker. The CLI skips its own\n\t\t// install once node_modules exists.\n\t\trun(['bun', 'install', '--ignore-scripts'], 'bun install')\n\t} else {\n\t\t// The CLI installs when node_modules is missing, and it shells out to npm,\n\t\t// which the slim images don't ship. An app with no manifest has nothing to\n\t\t// install, so hand it the empty directory it would have produced.\n\t\tawait fs.mkdir(path.join(dir, 'node_modules'), { recursive: true })\n\t}\n\n\tconst outDir = path.join(dir, 'dist')","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/backend/windmill-api/src/apps_raw_bundler.ts#L54-L90","documentation":"Windmill resolves a python interpreter version from the requested constraint using uv's resolver. When no installable python version satisfies the requested constraint, it lists all known versions and throws this unsatisfiable-resolution error.","triggerScenarios":"A script/flow declares a python version requirement (e.g. python 3.99, or a narrow constraint) that matches none of the python versions available to the worker's resolver.","commonSituations":"Typo in the version string (3.13.0.1); requesting a version newer than any python known to the installed uv; pinning an exact patch version removed from the registry; workers with an outdated uv version catalogue.","solutions":["Correct the requested python version in the script settings to an existing release (e.g. 3.11, 3.12, 3.13)","Read the 'All versions' list in the error and pick from it","Update uv/python tooling on the worker so newer python versions are known","Relax the constraint (e.g. '3.12' instead of '3.12.7') to allow any matching patch","Check for stray characters in the version field (extra dot, whitespace, 'python' prefix)"],"exampleFix":"// before (script settings)\npython_version = \"3.14.0.1\"\n// after\npython_version = \"3.12\"","handlingStrategy":"validation","validationCode":"const KNOWN = ['3.8','3.9','3.10','3.11','3.12','3.13'];\nfunction validatePythonVersion(v) {\n  if (typeof v !== 'string') throw new Error('python version must be a string');\n  const base = v.replace(/^python/i, '').split('.').slice(0,2).join('.');\n  if (!/^\\d+\\.\\d+$/.test(base)) throw new Error(`malformed python version: ${v}`);\n  if (!KNOWN.includes(base)) throw new Error(`python ${base} not available; pick from ${KNOWN}`);\n}","typeGuard":"const isPythonVersion = (v) => typeof v === 'string' && /^\\d+\\.\\d+(\\.\\d+)?$/.test(v.trim());","tryCatchPattern":"try {\n  await deployScript({ pythonVersion: '3.12' });\n} catch (e) {\n  if (/No solution found when resolving python/.test(e.message)) {\n    const available = e.message.match(/All versions:[\\s\\S]*$/)?.[0];\n    throw new Error(`Pick a python version from: ${available}`);\n  }\n  throw e;\n}","preventionTips":["Only use major.minor versions from the error's 'All versions' list","Avoid exotic exact-patch pins for the interpreter","Keep worker uv/python tooling updated","Validate the version field in deploy automation"],"tags":["python","version-resolution","uv","configuration"],"backgroundTag":"no-python-version-solution","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}