Scribble Works fresh-eyes audit synthesis (2026-09-01)
Four zero-context audits (site, printed games, codebase, strategy docs). Excluded here because a fix is in flight (PR #12): production serving HTML instead of PDF, and the 3 games missing on R2.
(a) Executive verdict
- The shelf, tray, and brand work; the paper does not yet earn a second print. Only 4 of 16 games would beat a free worksheet (game audit §5).
- Every game is tagged 3-4; six require 5-6 decoding skills, and there is nothing at all for ages 7-10 despite a stated 3-10 range.
- The pipeline has no publication gate:
pending-reviewgames ship, nonpm testexists, and 14 of 16 games cannot be regenerated from the repo. - The strategy stack (credits, engine, paid week-view) rests on n=1 (Michelle) with zero instrumentation; the kill criterion cannot be measured today.
- Even after PR #12, playset download will still fail from the apex origin: R2 CORS allows only
*.scribble-works.pages.devsubdomains (codebase F4).
(b) Ranked targets (leverage toward prints, comes back, pays)
| # | What | Evidence | Size | Lane | Who |
|---|---|---|---|---|---|
| 1 | Add apex scribble-works.pages.dev (and scribbleworks.rdco.dev) to R2 CORS; smoke-test Access-Control-Allow-Origin per deploy |
Codebase F4: apex origin returns "(no Access-Control-* header)"; playset fetch is cross-origin | S | engineering | Ray builds (CORS write is a production change; announce first) |
| 2 | First-party download counter + 4-household hand-delivery print test (pass bar: 2 of 4 print again in 7 days) | Strategy 1.7: "Zero instrumentation items. There is no dashboard"; §2 cheapest experiment | M | growth | Ray builds counter; founder runs cohort |
| 3 | Filter loadGames() to status === 'live'; enum-validate status |
Codebase F1: 3 pending-review games emitted to dist and addable to tray |
S | engineering | Ray builds |
| 4 | Honest age bands: make 5_6 primary on the six decoding games, retitle hero, add age band to recommended-playset data shape, two-tap age filter | Game audit #6 (six games named); site F5 "all 16 cards show Ages 3-4"; strategy 1.5 | M | product | Ray builds |
| 5 | One footer strip on every page: title, Scribble Works, age band, answers line + one adult prompt; kill "3 • Pack 2" leftovers | Game audit #1 (13 of 16 games), #2 (5 games with no answer anywhere); site F9 | M | design | Ray builds |
| 6 | Fix the passive and unusable pages: write-the-word line on Build the Word / Construye la palabra; 1-inch dashed trace targets, model + 2 trace + 1 blank on all tracing pages | Game audit #3-#5, worst-three list; site F8 "child has nothing to do" | M | design | Ray builds |
| 7 | Defer item 23 (engine + Unified Billing + credits + $5 flip) and item 18 (portal / paid week-view); run Customize as concierge over iMessage | Strategy §5; 1.4: paid plan needs 30 games/kid/week vs 14-16 in catalog; 1.8 build order inverted | L (avoided) | product | Founder call |
| 8 | Hide "Log in / Create account" header CTA; replace FAQ placeholder with four real answers (Letter/A4, B&W, licence, free now); drop "coming soon" links | Site F3, F4: strongest CTA on every page leads to "Accounts are on the way" | S | product | Ray builds |
| 9 | Single-game "print this one now" path + the promised free sample on the homepage | Site §4 #2; homepage step 3 "A free sample page will live here soon" | S | product | Ray builds |
| 10 | npm test that owns publication truth (meta schema, slug regex, pdfinfo Pages==1 and 612x792, pdffonts embedded, null-pdfUrl excluded from tray) + GitHub Actions on PR |
Codebase F5, F6, F7, F11: npm test -> "Missing script"; contract "holds today by luck" |
M | engineering | Ray builds |
| 11 | Mobile: blank category thumbnails at 390px; verify nav at 375px on a device | Site F6 (Word Game, Count & Tally blank); strategy queue item D "reportedly not VISIBLE at 375px" | S | engineering | Ray builds |
| 12 | Track game source in repo; render PDF + previews in prebuild with pinned Chromium and bundled fonts | Codebase F9: HTML exists for 2 of 16; fonts are macOS ChalkboardSE; Chrome path hardcoded | L | engineering | Ray builds |
| 13 | Re-aim P1 production at 5-8 and the empty lanes: scissors, addition/ten-frames, logic, two-player, 7-10 | Game audit §4: "Ages 7-10 (zero pages)"; five named games; strategy rank 2 | L | product | Ray builds; founder picks the age bias |
| 14 | Written charter resolution: status open -> accepted/amended; define "launched"; settle birthday vs age band before portal work | Strategy 1.1, 1.2, 1.11: charter status: open, ruling 11 says age band, charter says birthday |
S | product | Founder call |
| 15 | Pre-publish rendered-PNG checklist + fix machine tells: mama glyph (2 pages), boat clip, orphan "box.", icon cap of 2 appearances; homepage card/blurb mismatch; empty "What you'll need"/"Themes" | Game audit #8, #9; site F7, F10, F13 | S | design | Ray builds |
(c) Contradictions between the audits
- Grades diverge where the site audit used previews and the game audit used real PDFs. Who Eats What A- (site) vs B- (game); Finish the Leaf Pattern A- vs B; Bunny's Snack C- vs B-; First Sounds B+ vs A-. The game audit inspected the primary artifact and wins; the site audit conceded its grades "may not reflect the real PDF page" (F2).
- Footer leftovers: site says "every page"; game audit says 13 of 16. Game audit is exact. "Ray says" count: 4 (site) vs 3 (game).
- Catalog size: strategy uses "14-game catalog" (playsets spec); codebase counts 13
live+ 3pending-review= 16. The spec's launch candidates were built against 14; re-check against 16. - Masked failure, not a contradiction: the site's HTML-body failure sits in front of the apex CORS failure in codebase F4. PR #12 alone will reveal #1 above; do not call download fixed until the apex origin is tested end to end.
- "The nightly studio is running" (strategy) is inferred from queue text while the charter says the cron line is "commented". Check the manifest and launchd, not the documents.
(d) Strategy-audit claims to verify before relaying
Files under ~/rdco-vault/01-projects/printables-product/ (charter = [[2026-08-31-studio-charter]], rulings = [[2026-08-31-product-model-rulings]], playsets = [[2026-09-01-recommended-playsets-spec]], engine = [[2026-09-01-engine-build-spec]], taxonomy = [[2026-08-31-marketplace-taxonomy-proposal]], queue = ~/.claude/state/studio/queue.md).
Confirmed by grep during this synthesis (line numbers as of today):
- charter
status: open(4);NOT read the charter(464);up to FOUR artifactsandwithout my intervention(430);Birthday, not an age band(346);Not aggregated across households(356);Work self-arrives(28);morning correction(416);non-family downloads(234, 380);DORMANT(19);Max subscription until(21);$0.71(181) - rulings
age band, interestsandopen pricing lever(59);5 day-cards(60);whole service(61);burn out(22) - playsets
EXACTLY 6(33);14-game catalog(90) - engine
0.71/pack(131);D1 credits ledgerand$5/mo Workers Paid flip(141) - taxonomy: file contains
audience ceiling(line not checked)
Still unchecked, grep before quoting:
- charter:
not a task queue;kill criteria depend on;non-zero number in the dashboard - playsets: data shape has no age band (
tags:block) - taxonomy:
keys on birthday - queue:
UNGATED(item 18),flagship(item 23),375px(item D),billing(P5 "last"),Round 1(studio actually ran); then confirm the cron manifest line is uncommented - negative claim "free-tier generative cap never specified": grep
capacross all six docs