Commit Graph
2608 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Fable 5 b56f6b0bc8 fix(ui): T-1140 overlay bar wraps instead of overflowing; strip dev ids from tooltips
Jeroen's first make atlas hands-on: 17 overlay chips in a single
HBoxContainer row ran off the right screen edge (positioning also
guessed the bar's width with a 520px fallback). The bar is now an
HFlowContainer with ALIGNMENT_END; the viewer gives it everything
right of the header (OVERLAY_BAR_HEADER_RESERVE) and rows wrap
right-aligned — verified via live capture, all 18 chips visible.

OVERLAY_DEFS tooltips leaked dev provenance into player-facing text —
ticket ids (#960, T-960, T-1046, T-1118, T-1119) and decision ids
(D-181, D-226, D-243) mean nothing in-game. Stripped to plain
language; the visibility-ladder semantics (public signal / observable
/ needs corporate contact / needs insider access) stay.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 08:59:08 +02:00
jpmschweitzerandClaude Fable 5 9d2e9a4cf1 chore(meta): close Atlas depth batch — T-1124/T-1118/T-1119 done (PR #185 merged, triple review incl. Troblum adversarial pass); D-226 synced; T-1137 now unblocked
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 12:48:34 +02:00
jpmschweitzer 37c776703e Merge remote-tracking branch 'origin/atlas-depth' 2026-07-18 12:46:59 +02:00
jpmschweitzerandClaude Fable 5 c20c175af1 docs(meta): D-226 T-1124 amendment — PR #185 Troblum findings (windowed-family ceiling, queue-based serving, comment reconciliation)
All five findings applied, none touching the option-(c) carrier choice:
(1) SS2 gains a binding windowed-family ceiling — exactly ONE
windowed-query field; a second windowed query is a dedicated response
message by rule (two concurrent windowed payloads would need the
per-field request-correlation that IS the tagged framing — that is the
trigger to build it); symmetric with the request side's five-hard cap.
(2) SS1 gains a binding serving model — window derives ride the same
Rayon queue + Pending pattern as whole-body cache misses, never inline
in the PreInput drain (which the codebase deliberately keeps expensive
work off); per-connection coalescing recommended; SS4's 7/29ms figures
reframed as worker latency, not tick-thread cost. (3) The
layer_proxy.rs growth-ceiling comment (comment-only diff) now records
the T-1124 ruling as RESOLVED — scoped to the dense whole-body family,
district_window outside it, second windowed field = dedicated-message
migration — instead of deferring to an open design question. (4) SS2
documents that body scoping rides the enclosing AtlasLayerResponse
envelope (cache key body_id+center+n; echo disambiguates within-body).
(5) SS5 entry clarified: zoom threshold alone triggers the swap
(works over open ocean), first window centers on the pan-center's
derived DistrictPos; downstream settlement-anchoring phrasing
reconciled.

pql decisions validate clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 12:44:35 +02:00
jpmschweitzerandClaude Fable 5 f2b9cdb2b2 chore(meta): T-1137 — queue-based window serving + windowed-family ceiling (PR #185 Troblum findings)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 12:38:37 +02:00
jpmschweitzerandClaude Fable 5 29259e4b64 chore(meta): T-1124/T-1118/T-1119 to review — PR #185 up (Atlas depth batch)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 12:30:30 +02:00
jpmschweitzerandClaude Fable 5 05c3f8b894 chore(meta): file T-1139 — msgpack Vec-u8 decode gap (T-1118/T-1119 finding, maintenance)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 12:26:14 +02:00
jpmschweitzerandClaude Fable 5 e41cca2ded feat(ui): T-1118 climate overlay + T-1119 quarter glyphs — client halves, with file-size extractions
T-1118: gen_region_grid overlay (label TMP) — _draw_gen_region_grid
copies _draw_gen_district's self-contained mapping (dims from the
layer dict); mean-temp cold-to-hot ramp over -50..+50 C;
REGION_TEMP_NONE_DC airless sentinel = skip-cell (undrawn, never an
invented color); legend entry.

T-1119 (touch points 3-6): quarter_footprints protocol passthrough;
gen_l4_quarters overlay (label QTR) — density-scaled glyph anchored
on the L3 settlement dot joined by city_id, shape = dominant district
type (corner-tab/diamond marks for Commercial/Industrial/
Administrative), color = density ramp on the settlement-gold family,
zoom-gated at SETTLEMENT_LABEL_MIN_ZOOM; landmark/corridor counts
never drawn (D-226(d) tooltip-only ceiling); legend entry.

Structure: atlas_viewer.gd and protocol.gd were over gdlint's
1000-line cap before this batch; cleanly-separable responsibilities
extracted on existing precedent — atlas_generation_state.gd (per-layer
data + accessors), atlas_generation_proxy.gd (polling/retry/pending
machinery), atlas_overlay_colors.gd (pure ramp/shape lookups),
atlas_map_protocol.gd (atlas/starmap/citynames codec, the
browse_protocol.gd delegate pattern). Public APIs preserved exactly;
_gen_state stays a field default (RefCounted, pre-_ready safe) because
_ready()-construction breaks every bare AtlasViewer.new() test —
documented inline.

Tests: registration + round-trip for both overlays; pure-function
suites for the temp ramp (endpoints/midpoint/clamp/sentinel) and
quarter glyph (scaling, zoom gate, ramp, notch across all 9
DistrictTypes); Tier-2 replay asserts exact literals from the real
server-generated fixture incl. the airless sentinel. Color.lerp(a,b,
1.0) is not bit-exact to b — endpoint assertions use per-component
is_equal_approx. Full suite 3094/3094; gdlint zero warnings incl. the
two previously-over-cap files. Live capture: legend grows to 7
sections, TMP/QTR toggles clean against a live server.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 12:25:47 +02:00
jpmschweitzerandClaude Fable 5 8165c61186 feat(simulation): T-1119 QuarterFootprintLayer — server half (touch points 1-2) + populated wire fixtures
ZoningType gains PartialOrd/Ord (DistrictType T-994 mirror) for the
dominant_zoning declaration-order tie-break. layer_proxy:
QuarterFootprintEntry/QuarterFootprintLayer (BTreeMap keyed by
city_id; density_avg_pct floor-mean, dominant_* mode with
declaration-order tie-break, landmark/corridor counts) +
build_quarter_footprint_layer gated None on empty state.quarters;
sixth AtlasLayerResponse field wired into all construction sites;
growth-ceiling doc updated to say the whole-body budget is consumed
(what carries a seventh is T-1124's design, resolved in the same
branch's amendment). Placements whose derived Layer4Quarter id is not
yet in state.quarters are SKIPPED (skeleton gen is async Low-priority
— entries may be a proper subset; client decodes defensively). Stale
TODO(#957) removed (premise predates T-957 landing).

Tie-break bug caught by its own test: Iterator::max_by_key over a
BTreeMap returns the LAST max on ties — backwards from
declaration-order-first; replaced with an explicit forward walk that
replaces only on strictly-greater count.

gen_fixtures: populated RegionGridLayer (T-1118 replay coverage) +
QuarterFootprintLayer literals in the ready fixture; msgpack fixtures
regenerated via make fixtures. Note: landmark_count is inert on real
data today (BlockSkeleton.landmark hardcoded None until landmark
placement lands); fixtures use non-zero counts to exercise the logic.

5 new unit tests + populated round-trip; atlas:: 549 green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 12:03:28 +02:00
jpmschweitzerandClaude Fable 5 3f7851895c chore(meta): file T-1137/T-1138 — regional-map wiring follow-ups from the T-1124 design (blocked on batch merge; zoom-headroom note on T-1138)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 12:02:53 +02:00
jpmschweitzerandClaude Fable 5 67bd0ec294 docs(meta): D-226 T-1124 amendment — windowed district-resolution regional map design (T-1124)
Five sections, Tyre data shape + Araminta screen/encoding (T-1112
pattern): (1) request = serde-default window_center/window_n ON
AtlasLayerRequest (five-shape demux cap honored); (2) response carrier
RULING — district_window is a windowed viewport query keyed
(body, center, n) with echoed-center staleness guard, deliberately
OUTSIDE the dense whole-body layer family whose growth ceiling is
re-scoped (not busted) to that family; (3) six per-cell fields incl.
glaciation_grade (T-1127 deferral accepted) and Marine-exhaustive
vegetation; (4) binding budget — 7 bytes/cell, MAX_N=64 (~28 KiB),
DEFAULT_N=32, temp shares the T-1118 region-ramp colorizer across zoom
levels (D-243 continuity), pan-only re-request (zoom never refetches),
D-227-determinism client cache; (5) screen — zoom-threshold LOD swap
in the existing AtlasViewer, morphology base with elev_q lightness,
gen_dw_* toggles, glaciation as always-on tint modifier, Marine
transparent, implant chrome discipline.

Validated via pql decisions validate. Implementation is follow-up
ticket scope (server wiring must resolve the named TerrainAnalysis
transience decision; client screen).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 12:01:05 +02:00
jpmschweitzerandClaude Fable 5 05b2b7aff1 chore(meta): activate Atlas depth batch — T-1124/T-1118/T-1119 in progress with Si refinements + lead rulings (request-cap closed, response-budget fork to design pass)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 11:47:18 +02:00
jpmschweitzerandClaude Fable 5 8c7a0d6f3d chore(meta): close companion wave 2 — T-1131/T-1133 done (PR #184 merged, both reviewers approved; demux ceiling ruling recorded in bridge doc)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 10:57:23 +02:00
jpmschweitzer 7d310997af Merge remote-tracking branch 'origin/atlas-companion-browser' 2026-07-17 10:55:56 +02:00
jpmschweitzerandClaude Fable 5 132915a4e5 test(engine): browse-inclusive union-frame rejection cases (PR #184 review)
Hoshe's finding: the H1 union-rejection mechanism correctly counts the
new browse discriminator, but ambiguous_union_frame_is_rejected was
carried over from PR #176 without a browse-inclusive case — a future
demux/ShapeProbe refactor could drop the fifth shape from the union
check with nothing to catch it. Adds browse+star_map and
browse+city_names union frames, both asserting rejection.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 10:53:36 +02:00
jpmschweitzerandClaude Fable 5 51b6147037 chore(meta): T-1131/T-1133 to review — PR #184 up (companion wave 2)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 10:44:57 +02:00
jpmschweitzerandClaude Fable 5 7111cea549 fix(engine): clippy items_after_test_module — tests mod to end of main.rs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 10:42:06 +02:00
jpmschweitzerandClaude Fable 5 2509624577 fix(engine): resolve systems.db exe-anchored, not cwd-relative — spawn-mode DB access
PathBuf::from("data/systems.db") was cwd-relative, and a spawned
server inherits GODOT's cwd — which is client/ (Godot's --path client
chdirs), so CultureResolver, CityContextReader, BodySourceResolver and
BrowseReader all silently failed in every make atlas / make game
spawn. Wave 1 masked it: the star map serves from star_map_data.json,
so 'renders 301 systems' never touched the DB; T-1133's browser was
the first DB-backed consumer to hit it live (Stig, /proc/PID/cwd).

resolve_systems_db_path(): exe-anchored <exe_dir>/../../data/systems.db
first (cwd-independent — the actual fix), then cwd-relative
data/systems.db (cd server && cargo run), then server/data/systems.db
(repo-root invocations); first existing candidate wins, info-logged.
Pure systems_db_candidates() split out as the testable seam (5 unit
tests — incl. pinning Path::parent() of a bare filename = Some(""),
not None). world_root now derives from the resolved ABSOLUTE path so
its ancestors().nth(3) arithmetic holds unconditionally instead of
silently falling back to ".." when canonicalize failed.

Verified all three launch styles; make atlas spawn shows 5 reader fds
open on server/data/systems.db via /proc/PID/fd.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 10:37:15 +02:00
jpmschweitzerandClaude Fable 5 90c562a6a3 feat(ui): T-1133 data browser — implant/browser app, six index+detail screens (D-254 SS4)
New implant app (app_path implant/browser, key B, fullscreen), sibling
to the Atlas per Jeroen's IA ruling: kind picker -> generic filterable
index (live search-mode typing) -> generic detail, parameterized per
kind, composed entirely from D-169 components. available_in_companion
left unset (default true) — the app appears in the companion shell
automatically via the generic-host seam, zero companion-side wiring.

browser_adapter.gd is the sole home of literal wire field names: maps
Oscar's BrowseResponse contract ({id, primary, secondary} index rows;
BrowseDetail enum-as-single-key-map) to view models for all six kinds,
folding join partners (system economy/factions/culture, corporation
presence, commodity production chains with nested Leontief inputs).
browse_protocol.gd split out of protocol.gd (max-file-lines);
sim_bridge gains browse_response_received + request_browse_index/detail.

Live-data catch: a present-but-NULL key (unnamed asteroid belt
proper_name) bypasses Dictionary.get fallbacks and rendered '<null>' —
_display_or() null-vs-absent helper applied across all six detail
mappers, 4 regression tests distinct from the absent-key cases.

43 gdUnit adapter cases; full suite 3074 green. Live-verified against
a real server + real systems.db: all six kinds Ready with real row
counts (301/3240/466/165/36/28), detail drill-down, NotFound on bogus
ids. Spawn-mode DB resolution issue found during verification is
pre-existing (cwd-relative data/systems.db) — server-side fix follows
separately.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 10:24:39 +02:00
jpmschweitzerandClaude Fable 5 d48d72fd31 feat(engine): T-1131 browse data proxy — six entity kinds, index+detail, one wire envelope (D-254 SS4)
browse_reader.rs: BrowseReader on the CityContextReader::open() pattern
— six index + six detail reads against systems.db (bodies filterable by
containing system; system/corporation/commodity details fold their join
partners). browse_proxy.rs: BrowseRequest{browse, kind, query} /
BrowseResponse{kind, status, index, detail} wire types + dispatcher;
BrowseIndexRow{id, primary, secondary} generic across kinds;
BrowseDetail a per-kind enum of field-exhaustive structs.

Demux: Inbound::BrowseRequest is the FIFTH map shape — deliberately the
last; the doc's four-shape ceiling is re-pinned at five with rationale
(six kinds x two forms folded into ONE envelope whose internal enums
pick sub-behavior, the AtlasLayerRequest.up_to precedent, instead of
twelve top-level shapes) and a hard rule that a sixth shape must
migrate to the D-225 tagged-envelope framing. Served for BOTH roles,
connection-tagged 1:1 in-order like atlas/starmap/citynames.
serve_browse_requests pub so integration tests drive the true
end-to-end pipeline. Wire-only per D-254 (T-949 precedent); v1
exclusions (cascade geometry, event logs) respected.

30 unit tests + 7 bridge_tcp integration tests (six-kind round-trip
over real TCP, reader-can-browse, no crossed responses between two
readers, unknown-id NotFound, empty-table Ready); 2 pre-existing tests
updated for the new receive_bridge_inputs parameter.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 10:01:21 +02:00
jpmschweitzerandClaude Fable 5 a346410832 chore(meta): activate companion wave 2 — T-1131/T-1133 in progress (atlas-companion-browser worktree; Oscar proxy + Stig browser UI)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 09:37:41 +02:00
jpmschweitzerandClaude Fable 5 edde411fb6 chore(meta): close companion wave 1 — T-1129/T-1130/T-1132 done (PR #183 merged); D-254 synced
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 09:33:54 +02:00
jpmschweitzer a334c7c237 Merge remote-tracking branch 'origin/atlas-companion-app' 2026-07-17 09:32:07 +02:00
jpmschweitzerandClaude Fable 5 9b5c113961 fix(client): defer companion close-interceptor re-open out of the app_changed emit (PR #183 review)
Tyre's finding: _on_hud_app_changed ran open_app synchronously from
INSIDE close_app's app_changed emit; close_app continues past the emit
and resets _active_app, clobbering the re-open — Atlas left visible
(z already raised) but is_app_active() false, so atlas_app's input
guard rejects every key: keyboard soft-lock after one M/Escape on the
reach screen. Fix: open_app.call_deferred, out of the signal frame.

Two regression tests pin the contract at the HudGroups level (no
server needed): the synchronous shape must keep getting clobbered and
the deferred shape must survive — if HudGroups emit semantics ever
change, both flag the contract shift for a deliberate look.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 09:29:29 +02:00
jpmschweitzerandClaude Fable 5 7baac29861 chore(meta): T-1129/T-1130/T-1132 to review — PR #183 up (companion wave 1)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 09:17:46 +02:00
jpmschweitzerandClaude Fable 5 061eb642c9 fix(engine): clippy doc_lazy_continuation — PendingPoll::Failed note is its own paragraph, not a list continuation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 09:13:59 +02:00
jpmschweitzerandClaude Fable 5 6d4e03ffd5 chore(meta): file T-1136 — spawned-server orphan watchdog (T-1132 SIGTERM gap follow-up)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 09:11:20 +02:00
jpmschweitzerandClaude Fable 5 cffe760d36 feat(client): T-1132 standalone Atlas companion shell + make atlas (D-254 SS3)
New atlas_standalone scene/script: attach-or-spawn boot (one REAL
connect_to_sim attempt at SR_PORT-or-9876 — a separate throwaway TCP
probe was proven by live run to kill a pre-accept-loop server via
broken handshake pipe; never abandon a connected socket), else spawn
--port 0 via new ServerProcess.start_with_pipe + LISTENING:{port}
stdout parse, retry against the resolved port. Reader role wired end
to end: protocol.encode_startup_message optional role param (empty
omits the wire key — byte-identical for all existing callers),
sim_bridge.connection_role suppresses the post-handshake
RequestAllSettings auto-send, hud_groups skips AutoPause/AutoResume
sends for readers (all three would otherwise burn Reader violation
strikes per the T-1130 matrix — endorsed by Oscar).

Generic implant host per D-254 SS3: the shell instantiates ALL
registered implant apps; implant_app_manifest gains
available_in_companion (opt-out, default true) and
implant_registry.instantiate_all a standalone filter param (default
preserves hud.gd behavior byte-identically). Boot order is
instantiate_all THEN open_app (reverse renders a permanently black
window — app_changed fires with no listener; matches hud.gd's order).
Owned-server lifecycle: _exit_tree stops a spawned child, attached
servers survive companion close. Known engine limitation documented:
raw SIGTERM bypasses all Godot notifications and orphans a spawned
server; WM close paths verified clean.

Live-verified: spawn-mode (301 systems rendered from systems.db over
the wire), attach-mode, two simultaneous readers, clean shutdown with
zero orphan processes. 14 new gdUnit tests (port/LISTENING parsing).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 09:09:09 +02:00
jpmschweitzerandClaude Fable 5 92c455ef10 chore(meta): close seam batch — T-1125/T-1126/T-1127 done (PR #182 merged, both reviewers approved clean)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:36:36 +02:00
jpmschweitzer 370a34eb1f Merge remote-tracking branch 'origin/coastline-invention' 2026-07-17 08:33:28 +02:00
jpmschweitzerandClaude Fable 5 627e02f7ba chore(meta): file T-1135 — split character spawn out of world-setup (T-1130 follow-up)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:31:45 +02:00
jpmschweitzerandClaude Fable 5 ddc3d39d09 feat(engine): T-1130 reader connections — role-gated multi-connection bridge (D-254 SS1/SS2)
ConnectionRole (Player|Reader, serde-default Player for wire back-compat;
shaped for a future TradingReader) on StartupMessage. BridgeResource
rewritten as 0-1 Player + 0-N Readers with ConnectionId; per-tick
accept_new_connections loop replaces the single blocking accept (the
listener is cloned non-blocking into ConnectionListener). First
connection installs per startup.role — spawn-mode Readers are often the
only connection a server gets.

Permitted-message matrix: readers may handshake and issue
Atlas/StarMap/CityNames requests (responses connection-tagged, own
requests only); PlayerInput from a reader is dropped with a strike
(disconnect at 3); ObserverSnapshot has no reader-facing path at all.
Shutdown scope: only a PLAYER send failure flips ServerRunning —
reader-only servers idle with the snapshot queued; reader disconnects
never kill the session.

Deliberately out of scope, documented at the call site: character spawn
stays in monolithic world-setup (reader-first servers carry an inert
unpiloted PlayerCharacter); no total-reader-count cap (per-reader frame
cap only, loopback-only scope).

6 new bridge_tcp integration tests; layer3 subprocess test exercises the
accept-loop end to end.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:30:56 +02:00
jpmschweitzerandClaude Fable 5 e6dff2c370 chore(meta): T-1125/T-1126/T-1127 to review — PR #182 up (coastline invention seam batch)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:25:48 +02:00
jpmschweitzerandClaude Fable 5 a86dab3756 docs(meta): D-227 T-1125 invention-character amendment + D-239 T-1126 Marine amendment
D-227: records the two-tier driver model (body envelope from authored
params only, D-240 tilt exclusion upheld; position tier with fjord/
latitude/wetness/heterogeneity), the shared invent_primitives path,
the scatter floor-vs-ceiling reading, shoreline carving, and the
one-step-stale circularity ruling. D-239: Marine appended at
discriminant 6, morphology-derived verdict, airless precedence,
non-semantic Ord position.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:22:20 +02:00
jpmschweitzerandClaude Fable 5 aa1471069b test(simulation): derivation-harness call sites + believability golden regen for coastline invention
Mechanical call-site updates (7) for the invent_primitives signature;
believability golden regenerated via UPDATE_GOLDEN=1. Deltas are
deliberate: slope_q/elev_q spreads widen, vegetation_classes +1
(Marine), water-districts-wet coherence reaches 46/46 and 19/19
(T-1082 class closed — classification and coastline are the same line).
Reductions (ocean_fraction distinct, morphology_zones on GJ244Ad)
are the eager pseudo-grid point-sampling coasts honestly instead of
area-averaging them into synthetic intermediates; believability
coast-sampling resolution is Q-123 calibration territory. All 37
derivation-harness law checks unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:21:57 +02:00
jpmschweitzerandClaude Fable 5 6aafa77583 feat(simulation): T-1127 glaciation ice tint + Marine color in zoom-ladder probe
aliveness_probe --render gains a 6th glaciation panel; glaciated
districts get an ice tint keyed on GlaciationGrade, and Marine
vegetation renders [0,96,172] — distinct from the morphology water
tones so district-carrier vs voxel-generator disagreement stays
visible in ladders.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:21:27 +02:00
jpmschweitzerandClaude Fable 5 fef422bf01 feat(simulation): T-1125/T-1126 coastline invention — two-tier character model, shared invent_primitives, Marine vegetation
T-1125: new atlas/coast_invention.rs — BodyCoastEnvelope (tier 1: erosion
maturity derived hydro×atmo, tectonic energy; D-240 stands, no orbital
inputs) + coast_character_at (tier 2: latitude, glaciation fjord response,
local wetness, seeded 100-400 km heterogeneity field). C1 multi-octave
warp ~16-262 km, sub-pixel cap 0.75 px, salted stream isolated from
terrain scatter and climate edge-fuzz.

district_profile: shared invent_primitives front-half (warped envelope
sampling + slope-independent scatter floor + shoreline carving) wired
into BOTH derive_district and derive_district_profile — the batch path's
scatter-free area-mean aggregate is replaced by an invented centre-point
sample of the same continuous field, making silent path divergence
structurally impossible.

T-1126: VegetationClass::Marine appended at discriminant 6, verdict
morphology-derived (open_water from OpenOcean|Lake — no fourth ocean
threshold); airless precedence preserved. voxel.rs exhaustive-match arm
documented unreachable (WaterBody owns ocean districts).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:21:07 +02:00
jpmschweitzer d42951d43a chore(meta): record Jeroen's generic-implant-host requirement on T-1132/T-1133 (D-254 SS3 addition) 2026-07-17 08:10:53 +02:00
jpmschweitzerandClaude Fable 5 d370ca6044 docs(meta): D-254 SS3 — companion is a generic implant host; available_in_companion opt-out flag (Jeroen, mid-implementation)
Future implant apps/screens automatically extend the external app; per-app manifest bool (default true) locks out gameplay-dependent apps; in-game implant ignores the flag. Jeroen's suggested name availableInAtlasApp recorded with the rename rationale.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:10:08 +02:00
jpmschweitzer 554bba67d9 chore(meta): activate T-1130 (oscar) + T-1132 (stig) — companion-app implementation wave 1 2026-07-17 08:06:47 +02:00
jpmschweitzerandClaude Fable 5 b57805d0c6 docs(meta): D-254 — standalone Atlas companion app (make atlas, dual-connection reader) (T-1129)
Six sections: connection model (attach SR_PORT/9876 ~500ms else spawn --port 0 + LISTENING parse, auto-attach-else-spawn); Reader connection class (ConnectionRole on StartupMessage, serde-default Player; no character spawn, NO ObserverSnapshot, permitted-message matrix, drop-not-disconnect, 0-1 Player + 0-N Readers, Player-only shutdown-on-disconnect); app shell (dedicated atlas_standalone.tscn, trivial make atlas target); data browser (separate implant/browser app per Jeroen, six registry entities v1, WIRE-ONLY extending the T-949 precedent — no client SQLite); save/load seam (seed picker now, save picker slot Phase 5+); trading seam (TradingReader superset, idempotency tokens, loopback-only auth assumption recorded). Tyre (lead) + Oscar (connection sections, his activation). Validate + sync clean (388 records, 0 broken).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:05:57 +02:00
jpmschweitzer 599024f590 chore(meta): file D-254 implementation tree — T-1130 reader connection (gates all), T-1131 browse proxy, T-1132 standalone shell, T-1133 browser UI, T-1134 seed picker; Jeroen's IA + granularity rulings 2026-07-17 08:04:46 +02:00
jpmschweitzer 38b989b226 chore(skills): raise kanban WIP soft-limit 5 -> 10 (Jeroen, 2026-07-17 — sidequest track alongside the active batch) 2026-07-17 07:53:04 +02:00
jpmschweitzer 749ba49181 chore(meta): sidequest — file T-1128 companion-app epic + T-1129 design pass (D-254 claimed); activate design 2026-07-17 07:48:35 +02:00
jpmschweitzer ee0dd6df25 chore(meta): activate seam batch T-1125/T-1126/T-1127 — Jeroen's crinkle-varies rulings + Si gap resolutions; T-1126 blocked by T-1125 2026-07-17 07:39:28 +02:00
jpmschweitzer 3d73a4d221 chore(meta): close district-window batch — T-1123 done (PR #181 merged); T-1125 seam story is the recommended next batch 2026-07-16 22:37:02 +02:00
jpmschweitzer fa7db681ea Merge remote-tracking branch 'origin/district-window-render' 2026-07-16 22:36:40 +02:00
jpmschweitzer c8adc17556 chore(meta): T-1123 to review — PR #181 up 2026-07-16 22:31:40 +02:00
jpmschweitzerandClaude Fable 5 5e48c85a9a fix(simulation): move probe tests module below Args — clippy items_after_test_module
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:30:10 +02:00
jpmschweitzerandClaude Fable 5 cf6ef2bc31 feat(simulation): district-window zoom-ladder renderer — aliveness_probe --render/--window/--anchor (T-1123)
Renders true-2km district maps (derive_district per cell, NOT the coarse eager grid) as PNGs: morphology (17-zone palette transliterated from atlas_marker_overlay.gd, sync-commented), elev/temp/moisture/vegetation panels, anchor crosshair, km-honest filenames + manifest. believability.rs gains cascade_snapshot_for_body (cascade_for_body now a thin wrapper); probe re-derives the D-203-freed TerrainAnalysis via run_layer1 only under --render. Determinism proven: 5/5 panels byte-identical across passes AND cross-process (md5s reproduced in a fresh run). ~8us/district debug. First-ever look at the district layer produced the T-1125/T-1126/T-1127 findings (D-227 seam ends at ~500km; ocean-blind vegetation; unrendered glaciation).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 22:26:57 +02:00