diff --git a/.claude/skills/dots-dev/SKILL.md b/.claude/skills/dots-dev/SKILL.md index 1ea9607c2..63b8c8d46 100644 --- a/.claude/skills/dots-dev/SKILL.md +++ b/.claude/skills/dots-dev/SKILL.md @@ -15,7 +15,7 @@ The spine: **size by blast-radius → ground → (design-review) → plan-gate 2. **Plan-approval gate ★.** Phases up to approval are read-only. Code is written only after the operator approves and you call **`ExitPlanMode`**. Self-policed, not harness-enforced. 3. **Doc + memory bookend ★.** Scan the vault/memory at start; update it at end (incl. CLAUDE.md self-maintenance). Protocol → `CLAUDE.md` Memory section + [`references/memory-protocol.md`](references/memory-protocol.md). 4. **DOTS-correct.** ECS conventions per `CLAUDE.md` + [`references/dots-conventions.md`](references/dots-conventions.md). Any violation found in review is blocking. -5. **Code commits gated; docs commits standing.** Code: offer + propose grouping in the final report; commit only on explicit "commit". **Docs-only changes (vault / CLAUDE.md / skill references) auto-commit at session end** in a logical `Docs:` group — operator standing authorization 2026-07-07. **Never push** unless asked. +5. **Code commits gated; docs commits standing.** Code: offer + propose grouping in the final report; commit only on explicit "commit". **Docs-only changes (vault / CLAUDE.md / skill references) auto-commit at session end** in a logical `Docs:` group — operator standing authorization 2026-07-07. **Push: auto-push `main` to `gitea` after session-end commits** (standing auth 2026-07-07); **`origin` (GitHub) only when asked.** 6. **Operator gates.** Present-forks-don't-auto-decide · no time/effort/deadline estimates · never-silently-defer · tuning-defaults autonomy. See *Operator gates* below. 7. **Path-portable.** Never write machine-specific absolute paths (`/Users/…`, `C:\…`) into the skill, code, docs, or `.mcp.json` — use repo-relative / `${CLAUDE_PROJECT_DIR}`. @@ -44,13 +44,13 @@ Pick the track from the *surface touched*, never from a minutes estimate. ### Phase 0 — Pre-flight 1. **Foundation check.** `com.unity.entities`/`com.unity.netcode` in `Packages/packages-lock.json`? If **absent**, STOP — point to the one-time setup task (`Docs/dots-setup-task.md`). Never install/scaffold inline. 2. **Unity ready.** `mcpforunity://editor/state` → `ready_for_tools`. Not ready / no instance → surface, ask operator to focus Unity. Multiple editors → `mcpforunity://instances` + `set_active_instance`. (An unfocused editor throttles to near-idle and breaks Burst recompiles — ask for focus on heavy build/test/Burst sessions.) -3. **Memory stack.** Probe `basic-memory` + `serena`; on failure fall back (obsidian-cli + Glob/Grep) and continue. +3. **Memory stack.** Probe `basic-memory`; on failure fall back (obsidian-cli + Glob/Grep) and continue. 4. **Intake gate.** Unclear scope/surface/output → bundle 2–4 ambiguities into one `AskUserQuestion`. Specific prompt → skip. ### Phase 1 — Ground (read-only, plan mode) -Declare plan mode: read-only tools only (`Read/Glob/Grep`, MCP resource reads, `unity_reflect`, `unity_docs`, `read_console`, ctx7/find-docs, obsidian-cli reads, `basic-memory`, serena reads). No writes. +Declare plan mode: read-only tools only (`Read/Glob/Grep`, MCP resource reads, `unity_reflect`, `unity_docs`, `read_console`, ctx7/find-docs, obsidian-cli reads, `basic-memory`). No writes. -Run the **Documentation-Protocol scan** (`CLAUDE.md` → vault MoC + latest session log → open DRs/roadmap → `basic-memory` recall on the goal's nouns → native `MEMORY.md`), then ground the work along three lenses: **code/asset graph** (serena `find_symbol`/refs, else Glob/Grep on `Assets/_Project/**/*.cs` + `*.asmdef`; `manage_scene get_hierarchy`; `unity_reflect` for goal types) · **knowledge state** (vault + `basic-memory`; quote locked decisions that constrain the goal) · **live state** (`editor/state`, `read_console` baseline, installed Entities/Netcode versions for ctx7 pinning). For Feature scope, fan this out read-only via the *Ground fan-out* Workflow pattern; for Small, do it inline. +Run the **Documentation-Protocol scan** (`CLAUDE.md` → vault MoC + latest session log → open DRs/roadmap → `basic-memory` recall on the goal's nouns → native `MEMORY.md`), then ground the work along three lenses: **code/asset graph** (Glob/Grep on `Assets/_Project/**/*.cs` + `*.asmdef`; `manage_scene get_hierarchy`; `unity_reflect` for goal types) · **knowledge state** (vault + `basic-memory`; quote locked decisions that constrain the goal) · **live state** (`editor/state`, `read_console` baseline, installed Entities/Netcode versions for ctx7 pinning). For Feature scope, fan this out read-only via the *Ground fan-out* Workflow pattern; for Small, do it inline. Synthesize a **≤400-word Project Brief**; discard raw dumps. If the goal contradicts a locked vault/`CLAUDE.md` decision, halt and surface. @@ -74,7 +74,7 @@ The single stateful editor + domain-reload ordering make parallel writes unsafe ### Phase 6 — Verify ladder (definition of done — show evidence, not "done") NetCodeTestWorld is `internal` and unused here — do NOT prescribe it. Live-driving rules + the server-inject harness → [`references/validation-harness.md`](references/validation-harness.md). - **L1** — `read_console(types=["error","warning","exception"], include_stacktrace=True)` clean vs the Phase-1 baseline. Burst/source-gen failures surface here, not in a plain build — any new one is a finding. -- **L2** — EditMode tests: plain-Entities `new World → register in SimulationSystemGroup → SortSystems → Update → assert` (`run_tests mode=EditMode`). Extract pure logic to a `*Math.cs` helper and unit-test it (cover swept hit-detection with a tunnelling regression). **Plus one live Play netcode smoke** — `execute_code` boot, step ticks, assert **server == client** for the replicated surface (identify worlds by `world.Name == "ServerWorld"/"ClientWorld"`). +- **L2** — EditMode tests: plain-Entities `new World → register in SimulationSystemGroup → SortSystems → Update → assert` (`run_tests mode=EditMode`). In DURABLE docs (DRs/logs/memory) write "suite green (N at the time)" — never stamp absolute counts as standing facts; they drift. Extract pure logic to a `*Math.cs` helper and unit-test it (cover swept hit-detection with a tunnelling regression). **Plus one live Play netcode smoke** — `execute_code` boot, step ticks, assert **server == client** for the replicated surface (identify worlds by `world.Name == "ServerWorld"/"ClientWorld"`). - **L3** (visual/asset work) — screenshot via `execute_code` `ScreenCapture` → Read PNG, **and verify asset *values*** (`shader.GetPropertyType`-guard before `GetColor`/`GetFloat`) — a dark/stylized render masks material bugs. Loop ≤3 fix iterations per finding; if iteration 3 still fails, halt and surface "I can't resolve X without a decision." @@ -94,7 +94,7 @@ Per `CLAUDE.md` Memory section + [`references/memory-protocol.md`](references/me **Reviews**: pre-code · post-impl . **Next step**: . ``` -Then **commit the docs group directly** (standing authorization) and **offer code commits**; code commits only on explicit approval. **Review first** (`git status` + `git diff --stat`); **stage explicit paths — never `git add -A`** (excludes `Library/Temp/obj/Logs/UserSettings`, `.csproj`/`.sln`, scratch screenshots/exports); keep each asset **with its `.meta`** in one commit; one commit per concern; match the repo's message style + the Co-Authored-By trailer; **never push**. Don't auto-loop into a fresh session. +Then **commit the docs group directly** and **push to gitea** (both standing authorizations); **offer code commits** — those only on explicit approval. Report the origin-unpushed count. **Review first** (`git status` + `git diff --stat`); **stage explicit paths — never `git add -A`** (excludes `Library/Temp/obj/Logs/UserSettings`, `.csproj`/`.sln`, scratch screenshots/exports); keep each asset **with its `.meta`** in one commit; one commit per concern; match the repo's message style + the Co-Authored-By trailer; **never push**. Don't auto-loop into a fresh session. ## Workflow orchestration (the parallelism primitive) diff --git a/.claude/skills/dots-dev/references/memory-protocol.md b/.claude/skills/dots-dev/references/memory-protocol.md index 261cac59c..869b13b60 100644 --- a/.claude/skills/dots-dev/references/memory-protocol.md +++ b/.claude/skills/dots-dev/references/memory-protocol.md @@ -1,6 +1,6 @@ # Memory & Documentation Protocol -How `/dots-dev` reads and writes knowledge. **`CLAUDE.md`'s "Memory — four layers" section is authoritative** for the layer definitions and the which-tool-when routing (in-repo vault · `basic-memory` · `serena` · native `memory/`) — this file does not re-table them; it carries the **session bookends** and the **fallback chain**. +How `/dots-dev` reads and writes knowledge. **`CLAUDE.md`'s "Memory — three layers" section is authoritative** for the layer definitions and the which-tool-when routing (in-repo vault · `basic-memory` · native `memory/`) — this file does not re-table them; it carries the **session bookends** and the **fallback chain**. (serena removed 2026-07-07 — unused + flaky on Unity; C# nav = `Glob`/`Grep`.) **Cross-machine rule:** anything that must be true on both the Mac and Windows machines goes in the **vault** (`Docs/Vault/`) or **`CLAUDE.md`** (both committed). Native `memory/` is machine-local convenience — never the sole home of a decision or design fact. @@ -25,8 +25,7 @@ If the operator says "skip the protocol," still write a one-line stub session lo - **No obsidian-cli configured** → direct `Read`/`Write` on `Docs/Vault/**` (it's plain markdown; Obsidian/basic-memory pick up changes on next index). This is the operative path on a fresh machine. - **basic-memory down** → obsidian-cli search + `Grep` over the vault. -- **serena C# unavailable / stalls on the Unity solution** → `Glob`/`Grep` (or `claude-context`/LanceDB if it was added as the documented fallback). ## Setup pointer -The vault scaffold, the `basic-memory`/`serena` `.mcp.json` entries (using `${CLAUDE_PROJECT_DIR}`), and `CLAUDE.md` are created by the **one-time project setup task** (`Docs/dots-setup-task.md`), not by this skill. If this skill runs and the vault or memory MCPs are missing, it notes the gap and points to that setup task. +The vault scaffold, the `basic-memory` `.mcp.json` entry, and `CLAUDE.md` are created by the **one-time project setup task** (`Docs/dots-setup-task.md`), not by this skill. If this skill runs and the vault or memory MCPs are missing, it notes the gap and points to that setup task. diff --git a/.mcp.json b/.mcp.json index c6e08bcc6..5620730cd 100644 --- a/.mcp.json +++ b/.mcp.json @@ -3,15 +3,6 @@ "basic-memory": { "command": "uvx", "args": ["basic-memory", "mcp"] - }, - "serena": { - "command": "uvx", - "args": [ - "--from", "git+https://github.com/oraios/serena", - "serena", "start-mcp-server", - "--context", "ide-assistant", - "--project", "${CLAUDE_PROJECT_DIR}" - ] } } } diff --git a/CLAUDE.md b/CLAUDE.md index d167ecce6..9077baf2c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -164,12 +164,12 @@ Full rules: `.claude/skills/dots-dev/references/dots-conventions.md` (in-repo; t - **Never** create/edit/commit `.csproj`/`.sln` — only `.asmdef`. - **No asset/scene edits during Play Mode.** Check `editor_state.advice.ready_for_tools` before mutating; package adds/refreshes trigger domain reloads — wait for `is_compiling=false`. -## Memory — four layers (which tool when) +## Memory — three layers (which tool when) -Full protocol + per-layer detail: [[Documentation_Protocol]] (`Docs/Vault/_Meta/Documentation_Protocol.md`). The four layers: **in-repo vault** `Docs/Vault/` (design docs, DRs, session logs — committed) · **basic-memory** MCP (semantic/wikilink recall over the vault) · **serena** MCP (C# symbol nav of `Assets/_Project/`) · **native Claude memory** (`memory/`, `MEMORY.md` — machine-local). +Full protocol + per-layer detail: [[Documentation_Protocol]] (`Docs/Vault/_Meta/Documentation_Protocol.md`). The three layers: **in-repo vault** `Docs/Vault/` (design docs, DRs, session logs — committed) · **basic-memory** MCP (semantic/wikilink recall over the vault) · **native Claude memory** (`memory/`, `MEMORY.md` — machine-local). (serena REMOVED 2026-07-07 — unused in practice + flaky on Unity.) -- Where is X / who calls it → **serena** (fallback `Grep`/`Glob`). What did we decide / how does Z work → **basic-memory** → read the vault note. Literal string / asset GUID → **Grep/Glob**. Current DOTS API → **context7**. Conventions → this file. Long-form build lessons → the gotchas archive. -- **Cross-machine rule:** durable truth → the **vault** or **this file** (both committed); native `memory/` is local-only, never the sole home of a decision. **serena C# caveat:** flaky on Unity — if `find_symbol` stalls, fall back to `Glob`/`Grep`. +- Where is X / who calls it → **Grep/Glob**. What did we decide / how does Z work → **basic-memory** → read the vault note. Current DOTS API → **context7**. Conventions → this file. Long-form build lessons → the gotchas archive. +- **Cross-machine rule:** durable truth → the **vault** or **this file** (both committed); native `memory/` is local-only, never the sole home of a decision. ## Per-machine setup (NOT in git — redo on each machine) diff --git a/Docs/Vault/07_Sessions/2026/2026-07-07_Workflow_Consolidation.md b/Docs/Vault/07_Sessions/2026/2026-07-07_Workflow_Consolidation.md index 798a3ae73..ba3f99f7d 100644 --- a/Docs/Vault/07_Sessions/2026/2026-07-07_Workflow_Consolidation.md +++ b/Docs/Vault/07_Sessions/2026/2026-07-07_Workflow_Consolidation.md @@ -50,6 +50,24 @@ MEMORY.md index de-bloated (two ~500-word narrative lines → true one-liners; d the stale "scale LEG children" root-cause claim corrected in the redirect memory (real fix was the swallowed attribute — see [[2026-07-07_Phase15_NodeFeedback_Attribute_Swallow]]). +## Round 2 (same session) — health sweep + operator authorizations + +Sweep findings: **GitHub PAT leaked in the `origin` remote URL** (operator rotating; never echo credentialed remote +URLs) · **75 commits unpushed to origin / 25 to gitea** · basic-memory sync verified LIVE · four pre-redirect roadmap +docs lacked supersession banners (added, `03fb4052e`) · playtest-notes drop file created (`User Sessions/` is +git-ignored — local scratch by design; durable record = session logs). + +Operator authorized ×3: (1) **auto-push `main`→gitea whenever** (SKILL.md #5 + memory; origin stays ask-first); +(2) **serena REMOVED completely** — `.mcp.json`, `.serena/` (moved to scratchpad; memories were empty), all references +in CLAUDE.md ("three layers" now), SKILL.md, memory-protocol.md, Documentation_Protocol.md; C# nav = Grep/Glob; +(3) **console-noise purge + conventions**: fixed CS0618/CS0414 in `MenuUi` (FindAnyObjectByType), +GA `SaveParticleSystemScript` (prefabAssetPath→assetPath ×2), Synty `SampleOscillateSliders` (FindObjectsByType +overload), `POLYGON_DogAnimationController` (dead `death_b` removed) — **plus a real bug the sweep surfaced: +`PixelArtDevControls` used legacy `Input.GetKeyDown(F3)` → `InvalidOperationException` EVERY FRAME in Play** (Input +System-only project; fixed to `Keyboard.current.f3Key.wasPressedThisFrame`). Test-count convention: durable docs say +"suite green (N at the time)", never absolute counts (455 ≠ the stale "456" stamps). Suite green (455) post-purge; +compile warnings zero; remaining console = known test-world `Ignoring invalid [UpdateBefore]` artifacts + bridge noise. + ## Next-session intent Phase 1.5 in earnest: collision-fidelity pass (stabilize #2, now scoped) → lighting/atmosphere pass → art-look diff --git a/Docs/Vault/_Meta/Documentation_Protocol.md b/Docs/Vault/_Meta/Documentation_Protocol.md index ea82f34c1..8891bfab2 100644 --- a/Docs/Vault/_Meta/Documentation_Protocol.md +++ b/Docs/Vault/_Meta/Documentation_Protocol.md @@ -16,14 +16,15 @@ How knowledge is read and written for Project M. Four layers, each with a distin |---|---|---| | **This vault** (`Docs/Vault/`) | Design docs, decision records, session logs, roadmap | **Yes** (git) | | **basic-memory** MCP | Semantic + wikilink recall over these same vault files | Yes (indexes the vault) | -| **serena** MCP | C# symbol navigation of `Assets/_Project/` | N/A (from code) | | **Native Claude memory** | Machine-local facts / preferences (`memory/`, `MEMORY.md`) | **No** | +> serena MCP (C# symbol nav) REMOVED 2026-07-07 — unused in practice + flaky on Unity; C# navigation = `Grep`/`Glob`. + **Cross-machine rule:** durable truth → vault or repo `CLAUDE.md` (both committed). Native memory is local-only, never the sole home of a decision or design fact. ## Which tool when -- Where is X defined / who calls it → **serena** (fallback `Grep` / `Glob`). +- Where is X defined / who calls it → **Grep / Glob**. - What did we decide / how does system Z work → **basic-memory** recall → read the note here. - Literal string / asset GUID → **Grep / Glob**. - Current DOTS / Netcode API → **context7** (never memory).