feat(composer): Tier 4c -- a season that can actually ship, with a veto page

The composer could invent, measure and show strates. What did not exist was
an ARTEFACT a season could ship. Now it does.

VF_ComposeSeason: generate N candidates -> measure -> reject failures ->
select a descent sequence -> emit a JSON manifest + a review page.

⭐ THE PROPERTY THAT MATTERS: round-trip bit-identity. The manifest was
loaded, every selected stack rebuilt, and 393,216 density samples compared
BIT-IDENTICALLY. Re-composing the same seed yields byte-identical JSON.
A manifest that cannot reproduce its own world is worthless, and that is
the one thing that could not be assumed. Floats serialise as readable
values PLUS exact IEEE bits, so a season survives a text round trip.

Test season: 24 generated, 19 survived the hard gates, 6 selected.
18 not selected -- 4 vacuous, 1 primordial-law failure, 13 policy
non-selections. 4 grounded, 2 outliers. EVERY selected slot passes the
primordial law, asserted per slot rather than sampled.

Selection policy is explicit, named and PROVISIONAL, because Jahni has not
defined "good" yet and said so: "it'll be easier once i'm able to see the
strates candidates." So no quality score was invented and presented as
settled. The knobs are 75/25 grounded-to-outlier (outlier axis = distance
from corpus centroid), adjacent-similarity threshold .20 with penalty 1.0,
new-archetype bonus .10, new-recipe bonus .05, boss cadence every 5th
non-terminal slot. All of them are his to turn.

The veto is a review page in DESCENT ORDER -- the season read top to bottom
the way it is played, not the survivor/outlier ordering the candidate sheet
uses. Reuses VoxelStratePreview rather than a second renderer.

  Saved/VoxelForge/SeasonTest/season_0000_seed_9320/season_manifest.json
  .../review/index.html

⚠️ FIVE GAPS CODEX RAISED, recorded not buried:
1. §4's Tier A is strates PLUS passages; only the strate spine is persisted.
   Manager-generated passage geometry and content placement are not.
2. Authored fixed strates keep scalar vectors + asset paths, not every
   asset-level passage/biome/disturbance/content field.
3. Boss slots are MARKERS, not arena or content guarantees.
4. WorldRadiusVoxels == 0 is enforced as specced but contradicts a
   production bounded world -- Jahni's call, still unset by design.
5. Bit identity is proven for the same build and platform. A frozen season
   spanning engine versions needs an explicit schema contract. Real risk,
   since seasons freeze generation for months.

Build clean, 28 succeeded / 0 failed, verified by me.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJiTcTSDNkKBtnNdiBtdaU
This commit is contained in:
Fr0zkaandClaude Opus 5 committed 2026-09-05 02:55:50 +02:00
1 parent 0b3ec18b43
commit 42e1f0ec8c
8 files changed
+3351 -5

No files matched your search

+88 -4
View File
@@ -89,6 +89,64 @@ normal game path.** The editor-only PIE inspection button described below is a d
exception: it overlays one already-built slot so the owner can walk a measured candidate; it is not
cooked, does not compose a season, and is cleared by RebuildStrates.
**Tier 4c is now the build-box seam:** `VF_ComposeSeason(SeasonSeed, Settings)` generates a bounded
candidate batch, measures every candidate, rejects vacuous/fragmented/primordial-law failures, and
writes the selected Tier A spine as diffable `season_manifest.json`. The default test budget is 24
candidates at measurement step 8 and a six-slot output; production can raise the candidate count for
the overnight budget without changing the runtime contract. The manifest stores each selected seed,
recipe, complete native parameter-family vector, archetype, bounds, measured metrics, and gate facts.
Floating-point fields carry both a readable value and their exact IEEE-754 bit pattern, so a loader can
rebuild the same stack and the season test can assert bit-identical density rather than assume it.
The selected-only review page is a descent-ordered `VoxelStratePreview` contact sheet. Each card shows
the depth, recipe, metrics, grounded/outlier/fixed selection reason, and boss-slot marker. Selection is
deliberately provisional: the current readable policy reserves 75% grounded and 25% outlier slots,
penalises near-identical neighbours, rewards new archetypes/recipes, and respects fixed absolute slots.
Jahni's preview and veto remain the decision that turns this artifact into a published season. The
composer and review writer are editor/build-box code only; no normal runtime generation path calls
them, and `WorldRadiusVoxels` remains 0.
An abbreviated manifest shape is:
```json
{
"format": "VoxelForgeSeasonManifest",
"schema_version": 1,
"season": 0,
"seed": 9320,
"candidate_count": 24,
"survivor_count": 19,
"selected_count": 6,
"strates": [
{
"depth_index": 0,
"seed": 123,
"archetype": "Maze",
"uses_recipe": true,
"recipe": {
"root_polarity": 0,
"root": { "op_class": 0, "param_block": 3 },
"shape_source": { "op_class": 3, "param_block": 3 },
"conversion": { "op_class": 8, "param_block": 3 },
"structural_param_block": 3,
"modifiers": []
},
"parameters": { "maze": { "LatticeSpacing": { "value": 18.0, "bits": "0x41900000" } } },
"measured_metrics": {
"air_fraction": { "kind": "float", "value": 0.5, "bits": "0x3F000000" },
"largest_component_share": { "kind": "float", "value": 0.9, "bits": "0x3F666666" }
},
"selection_reason": "grounded; provisional 75/25 policy",
"boss_slot": false
}
]
}
```
The real file is complete; the sample is intentionally abbreviated. `FVoxelSeasonFixedStrate` also
allows a build invocation to provide a full recipe/vector for an absolute slot, while entries adapted
from today's authored `FixedStrates` retain their native vector and source asset path.
### 3.2 Structure: how a stack gets assembled
The current shipping builders, for reference (structural posts included; TunnelNetwork's builder is
@@ -759,8 +817,15 @@ reviewable outlier quota instead of assuming survivor promotion preserves surpri
### ⭐ It is TWO things, not one
**Tier A — the SPINE. Finite, tiny, actually stored.** Strate slots and passages. ~30 strates plus a few
passages each is roughly 100 entries — kilobytes. **This already exists** as `StrateLayout` plus the
passage list, computed once in `UVoxelStrateManager::Initialize`.
passages each is roughly 100 entries — kilobytes. The runtime manager already computes `StrateLayout`
and its passage list once in `UVoxelStrateManager::Initialize`; Tier 4c now adds the first reviewable
serialized Tier A artifact, `season_manifest.json`, containing the selected ordered strate spine and
the data required to reproduce each selected density field exactly.
The current Tier 4c manifest deliberately serializes the chosen strates, not the manager's generated
inter-strate passage geometry or the full material/creature/content placement payload. The season test
therefore proves each stored strate's density round trip; passage serialization and the wider content
manifest remain a follow-up before this file can be called the complete world manifest described here.
**Tier B — the FIELD. Effectively unbounded in XY, therefore NEVER stored.** Landmarks, rooms, material
deposits, build sites. It is a **function**: give it a region, it enumerates what is there.
@@ -1038,8 +1103,16 @@ roughness and should stay late in the stack.
violations, plus 64 rendered preview pairs and an index.html contact sheet. The fine survivor ROI
is centred on `LargestComponentPoint` and labelled largest open space; the final before/after
blank-plan count is 6/42 → 3/42.
- ⬜ Reject-and-resample driven by Tier 2 (§3.5) · the **offline season pipeline** with Jahni's review
and veto (§3.1).
- ✅ **Season pipeline (§3.1, §3.5, §4, Tier 4c)** — `VF_ComposeSeason` generates and measures a
bounded candidate batch, rejects vacuous/fragmented/primordial-law failures, and writes a Tier A
JSON spine plus a selected-only descent review page using `VoxelStratePreview`. The explicit policy
is provisional: default 75% grounded / 25% outlier, adjacent-similarity penalty, archetype/recipe
variety bonuses, and fixed absolute slots with boss markers every five non-terminal slots. The
focused artifact run was **24 generated / 19 hard-gate survivors / 6 selected / 18 rejected or
unselected**: 4 vacuous, 1 primordial-law budget failure, and 13 policy-not-selected. The loader
rebuild test compared **393,216 density samples bit-identically**, and the same seed emitted
byte-identical JSON. This closes the offline artifact and veto seam; full passage/content manifest
serialization is still open as noted in §4.
### Tier 5 — the long game
- ✅ **Promotion** (good strates rejoin the corpus) — JSON promotable records and season manifests,
@@ -1145,6 +1218,17 @@ in §3.3. The StructureRoll preview measured fine blank plan/card counts **6/42
42 fine filled pairs plus 42 contour pairs with 0 refusals. No existing generation/equivalence test
failed.
**2026-09-05 — Tier 4c season validation.** The specified UE 5.7 `VoxelMEditor Win64 Development`
build succeeded after adding the season manifest and review seam. The focused
`VoxelForge.Composer.Season` test passed, then the full headless `VoxelForge` namespace reported
**28 succeeded, 0 failed, 0 not run, 0 succeeded-with-warnings**. The season artifact used 24
generated candidates, 19 hard-gate survivors, and selected 6; it recorded 4 vacuous rejections, 1
primordial-law budget rejection, and 13 provisional-policy non-selections. Reloading the JSON and
rebuilding every selected stack compared **393,216 density samples bit-identically**; composing the
same seed twice emitted byte-identical JSON. The selected-only descent review was written beside the
manifest. The run also kept all existing equivalence, determinism, box-verdict, and connectivity
tests green.
---
## 11. Tier 1 status — passages aim at real open space (bounded full-point query; build not run)