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:
2026-06-12 16:22:55 +02:00
co-authored by Claude Fable 5
parent 0bd895fcac
commit 346d87df7a
47 changed files with 280 additions and 180 deletions
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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);
+3 -2
View File
@@ -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>,
+6 -4
View File
@@ -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,