chore(meta): docs/build sweep + tooling test gate (T-1069, T-1066)
- make test-tooling: planet-gen determinism guard + import_economics
--dry-run, wired into pre-push on TOOLING_CHANGED; ruff widened to
E4/E7/E9/F/W (90 safe auto-fixes applied; E402/E702/F841 ignored with
documented counts)
- one-generator reality fixed in DEVOPS.md, asset-pipeline rule, CLAUDE.md
(import_economics sole generator since #951/D-223); dead check-protocol
target deleted; DEVOPS hook/config sections rewritten from the actual
hook sources; team-patterns gate description updated (client+tooling)
- project.yaml: 0.2.0 → 0.4.0 per the 0.{phase}.{n} scheme, description
refreshed from the v0.1 Sova narration to cascade reality
- stale comment sweep: voxel.rs stub claims (all 8 families implemented),
cascade.rs TODO recited to T-1044, main.rs D-192 handshake claim,
relationships.rs/chunk_streaming.rs version targets → phase language
- gitignore: client/settings.db* e2e-run artifacts
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -216,7 +216,7 @@ pub fn run_cascade_from_heightmap(
|
||||
// result nor the TerrainAnalysis is stored on Layer1Output, so we re-run both
|
||||
// here. Pure → determinism preserved, but the drainage re-run is NOT free at
|
||||
// the ~6 000-regions/body working scale (D-203).
|
||||
// PERF/TODO(T-1028): cache TerrainAnalysis on Layer1Output to drop this
|
||||
// PERF/TODO(T-1044): cache TerrainAnalysis on Layer1Output to drop this
|
||||
// redundant drainage pass, and validate the combined cost against the D-239 §10
|
||||
// ~45 ms/body budget in the T-1031 verification harness. This is now a LIVE
|
||||
// production cost: T-1032 wired the real body_params read, so every analyzed
|
||||
|
||||
+13
-21
@@ -38,14 +38,14 @@
|
||||
//! eviction is by generation-counter LRU (oldest entry evicted when capacity
|
||||
//! is reached). Never written to disk.
|
||||
//!
|
||||
//! ## Family dispatch (D-239 §5, T-1028)
|
||||
//! ## Family dispatch (D-239 §5, T-1028/T-1029)
|
||||
//!
|
||||
//! The 8-family tree is dispatched through `MorphologyFamily`. Only
|
||||
//! `AlluvialPlain` is implemented here (T-1028). The other 7 families are
|
||||
//! T-1029: their stubs return the AlluvialPlain output as a documented
|
||||
//! placeholder — **production will not crash on them**, but the output is not
|
||||
//! the correct final geometry for that family. The stubs are clearly marked
|
||||
//! `// T-1029 — NOT YET IMPLEMENTED` so T-1029 can find and replace them.
|
||||
//! The 8-family tree is dispatched through `MorphologyFamily`. All 8 family
|
||||
//! generators are implemented: `AlluvialPlain` (the D-239 §5 fallback) landed
|
||||
//! in T-1028; the other 7 (LavaField, FjordWall, CliffCoast, BraidedDelta,
|
||||
//! DuneStrand, IncisedGorge, MeanderReach) landed in T-1029. Flat/water zones
|
||||
//! without a dedicated family (OpenOcean, Lake, TidalFlat, Wetland) map to
|
||||
//! `AlluvialPlain` per D-239 §5.
|
||||
//!
|
||||
//! ## D-010 compliance
|
||||
//!
|
||||
@@ -249,33 +249,25 @@ pub type VoxelPos = (i32, i32);
|
||||
/// pre-computed at zone classification time (RegionProfile); the family is the
|
||||
/// structural decision that drives voxel geometry.
|
||||
///
|
||||
/// Only `AlluvialPlain` is implemented in T-1028. Other families return a
|
||||
/// documented placeholder that falls back to AlluvialPlain geometry (not
|
||||
/// `panic!` / `unimplemented!`). T-1029 replaces the stubs.
|
||||
/// All 8 families have dedicated generators: `AlluvialPlain` (T-1028, also the
|
||||
/// D-239 §5 fallback for flat/water zones) and the other 7 (T-1029).
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
enum MorphologyFamily {
|
||||
/// Lava field / shield slope. Requires TectonicClass::Volcanic (D-239 §5).
|
||||
/// T-1029 — NOT YET IMPLEMENTED: falls back to AlluvialPlain.
|
||||
LavaField,
|
||||
/// Fjord wall. Requires GlaciationGrade ≥ 2 (D-239 §5).
|
||||
/// T-1029 — NOT YET IMPLEMENTED: falls back to AlluvialPlain.
|
||||
FjordWall,
|
||||
/// Cliff coast. High slope + coastal (D-239 §5).
|
||||
/// T-1029 — NOT YET IMPLEMENTED: falls back to AlluvialPlain.
|
||||
CliffCoast,
|
||||
/// Braided delta. Very flat + low elevation + coastal (D-239 §5).
|
||||
/// T-1029 — NOT YET IMPLEMENTED: falls back to AlluvialPlain.
|
||||
BraidedDelta,
|
||||
/// Dune strand. Low slope + coastal + arid (D-239 §5).
|
||||
/// T-1029 — NOT YET IMPLEMENTED: falls back to AlluvialPlain.
|
||||
DuneStrand,
|
||||
/// Incised gorge / mountain pass. High slope + inland + high elev (D-239 §5).
|
||||
/// T-1029 — NOT YET IMPLEMENTED: falls back to AlluvialPlain.
|
||||
IncisedGorge,
|
||||
/// Meander reach. Gentle slope + water presence (D-239 §5).
|
||||
/// T-1029 — NOT YET IMPLEMENTED: falls back to AlluvialPlain.
|
||||
MeanderReach,
|
||||
/// Alluvial plain — fallback (D-239 §5). **IMPLEMENTED** in T-1028.
|
||||
/// Alluvial plain — the D-239 §5 fallback family (T-1028).
|
||||
AlluvialPlain,
|
||||
}
|
||||
|
||||
@@ -301,8 +293,8 @@ fn zone_to_family(zone: &MorphologyZone) -> MorphologyFamily {
|
||||
MorphologyFamily::IncisedGorge
|
||||
}
|
||||
MorphologyZone::MeanderReach | MorphologyZone::RiverBank => MorphologyFamily::MeanderReach,
|
||||
// AlluvialPlain fallback covers: AlluvialPlain, OpenOcean, Lake, TidalFlat,
|
||||
// Wetland — any zone without a fully-implemented T-1029 generator.
|
||||
// AlluvialPlain fallback covers the flat/water zones without a dedicated
|
||||
// family: AlluvialPlain, OpenOcean, Lake, TidalFlat, Wetland (D-239 §5).
|
||||
MorphologyZone::AlluvialPlain
|
||||
| MorphologyZone::OpenOcean
|
||||
| MorphologyZone::Lake
|
||||
@@ -401,7 +393,7 @@ pub fn derive_voxel_column(
|
||||
// AlluvialPlain generator (T-1028, D-239 §5 fallback)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// AlluvialPlain voxel generator — the only fully implemented family in T-1028.
|
||||
/// AlluvialPlain voxel generator — the D-239 §5 fallback family (T-1028).
|
||||
///
|
||||
/// Flat floodplain with:
|
||||
/// - `Soil` terrain material (D-239 §8 Soil law: rolling/floodplain)
|
||||
|
||||
+2
-1
@@ -124,7 +124,8 @@ fn main() {
|
||||
tracing::info!("Client connected, sending protocol handshake");
|
||||
|
||||
// Protocol handshake: first framed message on the wire (#555).
|
||||
// Client reads this and validates protocol_version before sending any input.
|
||||
// Carries no version field (D-192 dropped the PROTOCOL_VERSION lockstep);
|
||||
// the client reads it and replies with its StartupMessage.
|
||||
use settled_reach_server::bridge::SimBridge;
|
||||
bridge.send_handshake().unwrap_or_else(|e| {
|
||||
tracing::error!("Failed to send handshake: {}", e);
|
||||
|
||||
@@ -89,8 +89,9 @@ pub struct RelationshipEdge {
|
||||
/// BTreeMap<(subject, target), edge> for deterministic iteration (D-010).
|
||||
/// Directed graph: edge (A, B) represents how A feels about B.
|
||||
///
|
||||
/// TODO(v0.2): RelationshipGraph is per-world. Multiplayer needs per-observer
|
||||
/// relationship views (D-010).
|
||||
/// TODO(post-Phase-6): RelationshipGraph is per-world. Multiplayer — if it ever
|
||||
/// lands, it is beyond the D-166 cascade — needs per-observer relationship
|
||||
/// views (D-010).
|
||||
#[derive(Resource, Debug, Clone, Default, Serialize, Deserialize)]
|
||||
pub struct RelationshipGraph {
|
||||
edges: BTreeMap<(StableId, StableId), RelationshipEdge>,
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
//! Chunk streaming system (#578, D-012).
|
||||
//!
|
||||
//! Loads chunks near the player and unloads distant chunks based on a
|
||||
//! configurable radius. For v0.1 the radius covers the entire hand-authored
|
||||
//! configurable radius. Until Phase 5 the radius covers the entire hand-authored
|
||||
//! district (256×256 visual tiles = 8×8 chunks of 32 tiles), so all chunks
|
||||
//! remain loaded. The architecture supports future per-demand loading (v0.3+).
|
||||
//! remain loaded. The architecture supports per-demand loading over the
|
||||
//! generated world once player control lands (Phase 5).
|
||||
//!
|
||||
//! The system runs on a configurable tick cadence (default: every 10 ticks).
|
||||
//! It queries the player's TilePosition, computes which chunks should be
|
||||
@@ -17,8 +18,9 @@ use crate::simulation::time::SimulationTime;
|
||||
|
||||
/// How many chunks around the player to keep loaded (Chebyshev distance).
|
||||
///
|
||||
/// Default: 8, which covers the full v0.1 district (256×256 = 8×8 chunks).
|
||||
/// For v0.3+ borderless generation, set to 3-4 for memory-bounded streaming.
|
||||
/// Default: 8, which covers the full hand-authored district (256×256 = 8×8
|
||||
/// chunks). For Phase 5 borderless streaming over the generated world, set to
|
||||
/// 3-4 for memory-bounded loading.
|
||||
#[derive(Resource, Debug, Clone)]
|
||||
pub struct ChunkLoadRadius {
|
||||
pub radius: i32,
|
||||
|
||||
Reference in New Issue
Block a user