Assets reverting back to their default values after loading scene

I have a fully functional save system using the godsent ES3 and an ISaveable Interface and a SaveGameBrain handling the logic.

The expected behavior when I press F9 is that the Brain will call Load() on SceneManagerBrain and subscribe to the OnSceneLoaded event. Once the scene is loaded, the Brain will look for all ISaveables in the scene and call Load() on each of them, each Isaveable will restore itself.

In practice however, everything works perfectly fine but something reverts them back to their original state, it is driving me crazy, I just could not find the culprit.
Here is an instance of one such ISaveable, a simple LightBulb script which as the name implies is used on dynamic light objects, it saves the values fine, it loads them back fine and turns itself off for a frame or 2 and then it is back on again.

using Deleted.SaveSystem;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Deleted.Environment
{
    [RequireComponent(typeof(GUID))]
    public class LightBulb : MonoBehaviour, ISaveable
    {
        [SerializeField] GameObject emissiveObject;
        [SerializeField][Range(0, 10)] int matIndex = 0;
        [SerializeField] Material litMat, unlitMat;
        bool switchedON;
        bool initialized;

        private void Start()
        {
            DetectOnOffStatus();
        }
        private void DetectOnOffStatus()
        {
            if (initialized) return;
            var firstLight = GetComponentInChildren<Light>();
            if (firstLight.enabled)
            {
                switchedON = true;
            }
            else
            {
                switchedON= false;
            }
            Debug.Log($"default status of {gameObject.name} set to {switchedON}");

            initialized = true;
        }

        public void SwitchON()
        {
            Debug.Log($"Switching ON {gameObject.name}");
            Light[] lights = GetComponentsInChildren<Light>();
            foreach (Light light in lights)
            {
                light.enabled = true;
            }
            MeshRenderer meshRenderer = emissiveObject.GetComponent<MeshRenderer>();
            var mats = meshRenderer.materials;
            mats[matIndex] = litMat;
            meshRenderer.materials = mats;

            switchedON = true;
            Debug.Log($"After Switching ON {gameObject.name}, switchedON = {switchedON}");

        }
        public void SwitchOFF()
        {
            Debug.Log($"Switching OFF {gameObject.name}");
            Light[] lights = GetComponentsInChildren<Light>();
            foreach (Light light in lights)
            {
                light.enabled = false;
            }
            MeshRenderer meshRenderer = emissiveObject.GetComponent<MeshRenderer>();
            var mats = meshRenderer.materials;
            mats[matIndex] = unlitMat;
            meshRenderer.materials= mats;

            switchedON = false;
            Debug.Log($"After Switching OFF {gameObject.name}, switchedON = {switchedON}");

        }
        public void Toggle()
        {
            if (switchedON)
            {
                SwitchOFF();
            }
            else
            {
                SwitchON();
            }
        }

        public void Save(string path)
        {
            string guid = GetComponent<GUID>().guid;
            ES3.Save(guid + "state", switchedON, path);
        }

        public void Load(string path)
        {
            string guid = GetComponent<GUID>().guid;
            if(ES3.KeyExists(guid + "state", path))
            {
                bool turnedON = (bool) ES3.Load(guid + "state", path);
                Debug.Log($"Loading {turnedON} in {gameObject.name}");
                if (turnedON)
                {
                    SwitchON();
                }
                else
                {
                    SwitchOFF();
                }
                initialized = true;
            }
        }

        public void QuickSave(string path)
        {
            Save(path);
        }

        public void QuickLoad(string path)
        {
            Load(path);
        }
    }

}

I don’t find informations about ES3.Load execution time, but my guess is that it takes “some time” to load your save file. I suspect that while you file is still loading, your Start function is called.

Try to set your initialized state after checking a save exist but before loading it :

         public void Load(string path)
        {
            string guid = GetComponent<GUID>().guid;
            if(ES3.KeyExists(guid + "state", path))
            {

                initialized = true;

                bool turnedON = (bool) ES3.Load(guid + "state", path);
                Debug.Log($"Loading {turnedON} in {gameObject.name}");
                if (turnedON)
                {
                    SwitchON();
                }
                else
                {
                    SwitchOFF();
                }
      
            }
         }