{"record":{"id":"355825941e489e8f","repo":"tinyhumansai/openhuman","slug":"learning-update-facet-facet-not-found-fk","errorCode":null,"errorMessage":"learning_update_facet: facet not found: {fk}","messagePattern":"learning_update_facet: facet not found: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/openhuman/agent/learning/tools.rs","lineNumber":257,"sourceCode":"        })\n    }\n\n    fn permission_level(&self) -> PermissionLevel {\n        PermissionLevel::Write\n    }\n\n    async fn execute(&self, args: serde_json::Value) -> anyhow::Result<ToolResult> {\n        log::debug!(\"[tool][learning] update_facet invoked\");\n        let class_str = read_required_str(&args, \"class\")?;\n        let key_suffix = read_required_str(&args, \"key\")?;\n        let value = read_required_str(&args, \"value\")?;\n        let fk = full_key(&class_str, &key_suffix);\n        let cache = get_cache().await?;\n        let mut facet = cache\n            .get(&fk)\n            .await\n            .map_err(|e| anyhow::anyhow!(\"learning_update_facet: {e:#}\"))?\n            .ok_or_else(|| anyhow::anyhow!(\"learning_update_facet: facet not found: {fk}\"))?;\n        facet.value = value;\n        facet.user_state = UserState::Pinned;\n        cache\n            .upsert(&facet)\n            .await\n            .map_err(|e| anyhow::anyhow!(\"learning_update_facet: upsert failed: {e:#}\"))?;\n        Ok(ToolResult::success(serde_json::to_string(&json!({\n            \"facet\": facet_to_json(&facet),\n        }))?))\n    }\n}\n\n/// Set/clear a facet's pin via `set_user_state`. Shared by pin/unpin.\nasync fn set_pin(\n    args: serde_json::Value,\n    tool: &str,\n    state: UserState,\n) -> anyhow::Result<ToolResult> {","sourceCodeStart":239,"sourceCodeEnd":275,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/749120085864ce16e0f273c7b86fac7740b39c5b/src/openhuman/agent/learning/tools.rs#L239-L275","documentation":"learning_update_facet looked up the facet by its composed key (class/key-suffix) and the cache returned None — updates only modify existing facets, so an unknown class/key combination (or one the model invented) is rejected.","triggerScenarios":"Thrown at src/openhuman/agent/learning/tools.rs:257 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["List facets with learning_list_facets to find the correct class/key","Create the facet through the normal learning/stability pipeline instead of update_facet if it does not exist","Correct typos in the class or key suffix arguments and retry"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"749120085864ce16e0f273c7b86fac7740b39c5b","analyzedAt":"2026-08-17T21:21:45.363Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}