Luna, M1 round 1 of 4 (plan in Standalone/ASSEMBLER_M1_REPORT.md): - Versioned fixed-scale world manifest (the shipped plan format) and the Core block contract: point evaluation, interval-or-unknown, influence bound, detail envelope, channels. - Interval audit: 256 boxes / 6,912 samples, 0 missed, 0 unknown; a deliberately false bound is detected (negative control). - Native Heightfield2D with biome input: 4,096-point hash fae2721c052aec5c identical at W1/W8/W16; point queries 2.059 ms vs 62.115 ms legacy -- but NOT a match yet (mean density error 274 voxels, 2,261 sign mismatches vs the legacy surface). 45 mesh-free Core queries match direct evaluation exactly. Existing cave world unchanged (walkability, 64/64 tiles). - Open: collision readiness, a valid full-view timing (viewer captures were occluded/empty; top-down height maps are the only usable pair). Also carries the design doc's owner decisions (fixed water; player edits unrestricted, route law for automatic changes only) and three plugin files + BuildHost scripts that earlier round commits had missed (also fixed on unreal/core-integration as 2574b56). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
182 lines
12 KiB
Markdown
182 lines
12 KiB
Markdown
# World assembler M1 report
|
||
|
||
M1 has four implementation rounds. The gates at the end of the milestone remain the agreed
|
||
two-biome SurfaceWorld in the owner's game, including coast, cliff/overhang, cap and a walkable
|
||
route; conservative bound audits; route sweep; identical evaluator hashes at W1/W8/W16; separate
|
||
local query/collision readiness and full-view timings; faster matched workload than the 23.085 s
|
||
legacy bridge; and server field queries that do not depend on render meshes. The approximately
|
||
1.57 s whole-view aim (2 × the 0.785 s cave-only Core measurement) is an aim, not an acceptance gate.
|
||
|
||
## Round 1 of 4 — native foundations
|
||
|
||
- Define the fixed-scale, versioned, hashed recipe and shipped-plan payload, including the Core
|
||
field-block contract and explicit field channels.
|
||
- Add a brute-force interval audit with a deliberately false bound as a negative control.
|
||
- Implement the first native `Heightfield2D` block with biome-map input and compare it with the
|
||
SurfaceWorld legacy bridge in the standalone viewer.
|
||
- Record current hashes, timings, audit results and a small owner/native capture pair. This round
|
||
establishes a heightfield baseline; it does not claim the final two-biome/coast/cliff/route gate.
|
||
|
||
## Round 2 of 4 — complete the surface recipe
|
||
|
||
- Add output-space biome blending, coast and beach shaping, cap detail, cliffs and bounded 3D
|
||
overhang exceptions with stable feature IDs and certified influence bounds.
|
||
- Keep unknown or intersecting exception intervals on the evaluation path. Expand the brute-force
|
||
audit across biome borders, cliffs, caps, negative coordinates and exception bounds.
|
||
- Measure surface field query cost separately from cave compilation and full-view rendering; tune
|
||
caches only after the workload and cache identity are fixed.
|
||
|
||
## Round 3 of 4 — route and query readiness
|
||
|
||
- Ship the finite-strate plan with route points, support constraints and stable IDs. Sweep the actual
|
||
player capsule over the final composed field and repair/reject any failing candidate.
|
||
- Verify W1/W8/W16 evaluator hashes, route clearance/support and deterministic plan serialization.
|
||
- Keep the capsule-swept, supported route valid through generation and automatic/scripted changes.
|
||
Player carve/fill edits are unrestricted and may break or plug the route. Seas and rivers stay fixed
|
||
for the season, with shore behavior under edits measured separately.
|
||
- Report local field-query and collision readiness separately from render mesh readiness, and show
|
||
a server-side field query path that does not build or require render meshes.
|
||
|
||
## Round 4 of 4 — Unreal delivery and owner review
|
||
|
||
- Import the reviewed manifest into the season asset/content hash path and connect the native Core
|
||
evaluator behind `bUseVoxelForgeCore`, preserving the legacy path when the flag is off.
|
||
- Build only the isolated BuildHost target here; the owner builds the project. Review the two-biome
|
||
surface and route in-game, then publish matched workload timings, hashes, audit logs and captures.
|
||
- Close every M1 gate or name the failed gate, its evidence and the additional repair round needed.
|
||
|
||
## Round 1 results
|
||
|
||
### Deliverables
|
||
|
||
- Added the public recipe, shipped-plan, hash, channel, block-contract, interval, influence and
|
||
detail-envelope types in `Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h`. Recipe and
|
||
evaluator schemas are version 1. All recipe, plan, feature, route and field coordinates use signed
|
||
1/256-voxel integers; the plugin's Core voxel remains 25 cm.
|
||
- Added manifest parse/finalize/validate/serialize and canonical FNV-1a 64 hashing in
|
||
`Standalone/Core/src/WorldAssemblerInternal.h`. Fields hash in declared order as little-endian
|
||
4/8-byte words. Hashes are 16 lowercase hex digits; JSON key order and whitespace are ignored.
|
||
The optional owner-snapshot `world_assembly` field matches the payload shape planned for the
|
||
season manifest. The current review artifact is
|
||
[`round1-manifest.json`](Research/WorldAssemblerM1/round1-manifest.json); season asset/hash-path
|
||
integration remains for round 4.
|
||
- Added native `Heightfield2D`: deterministic warped Voronoi biome selection with Q16 border blend,
|
||
fixed integer profile noise, ground and cap heights, signed density (`negative = solid`), declared
|
||
channels, a conservative global interval, unbounded XY/finite-stratum-Z influence and an explicit
|
||
detail envelope. The current block reads `biome` and writes `height` and `rock`. Water, route and
|
||
surface-tag channels are declared for later blocks, not yet emitted by this block.
|
||
- Connected that block to native Core density queries and added the standalone audit/viewer switches.
|
||
`API.md` documents the current data format and its limits.
|
||
|
||
### Sample manifest and hashes
|
||
|
||
The viewer builds a sample from the owner's `type_4_SurfaceWorld.json` probe: one finite strate
|
||
(index 1, chunk Z -16 through -79), two synthetic stable biome IDs (4097 and 4098), no planned
|
||
features, and no route points yet. The compact manifest is 972 bytes.
|
||
|
||
| Content | Hash |
|
||
|---|---|
|
||
| Recipe | `5cc6cfb49073d366` |
|
||
| Plan | `9aa8b4c29a69233a` |
|
||
| Manifest | `c87ae279b0e26f53` |
|
||
| Heightfield sample stream, 4096 points | `fae2721c052aec5c` |
|
||
|
||
The sample block reports influence Z `[-2528, -480]` voxels, maximum displacement envelope
|
||
`247` voxels, and minimum feature size `25` voxels. These prototype ranges are not the final
|
||
composer-supported recipe envelope.
|
||
|
||
### Bounds and determinism audit
|
||
|
||
The brute-force audit tested 256 randomized boxes with a 3×3×3 sample grid per box (6,912 points).
|
||
It found zero missed bounds and zero unknown bounds. Its deliberately false one-sided interval was
|
||
rejected, so the negative control passed. This is evidence for the current Heightfield2D
|
||
implementation and audit path, not a proof for future field blocks or the final cliff/overhang
|
||
composition.
|
||
|
||
The 4,096-point evaluator output hash matched at W1, W8 and W16 (`fae2721c052aec5c`). The timing
|
||
scope was point evaluation only: W1 2.059 ms, W8 6.851 ms, W16 12.626 ms. W8 and W16 were slower
|
||
on this small batch, likely from thread-startup overhead; no parallel speedup was measured. These
|
||
numbers are not a full view or tile benchmark.
|
||
|
||
### Legacy comparison and captures
|
||
|
||
For the same 4,096 points, the direct legacy density query took 62.115 ms. The prototype's mean
|
||
absolute density error was 274.0383 voxels, maximum error 841.4257 voxels, with 2,261 sign
|
||
mismatches (55.2%). The prototype is therefore not yet a parity replacement for the legacy field.
|
||
The current biome map and two-profile output need further shaping against the reference.
|
||
|
||
The small top-down pair uses the same 3200-voxel XY span and one color ramp fitted to the observed
|
||
owner and native heights together (range `[-2273.12, -1410.26]` voxels): owner `GetSurfaceHeightAt`
|
||
reference and native Heightfield2D ground height. Each JPEG is below 6 KB.
|
||
|
||
| Owner reference | Native prototype |
|
||
|---|---|
|
||
|  |  |
|
||
|
||
The pair shows a large visible mismatch; it is a height-map comparison, not an in-game render. A
|
||
separate D3D window-backbuffer capture attempt was invalid: both viewer windows reported
|
||
`DXGI_STATUS_OCCLUDED`, the saved backbuffers were black, and the native prototype produced zero
|
||
mesh vertices/indices. The reduced diagnostic images were inspected only after downscaling. Do not
|
||
use those D3D files as visual evidence.
|
||
|
||
### Query, collision and view readiness
|
||
|
||
The audit compiled a Core world around the sample heightfield, queried 45 positions through
|
||
`World::densityAt`, and compared them with direct Heightfield2D evaluation. Maximum error was zero;
|
||
the sample Core compile took 35.608 ms; no tile mesh was generated
|
||
(`render_meshes_generated=0`). This verifies the local Core field-query path without render meshes
|
||
for this sample. It does not yet verify a dedicated-server build or the Unreal adapter.
|
||
|
||
The no-manifest cave Core path also passed a constrained regression smoke on the existing
|
||
`type_3_Maze.json` fixture: the 5,642-point walkability audit passed, all 27 player-neighborhood
|
||
tiles and all 64 requested LOD0 tiles generated, and full-detail readiness was 0.157 s at W16.
|
||
The shape compile was 0.100 s. This small 64-tile LOD0 run confirms the additive no-plan path still
|
||
works; it is not the 23.085 s matched workload or the 0.785 s cave-only whole-view baseline.
|
||
|
||
Collision cooking is not available in the standalone audit and was not measured. Full-view time was
|
||
also not measured by audit mode. Earlier small-view D3D attempt timings (owner 0.236 s, native
|
||
0.309 s) are not a valid full-view comparison because presentation was occluded and the native
|
||
view had no geometry. The 23.085 s matched-workload gate remains open. The ~1.57 s aim remains
|
||
reasonable, but round 1 has no valid full-view evidence to support or reject it.
|
||
|
||
### Remaining work by round
|
||
|
||
- **Round 2:** Match the legacy reference more closely; add output-space biome blending, coast/beach,
|
||
cap detail, cliffs and bounded 3D overhang features with stable IDs and certified influence
|
||
bounds. Expand bound audits across borders, caps, negative coordinates and exceptions.
|
||
- **Round 3:** Add the finite-strate capsule route and support constraints, sweep it against the final
|
||
composed field, and reject or repair any failing automatic plan. Verify full-evaluator W1/W8/W16
|
||
hashes. Measure collision readiness separately from query and mesh readiness; demonstrate a
|
||
headless/server field query without render meshes. Keep the route valid during all automatic
|
||
changes, leave player edits unrestricted, and keep seasonal water fixed.
|
||
- **Round 4:** Wire the reviewed manifest into the season asset/content-hash path and connect Core
|
||
behind `bUseVoxelForgeCore`; prove the flag-off legacy path is unchanged. Build only the isolated
|
||
BuildHost target here. The owner builds and reviews the in-game surface and walkable route.
|
||
Re-run the matched 23.085 s workload, report full-view and local query/collision readiness
|
||
separately, and assess the ~1.57 s aim with valid captures.
|
||
|
||
### Run log
|
||
|
||
- First isolated full build compiled Core and passed the 199,209-line Core link-safety scan, then
|
||
failed at viewer link: the new inline API symbols were not emitted and the standalone build lacked
|
||
the GPU Far viewer implementation. No GPU Far source file exists in the standalone set.
|
||
- Retry adding the assumed `GpuFarViewer.cpp` failed at compile with `C1083` because that source file
|
||
is absent. The build was changed to use local CPU-viewer link stubs under ignored
|
||
`Standalone/Build/AssemblerM1/` output; Core remains GPU-free.
|
||
- The next full standalone build succeeded after moving the new API definitions out of line and
|
||
isolating the GPU viewer stubs. Another full build succeeded after adding the height-map capture;
|
||
a further build succeeded after adding manifest output; the final full rebuild after marking the
|
||
manifest API for Core export also succeeded. The latest full build succeeded after changing the
|
||
capture ramp to the observed shared height range. Each successful build took under one minute,
|
||
used `/MP16`, Normal priority and all 16 allowed CPUs; sampled compiler processes remained well
|
||
below 8 GB.
|
||
- Successful builds still print the environment's `'vswhere.exe' is not recognized` message and
|
||
existing C4838 narrowing warnings in `VoxelStrateManager.cpp:3974-3975`. These did not stop the
|
||
build. No `0xC0000142` retry occurred. A separate Git Bash `tail` inspection command failed with
|
||
access denied while opening a file; it made no changes.
|
||
- No BuildHost or owner-project build was run this round. The checked
|
||
`Saved/BuildHost/HostProject/Saved/Crashes/` folder contains one older `UECC-Windows-*` directory
|
||
from 2026-09-17; there was no new crash folder from this round.
|
||
|
||
No Unreal route or asset was changed in this round, so there is no owner rebuild handoff yet.
|