Build Document · boondoggling.ai

Boondoggle Score

20 sequenced steps separating what Claude builds from what only the human can build — with copy-pasteable prompts, supervisory capacity labels, and explicit handoff conditions at every step.

System: boondoggling.ai SDD: All phases complete (V1–P5) Generated: March 30, 2026 Fluency: Level I — copy-paste Executor: Solo — Nik Bear Brown
20 Steps 9 Claude Tasks 11 Human Tasks 2 Pre-Build Spikes Solo Build

Phase Legend

FFoundation
CCore Skeleton
IIntegration
BFull Build
HHardening
RRelease

Pre-Build Spikes

Two verification items must be completed before the score begins. Neither requires writing production code. Run both in parallel.

STEP 0A
Verify Claude Project Instructions character limit
Spike Human Task [PF] Problem Formulation
Supervisory Capacity
[PF] Problem Formulation — verifying that a core design assumption is true before the build depends on it.
Action
Open claude.ai. Create a new Project. Open Project Instructions. Paste the full Gru system prompt. Check whether it saves without truncation. Count the characters in the Gru prompt using a character counter tool. Document the result: does it fit? If not, identify the split point (after the Welcome Menu section is the natural break). Record the character limit and the Gru prompt length in a note. This result governs how /tools/gru is built and whether the 180,000-character warning threshold in Step 7 needs adjustment.
Handoff Condition
You have a documented answer to: "Does the full Gru system prompt fit in Claude Project Instructions without truncation?" If no — you have identified the split point. No code is written until this is confirmed.
Dependency
None.
STEP 0B
Verify iframe sandbox attribute against real SDD output
Spike Human Task [PA] Plausibility Auditing
Supervisory Capacity
[PA] Plausibility Auditing — confirming that the sandbox attribute behaves as designed before it becomes the security posture of the entire /dev section.
Action
Take one real Gru SDD HTML file from your existing /public/dev/ docs. Serve it locally (npx serve public/dev). Build a minimal test HTML page with an iframe pointing to it with sandbox="allow-same-origin allow-popups". Open it in a browser. Verify: (1) the doc renders correctly, (2) anchor links within the doc work, (3) external links open in a new tab, (4) no JavaScript executes. If any behavior is broken, identify which additional sandbox permission is required and update S1 Component 3 before proceeding.
Handoff Condition
You have a confirmed sandbox attribute string that renders real Gru SDD output correctly without executing scripts. That exact string goes into the iframe JSX component. No community doc goes live until this is verified.
Dependency
None — runs in parallel with Step 0A.

Phase F — Foundation

STEP 1
Fork Musinique, create boondoggling-ai repo, confirm dev runs
Phase F Human Task [TO] Tool Orchestration
Supervisory Capacity
[TO] Tool Orchestration — setting up the build environment before any code is generated.
Action
Fork or clone the Musinique repository. Create a new repo: boondoggling-ai. Copy the full Musinique codebase as the starting point. Update package.json (name, description). Update NEXT_PUBLIC_SITE_URL in .env.local to http://localhost:3000. Confirm next dev runs without errors. Confirm /admin/login works with the Musinique admin password. You are not building yet — you are confirming the foundation is sound before Claude touches it.
Handoff Condition
next dev runs. /admin/login authenticates. /blog, /tools, /videos render with Musinique content or empty state. No TypeScript errors on startup.
Dependency
None.
STEP 2
Generate SQL migration script (dev_docs, tools columns, RLS)
Phase F Claude Task
Context Required
SDD S3 full schema. Musinique tools table schema. Migration run order from P3.
View Prompt
You are a senior Next.js/PostgreSQL engineer working on a project called boondoggling.ai. The existing Musinique codebase uses a `tools` table with these columns: id, name, slug, description, tool_type, claude_url, chatgpt_url, artifact_id, artifact_embed_code, tags, created_at, updated_at I need you to write the complete SQL migration script for boondoggling.ai. The script must run in this exact order: 1. CREATE the new `dev_docs` table: CREATE TABLE IF NOT EXISTS dev_docs ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), title TEXT NOT NULL, slug TEXT UNIQUE NOT NULL, description TEXT, blob_url TEXT NOT NULL, build_url TEXT, quality_signal TEXT DEFAULT 'community', category TEXT, methodology TEXT, submitted_by TEXT, published BOOLEAN DEFAULT false, published_at TIMESTAMPTZ, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); 2. ALTER the existing `tools` table to add four new columns (use IF NOT EXISTS): - prompt_text TEXT - quality_signal TEXT DEFAULT 'community' - version TEXT DEFAULT '1.0' - published BOOLEAN DEFAULT false 3. Add a CHECK constraint to the existing `videos` table: ALTER TABLE videos ADD CONSTRAINT video_source_required CHECK (youtube_id IS NOT NULL OR blob_url IS NOT NULL); 4. Backfill existing tools: UPDATE tools SET published = true, quality_signal = 'curated' WHERE published IS NULL OR published = false; 5. Enable RLS on dev_docs and add policies: - public_read_dev_docs: SELECT WHERE published = true - service_role_dev_docs: ALL operations 6. Add a videos table RLS policy (if not already present): - public_read_videos: SELECT WHERE published = true - service_role_videos: ALL operations Output: a single SQL script with each step clearly commented. Include a comment before each step stating what it does and why the order matters.
Expected Output
A single .sql file with six numbered, commented sections. Each ALTER TABLE uses IF NOT EXISTS. The backfill UPDATE runs after the ALTER (step 4 after step 2). RLS policies use the Musinique pattern.
Handoff Condition
Every statement is syntactically valid PostgreSQL. The backfill UPDATE references columns that exist (added in step 2). No statement depends on a table or column not yet created. Run in Neon SQL Editor — zero errors.
Dependency
Step 1 complete (repo exists, Neon DB accessible).
STEP 3
Read and run migration script — verify zero errors
Phase F Human Task [PA] Plausibility Auditing
Supervisory Capacity
[PA] Plausibility Auditing — verifying the migration output is correct before it touches the production DB.
Action
Read Claude's migration script before running it. Check: (1) does the backfill UPDATE (step 4) reference published — a column added in step 2? If yes, the order is correct. (2) Does the CHECK constraint reference youtube_id and blob_url — columns that already exist in the videos table? Verify against the Musinique schema. (3) Are the RLS policies consistent with the Musinique pattern (service_role FOR ALL USING (true))? Run the script in Neon SQL Editor. Confirm zero errors.
Handoff Condition
Migration ran with zero errors. dev_docs table exists. tools has prompt_text, quality_signal, version, published columns. videos has video_source_required CHECK constraint. Existing tools records have published=true, quality_signal='curated'.
Dependency
Step 2 complete (migration script generated).
Highest-Risk Handoff
The migration script touches the DB. If the backfill UPDATE runs before the ALTER TABLE, it writes to a column that doesn't exist yet. Claude generates the script in the correct order — but you must read it and confirm the order before running it. This is the handoff most likely to cause irreversible damage if skipped.
STEP 4
Write scanDevDocs() filesystem scanner function
Phase F Claude Task
Context Required
Musinique lib/html-meta.ts, specifically scanHtmlSubdirs(). SDD S1 Component 3 (filesystem taxonomy: WWW/, Agents/, Games/, gru/ within each).
View Prompt
You are working on boondoggling.ai, a Next.js 15 App Router project using TypeScript. The project has an existing utility at lib/html-meta.ts with a scanHtmlSubdirs() function that scans subdirectories under a given public/ path and returns an array of objects with { title, description, slug, path } extracted from HTML meta tags. I need you to extend this file — create a new function scanDevDocs() — that scans /public/dev/ with this taxonomy: Top-level subdirectories: WWW, Agents, Games (and any future additions) Within each: an optional gru/ subdirectory for Gru-produced docs All other HTML files in the category root are non-Gru docs The function must return an array of objects with this shape: { title: string, description: string, slug: string, // e.g. "www/gru/musinique-build" or "agents/my-agent" path: string, // filesystem path for iframe src category: string, // 'www' | 'agents' | 'games' (lowercased) methodology: string | null, // 'gru' if in /gru/ subfolder, null otherwise source: 'filesystem' } Requirements: - slugs must be lowercase - the function must handle missing subdirectories gracefully - the function must be callable at build time in a Next.js server component - do not modify any existing functions Return: the complete updated lib/html-meta.ts file with scanDevDocs() added as a new export.
Expected Output
Updated lib/html-meta.ts with scanDevDocs() exported. Handles missing subdirectories without throwing. Returns all six fields. Category always lowercase. Methodology is 'gru' for files in /gru/ subfolder, null otherwise.
Handoff Condition
scanDevDocs() compiles without TypeScript errors. Called against the filesystem scaffold from Step 5, it returns correct objects for each HTML file found.
Dependency
Step 1 complete (repo exists).
STEP 5
Create /public/dev/ directory scaffold and seed with real SDD docs
Phase F Human Task [EI] Executive Integration
Supervisory Capacity
[EI] Executive Integration — creating the content scaffold that all subsequent filesystem-dependent steps depend on.
Action
Create the directory structure: mkdir -p public/dev/WWW/gru, mkdir -p public/dev/Agents/gru, mkdir -p public/dev/Games/gru. Place at least one real Gru SDD HTML file in each /gru/ subfolder. Confirm each HTML file has <title> and <meta name="description"> tags. Confirm scanDevDocs() returns the correct objects when called against this structure.
Handoff Condition
Three subdirectories exist with at least one HTML file each. scanDevDocs() returns at least three objects, one per category, all with methodology: 'gru'. Each object has a non-empty title and description.
Dependency
Step 4 complete (scanner function exists).

Phase C — Core System Skeleton

STEP 6
Audit admin auth implementation against five requirements
Phase C Claude Task
Context Required
Musinique /app/api/admin/login/route.ts and middleware.ts. SDD D2 auth routes. SDD P3 environment variables.
View Prompt
You are working on boondoggling.ai, a Next.js 15 App Router project forked from Musinique. The admin auth system (HMAC-SHA256 session cookie, middleware.ts, /api/admin/login, /api/admin/logout) is already present from Musinique. Audit the existing auth implementation against these five requirements: 1. ADMIN_PASSWORD environment variable is used (not hardcoded) 2. admin_session cookie is httpOnly, sameSite: 'lax', secure: true in production 3. middleware.ts protects all /admin/* routes and all /api/* write routes (POST, PATCH, DELETE) 4. /api/admin/login uses constant-time password comparison 5. /api/admin/logout clears the cookie unconditionally For each requirement: state PASS or FAIL with the relevant code snippet. For each FAIL: provide the exact corrected code. Do not rewrite files that pass. Only output corrected code for files that fail.
Expected Output
A PASS/FAIL audit with corrected code for any failing items. No full file rewrites unless a file has multiple failures. Minimal diff.
Handoff Condition
All five requirements pass — confirmed or corrected. Admin login works in the browser. /admin/dashboard redirects to /admin/login when no session cookie is present.
Dependency
Step 1 complete.
STEP 7
Update /tools page and /tools/[slug] for quality signals and prompt-type display
Phase C Claude Task
Context Required
Musinique /app/tools/page.tsx, /app/tools/[slug]/page.tsx. SDD S1 Component 2. SDD D1 Tool entity. The four new columns: prompt_text, quality_signal, version, published. Step 0A result (confirmed character limit).
View Prompt
You are working on boondoggling.ai, a Next.js 15 App Router project. Update the /tools page and /tools/[slug] page: CARD GRID (/app/tools/page.tsx): - Add quality_signal badge to each card: "Curated" (filled) or "Community" (outlined) - Only show tools WHERE published = true from the DB query - Card layout: name, description, quality_signal badge, version tag, tool_type label TOOL DETAIL (/app/tools/[slug]/page.tsx): For tool_type = 'prompt': - Display full prompt_text in a
 block with monospace font
- Add a Copy button using navigator.clipboard.writeText(prompt_text)
- Clipboard fallback: if clipboard API fails, show "Select all" button
- Display character count: "X characters" below the copy button
- If character count > 180000: show warning "This prompt is long. Verify it fits in your Claude Project Instructions before use."
- Display version as a small label: "Version X.X"
- Guard: if prompt_text is null for a prompt-type tool, render a clear error state (do not show a blank page)

For tool_type = 'artifact' and 'link': no changes needed.

Use existing Musinique Tailwind classes and bb- color variables. No new dependencies.

Return: updated /app/tools/page.tsx and /app/tools/[slug]/page.tsx only.
Expected Output
Two updated TypeScript files. Quality signal badge uses existing Tailwind utilities. Clipboard fallback is implemented. Character count displays. 180,000-character warning threshold used. Null prompt_text renders error state, not blank page.
Handoff Condition
/tools renders cards with quality signal badges. /tools/gru shows the prompt in a <pre> block with working copy button. Clipboard fallback renders when clipboard API is unavailable. Character count displays correctly. Null prompt_text renders an error state.
Dependency
Steps 3 (migration complete), 1 (repo exists).
STEP 8
Add Gru, Ada, and Admin Doc Audit Prompt as first tool entries
Phase C Human Task [IJ] Interpretive Judgment
Supervisory Capacity
[IJ] Interpretive Judgment — adding the Gru system prompt as the first tool entry. This is a content decision. Only you know which version of Gru is canonical.
Action
Go to /admin/dashboard/tools. Create three tool entries: (1) Gru — tool_type: prompt, paste full Gru system prompt, quality_signal: curated, version: 1.0, write a one-paragraph description, published: true. (2) Ada — same pattern from the Ada HTML file. (3) Admin Doc Audit Prompt — a Gru /g2 variant prompt for auditing community SDD submissions. This last entry is content you write, not code.
Handoff Condition
Three tools are published in /tools: Gru, Ada, Admin Doc Audit Prompt. Each has a complete description, correct version, quality_signal='curated'. /tools/gru renders the full prompt with copy button and character count. The Step 0A character limit result determines whether the warning displays.
Dependency
Step 7 complete (tools UI updated).
STEP 9
Build /dev card grid and /dev/[...slug] sandboxed viewer
Phase C Claude Task
Context Required
Step 4 output (scanDevDocs() function). Musinique /app/dev/ pages. SDD S1 Component 3. SDD D1 DevDoc entity. dev_docs DB table schema. Confirmed sandbox attribute string from Step 0B.
View Prompt
You are working on boondoggling.ai, a Next.js 15 App Router project. Build the /dev section — two pages: PAGE 1: /app/dev/page.tsx — Card grid Data sources (merge both): 1. Filesystem docs: call scanDevDocs() → { title, description, slug, path, category, methodology, source: 'filesystem' } 2. DB docs: SELECT * FROM dev_docs WHERE published = true → { title, description, slug, blob_url, category, methodology, quality_signal, build_url, source: 'db' } Merge and sort: Featured quality_signal first, then by published_at descending. Filesystem docs are treated as quality_signal='featured'. Group by category: three sections — "WWW", "Agents", "Games". Within each group, methodology='gru' docs show a "Built with Gru" badge. Card layout: - Title, description (truncated to 2 lines), category label - "Built with Gru" badge if methodology === 'gru' - Quality signal badge: "Featured" (filled) or "Community" (outlined) - "Live Build →" link if build_url is present (opens in new tab) PAGE 2: /app/dev/[...slug]/page.tsx — Doc viewer - Resolve slug: check filesystem docs first, then DB docs - Filesystem docs: iframe src = /public/dev/[path] - DB docs: iframe src = blob_url - iframe: sandbox="[insert confirmed string from Step 0B here]", width="100%", height="100vh", style="border:none" - 404 fallback: if blob_url HEAD request returns 404, render named error component: "This document could not be loaded. If you submitted this document, please contact us." - Do not attempt to handle iframe onError for cross-origin 404s — use server-side HEAD check instead Use existing Musinique Tailwind classes and bb- color variables. No new dependencies. Return: /app/dev/page.tsx and /app/dev/[...slug]/page.tsx.
Expected Output
Two TypeScript files. Card grid groups by category. "Built with Gru" badge appears for methodology='gru'. Iframe uses the exact sandbox string from Step 0B. Broken blob_url renders the error component, not a blank frame.
Handoff Condition
/dev renders with filesystem docs grouped by category. "Built with Gru" badge appears on Gru subfolder docs. Clicking a card opens the doc in a full-viewport sandboxed iframe. A deliberately broken blob_url renders the error component. No TypeScript errors.
Dependency
Steps 3 (migration), 4 (scanner), 5 (filesystem scaffold), 0B (sandbox string confirmed).
STEP 10
Audit /dev output — six checks before upload pipeline
Phase C Human Task [PA] Plausibility Auditing
Supervisory Capacity
[PA] Plausibility Auditing — reading the /dev output against domain knowledge before any community submission goes near it.
Action
Open /dev in the browser. Check: (1) Are three existing Gru SDD docs visible, grouped correctly by category? (2) Does each show the "Built with Gru" badge? (3) Click each one — does the SDD render correctly in the iframe? (4) Check browser console — any sandbox violation errors? (5) Inspect the iframe element — does it have the exact sandbox attribute string from Step 0B? (6) Test the 404 path: rename one HTML file temporarily, reload — does the error component appear (not a blank frame)?
Handoff Condition
All six checks pass. No sandbox violations in console. Error component renders correctly on 404. The /dev page is ready to receive the upload pipeline.
Dependency
Step 9 complete.

Phase I — Integration Layer

STEP 11
Build POST /api/dev/upload — five-step validation, Blob then DB write
Phase I Claude Task
Context Required
SDD D2 /api/dev/upload full contract. SDD S4 edge cases D7, D8. Musinique /api/upload/route.ts. dev_docs table schema.
View Prompt
You are working on boondoggling.ai, a Next.js 15 App Router project. Build POST /api/dev/upload. This is the most critical write endpoint — it handles community HTML file uploads to Vercel Blob and creates a draft dev_doc record. REQUEST: multipart/form-data with fields: - file: HTML file (required) - title, slug, description (required) - submitted_by, build_url (optional) - category: 'www' | 'agents' | 'games' (required) SERVER-SIDE VALIDATION (run in this exact order, return immediately on failure): 1. Content-type check: file.type must be 'text/html' OR (file.type is 'application/octet-stream' AND filename ends with '.html') → 400 { "error": "File must be an HTML file" } 2. Size check: file.size must be ≤ 512000 bytes (500kb) → 400 { "error": "File too large (max 500kb)" } 3. HTML signature check: read first 100 bytes, check for '
Expected Output
A single complete TypeScript route file. All five validations run in order with correct early returns. Blob write precedes DB insert. DB insert failure logs the orphaned Blob URL and returns 500 without attempting Blob cleanup. Auth check is the first operation.
Handoff Condition
Route handles all five validation failures with correct HTTP status codes. Successful upload creates a dev_docs record with published=false. A simulated DB failure after Blob success logs the orphaned URL and returns 500 — the Blob file is not deleted. Auth check returns 401 before any file processing.
Dependency
Steps 3 (migration), 6 (auth confirmed).
STEP 12
Test upload route against all five validation cases before building admin UI
Phase I Human Task [PA] Plausibility Auditing
Supervisory Capacity
[PA] Plausibility Auditing — testing the upload route against the five validation cases before the admin UI is built on top of it.
Action
Use curl or Hoppscotch to test /api/dev/upload directly (with a valid admin session cookie). Run five tests: (1) upload a valid HTML file — expect 201. (2) upload a .txt file renamed to .html — expect 400 "Invalid HTML file". (3) upload a valid HTML file over 500kb — expect 400 "File too large". (4) upload with slug containing a slash — expect 400 "Slug must be lowercase…". (5) upload the same valid file twice (same slug) — expect 409 on second attempt. Document results.
Handoff Condition
All five test cases return the expected status codes and error messages. Do not build the admin upload UI until all five pass.
Dependency
Step 11 complete.
Highest-Risk Handoff
Step 13 (admin dev tab) is built on the assumption that the upload route behaves exactly as specified. If Step 12 reveals any validation case returns the wrong status code, the admin UI will silently mishandle errors. This test is the gate — do not skip it.
STEP 13
Build Admin Dashboard /dev tab — upload form, draft queue, publish flow
Phase I Claude Task
Context Required
Step 12 test results (all passing). Musinique admin dashboard pattern. SDD S1 Component 6. dev_docs table schema. /api/dev/upload contract from Step 11.
View Prompt
You are working on boondoggling.ai, a Next.js 15 App Router project. Build the Admin Dashboard Dev tab at /app/admin/dashboard/dev/page.tsx. VIEW 1: Draft queue - List all dev_docs WHERE published = false, ordered by created_at DESC - Each row: title, submitted_by, category, created_at, "Publish" button, "Decline" button - "Publish" button: opens inline form to set quality_signal, build_url, and audit_notes before confirming - "Decline" button: confirms hard delete of DB record (Blob cleanup is manual — do not delete Blob here) VIEW 2: Published docs - List all dev_docs WHERE published = true, ordered by published_at DESC - Each row: title, category, methodology, quality_signal badge, build_url if present, "Unpublish" and "Edit" buttons - "Edit": opens inline form to update title, description, quality_signal, build_url, category UPLOAD FORM (above both views): - File input: accepts .html only - Fields: title (required), slug (required, auto-slugify from title on input), description (required), category dropdown (WWW / Agents / Games), submitted_by (optional), build_url (optional) - Submit button: "Upload Draft" - POST to /api/dev/upload as multipart/form-data - On success: show "Draft created", refresh draft queue - On error: show error message from API inline (do not clear the form) AUDIT NOTES FIELD (in publish inline form): - Textarea labeled: "Audit report (paste from Claude)" - Not a DB gate — a UI reminder only - Label text: "Paste your Doc Audit Prompt report here before publishing." Do not use HTML form tags — use React state and onClick handlers throughout. Use existing Musinique admin patterns, Tailwind classes, and bb- color variables. Return the complete /app/admin/dashboard/dev/page.tsx file.
Expected Output
A complete TypeScript React component. Upload form POSTs to /api/dev/upload. Error messages render inline. Publish flow requires quality_signal before confirm activates. Audit notes textarea visible and labeled. No <form> tags.
Handoff Condition
Upload form creates a draft dev_doc via the API. Draft appears in queue immediately. Publish sets published=true via PATCH. Unpublish sets published=false. Audit notes textarea visible in publish form. No <form> tags.
Dependency
Step 12 complete (upload route verified).

Phase B — Full Feature Build

STEP 14
Build homepage — five-beat scrolling narrative
Phase B Claude Task
Context Required
SDD V3 Flow 1 (homepage five beats). SDD V4 (UN-1, UN-2, UN-4, BN-1). SDD V2 Principles 1 and 2. Confirmed Gru prompt character count from Step 0A.
View Prompt
You are working on boondoggling.ai, a Next.js 15 App Router project using Tailwind CSS and the bb- color palette (--bb-1 through --bb-8 as CSS variables). Build the homepage at /app/page.tsx as a five-beat scrolling narrative. Fully static — no JS-gated progression, no animations that block content, no account required. BEAT 1 — What is boondoggling? Headline: "You use Claude. You don't conduct it." Body: 3–4 sentences. Claude solves faster than any human. That gap will not close. What will not change: Claude cannot verify its output against domain reality, cannot reframe a poorly formulated problem, cannot supply accountability. The human's job is not to type less — it is to decide more precisely. CTA: none BEAT 2 — Why does it matter? Headline: "The five things only you can do." Five labeled blocks (not bullet points): [PA] Plausibility Auditing — one concrete sentence [PF] Problem Formulation — one concrete sentence [TO] Tool Orchestration — one concrete sentence [IJ] Interpretive Judgment — one concrete sentence [EI] Executive Integration — one concrete sentence Keep descriptions concrete — not "think strategically" but "hear the wrong note before you recompute it." BEAT 3 — How does it work? Headline: "Meet Gru." Body: 2–3 sentences. Gru is a system prompt for Claude that builds SDDs and generates a Boondoggle Score — a sequenced plan separating what Claude builds from what you build. You run it in your own Claude Project. CTA: text link → /videos ("Watch how it works →") BEAT 4 — Get the tool Headline: "Copy Gru. Paste it into a Claude Project. Start building." Three numbered steps: 1. Go to /tools and copy the Gru system prompt 2. Open claude.ai → create a new Project → paste into Project Instructions 3. Type /help to start CTA: primary button → /tools ("Get Gru →"), bg-[var(--bb-2)], text-white, hover:bg-[var(--bb-1)] BEAT 5 — See it in action Headline: "Real builds. Real SDDs. Real Boondoggle Scores." Body: 1–2 sentences. Every doc in /dev is a real build produced using Gru. CTA: text link → /dev ("Browse worked examples →") DESIGN: - Each beat: full-width section, generous vertical padding (py-24 or equivalent) - Beats 1, 3, 5: bg-[var(--bb-8)]; beats 2, 4: white background - All text: bb-1 body, bb-2 headlines - Beat 2 capacity blocks: monospace label in bb-5, name in bb-2 bold, description in bb-1 - Mobile responsive, single column at all breakpoints - No JavaScript required for any beat to render Return: the complete /app/page.tsx file.
Expected Output
A complete static TypeScript page. Five sections with correct alternating backgrounds. All CTAs link to correct routes. Five supervisory capacity blocks render as labeled elements. Primary button uses bb-2 background. Fully responsive.
Handoff Condition
Homepage renders all five beats. All links resolve (/tools, /videos, /dev). Five capacity blocks display correctly on mobile. No JavaScript errors. Page is readable with JavaScript disabled.
Dependency
Step 1 complete. Steps 7, 9 complete (so linked routes resolve).
STEP 15
Read homepage as a first-time learner — five-beat clarity test
Phase B Human Task [IJ] Interpretive Judgment
Supervisory Capacity
[IJ] Interpretive Judgment — reading the homepage as a first-time learner would, not as the person who wrote the methodology.
Action
Read each beat as if you have never heard of boondoggling. Ask after each beat: (1) do I understand what this is? (2) does this make me want to continue? (3) is there anything that would confuse a Claude user who has never seen this methodology? Check Beat 2 specifically — do the five supervisory capacity descriptions make sense to someone who has never labeled a human task by capacity? If any beat fails, note exactly what is unclear. Bring those notes back to Claude as specific edits — not "make it better" but "the [PA] description says X, a first-time learner would interpret that as Y, change it to Z."
Handoff Condition
You can read the homepage as a first-time learner and confirm that after Beat 4 you would copy the Gru prompt and try it. If you cannot confirm that — the homepage is not ready.
Dependency
Step 14 complete.
Highest-Risk Handoff
This is the only step in the score where you are evaluating subjective clarity, not objective correctness. Claude can generate a technically correct page that fails the first-time learner test. This handoff is the one most likely to require a revision cycle.
STEP 16
Audit and update Musinique ported files for boondoggling.ai
Phase B Claude Task
Context Required
Musinique ports list from P1 (items 8, 9, 11, 13, 27, 28). SDD P3 environment variables (NEXT_PUBLIC_SITE_URL=https://www.boondoggling.ai).
View Prompt
You are working on boondoggling.ai, a Next.js 15 App Router project forked from Musinique. Audit these five files and confirm whether they need changes for boondoggling.ai: 1. /app/admin/login/page.tsx and /api/admin/login/route.ts — Should work unchanged. Confirm. 2. /app/sitemap.ts - Update NEXT_PUBLIC_SITE_URL to boondoggling.ai - Add /dev routes (filesystem slugs and DB slugs) - Add /tools routes (filesystem slugs and DB slugs) - Keep /blog routes 3. /app/robots.ts - Disallow: /admin/, /api/ - Sitemap: https://www.boondoggling.ai/sitemap.xml - Confirm or correct. 4. /components/Header/Header.tsx - Update nav: About, Blog, Tools, Dev, Videos - Logo: placeholder text "boondoggling.ai" (logo asset TBD) - Keep dark/light mode toggle - Remove any Musinique-specific links 5. /components/Footer/Footer.tsx - Update site name and links for boondoggling.ai routes - Keep legal links (Privacy, Terms) - Remove Spotify embed section For each file: return UNCHANGED with a one-line confirmation, or return the complete updated file. Minimal diff only.
Expected Output
For each of five files: either "UNCHANGED" with a one-line confirmation, or the complete updated file. Sitemap includes /dev and /tools routes. Header nav matches boondoggling.ai routes. Footer has no Spotify embed.
Handoff Condition
Sitemap returns valid XML at /sitemap.xml. Header nav links resolve correctly. Footer has no broken links or Musinique-specific references. robots.txt disallows /admin/ and /api/.
Dependency
Step 1 complete. Steps 7, 9 complete (so /tools and /dev exist for sitemap).

Phase H — Hardening

STEP 17
Audit five pre-launch Must-Fix cases — MITIGATED or UNMITIGATED
Phase H Claude Task
Context Required
SDD S4 full edge case list. The five pre-launch Must-Fix cases: D2 (sandbox), D8 (non-HTML upload), T4 (NULL prompt_text), A6 (server-side tool validation), A3 (Blob delete failure). Output files from Steps 9, 11, 7, 13.
View Prompt
You are working on boondoggling.ai. Audit five pre-launch Must-Fix cases. For each: state MITIGATED or UNMITIGATED with the relevant code snippet. Provide targeted fixes only for UNMITIGATED cases — do not rewrite entire files. CASE 1 — D2: Community HTML sandbox File: /app/dev/[...slug]/page.tsx Check: does every iframe serving a DB-sourced dev_doc have the confirmed sandbox attribute? Does every iframe serving a filesystem dev_doc also have the same sandbox attribute? CASE 2 — D8: Non-HTML file with .html extension File: /app/api/dev/upload/route.ts Check: does step 3 of validation (HTML signature check) read the first bytes of file content and check for DOCTYPE/html signature, independent of the filename extension? CASE 3 — T4: NULL prompt_text for prompt-type tool File: /app/tools/[slug]/page.tsx Check: is there a guard that handles prompt_text being null for a prompt-type tool? What does it render? CASE 4 — A6: Server-side validation for prompt_text Files: /app/api/tools/route.ts (POST) and /app/api/tools/[id]/route.ts (PATCH) Check: does the server validate that prompt_text is non-null and non-empty when tool_type='prompt'? CASE 5 — A3: Blob delete failure blocking DB delete File: /app/api/dev/[id]/route.ts (DELETE handler) Check: does Blob delete failure (404 from Blob SDK) log the error and continue to the DB delete, rather than throwing and aborting?
Expected Output
Five MITIGATED/UNMITIGATED verdicts with code snippets. Targeted fixes only for unmitigated cases — not full file rewrites.
Handoff Condition
All five cases return MITIGATED. If any return UNMITIGATED, the fixes are applied and the specific case is re-tested manually before proceeding to Step 18.
Dependency
Steps 9, 11, 7, 13 complete.
STEP 18
End-to-end learner journey test — incognito, seven steps
Phase H Human Task [EI] Executive Integration
Supervisory Capacity
[EI] Executive Integration — running the full learner path end-to-end before declaring the build ready for launch.
Action
Run the complete learner journey from scratch in an incognito browser window (no admin session, no cached state): (1) Land on homepage, read all five beats, confirm story is coherent. (2) Click "Get Gru →", land on /tools, find the Gru tool card. (3) Open /tools/gru, copy the prompt, open claude.ai, create a new Project, paste into Project Instructions, type /help, confirm Gru responds with the welcome menu. (4) Return to site, open /dev, confirm three category groups with Gru badges. (5) Open one doc from each category — confirm each renders in the sandboxed iframe. (6) Open /videos, confirm at least five videos visible and one plays. (7) Open /blog, confirm at least one published post renders. Document any step that fails.
Handoff Condition
All seven steps complete without a failure that breaks the core learner path (steps 1–5 are core; 6–7 are important but not core-blocking). The Gru prompt pastes into Claude Project Instructions and Gru responds correctly. This is the launch gate.
Dependency
All previous steps complete.

Phase R — Release

STEP 19
Execute P3 pre-launch infrastructure checklist
Phase R Human Task [TO] Tool Orchestration
Supervisory Capacity
[TO] Tool Orchestration — executing the pre-launch infrastructure checklist from P3.
Action
Work through the P3 pre-launch checklist in order: Vercel project created and linked to GitHub · Domain boondoggling.ai pointed to Vercel (allow 48 hours DNS) · Neon Pro plan provisioned · All environment variables set in Vercel dashboard (DATABASE_URL, ADMIN_PASSWORD, BLOB_READ_WRITE_TOKEN, NEXT_PUBLIC_SITE_URL=https://www.boondoggling.ai) · Push to main → confirm Vercel build succeeds · Run migration script against production Neon DB (not local) · /admin/login tested on production URL · Three Featured /dev docs confirmed visible on production · Five videos confirmed visible on production · /tools/gru copy button tested on production · Iframe sandbox verified on production /dev viewer · sitemap.xml returns valid XML at https://www.boondoggling.ai/sitemap.xml
Handoff Condition
Every checklist item is checked. The production URL is live, the migration has run against the production DB (not local), and the end-to-end learner journey from Step 18 passes on the production URL.
Dependency
Step 18 complete (local build passes end-to-end test).
STEP 20
Launch decision — five content conditions
Phase R Human Task [IJ] Interpretive Judgment
Supervisory Capacity
[IJ] Interpretive Judgment — deciding that the site is ready and that the content demonstrates what it claims to teach.
Action
This is the launch decision. Before making it, confirm all five conditions: (1) At least three Featured /dev docs are live — one per category — all Gru-produced, all linking to a verifiable real build. (2) At least five videos are published. (3) Gru, Ada, and the Admin Doc Audit Prompt are all live in /tools. (4) At least one blog post is published. (5) You have run the end-to-end learner journey on the production URL and it passes. If all five are true: the site is ready to share. If any are false: do not share the URL publicly.
Handoff Condition
You have made the launch decision with documented evidence for all five conditions. This is not a technical gate — it is a judgment call. Only you can make it.
Dependency
Step 19 complete.

Score Summary

20
Total Steps
9
Claude Tasks (45%)
11
Human Tasks (55%)

Supervisory Capacity Distribution

CapacityStepsNotes
[PA] Plausibility Auditing4 steps (0B, 3, 10, 12)Covers security-critical and data-critical verification points
[PF] Problem Formulation1 step (0A)Pre-build spike — defines a constraint before Claude sees the build
[TO] Tool Orchestration2 steps (1, 19)Environment setup and infrastructure execution
[IJ] Interpretive Judgment3 steps (8, 15, 20)Content decisions and the launch decision — irreducibly human
[EI] Executive Integration2 steps (5, 18)Filesystem scaffold and end-to-end integration test

No capacity appears zero times. All five supervisory roles are exercised.

Critical Path

Longest dependency chain — 11 steps
0A (prompt length) ─────────────────────────────────┐
0B (sandbox string) ──────────────┐                  │
1 → 2 → 3 (migration)             │                  │
  → 4 → 5 (filesystem scaffold)   │                  │
  → 6 (auth audit)                │                  │
  → 7 (tools UI) ◄────────────────│──────────────────┘
  → 9 (dev pages) ◄───────────────┘
  → 11 → 12 → 13 (upload pipeline)
  → 14 → 15 (homepage)
  → 16 (Musinique ports)
  → 17 → 18 → 19 → 20 (hardening → launch)

Critical: 1 → 3 → 9 → 10 → 11 → 12 → 13 → 17 → 18 → 19 → 20

Any delay in the migration (Step 3) or upload route verification (Step 12) cascades to everything downstream.

Highest-Risk Handoffs

After Step 3 — Migration Run
The migration script touches the DB. If the backfill UPDATE runs before the ALTER TABLE, it writes to a column that doesn't exist yet. Claude generates the script in the correct order — but you must read it and confirm the order before running it. This is the handoff most likely to cause irreversible damage if skipped.
After Step 12 — Upload Route Testing
Step 13 is built on the assumption that the upload route behaves exactly as specified. If Step 12 reveals any validation case returns the wrong status code, the admin UI will silently mishandle errors. The human test in Step 12 is the gate — do not skip it.
After Step 15 — Homepage Learner Readability
The homepage is the first-run experience. Claude can generate a technically correct page that fails the first-time learner test — the language is too insider, the beats are in the wrong order, the CTAs don't land. This is the only step where you are evaluating subjective clarity, not objective correctness. Most likely step to require a revision cycle.

What Is Missing From This Score

This score covers MUST-BUILD and the net-new components. The following will unlock additional score steps when prioritized: IMPORTANT items (P1 items 19–28) — /dev category filtering, /dev Gru filter, video fallback link component, search, empty states — each requires 1–2 additional steps. v2 features — user accounts, community submission form, audit checkbox enforcement — each requires its own score when the relevant SDD sections are written.