diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md
index 391e62b..cb8421a 100644
--- a/.planning/ROADMAP.md
+++ b/.planning/ROADMAP.md
@@ -300,7 +300,7 @@ finalized at plan time):
- [x] 04-04-PLAN.md — A33 SW state persistence: **spike-first Wave 0 SPIKE FAILED 2026-05-21** (videoSize=8505 bytes vs 100KB floor; offscreen RAM-only `segments: Blob[]` at src/offscreen/recorder.ts:91 does NOT survive 5-min SW idle + Puppeteer CDP `worker.close()`; corrupt WebM per ffprobe). **REFUTED-architecture 2026-05-22 via debug session-2 (commit `4ea1bbb`):** root cause is canvas.captureStream invisible-canvas throttling (Chrome bug 653548), NOT architectural; segments survived SW kill structurally (POST-KILL probe count=3). Plan 04-04 SUMMARY amended at `c1501e7` with the REFUTED-architecture verdict + Plan 04-08 insertion authorization. ROADMAP SC #1 reframed as test-methodology issue (NOT architectural); IndexedDB persistence plan-fix REJECTED (would not have closed SC #1 because segments are not the problem, frames are).
- [x] 04-08-PLAN.md — A33 methodology reframe + harness assertion: **CLOSED 2026-05-22** via debug session-2 verdict (canvas-captureStream invisible-source throttling root cause); HTMLVideoElement.captureStream replaces canvas.captureStream in installFakeDisplayMedia() with SYNC install + LAZY first-frame contract; spike re-run produces videoSize=1_797_178 bytes (1.8 MB; vs 8505 baseline); A33 lands per original Plan 04-04 Wave 1 spec under SKIP_LONG_UAT env-gate; UAT 33 -> 34 GREEN. **ROADMAP SC #1 CLOSED.**
- [x] 04-05-PLAN.md — A34 fetch + XHR network_error empirical: **CLOSED 2026-05-22.** assertA34 + driveA34 + 3-site orchestrator wiring; cs-injection-world `fetch(404)` + `XMLHttpRequest(404)` from a probe tab; host-side asserts 2 `network_error` entries with `meta.status === 404`. Skip-mode UAT 34 -> 35/35 GREEN (A34 real; all 6 checks PASS). Plan 04-01 P1 #11 Request-narrow fix validated end-to-end (fetch `target` = real URL, not `[object Request]`). **ROADMAP SC #2 CLOSED.** Full-mode 35/35 gate observed a pre-existing Plan 04-08 A33 SAVE-ack flake (A33.1 false; video buffer survived at 1.56 MB) — A34 SKIPPED-not-reached in that run but unaffected; A33 flake routed to /gsd-debug.
-- [ ] 04-06-PLAN.md — Dark-logo currentColor + cursor visibility verification + 01-07-SUMMARY back-patch (UI-SPEC; operator empirical ack)
+- [x] 04-06-PLAN.md — Dark-logo currentColor + cursor visibility verification + 01-07-SUMMARY back-patch (UI-SPEC; operator empirical ack): **CLOSED 2026-05-26** via operator re-empirical confirmation "Confirmed fixed — close Plan 04-06". D-P4-03 (both visual polish items) CLOSED. Multi-iteration ceremony: 3 planner passes + 2 checker passes + 1 /gsd-debug fix cycle. Key deliverables: (1) SVG stroke recolor (`stroke="currentColor"`) + welcome.ts `?raw`/DOMParser/replaceChildren inline-SVG injection (no `
`, no innerHTML) + globals.d.ts `*.svg?raw` ambient decl; (2) NEW brand-component token `--mks-mark-stroke = var(--mks-linen-50)` in :root (NOT overridden in `.dark`) — decoupled the welcome-hero mark from the theme-flipping semantic `--mks-fg-inverse` token (abstraction error surfaced via Task 4 operator empirical TWEAK; routed via /gsd-debug per `feedback-gsd-ceremony-for-fixes.md`; fix at `a8bcc17`); (3) NEW A35 host-side harness with 5 sub-checks including A35.5 light+dark equality decouple-proof (UAT 35 → 36 GREEN); (4) tests/welcome/inline-svg.test.ts (3 tests) + tests/build/cursor-visibility.test.ts (1 test) — vitest 184 → 188 GREEN; (5) 01-07-SUMMARY back-patch (5 stale 'deferred to Phase 5' framing lines flipped, 4 historical commit-description lines left); (6) deferred-items.md mis-diagnosis correction (04-CONTEXT #9/#10 parallel-vitest flake, NOT strict-meta-json). FORBIDDEN_HOOK_STRINGS unchanged at 12; 6/6 bundle gates PASS. SUMMARY: .planning/phases/04-harden-clean-up-optional/04-06-SUMMARY.md.
- [ ] 04-07-PLAN.md — Phase 4 closure aggregator + ROADMAP backfill (D-P4-05) + v1 milestone close prep
## Progress
@@ -313,4 +313,4 @@ Phases execute in numeric order: 1 → 2 → 3 → 4 → 5.
| 1. Stabilize video pipeline | 14/14 | **CLOSED 2026-05-20** via gsd-verifier audit GREEN (17/17 must-haves; commit 586836f); all markers flipped | Functional contract closed 2026-05-19 via Plan 01-13 harness PASS; design/brand contract closed 2026-05-20 via Plan 01-12 brand-fit ack; welcome-tab contract closed 2026-05-20 via Plan 01-10 cycle-2 operator ack "All good" + 5 inter-cycle debug fixes |
| 2. Stabilize export pipeline | 0/4 | Plans landed 2026-05-20 (4 plans: Wave 0 RED → Wave 1 Blob URL + meta.urls parallel → Wave 2 harness + operator checkpoint); execution pending | - |
| 3. SPEC §10 smoke + DOM/event-log verification | 0/TBD | Not started (absorbed Phase-2 DOM verification per 2026-05-20 re-phasing; ~2-3 plans) | - |
-| 4. Harden + clean up (optional) | 5/8 | In Progress| |
+| 4. Harden + clean up (optional) | 7/8 | In Progress (Plan 04-06 closed D-P4-03 — both visual polish items: cursor visibility verification + dark-surface logo contrast via --mks-mark-stroke brand-component token decoupling; operator re-empirical confirmed 2026-05-26) | |
diff --git a/.planning/STATE.md b/.planning/STATE.md
index fa44038..da9d3be 100644
--- a/.planning/STATE.md
+++ b/.planning/STATE.md
@@ -3,15 +3,15 @@ gsd_state_version: 1.0
milestone: v2.0.0
milestone_name: milestone
status: executing
-stopped_at: "Completed 04-05-PLAN.md (A34 fetch+XHR network_error empirical; ROADMAP SC #2 CLOSED; skip-mode UAT 34->35/35 GREEN; full-mode bailed at pre-existing Plan 04-08 A33 SAVE-ack flake — A34 SKIPPED-not-reached but verified by skip-mode)"
-last_updated: "2026-05-22T10:43:22.622Z"
-last_activity: 2026-05-22
+stopped_at: "Completed 04-06-PLAN.md (D-P4-03 CLOSED — both visual polish items: cursor visibility verification + dark-surface logo contrast via --mks-mark-stroke brand-component token decoupling; A35 host-side harness with 5 sub-checks including A35.5 light+dark equality decouple-proof; UAT 35->36 GREEN; vitest 184->188; multi-iteration ceremony: 3 planner passes + 2 checker passes + 1 /gsd-debug fix cycle; operator re-empirical confirmed 2026-05-26)"
+last_updated: "2026-05-26T11:08:13.425Z"
+last_activity: 2026-05-26
progress:
total_phases: 4
completed_phases: 3
total_plans: 31
- completed_plans: 28
- percent: 90
+ completed_plans: 29
+ percent: 93
---
# Project State
@@ -28,12 +28,31 @@ no server, no password leaks.
## Current Position
Phase: 04 (harden-clean-up-optional) — EXECUTING
-Phase 4 of 4 (Hardening — optional) — Plans 04-01..04-05 + 04-08 closed (6/8); 2 plans remain: 04-06 (visual polish; operator empirical) + 04-07 (closure aggregator). ROADMAP SC #1 + SC #2 both CLOSED.
-Plan: 7 of 7 (04-06 NEXT)
+Phase 4 of 4 (Hardening — optional) — Plans 04-01..04-06 + 04-08 closed (7/8); 1 plan remains: 04-07 (Phase 4 closure aggregator + v1 milestone close prep). ROADMAP SC #1 + SC #2 both CLOSED; D-P4-03 CLOSED via Plan 04-06.
+Plan: 8 of 8 (04-07 NEXT)
Status: Ready to execute
-Last activity: 2026-05-22
+Last activity: 2026-05-26
-Progress: [█████████░] 90%
+Progress: [█████████▒] 93%
+
+### Plan 04-06 closure (2026-05-26)
+
+- Dark-logo contrast strategy + cursor visibility verification landed end-to-end; D-P4-03 (locked, 04-CONTEXT.md) CLOSED — both visual polish items.
+- 5 atomic commits (4 task + 1 debug-fix): `f0b88d4` (Task 1 — Wave 0 RED inline-SVG source-contract + cursor-visibility regression pin) → `c416143` (Task 2 — Wave 1 GREEN: SVG stroke recolor + welcome.ts ?raw/DOMParser/replaceChildren + globals.d.ts ambient decl) → `3f8e31a` (Task 3 — A35 live-DOM inline-SVG harness check + A17.8 raw-source update + 01-07-SUMMARY back-patch + deferred-items correction) → `d66cbf6` (Task 4 artifact — operator-empirical screenshot harness scripts/04-06-welcome-hero-screenshots.mjs) → operator-empirical TWEAK verdict 2026-05-26 → /gsd-debug session → `a8bcc17` (debug-fix — decouple welcome-hero mark stroke via NEW `--mks-mark-stroke` brand-component token in :root + A35.5 light+dark equality decouple-proof sub-check) → operator re-empirical CONFIRMED FIXED 2026-05-26.
+- SUMMARY: `.planning/phases/04-harden-clean-up-optional/04-06-SUMMARY.md`.
+- **Multi-iteration ceremony**: this was the most ceremony-heavy plan in Phase 4 — 3 planner passes (`6a989e8` mis-diagnosis → `b59bd24` re-plan iter-1 → `f3baa3a` re-plan iter-2) + 2 plan-checker passes (`deb68df` iter-1 ITERATE-NEEDED → `48c7053` iter-2 PASSED) + 4 task commits + 1 /gsd-debug fix cycle (debug session at `.planning/debug/resolved/04-06-dark-mode-mark-decouple.md`). Ceremony was a necessary cost — the brand-component vs semantic token abstraction error only surfaced when the operator saw the dark theme. Lesson encoded: when a checkpoint is operator-empirical, the planner should either front-load the brand-component token or accept a /gsd-debug fix cycle as part of the plan budget.
+- **Dark-logo currentColor strategy**: src/shared/brand/mokosh-mark.svg root `