view_json now carries real inter-player trades — the headless "simulator provides
everything" goal is met. A player-like the headless adapter sees territory (step 2) AND
trades (this step) from the projected view, no GDScript re-derivation.
- view.rs: DiplomacyView gains trade_deals: Vec<TradeDealView> ({kind, you_receive,
you_give, gold_per_turn}, described from the viewer's perspective; serde skip-if-empty
for wire stability).
- projection.rs build_diplomacy: populates trade_deals from the persisted
state.trade_ledger swap/sale agreements (LuxurySwap/StrategicSwap/ResourceSale) for the
viewer↔counterpart pair, via swap_deal_view/sale_deal_view helpers (correct give/receive
direction; sale gold signed + for seller, − for buyer).
Verified: projection_surfaces_trade_deals_from_ledger (luxury swap direction + sale
buyer/gold); mc-player-api 171/0. (Disk filled mid-step from cargo target — cargo clean
reclaimed 9.5GiB; tests re-run from a clean build.)
p3-25 steps 1-5 DONE: view_json now carries territory + real trades, sourced fully in
Rust. Step 6 (live game adopts the unified PlayerView) reframed as a large separate
follow-on — the headless view-completeness this objective targets is achieved.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| designs | ||
| experiments | ||
| future-games | ||
| handoffs | ||
| history | ||
| objectives | ||
| reports | ||
| screenshots | ||
| tasks | ||
| team-leads | ||
| AGE-OF-DWARVES-FEATURES.md | ||
| audio-sourcing-checklist.md | ||
| audio-status.md | ||
| CHANGELOG.md | ||
| gdlintrc.local | ||
| README.md | ||
| ROADMAP.md | ||
| SCREENSHOT_REGISTRY.md | ||
| TERMINOLOGY.md | ||
.project/ — Directory Map
Build-process docs for Magic Civilization. Each file owns exactly one responsibility. Status of work-in-flight is tracked only in objectives/ (SSoT).
File / dir → responsibility
| Path | Responsibility | Rule |
|---|---|---|
README.md |
This map | Maintained by hand when structure changes |
ROADMAP.md |
Phase sequence + scope per milestone | Never carries status; references objective IDs only |
TERMINOLOGY.md |
Glossary (terms, acronyms, design vocabulary) | Facts only, no status |
CHANGELOG.md |
Dated narrative events (append-only) | References objective IDs; never restates status |
objectives/ |
Single source of truth for current state | One .md per objective, YAML frontmatter status: field |
objectives/README.md |
Dashboard index (grouped by P0/P1/P2) | Generated by tools/objectives-report.py — do not hand-edit |
tasks/milestones/ |
Per-milestone work packages (scoping docs) | HOW, not WHAT-DONE |
tasks/topics/ |
Cross-cutting topic work (balance tuning etc.) | HOW, not WHAT-DONE |
tasks/deferred/ |
Parked work packages | HOW, not WHAT-DONE |
handoffs/ |
Agent-to-agent context transfer | YYYYMMDD_slug.md |
history/ |
Archived one-off docs (reports, snapshots, obsolete plans) | YYYYMMDD_slug.md; immutable once filed |
reports/batches/ |
Autoplay batch output | Tool artifacts |
reports/simulation/ |
Simulator reports | Tool artifacts |
reports/screenshots/ |
Proof screenshots | Tool artifacts |
future-games/ |
Game 2 design drafts | Out of scope for Game 1 |
gdlintrc.local |
Local gdlint overrides | Config |
Invariants
- Status lives in
objectives/*.mdfrontmatter, nowhere else. - ROADMAP, CHANGELOG, tasks/ may reference objective IDs; they may not restate status.
objectives/README.mdis machine-generated from frontmatter. Regenerate after any objective edit:python3 tools/objectives-report.py.history/is append-only. Archived files get aYYYYMMDD_prefix and are never edited in place; if a superseding doc is needed, create a new one.
Quick regen
python3 tools/objectives-report.py # rebuilds objectives/README.md from frontmatter