From 108982d135b35139a76d592fb81dc486b11b6f74 Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Sun, 16 Aug 2026 16:36:45 +0200 Subject: [PATCH] docs(opstack): the proved-bound rule now names VF_PerlinAbsBound and the FBM normalisation Co-Authored-By: Claude Opus 5 --- OPSTACK-HANDOFF.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OPSTACK-HANDOFF.md b/OPSTACK-HANDOFF.md index 88501c2..76117df 100644 --- a/OPSTACK-HANDOFF.md +++ b/OPSTACK-HANDOFF.md @@ -222,6 +222,14 @@ Everything before it is built and green. - **A bound in a box verdict must be PROVED, not observed.** `|Perlin3D| ≤ 1.5` is derived from `GradDot`'s two-distinct-axes form and the per-axis weighted bound of 0.5 — *not* from the header's "~[-1,1]". Over-estimating costs CPU; under-estimating deletes collision. + **⚠️ USE `VF_PerlinAbsBound` — it is file-scope in `VoxelDensityOpStack.cpp` and it is the ONLY + copy. Never write a bare `1.0` for a noise amplitude in a reach.** `VoxelNoise::FBM` **normalises** + (`return Total / MaxValue`), so `sup|FBM| = sup|Perlin3D|` **exactly** — the octave sum neither + amplifies nor attenuates it, and an `FBM`-driven reach needs the same 1.5. This rule was written + *before* three `ExtraReach` formulas were found violating it (2026-08-16, fixed in `7dbdf51`): + VerticalShafts and Maze were unsound at their shipped defaults, FloatingIslands sound only because + its `SDFBlendRadius` happens to be large. **A rule stated in a doc is not a rule enforced in code** — + when you add a reach, grep for `VF_PerlinAbsBound` and use it. - `ProcessQueue` stays `EQueueMode::Mpsc`; `Epoch` carries through every async path; don't "optimize" the `ARCHITECTURE §8.10` invariants. - Commit per coherent unit with a real message. **`experimental` is pushed and tracked