docs(workshops): Control & Interaction Workshop outputs

Workshop notes (2 rounds), outcomes document (13 decisions, 27 tickets,
v0.1 interaction model), and updated brief with final lead direction.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-14 09:34:49 +01:00
co-authored by Claude Opus 4.6
parent c28d9b6501
commit 5c3c2a527b
4 changed files with 1582 additions and 96 deletions
@@ -0,0 +1,395 @@
# Workshop Outcomes: Control & Interaction Scheme
**Workshop:** Control & Interaction Scheme — "How Does the Player Touch the World?"
**Date:** 2026-02-13
**Rounds:** 2 + final lead calls
**Participants:** Gestalt, Ozzie, Tyre, Stig, Dudley, Paula, Araminta, Nigel
**Documenter:** Qatux
**Full notes:** `docs/workshops/control-interaction/workshop-notes.md`
---
## Decisions Produced
This workshop produced 13 decisions ready for formalization. Suggested D-NNN IDs and domain file assignments below.
### D-053: Movement as stance toggle system (scope.md)
- **Decision:** Movement uses a stance toggle ladder: Sprint / Walk / Careful / Crouch / (Prone future). Toggle-based, not hold-to-activate. Each archetype has a default stance via MovementProfile component. All characters have access to all stances. Prone: toggle out only in normal play; future combat allows "hit the deck" quick-entry.
- **Rationale:** Stances compose with perception (sprint = tunnel vision, careful = heightened awareness) and with the tile-based eavesdropping system. Toggle avoids modifier-key fatigue.
- **Raised by:** Lead (final call), building on Gestalt (triad), Dudley (MovementProfile), Nigel (character-defining speed)
- **Server values (Dudley):** Walk = 1 tile/2 ticks. Sprint = 1 tile/1 tick. Careful = 1 tile/3 ticks. Crouch TBD.
- **Perception coupling (Gestalt + Ozzie, endorsed by lead):** Sprint suppresses interpretation (monologue at 40%), not data (overlays still render). Careful enhances monologue (150%) and grants "tell notice bonus." Composable via multiplicative formula: `movement_modifier * perception_load_modifier`.
- **Dissent:** None after lead call. Nigel's character-differentiation concern addressed by MovementProfile (different defaults per archetype).
### D-054: Tile-based movement with same-tile occupancy (architecture.md)
- **Decision:** All movement is tile-based (server-authoritative, discrete positions). Client-side Tween interpolation (100-150ms) hides the grid. Same-tile occupancy via TilePresence component (Standing/Prone/Seated/Fixture layers) allows multiple entities on one tile in different postures. Mouse facing is client-side float; server receives facing octant only.
- **Rationale:** Determinism (D-010). Tile-based enables shadowcasting, pathfinding, and trivial collision. Occupancy system addresses Nigel's emergent positioning needs (doorway blocking, eavesdrop positioning, furniture interaction) within tile-based constraints. ~150 lines server-side.
- **Raised by:** Tyre (tile-based, non-negotiable), Dudley (tiles-per-tick), Nigel (converted: "tiles are BETTER for replayability — discrete positions = finite meaningful choices")
- **Dissent:** None. Nigel initially proposed free movement (Round 1) but converted in Round 2 after seeing how tile-based spatial puzzles create replayability.
### D-055: Sprint explicitly suppresses interaction buffer (architecture.md)
- **Decision:** When in Sprint stance, the server explicitly clears the interaction buffer. No interaction verbs are computed or sent to the client during sprint. Anomaly monologue survives sprint (Ozzie's "sprint double-take").
- **Rationale:** Mouse gymnastics to click during sprint = bad UX. Explicit suppression is cleaner and deterministic. "Sprint double-take" preserves the feel that the character is still aware even when the player can't interact.
- **Raised by:** Dudley (explicit suppression), Ozzie (anomaly survival)
- **Dissent:** Gestalt argued physics handles it naturally (player passes through interaction radius too fast to click). Lead ruled explicit suppression for clarity.
### D-056: Cursor states — insert-styled geometric (perception.md)
- **Decision:** Four cursor states using the neural insert's geometric visual language (Araminta's spec):
- Default: four thin inward-pointing ticks, bloom, white-blue #c8d0e0
- Entity hover: ticks expand outward (150ms), corner brackets frame entity, shifts to D-033 relationship color, verb tooltip in insert styling
- Object hover: ticks rotate 45 degrees to X-shape, muted grey #8b8ba0 (amber #e8c547 if flagged)
- Weapon aim: hard transition, ticks extend, center gap widens, lines thicken 1px to 2px, warm white #f0e8d8, NO bloom. Entity in sights tints to D-033 color.
- All transitions 150ms linear, z-layer 7, never changes by zone or narrative state (D-045).
- Cursor changes on LOS, not just proximity (Stig). Click range: ~2 tiles. Weapon-selected mode suppresses interaction prompts unless Shift held (Ozzie: "combat intent trumps social intent").
- **Rationale:** Diegetic — cursor is the insert's own interface element. Consistent with D-048 (insert overlay aesthetic). Entity in weapon sights tinting to D-033 creates moral friction (aiming at a friend should feel wrong).
- **Raised by:** Araminta (visual spec), Stig (UX rules), Ozzie (weapon suppression)
- **Dissent:** None.
### D-057: Entity interaction — vertical list, insert-styled (perception.md)
- **Decision:** Entity interactions use a compact vertical list (not radial). 2-4 options max, anchored to entity position. Insert-styled with Araminta's aesthetic. New options (unlocked by knowledge changes) highlighted with gradient glow background. Radial menu reserved for world menu only.
- **Rationale:** Variable-length text options (e.g., confrontation lines in character voice) break radial spatial memory. List handles 1-4 options cleanly. New-item glow signals "something changed" without the UX hazard of geometry transforming under the cursor. Labels render on z-layer 6 (insert overlay) — diegetic test: labels disappear if insert is off.
- **Raised by:** Stig (vertical list structure + diegetic test), Araminta (insert aesthetic). Lead resolved in Stig's favor on structure, Araminta's on styling.
- **Dissent:** Araminta argued for spoke radial (geometry transformation signals qualitative change). Lead rejected — moving goalpost under cursor is bad UX during aiming.
- **References:** Disco Elysium (world-embedded indicators), Darkwood (minimal cursor), Rimworld (right-click context list).
### D-058: World menu — radial, 4 spokes (perception.md)
- **Decision:** Right-click opens a radial world menu. Four spokes: Observe (eye icon), Insert (phone), Comms (signal), Wait (clock). Drag-release for power users, click-click for newcomers. Insert-styled: geometric lines, thin spokes with icons, nearly transparent. Renders on z-layer 6. v0.1: 2 spokes only (Observe + Insert).
- **Rationale:** Radial works for world menu because items are fixed categories that don't vary by knowledge state. Spatial memory builds quickly (~10 minutes). Scaling to 5-6 spokes is straightforward.
- **Raised by:** Stig (structure + implementation), Araminta (insert aesthetic)
- **Dissent:** None.
### D-059: Fog — shader-based, five layers, knowledge-graph-driven (perception.md)
- **Decision:** Fog is a shader-driven system (not particles) with five distinct layers:
1. Clear (vision cone): soft gradient edge 3-4 tiles, no hard line (Darkwood approach)
2. Light fog (peripheral): desaturated 40-50%, brightness -30%, animated Perlin noise (8-10s cycle), entity D-033 colors visible but reduced
3. Deep fog (explored): near-monochrome, ~10% zone temperature tint (bar=warm, hub=cool, corridor=neutral), more pronounced noise (15-20s cycle)
4. Unexplored + maps app: geometric wireframe outlines #333340
5. Unexplored, no maps: solid near-black #12141a
- Fog is knowledge-graph-driven: same fog shows different information per character based on their KG. "Fog is not darkness — it's the absence of your attention."
- Sound pings: 2-3 concentric expanding rings (sonar-style), insert white-blue. Loud = 3 rings bright fast, quiet = 1 ring faint slow. Fade over 1.5s.
- Recognized entity in fog: D-033 color glow + faint identifying silhouette feature + 0.8s breathing pulse + half-tile position drift (approximate, not exact).
- Unrecognized entity: neutral grey #555566 blob, no features.
- Performance: <1ms/frame total. Vision cone = PointLight2D. Fog = darkness + noise shader on CanvasGroup (Layer 5).
- Soft perception degradation (diegetic scan-line interference) at high overlay load, replacing hard mode cap.
- **Rationale:** Fog must be crucial in v0.1 (lead directive). KG-driven fog is the primary replayability mechanism — same corridor, different character, different information visible. Shader approach confirmed technically trivial by Tyre.
- **Raised by:** Araminta (visual spec), Tyre (technical validation), Nigel (replayability case), Gestalt (signal framework)
- **Dissent:** None.
### D-060: Cognitive delay for fog recognition (perception.md)
- **Decision:** When the player recognizes a heard/sensed entity in fog, recognition is NOT instant. Single cognitive delay: 0.6s base, 0.3s when observe_anomaly triggers (urgent context). Values are tunable. Monologue fires DURING the delay ("Those footsteps... that's Kael's walk"), not after. Visual transition: grey blob to D-033 color + silhouette over ~0.3s within the cognitive delay window. Natural recognition (organic resolve) feels different from sensor recognition (digital snap with biometric ID).
- **Rationale:** Recognition should feel like a cognitive event, not a UI update. The delay creates a moment where the player's brain and the character's brain are working together. Context-sensitive urgency (0.3s for anomalies) prevents the delay from feeling sluggish in tense situations.
- **Raised by:** Ozzie (timing values + urgency split, adopted), Gestalt (longer values, not adopted but playtesting may adjust), Araminta (visual transition spec)
- **Dissent:** Gestalt proposed 0.8-1.2s (longer, more contemplative). Lead chose Ozzie's shorter values as starting point, tunable.
### D-061: Dialogue box — bottom screen, max 20% height, no portraits (perception.md)
- **Decision:** Dialogue occupies the bottom of the screen, max 20% height, max-width (not percentage-based). Layout: NPC speech top, player response options below, left-aligned. Max 3 response options visible. NO portraits (NPC is on screen). Monologue floats ABOVE the dialogue box on z-layer 7 — spatial separation allows monologue to contradict dialogue visually. Walk-away via WASD, dialogue fades over 300ms, no close button.
- **Rationale:** Game world stays live above the dialogue box. The player sees the NPC's body language while talking — no portrait needed. Monologue above + dialogue below = the character can think one thing while saying another. Max 3 options + invisible locks = player never knows what they're missing.
- **Raised by:** Stig (UI spec), Lead (20% height constraint, max-width directive)
- **Dissent:** Stig initially proposed 25% height and 50% width centered. Lead constrained to 20% height and max-width.
### D-062: Invisible locked dialogue options (content.md)
- **Decision:** Dialogue options the player hasn't unlocked are completely invisible. No grayed-out options. No lock icons. No hint that more options exist. Exception: NPC holding back is communicated via monologue ("She changed the subject. Fast."), not via locked UI elements.
- **Rationale:** Four reasons (Gestalt): (1) Asymmetry — you don't know what you don't know. (2) Dopamine — new options appearing on repeat visits IS the reward. (3) Anti-metagaming — no checklist to complete. (4) Confrontation surprise — Confront option appearing for the first time is a dramatic moment. Strongest consensus point of the entire workshop.
- **Raised by:** Gestalt (proposal + rationale), Nigel (emphatic reinforcement: "non-negotiable")
- **Dissent:** None. Unanimous across all 8 participants.
### D-063: Confrontation — same box, different weight (content.md)
- **Decision:** Confrontation uses the same dialogue UI as casual conversation. No separate confrontation mode. Different weight communicated through: (1) italic text in character's internal voice for confrontation options (regular: "Shift schedule" / confrontation: *"I saw you in corridor B-7"*), (2) pre-delivery monologue beat (1-2s: *"This changes things. No taking it back."*), (3) world responds — NPC shifts to Tier 2 animation, entity D-033 color may fade, monologue frequency spikes, available topics narrow. Walk-away mid-confrontation contaminates social space (NPC routine shifts, KG records incompleteness). v0.1 staging: proximity check + audio dip + text styling. Camera tighten deferred.
- **Rationale:** Confrontation should feel heavy because of what you're saying, not because the UI changed. The weight comes from pacing, voice, and consequence.
- **Explicitly NOT:** Separate confrontation UI, timed responses, visible relationship meter, correct/incorrect approaches.
- **Raised by:** Paula (mechanism), Ozzie (physical staging), Stig (UI container)
- **Dissent:** None.
### D-064: Walk-away — three-phase consequences (content.md)
- **Decision:** Walking away from dialogue (WASD during conversation) triggers three phases: (1) Immediate break — dialogue fades over 300ms, silence. (2) NPC reacts — animation shifts, may call after you, routine may change. (3) KG records — incompleteness is logged (confrontation initiated but not completed), queryable, affects future dialogue/monologue/NPC behavior. Walk-away consequences vary by NPC tolerance threshold per seed — no universal social rules to metagame.
- **Rationale:** Walking away is an action with meaning. Leaving mid-confrontation is different from leaving mid-smalltalk. The KG recording means the game remembers what you started.
- **Raised by:** Paula (three phases), Stig (WASD mechanic, 300ms fade), Ozzie (consequences), Nigel (tolerance per seed)
- **Dissent:** None.
### D-065: Smuggler inventory — knowledge-primary with physical evidence (scope.md)
- **Decision:** Knowledge is the primary "inventory" for all characters. The smuggler additionally gets a minimal physical inventory: 3 specific items in v0.1 (manifest copy, corridor access token, personal comm log). Capacity per archetype: smuggler 3-4 slots, detective 2. Carried items are PRIVATE (info boundary — not visible to other entities unless revealed via search/scan/confrontation). UI: pocket icons bottom-right, 40x40px, no empty slots displayed. Verbs: Take, Place. Server: carried items are world entities with CarriedBy component.
- **Evidence presentation differs by archetype (Paula):** Detective sees case-file-style (structured, what/where/when/source/confidence, insert suggests links). Smuggler sees personal notebook (organized by person, informal voice, no contradiction flags). Same underlying KG, different presentation layer.
- **Rationale:** Smuggler's word doesn't carry institutional weight — they need tangible proof. Detective's word IS evidence (institutional authority), so they're mostly KG-only. Three items demonstrate the risk/reward concept and differentiate the smuggler's gameplay loop.
- **Raised by:** Lead (smuggler needs inventory), Paula (three items + presentation split), Gestalt (knowledge-primary framework), Tyre (minimal implementation), Dudley (server model + info boundary)
- **Dissent:** Tyre initially argued zero physical items in v0.1 (saves 3-4 sprints). Adapted with SmallVec<3> implementation.
---
## Decisions Endorsed (Confirmed from Prior or This Workshop)
These were raised in the workshop and confirmed, but may overlap with or extend existing decisions:
| Topic | Status | Reference |
|-------|--------|-----------|
| Signal/answer framework for information access | New principle — recommend formalization | Gestalt R1, Ozzie R1 |
| Eavesdrop: passive base + positioning enhances quality | Extends D-018 | Dudley R2 (ListeningFocus) |
| Two-phase verb computation (simulation max then observer filter) | Architecture pattern | Dudley R1 |
| SP auto-pause for implant, overlay for MP | Extends D-009 implications | Tyre R1, Lead final |
| Implant organized by data type, not quest | UX principle | Ozzie R1 |
| No highlights on implant data | UX principle | Ozzie R1 |
| Soft perception degradation (diegetic), not hard cap | Extends D-017 | Araminta R2, Lead LD-04 |
| MovementProfile per archetype | Extends D-053 | Dudley R2 |
| Message history: design KG schema now, build display later | Scope constraint | Stig R2, Paula R2, Lead LD-09 |
| Sprint double-take (anomaly monologue survives sprint) | Extends D-055 | Ozzie R2 |
---
## v0.1 Minimum Viable Interaction Model
### Control Map
| Input | Action | Stance/Context | Notes |
|-------|--------|---------------|-------|
| WASD | Move | Current stance | Tile-based, Tween interpolated 100-150ms |
| Toggle key (TBD) | Cycle stances | — | Sprint / Walk / Careful / Crouch |
| Mouse movement | Facing direction | All | Client-side float, server gets octant |
| Left click | Default interaction | Non-weapon | Context: cursor state determines action |
| Left click | Fire | Weapon aim | Cursor = weapon reticle |
| Right click | World radial menu | All | v0.1: 2 spokes (Observe, Insert) |
| Scroll wheel | Zoom | All | Fog boundaries unchanged |
| WASD during dialogue | Walk away | Dialogue open | 300ms fade, 3-phase consequences |
| Shift (with weapon) | Suppress interaction | Weapon selected | Hold to interact while armed |
### Stance Table
| Stance | Speed | Monologue Rate | Noise | Interaction Buffer | v0.1 |
|--------|-------|---------------|-------|--------------------|------|
| Sprint | 1 tile/1 tick | 40% (urgent only) | Loud | CLEARED (D-055) | Yes |
| Walk | 1 tile/2 ticks | 100% (normal) | Normal | Active | Yes |
| Careful | 1 tile/3 ticks | 150% + tell notice bonus | Quiet | Active (enhanced) | Yes |
| Crouch | TBD | TBD | Very quiet | Active | Yes (D-054 occupancy) |
| Prone | TBD | TBD | Minimal | TBD | No (future) |
### Cursor States (D-056)
| State | Visual | Color | z-layer |
|-------|--------|-------|---------|
| Default | Four thin inward ticks, bloom | #c8d0e0 | 7 |
| Entity hover | Expand outward, corner brackets, verb tooltip | D-033 color | 7 |
| Object hover | Rotate 45 degrees (X-shape) | #8b8ba0 / #e8c547 | 7 |
| Weapon aim | Extend, gap widens, 2px, NO bloom | #f0e8d8 | 7 |
### Fog Layers (D-059)
| Layer | Treatment | Key Values |
|-------|-----------|------------|
| Clear | Soft gradient edge | 3-4 tiles |
| Light fog | Desaturated, Perlin noise | 40-50%, 8-10s cycle |
| Deep fog | Near-monochrome, zone temperature | ~10% tint, 15-20s cycle |
| Unexplored + maps | Geometric wireframe | #333340 |
| Unexplored | Solid black | #12141a |
### Entity Interaction (D-057)
| Element | Spec |
|---------|------|
| Menu type | Vertical list, insert-styled |
| Max options | 2-4, anchored to entity position |
| New option highlight | Gradient glow background |
| Trigger | LOS + ~2 tiles proximity |
| Diegetic test | Labels on z-layer 6, disappear if insert off |
### World Menu (D-058)
| Element | Spec |
|---------|------|
| Menu type | Radial, 4 spokes (v0.1: 2) |
| v0.1 spokes | Observe (eye), Insert (phone) |
| Full spokes | + Comms (signal), Wait (clock) |
| Interaction | Drag-release or click-click |
### Dialogue (D-061, D-062, D-063, D-064)
| Element | Spec |
|---------|------|
| Position | Bottom screen, max 20% height |
| Width | Max-width (not percentage) — value TBD |
| Layout | NPC speech top, options below, left-aligned |
| Max options | 3 visible |
| Locked options | Invisible (D-062) |
| Portraits | None |
| Monologue | Floats above dialogue (z-layer 7) |
| Confrontation | Same box, italic voice, 1-2s monologue beat |
| Walk-away | WASD, 300ms fade, 3-phase consequences |
### Smuggler Inventory (D-065)
| Element | Spec |
|---------|------|
| Model | Knowledge-primary + physical evidence |
| Capacity | Smuggler 3-4, Detective 2 |
| v0.1 items | Manifest copy, corridor access token, personal comm log |
| UI | Pocket icons, bottom-right, 40x40px, no empty slots |
| Verbs | Take, Place |
| Info boundary | Carried items private |
### Fog Recognition (D-060)
| Element | Spec |
|---------|------|
| Cognitive delay | 0.6s base, 0.3s urgent |
| Monologue timing | Fires DURING delay, not after |
| Visual transition | Grey to D-033 color + silhouette over ~0.3s |
| Natural recognition | Organic resolve |
| Sensor recognition | Digital snap with biometric ID |
| Position accuracy | Half-tile drift (approximate) |
### Server Performance Budget
| System | Budget | Source |
|--------|--------|--------|
| Full tick pipeline (9 steps) | <0.5ms/tick | Dudley |
| Fog rendering | <1ms/frame | Tyre |
| Client overlay composition (4 modes) | ~7-11ms/frame | Tyre |
---
## Implementation Priorities
### Priority 1: Core Movement and Interaction (Server)
*Estimate: ~5-6 days server (Tyre)*
1. Stance system (Sprint/Walk/Careful/Crouch) with tick-based movement values
2. MovementProfile component per archetype
3. Sprint interaction buffer suppression (D-055)
4. Same-tile occupancy (TilePresence with posture layers) (~150 lines)
5. Two-phase verb computation extension (ObjectType component, KG-gated Phase 2)
6. Cognitive delay system for fog recognition (0.6s/0.3s, tunable)
### Priority 2: Core UI and Rendering (Client)
*Estimate: ~8-10 days client (Tyre)*
1. Cursor state machine (4 states, Araminta spec, 150ms transitions)
2. Fog shader (5-layer Araminta spec, CanvasGroup Layer 5)
3. Fog entity visualization (sound pings, recognized/unrecognized, cognitive delay animation)
4. Entity interaction vertical list (insert-styled, z-layer 6, diegetic test)
5. World radial menu (2 spokes: Observe, Insert)
6. Dialogue box (max 20% height, max-width, NPC speech + options + monologue)
7. Walk-away mechanic (WASD detection, 300ms fade)
### Priority 3: Smuggler Systems
1. Minimal inventory (SmallVec or BTreeMap, Take/Place, info boundary)
2. Pocket-icon UI (bottom-right, 40x40px, no empty slots)
3. Three smuggler items (manifest copy, access token, comm log) — content definition
4. Contraband detection (NPC scan checks carried items + KG)
### Priority 4: Perception and Audio
1. Eavesdrop positioning (ListeningFocus accumulates stationary_ticks) — deferrable per Dudley
2. Sprint double-take (anomaly monologue survival)
3. 6 new audio assets (cursor hover, weapon mode, fog recognition, implant open/close, dialogue emerge, confrontation dip)
4. Confrontation staging (proximity + audio dip + text styling)
### Priority 5: Deferred (Design Now, Build Later)
1. InteractionMemory KG schema for message history (LD-09)
2. Archetype-specific evidence presentation (detective case file vs smuggler notebook)
3. Pre-dialogue proximity acknowledgment (NPC turns, ambient line)
4. Camera tighten for confrontation staging
5. Prone stance
6. Perception mode soft degradation (scan-line interference)
---
## Open Questions Deferred to Implementation
These questions were not resolved in the workshop and should be addressed during implementation:
| # | Question | Owner Suggestion |
|---|----------|-----------------|
| OQ-01 | Tile size in world units? | Tyre/Dudley |
| OQ-07 | No insert = no interaction prompts? (Diegetic test implication) | Stig/Gestalt |
| OQ-08 | False-positive fog shapes: gameplay or atmospheric? | Gestalt/Araminta |
| OQ-09 | Zone temperature memory: server-tracked or client-only? | Tyre/Dudley |
| OQ-10 | Sensor recognition "different monologue voice": text styling or narrator tone? | Paula/Stig |
| OQ-13 | No data highlights in implant — how does player know new data was added? | Ozzie/Stig |
| OQ-14 | Scan effectiveness varies per character seed: different data or different actions? | Gestalt/Dudley |
| OQ-18 | Nigel's dialogue access tiers vs D-041 confidence hierarchy: same or layered? | Paula/Gestalt |
| OQ-21 | Archetype evidence presentation: skin on same app or different apps? | Stig/Paula |
| OQ-24 | Inventory capacity: 3 slots (Tyre) or 4 (Dudley)? | Lead call needed |
| OQ-25 | Stance name: "Careful" or "Sneak"? | Lead call needed |
| OQ-26 | Multiplicative perception formula: actual modifier values? | Gestalt/Dudley |
| OQ-27 | Soft perception degradation threshold? | Araminta/Gestalt |
| OQ-28 | InteractionMemory KG schema design? | Paula/Dudley |
| OQ-29 | Dialogue max-width: pixel value? | Stig/Lead |
| OQ-30 | 14 audio assets: who creates them, when in sprint schedule? | Inigo/Si |
---
## Suggested Tickets
For SI to process and assign to sprints:
### Server Team
| # | Title | Scope | Estimate | Depends On |
|---|-------|-------|----------|------------|
| T-1 | Implement stance system (Sprint/Walk/Careful/Crouch) | D-053 | 2-3d | — |
| T-2 | MovementProfile component per archetype | D-053 | 1d | T-1 |
| T-3 | Sprint interaction buffer suppression | D-055 | 0.5d | T-1 |
| T-4 | Same-tile occupancy (TilePresence layers) | D-054 | 1-2d | — |
| T-5 | ObjectType component + verb sets per type | D-057 (server) | 1d | — |
| T-6 | Two-phase verb computation: KG-gated Phase 2 | D-057 (server) | 1-2d | T-5 |
| T-7 | Cognitive delay system for fog recognition | D-060 | 1d | — |
| T-8 | Smuggler inventory (BTreeMap/SmallVec, Take/Place, info boundary) | D-065 | 1-2d | — |
| T-9 | Contraband detection (scan + KG check) | D-065 | 0.5d | T-8 |
| T-10 | ListeningFocus (eavesdrop positioning) | D-053 ext | 1d | T-1 (deferrable) |
| T-11 | Walk-away KG recording (confrontation incompleteness) | D-064 | 0.5d | — |
| T-12 | Sprint anomaly monologue (double-take) | D-055 ext | 0.5d | T-3 |
### Client Team
| # | Title | Scope | Estimate | Depends On |
|---|-------|-------|----------|------------|
| T-13 | Cursor state machine (4 states, Araminta spec) | D-056 | 2d | — |
| T-14 | Fog shader (5-layer, CanvasGroup Layer 5) | D-059 | 3-4d | — |
| T-15 | Fog entity visualization (pings, recognized/unrecognized, delay anim) | D-059, D-060 | 2d | T-14, T-7 |
| T-16 | Entity interaction vertical list (insert-styled) | D-057 | 1-2d | T-13 |
| T-17 | World radial menu (2 spokes v0.1) | D-058 | 1d | — |
| T-18 | Dialogue box (max 20% height, max-width) | D-061 | 2d | — |
| T-19 | Dialogue response selection (max 3, invisible locks) | D-062 | 1d | T-18 |
| T-20 | Confrontation text styling (italic voice, monologue beat) | D-063 | 1d | T-18, T-19 |
| T-21 | Walk-away mechanic (WASD detect, 300ms fade) | D-064 | 0.5d | T-18 |
| T-22 | Smuggler pocket-icon inventory UI | D-065 | 1d | T-8 |
| T-23 | Stance toggle UI (keybind, HUD indicator) | D-053 | 0.5d | T-1 |
### Audio Team
| # | Title | Scope | Estimate | Depends On |
|---|-------|-------|----------|------------|
| T-24 | 6 interaction audio assets | D-059, D-060, D-061 | 2-3d | — |
### Design/Content Team
| # | Title | Scope | Estimate | Depends On |
|---|-------|-------|----------|------------|
| T-25 | Define 3 smuggler item specs (content/attributes/interactions) | D-065 | 1d | — |
| T-26 | InteractionMemory KG schema design | D-064, LD-09 | 1d | — |
| T-27 | Archetype evidence presentation spec (detective case file vs smuggler notebook) | D-065 | 1d | — |
---
## Replayability Validation
Nigel's Round 2 scenario trace validates the v0.1 interaction model against D-027 replayability criteria:
- **10-minute scenario, two characters (smuggler vs detective), same world state**
- **12 points of divergence, zero scripted branching**
- All divergence emerges from knowledge graph differences interacting with: tile-based positioning, fog visibility, verb sets, dialogue access tiers, evidence presentation, and inventory constraints
- Passes the second-playthrough test: playing again as a different character reveals genuinely different information, interactions, and available actions
---
## Cross-Layer Interaction Chains (Workshop Validated)
Five chains documented in workshop notes demonstrate how the layers compose:
1. **Eavesdropping Loop:** Careful stance > tile positioning > ListeningFocus > monologue > KG update > new dialogue options
2. **Fog Recognition Loop:** Sound/sensor detection > cognitive delay (0.6/0.3s) > monologue during delay > KG query > identity resolution or blob remains
3. **Confrontation Chain:** KG contradiction > monologue signal > approach NPC > pre-dialogue beat > dialogue > confront option (italic) > monologue beat > delivery > world responds > KG records
4. **Smuggler Evidence Loop:** Eavesdrop > KG records discrepancy > terminal access > raw data (no highlights) > player notices > Take physical item > info boundary (private) > risk/leverage
5. **Sprint Double-Take:** Sprint through corridor > interaction suppressed > routine monologue suppressed > anomaly detected > delayed monologue > player decides: double back or continue
---
*Workshop closed. 13 decisions produced (D-053 through D-065). 27 suggested tickets across server, client, audio, and design teams. Full discussion notes at `docs/workshops/control-interaction/workshop-notes.md`.*
*Compiled by Qatux.*