# Anton Review — Spoken Language V2
**Date:** 2026-04-03  
**Reviewer:** Anton 🐀  
**Scope:** PRD + Prototype critique  

---

## PRD CRITIQUE

### What's right
1. **The philosophy is the product.** "Wrong is fine, flow before structure, language as byproduct of thinking" — this is a genuine insight about language acquisition, not marketing fluff. It draws correctly from Krashen's input hypothesis and immersion-based pedagogy. The PRD earns its beliefs.
2. **POR as atomic unit is strong.** Making "a piece of reasoning" the unit rather than "a lesson" or "a word" is the single best idea in the document. It forces every interaction to carry intellectual weight.
3. **Language Braiding is well-articulated.** The description of code-switching as method rather than failure is clear and implementable. The "same typeface, different color" decision is correct — it emphasizes that the languages share a space, not that they're foreign to each other.
4. **The 13 features are internally coherent.** They all serve the same philosophy. Nothing in the feature list contradicts the core thesis.
5. **Build sequence is realistic.** Phase 1 scopes to the core loop only. Good discipline.

### What's wrong

1. **The PRD has no opinion on what "a session" actually feels like.** It describes a 7-step flow (Hear → Braided Read → Crude POR → Vocab Encounter → Refine → Etymology → Joke) but never addresses pacing, duration, or emotional arc. How long is step 1? 30 seconds? 3 minutes? What's the energy curve? This is the most important UX question in the product and the PRD punts on it entirely. A flow-based product lives or dies on rhythm, and the rhythm is unspecified.

2. **"The Dial" is conceptually strong but functionally vague.** The PRD describes it as a "visual/conceptual metaphor" and a "spectrum." Is it user-controlled? Automatic? Does it drive content difficulty? Does it affect the braiding ratio? The PRD says the ratio "shifts as proficiency grows" but never specifies the mechanism. This is the product's signature metaphor and it has no spec.

3. **The Vocabulary Scroll (800 words) has no sourcing logic.** Where do the 800 words come from? Are they the 800 most common Portuguese words? Topic-derived? User-history-derived? The PRD says "seeded from the current topic" but also implies a persistent 800-word layer across sessions. These are contradictory. A word list that changes per topic isn't 800 persistent words — it's a per-session vocabulary feed. Pick one.

4. **"No stage labels visible to user" (§6.5) contradicts the prototype and the UX architecture.** The PRD explicitly says "The session flows. The structure is invisible." But the prototype has stage labels ("Hear it first," "Read — Braided," "Your turn"). The PRD needs to decide: is the structure visible or not? And if invisible, how does the user know what to do at each step? This isn't a prototype bug — it's a PRD ambiguity.

5. **The "Grammar Sense" feature (§6.11) is dangerously close to content marketing, not product.** "Short, surprising observations" about grammar are blog posts. What makes this a product feature? Is it generative? Curated? Contextual to the session? The PRD describes it as card-format sidebars — that's content packaging, not interactive design. Needs a stronger mechanic or should be demoted to "nice to have."

6. **Open Questions (§11) are still open.** This is a "For Review" draft dated April 2 — one day before the prototype was built. Questions 2, 3, 4, and 5 are foundational UX decisions that directly affect the prototype. Building before answering these was premature. The PRD shows locked decisions at the top of the brief but the open questions section contradicts some of them.

7. **No error states, edge cases, or empty states.** What happens when a user has no recordings yet for "Hear Yourself Back"? What if the AI generates a bad topic angle? What if the user records silence? A PRD for a real product needs these.

8. **Section 9 exposes an API key in plain text.** `AIzaSyDXqYZInk83iVV4mD29pSuHQKbgkiI1x9Q` is embedded in a document going to a client. Strip it.

### What's underspecified

- **Audio/TTS integration.** The brief says ElevenLabs is locked, but §9 says "TTS for listening passages" without specifying ElevenLabs. The prototype uses no audio at all. Which is it?
- **Recording storage.** localStorage for audio recordings is mentioned. This is a terrible idea for anything beyond a prototype — recordings are large, localStorage has a 5-10MB limit per origin, and data loss is guaranteed. Fine for demo, but the PRD should flag this as a known limitation.
- **The "joke/pun" in step 7.** This is the most charming part of the session but has zero spec. Where do jokes come from? Are they AI-generated? Curated? Quality control on AI humor is notoriously bad.
- **Speech Work (§6.10) timeline.** "Over weeks" is not a spec. How many sessions? What triggers progression? What does "progressively un-braid" mean mechanically?

### What's overspecified

- **"5 argument-angles" per topic.** Why 5? This is an arbitrary number baked into the spec. Should be "N arguments, minimum 3" or similar. The prototype obediently shows exactly 5 argument cards, which feels rigid.
- **The data model (§9).** Too early for a PRD at this stage. The data model should emerge from the features, not be specified before they're built. It's also incomplete (no model for The Dial state, no model for joke/etymology content).

---

## EXECUTION CRITIQUE

### What Kitt already flagged (confirmed)
All 6 of Kitt's issues are real. I'll add specifics:

1. **Z2 canvas cards overlap.** The positioning uses percentage-based `left`/`top` on `position: absolute` 300px-wide cards. On any viewport under ~1200px, cards collide. The connector SVG draws lines between calculated centers, but these centers don't account for the card's actual rendered position after CSS transforms. On first load the SVG may render before the cards settle.

2. **Session card overlay is inadequate.** `rgba(248,244,239,0.82)` — 82% opacity with the warm background color. Not enough. Cards, connectors, and special cards bleed through. The overlay needs to be 95%+ or the session card needs to be on its own full-screen layer.

3. **Vocab panel width (200px) is hardcoded** and doesn't integrate with the session card's `max-width: calc(100vw - 280px)`. The 280px gap roughly accounts for the vocab panel, but the session card's horizontal centering via `left: 50%; transform: translateX(-50%)` doesn't offset for the panel. Result: the session card overlaps the vocab panel's space on narrower screens.

4. **Stage label is 10px uppercase.** Too small. The most important orienting text in the session flow is smaller than the card metadata.

5. **Z1→Z2 has no zoom.** It's a `scale(0.98)→scale(1)` opacity crossfade. The PRD implies spatial hierarchy (topics contain arguments). The transition should communicate "going deeper," not "switching tabs."

6. **The Dial is a 110px×5px track in the nav.** It's the product's signature metaphor and it occupies less visual space than the user avatar.

### Additional execution issues (beyond Kitt)

7. **No audio at all.** The play button does nothing. The mic button fakes a recording with a setTimeout. For a prototype that's demoing a *listening-first* language product, the absence of any real audio — even a placeholder MP3 — fundamentally undermines the pitch. The client will press play, hear nothing, and question whether the team understands the product.

8. **The braided text is hand-coded, not generated.** The prototype hardcodes one braided passage about street food. This is fine for a static demo, but it means the prototype can only demo one topic. If Daniel clicks "Politics & Persuasion," he'll get... the street food session. Every topic routes to the same session content. This should at minimum be flagged visually ("demo content" label) or the non-functional topics should be disabled.

9. **The "SpoKen" logo treatment is confusing.** The logo renders as two rows: "S p o" / "K e n" with mixed sizing. It looks like a loading glitch, not a brand mark. The capital S and K with lowercase letters reads as broken kerning. If this is intentional brand design, it needs to be more deliberate. If it's a prototype placeholder, it signals low craft to the client.

10. **Mobile is broken.** The vocab panel hides entirely on <600px (`display: none`). The session card's responsive override removes the `translateX(-50%)` centering but positions it at `left: 16px` without `transform: translateX(0)`. The session card becomes left-aligned on mobile, and the active state `transform: translateY(0)` doesn't include the `translateX(-50%)` used on desktop. This means the card jumps horizontally during the animation on exactly-600px viewports.

11. **No custom topic input works.** The "Enter your own topic" button has no onclick handler. It's a dead button on a product where custom topic input is the primary differentiator ("excitement filter").

12. **The breadcrumb pills are functional but fragile.** They're built with innerHTML and inline onclick handlers. More importantly, clicking the topic breadcrumb calls `backToMap()` but also sets `state.argument = null` — this is correct, but clicking it while in a session doesn't close the session card first. The overlay persists without the session card.

13. **"Hear yourself back" and "Speech Work" special cards on Z2 are non-functional.** They have no onclick handlers. These are premium features in the PRD and dead elements in the prototype. The client will click them.

14. **No etymology sidebar, no idiom layer, no joke.** Three of the PRD's most distinctive features are completely absent from the prototype. The session flow goes Hear → Read → Speak → Refine → End. That's 5 of 7 steps. The missing steps (vocabulary encounter is folded into the end card, etymology and joke are gone) are the ones that give the product personality.

15. **The "Hear yourself back" comparison in Stage 5 is fake math.** It shows "First attempt" vs "This attempt" with different waveform SVGs, but both are static illustrations. In a real demo, these should at minimum look identical (since there's only been one session). Showing a "better" waveform for the second attempt implies AI evaluation — which contradicts the PRD's "no grading" philosophy.

16. **Color system is incomplete.** The PRD calls for "same typeface, different color" for braiding. The prototype uses `var(--pt): #C0392B` (a red) for Portuguese. But this same red is used for the mic button, the waveform, the Dial fill, and the stage labels. Portuguese text competes visually with UI chrome. The language color should be distinct from the interaction color.

17. **No favicon, no meta description, no OG tags.** This is going on a staging URL that will be shared with a client. The browser tab says "Spoken — Language V2" which is fine, but the missing OG tags mean any link preview will be blank.

---

## PRIORITY FIX LIST

Ordered by impact on client perception and product fidelity.

### 1. ADD REAL AUDIO (or convincing placeholder)
**Impact:** Critical — this is a listening-first product with no audio  
**Fix:** Embed a 30-second ElevenLabs-generated Portuguese passage about the street food topic. Wire the play button to an `<audio>` element. Even a single real audio clip transforms the demo from "wireframe" to "product." Use the locked ElevenLabs integration — generate the passage text from the stage-quote content.

### 2. FIX THE SESSION CARD OVERLAY
**Impact:** Critical — the session is the product, and it's visually broken  
**Fix:** Replace the canvas overlay with `background: var(--bg)` at `opacity: 0.97` or use a solid color with subtle blur: `backdrop-filter: blur(12px); background: rgba(248,244,239,0.95)`. The Z2 canvas should be completely occluded during a session. Alternatively, make the session card full-screen (not a floating card) — this would better match the PRD's "invisible structure" philosophy.

### 3. FIX Z2 CANVAS LAYOUT
**Impact:** High — cards overlap on most real viewports  
**Fix:** Replace percentage-based absolute positioning with a proper layout. Options: (a) CSS Grid with defined areas, (b) a force-directed layout with collision detection, or (c) a simple responsive grid that stacks on narrow viewports. The "mind map" aesthetic is nice but must actually work. Minimum: test at 1024px, 1280px, 1440px and ensure no overlap.

### 4. MAKE THE DIAL PROMINENT
**Impact:** High — it's the product's signature metaphor  
**Fix:** Move the Dial out of the nav bar. Give it its own visual moment — either a persistent element below the nav (40px tall, full-width gradient track with labeled endpoints "English" ↔ "Português") or integrate it into the session card as the primary progress indicator. Size: minimum 200px wide. Add labels at both ends. Add a thumb/marker showing current position.

### 5. DISABLE NON-FUNCTIONAL TOPICS
**Impact:** High — clicking any topic other than "Brazilian Street Food" leads to the same content  
**Fix:** Either (a) grey out / mark other topics as "Coming in demo v2" or (b) generate minimal different content for 2-3 topics. Option (a) is faster and more honest.

### 6. ADD Z1→Z2 ZOOM TRANSITION  
**Impact:** Medium-high — spatial hierarchy communicates the product's information architecture  
**Fix:** When a topic card is clicked, animate: (1) the card scales up to fill the viewport, (2) crossfade to the Z2 canvas. Use CSS `transform-origin` set to the card's position, then `scale(3)` + fade. The reverse (Z2→Z1) should zoom out. This communicates "topics contain arguments" spatially.

### 7. INCREASE STAGE LABEL SIZE AND ADD STAGE NAMES
**Impact:** Medium — users need orientation in the flow  
**Fix:** Stage labels → 14px minimum, semibold, not uppercase. The PRD says "no stage labels visible to user" but the prototype already shows them — resolve this by making them useful. Consider replacing the dot indicators with a subtle text progression: "Listen → Read → Speak → Refine → Reflect."

### 8. ADD ETYMOLOGY/IDIOM TO SESSION FLOW
**Impact:** Medium — these are the features that make the product distinctive, not generic  
**Fix:** Between Stage 4 (Refine) and Stage 5 (End), add a Stage 4.5: an etymology card. Short, hand-written for the demo. Example: "'Resistência' — from Latin 'resistentia.' The same root gives English 'resist.' When Dona Maria refuses to sell her barraca, she is, etymologically, standing firm." This takes 20 minutes to add and disproportionately increases the demo's charm.

### 9. FIX VOCAB PANEL INTEGRATION
**Impact:** Medium — it feels bolted on rather than ambient  
**Fix:** The panel should not have a hard left border that competes with the session card. Options: (a) make it translucent with no border, words floating at the edge of the screen, (b) integrate vocab words into the session card itself as a horizontal strip at the bottom, or (c) keep the panel but fade it to 30% opacity during active session stages, brightening words only when they appear in the braided text.

### 10. FIX THE LOGO
**Impact:** Medium — first thing the client sees  
**Fix:** Either use a proper Spoken wordmark (ask Daniel for brand assets) or render "Spoken" in a single clean serif. The split "S p o / K e n" treatment communicates nothing and looks broken.

### 11. WIRE THE "ENTER YOUR OWN TOPIC" BUTTON
**Impact:** Medium — the excitement filter is the product's entry point  
**Fix:** Add an onclick that shows a text input below the button. Even if it doesn't generate real AI content, the input field with a "Generate arguments →" button communicates the feature's existence.

### 12. FIX MOBILE LAYOUT
**Impact:** Medium — Daniel may open this on his phone  
**Fix:** (a) Fix the session card's responsive centering (`left: 0` + remove conflicting transforms), (b) on mobile, make the session card full-screen (not a floating card), (c) consider a mobile-first vocabulary display (horizontal scroll at bottom instead of side panel).

### 13. ADD OG TAGS AND FAVICON
**Impact:** Low but easy — link previews matter  
**Fix:** Add `<meta property="og:title" content="Spoken Language V2">`, `<meta property="og:description" content="Language as a byproduct of thinking.">`, and a simple favicon. 5 minutes of work.

### 14. DIFFERENTIATE PORTUGUESE COLOR FROM UI COLOR
**Impact:** Low-medium — visual coherence  
**Fix:** Portuguese text should use a distinct color that's not shared with buttons and UI elements. Consider a warm terracotta (#B85C38) or a deep teal for Portuguese, keeping the current red (#C0392B) for interactive elements only.

### 15. STRIP API KEY FROM PRD
**Impact:** Low but necessary — the PRD goes to a client  
**Fix:** Remove `AIzaSyDXqYZInk83iVV4mD29pSuHQKbgkiI1x9Q` from §9. Replace with `[REDACTED — configured in environment]`.

---

## SUMMARY JUDGMENT

**The PRD** is philosophically strong and structurally sound. Its weaknesses are in the operational details: session pacing, the Dial's mechanics, vocabulary sourcing, and edge cases. These are solvable in a Phase 1 spec pass. The bigger risk is that the PRD's ambiguities (visible vs. invisible structure, 800-word list scope) will cause repeated prototype mismatch.

**The prototype** demonstrates the information architecture (Z1 topics → Z2 arguments → Z3 session flow) and the visual language (warm, editorial, not gamified). That's real progress. But it fails to demonstrate the product's three most important qualities: *sound* (no audio), *flow* (abrupt transitions, broken layout), and *braiding* (single hardcoded passage). A client viewing this will understand the concept but not feel the product.

**The gap between PRD and prototype is approximately 40%.** The prototype covers the navigation structure and the session skeleton. It doesn't cover audio, real braiding, vocabulary mechanics, etymology, idioms, the Dial as a functional element, or any of the "living" qualities that make V2 different from a flashcard app.

Fixes 1-4 are critical. Do those before showing this to Daniel.
