{"record":{"id":"5c1ce00d7563e823","repo":"astrid-runtime/astrid","slug":"astrid-distro-apply-requires-an-explicit-distro-so","errorCode":null,"errorMessage":"astrid distro apply requires an explicit distro source: @owner/repo, URL, local Distro.toml, or .shuttle; Astrid Runtime does not choose a product distro","messagePattern":"astrid distro apply requires an explicit distro source: @owner/repo, URL, local Distro\\.toml, or \\.shuttle; Astrid Runtime does not choose a product distro","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/astrid-cli/src/dispatch.rs","lineNumber":515,"sourceCode":"            yes,\n            offline,\n            allow_unsigned,\n            accept_new_key,\n            vars,\n        } => {\n            if agent.is_some() {\n                return Ok(commands::stub::deferred(\n                    \"distro apply -a <agent>\",\n                    &[tracker_657()],\n                ));\n            }\n            if allow_unsigned {\n                anyhow::bail!(\n                    \"astrid distro apply requires a signed Distro; --allow-unsigned is not acceptance\"\n                );\n            }\n            let distro = non_empty_distro_source(name).ok_or_else(|| {\n                anyhow::anyhow!(\n                    \"astrid distro apply requires an explicit distro source: @owner/repo, URL, local Distro.toml, or .shuttle; Astrid Runtime does not choose a product distro\"\n                )\n            })?;\n            let opts = commands::init::InitOpts {\n                yes,\n                offline,\n                allow_unsigned,\n                accept_new_key,\n                vars: commands::init::parse_cli_vars(&vars)?,\n                target_principal: crate::principal::current(),\n                // `distro apply` has no `--grant-capsules` surface; granting\n                grant_capsules: false,\n                require_signed: true,\n            };\n            commands::init::run_init(&distro, &opts).await?;\n            if apply_self_grant_required(&distro) {\n                commands::init::apply_self_grant(&opts.target_principal).await?;\n            }","sourceCodeStart":497,"sourceCodeEnd":533,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-cli/src/dispatch.rs#L497-L533","documentation":"`astrid distro apply` was invoked without any explicit source for the distro. The Astrid Runtime intentionally never picks a default/product distro on the user's behalf, so the command requires one of the accepted source forms: `@owner/repo`, a URL, a local `Distro.toml`, or a `.shuttle` path. dispatch_distro bails with this message after checking that neither `--allow-unsigned` nor any distro source argument was provided.","triggerScenarios":"Running `astrid distro apply` (via dispatch_subcommand -> dispatch_distro) with `name` empty/None so `non_empty_distro_source(name)` returns None. E.g. `astrid distro apply` with no positional source, or with a whitespace-only value.","commonSituations":"Copying an install command but omitting the `@owner/repo` argument; scripts parameterized with an empty DISTRO variable; users expecting the CLI to auto-select a bundled distro as with some other runtimes.","solutions":["Pass an explicit distro source, e.g. `astrid distro apply @owner/repo`.","Alternatively point at a URL, a local `Distro.toml`, or a `.shuttle` file.","If you also intended to skip signature verification, note that `--allow-unsigned` is not acceptance and is rejected separately; supply a signed Distro."],"exampleFix":"// before\nastrid distro apply\n// after\nastrid distro apply @acme/standard-distro","handlingStrategy":"validation","validationCode":"// shell\nif [ -z \"$DISTRO_SRC\" ]; then echo \"distro source required (@owner/repo, URL, Distro.toml, or .shuttle)\" >&2; exit 2; fi\nastrid distro apply \"$DISTRO_SRC\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pass an explicit source argument to `astrid distro apply`; never rely on defaults.","Quote parameterized sources in scripts so empty variables are caught by shell checks.","Remember --allow-unsigned does not substitute for a source or for acceptance."],"tags":["cli","argument-validation","distro"],"backgroundTag":"missing-required-argument","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}