Core ResolvedLayoutSnapshotV1 (canonical JSON, stable identity): per strate stable ID, generator, recipe, interior bounds in metres, ceiling/bedrock bands as Core really applies them, transition mode/width, dispatch provenance. Validator: compat mode reports today's deviations; strict mode enforces ceiling -> content -> bedrock -> next ceiling (owner rule), two separate bands, nominal contiguity, interpenetration only within the declared EVoxelStrateTransition width; 7 negative controls rejected. Findings: SW built at -120..-632 m although the params say -60 m; a 60 m unowned gap filled by analytic FI fallback; no active bedrock bands; transitions ignored by Core. All L19 hashes unchanged (28 + 14 crossing runs). The Unreal adapter exports resolved_layout (uncompiled here). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSFYgsdW8ejZSyiMf4qRSX
204 lines
14 KiB
Markdown
204 lines
14 KiB
Markdown
# World Assembler L21 — resolved strate layout
|
||
|
||
This round adds a read-only layout snapshot and validator. It does not change density or mesh
|
||
evaluation.
|
||
|
||
## Snapshot and current stack
|
||
|
||
World identity is `owner-world/seed/0`; Core voxel size is 0.25 m, owner voxel size is 0.125 m, and
|
||
all lattice origins are `(0,0,0)`. Intervals below are half-open `[bottom, top)` metres. Stable strate
|
||
IDs are `owner-world/seed/0/strate/<index>/generator/<kind>`. The shared Core record uses canonical
|
||
JSON schema v1 and an FNV-1a payload identity.
|
||
|
||
The required structure, top to bottom, is:
|
||
|
||
```text
|
||
strate N ceiling band
|
||
content
|
||
bedrock band
|
||
strate N+1 ceiling band
|
||
content
|
||
bedrock band
|
||
```
|
||
|
||
Ceiling and bedrock remain distinct bands owned by their own strate. Their nominal edges touch; a
|
||
separate `EVoxelStrateTransition` declaration describes possible interpenetration.
|
||
|
||
| Prototype | Order / stable suffix | Generator; recipe version | Interior/content (m) | Current ceiling | Current bedrock | Transition at lower interface |
|
||
|---|---|---|---|---|---|---|
|
||
| SurfaceWorld | 0 / `TunnelNetwork` | TunnelNetwork; `legacy.TunnelNetwork` v0 | `[-120, 8)` | No Core density band. Manager configures a 1 m upper `VF_ApplyBoundarySeal` at `[8,9)`, but the compiled analytic Core path does not apply it. | No Core density band. Manager configures a 1 m lower `VF_ApplyBoundarySeal` at `[-121,-120)`, but the compiled analytic Core path does not apply it. | Gradient, 2 chunks = 8 m by the 4 m manager chunk. Core does not apply it; manager/dispatch chunk widths are 4/8 m. |
|
||
| SurfaceWorld | 1 / `SurfaceWorld` | SurfaceWorld; `SurfaceWorld.Heightfield2D` v1 | `[-632,-120)` | No separate volumetric band; cap profile is in content, with `AppendStratumBoundaryCeilings` mesh fallback. | None. | Gradient, 1 chunk = 4 m by manager units; no lower strate in this plan. Manager/dispatch widths are 4/8 m. |
|
||
| FloatingIslands | 0 / `FloatingIslands` | FloatingIslands; `FloatingIslands.ClusterField` geometry v3 | `[-60,4)` | Active one-sided upper seal `[3.5,4)` = 0.5 m. It overlaps the content range by 0.5 m. | None in geometry v3. | Gradient, 2 chunks = 8 m. Core does not apply it; manager/dispatch widths are both 4 m. |
|
||
| FloatingIslands | 1 / `SurfaceWorld` | SurfaceWorld; `SurfaceWorld.Heightfield2D` v1 | `[-632,-120)` | No separate volumetric band; cap profile is in content, with mesh fallback. | None. | Gradient, 1 chunk = 4 m; no lower strate in this plan. Manager/dispatch widths are 4/8 m. |
|
||
|
||
Dispatch provenance is recorded per stratum in the JSON snapshot:
|
||
|
||
- SurfaceWorld bounds come from `BuildSurfaceStratumPlan`, which converts each chunk with 32 Core
|
||
voxels = 8 m. `NativeSurfaceDensityAt` selects with `floor(CoreZ/32)`, then calls
|
||
`GetGeneratorTypeForChunk` / `GetStrateIndex`. The manager's owner chunk is 4 m.
|
||
- FI bounds come from `BuildFloatingIslandStratumPlan`, which converts each 32-voxel owner chunk
|
||
through the 12.5/25 cm owner/Core ratio = 16 Core voxels = 4 m. `NativeFloatingIslandDensityAt`
|
||
uses the same conversion before the manager lookup.
|
||
- Legacy TunnelNetwork selection uses the Core 32-voxel chunk lookup. The manager helper assigns
|
||
the upper strate's transition to its lower interface.
|
||
|
||
SurfaceWorld strata carry four cap profiles, 33 route points and their attached passages. The FI
|
||
strate carries four island anchors and its attached passages. The snapshot preserves these recipe
|
||
anchors in their source fixed-point units.
|
||
|
||
The owner configuration’s non-Hard transitions are currently not honored by Core at these interfaces.
|
||
`UVoxelStrateManager::GetGenerationParams` contains legacy vector blending, but Core’s compiled
|
||
dispatcher selects the resolved/native per-strate fields without applying that blend. FI v3 calls
|
||
`VF_ApplyUpperBoundarySeal` for its ceiling; player edit brushes are applied after the native field,
|
||
so that seal remains diggable. Bands default to `diggable=true`, `protected=false`; protection is an
|
||
explicit option.
|
||
|
||
```text
|
||
Current SurfaceWorld plan, top → bottom
|
||
TunnelNetwork ceiling [8,9) (configured; inactive in Core density)
|
||
TunnelNetwork content [-120,8)
|
||
TunnelNetwork bedrock [-121,-120) (configured; inactive in Core)
|
||
SurfaceWorld ceiling: none
|
||
SurfaceWorld content [-632,-120)
|
||
SurfaceWorld bedrock: none
|
||
|
||
Current FI prototype, top → bottom
|
||
FI ceiling [3.5,4) active, inset into FI content by 0.5 m
|
||
FI content [-60,4)
|
||
FI bedrock: missing
|
||
Unassigned interval [-120,-60) = 60 m
|
||
SurfaceWorld ceiling: none
|
||
SurfaceWorld content [-632,-120)
|
||
SurfaceWorld bedrock: none
|
||
```
|
||
|
||
The SurfaceWorld and FI content interiors therefore do not overlap: the FI prototype has a 60 m gap.
|
||
The owner manager slots meet at −60 m when both use 4 m owner chunks, but SurfaceWorld plan/query
|
||
dispatch converts chunks at 8 m while FI converts at 4 m. In the gap, Core answers through the
|
||
compiled analytic FloatingIslands fallback, not either planned recipe; probes at −68 m returned
|
||
solid density −4.125. SurfaceWorld and TunnelNetwork content interiors touch at −120 m in the
|
||
SurfaceWorld prototype, but Core does not apply the declared Gradient there.
|
||
|
||
## Compatibility validation and boundary probes
|
||
|
||
Compatibility mode accepted both layouts with seven reported issues apiece. SurfaceWorld reports
|
||
unhonored transition, 4/8 m dispatch-unit ambiguity on both strates, and missing current-field
|
||
ceiling and bedrock bands on both. FI reports its unhonored transition, missing FI bedrock, the
|
||
0.5 m ceiling/content overlap, the 60 m uncovered interval, and missing SurfaceWorld ceiling and
|
||
bedrock. These are recorded as compatibility deviations, not world changes.
|
||
|
||
Strict mode accepted a valid synthetic two-strate fixture. Its seven negative controls rejected:
|
||
|
||
| Control | Strict check that rejects it |
|
||
|---|---|
|
||
| Nominal band overlap | Bedrock(N) bottom must equal ceiling(N+1) top. |
|
||
| Nominal band gap | The same exact nominal contiguity check. |
|
||
| Missing bedrock | `bedrock.present` is required. |
|
||
| Missing ceiling | `ceiling.present` is required. |
|
||
| Wrong band order | Each band kind and the ceiling → content → bedrock edges must match. |
|
||
| Gap between bedrock(N) and ceiling(N+1) | Their nominal endpoints must be equal. |
|
||
| Interpenetration wider than transition | Explicit overlap must be at most the mode’s limit; this control uses 4,000,001 µm against a 4,000,000 µm Gradient zone. |
|
||
|
||
Hard has a 0 m limit. Gradient uses `TransitionBlendChunks × 4 m`; Interleaved adds its recorded
|
||
two-manager-chunk warp amplitude to the blend width. The nominal bands still touch exactly; the
|
||
separate interpenetration field records any permitted physical crossing. Current Core
|
||
interpenetration is 0 m because it does not apply the declared blends.
|
||
|
||
Each plan audited 21 points: one Core voxel (0.25 m) below, at, and above every distinct content,
|
||
active-band, configured-band, and transition-zone endpoint. The remaining points agreed with the
|
||
snapshot. Every disagreement was an uncovered snapshot point answered by a named compiled analytic
|
||
fallback:
|
||
|
||
| Prototype | Probe Z (m) | Actual Core dispatch | Density / occupancy |
|
||
|---|---|---|---|
|
||
| SurfaceWorld | −632.250 | `compiled-analytic/TunnelNetwork` | `+1`, air |
|
||
| SurfaceWorld | 8.000, 8.250, 8.750, 9.000, 9.250 | `compiled-analytic/TunnelNetwork` | `+9.648438`, `+10.64844`, `+12.64844`, `+13.64844`, `+14.64844`; all air |
|
||
| FI | −632.250 | `compiled-analytic/TunnelNetwork` | `+1`, air |
|
||
| FI | −120.000, −119.750 | `compiled-analytic/FloatingIslands` | `−108.4793`, `−107.4969`; solid |
|
||
| FI | −68.250, −68.000, −67.750, −60.250 | `compiled-analytic/FloatingIslands` | `−4.125`; solid at each point |
|
||
| FI | 4.000, 4.250 | `compiled-analytic/FloatingIslands` | `+0.671875`, `+2.253906`; air |
|
||
|
||
Probe summaries: SurfaceWorld 6/21 disagreements; FI 9/21. Full per-point records are in
|
||
`Saved/Linux/linux21/boundary-probes-{surface-world,floating-islands}.log`.
|
||
|
||
## Identity, output parity and cost
|
||
|
||
Snapshots round-tripped through canonical JSON. At W1/W8/W12 their bytes were identical per recipe:
|
||
|
||
| Recipe | Stable identity | Canonical JSON SHA-256 |
|
||
|---|---|---|
|
||
| SurfaceWorld | `resolved-layout-v1-fnv64:63cf4d2661149fcd` | `267586b3da9bc5c08c654c097559b205222f53c594c4c4332cb4929fd3d75c05` |
|
||
| FloatingIslands | `resolved-layout-v1-fnv64:1d90167f37ef9323` | `7bb9e9d745de3a2edf4276f507a5e4c082ff86aa73d9c1ad7e77c1b4d8b8bea8` |
|
||
|
||
The 28 hash runs (both recipes, Clang `fp-contract=off` and GCC default, W1/W8/W12 and W12×5)
|
||
matched all 12 L19 rows per run. The 14 dedicated 24 m crossing runs also matched all 12 L19
|
||
crossing rows. The table gives the final Clang W12×5 rows, in density/mesh/payload/topology order;
|
||
each equals its L19 reference.
|
||
|
||
| Scope | SurfaceWorld | FloatingIslands |
|
||
|---|---|---|
|
||
| Full detail | `0ee0579bd15cbbe4 / 32e5d4964d610fee / 1932b96ee4b1d910 / 69743c6bad3447dc` | `43034299d33f2536 / a41e8353ec4bbe9c / cd0e3e15eef827b0 / 0b3c3f13cc1d6f8a` |
|
||
| Whole view | `c10697a8f48380c7 / 4197fc1072f0ff58 / 7b3e616ec9459851 / c879e35592bf33e5` | `00bc3607a7839854 / 4baa66127c2b0892 / e11ef05e851a1517 / 1278bc4b1fffb869` |
|
||
| LOD 0 | `769f2a706d585a72 / 33eeeb39fa443816 / 645621a1d968983f / c2457ed905036c9d` | `ccf97d8e95163a35 / 3333fa0ddebdece2 / d1906bffc2b9d6f2 / a261f3d965e15c12` |
|
||
| LOD 1 | `69cc5a5c0a2c60af / b48335f5410c57d5 / d15c5480162ab8ba / feca1bd025823604` | `25fa2f0fa7fbb6e6 / c549c519707ac1d7 / 66f797cde4ebdecf / 2383982a12a27ee5` |
|
||
| LOD 2 | `85deed5683a77202 / 53469895987aeea2 / e55f8ae7e1532033 / d5feb12a0e85c09b` | `c0577decd8a02cab / 3ccf08b7be6edc5b / 0abcbbda5a06c110 / 11c77b71b606fe75` |
|
||
| LOD 3 | `6518caefb3be7e7f / ec513c90b853a614 / f62fa1137ff17f82 / ccf1dcf681965816` | `386e0c0ef2d7c920 / 1ee2c82d34ad9918 / 000a6514ba018406 / 1b4523b19e90f305` |
|
||
| LOD 4 | `62d4be96021992f4 / 42706847cb9c744a / eab76f9634e4b9bd / 207ffbb6ef184397` | `e8117a3a803be9f8 / 8a6c36cae1fe0e30 / c839f1b1629eff8c / 0ce9d7ea77b4f62b` |
|
||
| LOD 5 | `5e4a8c38b8cea6fc / 76adc9ae86988e27 / 938975bf7cc6d94d / 42e135856abdbcac` | `ca6d1df453c6b600 / 02c90d834d9a3fb6 / 4364c37d526f4104 / 1b1cf40d25e50ddf` |
|
||
| LOD 6 | `e036e95b9006945b / a880cc101a4ed957 / bd82f1aefad6dd89 / 5e9f3408345d95b3` | `6764e347b08603a0 / 46c6ed9a1f029b94 / 5b8dc9d5b7cb0d3d / a10a4a69a93eac4d` |
|
||
| LOD 7 | `8ee358af56a30d8d / 5cbd8e5965a2cc3f / d4a7fe5d9e4bde30 / 4dd52cd090a9af78` | `c7cd1b483c598595 / a545eb567dc4a0df / b0a1fb225437e05a / 301d1b884c509550` |
|
||
| LOD 8 | `c3458e1cbdb9c471 / fba3698d21dd1be0 / 77dfb814eac3a24c / c9514f1580c42449` | `7b6e9279b4993109 / cc63440d9867a18d / 12f5cec78b38fa1b / eed919db6db6b2a7` |
|
||
|
||
Exact-query rows (density/unclamped, detail, collision): SurfaceWorld `e4d4a8eb95b35933 / e4d4a8eb95b35933`,
|
||
`efcba20c0c70c415`, `e604823a249029bf`; FloatingIslands `87e5c0dbf9ee9ee2 / 87e5c0dbf9ee9ee2`,
|
||
`efcba20c0c70c415`, `e604823a249029bf`. The representative 24 m crossing W12×5 whole-view row is the
|
||
SurfaceWorld row above; all crossing full-detail, LOD and exact-query rows matched the L19 crossing
|
||
reference.
|
||
|
||
Five interleaved hashing-off W12 pairs against L19 measured SurfaceWorld medians 1.510 s old / 1.512 s
|
||
new (+0.14%) and FI 13.487 s old / 13.381 s new (−0.79%). The opt-in snapshot is constructed once
|
||
at plan time, outside tile workers; ordinary standalone evaluation does not request it. No hash rows
|
||
were produced during these pairs.
|
||
|
||
Clang and GCC builds passed at 12 jobs. Final build peak process-tree/single-process RSS was
|
||
2,697,676/450,248 KiB (Clang) and 4,570,704/897,024 KiB (GCC). The final evidence runner's maximum
|
||
single-process RSS was 583,736 KiB. All runs used CPUs 0–11 and stayed below the per-run limit; no
|
||
governor or system changes were made.
|
||
|
||
## Failed and retried runs
|
||
|
||
- An initial snapshot invocation omitted `--stream-benchmark --stream-pipeline` and exited 2; adding
|
||
the required flags passed.
|
||
- Early Clang builds caught a `strates` member typo, then an audit initializer/type error. Both were
|
||
fixed; the final Clang builds passed.
|
||
- The first complete evidence pass exited 1 at boundary probing because the audit read the host
|
||
manager after the harness had released it. Dispatch provenance was moved to Core's live selector;
|
||
the final audits passed.
|
||
- One GCC build wrapper was interrupted (exit 130) while diagnosing an empty progress log, then
|
||
rerun successfully. No runtime/hash run timed out or exceeded 15 minutes, and no L19 hash mismatch
|
||
remained.
|
||
|
||
## Owner note
|
||
|
||
This records the present strata and confirms the selected ceiling → content → bedrock model. FI still
|
||
has no floor in v3; SurfaceWorld has no volumetric floor or separate ceiling; the 8 m / 4 m dispatch
|
||
conversions leave a 60 m FI-prototype gap answered by analytic fallback. Core currently ignores the
|
||
configured transition blend at these interfaces. Bedrock and ceiling protection remain explicit
|
||
options with diggable defaults. This round changes no world output.
|
||
|
||
The Unreal adapter adds only a separate `resolved_layout` JSON field beside `world_assembly`; that
|
||
small edit could not be compiled on this Linux machine. No async path, density evaluator, hash input,
|
||
or recipe version changed. No commit, push, or stash was made.
|
||
|
||
## Orchestrator review (Claude)
|
||
|
||
- Merged: read-only snapshot + validator, no world change (28 hash runs and 14 crossing runs equal L19;
|
||
cost within noise). The Unreal adapter gains a 193-line `resolved_layout` export beside
|
||
`world_assembly`. It is export-only, but UNCOMPILED here; it must be built on the owner PC.
|
||
- Key facts for the owner: the authored params put the SW top at −60 m (4 m owner chunks), Core
|
||
builds SW at −120…−632 m (8 m conversion); the 60 m between FI and SW is unowned and answered by
|
||
the analytic FloatingIslands fallback as solid. No strate has an active bedrock band; SW has no
|
||
ceiling band (mesh fallback only); configured Gradient transitions are ignored by Core.
|
||
- To check next: whether the "ledges" ground seen under the islands is this fallback solid in the
|
||
unowned gap rather than SW terrain (L19 attributed them to SW at about −60…−73 m).
|