Files
gogobee/gogobee_expedition_system.md
prosolis 9e1a1f606c Adv 2.0 D&D layer: Phases 1-8 + Phase 9 SP1+SP2
Combines all uncommitted D&D work into one checkpoint:

Phases 1-8 (per gogobee_dnd_session_summary.md):
- Race/class/stats system, !setup flow, !sheet, !respec
- d20-vs-AC combat with race/class passives, auto-migration
- XP/level-up, skill checks, NPC refund hooks
- Equipment slot mapping, rarity, !rest short/long
- Pre-arm active abilities, resource pools
- Bestiary, !roll/!stats/!level, onboarding DM
- Audit fixes A-I, flavor wiring under internal/flavor/
- Phase 8 weapon dice + armor AC tables (gogobee_equipment_appendix)

Phase 9 SP1 — spell system foundations:
- 79 SpellDefinitions (76 in-scope + 3 reaction-deferred)
- dnd_known_spells, dnd_spell_slots tables
- pending_cast / concentration_* columns on dnd_character
- Slot tables for Mage/Cleric/Ranger, DC + attack-bonus math
- Long-rest refreshes slots; respec wipes spell state
- Auto-grant default known list on !setup confirm and auto-migration

Phase 9 SP2 — !cast / !spells / !prepare commands:
- Out-of-combat HEAL and UTILITY resolve immediately
- Damage/control/buff queue as pending_cast for next combat
- Audit-style save-then-debit, slot refund on save failure
- !cast --drop, concentration supersession, prep-cap enforcement
- Reaction spells refused with Phase 11 note

SP3 (combat-time resolution of pending_cast) and SP4 (full prep/learn
tests) are next. Build clean, full test suite green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 14:25:21 -07:00

585 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GogoBee — Expedition System
> **Companion to:** `gogobee_dnd_design_doc.md`, `gogobee_dungeon_zones.md`
> **Version:** 1.0
> **Status:** Draft
---
## ⚠️ Protected Files — DO NOT MODIFY
All existing `*_flavor.go` / `*_flavor.txt` files are off-limits.
New expedition flavor text goes in `twinbee_expedition_flavor.go` — a new file, never edits to existing ones.
---
## 1. Design Philosophy
Single-session dungeon runs are replaced by **Expeditions** — persistent, multi-day (sometimes multi-week) explorations tied to real calendar time. An Expedition is not a sprint. It is a campaign.
### What changes
- Zones are no longer completed in one sitting. They unfold over real days.
- The player logs in each day to take actions, advance, rest, manage supplies.
- TwinBee delivers a **Morning Briefing** and an **Evening Recap** every real-world day the expedition is active.
- Resources deplete over time. Poor planning ends expeditions early.
- The dungeon has a **Threat Clock** — the longer you stay, the more aware the zone becomes.
- Some events only happen on specific days, specific times, or after specific triggers.
### What doesn't change
- All combat mechanics from the main design doc apply unchanged.
- Loot, XP, and progression work identically.
- Players can still retreat, rest, and use all existing commands.
- Zones are still the same zones with the same bosses.
---
## 2. Expedition Duration by Zone Tier
| Tier | Zone | Minimum Days | Maximum Days | Notes |
|---|---|---|---|---|
| 1 | Goblin Warrens | 2 | 4 | Shortest possible expedition |
| 1 | Crypt of Valdris | 2 | 5 | Boss requires full rest before attempt |
| 2 | Forest of Shadows | 4 | 8 | Zone scales spatially |
| 2 | Sunken Temple | 4 | 9 | Tidal event on Day 6 (see Section 7) |
| 3 | Haunted Manor | 6 | 12 | Manor fully resets every 3 in-game nights |
| 3 | The Underforge | 5 | 10 | Heat accumulation mechanic |
| 4 | The Underdark | 10 | 21 | Multi-region; truly exhausting |
| 4 | Feywild Crossing | 8 | 14 | Time distortion (see Section 7) |
| 5 | Dragon's Lair | 14 | 30 | Multi-wing structure |
| 5 | The Abyss Portal | 21 | ∞ | Portal destabilizes over time; hard exit pressure |
**Minimum days** = the absolute floor if a player advances aggressively, rests optimally, and encounters no complications.
**Maximum days** = soft cap. After this, the Threat Clock maxes out and the expedition enters **Siege Mode** (see Section 8).
---
## 3. The Expedition Day Cycle
Each real-world day an expedition is active follows this structure:
```
06:00 — MORNING BRIEFING (TwinBee)
Status summary: HP, supplies, current location,
Threat Clock level, any overnight events.
06:0021:00 — ACTIVE WINDOW
Player takes actions: advance, search, fight,
trade, camp, rest, interact with NPCs.
No hard limit on actions per day — limited by
resources, HP, and supply consumption.
21:00 — EVENING RECAP (TwinBee)
Summary of the day: rooms cleared, loot found,
XP gained, supplies consumed.
TwinBee delivers a narrative coda.
Threat Clock advances if player is in a
dangerous position.
21:0006:00 — NIGHT PHASE
Camp triggers if the player has camped.
Wandering monster check (see Section 6).
Environmental events possible (Section 7).
Supply consumption continues passively.
```
---
## 4. Supply System
Expeditions consume **Supplies** — an abstracted resource representing food, water, torches, rope, ammunition, and minor consumables. Supplies are purchased before departure and cannot be restocked mid-expedition unless a Supply Cache is found or a resupply route is established.
### 4.1 Supply Units
One **Supply Unit (SU)** represents one day's worth of basic provisions for one character.
| Zone Tier | Base SU Cost Per Day | Harsh Conditions Multiplier |
|---|---|---|
| 1 | 1 SU/day | ×1 |
| 2 | 1.5 SU/day | ×1.5 |
| 3 | 2 SU/day | ×2 |
| 4 | 3 SU/day | ×2.5 |
| 5 | 4 SU/day | ×3 |
**Harsh conditions** are triggered by: Threat Clock above 60, heat accumulation events, tidal flooding, Feywild time distortion.
### 4.2 Supply Procurement
| Source | SU Yield | Cost | Notes |
|---|---|---|---|
| Thom Krooke standard pack | 10 SU | 50 coins | Max 3 packs per expedition |
| Thom Krooke deluxe pack | 20 SU | 90 coins | Max 1 per expedition |
| Foraged (Ranger, WIS DC 12) | 1d4 SU | Free | Once per day; fails in indoor zones |
| Supply Cache (dungeon loot) | 2d6 SU | — | Random find; not guaranteed |
| NPC Trader (certain zones) | Variable | Variable | Zone-specific |
### 4.3 Supply Depletion Effects
| SU Remaining | Effect |
|---|---|
| > 25% | Normal operation |
| 1025% | Rationing: -1 to all rolls from fatigue |
| 19% | Severe rationing: -2 to all rolls; no long rests |
| 0 | Starvation: -1d4 CON per day; forced extraction if CON reaches 0 |
### 4.4 Go Data Model — Supplies
```go
type ExpeditionSupplies struct {
Current float32 `json:"current"` // current SU
Max float32 `json:"max"` // purchased at outset
DailyBurn float32 `json:"daily_burn"` // base rate for this zone tier
HarshMod float32 `json:"harsh_mod"` // multiplier if harsh conditions active
Foraging bool `json:"foraging"` // Ranger forage attempt used today
}
```
---
## 5. Camp System
Camping is the primary mechanism for long rests during an expedition. It is not free — it costs time, supplies, and exposes the player to overnight risk.
### 5.1 Camp Types
| Camp Type | Setup Requirement | Rest Quality | Supply Cost | Night Risk |
|---|---|---|---|---|
| **Rough Camp** | Any location | Partial (50% HP, no slots) | +0.5 SU | High |
| **Standard Camp** | Safe room (cleared) | Full long rest | +1 SU | Medium |
| **Fortified Camp** | Boss-cleared room or cache site | Full long rest + bonus | +2 SU | Low |
| **Base Camp** | Expedition Day 3+ in Tier 45 zones | Full long rest + extended | +3 SU | Very Low |
**Fortified Camp bonus:** +1d6 HP on wake; TwinBee narrates a peaceful night (rare flavor event).
**Base Camp:** Establishes a persistent waypoint. Player can fast-travel back to Base Camp in 1 action. Required for Tier 5 zones.
### 5.2 Camp Placement Rules
- Cannot camp in a room with active enemies.
- Cannot camp in a trap room (even if the trap is disarmed).
- Cannot camp in a Boss room (the room knows it's a boss room).
- Camping in a non-cleared room = Rough Camp regardless of intent.
### 5.3 Go Data Model — Camp
```go
type CampState struct {
Active bool `json:"active"`
Type string `json:"camp_type"` // rough, standard, fortified, base
RoomID string `json:"room_id"`
EstablishedAt time.Time `json:"established_at"`
NightEvents []string `json:"night_events"` // log of overnight occurrences
}
```
---
## 6. Wandering Monster System
During the **Night Phase**, if the player has camped, a wandering monster check fires. The result depends on camp type and Threat Clock level.
### 6.1 Wandering Monster Table
Roll 1d20 + Threat Clock modifier:
| Roll | Outcome |
|---|---|
| 15 | Peaceful night. TwinBee narrates quiet. |
| 610 | Signs of passage. No encounter; Threat Clock +2. |
| 1114 | Minor encounter: 12 low-CR enemies from zone roster. Player wakes to combat. |
| 1517 | Standard encounter: standard zone enemy group. |
| 1819 | Elite encounter: Elite-tier enemy from zone. |
| 20+ | Ambush: enemy has surprise round. Elite-tier. TwinBee delivers a terse, sleep-interrupted narration. |
**Threat Clock modifier:** +1 per 10 points of Threat Clock above 30.
### 6.2 Rough Camp Night Risk Modifier
Rough Camp adds +3 to all wandering monster rolls.
### 6.3 Avoiding Night Encounters
- **Ranger passive:** -2 to all wandering monster rolls while in a wilderness zone.
- **Rogue passive:** On a roll of 1114, may attempt a Stealth check (DC 14) to avoid the encounter entirely.
- **Fortified Camp:** -4 to all wandering monster rolls.
---
## 7. Zone-Specific Temporal Events
These events fire on specific expedition days, times, or conditions. They are not random — they are scheduled by the zone and announced by TwinBee in advance (vaguely).
### 7.1 Sunken Temple — Tidal Event (Day 6)
On Expedition Day 6, the tidal cycle peaks. All flooded rooms gain:
- +1d6 cold damage per turn while wading
- Kuo-toa enemies gain +2 AC and +1d4 to attack rolls
- Supply burn doubles for 24 hours (water infiltration)
TwinBee warns on Day 4: *"The water is rising. Something about the rhythm of it has changed."*
TwinBee warns on Day 5: *"Tomorrow the temple will be fully claimed by the tide. Plan accordingly."*
If the player has reached the Boss room before Day 6: no event fires.
### 7.2 Haunted Manor — Nightly Reset (Every 3 In-Game Nights)
Every third night in the Manor, non-boss rooms respawn one enemy (not a full reset — one enemy per room, chosen from zone roster). This represents the house reasserting itself.
TwinBee notes on Night 2: *"The house has been quiet. That will not last."*
On Night 3 morning: *"Overnight, something moved back in. Several somethings, actually."*
### 7.3 The Underforge — Heat Accumulation
Each day spent in the Underforge adds 1 Heat Stack (max 10). Effects:
| Heat Stacks | Effect |
|---|---|
| 13 | Flavor only ("the air shimmers") |
| 46 | +1d4 fire damage at start of each combat round |
| 79 | Disadvantage on CON saves; Supply burn +50% |
| 10 | Exhaustion: -2 to all rolls; forced 24hr rest or extraction |
Heat stacks reduce by 2 per long rest in a Fortified Camp. Full extraction resets all stacks.
### 7.4 The Feywild Crossing — Time Distortion
Time in the Feywild is unreliable. Each day the player enters an Exploration Room, roll 1d6:
| Roll | Time Effect |
|---|---|
| 12 | Normal day passes |
| 34 | Half-day: only 0.5 SU consumed; next room generates instantly |
| 5 | Double-day: 2 SU consumed; an extra wandering monster check fires |
| 6 | Time Loop: player re-enters the same room (new enemies; loot already taken) |
TwinBee tracks time distortion and reports it in the Morning Briefing with increasing bewilderment.
### 7.5 Dragon's Lair — Awareness Pulses
Infernax sleeps lightly. Every 3 days, an Awareness Pulse fires:
- Kobold patrols increase by 1 enemy per active room
- Threat Clock +10
- TwinBee delivers an Awareness Pulse narration (see `twinbee_expedition_flavor.go`)
On Day 14: Infernax wakes. If the player has not reached the Boss room by Day 14, Infernax begins active hunting — wandering monster checks occur every 6 hours and may produce a Dragon encounter (CR 15 young dragon proxy) until the player reaches the final chamber.
### 7.6 The Abyss Portal — Destabilization
The portal grows unstable over time. Each day, Portal Instability increases by 5 (starts at 0, max 100).
| Instability | Effect |
|---|---|
| 020 | Normal operations |
| 2140 | Psychic pressure: -1 to WIS rolls |
| 4160 | Reality warps: rooms occasionally shift order |
| 6180 | Demon surges: wandering monster check every 12 hours |
| 8199 | Unraveling: -2 to all rolls; Supply burn doubles |
| 100 | Collapse: player is forcibly extracted; expedition fails; portal requires a new event to reopen |
Instability is reduced by 10 for each major story objective completed in the zone.
---
## 8. The Threat Clock
The Threat Clock (0100) represents how aware the zone's faction has become of the player's presence. It is the dungeon's version of stealth — the longer you're here, the more organized the opposition becomes.
### 8.1 Threat Clock Modifiers
| Event | Threat Change |
|---|---|
| Combat in a new room | +5 |
| Enemy killed before raising alarm | +0 |
| Enemy escapes combat | +10 |
| Player uses loud ability (Fireball, Thunderwave) | +8 |
| Rogue uses Stealth to move between rooms | -3 |
| Long rest in Fortified Camp | -5 |
| Boss defeated | -20 |
| Day passes in zone | +3 |
| TwinBee Mood: Wrathful | +5/day additional |
| TwinBee Mood: Elated | -3/day |
### 8.2 Threat Clock Thresholds
| Level | Threshold | Effect |
|---|---|---|
| Quiet | 020 | No modifications. TwinBee describes an unaware zone. |
| Stirring | 2140 | Enemies in uncleared rooms gain +1 to Perception; wandering monster +1 |
| Alert | 4160 | Enemies gain +2 AC; wandering monster +2; reinforcements possible |
| Hostile | 6180 | All enemies have initiative advantage; room traps re-arm |
| Siege | 81100 | **Siege Mode** (see Section 8.3) |
### 8.3 Siege Mode
When Threat Clock hits 100, the zone enters Siege Mode:
- All rooms with cleared enemies respawn one enemy (once)
- Boss gains +20 HP and Legendary Resistance +1
- Supply burn doubles
- No short rests possible (too dangerous)
- TwinBee delivers a Siege Mode narration and does not sugarcoat it
- Siege Mode cannot be reduced — it is the dungeon's final form
TwinBee begins warning at Threat Clock 70:
*"They know you're here. Not a suspicion anymore. A certainty. The question now is whether you finish before they organize."*
### 8.4 Go Data Model — Threat Clock
```go
type ThreatClock struct {
Level int `json:"level"` // 0100
SiegeMode bool `json:"siege_mode"`
LastUpdated time.Time `json:"last_updated"`
Events []ThreatEvent `json:"events"`
}
type ThreatEvent struct {
Timestamp time.Time `json:"timestamp"`
Delta int `json:"delta"`
Reason string `json:"reason"`
}
```
---
## 9. Expedition State Model
```go
type Expedition struct {
ID string `json:"id"`
PlayerID string `json:"player_id"`
ZoneID string `json:"zone_id"`
StartDate time.Time `json:"start_date"`
CurrentDay int `json:"current_day"`
Status string `json:"status"` // active, extracting, complete, failed
CurrentRegion string `json:"current_region"`
CurrentRoomID string `json:"current_room_id"`
RoomsCleared []string `json:"rooms_cleared"`
BossDefeated bool `json:"boss_defeated"`
Supplies ExpeditionSupplies `json:"supplies"`
Camp *CampState `json:"camp"`
ThreatClock ThreatClock `json:"threat_clock"`
TemporalStack int `json:"temporal_stack"` // zone-specific (heat, instability, etc.)
Log []ExpeditionEntry `json:"log"`
LootCollected []string `json:"loot_collected"`
XPEarned int `json:"xp_earned"`
GMMood int `json:"gm_mood"`
LastActivity time.Time `json:"last_activity"`
}
type ExpeditionEntry struct {
Day int `json:"day"`
Timestamp time.Time `json:"timestamp"`
Type string `json:"type"` // action, combat, rest, event, narrative
Summary string `json:"summary"`
Flavor string `json:"flavor"` // TwinBee line for this entry
}
```
---
## 10. Extraction
Extraction is leaving the zone before completion — intentionally or by force.
### 10.1 Voluntary Extraction
Command: `!extract`
- Player may extract at any time from any cleared room.
- Extraction costs 1 in-game day (finding the way out).
- Player keeps all loot and XP earned to that point.
- Expedition marked as Incomplete — can be resumed (see Section 10.3).
- TwinBee delivers an extraction narration.
### 10.2 Forced Extraction
Triggered by: HP reaching 0, supplies reaching 0, Abyss Portal collapse.
- Player loses 20% of coins earned during expedition (chaos tax).
- All loot carried out is kept.
- Expedition marked as Abandoned.
- Cannot be resumed — must restart.
- Threat Clock resets to 20 on re-entry (zone remembers you, but time has passed).
- TwinBee delivers a forced extraction narration (respectful; never mocking).
### 10.3 Expedition Resume
Voluntarily extracted expeditions can be resumed within **7 real days**:
- Resumes from the last cleared room.
- Supplies must be repurchased (what was carried is gone — you extracted).
- Threat Clock resumes at extraction value.
- Zone-specific temporal stacks (Heat, Instability) resume at extraction value.
- TwinBee delivers a return narration: *"Back again. TwinBee noted the door. TwinBee notes it opening."*
After 7 days, the expedition expires and must restart.
---
## 11. Multi-Region Zones (Tier 45)
The Underdark, Dragon's Lair, and Abyss Portal are too large for a single dungeon map. They are divided into **Regions**, each functioning as a sub-dungeon.
### 11.1 Region Structure
Each Region contains:
- Its own room sequence (Entry → Exploration → Trap → Exploration → Elite → Boss)
- A **Region Boss** (not the Zone Boss — a mid-tier milestone)
- A potential **Base Camp** site (unlocked after clearing Region Boss)
- Region-specific enemies (subset of zone roster)
- Region-specific loot table
### 11.2 Region Progression
| Zone | Regions | Region Boss |
|---|---|---|
| The Underdark | Surface Tunnels → Drow Outpost → Illithid Warren → The Deep Throne | Drow Elite Captain → Mind Flayer Elder → Ilvaras Xunyl (Zone Boss) |
| Dragon's Lair | Kobold Warrens → Drake Pens → The Vault → Infernax's Chamber | Kobold Warchief → Elder Drake → Infernax (Zone Boss) |
| The Abyss Portal | Outer Rift → Demon Assembly → The Warden's Post → The Tear | Vrock Commander → Nalfeshnee → Belaxath (Zone Boss) |
### 11.3 Region Transitions
Moving between regions costs 1 full in-game day of travel. TwinBee narrates the transition with specific regional flavor. Supply burn applies during travel. Wandering monster check fires once during transit.
### 11.4 Go Data Model — Region
```go
type ExpeditionRegion struct {
ID string `json:"id"`
ZoneID string `json:"zone_id"`
Name string `json:"name"`
Order int `json:"order"`
Cleared bool `json:"cleared"`
BossDefeated bool `json:"boss_defeated"`
BaseCampSite bool `json:"base_camp_site"`
EnemySubset []string `json:"enemy_subset"`
LootTable []LootEntry `json:"loot_table"`
FlavorRef string `json:"flavor_ref"`
}
```
---
## 12. TwinBee Daily Briefing & Recap Format
### 12.1 Morning Briefing (06:00)
```
🎭 TwinBee — Morning Briefing, Day [N]
📍 Location: [Zone Name] — [Region if applicable] — [Room description]
❤️ HP: [current] / [max]
🎒 Supplies: [SU remaining] / [SU max] ([days remaining estimate])
⏰ Threat: [Threat Clock level] — [Threshold name]
🌡️ [Zone stack]: [Heat/Instability/Time value if applicable]
[Overnight events, if any — TwinBee narrates what happened while you slept]
[TwinBee morning flavor line — see twinbee_expedition_flavor.go]
Available actions: [!advance] [!search] [!camp] [!rest] [!extract] [!status]
```
### 12.2 Evening Recap (21:00)
```
🎭 TwinBee — Evening Recap, Day [N]
Today's progress:
Rooms cleared: [N]
Enemies defeated: [N]
Loot found: [item list or "nothing notable"]
XP earned: [N]
Supplies used: [N SU]
[TwinBee evening narrative — see twinbee_expedition_flavor.go]
[Camp prompt if player hasn't camped: "You should rest. The dungeon does not."]
```
---
## 13. Expedition Milestones & Bonus Rewards
Milestones reward players who engage with the expedition's full arc rather than rushing.
| Milestone | Trigger | Reward |
|---|---|---|
| First Night | Survive Night 1 | +50 XP; TwinBee delivers a "you're still here" line |
| Cartographer | Search every room before advancing | Bonus loot roll in next Elite room |
| Patient Zero | Complete expedition without Threat Clock above 50 | +10% XP bonus on zone complete |
| Survivalist | Complete Tier 3+ expedition with no forced extraction | Unique title + cosmetic item |
| Week One | Expedition Day 7 survived | +200 XP; Thom Krooke discount next visit |
| Two Weeks | Expedition Day 14 survived | +500 XP; permanent +1 to primary class stat |
| The Long Game | Complete a Tier 5 zone | Legendary item guaranteed; TwinBee delivers a personal note |
---
## 14. Expedition Commands Reference
| Command | Description |
|---|---|
| `!expedition start <zone>` | Begin a new expedition (opens supply purchase flow) |
| `!expedition status` | Full expedition status summary |
| `!expedition log` | Last 5 expedition log entries with TwinBee narration |
| `!advance` | Move to next room (costs time; triggers encounters) |
| `!retreat` | Return to previous cleared room |
| `!search` | Search current room (Perception/Investigation check) |
| `!camp <type>` | Establish camp (rough / standard / fortified / base) |
| `!rest short` | Short rest at current location |
| `!rest long` | Long rest (requires Standard camp or better) |
| `!supplies` | Check supply status and daily burn rate |
| `!threat` | Check Threat Clock level and current threshold |
| `!extract` | Begin voluntary extraction |
| `!resume` | Resume a previously extracted expedition |
| `!map` | Display expedition progress as ASCII region/room map |
---
## 15. Implementation Phases — Expedition System
### Phase E1 — Core Infrastructure
- [ ] `Expedition` struct and DB schema
- [ ] Real-time day cycle engine (06:00/21:00 triggers)
- [ ] Morning Briefing and Evening Recap generation
- [ ] `!expedition start`, `!expedition status` commands
- [ ] Supply system (procurement, depletion, effects)
- [ ] Basic camp system (rough and standard)
### Phase E2 — Threat Clock & Night Phase
- [ ] Threat Clock state machine
- [ ] Wandering monster system
- [ ] Night phase event resolution
- [ ] Siege Mode implementation
- [ ] Fortified Camp and Base Camp
### Phase E3 — Zone Temporal Events
- [ ] Tidal Event (Sunken Temple)
- [ ] Nightly Reset (Haunted Manor)
- [ ] Heat Accumulation (Underforge)
- [ ] Time Distortion (Feywild)
- [ ] Awareness Pulses (Dragon's Lair)
- [ ] Portal Destabilization (Abyss Portal)
### Phase E4 — Multi-Region Zones
- [ ] Region system and region boss structure
- [ ] Region transition (travel day, supply burn, encounter)
- [ ] Base Camp as persistent waypoint
- [ ] Underdark, Dragon's Lair, Abyss Portal region maps
### Phase E5 — Extraction & Resume
- [ ] Voluntary extraction flow
- [ ] Forced extraction flow
- [ ] Expedition resume (7-day window)
- [ ] Expedition log persistence
### Phase E6 — Milestones & Polish
- [ ] Milestone tracking and reward delivery
- [ ] `twinbee_expedition_flavor.go` full population (briefings, recaps, event narrations)
- [ ] ASCII map renderer (multi-region aware)
- [ ] Pete bot expedition update posts (daily highlights for Matrix room)
---
*End of Expedition System Document.*
*Reference alongside all companion docs in Claude Code sessions.*