{"record":{"id":"c5bad9bd262b0b69","repo":"astrid-runtime/astrid","slug":"offline-signed-source-member-file-name-is-not","errorCode":null,"errorMessage":"--offline: signed source member {file_name} is not local and network access is forbidden","messagePattern":"--offline: signed source member (.+?) is not local and network access is forbidden","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-cli/src/commands/init_signed_source.rs","lineNumber":248,"sourceCode":"\n/// Read a lock/sig sibling locally or at its matching remote path.\nasync fn fetch_signed_member(\n    source: &str,\n    offline: bool,\n    file_name: &str,\n) -> anyhow::Result<Vec<u8>> {\n    let manifest_path = Path::new(source);\n    if manifest_path.exists() && manifest_path.is_file() {\n        let path = manifest_path\n            .parent()\n            .ok_or_else(|| anyhow::anyhow!(\"Distro.toml has no parent directory\"))?\n            .join(file_name);\n        return std::fs::read(&path)\n            .with_context(|| format!(\"failed to read signed source member {}\", path.display()));\n    }\n\n    if offline {\n        bail!(\n            \"--offline: signed source member {file_name} is not local and network access is forbidden\"\n        );\n    }\n\n    let mut url = url::Url::parse(&super::resolve_distro_url(source)?)?;\n    url.path_segments_mut()\n        .map_err(|()| anyhow::anyhow!(\"signed source URL cannot contain path segments\"))?\n        .pop()\n        .push(file_name);\n    fetch_url_bytes(url.as_str(), file_name, 1024 * 1024).await\n}\n\nasync fn fetch_url_bytes(url: &str, name: &str, limit: usize) -> anyhow::Result<Vec<u8>> {\n    let client = reqwest::Client::builder()\n        .user_agent(\"astrid-cli\")\n        .timeout(std::time::Duration::from_secs(30))\n        .build()?;\n    let response = client","sourceCodeStart":230,"sourceCodeEnd":266,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-cli/src/commands/init_signed_source.rs#L230-L266","documentation":"fetch_signed_member fetches an individual file that is part of a signed source (e.g. signature or lock files). If the member file is not present locally next to the source and --offline is set, network access is forbidden and this error is thrown, naming the missing member file.","triggerScenarios":"fetch_signed_manifest -> fetch_signed_member with a file_name that does not exist in the local directory alongside the source; the local-read branch fails to find it and the `if offline` check bails because fetching it over the network is disallowed.","commonSituations":"Partially downloaded signed source (manifest present but signature file missing) used with --offline; running init in an air-gapped environment where the signed Distro bundle was not fully copied over.","solutions":["Copy the complete signed source bundle (including {file_name}) to the local directory before running with --offline.","Re-download the full signed Distro while online, then re-run offline.","If network is allowed, remove --offline so the member can be fetched from the distro URL."],"exampleFix":"// before: only Distro.toml copied, Distro.toml.sig missing\nastrid init --offline ./signed-distro/Distro.toml\n\n// after: copy all members\nscp distro-server:/distro/Distro.toml* ./signed-distro/\nastrid init --offline ./signed-distro/Distro.toml","handlingStrategy":"validation","validationCode":"# ensure all signed-source members exist locally before offline run\nfor f in Distro.toml Distro.toml.sig Distro.lock.toml; do\n  [[ -f \"signed-distro/$f\" ]] || echo \"missing signed member: $f\"\ndone","typeGuard":null,"tryCatchPattern":"// shell\nif ! astrid init --offline ./signed-distro/Distro.toml 2>err.log; then\n  grep -q 'not local and network access is forbidden' err.log && echo \"copy the complete signed bundle first\"\nfi","preventionTips":["Copy the entire signed bundle (manifest, signature, lock) when moving to offline machines.","Verify bundle completeness with a checksum manifest after transfer.","Keep a single archive (.shuttle) of the signed source instead of loose files to avoid partial copies."],"tags":["offline","network","cli","signed-source"],"backgroundTag":"network-request-failed","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"}