Commit Graph
270 Commits
Author SHA1 Message Date
jpmschweitzerandClaude Opus 4.6 6bebbd9933 feat(client): add interaction prompt system (#405)
Server-driven interaction prompt that displays "E - Talk" when near
an interactable NPC. Decodes v4 nearby_interactions from snapshot,
stores in GameState, renders via InteractionPrompt UI with fade
animation. Extensible interface (get_interaction_target/get_selected_verb)
for future radial verb menu (v0.2).

- Protocol: decode nearby_interactions array with nested VerbOption structs,
  entity relationship/observation fields, tick_rate in GameTime
- GameState: store/clear nearby_interactions per snapshot
- SimBridge: test mode generates v4 format with structured verbs
- InteractionPrompt: PanelContainer with fade in/out, polls GameState
- Tests: 19 new test cases covering protocol, state, sim bridge, UI, encoding
- Fixture assertions updated for v4 protocol version

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 23:43:37 +01:00
jpmschweitzerandClaude Opus 4.6 c970d2eba7 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:23:17 +01:00
jpmschweitzerandClaude Opus 4.6 ba867564a8 fix(server): add error logging, protocol version, and architecture docs
- Replace silent Entity::to_bits() fallbacks with tracing::error in
  observer.rs and interaction.rs (makes unregistered entities loud)
- Add PROTOCOL_VERSION constant to types.rs, use in observer snapshot
- Document single-observer assumption on NearbyInteractionBuffer
- Document proximity-only (no LOS) limitation on compute_nearby_interactions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:22:34 +01:00
jpmschweitzerandClaude Opus 4.6 e2f2f4e590 refactor(server): remove dead generate_snapshot function
Delete generate_snapshot from bridge/mod.rs — superseded by
perception::observer::compute_observer_snapshot. Not referenced
in any schedule or test.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:22:28 +01:00
jpmschweitzerandClaude Opus 4.6 9d53869ca7 refactor(data): restructure content directory for galaxy scale
Replace flat content/districts/ with hierarchical campaign/system/
station/district structure. Path mirrors canonical IDs, enables
glob-based discovery, and is multi-campaign/DLC ready.

- git mv 46 files preserving history
- New metadata: campaign.yaml, system.yaml, station.yaml
- Rewrite content.yaml with glob-based district discovery
- Add campaign, system, station JSON schemas
- Update district schema: hierarchy fields derived from path
- Update npc-profile schema: accept district-scoped IDs
- Add TODO to 17 dialogue/monologue pool files for generator revision
- Update _meta/README.md with new hierarchy documentation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 21:22:23 +01:00
jpmschweitzerandClaude Opus 4.6 8cd7ef21ae chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:14:56 +01:00
jpmschweitzerandClaude Opus 4.6 ece4dfe1c4 fix(data): restore hierarchical fields in district metadata
Re-added system/station/district fields to district.yaml that were
incorrectly removed during Tyre10 cleanup. These carry hierarchical
context (planet, station), not redundant identity. Made canonical_id
optional in schema since it's derived from directory path at load time.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:14:41 +01:00
jpmschweitzerandClaude Opus 4.6 9943684f2c refactor(server): address PR #16 review feedback
Hoshe + Tyre review items:
- Use StableId consistently for wire entity_id (H4) across observer,
  observation, interpretation, and interaction systems
- Make NearbyInteractionBuffer.interactions private with take() (H1/H20)
- Add system ordering constraint for compute_nearby_interactions (H5)
- Panic on missing PlayerCharacter in input processing (H2)
- Remove redundant paused field from GameTime (Tyre8)
- Remove #[serde(default)] from nearby_interactions (H3)
- Change NearbyInteraction.distance from f32 to u32 (H8)
- Add sort stability for equal verb priorities (H6)
- Scope constants to pub(crate) (H7)
- Add debug_assert for last_observed_tick ordering (H10)
- Strengthen unregistered entity handling to debug_assert + error (H11)
- Document fractional tick accumulation (Tyre9)
- Extract collect_remembered_entities helper (Tyre2/H17)
- Add half_rate_no_drift_over_10000_frames test (H14)
- Add mid-range and deterministic sort tests (H15)
- Add fixture version assertion (H16)
- Regenerate msgpack fixtures for wire format changes

146 unit + 19 integration tests pass, zero clippy warnings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:14:35 +01:00
jpmschweitzerandClaude Opus 4.6 458be0f621 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:49:19 +01:00
jpmschweitzerandClaude Opus 4.6 2de413dd87 feat(simulation): add proximity detection and interaction verbs
Implement compute_nearby_interactions system that detects entities
within close (≤2) and mid (≤5) Manhattan distance, computes
available verbs per D-060 spec. NPCs get Talk+Observe at close
range, Observe-only at mid range; PersonOfInterest flips priority.
Objects get Examine. Results populate nearby_interactions[] on
ObserverSnapshot v4. Bump protocol version 3→4. Implements #404.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:48:55 +01:00
jpmschweitzerandClaude Opus 4.6 5afea99622 feat(simulation): add tick rate scaling system
Replace binary paused flag with TickRate enum (Full/Half/Paused)
per D-052. Full rate advances every frame, Half every 2 frames
via fractional accumulation, Paused blocks all advances. Add
SetTickRate player action for client-driven rate changes.
Implements ticket #406.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:48:43 +01:00
jpmschweitzerandClaude Opus 4.6 ad55dfaa72 feat(data): add content schema definitions
JSON Schema (draft 2020-12) for content validation: district,
location, npc-profile, dialogue-pool, monologue-pool, triangle,
routine, and fact-catalog. NPC schema uses if/then conditional
for FRIEND pattern validation. Implements ticket #386.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:48:21 +01:00
jpmschweitzerandClaude Opus 4.6 10f5be29b1 feat(data): create content/ directory skeleton
Scaffolds the full content directory structure per D-057 spec:
district-as-atomic-pack layout with Sova Transit as the first
district. Includes 17 NPC stubs, 3 locations, 5 triangles,
9 dialogue pools, 8 monologue pools, routines, 7 factions,
7 knowledge catalogs, 8 enum definitions, and global region.
Implements ticket #385.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:48:13 +01:00
jpmschweitzer b5333f1612 Merge remote-tracking branch 'origin/main' into server 2026-02-12 19:19:39 +01:00
jpmschweitzer fd775878e7 Merge remote-tracking branch 'origin/copy'
# Conflicts:
#	decisions/content.md
2026-02-12 19:15:07 +01:00
jpmschweitzerandClaude Opus 4.6 2827dd3a83 fix(decisions): update stale Hael references to Naia in D-034 and D-036
Caught by Miri during copy PR #15 review.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:14:46 +01:00
jpmschweitzerandClaude Opus 4.6 010c4158f9 docs(copy): address PR #15 review feedback
Miri (critical):
- Fix 3 stale "Hael" references in decisions/content.md (D-034, D-036)

Paula (suggestions):
- Flag dual-fire 15-30s delay as tuning target in smuggler moral arc
- Clarify MIRROR NPCs can be wrong (lied to) without being dishonest
- Add implementation note for Path C deferred follow-up fork
- Note detective-NPC dialogue rotation variants for post-v0.1
- Clarify detective vs smuggler moral_weight criteria in entity attributes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 19:07:24 +01:00
jpmschweitzer 16ee660b5d Merge remote-tracking branch 'origin/main' into copy
# Conflicts:
#	CHANGELOG.md
2026-02-12 19:04:21 +01:00
jpmschweitzer 617e9de9af Merge remote-tracking branch 'origin/main' into server 2026-02-12 18:56:42 +01:00
jpmschweitzer d17a3ff060 Merge remote-tracking branch 'origin/main' 2026-02-12 18:55:25 +01:00
jpmschweitzer 5102e40a17 Merge remote-tracking branch 'origin/maintenance'
# Conflicts:
#	.claude/skills/review-pr/SKILL.md
2026-02-12 18:45:27 +01:00
jpmschweitzerandClaude Opus 4.6 d153035621 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:42:06 +01:00
jpmschweitzerandClaude Opus 4.6 f1bc79a0d2 refactor(skills): trim duplication and improve progressive disclosure
- search-docs: remove content already in CLAUDE.md (basic commands,
  endpoints, examples), keep only unique operations and workflows
- ticket: remove duplicated access method and SQL wrapper docs, add
  missing show --brief command reference
- review-pr: extract branch-type reviewer profiles to
  references/reviewer-profiles.md, reducing SKILL.md from 287 to 187
  lines while preserving all reviewer specifications
- create-skill: remove empty .gitkeep placeholders from unused
  references/ and scripts/ directories

Reviewed all skills against /create-skill conventions. Main findings
were CLAUDE.md content duplication wasting context tokens and a
progressive disclosure opportunity in the longest skill.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:41:53 +01:00
jpmschweitzerandClaude Opus 4.6 905fc764f5 fix(skills): pass file contents to non-Bash reviewer agents in review-pr
Paula, Miri, Ozzie lack Bash access and cannot git show from branches.
Skill now documents which agents can self-serve and instructs the caller
to read and paste file contents into prompts for agents that can't.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:41:07 +01:00
jpmschweitzerandClaude Opus 4.6 8734e7d835 chore(skills): add push-pr skill for safe PR lifecycle
Pushes current branch and creates or updates a PR without ever
merging into main. Prevents accidental PR merges by restricting
the skill to branch-side operations only.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:27:50 +01:00
jpmschweitzer ae40d8bd2c Merge pull request 'feat(server): Sprint 3 Know — NPC model, pathfinding, routines, observation events' (#14) from server into main 2026-02-12 18:20:40 +01:00
jpmschweitzer c83d129703 Merge remote-tracking branch 'origin/main' into server
# Conflicts:
#	CHANGELOG.md
2026-02-12 18:20:32 +01:00
jpmschweitzerandClaude Opus 4.6 526696206e chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:18:17 +01:00
jpmschweitzerandClaude Opus 4.6 ad653cffc3 refactor(server): fix clippy warnings from Rust 1.93
- Use #[derive(Default)] + #[default] instead of manual Default impls
  for FacingDirection, KnowledgeState, RelationshipState, EntityVisibility
- Replace manual modulo check with .is_multiple_of()
- Collapse nested if in shadowcast symmetry check

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:18:04 +01:00
jpmschweitzerandClaude Opus 4.6 2fd16f08b0 fix(server): address PR #14 review — ordering, docs, version pin
- Fix NpcPlugin system ordering: .before(compute_paths) instead of
  .after(advance_tick) so PathRequests are picked up same frame
- Fix stale doc comment in interpretation.rs: system runs BEFORE
  knowledge events, not after
- Add TODO(v0.2) on RelationshipGraph about information boundary
  limitation for multiplayer
- Document cardinal-only movement as deliberate v0.1 choice
- Add comment on manhattan_distance u32::MAX fallback for cross-z
- Pin pathfinding crate to 4.11

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:17:55 +01:00
jpmschweitzerandClaude Opus 4.6 1761e1aa11 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:16:10 +01:00
jpmschweitzerandClaude Opus 4.6 e6bf06fb40 chore(meta): update changelog
Sprint 3 "Know" deliverables: dual lens guide, MIRROR spec, smuggler
voice card + moral arc, PC-as-NPC spec, Triangle 1 fork, content
directory structure, interaction verbs, wow moments checklist, NPC
pattern mapping, entity attribute updates, wiki maintenance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:15:55 +01:00
jpmschweitzerandClaude Opus 4.6 941547082f feat(skills): add branch-type reviewer routing to review-pr
Review-pr now selects reviewers based on branch type: server/client
get Hoshe+Tyre (code), copy gets Hoshe+Paula+Miri (narrative+lore),
visual gets Hoshe+Araminta (art direction), audio gets Hoshe+Ozzie
(player experience). Hoshe always present as QA baseline.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:15:55 +01:00
jpmschweitzerandClaude Opus 4.6 d06c0e0f4e docs(design): add smuggler voice card and moral arc spec
Wave 4 deliverable for #382 (subsumes #310):
- Voice card: register parameters, 5 anchors, 4 anti-patterns, paired
  comparison examples, display constraints, authoring checklist
- Moral arc: 4 phases (Comfort→Doubt→Reckoning→Compromise), FactId
  gates, monologue trigger rules, Kael intersection mapping

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:12:31 +01:00
jpmschweitzerandClaude Opus 4.6 d9448b5af0 docs(wiki): add Triangle 1 fork, PC-as-NPC spec, expand Drin to Tier 2
Wave 3 deliverables:
- Triangle 1 Hub Power Volume Escalation fork (#377): 3-path smuggler
  decision (escalate/stabilize/mediate), NPC state changes, ~41 dialogue lines
- PC-as-NPC unified spec (#381): starting knowledge/relationship graphs,
  tell inversion, orientation monologue, 9-step conversion checklist,
  v0.1 smuggler + detective briefs (29 items each)
- Drin Rosta Tier 2 expansion (#397): full 10-axis profile, 6 voice lines,
  formalized Triangle 2 + Triangle 5 roles

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 18:06:07 +01:00
jpmschweitzerandClaude Opus 4.6 58c7d882bc docs(design): add dual lens guide, MIRROR spec, interaction verbs, wow moments checklist, NPC pattern mapping
Wave 2 of Sprint 3 "Know":
- #261: Dual Lens Authoring Guide (7 chapters, smuggler/detective voice registers)
- #380: THE MIRROR pattern spec with Naia Tamm reference implementation
- #396: Pattern/Motivation sections added to all 18 NPC wiki pages + index
- #400: v0.1 wow moments checklist mapping 6 D-039 moments to deliverables
- #402: Interaction verb spec (7 verbs, priority resolution, architecture)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:55:57 +01:00
jpmschweitzerandClaude Opus 4.6 03884164b3 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:52:29 +01:00
jpmschweitzerandClaude Opus 4.6 9c3c32e854 feat(perception): add observation event generator
Implements ticket #239 for Sprint 3:
- ObservationTrigger enum: RoutineDeviation (NPC not at expected
  routine location), Absence (expected location visible but NPC
  missing), NewEntity (unknown entity in LOS)
- ObservationEventQueue resource with push/drain/len/is_empty
- generate_observation_events system runs after emit_observation_events
  but before process_knowledge_events so it can compare current
  snapshot against previous-tick knowledge state
- Populate PerceptionPlugin with ObservationEventQueue resource and
  system registration with correct ordering constraints

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:52:02 +01:00
jpmschweitzerandClaude Opus 4.6 0b599ed662 feat(simulation): spawn 3 NPCs with full component bundles
Implements ticket #84 for Sprint 3:
- Replace single bare NPC with 3 distinct NPCs: dock worker (16,13)
  with full 4-phase routine and MovementSpeed(2), field tech (14,18)
  with partial routine, stationary guard (18,14) with no routine
- Register all entities (player + 3 NPCs) in EntityRegistry
- Populate RelationshipGraph with colleague and rival edges
- Add NpcPlugin to app for routine system registration
- Add multi-entity visibility tests: 3 NPCs in LOS all visible,
  NPC behind wall excluded from snapshot

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:51:50 +01:00
jpmschweitzerandClaude Opus 4.6 f186cec264 fix(bridge): add error variants and diagnostic logging for IPC
Implements ticket #341 for Sprint 3:
- Add DeserializationWithDump and MutexPoisoned variants to BridgeError
- Replace .expect("mutex poisoned") with graceful error propagation
  in LocalBridge and TcpBridge (4 locations)
- Log first 256 bytes as hex dump on deserialization failure for
  debugging malformed payloads
- Classify errors in receive_bridge_inputs: BrokenPipe/ConnectionReset
  → clean shutdown, MutexPoisoned → shutdown, DeserializationWithDump
  → skip frame (recoverable)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:51:38 +01:00
jpmschweitzerandClaude Opus 4.6 f899624103 feat(simulation): add A* pathfinding and NPC path following
Implements tickets #237 and #238 for Sprint 3:
- Add pathfinding crate dependency for A* algorithm
- PathRequest component triggers compute_paths system which uses
  cardinal-neighbor A* with manhattan distance heuristic
- ComputedPath component with step navigation (next_step, advance,
  is_complete) and PathBlocked marker for no-route cases
- MovementSpeed component throttles NPC movement (ticks_per_step)
- follow_paths system advances NPCs along computed paths, creating
  MoveIntent per step; cleanup_path_blocked removes markers after
  one tick
- System ordering: input → compute_paths → follow_paths →
  validate_movement → cleanup_path_blocked → advance_tick

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:51:27 +01:00
jpmschweitzerandClaude Opus 4.6 3c04a0c568 feat(npc): add structured NPC data model, relationships, and daily routines
Implements tickets #86, #87, #88 for Sprint 3:
- Replace stub string/f32 NPC fields with typed enums and integer
  types for D-010 determinism (WantKind, SecretSeverity, Skill, etc.)
- Add RelationshipGraph global resource with BTreeMap<(StableId,
  StableId), RelationshipEdge> for efficient prefix queries
- Add DailyRoutine with phase-based RoutineEntry and PreviousDayPhase
  resource for detecting day-phase transitions
- Create NpcPlugin that initializes relationship graph, day-phase
  tracking, and registers check_phase_transition system

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:51:15 +01:00
jpmschweitzerandClaude Opus 4.6 5fdb7f9c53 docs(design): add content directory structure, update entity attributes, stub Nils Davan
Wave 1 critical blockers for Sprint 3:
- #384: Content directory structure design doc (10 sections + 2 appendices,
  defines canonical IDs, 8 JSON schemas, 3-tier validation pipeline, migration path)
- #374: Update entity-attributes.md (14→16 keys, secret→leverage rename,
  add 4 role-perspective keys, archetype interpretation note)
- #376: Nils Davan off-stage NPC stub (GHOST+HANDLER pattern, lattice messages,
  Triangle 1 role, relationship to Kael)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:45:16 +01:00
jpmschweitzerandClaude Opus 4.6 64fea5139a docs(wiki): rename Hael to Naia Tamm, apply canonical full names, standardize shortcodes
Wave 0 wiki maintenance for Sprint 3:
- #372: Rename Hael → Naia Tamm across 16 living wiki files (phonetic collision fix)
- #371: Apply canonical full names to 11 single-name NPC headers and roster table
- #375: Replace hub_m_ → terminal_m_ shortcodes, add shortcode reference table,
  situation overlap rules, and mood exclusivity rules to monologue guide

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:45:04 +01:00
jpmschweitzerandClaude Opus 4.6 1333926ac2 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:38:20 +01:00
jpmschweitzerandClaude Opus 4.6 128dd0f16d feat(skills): spawn team agents from sprint briefing in start-sprint
Replace the solo plan-mode step with team orchestration: parse the
Agents line from the sprint briefing, create a team, create tasks
from tickets with dependency chains, and spawn all listed agents as
background teammates. User confirmation gates the spawn.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:38:06 +01:00
jpmschweitzerandClaude Opus 4.6 4b180c0c0d chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:15:33 +01:00
jpmschweitzerandClaude Opus 4.6 ef091de281 docs(sprints): regenerate sprint 3 briefings from database
Previous briefings referenced tickets not assigned to sprint 3.
Rewrote all four team briefings (server, client, joint, copy) to
match actual sprint 3 ticket assignments in the database.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 17:15:16 +01:00
jpmschweitzerandClaude Opus 4.6 4e155da234 chore(meta): update changelog
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 16:54:38 +01:00
jpmschweitzerandClaude Opus 4.6 60ca9d951c feat(db): add database backup/restore tooling
- tooling/db-backup: copies shared settledreach.db to docs/backups/
  for git tracking (main branch only)
- tooling/db-install: restores from backup for new clones
- make db-backup / make db-install Makefile targets
- worktree-update skill runs make db-backup after merges on main

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 16:54:21 +01:00