The fresh descent ladder (first since T-1240) showed Region carrying a straight diagonal band of blocky, grid-locked stair-steps, and a scatter of stray ValleyFloor cells. D-258 (1) says a biome edge is a gradient, never a line. Two separate causes, each traced to a plane before it was fixed: 1. THE SEAM — the coast/terrain character read the CATEGORICAL glaciation grade. It flips None -> Light on the 6 C isotherm, `fjord` jumped 0 -> 0.30, and ridge, scatter floor and warp amplitude jumped with it. Dumping the Region canvas planes put the seam in relief_q itself, not the paint; zeroing that one step removed it. The character now reads a continuous `glacial_weight` — linear through the grade bands' centres, where it agrees with the old per-grade weights, and a ramped moisture gate. The grade stays the classification; only the character stopped stepping. 2. THE SPECKLE — composition's rare inclusions ignored the rung's octave cutoff. At 379 m cells the 192 m inclusion field was sampled below Nyquist: instead of vanishing (what the constant's doc promised) it aliased, a +25 slope push scattered at random, tipping 8,453 cells into slope-gated ValleyFloor. Now gated like every other invented octave: ValleyFloor at Region 8,453 -> 0, and District/Quarter captures are byte-identical, since they resolve inclusions. Region, lum p1-p99 63.45 -> 63.60 (structure kept), distinct colours 26,701 -> 2,102 (noise removed). THE CONSERVATION GATE was `#[ignore]`d and did not compare anything: its doc said it derived with and without composition, but it derived once and checked some class held >50%, which a forest patch turned wholly to scrub passes. Now every patch is derived twice through the same core (a new `invent_composition` switch on the private derive; both production paths pass true), the composed plurality must EQUAL the uncomposed one, across 13 patches spread over the body, with the judged count and "anything changed at all" asserted so it cannot pass vacuously. It runs in plain `cargo test` (~4 s debug). Mutation-proven both ways: inclusions over most ground fails it by name (Scrub 90% -> Barren 52%), composition switched off fails it on "the fine tier is off". Goldens: every window-derivation change is an inclusion that a 4,096 or 1,024 m cutoff can no longer receive (e.g. slope 27 -> 2, ValleyFloor -> AlluvialPlain); believability moved one point on two contrast figures. Version 0.4.15: derived bytes change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
123 lines
7.3 KiB
YAML
123 lines
7.3 KiB
YAML
name: The Settled Reach
|
|
# Version scheme: 0.{phase}.{n} — phase = active Development Cascade phase (D-166).
|
|
# Phase 4 (deterministic world generation) is active.
|
|
# 0.4.1-tagged step canvases carried lake_margin_q's flat absolute-ceiling
|
|
# semantics (pre-per-basin-normalization) and were written to real disk
|
|
# caches during T-1188 eyeball runs — 0.4.2 forces those entries to miss.
|
|
# 0.4.2-tagged Global/Region-rung step canvases sampled the coastline
|
|
# position raw (no coast_warp_px) — T-1160 applies the warp at orbital
|
|
# sampling, changing orbital-rung canvas bytes (elev_q/temperature_dc/
|
|
# moisture_q shift near coasts) — 0.4.3 forces those cached entries to miss.
|
|
# 0.4.3-tagged canvases predate the D-255 extent inversion (a rung now fixes
|
|
# the canvas EXTENT and the gridunit spacing falls out, rather than the
|
|
# reverse). District/Quarter/Block/Chunk kept the same 960x540 cell counts
|
|
# through that change, so their cache keys are byte-identical while a District
|
|
# canvas now covers 3.6 km of ground instead of 1,966 km — a warm cache would
|
|
# silently serve pre-inversion canvases. 0.4.4 forces those entries to miss.
|
|
# 0.4.4-tagged GLOBAL canvases are all 2x1 — `serve_step_canvas_request` was
|
|
# still zeroing Global's wire extent (a pre-extent-inversion sentinel), so
|
|
# every Global request resolved to a two-cell canvas regardless of viewport.
|
|
# Those entries were also cached under a key that ignored extent, so they
|
|
# answered every later request forever. 0.4.5 forces them to miss.
|
|
# 0.4.5-tagged canvases carry pre-T-1237 river courses: one course per D8 HOP
|
|
# rather than one per river (build_paths walks whole headwater->mouth rivers
|
|
# now). The hop-shaped entries survived that fix because it changed only server
|
|
# and client code, never this version — so Ferrath Global replayed 375 fragments
|
|
# with a 106 km longest run, all of them below D-261's read-as-a-line floor, and
|
|
# drew NOTHING, while a cold cache on the same build produced 73 whole rivers
|
|
# with a 1,644 km trunk and drew 18. Diagnosed as T-1239. 0.4.6 forces them to
|
|
# miss.
|
|
#
|
|
# THE PATTERN, now four bumps deep: a change to how a canvas is GENERATED is
|
|
# only half the change — the other half is this line. Nothing enforces the
|
|
# pairing, so a canvas-generation commit that leaves this version alone ships a
|
|
# silent regression that reproduces only on machines with a warm cache. The
|
|
# capture harness no longer hides it (tests/run-visual isolates user:// per run,
|
|
# T-1239), but a real player's cache is still governed by this number alone.
|
|
# 0.4.7 carries NO canvas-generation change — it is the gate that enforces the
|
|
# pairing described above, arriving (T-1242). tooling/canvas_sources.py lists the
|
|
# paths, tooling/check-canvas-version rejects a push that touches them without
|
|
# moving this line, and the registry includes ITSELF so that narrowing it and
|
|
# changing a canvas file in one push still demands a bump. That self-inclusion is
|
|
# why this bump exists: adding the registry trips its own rule. The version is
|
|
# spent rather than special-cased, because "this change is obviously harmless" is
|
|
# the reasoning that produced all five regressions above.
|
|
# 0.4.8 also carries NO canvas-generation change: a test-only edit to
|
|
# composition.rs (its conservation assertion was a tautology) tripped the T-1242
|
|
# gate, because that gate is path-based and cannot tell test code from generator
|
|
# code. Second no-op bump in two days — the false-positive rate is real, and is
|
|
# the price of the ruling that a false negative costs a week. Revisit if it
|
|
# becomes noise; do NOT add an override to dodge it.
|
|
# 0.4.9 is a REQUIRED bump, not a gate formality (T-1213). The disk cache stores
|
|
# the DECODED canvas, and the decode was silently dropping the `relief_q` plane —
|
|
# so every 0.4.8-and-earlier entry physically lacks the field, and would keep
|
|
# rendering the deep rungs as a flat wash even against a build that reads it.
|
|
# This is the first bump in the series where a warm cache is wrong about CONTENT
|
|
# rather than merely stale.
|
|
# 0.4.10 changes how a canvas is PAINTED, not how it is derived, so cached
|
|
# entries are still valid content — but the client step_canvas cluster is in the
|
|
# T-1242 registry and the rule is bump-when-touched, so it moves. Cheap: one
|
|
# round of misses against a map that now reads as terrain.
|
|
# 0.4.11 — per-class cover marks (copse, thicket, rocky outcrop). Paint again,
|
|
# not derivation; bumped because the client step_canvas cluster is in the T-1242
|
|
# registry.
|
|
# 0.4.12 changes DERIVED BYTES, not paint (T-1240): Region canvases now truncate
|
|
# every octave the rung cannot reconstruct, so a 0.4.11 Region entry holds a
|
|
# relief field this build would never produce. Warm caches are genuinely wrong
|
|
# here, not merely stale.
|
|
# 0.4.13 — stipple contrast (T-1194). Paint only; bumped because the client
|
|
# step_canvas cluster is in the T-1242 registry.
|
|
# 0.4.14 carries NO canvas-generation change: comment-only edits (retired tool
|
|
# paths renamed to their reach verbs, T-1289/T-1253) touched
|
|
# server/src/atlas/trait_catalog_reader.rs, canvas_sources.py itself, and two
|
|
# client files in the registry. Path-based gate, spent rather than dodged.
|
|
# 0.4.15 changes DERIVED BYTES (T-1213): the coast/terrain character reads a
|
|
# continuous glacial weight instead of the categorical grade, removing a seam
|
|
# the None->Light isotherm cut through the relief field; and the composition
|
|
# tier's rare inclusions now honour the rung's octave cutoff, so Region no
|
|
# longer carries aliased ValleyFloor speckle. Warm caches are genuinely wrong.
|
|
version: 0.4.15
|
|
repository: settled-reach
|
|
|
|
|
|
description: >
|
|
Top-down life-sim set in an original science fiction universe. Asymmetric
|
|
information and occlusion-based perception from a single-character
|
|
perspective, with a Rimworld-style storyteller. Systems interactions like
|
|
The Sims, combat and visuals like single-character Rimworld, world
|
|
generation inheriting from Dwarf Fortress and NMS, economy inspired by
|
|
X4/EVE. Every system is interactable but ignorable — the world is alive
|
|
for any given run.
|
|
|
|
setting: >
|
|
The Settled Reach — a network of star systems connected by Founder Gates.
|
|
Neural lattice technology enables soft immortality, forking, and
|
|
re-embodiment.
|
|
|
|
development: >
|
|
Built outside-in along the six-phase Development Cascade (D-166): wiki
|
|
content and star map, economics layer, planetary maps and atlas,
|
|
deterministic world generation (active), player control and in-world
|
|
rendering, room-level detail.
|
|
|
|
architecture:
|
|
client: Godot 4 (GDScript)
|
|
server: Rust with bevy_ecs (simulation server)
|
|
transport: subprocess/IPC via TCP with MessagePack serialization
|
|
protocol: length-prefixed MessagePack frames (4-byte big-endian)
|
|
determinism: ChaCha20 seeded RNG, deterministic tick processing
|
|
|
|
simulation:
|
|
tick_rate: 10 ticks per game-minute
|
|
time_model: 4 day phases (Morning, Afternoon, Evening, Night)
|
|
grid: dual-scale (0.5m simulation tiles, 1m visual tiles)
|
|
visibility: symmetric shadowcasting + forward/peripheral/blind vision cone
|
|
knowledge: per-entity knowledge graphs with confidence decay
|
|
|
|
content:
|
|
format: YAML with JSON Schema validation
|
|
structure: campaigns/systems/stations/districts hierarchy
|
|
npcs: 10-axis model (7 essential + 3 supporting) with CombatCapability
|
|
dialogue: tagged line pools with 4-layer relational filtering
|
|
population: 30% flat / 50% mundane triangles / 20% intrigue-entangled
|