Aquarium/state/evidence.jsonl
2026-05-13 00:19:02 +01:00

73 lines
44 KiB
JSON

{"timestamp":"2026-05-09T04:42:00+01:00","topic":"debug-ui-control-grammar","lesson":"Aquarium debug UI uses a code-first Direct2D/DirectWrite overlay with explicit bound controls. Rect math must distinguish edges from width/height, controls need base/hover/active feedback, tooltips live in declarations, and long mode selectors should be named option rows instead of numeric sliders.","files":["src/Aquarium.Engine/Render/Ui/DebugUi.cs","src/Aquarium.Engine/Render/D3D12Renderer.cs","state/memory.json"]}
{"timestamp":"2026-05-09T05:20:00+01:00","topic":"graphics-settings-cultcache","lesson":"Renderer presentation knobs belong in a typed CultCache graphics settings document, not process folklore. Current durable knobs are render debug mode, exposure, bloom intensity, and bloom veil.","files":["src/Aquarium.Engine.Contracts/GraphicsSettings.cs","src/Aquarium.Epiphany/State/AquariumGraphicsSettingsState.cs","state/memory.json"]}
{"timestamp":"2026-05-12T00:00:00+01:00","topic":"engine-client-boundary","lesson":"Aquarium.Engine is the native D3D12/window/render graph layer and must not accrete Epiphany frontend semantics. Aquarium.Epiphany is the client/runtime layer behind Aquarium.Engine.Contracts and should configure engine abstractions for cameras, targets, shaders, resources, and passes.","files":["docs/engine-client-boundary.md","src/Aquarium.Epiphany/Aquarium.Epiphany.csproj","src/Aquarium.Engine/Runtime/ClientRuntimeLoader.cs","state/memory.json","state/map.yaml"]}
{"timestamp":"2026-05-12T00:00:00+01:00","topic":"epiphany-extraction-render-api-plan","lesson":"The next purification path is a small render graph API, not more renderer knobs: clients declare resources and passes, Aquarium owns D3D12 execution. Migrate in slices: freeze boundary, add Vortice-free descriptors, compile a minimal graph, convert presentation/bloom, move Epiphany body shaders and Grid policy to Aquarium.Epiphany, then replace AquariumFrame.","files":["docs/epiphany-extraction-render-api-plan.md","README.md","state/map.yaml","state/memory.json"]}
{"timestamp":"2026-05-12T03:40:00+01:00","topic":"epiphany-render-policy-extraction","lesson":"Epiphany body shaders, Grid brush construction, body visual/light tables, and cursor projection moved behind Aquarium.Engine.Contracts. Aquarium.Engine now consumes AquariumRenderPlan and AquariumSceneState data and passes scripts/verify-boundaries.ps1 with no Epiphany role/client names in engine source.","files":["src/Aquarium.Engine.Contracts/Render/AquariumApp.cs","src/Aquarium.Engine.Contracts/Render/AquariumRenderPlan.cs","src/Aquarium.Epiphany/EpiphanyRenderPlan.cs","src/Aquarium.Epiphany/EpiphanySceneBuilder.cs","src/Aquarium.Engine/Render/D3D12Renderer.cs","scripts/verify-boundaries.ps1","state/memory.json","state/map.yaml"]}
{"timestamp":"2026-05-12T03:50:00+01:00","topic":"graph-target-allocation","lesson":"The render graph compiler now validates declared targets/passes and D3D12Renderer allocates non-legacy client-declared render targets through engine resource/descriptors, including resize rebuild. This is allocation only; full graph pass execution remains the next cut.","files":["src/Aquarium.Engine/Render/Graph/D3D12RenderGraphCompiler.cs","src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine.Contracts/Render/AquariumApp.cs","state/memory.json"]}
{"timestamp":"2026-05-12T04:00:00+01:00","topic":"minimal-non-epiphany-client","lesson":"Aquarium now includes src/Aquarium.Sample.Minimal, a non-Epiphany client that references only Aquarium.Engine.Contracts, declares a minimal render plan, and boots through the same host/client assembly loader. Keep it as a boundary proof while the graph executor replaces legacy fixed passes.","files":["src/Aquarium.Sample.Minimal/MinimalRuntime.cs","src/Aquarium.Sample.Minimal/Aquarium.Sample.Minimal.csproj","README.md","state/map.yaml"]}
{"timestamp":"2026-05-12T04:05:00+01:00","topic":"grid-brush-gpu-packing","lesson":"GridHeightBrushConstants is D3D12 GPU packing for the height-field brush pass, not scene policy. Keep brush authoring in the client, keep packing in engine feature code, and keep D3D12Renderer limited to upload/command recording until the height-field pass moves fully into the graph executor.","files":["src/Aquarium.Engine/Render/Features/D3D12GridHeightBrushConstants.cs","src/Aquarium.Engine/Render/D3D12Renderer.cs","state/evidence.jsonl"]}
{"timestamp":"2026-05-10T07:47:46+01:00","topic":"cursor-teardrop-sdf","lesson":"Use the MathWorld teardrop curve for the cursor profile with m=6, revolved into an SDF locator. Keep ripples as geometry, material as brass GGX metal, and avoid ambient fill.","files":["src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/memory.json"],"source":"https://mathworld.wolfram.com/TeardropCurve.html"}
{"timestamp":"2026-05-11T00:00:00+01:00","topic":"aquarium-focus-cut","lesson":"Runtime volumetrics, cloud/fog research, and the D3D11 scene renderer are shelved because they distract from Aquarium's Epiphany-client mission. Git history holds the experiment; live repo state should not preserve compatibility husks or dead guidance for removed medium settings.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine.Contracts/GraphicsSettings.cs","state/map.yaml","state/memory.json","state/scratch.md"]}
{"timestamp":"2026-05-11T04:20:00+01:00","topic":"medium-froxel-purge","lesson":"Medium/froxel render targets, structured buffers, shader bindings, scene outputs, post history lanes, and medium debug paths were removed from the live D3D12 renderer. Future atmospheric or field transport work needs a new explicit pass contract rather than reviving shelved scaffolding.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12Post.hlsl","state/map.yaml","state/memory.json"]}
{"timestamp":"2026-05-11T05:32:00+01:00","topic":"body-light-lane","lesson":"Blue-noise assets are retained for future dithering. Self and future other Selves emit through an explicit body light buffer; generic field instances are not the lighting authority.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/map.yaml","state/memory.json"]}
{"timestamp":"2026-05-11T06:18:00+01:00","topic":"pmrem-cubemap-bake","lesson":"Studio HDR reflection lighting is baked as a PMREM DDS cubemap: roughness selects higher mips, and the bake samples the source latlong by output direction so cubemap faces are generated from one continuous domain instead of filtered as isolated square images.","files":["scripts/bake-pmrem-cubemap.py","src/Aquarium.Engine/Assets/Textures/studio3_pmrem.dds","state/map.yaml","state/memory.json"],"source":"E:\\Projects\\EpiphanyAquarium\\public\\textures\\studio3.hdr"}
{"timestamp":"2026-05-11T06:28:00+01:00","topic":"pmrem-scene-binding","lesson":"The Studio3 PMREM asset is live in the scene as a D3D12 TextureCube bound at t22. The renderer owns a narrow RGBA16F DX10 DDS cubemap loader, keeps upload resources alive until the copy fence completes, and the scene shader uses roughness-scaled SampleLevel for specular material reflections only.","files":["src/Aquarium.Engine/Render/D3D12CubeTexture.cs","src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/map.yaml","state/memory.json"]}
{"timestamp":"2026-05-11T06:42:00+01:00","topic":"grid-mirror-surface","lesson":"Grid linework was replaced with a terminating perfect mirror surface. Grid hits now write the primary scene packet with FIELD_ID_GRID, terrain normal, full coverage, and Studio3 PMREM mip 0 reflection instead of using the transparent event lane.","files":["src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/map.yaml","state/memory.json"]}
{"timestamp":"2026-05-11T06:50:00+01:00","topic":"pmrem-world-basis","lesson":"Aquarium world space is Z-up while the baked Studio3 PMREM cubemap is sampled as Y-up. Every PMREM lookup must convert world directions with (x, z, y) before TextureCube sampling, or the HDRI appears sideways.","files":["src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/memory.json"]}
{"timestamp":"2026-05-11T07:00:00+01:00","topic":"studio2-pmrem-probe","lesson":"Active reflection probe switched to Studio2 from E:\\Projects\\Aetheria-Economy\\Assets\\Textures\\studio2.hdr. The renderer loads Assets/Textures/studio2_pmrem.dds through the existing D3D12 TextureCube PMREM path, and the unused Studio3 DDS was cut from live assets.","files":["src/Aquarium.Engine/Assets/Textures/studio2_pmrem.dds","src/Aquarium.Engine/Assets/Textures/studio3_pmrem.dds","src/Aquarium.Engine/Render/D3D12Renderer.cs","state/map.yaml","state/memory.json"],"source":"E:\\Projects\\Aetheria-Economy\\Assets\\Textures\\studio2.hdr"}
{"timestamp":"2026-05-11T07:14:00+01:00","topic":"grid-brush-cpu-mirror","lesson":"Self's Grid gravity bowl now uses a 17-world-unit radius and an Aetheria-style radial cosine wave. The brush equation is mirrored across D3D12Grid, CPU body-light placement, D3D12Scene body centers, and D3D12Post temporal reprojection; body centers sit at Grid height plus 2x radius.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12Grid.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12Post.hlsl","state/map.yaml","state/memory.json"],"source":"E:\\Projects\\Aetheria-Economy\\Assets\\Shaders\\Brushes\\RadialWaveBrush.shader"}
{"timestamp":"2026-05-11T07:22:00+01:00","topic":"grid-flatness-roughness","lesson":"Grid reflection roughness is now slope-driven: flat regions sample higher Studio2 PMREM mips to avoid an over-literal HDRI mirror, while sloped or waved regions sharpen toward mip 0.","files":["src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/memory.json"]}
{"timestamp":"2026-05-11T07:28:00+01:00","topic":"pmrem-background-mip","lesson":"Flat Grid reflection now tops out at Studio2 PMREM mip 3, and ray misses use Studio2 PMREM mip 3 as the soft background so the reflective Grid is not contrasted against black void. Low-resolution mip texels are hidden with a small multi-direction cone average rather than one magnified TextureCube sample.","files":["src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/memory.json"]}
{"timestamp":"2026-05-11T07:36:00+01:00","topic":"studio2-pmrem-resolution","lesson":"Studio2 PMREM was rebaked at 512px per cubemap face with 10 mips, so mip 3 is 64px per face instead of 32px. Shader roughness LOD max moved to 9 to match the chain.","files":["src/Aquarium.Engine/Assets/Textures/studio2_pmrem.dds","src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/memory.json"],"source":"E:\\Projects\\Aetheria-Economy\\Assets\\Textures\\studio2.hdr"}
{"timestamp":"2026-05-11T07:45:00+01:00","topic":"diffuse-ibl-irradiance","lesson":"Diffuse IBL is not GGX PMREM with a softer mip. Studio2 diffuse lighting now uses a separate irradiance cubemap baked by cosine-weighted hemisphere convolution, stores the Li*cos(theta) irradiance integral, and shades non-metal bodies with Fresnel-gated albedo/PI diffuse response.","files":["scripts/bake-pmrem-cubemap.py","src/Aquarium.Engine/Assets/Textures/studio2_irradiance.dds","src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/map.yaml","state/memory.json"],"source":"E:\\Projects\\Aetheria-Economy\\Assets\\Textures\\studio2.hdr"}
{"timestamp":"2026-05-11T08:10:00+01:00","topic":"rider-solution-compatibility","lesson":"Rider may open Aquarium.Engine.slnx with empty project trees even though dotnet can build it. Keep Aquarium.Engine.sln as the Rider-facing classic solution while Aquarium.Engine.slnx remains the compact CLI solution.","files":["Aquarium.Engine.sln","Aquarium.Engine.slnx","README.md","state/map.yaml"]}
{"timestamp":"2026-05-11T08:35:00+01:00","topic":"epiphany-agent-sdf-visual-language","lesson":"Epiphany agent bodies should be role-specific SDF organs driven by published CultNet surfaces: identity from epiphany.agent_memory, motion from epiphany.agent_heartbeat, posture from surface roles/coordinator/role_result, Face output from surface.face, and continuity pressure from pressure/reorient surfaces. Body and Imagination are the first implementation pair because they exercise grounded graph mass and generative harmonic bloom against the same AgentVisualState contract.","files":["docs/epiphany-agent-sdf-visual-language.md","state/map.yaml","state/memory.json"],"source":"E:\\Projects\\EpiphanyAgent\\schemas\\README.md"}
{"timestamp":"2026-05-11T08:48:00+01:00","topic":"agent-expression-placement","lesson":"Agent orbit lanes are home anchors, not cages. Role bodies may wander a bounded distance from their designated orbit slots for expression, and vertical animation should come from CPU-visible gravity-well pulses so Grid height, body centers, shadows, and temporal reprojection share the same placement truth.","files":["docs/epiphany-agent-sdf-visual-language.md","state/map.yaml","state/memory.json"]}
{"timestamp":"2026-05-11T09:02:00+01:00","topic":"agent-visual-spec-specificity","lesson":"The Epiphany agent visual-language doc must specify spatial derivation, not describe role bodies with directionless vibes. Agent SDF orientation now has a world coordinate contract, fixed home orbit slots, named anchors, fallback chains, normalized state scalars, and concrete workDirection derivation for Hands.","files":["docs/epiphany-agent-sdf-visual-language.md"],"source":"user review"}
{"timestamp":"2026-05-11T09:14:00+01:00","topic":"aquarium-owned-agent-spatial-layout","lesson":"Do not push Aquarium spatial authority onto Epiphany. Epiphany publishes semantic surfaces; Aquarium owns world placement. Agent visual anchors such as evidenceAnchor, artifactAnchor, workAnchor, reviewAnchor, and continuityAnchor are deterministic Aquarium-local projections from semantic state, not CultNet world coordinates emitted by Epiphany.","files":["docs/epiphany-agent-sdf-visual-language.md","state/memory.json"],"source":"user review"}
{"timestamp":"2026-05-11T09:26:00+01:00","topic":"decisive-agent-visual-language","lesson":"The Epiphany agent SDF visual spec should avoid presentation uncertainty. Remove slash-pairs and standalone 'or' alternatives from the visual-language document; choose one mathematical form per organ, favor sphere intersections, torus arcs, trefoil and lemniscate tubes, superquadrics, geodesic ribs, logarithmic spirals, rounded octahedra, and cardioid seeds over generic ellipsoid/capsule placeholders.","files":["docs/epiphany-agent-sdf-visual-language.md"],"source":"user review"}
{"timestamp":"2026-05-11T09:40:00+01:00","topic":"agent-sdf-realtime-rendering-plan","lesson":"Agent role SDFs should render as bounded per-agent implicit objects, not one scene-global mega-SDF. Use conservative sphere-tracing distances, proxy rasterization, one role SDF selected after proxy hit, local bounds for expensive features, post-hit normals, cheap shadows, pixel-footprint hit epsilon, LOD tiers, and debug views for step count, proxy hits, material id, LOD, and SDF cost.","files":["docs/epiphany-agent-sdf-visual-language.md","state/memory.json"],"source":"Hart sphere tracing, Enhanced Sphere Tracing, Inigo Quilez SDF bounding, CTSS, NVIDIA SDF grids"}
{"timestamp":"2026-05-11T16:18:00+01:00","topic":"agent-visual-state-first-slice","lesson":"The fixed orbit bodies are now backed by an AgentVisualGpu buffer carrying current center, previous center, role id, state scalars, and LOD. D3D12Scene uses the buffer for bounded agent SDF hits; D3D12Post uses the same buffer for agent temporal reprojection. Body and Imagination are the first LOD 1 role SDFs, with debug modes for role, material, step count, LOD, and cost.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12Post.hlsl","src/Aquarium.Engine.Contracts/GraphicsSettings.cs","docs/hlsl-renderer.md","state/map.yaml","state/memory.json"]}
{"timestamp":"2026-05-11T16:28:00+01:00","topic":"agent-sdf-polar-seams","lesson":"Do not animate role SDF lobes with raw atan2 angle fields inside the traced distance function; the polar branch cut creates visible cracks and sliced surfaces. Use continuous harmonic polynomial lobes over normalized directions, widen conservative proxy bounds, and reduce march step scale for distance-ish composite organs.","files":["src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/memory.json"],"source":"visible artifact review"}
{"timestamp":"2026-05-11T16:32:00+01:00","topic":"imagination-sdf-connected-lobes","lesson":"Continuous polar harmonics can still behave like a decorative pseudo-distance and leave visible petal gaps. Imagination now uses a central superquadric plus smooth-unioned ellipsoid petals, keeping the bloom continuous enough for bounded sphere tracing while preserving the five-lobed visual character.","files":["src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/memory.json"],"source":"visible artifact review"}
{"timestamp":"2026-05-11T16:34:00+01:00","topic":"imagination-sdf-march-conservatism","lesson":"Visible missing structure in Imagination came from shallow petal overlap plus a too-brave march through chained smooth unions. Petals now sit deeper into the core, use broader axes and larger union radii, and agent tracing uses 72 steps with smaller hit epsilon and 0.12 step scale.","files":["src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/memory.json"],"source":"visible artifact review"}
{"timestamp":"2026-05-11T16:39:00+01:00","topic":"imagination-sdf-petal-legibility","lesson":"Overcorrecting Imagination into a continuous blob destroyed the intended petal read. The better LOD 1 shape uses a small central seed, five narrow ellipsoid petals, and intentional negative space with only a tiny smooth union at the seed.","files":["src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","state/memory.json"],"source":"visible artifact review"}
{"timestamp":"2026-05-11T21:40:00+00:00","topic":"bounded-body-proxy-pass","lesson":"The fullscreen scene pass should own only background and Grid. Self, cursor, and role bodies now render through AgentVisualGpu-driven bounded proxy draws: one instanced conservative screen rectangle per object, object-local raymarching, and travel-derived depth writes so Grid and body occlusion stay honest.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","docs/hlsl-renderer.md","state/map.yaml","state/memory.json"],"source":"user architecture correction"}
{"timestamp":"2026-05-11T22:07:07+01:00","topic":"shader-boundary-body-pass","lesson":"D3D12Scene is now environment/Grid only. Bounded body proxy draws compile from D3D12Bodies.hlsl, reusable SDF math lives in D3D12SdfMath.hlsli, current agent character organs live in D3D12AgentCharacters.hlsli, and D3D12Renderer expands local includes before D3DCompile because the Vortice convenience compile path does not provide a usable include handler here. The cursor is now a luminous three-lobed hibiscus anchored on XY with its contact tip at Grid z=0.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12Bodies.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12SdfMath.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12AgentCharacters.hlsli","docs/hlsl-renderer.md","state/map.yaml","state/memory.json"],"source":"user architecture correction"}
{"timestamp":"2026-05-11T22:17:28+01:00","topic":"per-body-shader-boundary","lesson":"Body proxy rendering now uses one shader file and one proxy pipeline per visible body slot: Face, Imagination, Eyes, Body, Hands, Self, and Cursor. Shared proxy plumbing lives in D3D12BodyCommon.hlsli and D3D12BodyProxy.hlsli, but body identity SDF and material code should stay split by body rather than collapsing into a single role or Self bucket.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12BodyCommon.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12BodyProxy.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12FaceAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12ImaginationAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12EyesAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12BodyAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12HandsAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12SelfBody.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12CursorBody.hlsl","docs/hlsl-renderer.md","state/map.yaml","state/memory.json"],"source":"user architecture correction"}
{"timestamp":"2026-05-11T22:18:54+01:00","topic":"eight-agent-body-table","lesson":"The visible Epiphany agent body table is Self, Face, Imagination, Eyes, Body, Hands, Soul, and Life. Cursor remains a separate non-agent body. Renderer constants, body shader paths, proxy pipelines, and post reprojection counts should track seven role agents plus Self plus cursor, not the older five-role provisional slice.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12Post.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12SoulAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12LifeAgent.hlsl","docs/hlsl-renderer.md","state/map.yaml","state/memory.json"],"source":"user role table correction"}
{"timestamp":"2026-05-11T22:29:04+01:00","topic":"per-body-proxy-indexing","lesson":"Per-body proxy shaders must not rely on DrawInstanced StartInstanceLocation reaching SV_InstanceID for body identity. Each body shader now declares a shader-local BODY_INDEX constant, and shared proxy VS/PS use that constant for AgentVisualGpu lookup, proxy rectangle placement, and raymarch selection. This keeps per-body shader files transform-locked to their own visual row.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12BodyCommon.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12FaceAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12ImaginationAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12EyesAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12BodyAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12HandsAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12SoulAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12LifeAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12SelfBody.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12CursorBody.hlsl"],"source":"visible transform bug report"}
{"timestamp":"2026-05-11T22:32:12+01:00","topic":"canonical-agent-visual-order","lesson":"AgentVisualGpu row order is canonical and must match shader BODY_INDEX constants, body pipeline order, Grid brush indexing, and temporal reprojection: 0 Self, 1 Face, 2 Imagination, 3 Eyes, 4 Body, 5 Hands, 6 Soul, 7 Life, 8 Cursor. Roles-first buffer ordering breaks transforms even if each shader has its own file.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12BodyCommon.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12Post.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12SelfBody.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12FaceAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12ImaginationAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12EyesAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12BodyAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12HandsAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12SoulAgent.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12LifeAgent.hlsl"],"source":"visible transform bug report"}
{"timestamp":"2026-05-11T23:17:40+01:00","topic":"body-proxy-screen-space-convention","lesson":"Body proxy quads and body proxy ray construction must use the same screen-space Y convention as the fullscreen scene pass. Clip-space proxy center should use projected.y directly, and the proxy pixel shader must convert SV_Position top-left pixel coordinates to the bottom-left pixel coordinates expected by rayDirectionForPixel. If they disagree, bodies appear to swim in camera space instead of staying grounded in world space.","files":["src/Aquarium.Engine/Render/Shaders/D3D12BodyCommon.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12BodyProxy.hlsli"],"source":"visible transform bug report"}
{"timestamp":"2026-05-11T23:23:04+01:00","topic":"cursor-hibiscus-anatomy","lesson":"The cursor hibiscus needs recognizable flower anatomy, not just three glossy petals. The cursor SDF now includes curled ruffled petals, a throat, a protruding staminal column with pollen beads, and a green calyx/contact stem, with a larger proxy bound to prevent clipping the expanded silhouette.","files":["src/Aquarium.Engine/Render/Shaders/D3D12SdfMath.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12CursorBody.hlsl","src/Aquarium.Engine/Render/D3D12Renderer.cs"],"source":"visual reference comparison"}
{"timestamp":"2026-05-11T23:35:00+01:00","topic":"thin-structure-body-marching","lesson":"All role bodies are expected to carry thin visible structure, so conservative body SDF tracing is the shared default rather than a cursor-specific exception. Body proxy tracing now uses tighter hit epsilon, more steps, and smaller step scale through shared macros; faster tracing should only reappear through explicit LOD policy after it proves it preserves filaments, ribs, rings, petals, and other narrow organs.","files":["src/Aquarium.Engine/Render/Shaders/D3D12BodyProxy.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12CursorBody.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12SdfMath.hlsli","state/memory.json"],"source":"user visual artifact review"}
{"timestamp":"2026-05-11T23:39:00+01:00","topic":"sheet-sdf-petals-and-guarded-marching","lesson":"Do not represent petals and other thin organs as fat ellipsoids with decorative displacement. The recursive lotus reference preserves delicate structure by using slab/intersection fields and scaling the distance estimate after its log-spherical mapping; Aquarium cursor petals now use thin clipped sheet SDFs, and the shared body marcher caps step length plus refines positive-to-negative sign crossings instead of trusting pseudo-distance composites blindly.","files":["src/Aquarium.Engine/Render/Shaders/D3D12BodyProxy.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12SdfMath.hlsli","state/memory.json"],"source":"https://github.com/pac-dev/notes/blob/master/content/logspherical/recursive_lotus.glsl"}
{"timestamp":"2026-05-11T23:47:00+01:00","topic":"pseudo-distance-near-miss-hits","lesson":"The cursor stamen and angled petals disappeared because the body proxy marcher accepted abs(distance) < epsilon as a hit on a pseudo-distance composite. Rays that passed near a petal sheet could terminate before reaching the actual stamen or petal intersection. The proxy marcher now requires distance <= 0 entry, refines positive-to-negative brackets, and uses a larger step budget to survive capped steps across the proxy volume.","files":["src/Aquarium.Engine/Render/Shaders/D3D12BodyProxy.hlsli","state/memory.json"],"source":"user visual artifact review"}
{"timestamp":"2026-05-11T23:52:00+01:00","topic":"cursor-hibiscus-organ-primitives","lesson":"The cursor hibiscus shape should be built from organ-appropriate SDF primitives instead of ellipsoid paste. Petals now use upward-curving tapered sheets with lens footprints and tapered thickness, the staminal column uses a curved tapered tube, and the green contact anatomy uses a connected tapered stem plus calyx bulb so the stem visibly reaches the flower.","files":["src/Aquarium.Engine/Render/Shaders/D3D12SdfMath.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12CursorBody.hlsl","state/memory.json"],"source":"user visual artifact review"}
{"timestamp":"2026-05-11T23:59:00+01:00","topic":"cursor-hibiscus-reference-target","lesson":"The closer cursor objective is the pale pink five-petal hibiscus reference: broad translucent cupped petals, a folded central throat, a curved staminal column with side pollen filaments, and a green tapered calyx/stem ending at the XY contact point. The SDF now uses five tapered sheet petals, a simplified three-segment quadratic tube helper to keep shader compile time sane, side filament tubes, pollen bead spheres, and a curved tapered calyx core with sepals.","files":["src/Aquarium.Engine/Render/Shaders/D3D12SdfMath.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12CursorBody.hlsl","state/memory.json"],"source":"user reference images"}
{"timestamp":"2026-05-12T00:12:00+01:00","topic":"cursor-petal-single-formula","lesson":"The hibiscus cursor petal should not be assembled from piecewise vertical panels and horizontal blades. Model each petal from one longitudinal coordinate: radial displacement grows quadratically so the root starts vertical, height follows a smooth cubic center curve, width and thickness grow from thin root to broad distal blade, and decorative ruffles stay out until the core SDF is stable and cheap.","files":["src/Aquarium.Engine/Render/Shaders/D3D12SdfMath.hlsli","state/memory.json"],"source":"user visual/math review"}
{"timestamp":"2026-05-12T00:17:00+01:00","topic":"cursor-hibiscus-reset","lesson":"When the hibiscus cursor starts turning into SDF Jenga, reset the function around anatomical parameters instead of stapling on fixes. The current reset keeps five petals as one cheap graph-style ribbon formula each: u comes from height, radial displacement is quadratic so roots start vertical, width and thickness grow with u, and decorative trig/filament swarms are cut until the core form is stable and fast.","files":["src/Aquarium.Engine/Render/Shaders/D3D12SdfMath.hlsli","state/memory.json"],"source":"user architecture correction"}
{"timestamp":"2026-05-12T00:26:00+01:00","topic":"agent-sdf-form-discipline","lesson":"Carry the cursor hibiscus lesson into agent bodies: start every role SDF from a coherent anatomical/form model with a small set of parameters that explain the silhouette across views. Prefer one governing coordinate, profile, width, thickness, symmetry, and material-region model over stitched primitives. Add ornament only after the core form is readable, fast, and stable; fine veins, glitter, filaments, and state pulses should begin as shading or LOD-gated overlays, not traced geometry.","files":["state/memory.json","state/map.yaml"],"source":"cursor hibiscus iteration review"}
{"timestamp":"2026-05-12T00:34:00+01:00","topic":"shader-include-ownership","lesson":"Keep shader include ownership strict before role bodies multiply. D3D12SdfMath.hlsli should hold reusable SDF primitives and generic form helpers, not cursor-specific hibiscus anatomy. Body-specific SDF structure belongs in the owning body shader. Shared lighting equations belong in D3D12BodyCommon.hlsli as material-parameterized helpers so cursor, agents, and future bodies do not duplicate GGX/body-light loops.","files":["src/Aquarium.Engine/Render/Shaders/D3D12BodyCommon.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12CursorBody.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12SdfMath.hlsli","state/memory.json"],"source":"user architecture correction"}
{"timestamp":"2026-05-12T00:51:00+01:00","topic":"body-distance-surface-shading-split","lesson":"Body SDF passes should be a bounded-cost machine: ray steps and normal samples evaluate only scalar bodyDistance; bodySurface is evaluated once after the hit is refined and returns the PBR material packet. Avoid second-pass SDF component scans such as cursorEmissionRadiance; material choice belongs in the hit surface packet and lighting belongs in shared material-parameterized functions.","files":["src/Aquarium.Engine/Render/Shaders/D3D12BodyCommon.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12BodyProxy.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12CursorBody.hlsl","state/memory.json","state/map.yaml"],"source":"user architecture correction"}
{"timestamp":"2026-05-12T01:04:00+01:00","topic":"body-surface-packet-minimalism","lesson":"Do not let diagnostic identity fields squat in BodySurface. The hot surface packet now carries only PBR material values. Distance belongs to bodyDistance and the marcher; field identity is emitted by the proxy for temporal ownership; role/material/LOD/cost ids and the common shadeRoleAgentBody router were cut because per-role shader files should own their own material decisions directly.","files":["src/Aquarium.Engine/Render/Shaders/D3D12BodyCommon.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12BodyProxy.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12AgentCharacters.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12Post.hlsl","src/Aquarium.Engine/Render/D3D12Renderer.cs","state/memory.json","state/map.yaml"],"source":"user architecture correction"}
{"timestamp":"2026-05-12T01:58:00+01:00","topic":"temporal-event-lane-cut","lesson":"Dormant full-frame lanes are architectural debt, not preparedness. Aquarium had scene event color/metadata targets plus event history targets even though every producer wrote zero coverage. The event lane, dead AgentVisual LOD/index vector, dead reactive control channel, and one-field AgentSurface wrapper were cut; temporal resolve now carries only scene color, metadata, and coverage/step control history.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Shaders/D3D12Post.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12Scene.hlsl","src/Aquarium.Engine/Render/Shaders/D3D12BodyCommon.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12BodyProxy.hlsli","src/Aquarium.Engine/Render/Shaders/D3D12AgentCharacters.hlsli","docs/hlsl-renderer.md","state/memory.json","state/map.yaml"],"source":"purification pass"}
{"timestamp":"2026-05-12T04:30:00+01:00","topic":"engine-client-boundary-vocabulary","lesson":"Aquarium.Engine and Aquarium.Engine.Contracts must speak renderer vocabulary, not Epiphany policy vocabulary. Engine contracts expose ViewFrame, height-field brushes, SDF objects, SDF lights, generic shader manifests, and generic proxy passes. Epiphany may call its own things grid, agents, bodies, or roles, but the engine only consumes declared rendering data. Enforce this with scripts/verify-boundaries.ps1 before every architectural pass.","files":["scripts/verify-boundaries.ps1","src/Aquarium.Engine.Contracts","src/Aquarium.Engine","src/Aquarium.Epiphany","state/memory.json","state/map.yaml"],"source":"engine-client extraction correction"}
{"timestamp":"2026-05-12T05:30:00+01:00","topic":"client-ui-composition-contract","lesson":"Keep the engine debug panel as engine-owned UI, but expose a separate AquariumUiDocument contract for client overlay panels. Clients compose controls through Vortice-free panel builders; Aquarium.Engine translates those declarations into its DirectWrite/Direct2D overlay and owns input dispatch. Do not let Epiphany depend on DebugUi internals.","files":["src/Aquarium.Engine.Contracts/Ui/AquariumUi.cs","src/Aquarium.Engine/Render/Ui/DebugUi.cs","src/Aquarium.Engine/Render/DirectWriteOverlay.cs","src/Aquarium.Epiphany/AquariumRuntime.cs","state/memory.json"],"source":"client UI abstraction pass"}
{"timestamp":"2026-05-12T12:35:00+01:00","topic":"unified-debug-panel","lesson":"F2 should open one Aquarium debug panel, not separate engine and client windows. Client AquariumUiDocument panels are folded into the same tabbed debug surface, clients can register terminal commands through AquariumUiDocument.Command, and future debug UI should extend this shared composition surface instead of spawning parallel panels.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Ui/DebugUi.cs","src/Aquarium.Engine.Contracts/Ui/AquariumUi.cs","src/Aquarium.Epiphany/AquariumRuntime.cs","state/memory.json","state/map.yaml"],"source":"debug UI consolidation pass"}
{"timestamp":"2026-05-12T13:00:00+01:00","topic":"debug-tab-chrome","lesson":"Debug tabs are navigation chrome, not document content. The unified F2 panel title is Debug, with a row of tab buttons directly below it and visible active highlighting. Future debug surfaces should add tabs through the same chrome path instead of creating fake Tabs sections or parallel panels.","files":["src/Aquarium.Engine/Render/Ui/DebugUi.cs","src/Aquarium.Engine/Render/D3D12Renderer.cs","state/memory.json"],"source":"user UI correction"}
{"timestamp":"2026-05-12T13:20:00+01:00","topic":"debug-text-box-control","lesson":"Long editable UI buffers need real text box controls, not row-value text fields. AquariumUiTextBox carries line count, return behavior, and optional submit action through the contract; DirectWrite debug UI renders it as a boxed editable region. Use row Text only for compact scalar strings.","files":["src/Aquarium.Engine.Contracts/Ui/AquariumUi.cs","src/Aquarium.Engine/Render/Ui/DebugUi.cs","src/Aquarium.Engine/Render/D3D12Renderer.cs","state/memory.json"],"source":"debug UI improvement pass"}
{"timestamp":"2026-05-12T13:27:00+01:00","topic":"multiline-debug-terminal","lesson":"The debug terminal should be one multiline session surface: recent log lines plus the live prompt at the end. Typing updates only the trailing prompt, Enter submits that prompt and appends the command/output to the log. Avoid separate output readouts plus detached command rows for terminal UI.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Ui/DebugUi.cs","state/memory.json"],"source":"user terminal correction"}
{"timestamp":"2026-05-12T13:42:00+01:00","topic":"terminal-textbox-polish","lesson":"Terminal text boxes need terminal typography and prompt-safe editing. Bundle Ubuntu Sans Mono for DirectWrite monospace surfaces, let AquariumUiTextBox opt into monospace and bottom alignment, and guard empty trailing prompts so backspace cannot collapse the prompt sentinel and reclassify the log as command input.","files":["src/Aquarium.Engine/Assets/Fonts/UbuntuSansMono.ttf","src/Aquarium.Engine.Contracts/Ui/AquariumUi.cs","src/Aquarium.Engine/Render/DirectWriteOverlay.cs","src/Aquarium.Engine/Render/Ui/DebugUi.cs","src/Aquarium.Engine/Render/D3D12Renderer.cs","state/memory.json"],"source":"user terminal polish correction"}
{"timestamp":"2026-05-12T13:55:00+01:00","topic":"terminal-surface-layout","lesson":"Terminal surfaces should not display ordinary text-box labels or fake corner carets. A terminal prompt is already the affordance. Use label-less text boxes for terminal sessions, use a near-aligned monospace text format, and bottom-align by drawing the terminal line list against the box bottom rather than relying on centered DirectWrite paragraph layout.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/DirectWriteOverlay.cs","src/Aquarium.Engine/Render/Ui/DebugUi.cs","state/evidence.jsonl"],"source":"user visual correction"}
{"timestamp":"2026-05-12T14:05:00+01:00","topic":"terminal-bottom-line-layout","lesson":"DirectWrite multiline layout can still make a terminal body feel vertically floating even when the containing bounds are bottom-biased. For terminal-style text boxes, draw visible lines individually from the bottom of the text bounds using explicit line height; do not rely on padded blank lines or paragraph layout for bottom alignment.","files":["src/Aquarium.Engine/Render/Ui/DebugUi.cs","state/evidence.jsonl"],"source":"user screenshot correction"}
{"timestamp":"2026-05-12T14:25:00+01:00","topic":"debug-text-editing-capture","lesson":"Debug text boxes need real editing ownership: persistent caret index, selection anchor, mouse placement, drag selection, arrow/Home/End movement, Backspace/Delete, selected-text replacement, and input capture while focused. When a text box owns the keyboard, host-level debug hotkeys and client camera controls must receive a non-interactive input snapshot instead of the live key/mouse state.","files":["src/Aquarium.Engine.Contracts/Input/InputState.cs","src/Aquarium.Engine/AquariumHost.cs","src/Aquarium.Engine/Platform/Win32Window.cs","src/Aquarium.Engine/Render/IAquariumRenderer.cs","src/Aquarium.Engine/Render/D3D12Renderer.cs","src/Aquarium.Engine/Render/Ui/DebugUi.cs","state/memory.json"],"source":"user text editing requirement"}
{"timestamp":"2026-05-12T14:35:00+01:00","topic":"directwrite-text-editing-metrics","lesson":"Do not position text-box caret or selection with guessed monospace character widths. Use DirectWrite text layout hit-test positions for the same font and layout used to draw text, cache those positions for mouse placement, and keep text boxes focus-only visually rather than filling like active buttons on click.","files":["src/Aquarium.Engine/Render/Ui/DebugUi.cs","state/evidence.jsonl"],"source":"user screenshot correction"}
{"timestamp":"2026-05-12T14:42:00+01:00","topic":"directwrite-text-editing-vertical-metrics","lesson":"Horizontal caret alignment is not enough. Caret height and selection top/bottom should also come from DirectWrite hit-test metrics for the active glyph run; using the UI line box makes editing visuals droop below the text even when x positions are correct.","files":["src/Aquarium.Engine/Render/Ui/DebugUi.cs","state/evidence.jsonl"],"source":"user screenshot correction"}
{"timestamp":"2026-05-12T14:50:00+01:00","topic":"text-edit-commit-state","lesson":"After a text box writes a new bound value, preserve caret and selection against the committed local value immediately. If edit state waits for the next read/sync cycle, the first typed character can leave stale caret state and subsequent input inserts at the wrong position, corrupting commands.","files":["src/Aquarium.Engine/Render/Ui/DebugUi.cs","state/evidence.jsonl"],"source":"terminal input corruption fix"}
{"timestamp":"2026-05-12T14:51:00+01:00","topic":"terminal-prompt-edit-boundary","lesson":"A terminal text box displays immutable log text plus a mutable prompt tail, so its editing model must clamp caret, selection, insertion, deletion, Home, and mouse placement to the prompt input region. Local text edits must clamp against the in-flight edited value, not the stale bound read value, or the first character on an empty prompt snaps the caret behind itself.","files":["src/Aquarium.Engine/Render/Ui/DebugUi.cs","src/Aquarium.Engine/Render/D3D12Renderer.cs","state/evidence.jsonl"],"source":"user terminal caret/backspace correction"}
{"timestamp":"2026-05-12T19:57:28+01:00","topic":"debug-dropdown-overlay-ownership","lesson":"Dropdown option lists are transient overlay panels, not row layout. Keep the field row's layout height constant, align the popup to the value field bounds, flip above the field when viewport space below is worse, scroll long lists inside the popup, and close the modal on outside click before other controls can react.","files":["src/Aquarium.Engine/Render/Ui/DebugUi.cs","state/evidence.jsonl"],"source":"user dropdown layout correction"}
{"timestamp":"2026-05-12T20:04:11+01:00","topic":"debug-ui-mouse-input-capture","lesson":"Renderer input capture must include both keyboard ownership and mouse ownership. If Debug UI consumes wheel or mouse interaction but the renderer only reports keyboard capture, the same wheel event leaks into client camera/runtime controls after the overlay handles it.","files":["src/Aquarium.Engine/Render/D3D12Renderer.cs","state/evidence.jsonl"],"source":"user dropdown scroll capture correction"}
{"timestamp":"2026-05-12T21:28:22+01:00","topic":"single-solution-authority","lesson":"Keep one solution inventory for Aquarium. Maintaining both Aquarium.Engine.sln and Aquarium.Engine.slnx created duplicate project authority, Rider confusion, and verification races when both were built against shared obj/bin outputs. Aquarium.Engine.sln is the canonical solution for IDE and CLI work.","files":["Aquarium.Engine.sln","AGENTS.md","README.md","scripts/dev-watch.ps1","state/map.yaml","state/evidence.jsonl"],"source":"user solution authority cleanup"}
{"timestamp":"2026-05-12T23:08:00+01:00","topic":"synth-test-ownership","lesson":"Aquarium must not own synth reference truth. Engine tests may smoke-test the runtime synth host boundary, but synth correctness belongs in AquariumSynthCSharp so Aquarium can keep iterating while the synth library is under construction.","files":["tests/Aquarium.Engine.Tests/SynthPlaybackTests.cs","tests/Aquarium.Engine.Tests/Aquarium.Engine.Tests.csproj","state/evidence.jsonl"],"source":"user questioned synth testing ownership"}
{"timestamp":"2026-05-13T00:26:00+01:00","topic":"synth-package-boundary","lesson":"Aquarium must not build against the live AquariumSynthCSharp project while a synth agent is mutating it. Consume AquariumSynth.Dsl as a pinned repo-local NuGet package and update that package only by deliberate version bump.","files":["NuGet.config","packages/AquariumSynth.Dsl.0.1.0-aquarium.1.nupkg","src/Aquarium.Engine/Aquarium.Engine.csproj","scripts/update-synth-package.ps1","state/map.yaml","state/memory.json","state/scratch.md","state/evidence.jsonl"],"source":"user asked whether synth-agent work can break Aquarium builds"}