Two diplomacy models contradicted each other in the written record: p1-01
diplomacy-lite ('all pairs start at war, missing key → war') vs the newer
courier-diplomacy (COMMUNICATIONS.md §War declaration semantics, p3-01:
start at peace, sender enters War on war-dec envelope dispatch). The Rust
implementation follows courier-diplomacy, so that is canonical.
- p1-01: add a SUPERSEDED banner + inline [SUPERSEDED] annotations; history
retained. Canonical rule is start-at-peace, war via dispatched war-dec.
- COMMUNICATIONS.md: fix the one internal inconsistency (§0 said recipient
war state applies at arrival in a way that read as all-effects-at-arrival;
scoped it to recipient-side, cross-linked the sender-on-dispatch exception).
- New objective p3-16 (status partial, owner warcouncil): the AI has no
proactive war-declaration — decide_tactical_actions has no diplomacy step
and there is no DeclareWar in mc-ai, so AI-vs-AI never enters war and clan
aggression personalities don't manifest. Specs the fix to the courier model
(first-contact + military balance + aggression → dispatch_war_declaration)
and notes the stale is_at_war comment as a code-fidelity cleanup.
- Register p3-16 under warcouncil; regen objectives dashboard.
Co-Authored-By: Claude Opus 4.8 <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