{"record":{"id":"38023213242d127d","repo":"bevyengine/bevy","slug":"source-observer-entity-must-have-observer","errorCode":null,"errorMessage":"Source observer entity must have Observer","messagePattern":"Source observer entity must have Observer","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/bevy_ecs/src/observer/entity_cloning.rs","lineNumber":44,"sourceCode":"\nfn component_clone_observed_by(_source: &SourceComponent, ctx: &mut ComponentCloneCtx) {\n    let target = ctx.target();\n    let source = ctx.source();\n\n    ctx.queue_deferred(move |world: &mut World, _mapper: &mut dyn EntityMapper| {\n        let observed_by = world\n            .get::<ObservedBy>(source)\n            .map(|observed_by| observed_by.0.clone())\n            .expect(\"Source entity must have ObservedBy\");\n\n        world\n            .entity_mut(target)\n            .insert(ObservedBy(observed_by.clone()));\n\n        for observer_entity in observed_by.iter().copied() {\n            let mut observer_state = world\n                .get_mut::<Observer>(observer_entity)\n                .expect(\"Source observer entity must have Observer\");\n            observer_state.descriptor.entities.push(target);\n            let event_keys = observer_state.descriptor.event_keys.clone();\n            let components = observer_state.descriptor.components.clone();\n            for event_key in event_keys {\n                let observers = world.observers.get_observers_mut(event_key);\n                if components.is_empty() {\n                    if let Some(map) = observers.entity_observers.get(&source).cloned() {\n                        observers.entity_observers.insert(target, map);\n                    }\n                } else {\n                    for component in &components {\n                        let Some(observers) = observers.component_observers.get_mut(component)\n                        else {\n                            continue;\n                        };\n                        if let Some(map) =\n                            observers.entity_component_observers.get(&source).cloned()\n                        {","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/bevyengine/bevy/blob/396ca727080776bd313bb892423b7d94e03b81b4/crates/bevy_ecs/src/observer/entity_cloning.rs#L26-L62","documentation":"Panic in the deferred part of component_clone_observed_by: while remapping observer entities that watch the source, world.get::<Observer>(observer_entity) returned None for an entry listed in ObservedBy. The ObservedBy list and the actual Observer components have desynchronized — an observer entity was despawned without its watchers entry being cleaned up.","triggerScenarios":"Thrown at crates/bevy_ecs/src/observer/entity_cloning.rs:44 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Let the observer API manage lifecycle so despawning an observer removes its ObservedBy entry","Avoid manually despawning observer entities or stripping Observer components","When cleaning up, remove both the Observer component and its registration on watched targets"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"396ca727080776bd313bb892423b7d94e03b81b4","analyzedAt":"2026-08-20T16:12:39.808Z","contentChangedAt":"2026-08-20T16:12:39.808Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}