Docs: destructible-cover Build Spec + session log Part K — PHASE 1.5 COMPLETE

CLAUDE.md: the enemy anti-stuck nudge is now cover-aware (budget 38.5 KB).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 16:17:45 -07:00
parent bbf418e779
commit 03083eb735
4 changed files with 100 additions and 8 deletions
@@ -0,0 +1,71 @@
---
title: Destructible_Cover_Build_Spec
type: note
permalink: gamevault/03-design/destructible-cover-build-spec
---
# Destructible Cover — Build Spec (Phase 1.5 long-term #8, review-hardened, SHIPPED `bbf418e77`)
Review: `wf_e14dd739-069` (3 lenses, 28 agents). The session limit killed 18 verifiers mid-run, but the 7
completed verifications covered every DISTINCT load-bearing finding (both HIGHs + the boss/scatter/copy-paste/
HitRadius/spawn-window MEDs); the dead verifiers were lens-duplicates of the same issues. **Deliberate call:
folded without a third verify pass**, with the unverified leftovers reasoned-closed below — recorded per
[[ask-before-deferring-during-implementation]].
## Core architecture: cover IS clutter with a collider
`CoverRock.prefab` = a `BlightClutter` ghost (Variant **4**) whose root carries a baked **Environment-layer
BoxCollider**: the runtime-spawned ghost's collider joins `BuildPhysicsWorld` every tick → blocks the player
CC AND the enemy sweep (both filter on the env mask) while alive, and the gap opens the instant the entity
dies. Both hit paths break it for free (the clutter chassis); chip feedback/teardown/relevancy inherited.
Values: `Remaining=8` (8 hits to carve), `ScrapPerHit=0`, `HitRadius=1.2`, Model = `SM_Env_Rocks_Spikey_03`
@1.7 (the old cover visual; Read/Write already enabled).
## The two HIGH folds
1. **The 07-07 anti-stuck nudge deliberately phases enemies through cover rocks** (it exists to prevent room
soft-locks) — "cover blocks enemies" contradicted the shipped backstop. Fold: the nudge is **cover-aware**
(EnemyAISystem, the arm site): a 1.8 u SphereCast toward the target identifies the blocker; if it carries
`BlightClutter` (a LIVE, destructible ghost — no soft-lock possible) the phase is SUPPRESSED and the stuck
counter stays primed; static-geometry wedges nudge exactly as before.
2. **Yield==durability coupling** made tanky cover a 64-scrap/room faucet. Fold: deposit DECOUPLED from the
decrement at BOTH hit sites — `deposit = perHit > 0 ? max(1,(int)perHit) : 0` — zero means ZERO (cover),
any positive still credits ≥1 (the B1 immortal-sink regression test caught the first cut truncating 0.5→0;
the dual contract is now: fractional-positive floors to 1, exact-zero deposits nothing).
## Confirmed-MED folds
- `HitRadius=1.2` (visual core): the collider footprint would have made each rock a ~5 u shot-eating disc
(ResourceHarvest consumes any surviving projectile whose segment grazes HitRadius).
- **No cover in Boss rooms**: the boss moves only via SweptMove — NO depenetration backstop exists for it
(`EnemyAISystem`'s pass excludes BossState with a comment wrongly claiming BossAISystem owns it).
- Scatter keep-out ≥7 u from the room origin (player landing at origin+1.5·idx, portal at z5), bounded
8-attempt resample, piece dropped on failure. Count=3/room (`CoverFieldSpawner`, optional singleton).
- `Variant=4` set on the prefab and NEVER rerolled (the clutter block's 25% explosive reroll is a copy-paste
trap — the cover spawn block instantiates the prefab proto untouched).
- Old static layer REMOVED: 8 `WorldColliders_RoomCover` subscene colliders + the `RoomCover_Visuals` root in
Game.unity (double-collision + double-visual otherwise). ColliderFitTools' FitCover section is vestigial
(empty group → KEEP logs).
## Reasoned-closed (verifiers lost to the session limit; dispositions)
- *CC misprediction window on runtime-spawned blockers*: rocks spawn at room entry ≥7 u from the landing
point; the ghost replicates long before a player can cross 7 u — no practical mispredict window.
- *Depenetrate vertical-normal on hull tops*: unchanged behavior class vs the old static hulls; the fallback
chain (nudge) still exists for non-cover geometry.
- *Melee cone tests target CENTER*: rock center reachable at HitRadius 1.2 + cone range 2.6 — chippable
point-blank.
- *NodeFeedback shrink keys on Remaining*: cover shrinking as it is chipped reads as crumbling — kept.
- *Projectiles ignore colliders* (confirmed structurally): v1 cover blocks MOVEMENT, not shots — both sides'
projectiles fly over the waist-high rocks. True shot-blocking = a follow-up (cover in both projectile
sweeps). Enemy-hits-win ordering is deterministic: ProjectileDamage (predicted group, immediate playback)
runs before ResourceHarvest (plain group) — a projectile consumed on an enemy is gone before the harvest
sweep can double-destroy it.
- *Charger smashes through cover*: deliberate follow-up (contact damage from lunging chargers to cover).
## Live validation (all passed, 2026-07-10)
3 cover ghosts spawned (Variant 4, Remaining 8) with SOLID baked colliders in the CollisionWorld ·
**BLOCK**: `NudgeUntilTick` stayed 0 across 3.5 s of forced zero-progress (the old code arms at 1.5 s) ·
**DEPENETRATE**: an enemy shoved inside a live rock exited to 1.7 u · **CARVE**: the rock died to the real
projectile sweep and the spot probed OPEN (not solid) · 470/470 EditMode · console clean.