Docs: CLAUDE.md — stale-refresh + no-still-catches-a-temporal-bug rules (net-zero paid)
Two new MCP-workflow rules earned the hard way during the A0 gate. Paid for by condensing the enemy-slide history and the LANTERN direction bullet into the gotchas archive, which also records the full A0-gate lessons. Corrected while there: the direction bullet still said the engine fork was OPEN and must be surfaced before world code. DR-053 closed that on 2026-08-07 — PARKED, Unity stays. 39850 bytes, 1110 headroom. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -512,3 +512,44 @@ the `/art-dev` cookbook; CLAUDE.md keeps a one-line pointer.
|
||||
- **★ Skinned ATTACHMENTS onto an existing rig (07-16 suit-kit recipe):** Blender rigid-skin (vgroup w=1 + armature modifier; **UNHIDE the armature before selection-export or the FBX is silently skinless**) → `PlayerRigTools.GraftSmr` REBASES on rebind (verts→rest-world; bindposes = inverse of **rigid scale-stripped** rest matrices — a Blender roundtrip imports cm bones/0.01 armature, raw bindpose reuse explodes ×100; **`RecalculateTangents()` or Rukhanka/BRG registration fails and the whole rig vanishes**). Hand-written deformation shaders: DOTS-instanced `_DeformedMeshIndex` block **BEFORE** the `ComputeDeformedVertex.hlsl` include + the property ALSO in the Properties block (the baker validates `HasProperty`). [[DR-052_SoD_Facing_Underwater_Feel]].
|
||||
|
||||
- **The rig pipeline is HUMANOID** (muscle clips retarget onto player + monster rigs; the old "Generic" note was WRONG). **Blender clips:** per-action FBX (Key All Bones + Force Start/End + FBX Units Scale; **5.1: +NLA-strips OFF or ZERO takes bake, silently**); import `CreateFromThisModel` (**CopyFromOther FAILS on Blender's extra `Armature` node**); bake root motion into pose. Optimize Game Objects **OFF**; root motion **OFF** (CC owns the transform).
|
||||
|
||||
## 2026-08-07b — condensation to pay for the A0-gate tooling gotchas (net-zero rule)
|
||||
|
||||
Two new ★ rules went into CLAUDE.md's MCP section (the stale-assembly `refresh_unity` no-op, and "no still
|
||||
catches a temporal bug"). Paid for by condensing the enemy-slide history and the LANTERN direction bullet, whose
|
||||
long forms are preserved here.
|
||||
|
||||
- **★ enemy slide has NO pathfinding — a near-vertical wall normal or an embedded spawn FROZE Husks on cover rocks
|
||||
(soft-locks a room on one leftover); fixed 07-07 via `EnemyMoveUtil.Depenetrate` + tangent-slide + an
|
||||
`EnemyNavState` nudge backstop. Re-validate movers aren't frozen when adding Environment cover. 07-10: the nudge
|
||||
is COVER-AWARE — a live destructible-cover ghost (`BlightClutter` carrier) SUPPRESSES the phase-through
|
||||
(breakable ⇒ no soft-lock); static wedges still nudge.**
|
||||
|
||||
- Direction bullet, long form: "Supersedes the Awakening-Engine fiction + the Co-op Hades iteration… existing code
|
||||
(combat feel, ability/boon plumbing, run/hub lifecycle, save, regions/relevancy) is QUARRY, not foundation."
|
||||
The engine-fork clause also changed meaning: it read **"the fork is OPEN — surface it before starting world
|
||||
code"**, which DR-053 closed on 2026-08-07 (PARKED; Unity stays). The old wording is kept here only so the
|
||||
earlier sessions' instruction is still legible.
|
||||
|
||||
### The A0-gate lessons in full (the part worth re-reading)
|
||||
|
||||
1. **`refresh_unity scope=scripts` reported `refresh_triggered:false, compile_requested:false, state:"idle"` twice
|
||||
in a row and the editor kept running the STALE assembly.** `read_console` returned zero errors, which is
|
||||
indistinguishable from a clean compile. Play then ran the OLD code, so a *correct* fix measured as not working
|
||||
and I nearly re-opened a solved diagnosis. `scope=all mode=force` compiled it. Verify a behavioural fix by
|
||||
probing runtime state in Play (here: reflecting the private `_cam` field the guard nulls), never by re-reading
|
||||
the source you just wrote.
|
||||
|
||||
2. **A line-range `apply_text_edits` whose response says "Applied 1 *structured* edit(s)" may silently drop part of
|
||||
the new text.** Replacing `FeedbackFx.cs` lines 36-44 with {new static field + new method + rewritten method}
|
||||
landed only the rewritten method, producing a CS0103 on the very line the edit had just added. Prefer a pure
|
||||
INSERT (`startLine:N, endLine:N`) for new members, separate from any method rewrite.
|
||||
|
||||
3. **No still frame can catch a two-writer transform fight.** `StagingAmbiance` rides `Env_SeabedKit.prefab`, which
|
||||
`Game.unity` instantiates as well as `ArtStaging` — so a camera lissajous drift added for the staging scene
|
||||
wrote `_cam.position` every `LateUpdate` against `PrototypeCameraRig`. The camera alternated between the rig's
|
||||
desired y≈16.72 and the authored y≈1.46, so roughly half of every screenshot looked correctly framed. Every
|
||||
capture I took passed. The operator pressed Play and saw it in one second: *"the camera is so far zoomed in and
|
||||
shaking."* An `EditorApplication.update` trace quantified it instantly (y 1.157↔13.559, 7.43 units/tick; after
|
||||
the fix span 0.051, max step 0.004). Gate such effects on the presence of the owning component
|
||||
(`GetComponent<PrototypeCameraRig>()`), never on a scene name.
|
||||
|
||||
Reference in New Issue
Block a user