Design-review-gated (wf_ebef4e81-dba, GREEN-WITH-CHANGES). The win-driver moves
from "survive N base sieges" to "clear N expeditions". The review overturned the
literal plan: credit on RETURN, not at the clear edge (clear-edge crediting arms
the undefended final base siege -> uncontestable terminal Loss).
- ExpeditionGateSystem: now the sole production writer of GoalProgress.Charge —
a clamped +1 per cleared expedition folded into the existing once-per-epoch
reward block, reusing the LastRewardedEpoch latch (Ore + Charge share fate) +
a SaveRequest checkpoint. No new latch, no new GhostField, no ordering change.
- CyclePhaseSystem: deleted the survived-siege +1 (the AFK win path). Victory
latch unchanged; GoalReached still arms the final base siege at cap.
- CycleDirectorAuthoring + CycleDirector.prefab: ScheduleEnabled baked OFF
(retaliation-only). A serialized prefab bool ignores the C# field initializer,
so the value is flipped in the prefab, not just the code default.
- Tests: re-pointed CyclePhaseSystemTests + EndgameWinLoseTests survived-siege
assertions; extended ExpeditionGateRewardTests (+1, no-double-credit, clamp).
389/389 EditMode green; clean netcode Play smoke (no sort-cycle, Schedule=0).
SaveData stays v5. Docs: DR-042 build record + forks resolved, CLAUDE.md
base-loop line, Backlog (A done).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace every placeholder-cube ghost prefab with nested Synty (PolygonFantasyKingdom) models: ResourceNode->crystal, Turret->ballista, Wall->spike palisade, Pylon->crystal beacon, Storage->chest, UpgradePickup->gem, BlightClutter->rock chunk (nest as a Model child, strip colliders, reset the [GhostField] root Scale, atlas for bare FBXs). Gameplay subscene: place the BaseFieldSpawner, trim Harvester/Fabricator/Conveyor from the build palette. CycleDirector prefab bakes the schedule siege config. See DR-031.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>