{"record":{"id":"7053d56e06fd35da","repo":"bevyengine/bevy","slug":"source-entity-must-have-observedby","errorCode":null,"errorMessage":"Source entity must have ObservedBy","messagePattern":"Source entity must have ObservedBy","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/bevy_ecs/src/observer/entity_cloning.rs","lineNumber":35,"sourceCode":"        if add_observers {\n            self.override_clone_behavior::<ObservedBy>(ComponentCloneBehavior::Custom(\n                component_clone_observed_by,\n            ))\n        } else {\n            self.remove_clone_behavior_override::<ObservedBy>()\n        }\n    }\n}\n\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                    }","sourceCodeStart":17,"sourceCodeEnd":53,"githubUrl":"https://github.com/bevyengine/bevy/blob/396ca727080776bd313bb892423b7d94e03b81b4/crates/bevy_ecs/src/observer/entity_cloning.rs#L17-L53","documentation":"Panic during deferred entity cloning (component_clone_observed_by): the source entity lacked the ObservedBy component, even though the clone path for observers assumes it is present. ObservedBy is inserted by the observer API when an observer watches the source, so its absence means the clone behavior ran for an entity that never had observers registered (or was already cleaned up).","triggerScenarios":"Thrown at crates/bevy_ecs/src/observer/entity_cloning.rs:35 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Only enable the ObservedBy clone behavior (with_observed_by_cloning) for worlds where observers are attached via the normal API so ObservedBy stays consistent","Avoid manually removing ObservedBy from observed entities","Check world.get::<ObservedBy>(source) before invoking custom clone paths"],"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"}