feat: TunnelNetwork stage A — the SDF spine, wrapping BuildChunkCache
The last archetype is ~1080 lines with 13 detail modifiers, a two-region cache and a per-room op override. Porting it whole before anything can be verified is ~600 unverified lines on top of ~200 — the pattern this refactor has dodged six times. So: three stages. Stage A = vertical scale, base rock, cave warp, room graph (+ pits and chimneys), carve, worms, structural post. 6 ops. It is verifiable NOW because every detail modifier is amplitude-gated and FStrateGenerationParams already defaults them all to zero — zeroing SurfaceRoughness sends the ORIGINAL down exactly the path stage A ported. TunnelNetwork stays OFF in UsesOperatorStackForChunk until stage C. The decision that matters: FRoomGraphSource CALLS BuildChunkCache and EvaluateSDFCached rather than transcribing them. That is where §8.4's two-region window-invariance discipline lives; a transcription would fork it, and the fork would be "validated" by a test comparing it to the original. Only the ~60 lines of glue are transcribed. FRAME ops are retired. All three candidates are now ported and none needed one: CaveWarp's scope is exactly one operator (pits/chimneys read unwarped coords), VerticalScale is a one-line pure function, and the island warp was already local. Not missing infrastructure — one idea seen three times from a distance. Also: check 3 was going to compare two interleaved param sets against the original, which would have FAILED — the original's SDF cache key has no params, so it serves B the rooms it built for A. Comparing there measures its bug, not the port. Rewritten against each stack evaluated alone. The same reasoning suggests a live production staleness across Gradient transitions; filed in AUDIT §C2 as SUSPECTED with the check that would confirm it, since it rests on a premise I have not verified. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -170,6 +170,22 @@ The order is load-bearing and is the order the code already uses: spine carves t
|
||||
the seal then re-solidifies its bands (the spine deliberately never touches them), passages punch
|
||||
through everything including the seal, and the player wins last.
|
||||
|
||||
> ### ⛔ RETIRED 2026-07-28 — frames were never a fifth thing. Porting all three candidates killed it.
|
||||
>
|
||||
> The section below argues for a `FRAME` op family from three examples. All three are now ported,
|
||||
> and none of them turned out to need one:
|
||||
>
|
||||
> - **`CaveWarp` wraps exactly ONE operator.** Pits and chimneys explicitly read *unwarped* coords
|
||||
> while writing the same SDF channel — the thing this document called "the single fiddliest thing
|
||||
> in the whole decomposition". Inside one operator the difficulty evaporates: the warp is a local
|
||||
> variable, not an inherited context. A transform whose scope is one op is not a frame.
|
||||
> - **`VerticalScale` is `Z / Scale`** — a pure function of a scalar and a param, recomputed in one
|
||||
> line by each op that needs it. A frame would add a channel to avoid a division.
|
||||
> - **The island warp (§7)** was kept local for the same reason, before the other two were even read.
|
||||
>
|
||||
> **Zero frames out of three candidates.** It was not missing infrastructure; it was one idea seen
|
||||
> three times from a distance. Kept below as the reasoning that was superseded, not as a plan.
|
||||
|
||||
### A fifth thing the plan doesn't name: FRAME OPS
|
||||
|
||||
Two archetypes transform the *query coordinates* rather than the field:
|
||||
|
||||
Reference in New Issue
Block a user