Files
settled-reach/CHANGELOG.md
T
2026-02-16 01:08:17 +01:00

47 KiB
Raw Blame History

Changelog

All notable changes to The Settled Reach project will be documented in this file.

Format based on Keep a Changelog.

[Unreleased]

Added

  • Archetype evidence presentation spec (#443, D-065/D-034/D-033) — detective case file vs smuggler notebook design document: item definitions, knowledge graph presentation, contradiction markers, THE FRIEND arc walkthroughs, systems interaction map, authoring guidelines
  • Cognitive delay system (#423, D-060) — CognitiveDelay component buffers perception events before emitting KnowledgeEvents (0.6s base / 0.3s urgent at 10 tps), pending_recognitions in ObserverSnapshot v7 for client fog entity visualization, cancellation on entity LOS exit
  • ListeningFocus eavesdrop system (#426, D-053) — stationary_ticks tracking for eavesdrop positioning bonus, 30-tick threshold (20 for Careful stance), Sprint blocks accumulation, registered after validate_movement
  • YAML content loader with hot-reload (#326, D-028) — LinePool system parsing dialogue/monologue YAML into BTreeMap-indexed pools, 4-layer query filtering (access > situation > trust > topic+mood), timestamp-polling hot-reload (dev-only), graceful failure preserves previous content
  • Line pool format specification (#308) — formal spec at docs/architecture/line-pool-format.md defining YAML structure, tag enums, 4-layer filtering pipeline, prerequisite-to-KG mapping, ID format, and Rust loader interface
  • InteractionMemory KG schema design (#442, D-064) — design doc at docs/architecture/interaction-memory-schema.md extending FactKnowledge with interaction tracking, 5-state InteractionState enum, monologue prerequisite extension, NpcTolerance reconciliation

Changed

  • Protocol version bumped from 6 to 7 (pending_recognitions field in ObserverSnapshot)
  • MessagePack fixtures regenerated for protocol v7
  • Monologue trigger system uses .values() iterator (clippy fix)
  • Monologue schema: relationship prerequisite now requires target and state fields
  • 389 tests total (70 new) — cognitive delay pipeline, line pool loader, ListeningFocus, content watching, serialization
  • Client protocol v6 bridge — decode player_stance (4 variants) and player_inventory from ObserverSnapshot, TOGGLE_STANCE_UP/DOWN input actions, 25 gdUnit4 tests
  • Three-scope z-layer rendering pipeline (D-049) — world z:0-900 inside CanvasGroup, insert overlay CanvasLayer 10, UI CanvasLayer 20, modal CanvasLayer 30. Y-sort contract enforced, reserved VFX/airborne/lower-floor ranges documented
  • Cursor state machine (#429, D-056) — 4 states (Default/EntityHover/ObjectHover/WeaponAim), 150ms transitions, insert-styled geometric shapes
  • Fog shader rebuild (#430, D-059) — 5-layer fragment shader with animated Perlin noise, CanvasGroup compositing, FogState autoload for visibility/exploration textures
  • Entity interaction list (#432, D-057) — vertical multi-verb menu, insert-styled, sprint suppression, diegetic toggle
  • World radial menu (#433, D-058) — 2 spokes (Observe + Insert), drag-release and click-click input, 60-degree acceptance zones
  • Inventory UI (#438, D-065) — 3x3 grid, 40x40px slots, 1-9 hotkey selection
  • Stance indicator (#439, D-053) — color-coded HUD text, C/X keybinds
  • Architecture docs: z-layer gap analysis, fog shader spec, flying taxi feasibility analysis

Changed

  • Scene tree restructured: Entities z_index 3->0 (critical y-sort fix), FloorObjects->10, YSortGroup->100, Overhead->300, FogOverlay->900, ModalLayer added
  • constants.gd rewritten with three-scope z numbering and full reserved range documentation
  • Fog renderer replaced: TileMapLayer-based fog_renderer.gd deleted, replaced by shader-based fog_shader.gd + fog.gdshader

Added

  • ObserverSnapshot v6 wire protocol (#449) — player_stance (MovementStance) and player_inventory (Vec<InventoryItem>) fields with serde defaults for backward compatibility
  • Stance system (#417) — Sprint/Walk/Careful/Crouch movement stance with tick-based speed (1/2/3/4 ticks per move), monologue rate multipliers (40%/100%/150%/100%), PlayerMoveCooldown component, ToggleStanceUp/Down player actions
  • TilePresence posture layers (#420) — Standing/Prone/Seated/Fixture occupancy layers enabling same-tile coexistence (e.g. seated NPC + standing player), layer-based collision in validate_movement
  • ObjectType component (#421) — Readable/Container/Terminal/Door/Pickup/Furniture types with Phase 1 verb sets computed from type + proximity range
  • Phase 2 verb filter (#422) — KG-gated observer-side verb processing: POI priority flips (D-060), Confront injection at KnowsDetails+ confidence, contradiction marking, archetype-specific label relabeling (Smuggler sees Move/Stash, Detective sees Scan/Flag on containers)
  • CharacterArchetype component — Smuggler/Detective archetype for Phase 2 verb label differentiation (D-057)
  • VerbKind::Confront — Phase 2 only verb injected when observer has KnowsDetails+ on an NPC at close range
  • Smuggler inventory system (#424) — CarriedBy(StableId) component, Take/Place verbs, 9-slot (3x3 grid) capacity, auto-slot assignment, info boundary enforcement (carried items invisible to other observers)
  • MovementProfile component (#418) — per-archetype default stance (smuggler=Walk, detective=Walk), applied on spawn, factory methods for future archetypes
  • Sprint interaction buffer suppression (#419, D-055) — sprint stance explicitly clears interaction buffer, no verbs computed or sent during sprint, anomaly monologue pipeline unaffected
  • Sprint anomaly double-take monologue (#428, D-055) — SprintAnomalyQueue component detects Contradicted entities during sprint, fires delayed retroactive monologue after ~1.5s ("Wait — something wasn't right back there"), first-in-wins queue semantics, 3 hardcoded v0.1 lines

Changed

  • Protocol version bumped from 5 to 6 (stance, inventory, ObjectType, verb system fields)
  • MessagePack fixtures regenerated for protocol v6
  • Input processing queries expanded for stance and cooldown components with backward-compatible Option wrapping
  • Observer pipeline queries expanded for Stance and CharacterArchetype components
  • NearbyInteraction carries object_type and contradicted fields for Phase 2 context
  • BridgePlugin system ordering: process_sprint_anomaly_monologue runs after trigger_monologue, compute_observer_snapshot runs after anomaly processing
  • Player spawn includes MovementProfile, Stance, PlayerMoveCooldown, and SprintAnomalyQueue components
  • 331 tests total (131 new) — comprehensive QA coverage across stance, occupancy, Phase 2 verbs, sprint suppression, inventory, anomaly monologue, and wire format

Added

  • D-066: Dual-scale grid — 0.5m simulation tiles for stealth granularity, 1m visual tiles for proportional art (2x retina factor). All world geometry 2x2 sim tile minimum so cover/LOS maps 1:1 with visuals. Amends OQ-01.
  • Sprint CLI (db/connectors/sprint) — unified sprint lifecycle management with 5 subcommands: status, start, stop, start-work, prepare. Auto-detects sprint from DB state and team from git branch. Guards prevent activating unplanned sprints.
  • Shared permission settings in .claude/settings.json — git, ticket/sprint CLI, make, tea, and core skills pre-approved across all worktrees. Deny rules block destructive operations.
  • Decisions D-053 through D-065 from Control & Interaction Workshop — formalized interaction verb system, contextual actions, NPC awareness model, and related design decisions
  • Sprint 6 Touch briefings for server, client, copy, and joint teams
  • Control & Interaction Workshop outputs — full workshop notes and outcomes
  • Smuggler inventory item specs for transit district (#441)
  • Start-workshop skill for multi-agent design workshops

Fixed

  • Added worktree boundary rules to CLAUDE.md — agents must stay within the git root, no navigating to sibling worktrees or above the repo
  • Plan-sprint skill now enforces worktree-relative paths in generated briefings
  • Worktree-update skill now discovers branches dynamically via git worktree list instead of relying on hardcoded branch names — fixes missed branches like planning

Changed

  • Start-sprint and plan-sprint skills updated to use sprint CLI instead of manual multi-query workflows
  • Permission syntax migrated from deprecated :* suffix to modern space-wildcard format across all worktrees
  • Internal monologue trigger system (#414) — enter_location fires on first tick, time_idle fires after 100 ticks of no movement, 300-tick cooldown, dedup within session, random line selection from content pools via ChaCha20 RNG
  • MonologueEvent in ObserverSnapshot v5 — current_monologue field carries id, text, and display duration across the IPC bridge
  • Client monologue display wiring — protocol v5 decoding, GameState extraction, HUD display pass-through

Fixed

  • NPC spawn missing Interactable component (#413) — NPCs spawned from content and proof room now have Interactable, enabling E-prompt detection
  • PlayerAction::Interact was a no-op (#415) — changed from unit to struct variant with target_entity_id and verb fields, server logs interaction data

Changed

  • Protocol version bumped from 4 to 5 (MonologueEvent field, Interact variant change)
  • MessagePack fixtures regenerated for protocol v5

Changed

  • UIStrings YAML parser now handles arbitrary nesting depth and inline comments — adapts to copy team's restructured ui-strings.yaml with multi-level sections (relationship_states, health_values)
  • HUD uses new YAML keys: hud.perception_mode_prefix, hud.time_prefix, hud.health (empty prefixes display values directly)
  • Interaction prompt keybind hint ("E") hardcoded instead of loaded from YAML — keybinding is not copywriter text

Added

  • Pre-commit FactId validation hook (#393) — grep-based check validates fact_id references in content YAML against canonical knowledge catalogs; advisory mode when catalogs are stubs, enforcing mode when populated
  • Pre-commit hook infrastructure — .config/hooks/ with modular dispatcher, make setup-hooks target, core.hooksPath config for worktree-safe hook installation
  • make check-fact-ids target for manual fact_id validation
  • UIStrings autoload with YAML-based UI string loading (#409) — minimal YAML parser, get_text() lookup with fallback-to-key
  • HUD and interaction prompt labels now loaded from client/data/ui-strings.yaml instead of hardcoded strings
  • Character voice speech patterns (#310) — sentence-level execution spec for smuggler and detective covering contractions, punctuation, stress markers, vocabulary, verbal tics, and authoring checklist
  • NPC authoring style guide (#379) — 954-line handbook: tier budgets, 9 NPC patterns, dialogue/monologue rules, tag taxonomy, dual-lens coordination, Krenn/Sova culture, FRIEND phase mapping, validation checklist
  • UI microcopy (#409) — 72 YAML strings for client integration: interaction verbs, relationship states, HUD labels, perception modes, notifications, knowledge panel, tutorial prompts
  • Kael Davan FRIEND pack (#297) — 86 hand-authored lines across 3 locations, 5-phase relationship arc with contradiction scene, dual-lens notes
  • Sera Venn FRIEND pack (#298) — 75 hand-authored lines at The Last Shift, trust-gated gossip, avoidance contradiction, contaminated trust arc
  • PC-as-NPC content (#401) — 70 authored items enabling second-playthrough recognition (D-039 wow moment #4)

Changed

  • Moved ui-strings.yaml from content/campaigns/_meta/ to client/data/ for direct Godot client loading

Fixed

  • Fact ID format collision across FRIEND content — normalized 73 flat IDs to dotted category.topic format, fixing broken detective evidence chain from Sera to Kael observations
  • Entity ref format inconsistency — normalized underscore format to npc:hyphenated across ~15 monologue references
  • Phase tag inconsistency between FRIEND packs — standardized to phase-N format, added missing phase-2 tags to Kael ring ops lines
  • Detective monologue gap for Kael — added 7 observation lines (7 → 15 total), added mood tags and bar_evening situation to Kael bar content
  • Hoshe QA briefing updated with integration test coverage priorities — test harnesses, dedicated client-server test map, edge case focus
  • Sprint 5 "Live" team briefings — copy (6 tickets), client (2), CI (1), joint coordination for content-at-scale sprint targeting FRIEND packs, voice patterns, NPC style guide, PC-as-NPC authoring, UI microcopy, FactId validation
  • Live server mode (make game) — single command builds server, launches client with TCP connection, auto-kills server on exit; make stop helper for manual cleanup
  • SR_LIVE=1 environment variable switches SimBridge from test mode to real TCP server connection
  • TileKind in wire protocol (#412) — server sends Floor/Wall/Door/Object per visible tile, client renders walls and floors in live mode
  • Input roundtrip integration test (#411) — spawns real server, connects via TCP, validates full movement and interact pipeline
  • Debug logging for received player inputs on server (visible with RUST_LOG=debug)

Fixed

  • Interaction prompt target+verb data now attached to Interact action in game loop (#405) — was TODO stub, server receives {target_entity_id, verb} payload
  • Player entity detection uses kind.variant == "Player" instead of hardcoded entity_id == 1 — fixes "player not found" warnings when connected to real server (which assigns different IDs)
  • Movement keys now work in live mode — client was sending millisecond timestamps as input tick, server only processes ticks <= current frame counter; now uses server tick from latest snapshot
  • Entity-to-tile alignment in live mode — server sends tile-center render coords (tile 16 → 16.5), entity renderer now floors to tile index before positioning

Added

  • Content loader Phase 2 (#408) — 2-phase spawn pipeline loads real YAML content into ECS entities: enums, entity attributes, pools, templates, triangles, NPC profiles with Want/Tolerance/Contentment/Personality/Tells/Skills axes plus cross-reference resolution for Secrets, Relationships, Information, and DailyRoutine
  • Global enum YAML files (#387) — 9 enum definitions (situations, topics, moods, triggers, access-tiers, trust-tiers, activities, patterns, motivations) from D-035 taxonomy
  • Entity attributes YAML (#388) — 16 canonical knowledge graph attribute keys from D-024 with A7 workshop updates
  • Seed-time pools (#389) — 5 single-candidate pools for deterministic v0.1 testing
  • Social site templates (#390) — 3 templates (logistics-hub, bar, smuggling-ring) with role slot definitions per D-025
  • Triangle YAML files (#391) — 5 v0.1 triangles (3 active fork, 2 passive) per D-024 workshop synthesis
  • Seed configuration schema design (#394) — design document defining game-start randomization: FRIEND selections, pool draws, template assignments, entanglement config, ChaCha20 RNG protocol
  • YAML to RON converter tool (#403) — build-time converter in tooling/content-converter/, runs via make content-ron
  • Line previewer CLI (#407) — 4 subcommands (dialogue, monologue, coverage, sequence) for content authors to test line selection without running the full game
  • Happiness added to WantKind enum — Harek remapped from Safety to Happiness

Fixed

  • Dialogue-pool schema corrected to use arrays for situation/topic/mood per D-035 (were incorrectly single strings)
  • NPC want.primary changed from narrative strings to WantKind enum keywords — fixes silent Want component drop at spawn time
  • Schema enum constraint added to npc-profile.schema.json for want.primary validation

Added

  • Sprint 4 "Feel" team briefings — copy (8 tickets), server (9), client (1 carry-over), CI (1), joint coordination
  • Interaction prompt system (#405) — server-driven "E - Talk" prompt decoding v4 nearby_interactions with nested VerbOption structs, fade animation, extensible get_interaction_target/get_selected_verb interface for future radial verb menu
  • Art direction & mood board workshop (3 rounds + closing) — 4-agent team establishes visual identity, 16 art direction principles, 9 mood board images, 10 candidate decisions (D-042D-051)
  • 3D-to-2D sprite render pipeline (client/tooling/sprite_renderer/) — Godot @tool scene renders textured 3D models at "the angle" (-72.5deg ortho) from 4 cardinal directions at 1024/256/64 resolutions with outline applied at working resolution
  • /render-sprite skill — CLI wrapper for the render pipeline with headless import step
  • Pipeline POC: Era 1 institutional wall + bar green wall textures generated via Nano Banana and rendered through full pipeline
  • PerceptionQuery trait and ActivePerceptionMode resource — abstraction layer for D-017 perception mode swapping (NaturalVision default implementation)
  • VisibilityGeometry intermediate resource decoupling FOV computation from entity filtering
  • Client-side PROTOCOL_VERSION enforcement — snapshot decoder rejects version mismatches with error log
  • POI verb priority test in observer pipeline — asserts both verb kind and priority values end-to-end

Changed

  • Observer pipeline decomposed into two-stage system: compute_visibility_geometry (geometry) → compute_observer_snapshot (entity filtering + assembly)
  • POI verb priority adjustment moved from simulation phase (interaction.rs) to perception phase (observer) — fixes D-010 information boundary violation
  • compute_nearby_interactions no longer reads KnowledgeGraph — determines verb availability by proximity only, verb priority adjusted by observer
  • compute_nearby_interactions scheduling moved from SimulationPlugin to BridgePlugin for explicit ordering with geometry and observer systems
  • Client test snapshot updated to v4 format (Protocol.PROTOCOL_VERSION, tick_rate replaces paused)

Added

  • Content validation tooling — make validate-content validates campaign YAML files against JSON schemas, maps files by directory context
  • Entity::to_bits() roundtrip test — guards against bevy version changes silently breaking wire IDs
  • TickRate switch mid-accumulation test — verifies Half→Full→Paused→Half transitions preserve accumulator state
  • Tick rate scaling system (#406, D-052) — Full/Half/Paused rates with fractional accumulation, SetTickRate player action, replaces binary pause flag
  • Proximity detection and interaction verbs (#404, D-060) — compute_nearby_interactions system with Manhattan distance ranges (close ≤2, mid ≤5), context-sensitive verb computation (Talk, Observe, Examine), PersonOfInterest priority flip, NearbyInteraction in ObserverSnapshot v4
  • Content directory skeleton (#385, D-057) — district-as-atomic-pack layout with Sova Transit first district, 17 NPC stubs, 3 locations, 5 triangles, dialogue/monologue pools, factions, knowledge catalogs, enum definitions
  • Content schema definitions (#386) — 8 JSON Schema files (draft 2020-12) for district, location, npc-profile, dialogue-pool, monologue-pool, triangle, routine, fact-catalog validation
  • PROTOCOL_VERSION constant in bridge types — versioning strategy documented (subprocess IPC, serde defaults for field evolution)
  • Campaign, system, station JSON schemas for hierarchical content validation

Fixed

  • Test suite aligned with server v4 protocol enforcement — all hand-built snapshots include version field, verb priorities 1-indexed, ExamineNpc label corrected to "Observe"
  • E2E proof tests resilient to entity ordering — player found by kind instead of array position, wall-hides test checks specific NPC position instead of total count, supports 3-NPC proof room layout
  • Wire entity_id now uses StableId consistently across observer, observation, interpretation, and interaction systems (was Entity::to_bits() in some paths)
  • Restored system/station/district hierarchical fields in district metadata (incorrectly removed during canonical_id cleanup)
  • Unregistered entities in observer/interaction now log tracing::error instead of silently falling back to Entity::to_bits()

Changed

  • NearbyInteractionBuffer refactored from global Resource to per-entity Component on PlayerCharacter — multiplayer-ready (D-009)
  • Observer module split into mod.rs (244 lines) + tests.rs (480 lines) — reduces module complexity
  • Content directory restructured from flat districts/ to hierarchical campaigns/main/systems/krenn/stations/sova/districts/transit/ — path mirrors canonical IDs, glob-based discovery, multi-campaign/DLC ready
  • Content manifest (content.yaml) rewritten for glob-based district discovery
  • District identity fields (system, station, district) now derived from directory path — removed from district.yaml required fields
  • NPC canonical_id schema accepts district-scoped IDs (npc:transit.kael-davan) for cross-district uniqueness
  • ObserverSnapshot protocol bumped to v4 — adds nearby_interactions field, tick_rate replaces paused field in GameTime
  • NearbyInteractionBuffer.interactions is now private with take() accessor (no per-frame clone)
  • NearbyInteraction.distance changed from f32 to u32 (matches manhattan distance)
  • Missing PlayerCharacter in input processing now panics instead of silent no-op
  • Verb sort uses (priority, kind) tuple for deterministic ordering at equal priority
  • Unregistered entity in knowledge events triggers debug_assert + error (was warn)
  • District schema: canonical_id is now optional (derived from directory path at load time)
  • Skills trimmed for CLAUDE.md deduplication — search-docs (-48%), ticket (-17%), review-pr (-35%) now reference CLAUDE.md for basics instead of repeating them
  • Review-pr reviewer profiles extracted to references/reviewer-profiles.md for progressive disclosure

Removed

  • Dead generate_snapshot function in bridge/mod.rs — superseded by compute_observer_snapshot
  • content/global/regions/ directory — region data absorbed into system.yaml metadata

Added

  • Dual Lens Authoring Guide — 7-chapter reference for writing content that works for both smuggler and detective perspectives (D-027, D-028, D-032, D-034, D-035)
  • THE MIRROR pattern spec — transparency-as-contrast NPC design with Naia Tamm reference implementation and generator template
  • Smuggler voice card — register parameters, 5 voice anchors, 4 anti-patterns, paired comparison examples, display constraints, authoring checklist
  • Smuggler moral arc spec — 4-phase trajectory (Comfort, Doubt, Reckoning, Compromise), FactId gates, monologue trigger rules, Kael intersection mapping
  • PC-as-NPC unified spec — starting knowledge/relationship graphs, tell inversion, orientation monologue, 9-step conversion checklist, v0.1 smuggler + detective briefs
  • Triangle 1 Hub Power Volume Escalation fork — 3-path smuggler decision (escalate/stabilize/mediate), ~41 authored dialogue lines, NPC state change tables
  • Content directory structure design doc — runtime content/ layout, canonical ID format, 8 JSON Schema specs, 3-tier validation pipeline, migration path from wiki
  • Interaction verb spec — 7 v0.1 verbs (Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear), priority resolution, server pipeline architecture
  • v0.1 wow moments checklist — maps all 6 D-039 moments to content deliverables, tickets, dependencies, completion status
  • Nils Davan off-stage NPC stub — ring coordinator, GHOST + HANDLER pattern, lattice message design, relationship map
  • NPC pattern/motivation mapping applied to all 18 NPC wiki pages with composition reads
  • Structured NPC data model (#86) — replaced stub string/f32 fields with typed enums and integer types for D-010 determinism (WantKind, SecretSeverity, Skill, PersonalityTrait, CombatStyle, RelationshipKind)
  • Global RelationshipGraph resource (#87) — BTreeMap with tuple key for efficient prefix queries and reverse lookups
  • A* pathfinding system (#237) — PathRequest/ComputedPath/PathBlocked components with cardinal-neighbor A* and manhattan heuristic
  • NPC path following system (#238) — MovementSpeed throttling, per-tick path advancement with MoveIntent creation
  • Daily routine system (#88) — NpcPlugin with PreviousDayPhase resource and check_phase_transition system issuing PathRequests at day-phase boundaries
  • Multiple NPC spawning (#84) — 3 distinct NPCs (dock worker, field tech, guard) with full component bundles and RelationshipGraph edges
  • Observation event generator (#239) — RoutineDeviation, Absence, and NewEntity triggers from comparing visible snapshot against NPC routines and knowledge state
  • Review-pr skill routes reviewers by branch type — server/client get Hoshe+Tyre, copy gets Hoshe+Paula+Miri, visual gets Hoshe+Araminta, audio gets Hoshe+Ozzie
  • Start-sprint skill spawns team agents from sprint briefings — parses the Agents line, creates a team with tasks from tickets, and launches all listed agents as background teammates

Fixed

  • IPC error handling (#341) — DeserializationWithDump/MutexPoisoned error variants, hex dump logging on deserialization failure, graceful error classification in bridge I/O systems
  • NpcPlugin system ordering — routine phase transitions now run before pathfinding so PathRequests are picked up same frame
  • Stale doc comment in observation event generator — system runs before knowledge updates, not after
  • Clippy warnings from Rust 1.93 — derive Default, is_multiple_of, collapsible if

Changed

  • Hael renamed to Naia Tamm across all wiki files (16 files updated)
  • Canonical full names applied to 11 single-name NPCs (Voss→Arvo Voss, Devra→Devra Talsen, etc.)
  • Location shortcodes standardized in monologue guide (hub_m_ → terminal_m_ per D-036)
  • Entity attributes updated to 16 canonical keys — 4 new role-perspective keys (risk_assessment, loyalty_assessment, position_integrity, moral_weight), secret_held→leverage_held rename
  • Drin Rosta expanded from Tier 3 to Tier 2 — full 10-axis profile, 6 voice lines, Triangle 2 + Triangle 5 roles
  • NPC index roster table expanded with Pattern and Motivation columns
  • Sprint 3 "Know" team briefings regenerated from database — all four files (server, client, joint, copy) now match actual sprint 3 ticket assignments
  • Ticketing database moved to shared worktree location (../settledreach.db) — eliminates binary merge conflicts across branches
  • All Python connectors use script-relative path resolution instead of $REPO_ROOT env var or git rev-parse
  • $REPO_ROOT environment variable removed — all scripts, skills, and docs use relative paths
  • Merged copy branch — 39 tickets, wiki review + content scoping workshops, game world glossary
  • Merged maintenance branch — worktree-update skill

Added

  • make db-backup / make db-install — database backup to docs/backups/ (main-only) and restore for new clones
  • Worktree-update skill backs up the shared database after merges on main

Removed

  • db/commonwealth.db from git tracking (replaced by shared ../settledreach.db)
  • $REPO_ROOT env var from all 9 worktree settings.local.json files

Added

  • Worktree-update skill — non-destructive branch sync with PR detection and conflict safety
  • Game world wiki — 45-file glossary covering Sova Transit District: 17 NPCs, 5 triangles, 3 social sites, 7 factions, knowledge vocabulary
  • Wiki Review workshop (4 rounds + lead interview) — 300-world generator model, cultural ingredients menu, three-system NPC architecture, Sacred/Profane/Middle Kingdom framework
  • v0.1 Content Scoping workshop (2 rounds + closing) — 16 EntityKnowledge keys, mechanical NPC mapping, YAML content format, 7-verb interaction model, server-authoritative pause, 20 decisions (D-042D-061)
  • 39 implementation tickets (#371#409) from content scoping workshop — copy 21, server 13, client 2, ci 1
  • Control & Interaction workshop brief (queued)
  • Large content push team pattern in CLAUDE.md
  • Inigo sound designer agent — soundscape design, ambient layers, diegetic cues, D-018 audio propagation
  • Team-agent mapping in sprint planning — each team has defined default agents for briefing assignment
  • Sprint skills recognize all team branches (server, client, copy, audio, visual, ci)
  • Sprint 3 "Know" team briefings — server (6 tickets), client (2 tickets), joint (2 split tickets), copy (1 carry-over)
  • Copy team sprint briefing for Sprint 2 (#368 knowledge vocabulary)
  • Sprint 2 proof: fog of perception E2E tests (#357) — 3 tests verifying all 7 acceptance criteria through real server pipeline (movement, tiles, fog, wall hiding, corner reveal)
  • Server proof room — wall at (16,14) between player at (16,16) and NPC at (16,13) for LOS testing
  • Dynamic test snapshot in SimBridge — tracks player position from queued inputs, Bresenham LOS, Manhattan-distance visibility for standalone demo mode
  • 4 Bresenham LOS unit tests — clear path, wall blocked, diagonal, same position (PR #13 review)

Fixed

  • Type safety in GameState visible_tiles loop — validates Dictionary with x/y keys before access (PR #11 review)
  • Consistent reset_test_state() usage across all test files (PR #13 review)
  • E2E connection loop now detects server process death early (PR #13 review)
  • Corner reveal test verifies NPC position at (16.5, 13.5) (PR #13 review)
  • Entity renderer skips redundant modulate.a writes when alpha unchanged (PR #11 review)

Added

  • Observer snapshot knowledge integration (#366) — VisibleEntity carries relationship state (D-033 color) and observation type (Visible/Remembered), remembered entities appear as fog ghosts at last known position
  • Knowledge graph system (#361, #362, #363, #365) — per-entity KnowledgeGraph component (D-041), StableEntityId + EntityRegistry, KnowledgeEventQueue, decay system, 4-level confidence hierarchy
  • Direct observation knowledge flow (#364) — perception emits DirectObservation/LeftLOS events to knowledge graph, entities entering/leaving LOS tracked
  • Protocol v2 decoder — extracts game_time, player_facing, visible_tiles, and per-entity visibility sectors from ObserverSnapshot v2
  • D-033 entity color palette (#130) — relationship-based colors (teal/green/amber/red), Phase 1 defaults by entity kind
  • Peripheral vision dimming — entities in peripheral vision rendered at 50% alpha (D-015)
  • Player facing direction indicator — Polygon2D triangle on player entity showing 8-directional facing
  • GameState v2 fields — game_time, player_facing, visibility_sectors stored from snapshot data
  • Test snapshot updated to v2 format with visibility sectors, game_time, and player_facing
  • Observer visibility query (#112) — replaces unfiltered generate_snapshot with LOS-filtered compute_observer_snapshot combining shadowcasting + vision cone
  • Vision cone system (#111) — forward/peripheral/blind sectors per D-015, Facing component updated on movement
  • Symmetric shadowcasting (#110, #359) — Albert Ford algorithm with rational fraction slopes, benchmarked 1.2-10.5x faster than recursive, symmetry guaranteed (D-035)
  • ObserverSnapshot v2 schema (#358, #25) — version field, GameTime, FacingDirection, VisibleTile, VisibilitySector types, visibility tag on entities
  • D-035 decision record — symmetric shadowcasting selected over recursive (resolves Q-018)
  • Tile rendering engine (#129) — programmatic TileSet with floor/wall/door/object placeholders, renders from snapshot tile data
  • Fog overlay rendering (#131) — three visibility states (visible/fog-edge/hidden) via TileMapLayer overlay
  • Camera lock to character (#116) — Camera2D smoothing at 2x zoom, locked to player position (D-015)
  • Test room environment — 8x8 room with corridor and Manhattan-distance visibility for development without server
  • ticket team command and --team filter — comma-separated team assignment for tickets (server, client, joint, content)

Changed

  • All instruction files (CLAUDE.md, skills, agent files) now use $REPO_ROOT env var instead of git rev-parse --show-toplevel — pre-set per worktree via .claude/settings.local.json
  • start-sprint skill now requires plan mode — agent must create and get approval for a concrete sprint plan before starting implementation

Fixed

  • Entity renderer protocol field mismatches — "id"→"entity_id", "type"→"kind.variant", "position"→x/y fields now match Protocol.decode_entity() output
  • Entity centering — entities (24x24) now centered within 32px tiles instead of top-left aligned
  • start-sprint skill uses git rev-parse --show-toplevel for worktree-safe absolute paths — fixes "No such file or directory" errors on team branches

Changed

  • Background clear color set to near-black for unexplored areas (was default Godot gray)
  • Scene render order: Tiles → FogOverlay → Entities (fog covers tiles, entities render on top)
  • FogOverlay node type changed from Node2D to TileMapLayer for tile-based fog rendering
  • GameState now stores visible_tiles and visible_positions from snapshots
  • Test snapshot includes player entity (kind "Player"), second NPC entity, tile data, and visibility data

Added

  • Sprint 2 "See" briefings (server, client, joint) — fog of perception through the bridge
  • /plan-sprint skill — automates sprint planning workflow and briefing file generation
  • ticket show multi-ID support and --brief flag for compact human-readable output
  • Q-018 through Q-023 — 6 open questions from architecture audit (shadowcasting, entity ID stability, collision resolution, tick overflow, pathfinding cache, debug visualization)
  • 5 architecture spike workshop briefs (knowledge graph, observer pipeline, NPC AI state machines, save/load, map authoring)
  • 17 tickets from architecture audit (#339-#355) — 7 Sprint 1 tasks, 5 Sprint 2+ tasks, 5 workshop epics
  • End-to-end connection test (#81) — GDScript test spawning Rust server, connecting via LocalBridge, sending MoveNorth input, verifying player movement in snapshot response (D-030 Layer 3)
  • Batch input encoding (Vec<PlayerInput> wire format) — Protocol.encode_player_inputs() batches all inputs per tick into one framed message matching server expectations
  • EntityKind::Player fixture — snapshot_player.msgpack for cross-language testing, multi-entity fixture updated to include all 4 entity kinds
  • 7 new tests (4 batch encoding, 1 framed batch roundtrip, 1 Player fixture decode, 1 E2E connection), 43 total client tests passing
  • LocalBridge GDScript TCP transport (#79) — 4-byte big-endian length-prefix framing matching Rust server, StreamPeerTCP wrapper with partial read handling
  • ServerProcess subprocess manager — spawns/stops Rust server via OS.create_process(), auto-cleanup on destruction
  • SimBridge live transport integration — _process() polling loop for TCP receive/send, connection state machine (DISCONNECTED → CONNECTING → CONNECTED → ERROR)
  • 8-directional input support — 4 diagonal movement variants (NE, SE, SW, NW) in InputMapper, SimBridge wire mapping, and project.godot input actions
  • 12 LocalBridge tests (framing roundtrips, cross-layer Protocol+framing, diagonal wire mapping)
  • 4 diagonal movement cross-language fixtures (Rust → GDScript, D-030 Layer 1)
  • 33 total client tests passing (up from 20)
  • TcpBridge transport for Godot client connection — TCP localhost IPC alongside existing Unix socket LocalBridge
  • Input processing system (process_player_input) — drains InputQueue, converts PlayerActions to MoveIntent components, handles pause/unpause
  • Snapshot generation system (generate_snapshot) — builds ObserverSnapshot from ECS state with render coordinate conversion
  • Bridge I/O systems (receive_bridge_inputs, send_bridge_snapshot) — wire bridge to ECS pipeline with graceful disconnect detection
  • Full game loop in main.rs — TCP accept, tick loop with ServerRunning resource, CLI/env addr config
  • PlayerCharacter marker component, Player EntityKind variant, SnapshotBuffer resource
  • E2E game_loop integration test verifying player movement through full pipeline
  • 8 new tests (3 TCP bridge + 4 input processing + 1 E2E game loop), total 53
  • Architecture audit framework (docs/audits/) — adversarial two-round review pattern by Tyre + Troblum
  • Sprint 1 architecture review — full decision + code audit, GREEN architecture, AMBER implementation plan
  • v0.1 content gap analysis workshop — 6 agents, 2 rounds, 9 content layers, 8 new decisions (D-032 through D-039)
  • D-032: Separate monologue pools per playable character (hard partition, not filter)
  • D-033: Entity color represents relationship to player character (asymmetric per character)
  • D-034: THE FRIEND NPC pattern — production-level emotional centerpiece per character (Kael Davan, Sera Venn)
  • D-035: Converged tag taxonomy for dialogue/monologue line pools (6 structural + 3 selection tags)
  • D-036: Sova Transit District / Krenn System as v0.1 setting (first named star system)
  • D-037: Contraband specification — unlicensed lattice components (moral ambiguity by design)
  • D-038: Audio in v0.1 scope — 8 AI-generated files via Stable Audio Open
  • D-039: All 6 wow moments promoted to v0.1 must-have scope
  • LocalBridge IPC over Unix domain sockets (#78) — length-prefixed MessagePack framing, SimBridge implementation, BridgeResource ECS wrapper
  • Tile collision system (#236) — TilePosition component, chunk-based WalkabilityMap (D-012), MoveIntent + validate_movement system
  • TilePosition ↔ f32 render coordinate conversion (to_render_coords, from_render_coords) bridging simulation and wire format
  • Chunk load/unload support in WalkabilityMap — HashMap<ChunkCoord, ChunkData> with 32x32 tile chunks
  • 8-directional movement — diagonal PlayerAction variants (MoveNortheast/Northwest/Southeast/Southwest) + TilePosition::all_neighbors()
  • Entity-entity collision in validate_movement — spatial occupancy check prevents multiple entities on same tile
  • 25 new tests (4 framing + 2 IPC integration + 17 movement unit + 2 movement integration), total 45
  • MessagePack serialization for GDScript (ticket #77) — Protocol codec decoding ObserverSnapshot/PlayerInput from Rust wire format, encoding PlayerInput for server
  • Godot4MessagePack library (pure GDScript) for MessagePack encode/decode
  • Rust fixture generator (gen_fixtures.rs) producing canonical .msgpack test fixtures with rmp_serde
  • 8 cross-language protocol tests verifying Rust↔GDScript MessagePack compatibility (D-030 Layer 1)
  • SimBridge wired to Protocol codec with receive_bytes()/drain_outbound() for transport layer
  • db/connectors/ticket CLI — ergonomic ticket management (list, show, create, assign, sprint, deps, search, epics, children, count) with JSON output
  • Sprint 1 "Run" created with 8 stories targeting moving character on screen via IPC bridge
  • Ticket skill rewritten to use ticket CLI instead of raw SQL wrapper scripts
  • Godot 4 client boilerplate (epic #277) — scenes, autoloads (SimBridge, GameState, InputMapper), rendering stubs, UI shell (HUD, minimap, monologue display), input system with semantic actions
  • gdUnit4 test framework with 7 tests (2 smoke + 5 D-030 Layer 1 fixture tests for snapshot parsing)
  • make ci-client pipeline (lint, build, test via gdUnit4 headless runner)
  • Camera tracking locked to player position (D-015), monologue display wired to snapshot data (D-016)
  • Gitea tea CLI instructions in CLAUDE.md — non-interactive flags, PR workflow patterns
  • /review-pr skill — dual-agent PR review with Hoshe (code quality) and Tyre (architecture) in parallel, Gitea integration, vendor file exclusion patterns, local merge workflow, heredoc workaround
  • Automated Rust install via make setup (tooling/install-rust script, rustup + clippy + rustfmt)
  • Automated Godot download/install via make setup (tooling/install-godot script, installs to ~/bin/godot4)
  • InputQueue tick ordering enforcement via debug_assert (determinism guard)
  • Serialization roundtrip tests for all PlayerAction and EntityKind variants (D-030 Layer 1)
  • Edge case tests: day wraparound at midnight, day() calculation, out-of-order input rejection
  • Test runner switched to cargo-nextest (D-030 requirement)
  • Rust/bevy_ecs simulation server boilerplate (epic 276) — Cargo project, module structure, core ECS types, plugin scaffolding, deterministic simulation resources, test infrastructure
  • SimulationTime resource with D-031 time system (10 ticks/game-minute, 4 day phases)
  • SimRng deterministic RNG resource (ChaCha20, seeded for replay)
  • InputQueue resource for timestamped semantic player actions
  • ObserverSnapshot and PlayerInput IPC types with MessagePack serialization (D-020)
  • SimBridge trait abstracting client-server transport
  • CauseChain production component for information provenance tracking (D-030)
  • SimulationTier types with LRU eviction support (D-026: Active/Background/StateSaved/Ungenerated)
  • NPC 10-axis model components (D-024: 7 essential + 3 supporting + CombatCapability)
  • Server test infrastructure: 11 inline unit tests + 4 integration tests (smoke + serialization round-trips)
  • make ci-server pipeline verified green (clippy, fmt, build, test)
  • Round 18 v0.1 gap analysis workshop — 7 agents, 2 rounds, 4 tracks (concept proof, wow factor, missing systems, testability)
  • D-030: Testability architecture — 8 sub-decisions for ticket #214 (gdUnit4, hybrid Rust testing, CauseChain component, three-layer IPC testing)
  • D-031: Time system — 10 ticks = 1 game-minute, 4 day phases (Morning/Afternoon/Evening/Night), diegetic clock display
  • 41 new tickets from gap analysis: 3 epics (Movement & Collision, Observation & Interaction, Game State Management) + 38 stories
  • 15 priority promotions including 3 tickets to critical (deterministic replay, divergent knowledge, divergent relationships)
  • 21 new dependency records mapping critical path through collision → pathfinding → NPC movement → routine execution
  • Workshop directory convention established with per-workshop subdirectories
  • Project directory scaffold: client/, server/, tooling/, tests/, .config/, .cache/
  • Top-level Makefile with dev workflow targets (setup, build, run, test, lint, ci, clean)
  • Whitelistable sqlite-init and sqlite-seed wrapper scripts completing the db/connectors/sqlite-* set
  • Round 17 content architecture workshop — Full team (8 agents, 3 rounds) defining content pipeline
  • D-023: Three-tier content model (authored drama modules, templated content, procedural filler) with life-sim substrate
  • D-024: NPC generation model — 10 axes (7 essential + 3 supporting) with CombatCapability ECS component
  • D-025: Social site / functional cluster as atomic Tier 2 template unit (4-8 NPCs, 15-40 tiles)
  • D-026: Simulation tiers with timestamp-based LRU eviction (Active/Background/State-saved/Ungenerated)
  • D-027: Vertical slice — smuggler + detective two-character proof-of-concept (supersedes D-006)
  • D-028: Dialogue architecture — tagged line pools with four relational layers (access tiers, history, trust-gating, unprompted disclosure)
  • D-029: Population entanglement ratio — 30% flat / 50% mundane triangles / 20% intrigue-entangled
  • Content architecture workshop brief documenting the "life first, drama second" design philosophy
  • Mellanie (Copywriter) activated from standby for content authoring phase
  • Round 16 faction development — Full faction framework with lore, political analysis, mechanical grounding (session closed, awaiting team input for v0.1 selection)
  • 3D reputation system: Trust × Usefulness × Exposure per faction
  • Faction mechanical grounding: starting loadouts, information asymmetry, blind spots, resource loops
  • Power dynamics analysis: formal vs. real power distribution across factions
  • Character drama templates: whistleblower, inspector with conscience, dual-loyalty operative, reluctant conspirator
  • Betrayal vectors and conspiracy potential for all six factions
  • "First 30 Minutes" test demonstrating six mechanically distinct faction perspectives
  • D-021: Official project title "The Settled Reach" confirmed, domain settledreach.com secured
  • Round 14 worldbuilding — "The Settled Reach" original SF setting foundation with full team reactions
  • Original terminology established: Settled Reach, Founder Gates, Span Gates, Interstitium, neural lattice, Meridian, imprint, re-embodiment, Perpetuals, the Unbound, Forking, Severance
  • Four enhancement tiers: Baseline, Augmented, Transcendent, Elevated (plus the Threshold as endgame horizon)
  • Two-tier death system: soft death (lattice intact) and hard death (lattice destroyed, imprint restore)
  • Six factions: Concord Assembly, Syndics, Separatists, Guardians of Autonomy/Severance, Veil Institute, Lattice Commission
  • Infrastructure-as-mystery: Builders inhabiting the Interstitium, Gyre events as leakage
  • Miri's IP originality guardian role — flags concepts too close to source franchises
  • Whitelistable wrapper scripts for SQLite and Qdrant connectors (sqlite-query, sqlite-exec, qdrant-search, qdrant-index, qdrant-health, qdrant-count)
  • Architecture evaluation and risk assessment documents for Godot+Rust bridge approach
  • Round 13 engine selection discussion — full team debate on engine paradigms
  • D-020: Engine and architecture selection — Godot 4 client + Rust/bevy_ecs simulation server via subprocess/IPC
  • Rejected alternatives R-004 through R-010 documented (pure Bevy, pure Godot, GDExtension, C++ GDExtension, Fyrox, custom framework, protobuf)

Fixed

  • create-skill references to nonexistent init_skill.py and package_skill.py scripts
  • SimBridge wire format: inputs now batch-encoded as Vec<PlayerInput> array per server protocol (was sending individual inputs per frame)
  • SimBridge server args: positional address format ("127.0.0.1:9876") matching server CLI, port default corrected to 9876
  • Wire format mismatch: LocalBridge now uses rmp_serde::to_vec_named() (named maps) matching client Protocol.gd expectations
  • EOF on bridge read now returns BridgeError::Transport for disconnect detection instead of empty Vec
  • WalkabilityMap rewritten from flat Vec to chunk-based HashMap per D-012 architecture (Tyre review)
  • LocalBridge mutex .unwrap() → .expect() for clearer panic messages (Hoshe review)
  • Documented 16MB MAX_MESSAGE_SIZE rationale in framing.rs (Hoshe review)
  • Client input_mapper double-check bug (redundant event.pressed + is_action_pressed)
  • Bounds validation on snapshot position arrays in game_state.gd and entity_renderer.gd
  • Deterministic test snapshots (replaced Time.get_ticks_msec() with incrementing counter)
  • Tween overlap in monologue_display.gd (cancel active tween before creating new one)
  • SubViewportContainer missing SubViewport child in minimap.tscn
  • Cargo.toml edition 2024 → 2021 for broader toolchain compatibility
  • Relationship.target_name: String → target_id: u64 for entity scalability (Tyre review)
  • DayPhase enum now derives Serialize/Deserialize (consistent with other enums)
  • Replaced all absolute paths (macOS and Linux) with project-relative paths across round-16 docs
  • Removed duplicate ROUND-16-STATUS.md from project root (content already in round-16-session-notes.md)
  • Added relative-path convention to Qatux agent persona for cross-system consistency

Removed

  • dotfiles/tmux.conf (no longer needed)

Changed

  • Q-018 (shadowcasting algorithm selection) resolved via D-035
  • All 18 agent briefings updated for decisions/ directory split and DEVOPS.md references
  • Implementation agents (Dudley, Hoshe, Justine, Oscar, Si, Stig, Tyre) now include Development Workflow sections with Makefile targets
  • Q-009 (time system) resolved via D-031
  • Ticket catalog expanded from 232 to 273 tickets with sprint sequencing (Run → Feel → Content → Validate)
  • Ticket skill updated to use wrapper scripts exclusively (no more direct python3 calls)
  • Miri's role updated from Canon Guardian to Worldbuilder & Setting Designer (original IP pivot)
  • Project description updated to reflect D-020 engine decision
  • Connector usage instructions now reference wrapper scripts instead of python3 directly
  • Q-001 (engine selection) resolved via D-020