diff --git a/CLAUDE.md b/CLAUDE.md
index c9bdb425..29272378 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -116,7 +116,7 @@ first-class High-Level Emulation tier alongside LLE, modeled on
1. **Two selectable backends, LLE default.** A null-by-default hook intercepts
BIOS service dispatch before the recompiled BIOS runs; selection is
- per-game config (`[bios] hle = true`) + CLI + env override, with a startup
+ per-game config (`[runtime] bios_hle = true`) + env override (PSX_BIOS_HLE), with a startup
banner naming the active backend. With HLE off the build is byte-identical
to a build without the tier.
2. **LLE remains the reference implementation and the oracle.** It stays fully
@@ -232,8 +232,9 @@ At the start of every session, before any code change:
concrete milestone is.
3. Verify `docs/psx_bios_disasm.txt` exists (primary reference).
4. Verify Ghidra MCP is reachable. If not, stop and ask.
-5. State out loud: "Architecture A is locked. No interpreter. No HLE.
- No stubs. BIOS first. Game never until Phase 5."
+5. State out loud: "Architecture A is locked. No interpreter. No stubs.
+ LLE default + oracle; HLE only per the §0 amendments (opt-in tier,
+ LLE fallback, no fakes). BIOS first. Game never until Phase 5."
If any of these fail, do not proceed with the user's task — surface
the failure first.
diff --git a/runtime/launcher/assets/launcher.rml b/runtime/launcher/assets/launcher.rml
index a4929f7d..d050e683 100644
--- a/runtime/launcher/assets/launcher.rml
+++ b/runtime/launcher/assets/launcher.rml
@@ -357,9 +357,6 @@ button:hover { background-color: #232d3c; }
Turbo loads
-
Skip PSX BIOS
-
- first boot still loads to build the cache — instant after
Fullscreen on launch
Widescreen EXPERIMENTAL
diff --git a/runtime/launcher/launcher.cpp b/runtime/launcher/launcher.cpp
index 744441d6..fc42510b 100644
--- a/runtime/launcher/launcher.cpp
+++ b/runtime/launcher/launcher.cpp
@@ -100,7 +100,8 @@ struct LauncherModel {
int crt = 0; // 0=raw,1=crt,2=composite,3=trinitron
bool auto_skip_fmv = false; // skip FMVs via the game's own skip
bool turbo_loads = true; // fast-forward the machine through load screens (audio plays through); default on
- bool fast_boot = false; // skip PSX BIOS via boot snapshot; default off
+ // (the old "Skip PSX BIOS" toggle is gone: the HLE boot shell-skip ships
+ // on by default via [runtime] bios_hle in the player game.toml)
bool spu_hq = false;
int aspect_index = 0; // index into kAspects (0 = 4:3 native)
int window_width = 1280; // window size (height = width*den/num per aspect)
@@ -658,7 +659,6 @@ Result run(SDL_Window* window, void* gl_context,
m.crt = io.screen_kind;
m.auto_skip_fmv = io.auto_skip_fmv;
m.turbo_loads = io.turbo_loads;
- m.fast_boot = io.fast_boot;
m.fullscreen = io.fullscreen;
m.skip_launcher = io.skip_launcher;
m.spu_hq = io.spu_hq;
@@ -721,7 +721,6 @@ Result run(SDL_Window* window, void* gl_context,
c.Bind("antialiasing", &m.antialiasing);
c.Bind("auto_skip_fmv", &m.auto_skip_fmv);
c.Bind("turbo_loads", &m.turbo_loads);
- c.Bind("fast_boot", &m.fast_boot);
c.Bind("fullscreen", &m.fullscreen);
c.Bind("skip_launcher", &m.skip_launcher);
c.Bind("show_skip_modal",&m.show_skip_modal);
@@ -845,11 +844,6 @@ Result run(SDL_Window* window, void* gl_context,
m.turbo_loads = !m.turbo_loads;
handle.DirtyVariable("turbo_loads");
});
- c.BindEventCallback("toggle_fast_boot",
- [&m, handle](Rml::DataModelHandle, Rml::Event&, const Rml::VariantList&) mutable {
- m.fast_boot = !m.fast_boot;
- handle.DirtyVariable("fast_boot");
- });
c.BindEventCallback("toggle_fullscreen",
[&m, handle](Rml::DataModelHandle, Rml::Event&, const Rml::VariantList&) mutable {
m.fullscreen = !m.fullscreen;
@@ -1058,7 +1052,6 @@ Result run(SDL_Window* window, void* gl_context,
io.screen_kind = m.crt; io.has_screen_kind = true;
io.auto_skip_fmv = m.auto_skip_fmv; io.has_auto_skip_fmv = true;
io.turbo_loads = m.turbo_loads; io.has_turbo_loads = true;
- io.fast_boot = m.fast_boot; io.has_fast_boot = true;
io.fullscreen = m.fullscreen; io.has_fullscreen = true;
io.skip_launcher = m.skip_launcher; io.has_skip_launcher = true;
io.spu_hq = m.spu_hq; io.has_spu_hq = true;