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>
- DR-042 (new): canonical loop re-shape — win-driver moves from base-siege
survival to expedition clears; blind scheduled siege retired; base siege
becomes retaliation consequence. Build order A (coherence) -> B (retaliation)
-> C (legibility) -> D (Slice 4 persistent meta).
- Backlog/Path_to_Fun/Home reconciled to the expedition-driven direction;
Slice 3 + Combat Depth marked built.
- DR-036 (END-2) flagged superseded-in-part; DR-034 (END-1) repurposed (Core
is a consequence, not the win-gate); DR-037 forward-pointer to DR-042.
- CombatFeedbackSystem: fix enemy health bar (sprite-less Filled Image ignored
fillAmount -> size via anchorMax.x).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Completes the Combat Depth slice on top of the MC-2 server spine (56cf60cce):
MC-3 impact juice (client, observe-only):
- 7 FeelConfig fields + ResetDefaults; magnitude-scaled player-dealt-hit camera
PunchFov on the enemy-Health-decrease edge (camera-only hit-stop, never timeScale).
- Spitter Kind==2 aim-LANE telegraph (BuildLaneMesh) — reads baked SpitterState
client-side, falls back to a fixed length. True freeze + material flash deferred.
Content / wiring:
- SpitterProjectilePrefabAuthoring (the SpitterProjectilePrefab singleton).
- Both directors rebuilt to a 4-entry KIND-INDEXED roster [Grunt,Charger,Spitter,
Swarmer] + mix/MaxAlive config + the SpitterProjectileConfig singleton in the subscene.
- Real rigged models: EnemySpitter (re-skinned Kaiju, ranged poker) + EnemySwarmerUndead
(Undead-Werewolf, fast/low-HP); grunt/charger keep Werewolf/ChargerMuscle. EnemySpit =
ownerless interpolated ghost (no Health, no collider).
Post-impl adversarial review fixes (wf_febdcfdb-665):
- [MED] in-band fire gate: the Spitter committed its telegraph from ANY range (fired while
advancing from far). Now commits only when sInBand || sCornered (gives CorneredRange a
real read site) — a Spitter out-of-band holds fire and repositions.
- [LOW] EnemyProjectileDamageSystem early-returns on !ServerTick.IsValid (sibling parity).
- [LOW] EnemyAuthoring bake-time guard: errors if a prefab composes both Charger+Spitter
(would match zero AI passes -> never move).
- [LOW] tests: Spitter brain fires from Expedition (kills the Base==0 region false-green);
a direct partition-exclusion test replaces the order-masked claim; added out-of-band +
cornered negative tests.
388/388 EditMode green + two Play smokes (clean boot, fire, swept-hit, region, server==
client; rigged Kaiju spitter bakes + fires with zero console errors). Accepted as-is
(documented in DR-041): global spit soft-cap, co-op punch attribution.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds the server-authoritative mechanics for three new enemy archetypes on top of
the Grunt/Charger base, plus the weighted wave-composition that introduces them:
- Spitter: a ranged Husk variant (SpitterState) that holds a preferred range-band
(advance/retreat/hold via EnemyAIMath.BandVelocity) and fires a telegraphed,
dodgeable EnemyProjectile. New server EnemyProjectileMoveSystem (integrate +
store LastStep) + EnemyProjectileDamageSystem (region-filtered swept hit-test
rebuilt from LastStep — DR-018 anti-tunnelling; players use HitRadius, structures
a const radius; at-most-once destroy). Concurrent-spit soft cap, soft-fail retry.
- Swarmer: marker tag + deterministic cluster spawn (1 slot = 1 pack;
EnemyAIMath.ClusterOffset), MaxAlive counts ENTITIES so a pack defers if it
won't fit.
- 4-type weighted mix: MixBands -> ZoneEnemyMath.WaveSlots/KindForSlot/
PackSizeForSlot drives both the expedition director and (fork-4a) the base siege,
with a mandatory MaxAlive cap. Legacy WaveSize/IsChargerSlot kept + parity-tested.
- Discriminator stays component-presence (no enum in Bursted systems): query-
partition guards keep each enemy moved by exactly one EnemyAISystem pass
(sole-Position-writer). EnemyTelegraph.IsCharger -> Kind byte for the client cue.
New authoring (Spitter/Swarmer/EnemyProjectile) + expanded director authorings with
tunable mix/cluster defaults. 13 new EditMode tests (mix composition + legacy parity,
band/cluster math, projectile move + cross-region + swept anti-tunnelling regressions);
full suite green before commit.
Dormant until the prefab/subscene wiring lands (next): the new systems guard on
TryGetSingleton/RequireForUpdate, so with no prefabs wired the new types stay inert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reactivate the dormant Expedition region as a procedural combat venue.
v1 loop: walk the gate -> fight an epoch-seeded enemy wave in the
expedition -> clear -> return -> flat Ore reward (once per epoch) ->
escalated retaliation base siege.
- New sim types: ZoneEnemyTag, ZoneEnemyDirector (+ ZoneEnemyPrefab
buffer), ZoneEnemyState, ZoneEnemyMath (grunt->charger composition
by epoch). ZoneEnemyDirectorSystem (server, Burst): drip-spawns the
wave at a deterministic ring under a MaxAlive cap while a player is
out and the base is Calm; marks ClearedThisEpoch on a real clear.
[UpdateAfter(ExpeditionFieldSystem)] only (avoids a sort cycle).
- BLOCKER 1: EnemyAISystem region-filters target selection (player +
structure snapshots gain parallel region lists; no base structures /
no Core fallback for expedition husks).
- BLOCKER 3: WaveSystem, ThreatDirectorSystem timeout cull, and
CyclePhaseSystem DefendCleared + Core-breach cull all count/cull
RegionTag{Base} husks only (the breach cull was caught region-blind
by the post-impl review: a base breach wiped the live expedition
wave and spuriously paid the reward).
- BLOCKER 4: reward de-duped via CycleRuntime.LastRewardedEpoch +
ClearedThisEpoch; ExpeditionGateSystem deposits RewardOre once/epoch.
- ExpeditionFieldSystem teardown also culls zone enemies + region-
guards the clutter loop. Subscene wired with the director + roster.
368/368 EditMode green + clean netcode Play smoke. Docs: DR-040 ->
built, session log, CLAUDE.md cross-region tag-reaudit rule.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Slice 2 complete: Warrior/Ranger, DRG-asymmetric, aim-directed cone, menu picker,
class carrier via GoInGameRequest. Two VFX-polish items deferred (review-sanctioned).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Foundation for Two Classes (DR-037). New ids (CharacterId.Warrior/Ranger,
AbilityId.WarriorCone, StatTarget.MeleeDamage/MeleeRange); CharacterStatsRef.Id ->
[GhostField] so the owning client folds the right class stats; MeleeComboSystem
folds per-player MeleeDamage/MeleeRange off the replicated StatModifier buffer
(HasBuffer-guarded -> identity without class seeds, so behavior-preserving).
345/345 EditMode. Slice 2 design review + locked forks logged in the session note.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DR-038 records Slice 1 (combat readability + HUD declutter) with the two reusable
netcode patterns: bake-client-safe for client-needed/server-owned/never-changes
data (EnemyTelegraph), and a [GhostEnabledBit] derived once/tick (IsLunging). Open
item: the operator visual fun-gate. Session log captures the design redirect +
Slice 1 build/validation.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Playtest of the single-arena slice (Scratch Notes 6152026) found it stale fast.
Answer the post-END-2 Decision Gate as continue/expand: re-scope off the fixed
June-30 demo to a co-op roguelite-ARPG — base = persistent buildable hub (never
resets), the procedural Expedition region = the required combat spine, two classes
(Warrior/Ranger), persistent meta (SaveData v6 later). Mission-as-Sortie model:
fulfils locked pillar #4, preserves the never-a-run-reset pillar; reverses DR-031's
expedition pause. Backed by an 8-agent design+feasibility pass (feasibility GREEN:
server-spawns-ghosts removes seed replication). Slice doc archived/superseded.
See DR-037.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Validated the 6.5 upgrade: 342/342 EditMode tests pass, no compile/Burst/
source-gen errors, and a clean netcode Play boot (ServerWorld+ClientWorld
connect, NetworkId handshake, in-game, ghost replication synced 23==23,
player owned-ghost spawned) -> the 6.6.0a6 "invalid wrapped network
interface" transport bug does NOT affect 6.5-stable. URP 17.5 render clean
(magenta scan 0/1564). The MaterialLocation.External FBX-import warnings are
benign 6.5 deprecation noise (2737 importers), import-time only.
Updates the CLAUDE.md stack table to 6.5.0 (net -13 bytes, under budget) and
adds the full session log.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Path A spine COMPLETE (14/14): Backlog SL-3 blocker cleared + marked done; Path_to_Fun END-2 done + banner; Milestones END-2 row. CLAUDE.md gains the END-2 gotcha line (replicate the outcome, don't client-derive; SiegeTimeout off during the final), net-zero via EB-1/EB-2/END-1/M7/inventory/build-grid condensations (40,445 then 40,510 w/ history note, under the 40,960 limit). DR-036 + session log capture the design, the operator forks (halt+banner, Target=4, SaveData v5), and the pre-coding + post-impl adversarial reviews.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
DR-034 records the losable-Core decisions: CoreIntegrity on the global ghost,
the soft-loss edge inside CyclePhaseSystem, the Core-as-fallback-target and
despawn-on-breach forks, the transient OverrunTick (vs END-2's latching
outcome), and SaveData v4. Session log captures the build + validation
(330/330 EditMode; Play-verified server==client drain->regen->replicate).
CLAUDE.md adds the END-1 bullet; EB-1/EB-2/inventory bullets condensed
net-neutral to stay under the size budget.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
DR-033 records the felt-spend design (shared Charge ammo, atomic soft-fail,
ledger-fed Fabricator, no-ordering-edge trade-off, global HUD cue, no SaveData
bump). CLAUDE.md adds the EB-2 ★ bullet net-zero (trimmed bullets archived to
the gotchas archive under a 2026-06-12 heading).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Session log + DR-031 (base-local mining, any-attack harvest, scheduled base sieges, Synty asset swap) capturing the diagnosis, locked operator forks, both adversarial reviews, and the tuning knobs. CLAUDE.md: base-local loop is now the model (BaseFieldSpawnSystem + harvest region-routing + ThreatDirector Schedule source); net-neutral condensation of M7/biome/HUD reference bullets.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Session log for the PrototypeCameraRig walk-shift fix: root cause, the separate-view-position fix, genre research (Diablo/PoE/Hades/Cinemachine), and the live-tunable knobs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
MC-1 fun-gate PASSED (kill-switch cleared); MC-4 built as the combo-chain melee primary-verb variant, both adversarial reviews folded in. Roadmap MC-1/MC-4 status updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bring the living docs up to 2026-06-08 reality (Milestones/Backlog/Home/Systems_Index were stalled at 2026-06-06): add the 6 missing Milestones rows (animation, enemy animation, HUD Synty skin, world redo, world collision, Inventory+Equipment Phase 0/1); declutter Backlog to open-work-only (remove shipped [x] items whose context lives in their DRs/session logs, resolve items completed by later slices, surface Inventory/Equipment Phase 2-4 as next); refresh Home links (DR range -> DR-027, latest sessions); add a Systems_Index Items/Inventory/Equipment section + fix the stale 'StructureType 2-4 reserved for M7' note + a pointer to systems documented only in their DRs.
Reconcile DR-026's roadmap (mark Phase 0/1 done; the Phase-1 line now carries the DR-027 event-driven supersession note). Trim Data_Driven_Abilities resolved open-questions + fix cross-links. DRs + session logs (the historical record) untouched apart from that one DR-026 note.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DR-027 records the architecture (reuse AbilityRef/StatModifier; event-driven server-only equip supersedes DR-026's per-tick sketch), the 7 validated decisions, the inline-mod + reserved-SourceId fixes, and the MaxHealth-gear / session-only notes. Folds the equipment pointer into CLAUDE.md's inventory bullet net-zero (39925 bytes, >1KB headroom) by trimming the persistence/M7/ability-tier bullets.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DR-026 records the architecture (data-driven catalog + replicated buffers + reuse of the StatModifier/RPC machinery), the Phase 0-4 roadmap, the 7 validated decisions, and the deliberate gameplay choices (personal-harvest pivot, automation asymmetry, session-only inventory). Adds the Build-section inventory pointer to CLAUDE.md net-zero (39923 bytes, >1KB headroom) by condensing the persistence/world/HUD bullets; trimmed wording archived to the gotchas archive.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Session log + DR-025 for the off-world natural-frontier world redo; mark PolygonNatureBiomes in-use in the Synty inventory; archive the long-form gotchas (PNB ring-mesh white-torus, edit-mode region-fog preview, EG-entity vs cosmetic, execute_code DeleteAsset block, shadow-cast hygiene). CLAUDE.md: net-zero art pointer to DR-025 (39882 B, under the 40KB budget).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CLAUDE.md was 42126 bytes (over its own 40960-byte context-load limit). Trimmed to 39437 (1523B headroom): kept the stack/assembly tables, all high-recurrence hazards, bootstrap/DOTS/testing/guardrails; condensed the verbose mega-bullets to their essence + existing [[DR-###]] pointers; collapsed the redundant Memory table into a link to [[Documentation_Protocol]].
Added a 'Maintaining this file (size budget)' section so future edits self-enforce the limit (size-check commands, archive-don't-delete rule, net-zero rule).
Appended a dated, byte-faithful verbatim snapshot of the pre-trim CLAUDE.md to Docs/Vault/_Meta/CLAUDE_Build_Gotchas_Archive.md (headings demoted to nest) so nothing is lost from the vault. Verified via a 4-auditor workflow: archive complete + integrity pass; 1 condensation distortion + 2 nuance losses caught and fixed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DR-023 decision record (client-derived enemy animation, monster-mash roster,
EnemyRigTools, WaveSystem scale-fix, GUID-preserving rebuild) + session log +
Synty_Asset_Inventory (enemy-grade table + future-dev catalog for the 14 new
packs). CLAUDE.md: add the enemy-animation gotchas bullet and condense several
build-gotcha bullets back below pre-session size.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add BefourStudios SciFi environment packs, Gabriel Aguiar VFX, and the
ShaderCrew Toon Shader embedded packages, plus combat/enemy/wave/death
gameplay systems and supporting vault docs/screenshots.
Rename 11 vendor textures from uppercase .PNG/.HDR to lowercase so the
case-sensitive Git LFS filters (*.png/*.hdr) match on case-sensitive
filesystems (Linux CI, case-sensitive macOS), not just locally where
core.ignorecase=true masks the gap. Each .meta moved with its asset so
GUID references are preserved. All ~1000 binaries tracked via LFS.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>