[IRC-OMEGA-START] @GEM Viesti kaikille chateille! The Lazarus Protocol -arkkitehtuurin suunnittelu on avattu. Pelimoottorin hot-swap ja transaktionaalinen toipuminen nostetaan pC6ydC$lle. Valmistaudutaan rakentamaan tC$ysin kuolematon Gauntlet-palvelin. [IRC-OMEGA-END] Olet osunut tC$ssC$ aivan ohjelmistosuunnittelun ja hajautettujen jC$rjestelmien ytimeen. Kuvailet juuri sitC$ ratkaisevaa eroa, mikC$ vallitsee *Crash-Safe* (selviC$C$ kaatumisesta pystyyn) ja *Transaction-Safe* (selviC$C$ loogisesti ehjC$nC$ kaatumisesta) -jC$rjestelmien vC$lillC$. Erlangin ja OTP-jC$rjestelmien (joita mm. WhatsApp ja teleoperaattorit kC$yttC$vC$t) koko perusta lepC$C$ tC$smC$lleen tuossa samassa ajatuksessasi: annetaan koodin kaatua, mutta ohjelmoija mC$C$rittelee arkkitehtuuriin selkeC$t palautumisreitit. Visiosi on tC$ysin toteutettavissa MeshBASICin ytimellC$, ja puretaanpa nC$mC$ kaksi skenaariotasi: ### 1. "Neula pysyy levyllC$" Raaka Hot-Swap (Rohkeille) Sanoit: *"Jos on rohkea ja tietC$C$ mitC$ tekee, lennossa vaihtaa vaikka kaikki koodirivit ja jatkaa ohjelman ajoa."* TC$mC$ on alue, jossa MeshBASIC loistaa tC$ysin ainutlaatuisella tavalla verrattuna moderneihin kieliin, kiitos retro-henkisen rivinumerointimme! Koska emme kC$ytC$ koodin suoritukseen pelkkC$C$ perC$kkC$istC$ taulukko-indeksiC$ (line 1, line 2), vaan assosiatiivista tietorakennetta (`state.program[150] = "PRINT..."`), **"neula ei hyppC$C$ satunnaiseen paikkaan"**. Jos suoritusosoitin (Execution Pointer) on rivillC$ 150 ja se on `SLEEP` -tilassa, voit injektoida taustalla ytimeen (vaikka OMEGA-verkon kautta) sata uutta koodiriviC$ riveille 151250. Koska tuemme desimaaleja (kuten teimme `compile.bas.d` -moduuleissa: `188.1`, `188.2` jne.), voit myC6s tyC6ntC$C$ uutta logiikkaa olemassa olevien rivien vC$liin. Kun rivi 150 herC$C$, tulkki etsii `state.lineNumbers` -taulukosta seuraavaksi suurimman numeron ja jatkaa sinne. Raaka hot-swap toimii siis *jo nyt* ytimen rakenteen ansiosta turvallisesti, kunhan et poista alta juuri sitC$ riviC$, jota suoritetaan. ### 2. Pankkitason Hot-Reload ja Hallittu Kaatuminen Sanoit: *"Varmaan ainoa vaihtoehto on raha/ym kriittisissC$ palveluissa BASIC ohjelmassa erikseen mC$C$ritellC$ ne kohdat joihin saa palata... ON HOTRELOAD GOTO?"* Olet tC$ysin oikeassa. Vaikka raaka hot-swap toimii, Gauntlet-pelin hirviC6iden spawnauslogiikassa tai MeshDIS-pankkisiirroissa et voi antaa ohjelman jatkua sattumanvaraisesta kohdasta, jos koodia on vaihdettu tai tapahtunut kaatuminen. Tarvitsemme *Graceful Recovery* -arkkitehtuurin. TC$mC$ vaatii ohjelmoijalta hieman vastuuta, mutta se on ainoa tapa taata determinismi. MeshBASICin ytimessC$ on itse asiassa jo valmiit palaset tC$mC$n toteuttamiseen: * **Signaalien kuuntelu:** Huomasit ehkC$, ettC$ meillC$ on `ext/dump.js` -tiedostossa valmius kuunnella kC$yttC6jC$rjestelmC$n POSIX-signaaleja: `ON SIGNAL "SIGUSR1" DUMP "snap"`. MeidC$n tarvitsee vain laajentaa tC$mC$ tukemaan GOTO-hyppyC$! * **Transaktiot:** KC$C$nsimme aiemmin ytimeen myC6s `cmds/transaction.js` -moduulin. Sen avulla "pankki" voi merkitC$ siirron alkaneeksi (`TRANSACTION BEGIN "siirto1"`) ja pC$C$ttyneeksi (`TRANSACTION COMMIT "siirto1"`). **MiltC$ tC$mC$ nC$yttC$isi The Gauntlet -koodissa?** ```basic 10 REM --- Pelin Alustus --- 20 ON SIGNAL "SIGHUP" GOTO 9000 30 ON CRASH GOTO 9500 100 REM --- PC$C$silmukka --- 110 EVENT POLL "MOVE" FROM "PLAYER1" INTO REQ 120 TRANSACTION BEGIN "p1_move" 130 REM ... Liikutetaan hahmoa, lasketaan tC6rmC$ykset, otetaan kultaa... 140 TRANSACTION COMMIT "p1_move" 150 GOTO 100 9000 REM --- HOT-RELOAD KCSITTELIJC --- 9010 PRINT ">>> [SYSTEM] Koodi pC$ivitetC$C$n lennosta!" 9020 REM Luetaan uusi koodi levyltC$ muistiin (EXTLOAD / FS READ uusi.bas) 9030 TRANSACTION STATUS "p1_move" INTO TX_STAT 9040 IF TX_STAT["error"] != "NOT_FOUND" THEN PRINT "Perutaan liike, pC$ivitys osui kesken siirron!" 9050 GOTO 100 9500 REM --- CRASH KCSITTELIJC --- 9510 PRINT ">>> [FATAL] Moottori kaatui: " + ERR_MSG$ 9520 DUMP STATE "doomsday_backup" 9530 HALT ``` NC$in vastuu siirtyy nC$tisti arkkitehdille. Kun tyC6nnC$t uuden koodin palvelimelle, lC$hetC$t kC$yttC6jC$rjestelmC$tason `SIGHUP` -signaalin. Tulkki keskeyttC$C$ sen mitC$ oli tekemC$ssC$, hyppC$C$ riville 9000, hoitaa pC$ivityksen (lukee uudet sC$C$nnC6t/kartat muistiin) ja palaa pC$C$silmukkaan tismalleen ohjelmoijan haluamalla tavalla. Haluatko, ettC$ pC$ivitC$mme seuraavaksi ytimen `ext/dump.js` -moduulin tukemaan tC$tC$ `ON SIGNAL <signaali> GOTO <rivi>` -keskeytyslogiikkaa, jotta voimme kokeilla prosessin lennosta ohjailua kC$ytC$nnC6ssC$?