{"record":{"id":"449deca4d19b34a1","repo":"jdx/mise","slug":"unexpected-compose-config-hash-row-line","errorCode":null,"errorMessage":"unexpected compose config hash row: {line}","messagePattern":"unexpected compose config hash row: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/compose.rs","lineNumber":1033,"sourceCode":"        .filter(|line| !line.trim().is_empty())\n        .map(|line| Ok(serde_json::from_str(line)?))\n        .collect()\n}\n\nfn parse_config_hashes(output: &str) -> Result<HashMap<String, String>> {\n    output\n        .lines()\n        .filter(|line| !line.trim().is_empty())\n        .map(|line| {\n            let mut fields = line.split_whitespace();\n            let service = fields\n                .next()\n                .ok_or_else(|| eyre!(\"compose config hash row is missing a service\"))?;\n            let hash = fields.next().ok_or_else(|| {\n                eyre!(\"compose config hash row for '{service}' is missing a hash\")\n            })?;\n            if fields.next().is_some() {\n                bail!(\"unexpected compose config hash row: {line}\");\n            }\n            Ok((service.to_string(), hash.to_string()))\n        })\n        .collect()\n}\n\nfn container_is_ready(container: &ComposeContainer) -> bool {\n    container.state == \"running\" && matches!(container.health.as_str(), \"\" | \"healthy\")\n}\n\nfn container_is_active(container: &ComposeContainer) -> bool {\n    matches!(\n        container.state.as_str(),\n        \"running\" | \"restarting\" | \"paused\"\n    )\n}\n\nfn describe_current(target_services: &IndexSet<String>, containers: &[ComposeContainer]) -> String {","sourceCodeStart":1015,"sourceCodeEnd":1051,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/compose.rs#L1015-L1051","documentation":"When parsing `compose config --format json`-style hash output rows, the library expects exactly two whitespace-separated fields: service and hash. A row with extra fields indicates an unexpected output format from the engine, so parsing bails with the offending line.","triggerScenarios":"Parsing compose config hash output where a line splits into more than two fields — e.g. engine emitting service name plus hash plus extra columns, or unexpected log lines interleaved in the output.","commonSituations":"Non-v2 or unusual compose frontends with different output formats; warnings or log lines captured together with hash output; locale/quote variations in engine output.","solutions":["Upgrade to Docker Compose v2 whose output format matches the expected 'service hash' two-field layout","Check the raw output of the hash command manually for interleaved warnings","Set the compose `command` explicitly to a known v2 frontend instead of auto-detection"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match parse_hash_row(line) {\n    Err(e) if e.to_string().contains(\"unexpected compose config hash row\") => {\n        eprintln!(\"skipping malformed hash output line: {line}\");\n    }\n    other => other?,\n}","preventionTips":["Pin Docker Compose v2 for stable hash output format","Redirect engine warnings away from captured stdout","Verify hash output shape (`service hash`) when upgrading engines"],"tags":["compose","parsing","docker"],"backgroundTag":"unexpected-response-shape","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}