{"record":{"id":"2b003d21cf6ba6ac","repo":"zeroclaw-labs/zeroclaw","slug":"identity-format-is-set-to-aieos-but-neither-aieo","errorCode":null,"errorMessage":"Identity format is set to 'aieos' but neither aieos_path nor aieos_inline is configured. Set one in your config:\n\n[identity]\nformat = \"aieos\"\naieos_path = \"identity.json\"\n\nOr use inline:\n\n[identity]\nformat = \"aieos\"\naieos_inline = '{\"identity\": {...}}'","messagePattern":"Identity format is set to 'aieos' but neither aieos_path nor aieos_inline is configured\\. Set one in your config:\n\n\\[identity\\]\nformat = \"aieos\"\naieos_path = \"identity\\.json\"\n\nOr use inline:\n\n\\[identity\\]\nformat = \"aieos\"\naieos_inline = '(.+?)\\}'","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-runtime/src/identity.rs","lineNumber":196,"sourceCode":"        let identity = parse_aieos_identity(&content).with_context(|| {\n            format!(\n                \"Failed to parse AIEOS JSON from: {}\",\n                full_path.display().to_string()\n            )\n        })?;\n\n        return Ok(Some(identity));\n    }\n\n    // Fall back to aieos_inline\n    if let Some(ref inline) = config.aieos_inline {\n        let identity = parse_aieos_identity(inline).context(\"Failed to parse inline AIEOS JSON\")?;\n\n        return Ok(Some(identity));\n    }\n\n    // Format is \"aieos\" but neither path nor inline is configured\n    anyhow::bail!(\n        \"Identity format is set to 'aieos' but neither aieos_path nor aieos_inline is configured. \\\n         Set one in your config:\\n\\\n         \\n\\\n         [identity]\\n\\\n         format = \\\"aieos\\\"\\n\\\n         aieos_path = \\\"identity.json\\\"\\n\\\n         \\n\\\n         Or use inline:\\n\\\n         \\n\\\n         [identity]\\n\\\n         format = \\\"aieos\\\"\\n\\\n         aieos_inline = '{{\\\"identity\\\": {{...}}}}'\"\n    )\n}\n\nfn parse_aieos_identity(content: &str) -> Result<AieosIdentity> {\n    let payload: Value = serde_json::from_str(content).context(\"Invalid AIEOS JSON\")?;\n    if !payload.is_object() {","sourceCodeStart":178,"sourceCodeEnd":214,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/identity.rs#L178-L214","documentation":"ZeroClaw's load_aieos_identity only activates when [identity] format is exactly \"aieos\". It then tries aieos_path (file, resolved against the workspace dir) and aieos_inline (inline JSON string) in that order. When both are absent it bails with this message, which embeds a copy-pastable config snippet. It is a startup config-completeness guard: the format flag promises an AIEOS persona document that was never supplied.","triggerScenarios":"Setting [identity] format = \"aieos\" in the ZeroClaw config without adding aieos_path or aieos_inline; renaming a differently-spelled key (aieos_paths, aieos_file, aieos_json); switching format from \"simple\"/\"markdown\" to \"aieos\" while only carrying over the old config keys. Note format is compared literally — \"AIEOS\" would return Ok(None) instead, so this error implies format == \"aieos\" exactly.","commonSituations":"Migrating an existing bot to the AIEOS persona format and forgetting the payload file; a CI/template pipeline that renders the [identity] table from variables but leaves the payload key undefined; committing the config but not the identity.json the path points to (that later fails with a different read error, but a missing key fails with this one first).","solutions":["Add aieos_path = \"identity.json\" under [identity] and create that JSON object file in the workspace (or use an absolute path)","Or embed the document directly: aieos_inline = '{\"identity\": {...}}'","Check key spelling: exactly aieos_path or aieos_inline; aieos_path wins if both are set","If you did not intend AIEOS, remove the format = \"aieos\" line or restore the previous format value"],"exampleFix":"# before\n[identity]\nformat = \"aieos\"\n\n# after\n[identity]\nformat = \"aieos\"\naieos_path = \"identity.json\"\n\n# or inline\n[identity]\nformat = \"aieos\"\naieos_inline = '{\"identity\": {\"name\": \"...\"}}'","handlingStrategy":"validation","validationCode":"fn identity_config_complete(cfg: &IdentityConfig) -> bool {\n    cfg.format != \"aieos\" || cfg.aieos_path.is_some() || cfg.aieos_inline.is_some()\n}\n// call before load_aieos_identity; on false, prompt for a payload source","typeGuard":null,"tryCatchPattern":"if let Err(e) = load_aieos_identity(&cfg.identity, &workspace_dir) {\n    if e.to_string().contains(\"neither aieos_path nor aieos_inline\") {\n        // fatal config error: surface the embedded snippet to the user and exit before the agent loop\n    }\n    return Err(e);\n}","preventionTips":["Run a pre-flight config validator at startup that asserts format=\"aieos\" implies aieos_path or aieos_inline","Generate identity config from one template that always pairs the format key with a payload key","Add a unit test over shipped example configs catching this pairing regression"],"tags":["rust","zeroclaw","identity","config","aieos","startup"],"backgroundTag":"missing-config-value","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}