docs(decisions): resolve D-035 and R-011 id collisions (pql migration prep)

Phase 0 of the pql migration: the decision markdown had two genuine
canonical-ID integrity bugs that pql decisions sync silently LWW-collapses.

- D-035 was defined twice: a content.md tag-taxonomy record and a
  perception.md shadowcasting/LOS record, both dated the same day. The
  tag-taxonomy record keeps D-035; the shadowcasting record is renumbered
  to D-238 (freshly claimed) with a Renumbered note preserving the history.
  Inbound refs repointed in architecture.md (x4), questions-architecture.md,
  and the README perception index row.
- R-011 (single currency for Phase 2) was defined three times: once
  canonically in rejected.md and twice identically in economics.md. The two
  economics.md copies are removed; rejected.md absorbs the Proposal/Raised-by
  lines and gains a dedupe note. The economics.md dissent link now points at
  rejected.md and the footer count drops the rejected-alternative clause.

Verified: tooling/db/decision check-dupes reports 0 duplicates;
pql decisions validate returns ok.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-06 11:57:29 +02:00
co-authored by Claude Opus 4.8
parent caf8f5b754
commit 5bb551b2e0
6 changed files with 13 additions and 31 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ Cross-domain decisions live in one file with cross-reference notes in related fi
| File | Domain | Decisions |
|------|--------|-----------|
| [architecture.md](architecture.md) | Technical foundation | D-008, D-009, D-010, D-012, D-020, D-026, D-030, D-031, D-041, D-042, D-054, D-055, D-066, D-068, D-073, D-085, D-088, D-094, D-096, D-097, D-099, D-100, D-101, D-102, D-103, D-106, D-108, D-109, D-113, D-133, D-134, D-135, D-136, D-137, D-141, D-148, D-149, D-150, D-151, D-152, D-188, D-191, D-192, D-194D-218, D-220 |
| [perception.md](perception.md) | Player observation | D-011, D-015, D-016, D-017, D-018, D-019, D-033, D-035, D-043, D-044, D-045, D-046, D-047, D-048, D-049, D-052, D-056, D-057, D-058, D-059, D-060, D-061, D-067, D-069, D-070, D-071, D-072, D-076, D-077, D-078, D-086 |
| [perception.md](perception.md) | Player observation | D-011, D-015, D-016, D-017, D-018, D-019, D-033, D-043, D-044, D-045, D-046, D-047, D-048, D-049, D-052, D-056, D-057, D-058, D-059, D-060, D-061, D-067, D-069, D-070, D-071, D-072, D-076, D-077, D-078, D-086, D-238 |
| [content.md](content.md) | NPC, dialogue, templates | D-023, D-024, D-025, D-028, D-029, D-032, D-034, D-035, D-036, D-037, D-050, D-062, D-063, D-064, D-074, D-075, D-084, D-090, D-092, D-093, D-095, D-098, D-104, D-105, D-107, D-121, D-122, D-123, D-124, D-125, D-126, D-127, D-128, D-129, D-130, D-131, D-132, D-138, D-139, D-140, D-142, D-147 |
| [scope.md](scope.md) | Game concept, prototype | D-001, D-003, D-005, D-006, D-007, D-013, D-014, D-027, D-038, D-039, D-051, D-053, D-065, D-087, D-089, D-091, D-114, D-115, D-116, D-117, D-118, D-119, D-120, D-145, D-146, D-153, D-154, D-155, D-156, D-157 |
| [economics.md](economics.md) | Economics layer, currencies, corporations, simulation | D-171, D-172, D-173, D-174, D-175, D-176, D-177, D-178, D-179, D-180, D-181, D-182, D-183, D-184, D-185, D-186, D-187, D-189, D-190 |
+4 -4
View File
@@ -145,9 +145,9 @@ Technical foundation decisions that constrain implementation: engine, client-ser
### D-054: Tile-based movement with same-tile occupancy
- **Date:** 2026-02-13
- **Decision:** All movement is tile-based (server-authoritative, discrete positions). Client-side Tween interpolation (100-150ms) hides the grid visually. Same-tile occupancy via TilePresence component (Standing/Prone/Seated/Fixture layers) allows multiple entities on one tile in different postures. Mouse facing is a client-side float; the server receives the facing octant only. Tile occupancy provides trivial collision detection.
- **Rationale:** Determinism ([D-010](#d-010-multiplayer-ready-architectural-baseline) principle 4). Tile-based enables shadowcasting ([D-035](perception.md#d-035-symmetric-shadowcasting-albert-ford-selected-for-los-computation)), pathfinding, chunk-based maps ([D-012](#d-012-chunk-based-map-architecture-for-future-borderless-generation)), and trivial collision. Occupancy system adds positioning depth (doorway blocking, eavesdrop positioning, sitting at furniture) within tile-based constraints. ~150 lines server-side.
- **Rationale:** Determinism ([D-010](#d-010-multiplayer-ready-architectural-baseline) principle 4). Tile-based enables shadowcasting ([D-238](perception.md#d-238-symmetric-shadowcasting-albert-ford-selected-for-los-computation)), pathfinding, chunk-based maps ([D-012](#d-012-chunk-based-map-architecture-for-future-borderless-generation)), and trivial collision. Occupancy system adds positioning depth (doorway blocking, eavesdrop positioning, sitting at furniture) within tile-based constraints. ~150 lines server-side.
- **Implementation:** TilePresence enum: Standing, Prone, Seated, Fixture. Multiple entities can share a tile if they occupy different posture layers.
- **Cross-reference:** Stance system ([D-053](scope.md#d-053-movement-as-stance-toggle-system)), shadowcasting ([D-035](perception.md#d-035-symmetric-shadowcasting-albert-ford-selected-for-los-computation))
- **Cross-reference:** Stance system ([D-053](scope.md#d-053-movement-as-stance-toggle-system)), shadowcasting ([D-238](perception.md#d-238-symmetric-shadowcasting-albert-ford-selected-for-los-computation))
- **Source:** Control & Interaction Workshop (2026-02-13)
- **Raised by:** Tyre (tile-based, non-negotiable), Dudley (tiles-per-tick model), Nigel (converted in Round 2: "tiles are BETTER for replayability — discrete positions = finite meaningful choices")
- **Dissent:** Nigel initially proposed free movement with tile-based collision (Round 1). Converted in Round 2 after demonstrating that tile-based spatial puzzles (doorway decisions, corner peeks, eavesdrop corridors) create replayability.
@@ -164,7 +164,7 @@ Technical foundation decisions that constrain implementation: engine, client-ser
### D-066: Dual-scale grid — 0.5m simulation, 1m visual (2x retina factor)
- **Date:** 2026-02-14
- **Decision:** The game uses two coordinate scales with a fixed 2x retina factor:
- **Simulation grid: 0.5m tiles.** All movement, LOS/shadowcasting ([D-035](perception.md#d-035-symmetric-shadowcasting-albert-ford-selected-for-los-computation)), pathfinding, occupancy ([D-054](#d-054-tile-based-movement-with-same-tile-occupancy)), and interaction range operate at 0.5m per sim tile. The server knows only sim tiles.
- **Simulation grid: 0.5m tiles.** All movement, LOS/shadowcasting ([D-238](perception.md#d-238-symmetric-shadowcasting-albert-ford-selected-for-los-computation)), pathfinding, occupancy ([D-054](#d-054-tile-based-movement-with-same-tile-occupancy)), and interaction range operate at 0.5m per sim tile. The server knows only sim tiles.
- **Visual grid: 1m tiles.** The Godot client renders floor art, wall art, and structural tiles as 2x2 blocks of sim tiles. Art is authored at 1m conceptual scale.
- **World geometry: 2x2 sim tile minimum.** All walls, furniture, crates, doors, and environmental objects occupy a minimum of 2x2 sim tiles (= 1 visual tile). This ensures visual truth and sim truth agree on where solid things are — cover, LOS occlusion, and collision map 1:1 with what the player sees.
- **Entities: 1x1 sim tiles.** Characters and small items occupy individual 0.5m sim tiles, giving sub-visual-tile positioning precision. Entities naturally take corners/edges within a visual tile's 1m space.
@@ -176,7 +176,7 @@ Technical foundation decisions that constrain implementation: engine, client-ser
- **Cursor/interaction:** No change — cursor already resolves to sim tile from pixel position. Interaction range of ~2 sim tiles = 1m (arm's length).
- **Map authoring:** Author at 1m visual scale. Subdivision tool expands each visual tile to 4 sim tiles (2x2). Validation enforces 2x2 minimum on all world geometry layers.
- **Amends:** OQ-01 resolution (ticket #444). Sim tile size remains 0.5m; visual presentation changes from 1:1 to 2:1 retina factor.
- **Cross-reference:** Tile-based movement ([D-054](#d-054-tile-based-movement-with-same-tile-occupancy)), shadowcasting ([D-035](perception.md#d-035-symmetric-shadowcasting-albert-ford-selected-for-los-computation)), fog ([D-059](perception.md#d-059-fog--shader-based-five-layers-knowledge-graph-driven)), art direction ([D-043](perception.md#d-043-art-direction--visual-style-functional-warmth)), z-stack ([D-049](perception.md#d-049-z-level-rendering-stack-8-layers)), stance system ([D-053](scope.md#d-053-movement-as-stance-toggle-system))
- **Cross-reference:** Tile-based movement ([D-054](#d-054-tile-based-movement-with-same-tile-occupancy)), shadowcasting ([D-238](perception.md#d-238-symmetric-shadowcasting-albert-ford-selected-for-los-computation)), fog ([D-059](perception.md#d-059-fog--shader-based-five-layers-knowledge-graph-driven)), art direction ([D-043](perception.md#d-043-art-direction--visual-style-functional-warmth)), z-stack ([D-049](perception.md#d-049-z-level-rendering-stack-8-layers)), stance system ([D-053](scope.md#d-053-movement-as-stance-toggle-system))
- **Rationale:** 0.5m sim tiles give stealth-grade granularity for movement stances, cover peeking, and interaction range. 1m visual tiles make spaces feel proportional, sprites look right, and world geometry readable. The 2x2 minimum on geometry eliminates visual/sim mismatch for cover and LOS — the only sub-visual-tile positioning is entity movement, which is communicated through fog feedback, not tile counting. Analogous to macOS Retina: logical resolution (visual) differs from physical resolution (sim), but the system is coherent because both agree on where solid objects are.
- **Raised by:** Team Leader (Jeroen) — proposed retina scaling analogy and 2x2 geometry constraint. Tyre (feasibility: trivial, half-day integration). Gestalt (approved with 2x2 constraint resolving LOS readability concern). Ozzie (approved: solves sprite scale without uncanny mismatch).
- **Dissent:** Gestalt initially objected to dual-scale (mental model mismatch for cover/LOS). Resolved by the 2x2 geometry minimum constraint — all cover maps 1:1 at visual scale.
+2 -24
View File
@@ -15,7 +15,7 @@ This domain covers: currency system, commodity taxonomy, shadow economy, corpora
- Commission fines and certification fees are Tractus-denominated (the Commission is Assembly-funded). Compact members paying Commission costs face currency conversion friction — this is a structural driver of the shadow economy in the Compact zone, not a coincidence.
- **Rationale:** Three currencies create structural economic bloc tension without requiring event generation. The Tractus/Mark divide maps directly to the Assembly vs. Compact political divide. Sol's untraceable nature makes it the natural medium for crime — it has lore grounding and mechanical function without requiring a formal exchange rate.
- **Raised by:** Full planning team, Sprint 32 Workshop #796. Lead directive on political framing.
- **Dissent:** Burnelli-Sheldon (economist) recommended single currency for Phase 2 — see [R-011](#r-011-single-currency-for-phase-2-rejected). Overruled by lead.
- **Dissent:** Burnelli-Sheldon (economist) recommended single currency for Phase 2 — see [R-011](rejected.md#r-011-single-currency-for-phase-2-economics). Overruled by lead.
---
@@ -294,17 +294,6 @@ This domain covers: currency system, commodity taxonomy, shadow economy, corpora
---
## Rejected Alternatives
### R-011: Single currency for Phase 2 (rejected)
- **Date:** 2026-04-05
- **Proposed by:** Burnelli-Sheldon (economist), Sprint 32 Workshop #796 Round 1
- **Proposal:** Use a single currency for the Phase 2 economics simulation to reduce model complexity. Exchange rate mechanics could be added in a later phase.
- **Rejected because:** Three currencies create structural economic bloc tension as an emergent property of initialization — no event generation required. The Tractus/Mark divide maps directly to the Assembly vs. Compact political divide that is already canonical lore. Deferring currencies to a later phase would require retrofitting political geography into an already-running simulation. The complexity cost of three currencies is low; the design value is high.
- **Raised by:** Lead directive overruling the recommendation.
---
### D-189: Brand Layer Architecture
- **Date:** 2026-04-10
- **Decision:** The simulation supports a brand layer above the commodity tâtonnement. Brands are NOT commodities (D-185). They consume commodities as demand nodes and are priced through an administered pricing model with cultural premium curves. The brand layer serves dual purposes: economic simulation (demand nodes, pricing, GDP contribution) and queryable localized content for client UI (bar shelves, restaurant menus, shop displays, entertainment listings).
@@ -432,15 +421,4 @@ This domain covers: currency system, commodity taxonomy, shadow economy, corpora
---
## Rejected Alternatives
### R-011: Single currency for Phase 2 (rejected)
- **Date:** 2026-04-05
- **Proposed by:** Burnelli-Sheldon (economist), Sprint 32 Workshop #796 Round 1
- **Proposal:** Use a single currency for the Phase 2 economics simulation to reduce model complexity. Exchange rate mechanics could be added in a later phase.
- **Rejected because:** Three currencies create structural economic bloc tension as an emergent property of initialization — no event generation required. The Tractus/Mark divide maps directly to the Assembly vs. Compact political divide that is already canonical lore. Deferring currencies to a later phase would require retrofitting political geography into an already-running simulation. The complexity cost of three currencies is low; the design value is high.
- **Raised by:** Lead directive overruling the recommendation.
---
*19 decisions (D-171D-187, D-189D-190), 1 rejected alternative (R-011). Domain: economics. Last updated: 2026-04-19.*
*19 decisions (D-171D-187, D-189D-190). Domain: economics. Last updated: 2026-06-06. (R-011 single-currency rejection lives canonically in `rejected.md`.)*
+2 -1
View File
@@ -109,8 +109,9 @@ How the player observes and interacts with the world: camera, fog, line-of-sight
- **Dissent:** None
- **Amendment (2026-03-17, Sprint 28 workshop):** Entity relationship color is NOT displayed via character outlines in normal gameplay. The D-033 color palette (#4a9ebb, #6bc9a6, etc.) is valid within the insert/perception mode overlay only. Normal gameplay renders all characters with uniform dark outlines. See [D-154](scope.md#d-154-character-outline-is-not-a-relationship-indicator--uniform-dark).
### D-035: Symmetric shadowcasting (Albert Ford) selected for LOS computation
### D-238: Symmetric shadowcasting (Albert Ford) selected for LOS computation
- **Date:** 2026-02-11
- **Renumbered:** 2026-06-06 — was **D-035**, which collided with a distinct same-day decision (content.md "Converged tag taxonomy for dialogue and monologue line pools"). The tag-taxonomy record keeps D-035; this shadowcasting record is now D-238. Pre-2026-06-06 references to "D-035" meaning shadowcasting/LOS point here.
- **Decision:** Albert Ford's symmetric shadowcasting algorithm is selected for all line-of-sight computation. The traditional recursive shadowcasting algorithm is rejected.
- **Resolves:** Q-018
- **Benchmark results (debug build, 1000 iterations, range 20):**
+1 -1
View File
@@ -14,7 +14,7 @@ Technical foundation questions: engine, protocols, data structures, performance,
- **Status:** Resolved → [D-031](architecture.md#d-031-time-system--game-clock-and-day-phases)
### Q-018: Shadowcasting algorithm selection
- **Status:** Resolved → [D-035](perception.md#d-035-symmetric-shadowcasting-albert-ford-selected-for-los-computation)
- **Status:** Resolved → [D-238](perception.md#d-238-symmetric-shadowcasting-albert-ford-selected-for-los-computation)
- **Question:** Which line-of-sight algorithm should be used? Symmetric shadowcasting (Albert Ford) vs recursive shadowcasting. Both are proven but differ in symmetry properties (symmetric: if A sees B, then B sees A) and implementation complexity. Requires benchmarking at 150x150 map scale with 30 entities to validate performance within 100ms tick budget.
- **Context:** D-011 mandates LOS shadowcasting for fog of perception. Architecture review identified this as unspecified (audit section 2.2). Critical for Sprint 2 perception pipeline.
- **Assigned to:** Tyre, Dudley
+3
View File
@@ -47,8 +47,11 @@ Alternatives considered and rejected, with rationale preserved for future refere
### R-011: Single currency for Phase 2 economics
- **Rejected:** 2026-04-05
- **Proposed by:** Burnelli-Sheldon (economist), Sprint 32 Workshop #796 Round 1
- **Proposal:** Use a single currency for the Phase 2 economics simulation to reduce model complexity; exchange-rate mechanics could be added in a later phase.
- **Reason:** Three currencies create structural economic bloc tension as an emergent property of initialization, requiring no event generation. The Tractus/Mark divide maps directly to the canonical Assembly vs. Compact political divide. Deferring to a later phase would require retrofitting political geography into a running simulation. Complexity cost low; design value high.
- **Raised by:** Lead directive overruling the recommendation.
- **Cross-reference:** [D-171 (economics.md)](economics.md#d-171-three-currency-system)
- **Note:** Canonical location is `rejected.md`. Two duplicate copies in `economics.md` were removed 2026-06-06 (id-collision cleanup).
### R-012: Overheard NPC conversation system (D-078) — scrapped
- **Rejected:** 2026-04-10