gsd/phase-04-harden-clean-up-optional
34 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
| 8ffc6cbbd4 |
docs(04-verification): independent gsd-verifier audit — Phase 4 PASSED (4/4 ROADMAP SCs + all spot-checks GREEN)
Goal-backward verification of Phase 4 (harden-clean-up-optional) against the
actual codebase. Supersedes and replaces the Plan 04-07 executor aggregator
with the canonical independent audit document.
Spot-checks performed against live codebase (HEAD
|
|||
| c27ad53d02 |
docs(04-07): complete harden-clean-up-optional plan 04-07 — Phase 4 closure aggregator + v1 milestone close-prep (2 tasks; 04-VERIFICATION.md + 4 marker file flips)
Plan 04-07 closure SUMMARY. Phase 4 closure-prep complete; pending independent gsd-verifier audit + closure-ceremony marker flips per Phase 1-3 precedent. Deliverables: - .planning/phases/04-harden-clean-up-optional/04-VERIFICATION.md (253 lines; 13 ## sections; 67 Plan 04-0 citations; 9 operator-ack literal hits; 44 commit refs; covers all 8 Phase 4 plans + 3 /gsd-debug sessions + 4 ROADMAP SC + 3 audit P1 + 6 cross-cutting hardening + 5/5 D-P4-* charters + Phases 1-4 cumulative gates) - .planning/REQUIREMENTS.md (4 Phase 4 closure notes appended; trailing footer updated; no existing REQ-* lines modified) - .planning/ROADMAP.md (Plan 04-07 row [x] flipped + progress table updated 7/8 → 8/8; Phase 4 row [ ] LEFT unflipped per Phase 1-3 precedent) - .planning/STATE.md (completed_plans 29→30 + percent 93→97; completed_phases STAYS 3 + status STAYS executing; Plan 04-07 closure section + decisions + metric + session continuity) - .planning/PROJECT.md (NEW Validated in Phase 4 section; Active section evolution to closure ceremony + v1.1/v2 deferred items) Acceptance criteria all PASS (gates per Plan 04-07 verify block): - 04-VERIFICATION.md exists, parseable YAML, 13 ## sections (>= 5), 253 lines (>= 120), 67 Plan 04-0 citations (>= 6), 9 operator-ack literal hits (>= 1), 44 commit refs (>= 6) - ROADMAP.md Plan 04-07 [x] = 1; Phase 4 [x] = 0 (correctly LEFT unflipped) - STATE.md completed_phases: 3 (UNCHANGED); completed_plans: 30 (+1); status: executing (UNCHANGED); percent: 97 (+4) - REQUIREMENTS.md Phase 4 closure notes = 4 (>= 3); PROJECT.md Validated in Phase 4 = 1 - git diff --stat HEAD~3 HEAD shows only .planning/ files dirty (T-04-07-02 threat mitigation honored — docs-only closure) Phase 4 cumulative tally (final via Plan 04-07 aggregator): - 8 plans closed (04-01..04-08; inserted Plan 04-08 Wave 5.5 post-debug) - 31 plans total across Phases 1-4 (14 + 4 + 5 + 8) - UAT harness 33 → 36 GREEN (+A33 + A34 + A35) - vitest 171 → 188 GREEN (+17 across Plans 04-01/02/06/08) - Pre-checkpoint bundle gates 6/6 PASS (Gate 2 polarity flipped 1→0) - Tier-1 FORBIDDEN_HOOK_STRINGS unchanged at 12 entries - NEW Tier-2 production-bundle filename-leak gate (Plan 04-08) - 3 /gsd-debug sessions documented + resolved - 5/5 D-P4-* charter closures (D-P4-01..D-P4-05) - 1 operator-empirical ack 2026-05-26: "Confirmed fixed — close Plan 04-06" Next step (orchestrator workstream): independent gsd-verifier audit against 04-VERIFICATION.md → Phase 4 row [x] flip + STATE.md completed_phases 3→4 + status:executing→completed → v1.0 tag + alpha redistribution per D-P4-04 charter (out-of-band). |
|||
| 7a69865843 |
docs(04-07): Phase 4 closure — 04-VERIFICATION.md aggregator (4/4 ROADMAP SCs + 3/3 audit P1 + 6/6 hardening items GREEN)
Task 1 of Plan 04-07 — executor-created aggregator covering all 8 Phase 4
plans + 3 /gsd-debug sessions + 4 ROADMAP SC closures + 3 audit P1 polish
items + 6 cross-cutting hardening items + 36/36 UAT harness + 188/188
vitest + 6/6 pre-checkpoint bundle gates (Gate 2 polarity flipped 1→0
via Plan 04-02) + Tier-1 FORBIDDEN_HOOK_STRINGS unchanged at 12 + NEW
Tier-2 leak gate added via Plan 04-08 + operator empirical ack 'Confirmed
fixed — close Plan 04-06' 2026-05-26.
- Per-Requirement Scorecard: 4/4 ROADMAP SC + 3/3 audit P1 + 6/6 hardening
- Cross-Cutting Gates: vitest 171→188; UAT 33→36; Tier-1 12; Tier-2 NEW
- Operator-Empirical Acks: Plan 04-06 cycle-2 'Confirmed fixed' 2026-05-26
- /gsd-debug Session Inventory: 3 sessions (canvas-throttling REFUTED-arch
via sessions 1+2; Plan 04-06 dark-mode mark decoupling; A33.1 SAVE-ack
race resolved at
|
|||
| c790c6a8b3 |
docs(04-06): complete visual polish + dark-logo decoupling — D-P4-03 closed (UAT 36/36 GREEN; 188/188 vitest with #9/#10 flake tolerated; operator re-confirmed 2026-05-26)
Plan 04-06 closure — the most ceremony-heavy plan in Phase 4: 3 planner passes + 2 plan-checker passes + 4 task commits + 1 /gsd-debug fix cycle + this closure commit. D-P4-03 (locked, 04-CONTEXT.md) CLOSED — both visual polish items: (a) cursor visibility verification + (b) dark-surface logo contrast. Closure trail: |
|||
| 3f8e31a329 |
feat(04-06): A35 live-DOM inline-SVG harness check + A17.8 raw-source update + back-patch
Closes the iter-2 BLOCKER 1 resolution end-to-end: the inline-SVG
strategy now has HONEST automated coverage at two layers — source
contract (Task 1 unit tests + the narrowed A17.8 source-bundling
grep) and live-DOM cascade (the NEW host-side A35 harness assertion
that opens welcome.html as a real Puppeteer tab).
- tests/uat/extension-page-harness.ts (A17.8 NARROWED HONESTLY):
swap the data:image/svg+xml URL-grep + .svg filename-grep target
for a raw-source grep — A17.8 now asserts the welcome chunk JS
contains the raw SVG signature `stroke="currentColor"` AND the
canonical `viewBox="0 0 32 32"` (the `?raw` import's output). The
explanatory comment block now DISAVOWS the live-DOM claim and
points at the NEW A35 driver for the runtime injection + cascade
proof. A17.8 is honest source-bundling only.
- tests/uat/lib/harness-page-driver.ts (NEW host-side driveA35):
appended LAST per the iter-2 ADV-2C concern (any driver-pollution
worry is moot since nothing reads A35's return value, AND
welcomePage.close() in finally guarantees no tab leak). driveA35
opens chrome-extension://<id>/src/welcome/welcome.html in a fresh
browser.newPage() tab, waits for the `.welcome-hero__mark svg`
selector at DOMContentLoaded, then runs a single page.evaluate()
that reads four signals: A35.1 inline <svg> present, A35.2
stroke=currentColor, A35.3 getComputedStyle().stroke resolves to
a non-default colour (the real cascade proof), A35.4 no legacy
<img> in the slot. Host-side pattern mirrors driveA32/A33/A34.
- tests/uat/harness.test.ts (orchestrator wiring):
+ driveA35 added to the import block from './lib/harness-page-driver'.
+ driveA35Wrapped closure capturing handles.browser + handles.extensionId
(alongside driveA33Wrapped/driveA34Wrapped).
+ { name: 'A35', drive: driveA35Wrapped } appended as the LAST
entry of the `drivers` array. Total auto-increments via
`drivers.length + 1` (line 580) — no hardcoded count to bump.
+ Architecture banner string (line 283) refreshed with A33, A34,
A35 inline (ADV-2A cosmetic advisory — banner was already stale
pre-04-06; A33+A34 added at the same time).
- .planning/phases/01-stabilize-video-pipeline/01-07-SUMMARY.md
(back-patch, DEFECT 2 resolution):
Flipped 5 lines (22, 47, 82, 135, 205) that carried the now-stale
"deferred to Phase 5" framing for cursor visibility — the
`cursor: 'always'` constraint was opportunistically shipped in
Plan 01-09 (recorder.ts:285) and is verified by Plan 04-06 Task 1
(tests/build/cursor-visibility.test.ts). Each flip is surgical
(single line / single bullet, with explicit "back-patched in
Phase 4 Plan 04-06" citation). Historical commit-description
lines 40, 89, 109, 110 are LEFT unchanged — they describe what
the Phase-1-closure commits literally did at the time, not
forward-looking deferrals.
- .planning/phases/04-harden-clean-up-optional/deferred-items.md
(correction, BLOCKER 2 resolution):
Corrected the misdiagnosed entry from commit
|
|||
| 48c70535ff |
docs(04-06): re-plan-checker iter-2 — PASSED on f3baa3a (0 BLOCKER + 3 cosmetic-advisories)
Validation of the iter-2 re-plan against commit
|
|||
| f3baa3a9a8 |
docs(04-06): re-plan iter-2 — real inline-SVG coverage + corrected 184/184 baseline
Re-plan-checker iter-1 (commit |
|||
| deb68dff86 |
docs(04-06): re-plan-checker iter-1 — ITERATE-NEEDED (2 BLOCKER)
Re-plan
|
|||
| b59bd24354 |
docs(04-06): re-plan — correct false jsdom premise + stale back-patch lines + baseline
Full re-plan via /gsd-plan-phase ceremony. The prior 04-06-PLAN.md hit a blocking checkpoint (plan-assumption defect). Three defects corrected; thesis preserved (dark-logo currentColor Option A + cursor verification-only + A17.8 + operator-empirical Task 4). DEFECT 1 — false jsdom premise: prior Task 1 assumed vitest configures a jsdom environment. FALSE — vitest.config.ts:18 sets environment:'node' and no DOM-emulation library is in node_modules. Resolution: STRATEGY (a) — reframe tests/welcome/inline-svg.test.ts as a node-env source-contract test (the canonical tests/i18n/manifest-i18n.test.ts file-read + string-assert pattern); delegate live-DOM injection + currentColor cascade verification to the A17.8 harness sub-check in real Chrome. Rejected (b) jsdom devDependency (deviates from a twice-reaffirmed no-DOM-library stance) and (c) manual DOMParser stub (fragile for SVG-namespace fidelity). DEFECT 2 — stale back-patch line numbers: verified the genuine stale 'deferred to Phase 5' lines in 01-07-SUMMARY.md are 22/47/82/135/205; historical commit-description lines 40/89/109/110 left unchanged. DEFECT 3 — wrong vitest baseline: real baseline is 183 GREEN / 1 pre-existing RED (strict-meta-json-validation.test.ts, logged to deferred-items.md, routed to /gsd-debug). Test-count target reframed to 187 GREEN / 1 pre-existing RED. revision_history block added. files_modified updated (welcome.css dropped — the bare class selector matches <svg> identically; no CSS edit needed). must_haves truths/artifacts/key_links updated to match the corrected plan. frontmatter.validate + verify.plan-structure both green. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> |
|||
| 6a989e8339 |
docs(04-06): log out-of-scope strict-meta-json test failure to deferred-items
- tests/build/strict-meta-json-validation.test.ts fails on clean tree (183/184, not the 184/184 the plan baseline assumed) - SAVE_ARCHIVE meta.json runtime path — unrelated to Plan 04-06 surface - resembles the pre-existing Plan 04-08 A33 SAVE-ack channel flake - routed to /gsd-debug; NOT fixed in Plan 04-06 per scope boundary Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> |
|||
| 28ebc1fe4e |
docs(04-05): complete A34 fetch+XHR network_error empirical plan
- 04-05-SUMMARY.md: A34 assertion closes ROADMAP SC #2 (fetch + XHR network_error capture); Plan 04-01 P1 #11 Request-narrow fix validated end-to-end; skip-mode UAT 34->35/35 GREEN - STATE.md: position advanced (6/8 plans); Plan 04-05 closure note; decision-log entry; A33 full-mode SAVE-ack flake logged as Blocker (routed to /gsd-debug — Plan 04-08 deliverable, out of scope here) - ROADMAP.md: SC #2 STATUS CLOSED; 04-05 row [x]; Phase 4 progress 6/8 - All 4 ROADMAP success criteria now closed (SC #1 Plan 04-08, SC #2 this plan, SC #3+#4 Plan 04-02) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> |
|||
| 4d6c00526e |
feat(04-08): A33 SW state persistence harness assertion — methodology reframe (34/34 GREEN; ROADMAP SC #1 CLOSED)
Task 2 of Plan 04-08 (revive A33 under valid methodology + close ROADMAP SC #1): - Append driveA33(page, browser, extensionId, downloadsDir) at tests/uat/lib/harness-page-driver.ts:2516-2697 per Plan 04-04 Pattern 4 verbatim - 3 checks: A33.1 SAVE_ARCHIVE ack success after 5-min idle + SW kill; A33.2 video size > 0; A33.3 video size > 100 KB sanity floor - Reuses stopServiceWorker helper (Plan 04-04 commit |
|||
| dd8a56453c |
docs(04-08): plan-checker iter-3 — PASSED-WITH-RESIDUAL on polish revision
Validates iter-3 polish revision of Plan 04-08 (commit
|
|||
| 17e55ddbb9 |
docs(04-08): polish per iter-2 advisories — symbol mismatch + display-surface mode lock-in + cosmetic clarifications
iter-3 polish pass on Plan 04-08 per checker iter-2 verdict PASSED
(commit
|
|||
| 9c334b77e8 |
docs(04-08): plan-checker iter-2 — PASSED (0 BLOCKER + 1 WARNING + 4 advisory)
Verifies iter-2 plan revision at |
|||
| 1f2eb2e818 |
fix(04-08): revise plan per iter-1 BLOCKER fixes — bundling strategy + sync monkey-patch + async closure
iter-2 revision of Plan 04-08 (video-file MediaStream methodology reframe)
addressing the 2 BLOCKERs + 5 WARNINGs + 3 advisories from plan-checker
iter-1 (commit
|
|||
| 051813ee6e |
docs(04-08): plan-checker iter-1 — ITERATE-NEEDED (2 BLOCKER + 5 WARNING + 3 advisory)
Plan 04-08's core thesis (HTMLVideoElement.captureStream bypasses canvas throttling per debug session-2 verdict) IS the correct path to close ROADMAP SC #1. But two blocking issues prevent reliable delivery: BLOCKER 1: Vite `?url` asset-emission analog mis-applied — mokosh-mark.svg is 877 bytes (inlined as data:image/svg+xml URI) so the Plan 01-10 "?url + crxjs auto-WAR" precedent is NOT a direct analog for the 1.9 MB WebM which will emit as a separate dist-test/assets/<hash>.webm file. WAR auto-generation for extracted assets is unverified in this codebase. Remediation: probe-then-decide OR Blob URL from ?raw ArrayBuffer. BLOCKER 2: installFakeDisplayMedia()'s eager-install-at-module-load contract is silently broken by the proposed async conversion. The race window opens because recorder.ts:48 resolves before the async install completes; recorder.startRecording → real getDisplayMedia → headless hang. Remediation: keep sync monkey-patch; defer the canplay wait into fakeGetDisplayMedia closure (lazy first-frame). WARNINGS surface unverified headless autoplay reliability, displaySurface monkey-patch portability to HTMLVideoElement tracks, spike probe-value gates not surfaced as automated verify, and ROADMAP.md flip without grep enforcement. Architectural alignment confirmed (segments: Blob[] preserved; IDB correctly rejected; D-P4-01 honored). iter-2 is a methodology-tightening pass, not re-architecture. Estimated ~150-300 lines of plan edits. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
|||
| 504d9dccf3 |
docs(04-08): create plan — video-file MediaStream methodology reframe + A33 revival
Inserts Plan 04-08 between Plans 04-06 and 04-07 (Wave 5.5) per debug session-2 verdict (REFUTED-architecture; canvas-captureStream issue). Scope: replace canvas.captureStream(30) source in installFakeDisplayMedia() at src/test-hooks/offscreen-hooks.ts:139-264 with HTMLVideoElement.captureStream backed by a bundled VP9 WebM at tests/uat/fixtures/synthetic-display-source.webm. Bundled via Vite ?url import per Plan 01-10 mokosh-mark precedent. Revives the A33 harness assertion (Plan 04-04 Pattern 4 verbatim) under valid methodology; stopServiceWorker helper from Plan 04-04 reused. Closes ROADMAP SC #1 within v1. Architecture (offscreen-RAM segments: Blob[]) UNCHANGED per debug session-2 segment-count probe evidence. 2 tasks atomic: (1) bundle fixture + rewrite installFakeDisplayMedia + ambient *.webm?url decl; (2) re-run spike + land driveA33 + orchestrator wiring + SKIP_LONG_UAT env-gate + SUMMARY + STATE/ROADMAP markers. UAT 33 -> 34 GREEN target. FORBIDDEN_HOOK_STRINGS unchanged at 12. Pre-checkpoint bundle gates 6/6 PASS preserved. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
|||
| c1501e7a81 |
docs(04-04): amend SUMMARY post-debug session-2 — REFUTED-architecture verdict
Session-2 (/gsd-debug continuation) empirically refuted the SUMMARY's original 'architecture broken → IndexedDB plan-fix needed' interpretation: - Pre-kill probe: segments.length=3 (segments accumulated correctly during 5-min idle) - Post-kill probe: segments.length=3 (offscreen-RAM survives SW kill structurally) - Step C (no worker.close, just 5-min idle): identical 8505 bytes (CDP not the cause) - Remux logs: each segment trackInfo=320x180 but 0 frames per segment - 7/7 spike runs deterministic at 8505 bytes (canvas-captureStream throttling) Root cause: installFakeDisplayMedia() at src/test-hooks/offscreen-hooks.ts:139-264 mints canvas.captureStream(30) on hidden -9999px-offset canvas; headless-Chromium throttles MediaRecorder on invisible-canvas (Chrome bug 653548). Segments exist but contain zero VP9 frames over 5-min idle. Routing: Plan 04-08 inserted (user-authorized ceremony 2026-05-22) — video-file MediaStream methodology reframe (Option 2 from session-2). IndexedDB plan-fix recommendation REJECTED — would not close SC#1 because frames are the problem, not segments. stopServiceWorker helper + spike script + launch.ts:225 race-tolerant fix all remain valid persisting artifacts for Plan 04-08. |
|||
| e8a2e7696d |
docs(04-04): complete harden-clean-up-optional plan 04-04 — SW persistence spike FAILED, plan-fix ceremony required
Plan 04-04 (spike→auto) closes at Task 1 (Wave 0 SPIKE) with an empirical
NO on the RESEARCH Q2 MEDIUM-confidence hypothesis A3 (offscreen-document
independent lifecycle anchored by active MediaRecorder). Task 2 (Wave 1
A33 verification-only harness assertion) BLOCKED by the plan's explicit
gating condition (videoSize > 100_000); ROADMAP SC #1 remains OPEN.
Spike empirical numbers (one HEADLESS=1 run; 308.7s wall-clock; full log
at /tmp/04-04-spike.log; reproducible via the committed spike script):
- assertA2 prime: PASSED (REC state established)
- 5-min wall-clock idle: elapsed cleanly
- stopServiceWorker CDP: succeeded (worker.close() returned)
- SAVE_ARCHIVE ack: {success: true} (event-driven SW respawn worked)
- video/last_30sec.webm: 8505 bytes (sanity floor 100 KB; healthy 1-3 MB)
- ffprobe on extracted: 'End of file' + 'Duplicate element' (no clusters)
- rrweb/session.json: [] (empty)
- logs/events.json: [] (empty)
- meta.urls: chrome-extension://* only (real-page URLs LOST)
Conclusion: src/offscreen/recorder.ts:91 `let segments: Blob[] = []` RAM-
only architecture does NOT survive 5-min SW idle + Puppeteer CDP worker.
close(). Architectural change required to close ROADMAP SC #1 (canonical
recommendation per 04-RESEARCH.md Q2 sub-question b Option C: IndexedDB
persistence in offscreen — Blobs serialize cleanly via structured-clone;
per-segment write ~3 MB; ~3 writes per 30s window). Per saved memory
`feedback-gsd-ceremony-for-fixes.md` the architectural fix routes through
/gsd-plan-phase rewrite OR /gsd-debug ceremony — NOT improvised inline
inside Plan 04-04.
Task 1 persisting artifacts (committed at
|
|||
| 303644f8cc |
docs(04-03): complete harden-clean-up-optional plan 04-03 — A29 flake fix
A29 (rrweb DOM verification) rewritten in-place via the canonical cs- injection-world pattern + strict-sentinel filter. Closes ~2/3 flake documented in Plans 03-02 + 03-03 SUMMARYs (A29 was "passing" by reading iana.org leftover DOM events from A27/A28's still-open probe tabs; a real rrweb regression at src/content/index.ts:284 would have been masked). Plan 04-03 task commits (atomic; sequential foreground mode): - |
|||
| 6a1fc32826 |
docs(04-02): complete harden-clean-up-optional plan 04-02 — build hygiene
Plan 04-02 closes three independent build-hygiene fixes consolidated into
one plan because they share the build-gate-grep test-scaffold pattern:
1. **setimmediate polyfill replacement** — layered 4-mechanism CSP-hardening
eliminates the `new Function` literal from the SW chunk (grep -c flips
1→0 across all three SW chunks). Runtime guard + nodePolyfills exclude
+ resolve.alias + Rollup post-transform plugin. Option α (force JSZip
unbundled lib/index.js) attempted + reverted because it broke
readable-stream-browser propagation causing UAT A30+ regressions;
Option β (post-transform plugin) preserves JSZip's pre-bundled
distribution verbatim while excising the offending literal.
2. **ROADMAP SC #3** (generate-icons ESM/CJS) — `git mv generate-icons.js
generate-icons.cjs` resolves the `require('fs')` under
`package.json type: module` via Node's `.cjs`-as-CJS rule.
3. **ROADMAP SC #4** (dead-code grep) — `tests/build/dead-code-grep.test.ts`
regression-pins `permissions.request` absence in `src/`.
Plus closure of Plan 01-12 Wave 7's setimmediate deferred-items entry.
Task commits:
-
|
|||
| f72bca5c46 |
docs(04-01): complete audit-p1-polish-content-script plan
Plan 04-01 closure marker — 04-01-SUMMARY.md + STATE.md position advance (Plan 1 of 7 -> Plan 2 of 7; Plan 04-02 build hygiene queued NEXT in Wave 1) + ROADMAP plan-progress table flip ([ ] -> [x] 04-01-PLAN.md row). Plan delivered (per SUMMARY): - Audit P1 #11 fetch URL extraction fix (TWO sites; instanceof Request narrow) - Audit P1 #14 navigation URL tracking fix (module-level previousUrl) - Audit P1 #15 rrweb emit timestamp normalization (Date.now() Unix epoch) - 9 new vitest tests under tests/content/; baseline 171 -> 180/180 GREEN - tsc-clean preserved; Tier-1 hook-strings inventory unchanged at 12 - Audit P1 polish backlog CLOSED 3/3 Per-task commits (TDD pair): - |
|||
| dbcf4827f6 | wip: phase-04 paused — 7 plans validated iter-2 PASSED, ready for execution .planning/phases/04-harden-clean-up-optional/.continue-here.md .planning/HANDOFF.json | |||
| 3c1280ed2d |
docs(04): plan-phase closure — 3 cosmetic advisories from checker iter-2 resolved
Plan-checker iter-2 returned VERIFICATION PASSED with 3 cosmetic advisories: - Dim 11: RESEARCH.md "## Open Questions" missing "(RESOLVED)" suffix → fixed - Dim 12: PATTERNS.md:886 stale dispatchSaveArchiveForA33 example → added DEPRECATED banner citing Plan 04-04 REVISION iter-2 Option B canonical pattern - VALIDATION.md frontmatter "4 revised tasks" mismatched per-task map (5 rows) → fixed All 4 BLOCKER+WARNING issues from iter-1 verified resolved by iter-2 plan-checker (VERIFICATION PASSED). 3 cosmetic items now resolved as well. 2 advisory items left as-is per iter-1 (W2 scope-sanity at 04-06; W3 conservative 04-03 dep). Phase 4 plans cleared for execution: - 7 plans across 6 waves (Wave 1: 04-01+04-02 parallel; Waves 2-6 single-plan) - Plan-checker iter-2 VERIFICATION PASSED - Test baselines preserved: vitest 171/171 · UAT harness 33/33 · Tier-1 12 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
|||
| 76fffb35b9 |
fix(04): revise plans per checker iter-1 — 2 BLOCKERS + 2 WARNINGS fixed
Plan-checker iter-1 found 2 BLOCKERS + 4 WARNINGS. Iter-2 revision applies
surgical fixes to 4 plans + VALIDATION:
BLOCKER 1 (Plan 04-06 Task 4): wrong SW chunk glob `dist/assets/index*-bg.js`
matched zero files → Gates 2/3/4 silently PASSED. Replaced with canonical
`dist/assets/index.ts-*.js` (verified empirically: index.ts-8LkXuqac.js
on disk; RESEARCH Q1). Added glob-existence pre-gate `ls | wc -l >= 1`
to fail-loudly on future Vite chunk-naming shift.
BLOCKER 2 (Plan 04-04 Task 1): spike called non-existent
__mokoshHarness.dispatchSaveArchive (verified: harness surface is
assertA1..A31 + getManifestVersion only). Applied Option B — spike
+ driveA33 now dispatch SAVE_ARCHIVE via chrome.runtime.sendMessage
inline in page.evaluate (matches 9 existing assertA* methods:
A5/A11/A12/A13/A26/A28/A29/A30/A31). No new harness helper introduced.
WARNING 1 (Plan 04-02 Task 2): verify omitted UAT harness run. Added
`HEADLESS=1 SKIP_PROD_REBUILD=0 npm run test:uat 2>&1 | grep -c 'UAT
harness: 33/33 assertions passed'` to verify command (stdout format
confirmed at tests/uat/harness.test.ts:537).
WARNING 4 (Plan 04-07 Task 1): weak operator-ack gate (placeholder would
pass). Added `grep -cE 'approved|All good|APPROVED|approved by|operator
ack|all good' 04-VERIFICATION.md` to verify command. Covers both
canonical Plan 04-06 resume-signal ("approved" lowercase) AND prior-art
Plan 01-10 cycle-2 ack ("All good" titlecase).
WARNINGS 2 + 3 left as-is (truly advisory: scope-sanity threshold +
conservative dependency without file overlap).
04-VALIDATION.md per-task map rows updated for the 5 revised task entries
(04-02 T2 + 04-04 T1 + 04-04 T2 + 04-06 T4 + 04-07 T1). Frontmatter
adds `revised: 2026-05-21` + iter-2 notes block.
3 plans unchanged on disk (04-01, 04-03, 04-05).
Empirical confirmations used in revision:
- Harness surface: grep extension-page-harness.ts:4018 confirms
__mokoshHarness.{assertA1..A31, getManifestVersion}; no dispatchSaveArchive
- SW chunk filename: ls dist/assets/ shows index.ts-8LkXuqac.js;
no index*-bg.js matches
- SAVE_ARCHIVE precedent count: 9 existing assertA* methods use the
chrome.runtime.sendMessage pattern
- UAT harness stdout format: harness.test.ts:537 emits canonical
"UAT harness: N/N assertions passed"
Ready for plan-checker iter-3 re-verification.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
|||
| 526ac78046 |
docs(04): create phase plan — 7 plans for Phase 4 hardening (audit P1 polish + flake stabilization + SW persistence + visual polish + closure)
Wave structure: - W1 (parallel): 04-01 (Audit P1 polish #11/#14/#15 TDD) + 04-02 (build/CSP hygiene: setimmediate polyfill + dead-code + generate-icons.cjs) - W2: 04-03 (A29 cs-injection-world rewrite; closes flake) - W3: 04-04 (A33 SW state persistence; spike-first + CDP worker.close()) - W4: 04-05 (A34 fetch+XHR network_error; ROADMAP SC #2 + validates Plan 04-01 P1 #11 end-to-end) - W5: 04-06 (dark-logo currentColor + cursor verification + 01-07-SUMMARY back-patch; operator empirical) - W6: 04-07 (04-VERIFICATION.md aggregator + ROADMAP backfill + v1 close prep) Honors locked decisions D-P4-01..05 (full Phase 4 + all 3 P1 polish + both visual items + alpha-independent + ROADMAP backfill). Implements RESEARCH Q1 (setimmediate option a), Q2 (spike-first SW persistence), Q3 (A29 cs-injection-world), Finding 4 (cursor already shipped — verification only). UI-SPEC dark-logo currentColor strategy with inline-SVG injection landed per UI-SPEC §"Implementation amendment". Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
|||
| f012c8c103 | docs(04): pattern map — ~30 anticipated files mapped (21 exact + 8 role-match + 1 NEW pattern stopServiceWorker CDP helper) .planning/phases/04-harden-clean-up-optional/04-PATTERNS.md | |||
| 7178d14154 | docs(phase-04): add validation strategy — Wave 0 anticipates 6 new unit test files per RESEARCH .planning/phases/04-harden-clean-up-optional/04-VALIDATION.md | |||
| d1f676707e | docs(04): research phase domain — setimmediate, SW persistence, A29 race fix + cursor finding .planning/phases/04-harden-clean-up-optional/04-RESEARCH.md | |||
| 266aa95235 |
docs(04): UI-SPEC.md status approved — 5/6 PASS + 1 FLAG non-blocking (dim 4 inherited type scale)
UI-checker verdict: APPROVED. Dimension breakdown: - 1 Copywriting: PASS (17-key matrix inherited + locked; zero new copy) - 2 Visuals: PASS (no new screen; dark-logo is stroke binding change) - 3 Color: PASS (Loom palette inherited; semantic accents declared) - 4 Typography: FLAG (8 sizes / 4 weights exceed standard thresholds but correctly captured as Phase 1-locked inherited from operator brand-fit ack 2026-05-20; Phase 4 adds zero new sizes/weights) — non-blocking - 5 Spacing: PASS (all multiples of 4; locked; no new values) - 6 Registry Safety: PASS (vanilla DOM + DOMParser; no shadcn; no third-party) Three checker observations addressed: 1. `?url` → `?raw` bundling: correctly preserves @crxjs auto-WAR (SVG content stays in JS bundle as string literal vs base64 data URL) 2. A17.8 sub-check update: concrete enough (raw-SVG-source string-search for `currentColor` + `viewBox='0 0 32 32'`); optional A17.8a/A17.8b split well-described 3. Dark-mode contrast: deep-indigo stroke on madder-orange wrapper is readable; operator empirical checkpoint (acceptance criterion #6) is the designated gate for WCAG ratio judgment Implementation contract = 5 file edits + 6 acceptance criteria. Planner can now use UI-SPEC as design context for the visual-polish Phase 4 plan. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
|||
| 55cefbaa32 |
docs(04): UI design contract — thin scope (dark-logo currentColor strategy)
Phase 4 carries one genuine designer-side decision: dark-surface logo contrast strategy. Recommends Option A — `currentColor` SVG + CSS color driven via the existing `.dark, [data-theme="dark"]` block in tokens.css (lines 234-251). Post- research amendment: welcome.ts must swap `?url` (data URL → <img>) for `?raw` (inline <svg> via DOMParser) because <img>-rendered SVGs do not inherit parent CSS color — `currentColor` only resolves on inline DOM SVG. Cursor visibility constraint (Plan 01-07 obs 2026-05-15) is listed as behavioral-only inheritance, not a design surface — 1-line change in src/offscreen/recorder.ts per Chrome CursorCaptureConstraint enum. Inherits Phase 1 design system as read-only (Lora display + IBM Plex Sans UI + Loom palette + Mokosh mark + canonical tokens.css + 17-key i18n matrix). Zero new tokens, zero new copy, zero new colors. PNG icons unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
|||
| 74ac8ac342 |
docs(04): preserve plan-phase preferences captured pre-UI-SPEC exit
User invoked /gsd-plan-phase 4 and answered both gate questions before the workflow correctly exited at the UI Design Contract gate (per workflow rule that manual invocations cannot nested-Skill-spawn /gsd-ui-phase due to AskUserQuestion-in-subcontext issue #1009). Preferences saved at .plan-phase-preferences.md for the next plan-phase invocation (after /gsd-ui-phase 4 produces UI-SPEC.md): - UI gate: generate UI-SPEC.md first — unlike Phase 3 (false positive), Phase 4 has genuine dark-logo work; UI-SPEC should be thin-but-real (dark-logo design only; cursor visibility listed as inherited behavioral change, not a design surface) - Research gate: research first (light, ~10-20 min) — scope-limited to: setimmediate polyfill replacement strategy + SW state persistence 5min idle test patterns + chrome.scripting.executeScript world:'ISOLATED' best practices for A29 cs-injection-world fix. Researcher NOT to investigate already-deferred items (rrweb v2, SW-RAM, masking). File auto-deletes when /gsd-plan-phase 4 honors these preferences. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
|||
| 8b31fbe3de | docs(04): capture phase context — discuss-phase complete (5 D-P4-* locked decisions; full Phase 4 scope) .planning/phases/04-harden-clean-up-optional/04-CONTEXT.md .planning/phases/04-harden-clean-up-optional/04-DISCUSSION-LOG.md |