diff --git a/Docs/Vault/07_Sessions/2026/2026-08-08_A0_Gate_Readability_Seabed_Kit.md b/Docs/Vault/07_Sessions/2026/2026-08-08_A0_Gate_Readability_Seabed_Kit.md new file mode 100644 index 000000000..7ca71adfc --- /dev/null +++ b/Docs/Vault/07_Sessions/2026/2026-08-08_A0_Gate_Readability_Seabed_Kit.md @@ -0,0 +1,117 @@ +# 2026-08-08 — A0 gate: readability pass, arena regression, seabed relief kit + +Operator ran the eyes-on gates with me. A0 did **not** pass on the first two looks, and both rejections were +correct and diagnosable — neither was taste. + +## The gate, iteration by iteration + +**"It looks flat and static."** Both had measurable causes. +- *Flat:* `KeyWarm` — the only shadow-casting directional, i.e. the light that models form — sat at **0.15** while + `GloamFill` sat at **0.22**. Fill brighter than key destroys form by definition. The 07-21 value pass had fixed an + inverted hierarchy by cutting the key to nothing rather than rebalancing. +- *Static:* the scene had **zero** motion sources. `StagingAmbiance` was attached to nothing, and its flora wiring + searched for a `FloraLights` parent that exists in `Game.unity`, not ArtStaging. + +**Then the gate itself was found to be invalid.** ArtStaging judges **static glTF bakes** — 0 SkinnedMeshRenderers, +0 bones, no Avatar, on `Shader Graphs/glTF-pbrMetallicRoughness`. The shipping characters are 22-SMR humanoid rigs on +`AnimatedLitShader` + `EmissiveGloamSkinned` with live Animators. ArtStaging cannot animate by construction and its +material response is not the game's. **Operator moved the gate into `Game.unity`.** ArtStaging is now a lighting lab. + +## What moving the gate immediately exposed + +- **`Death` had ZERO outgoing transitions** on both AC_PlayerTopDown and AC_EnemyTopDown. Any State enters on + `IsDead`; nothing leaves. The player ghost is a persistent entity, so once you died you rendered **sprawled on the + seabed permanently** — sim fully respawned, moving and fighting, visually a corpse. +- **Green meadow motes.** `AmbientMotionSystem`'s drift was still the deleted biome system: key 0 = "meadow", + `MeadowMoteColor (0.62,0.85,0.60)`, 600 of them following the camera. Its `x>500` region probe pointed at space with + zero renderers. Also hard **squares** — `MakeParticleMaterial` built `Sprites/Default` with no texture. +- **Lighting debris in the shipping scene:** a stock white `Directional Light` (1.05, Soft) outranking KeyWarm as a + second shadow caster, plus 6 orphaned `LandmarkLights`, four at x=1030/1530 lighting a kilometre of empty water. + +## The self-inflicted one + +I added camera drift to `StagingAmbiance`, which rides `Env_SeabedKit.prefab` — instantiated by **`Game.unity` too**. +It wrote `_cam.position` every LateUpdate against `PrototypeCameraRig`. Camera y oscillated **1.157 ↔ 13.559 at 7.43 +u/tick**; the operator saw it in one second ("so far zoomed in and shaking"). **Every still I had taken looked +correctly framed** — a two-writer transform fight aliases to "fine in half the frames". Now a CLAUDE.md ★ rule. + +## Readability: not a brightness problem + +Operator: *"a little too dark to play, not very readable."* Measured, and the cause was materials + atmosphere: +seabed albedo **(0.08,0.12,0.15)** (a near-black floor reflects ~10% of anything), fog fading to near-black so depth +read as **void** rather than murk, `contrast +10` on top of ACES crushing the low end twice, vignette 0.28. + +Murk pass: fog → (0.06,0.20,0.25), seabed albedo → (0.18,0.26,0.30), contrast → 4, vignette → 0.16, camera +Distance 17 → 14. **That fixed the void and inverted figure-ground**, which the numbers caught: + +| | before | after | +|---|---|---| +| player | 0.144 | **0.320** | +| rock | 0.269 | 0.282 | +| flora | 0.258 | 0.250 | +| murk | 0.109 | 0.109 | + +The protagonist was the **second-darkest thing on screen**. The shoulder lamp is a forward spot tilted 26° down — it +lights the seabed ahead and never its wearer. Raising the key would lift the scenery equally and leave the ratio +unchanged; only a light that **travels with the diver** changes it. Added `~SuitGlow` (FeelConfig knobs, 0 = off). +Figure-to-murk contrast **1.32× → 2.94×** with scene brightness unchanged. + +## "The world is very static" — a third orphan + +`RoomFieldSystem` was deleted with the run FSM (62e48a3b0) and was the only consumer of the +`ClutterFieldSpawner` / `CoverFieldSpawner` / `GeyserFieldSpawner` singletons. They kept baking; nothing read them. +**Geyser 0, BlightClutter 0** despite the scene being configured for 14 + 3 + 2. Replaced with `ArenaFieldSystem` +(gym-scoped, seeds once, never tears down) → **17 solids + 2 staggered geysers**. + +Placement policy (operator delegated the call): clear core 5 u · solids in the fought-in band 6–13 u, which is also +where the travelling light reaches (**a prop outside the lit radius reads as an invisible wall**) · min spacing 2.6 u +enforced across clutter AND cover on one shared occupancy list — a **navigation** guarantee, since enemies have no +pathfinding · explosives beyond 8 u. Verified: radius 7.89–12.95, min gap 2.79, 0 explosives inside 8 u. + +## Seabed relief kit (Track 2) + +Operator wanted non-flat ground. **The walkable surface must stay flat** — the CC is configured for a plane +(`SnapToGround=false`, gravity `float3.zero`) and enemies have no pathfinding, so real elevation is a locomotion and +navigation task, not an art one. The kit therefore avoids the 0.3–0.6 m danger band entirely: + +| Piece | Tris | Height | Collision | +|---|---|---|---| +| `SM_Seabed_Hollow_A` | 442 | below plane | none | +| `SM_Seabed_Dunes_A` | 442 | ±0.4 m crests | none | +| `SM_Seabed_Ridge_A` | 55 | ~1.2 m | Environment | +| `SM_Seabed_Outcrop_A` | 120 | ~1.4 m | Environment | +| `SM_Seabed_Shelf_A` | 96 | ~1.4 m | Environment | + +1155 tris total, all under the ≤800/prop budget, one shared palette material, faceted. Source +`ArtSource/Blender/Env_SeabedReliefKit.blend` + five per-piece `.glb` (modular, so the Phase-2 pocket generator can +place them individually rather than inheriting a bespoke landscape). + +**Two art lessons banked.** First attempt encoded relief as **albedo banding** from the atlas — at top-down, flat +colour bands read as a *printed pattern*, not form (the hollow looked like a bullseye, the ripple sheet like woven +basketwork). The style bible is explicit: the read is *shape + light*. Uniform albedo + real geometry + let the +faceted normals shade. Second: dropping whole quads to make an organic outline gives **stair-stepped edges** — build +the piece in **polar** coordinates so the boundary follows `R(theta)` exactly. + +## Also worth recording + +- Unity crashed on Play. Not gameplay code: `UnityEditor.Search.LMDBIndexStorage:RemoveDocuments` on a background + thread racing `OnBeforeAssemblyReload`. The Search index was **2.2 GB**, built against the pre-purge 14 GB project, + with a huge backlog of documents to remove after the purge. Operator cleared `Library/Search`; it rebuilds. +- **A measurement taken after mutating server state is not evidence.** Three separate "frozen movers" readings were + artifacts of teleporting the player around a long-running Play session (the CC snapped it back; I was measuring + against a position the server never had). Only the clean, unmutated run counted: closest approach 1.40 u. + +## Still open + +1. **A0 sign-off** — the readability pass is in; the operator has not re-judged. +2. **Unity bake of the seabed kit** — import the five glb, shared `M_Lit_Palette`, collider policy (none on + hollow/dunes, `Environment` on ridge/outcrop/shelf, mesh Read/Write ON or the collider silently does not bake). +3. **Track 1 (world response)** — silt kicked up by strides, flora parting, creature scatter, current drift. Not + started. `AmbientMotionSystem` has a rustle layer and `CombatFeedbackSystem` a `SiltPuff`; given today's rate of + orphaned presentation, check both actually fire before building anything new. +4. **Phase-1 fun gate** — still never run. The kit only started working in the shipping scene yesterday. + +## Related + +[[DR-054_Audit_Purge_2026-08]] · [[Roadmap_Lantern_Slice]] · [[Art_Direction_Lantern]] · +[[Lantern_Art_Pipeline_Recipes]] · [[CLAUDE_Build_Gotchas_Archive]]