docs(military): 📝 Improve military communications documentation with detailed ranges, delivery mechanics, and tactical coordination rules

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
autocommit 2026-05-18 18:41:41 -07:00
parent 6b0bf433f6
commit b887268eae

View file

@ -0,0 +1,161 @@
# Communications
Information about your rivals — that they exist, that they're mobilizing, that their northern hold burned last winter — physically travels through the world along the same hexes your armies do, carried by runners, beacon-chains, and resonance wires. **Knowing** is a fourth strategic resource alongside gold, production, and science. The communications tier you build (or pillage) governs how fresh your strategic picture is.
The fantasy: a Foreman dwarf hammering a wall-map while a soot-streaked runner gasps out a six-turn-old report about troop movements that, somewhere out there, have already happened.
---
## Pillars
### 1. First contact
A player only appears in another player's diplomacy panel and score table after **contact** is established. Contact occurs when either:
- a unit or city of player A has had a tile of player B's unit/city in its `VISIBLE` set for ≥1 turn, **or**
- a courier envelope between A and B's capitals has been successfully delivered (any payload).
Contact is symmetric on first witness and permanent. A `PlayerDiscovered` event fires the turn it occurs; UX shows a "FIRST CONTACT — Clan Goldvein, scouts north of the Bronze Pass" toast.
### 2. Universal courier channel
Every inter-player payload — treaty offer / accept / decline, war declaration, peace proposal, tribute demand, intel share, joint-attack plan, research-agreement payout — travels as a courier `Envelope`. Effects apply at envelope arrival (`eta_turn`), not at dispatch. The envelope wraps:
```
Envelope { sender, recipient, payload, route, dispatched_turn }
```
The route is an A* path between the two capitals, computed at dispatch using era-tier-aware terrain costs (foot-runners avoid mountains, tunnel-runners prefer caves, resonance-telegraphers ignore distance). Envelopes age, can be intercepted (severance of a required infrastructure tile on the planned path), and consume `envelope_throughput` capacity on the sender.
### 3. Perceived state
Every player carries a **PerceivedState** — what their capital "knows right now" — distinct from the underlying ground truth. When a unit sees an enemy at hex X on turn T, that observation is timestamped and queued for propagation; it arrives at the player's capital at turn:
```
T + ceil(hex_distance(observer, capital) / comm_steps_per_turn(tier))
```
Foot-runner default: 4 hex/turn. Beacon chains (LoS-connected `beacon_tower` improvements): `near_instant` (1 turn end-to-end). Resonance wires: `instant` (same-turn end-phase). The AI's tactical and strategic heuristics read PerceivedState; only its lookahead-rollouts simulate against ground truth.
A stale enemy marker on the strategic map shows a clock icon and the turn-of-last-update. A stack moving inside beacon vision draws live; one outside resyncs only when a runner gets home.
### 4. Vision-share post-delivery
Once a SharedMap or DefensivePact envelope is delivered, ongoing ally vision-share remains active only while a current courier link exists. Heartbeat envelopes auto-spawn while a share-agreement is active, keeping the link warm. Pillage a severable wire on the path → the share collapses to `SEEN_STALE` until the link is repaired; the treaty itself is not broken.
Share latency in turns equals the `comm_tier_latency` of the highest-tier infrastructure on the path: you see what your ally saw N turns ago. Resonance-wire allies share in real time; beacon-only allies share with a one-turn lag.
### 5. Information decay
Tiles that leave a player's `VISIBLE` set retain a `LastSeen` snapshot. With time, that snapshot **fades**:
| Age (turns out of vision) | Fidelity |
|---------------------------|--------------------------------------------------------------------------|
| 0 → decay_short | Biome + garrison count + improvements + city pop |
| decay_short → decay_long | Biome + "a city was here" + last_known_owner |
| > decay_long | Biome only ("you remember… mountains?") |
`decay_short` and `decay_long` scale with the observer player's comm_tier. Better comms = longer accurate memory, because patrol runners constantly refresh nearby observations. The strategic map renders aged tiles with desaturation by fidelity tier; tooltips show the last-observed turn.
### 6. Reveal events
The replay event stream carries:
- `PlayerDiscovered { discoverer, discovered, at_hex }`
- `CitySpotted { player, city_id, at_hex }`
- `UnitSpotted { player, archetype, at_hex, in_territory_of }` (debounced per stack)
- `EnvelopeDispatched / Delivered / Intercepted { payload_kind, ... }`
- `LinkSevered / LinkRestored { players, at_hex }`
- `LastSeenDecayed { player, hex, new_fidelity }` (silent — AI consumption only)
These events are the AI's only asynchronous inputs. The perception filter materializes PerceivedState by replaying events delivered up to the current turn against its memory.
### 7. Capital-loss blackout
When a player loses their capital, all in-flight outbound envelopes are dropped, comm_tier on remaining links drops by 1, and decay timers accelerate by 50% until a new seat-of-power is named. A capital siege is not just symbolic; it deafens an entire civilization for the duration of the interregnum.
### 8. Beacon-tap counter-intel
An enemy unit standing on a non-severable `beacon_tower` can **read** envelopes passing through, without blocking them. The intercepting player learns the payload; the envelope continues to its recipient. `EnvelopeIntercepted { readable: true }` fires. Beacon chains thus become a target for raiders, not only an asset for defenders.
---
## War declaration semantics
Communications speeds *strategic* response, never *self-defense*. The rules:
- The **sender** enters `War` immediately on envelope dispatch. Sender units can attack on the same turn.
- **Defenders always retaliate when struck.** Combat resolution does not gate on the defender's formal `RelationState`; this is how combat already works and is preserved. Retaliation carries no diplomatic cost.
- The **recipient's** `RelationState` flips to `War` on envelope **delivery** or **interception**, not at dispatch. Until then, the recipient cannot issue strategic war moves — wartime civics, mobilization edicts, alliance-pact triggers, the AI's "war mode" branch — because their capital does not yet know who is attacking, or that the skirmishes on the border are part of a coordinated campaign rather than a raid.
- **UX guarantee:** an "UNDER ATTACK at <hex>" toast and map-flag fires the instant any of your units takes damage, regardless of formal status. Players are never confused about whether they are being attacked — only about whether their capital yet knows *who is doing it*.
The strategic moment this creates: a high-tier attacker with resonance-wire comms can launch a credible surprise attack against a low-tier neighbour whose capital is still receiving the warning about the front-line skirmish three turns later — while the front-line units defend themselves automatically the whole time.
---
## Comm tiers
Comm tier is set by the highest-tier comms infrastructure connecting two endpoints. The tier table:
| Tier | Era | Backbone | Steps/turn | Vision-share latency | Severance |
|------|-----|----------------------------------|--------------|----------------------|-----------|
| 0 | 1 | No infrastructure (foot) | 4 | n/a | n/a |
| 2 | 2 | `messenger_post` (roads) | 5 | n/a | n/a |
| 3 | 3 | `tunnel` improvement | 6 | 3 turns | non-severable |
| 6 | 6 | `beacon_tower` (LoS chain) | 12 (near-instant) | 1 turn | destroyable (not pillage) |
| 7 | 7 | `steam_track` | 16 | 1 turn | pillage-severable |
| 8 | 8 | `resonance_wire` + `resonance_chamber` | ∞ (instant) | 0 turns | pillage-severable |
| 9 | 9 | `hold_network_citadel` mesh | ∞ + reroute | 0 turns | mesh-redundant |
The `adamantine_echo` world wonder grants `courier_delay_reduction: 1` (all outbound envelopes one tier faster) and `envelope_intercept_resistance: 0.5` (half the interception chance on severable infra).
---
## Infrastructure interactions
### Tunnels (era 3)
Plain inter-hold backbone. Couriers traversing tunnels are concealed from surface observation. Not severable — must be physically captured.
### Beacons (era 6)
Mountaintop fire-towers relay coded smoke and flame signals through a line-of-sight chain. Each beacon's vision_bonus extends ground vision around it (+2 hex). The chain forms an implicit graph; sightings inside the chain's combined vision propagate near-instantly to any connected capital. A single beacon is killable (not pillage-severable), and losing it can break the chain into disconnected sub-graphs.
### Steam tracks (era 7)
Industrial-tier message lines. Severable by pillage. Carries envelopes at tier-7 speed.
### Resonance wires (era 8)
Pairs of rune-etched stone panels transmit encoded messages as vibration through the rock itself. Instant within the same turn. Pillage-severable. The `resonance_chamber` building enables courier production and grants `envelope_throughput: 2` — a city can dispatch two simultaneous envelopes to the same recipient.
### Hold network citadels (era 9)
Wonder-tier mesh nodes. If both endpoints own a citadel, an envelope automatically reroutes around any single point of failure. The first true redundant comms layer.
---
## Player-visible signals
A successful comms layer feels like:
1. **Surprise dawn attack.** A neighbour with better comms strikes; your border garrisons fight back automatically, but your capital takes three turns to officially register the war and shift civics.
2. **Beacon ROI.** Players who fortify a beacon chain along their frontier mobilize ~34 turns faster than players who didn't. The replay can measure `time_to_first_response_unit_dispatched`.
3. **Stale-ghost misplay.** A player or AI marches a stack to a last-known enemy position and finds empty terrain. The intel was real — when it left the runner's hand. It just isn't real anymore.
4. **Pillage as a comms weapon.** Players raid a single `resonance_wire` tile specifically to sever a DefensivePact share. The `LinkSevered` event fires; ally vision collapses to `SEEN_STALE`.
5. **First-contact memorability.** Playtesters can name the turn they first met Clan Goldvein.
---
## Out of scope
- **Spies, embassies, active mis-information** — Game 2+. Active disinformation interacts with the perception filter non-trivially and demands an asymmetric-info UI that is not in Game 1 scope.
- **Magical comms, mind-link, scrying** — Game 3.
- **Archon-tier instant communications** — Game 3.
- **Worldwide news ticker** (wonder completions etc.) — UX feature, not sim. Wonder completion is global by design; unit positions are the simulated channel. The distinction is sharp on purpose.
- **Diplomatic language barriers** — single-race Game 1.
---
## Cross-references
- Hex movement and LoS rules: [`../HEX_GEOMETRY.md`](../HEX_GEOMETRY.md), [`../HEX_CONVENTIONS.md`](../HEX_CONVENTIONS.md)
- Era and tier progression: [`../../../docs/PLANET_LIFECYCLE.md`](../PLANET_LIFECYCLE.md) (era pacing) and `project_5tier_5era_system` in design memory
- Combat resolution and edge ZOC: [`../combat/COMBAT_SYSTEM.md`](../combat/COMBAT_SYSTEM.md)
- Politics and civic axes: [`../politics/AUTHORITY.md`](../politics/AUTHORITY.md), [`../politics/GOVERNMENT.md`](../politics/GOVERNMENT.md)
- Weather and observation lenses: [`../WEATHER_HISTORY.md`](../WEATHER_HISTORY.md)