{"record":{"id":"0a4ff82d0fdca46f","repo":"Hmbown/CodeWhale","slug":"cancelled-snapshot-exists","errorCode":null,"errorMessage":"cancelled snapshot exists","messagePattern":"cancelled snapshot exists","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/tools/subagent/tests.rs","lineNumber":6798,"sourceCode":"    let agent = SubAgent::new(\n        agent_id.clone(),\n        FleetRole::Worker,\n        \"race\".to_string(),\n        make_assignment(),\n        \"deepseek-v4-flash\".to_string(),\n        None,\n        None,\n        input_tx,\n        tmp.path().to_path_buf(),\n        manager.current_session_boot_id.clone(),\n    );\n    manager.agents.insert(agent_id.clone(), agent);\n    manager.register_worker(make_worker_spec(&agent_id, tmp.path().to_path_buf()));\n\n    manager.cancel_agent(&agent_id).expect(\"cancel wins race\");\n    let mut late = manager\n        .get_result(&agent_id)\n        .expect(\"cancelled snapshot exists\");\n    late.status = SubAgentStatus::Completed;\n    late.result = Some(\"late success\".to_string());\n    assert!(\n        !manager.update_from_result(&agent_id, late),\n        \"late completion must lose the terminal transition\"\n    );\n\n    let snapshot = manager\n        .get_result(&agent_id)\n        .expect(\"terminal snapshot remains\");\n    assert_eq!(snapshot.status, SubAgentStatus::Cancelled);\n    assert_eq!(\n        snapshot.result.as_deref(),\n        Some(\"Cancelled by parent request.\")\n    );\n    let record = manager\n        .get_worker_record(&agent_id)\n        .expect(\"worker record remains\");","sourceCodeStart":6780,"sourceCodeEnd":6816,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/src/tools/subagent/tests.rs#L6780-L6816","documentation":"Test panic: `manager.get_result(&agent_id)` returned None after `cancel_agent`, so `.expect(\"cancelled snapshot exists\")` panicked. Cancellation must persist a terminal snapshot of the agent's result immediately.","triggerScenarios":"Querying results right after cancel when the cancel path failed to write a Cancelled snapshot into the result map.","commonSituations":"Refactor moving snapshot persistence off the cancel path; key mismatch between agent registration and result storage.","solutions":["Ensure cancel_agent writes a SubAgentStatus::Cancelled snapshot synchronously before returning Ok.","Verify the result map key equals the agent_id used for lookup.","Guard against snapshot eviction on terminal transitions in the manager."],"exampleFix":"// before\nlet mut late = manager.get_result(&agent_id).expect(\"cancelled snapshot exists\");\n// after\nlet mut late = manager.get_result(&agent_id)\n    .unwrap_or_else(|| panic!(\"no cancelled snapshot for {agent_id}\"));","handlingStrategy":"validation","validationCode":"assert!(manager.get_result(&agent_id).is_some(), \"cancel must persist a snapshot synchronously\");","typeGuard":null,"tryCatchPattern":"let mut late = manager.get_result(&agent_id)\n    .unwrap_or_else(|| panic!(\"no cancelled snapshot for {agent_id}\"));","preventionTips":["Write the Cancelled snapshot inside cancel_agent before returning Ok","Keep snapshot keys derived from a single agent_id source","Never evict results on terminal transitions in the same call path"],"tags":["test-assertion","cancel","snapshot","subagent"],"backgroundTag":"record-not-found","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}