Generated 2026-06-10T07:45:40.283Z · swipe each strip sideways · beat slides show the full 5-frame burst + mobile (purple border)
investing-foundations
ship
solid · ~35 min · 6 beats · 0 console errors
- [blocker · D2] CARRIED FORWARD — STILL NOT RESOLVED, root cause refined. The prior '→ suffix' fix WAS applied to the fixture (targets now read 'Run the decade →', 'Advance one year →', 'The market is euphoric →', 'See the gap →'). But a NEW off-by-one defect remains and the anchor's defining beat is still unproven. Trace: PEAK_YEAR=5, and the 'The market is euphoric →' NavBar label (DrawdownDecadeSim.tsx line 423) only renders when yearShown===5. After the crash decision (yearShown=3 'panic'), the fixture does ONE 'Advance one year →' (step 18, yearShown 3→4) then immediately clicks 'The market is euphoric →' (step 20) — but at yearShown=4 the button still reads 'Advance one year →', so the click TIMES OUT (manifest interactionErrors confirm 5 desktop + 5 mobile timeouts on the post-panic steps). Every subsequent click cascades off the parked state. Both bursts (15-after-panic-sell AND 15-after-behavior-gap, desktop + mobile) show the sim parked at 'Year 6 of 10' with the button reading 'The market is euphoric →' — it never crossed the peak decision and never reached the 'See the gap' compile screen. The You-vs-twin cards, the gap narrative, and the cost line are UNPROVEN in render. The sim code is real and correct (canRun gates on feeOk+bandOk+fullyAssigned; twin is a second loop in the sim useMemo; the change-guarded persistence useEffect at line 255 exists) — this is purely a fixture-sequencing defect, not a module defect, but it blocks proving the anchor. fix: In tasks/wow-capture/fixtures/investing-foundations.json slide-15 steps, insert one additional {"do":"click","target":"text=Advance one year →"} (plus a wait) BETWEEN the post-panic 'Advance one year →' (step 18) and the 'The market is euphoric →' click (step 20). The peak is at yearShown===5, which is TWO advances after the crash decision at yearShown=3, not one. Then recapture slide 15 and confirm 15-after-behavior-gap shows the You-vs-twin cards + the cost line + the gap narrative. — RESOLVED 2026-06-10: entities replaced with real chars (IndexFoundationsBuilder 395/467); fixture advance-count corrected twice (peak = 2 advances post-crash, gap = 5 advances post-peak); You-vs-twin payoff verified in recapture ($6.1K vs $17.3K, cost $11.2K). ✓ resolved
- [blocker · B3] PARTIALLY CARRIED FORWARD — prior lines 175/560 ARE now fixed (use literal ’s and —). But TWO sibling HTML entities in the SAME file remain broken and are confirmed runtime defects. IndexFoundationsBuilder.tsx line 395 ('Fund philosophy — pick one') and line 467 ('The “boring beats brilliant” thesis...') are PLAIN JSX text, NOT dangerouslySetInnerHTML, so React escapes them and a student sees 'Fund philosophy — pick one' and 'The “boring beats brilliant”' verbatim. Both render in the builder's configure phase (line 395) and rules phase (line 467) — phases the slide-14 fixture skips (it stops at persona-pick), so not visible in this capture, but confirmed by code read. Lines 107/108 (rule.label/rule.reason) are SAFE — consumed via dangerouslySetInnerHTML at lines 229/502/518/595. fix: In IndexFoundationsBuilder.tsx line 395 replace '—' with '—'; line 467 replace '“' with '“', '”' with '”'. (Lines 107/108 may be left — they hit the dangerouslySetInnerHTML path — though normalizing them too would be cleaner.) — RESOLVED 2026-06-10: entities replaced with real chars (IndexFoundationsBuilder 395/467); fixture advance-count corrected twice (peak = 2 advances post-crash, gap = 5 advances post-peak); You-vs-twin payoff verified in recapture ($6.1K vs $17.3K, cost $11.2K). ✓ resolved
- [nice-to-have · L6] ChapterIntro heroes use the studio's abstract-nature divider assets (sediment/driftwood/marble/riverstones canyon imagery) as metaphor framing. This is the established studio ChapterIntro pattern and is acceptable at chapter boundaries — the in-BODY reading photography is correctly topic-carrying (phone-screen on the gambling-vs-investing reading, laptop on the funds reading, campus students on the three-implementations reading). Noting only so the L6 'no abstract-nature in-body' rule isn't misread as a violation here; the in-body uses are clean. fix: No action required — flagged for clarity only.
slide 10 f1 → f5 + mobile
slide 11 f1 → f5 + mobile
slide 12 f1 → f5 + mobile
slide 13 f1 → f5 + mobile
slide 14 f1 → f5 + mobile
slide 15 BEAT — full burst
slide 16 f1 → f5 + mobile
slide 17 f1 → f5 + mobile
slide 18 f1 → f5 + mobile
slide 19 f1 → f5 + mobile
slide 20 f1 → f5 + mobile
slide 21 f1 → f5 + mobile
stocks-and-funds-deeper
ship
solid · ~35 min · 7 beats · 0 console errors
- [should-fix · D2] CARRIED FORWARD — still unresolved. The driven burst never proves the sim working. 'after-hold-through-crash-f5' and 'after-advance-to-flat-year-f5' are pixel-identical to the base 07-f5 on both desktop AND mobile: portfolio still $1,000, Event 1 of 5 still showing, no reveal panel, choice cards untouched. The manifest records interactionErrors on slide 7: '[desktop] step 4 (click): Timeout 5000ms exceeded' and the same on mobile. The fixture selected the Hold card but never clicked 'Lock it in →' (HoldOrFoldMarketSim.tsx:408) to surface the consequence panel, so the 'Next event →' locator (step 4) timed out. The sim's two-stage commit (choose card → Lock it in → Next event) is still not modeled by the capture script. NOTE: this is a CAPTURE defect, not a module defect — I independently verified the reveal() math in code and by re-simulation (sell-and-stay-cash=$662, chase=$892, all-hold=$1,267=baseline), so the sim is functionally correct; it is simply not exercised in render. hasFunctionalSim=true with simProvenInRender=false is a fixture gap, not a fix-first. fix: Repair the capture fixture: after clicking a choice card, click 'Lock it in →', wait for the consequence panel (.border-l-4), then click 'Next event →'; loop across all five events. Recapture slide 7 on both viewports and verify the 'Portfolio now' value and event index visibly change across the burst. — RESOLVED 2026-06-10: fixture models the two-stage commit (choose → Lock it in → Next event) ×5; all five consequence panels captured, 0 interaction errors. ✓ resolved
- [nice-to-have · D2] Subtle pedagogy edge in the now-correct math: the path 'sell to cash at the crash, then immediately Hold (re-enter) every event after' lands at exactly $1,267 — identical to never-touching baseline — because the -37% has already hit both paths and re-entering captures the full 60% recovery. That is mathematically honest (you cannot dodge the drop), but the final-screen panicSold branch only fires when the cash choice is at index<=2 AND a takeaway distinguishes beat/tie/loss; a student who sells-then-immediately-rebuys ties baseline and gets the panicSold 'beatBaseline' copy ('still came out ahead' — but it's a tie, not ahead). Minor: the tie case for a panic-then-reenter run reads slightly off. Not a blocker; the dominant lessons (stay-in-cash loses, chase loses, hold ties) all land correctly. fix: Optional: in the final-screen panicSold branch, handle the exact-tie case (total within $1 of baseline) with copy acknowledging the re-entry rescued the run, distinct from the 'came out ahead' wording.
- [nice-to-have · D5] Module is genuinely SOLID at the scale-tier content-first bar — three full editorial readings each with multiple distinct active-block types (ReadingCheck, TrueFalseCheck, EstimateReveal, TapTheTrap), two operated sims (FeeDragSim + the anchor), a real cascade deliverable (AllocationDecisionBuilder via useDeliverable, registered, slidemap step 6 matches), clean mobile, zero console errors, no dead first frames, topic-carrying photography. It clears every gate. But nothing rivals the reference pack — the anchor is a strong, honest constrained sim yet structurally it is a five-step choose/reveal loop the studio has siblings of; it is 'at' the bar, not 'above'. Flagging per the rubric that an all-'at' module is shippable but not memorable; no action required. fix: None required — shippable. If a ceiling push is ever desired, the anchor's final screen could visualize the three counterfactual paths (your run vs do-nothing vs panic-sell) as a single small chart rather than two stat columns, to make the 'boring wins' moment land harder.
slide 7 BEAT — full burst
slide 10 f1 → f5 + mobile
slide 11 f1 → f5 + mobile
slide 12 f1 → f5 + mobile
slide 13 f1 → f5 + mobile
slide 14 f1 → f5 + mobile
slide 15 f1 → f5 + mobile
slide 16 f1 → f5 + mobile
slide 17 f1 → f5 + mobile
slide 18 f1 → f5 + mobile
crypto-and-speculation
ship
solid · ~38 min · 3 beats · 0 console errors
- [blocker · D2] CARRIED FORWARD — UNRESOLVED. The claimed anchor 'CasinoMoneyYearSim' (gated slice slider against pre-funded EF $1,000 + used-car $2,400 bars, vehicle menu from the 5-2 table, EstimateReveal on the parlay, irreversible walk-away/take-profit locks, 12-round bounded-random consequence engine with rug pull/3x/drawdown/April tax billed from car cash, animated goal meters, verdict + Run-again, Monte-Carlo-verified RNG) DOES NOT EXIST. grep CasinoMoneyYearSim returns nothing. Slide 4-4 imports the pre-existing SpeculationSizingBuilder (495 lines): a 3-phase static configurator (pick persona Jana/Kostya/Liam -> casino% slider 0-15 + two rule pickers -> saved card). 16-f1 and 16-f5 are identical static persona-pick card grids — no rounds, no goal bars, no $130/EF/used-car Kostya frame, no tax event, no consequence engine. The build report describes work that never landed. fix: Build the claimed constrained year-sim (or re-run the wave build). The current 4-4 is a form the student fills, not a sim they watch resolve under locked rules. — RESOLVED 2026-06-10: full rebuild landed (the wave build never reached the tree); entity sweep 408→0; ECC grids → ReadingSpreads; 22→38 min; flat persistence + hidden scratch keys; fixture authored + driven clean (0 interaction errors). ✓ resolved
- [blocker · B3] CARRIED FORWARD — UNRESOLVED. Literal HTML entities render module-wide in plain-JSX positions. slides.tsx carries 278 raw —, 32 “/”, 13 –, plus 36 ’ and chevrons, against only 7 dangerouslySetInnerHTML sinks. ExpandableConceptCard renders title/preview as plain children ({title}/{preview}), not via innerHTML, so every entity in ECC props prints verbatim. Visually confirmed: 6-1 quiz (capture 20) shows '$75 (50% — split it down the middle)', '$50 (all of it — crypto is the future)', 'Zero — speculating is always wrong'; 1-2 comparison table (capture 03) shows '...no underlying income required' rows with literal —; 5-2 table (capture 18) shows 'House edge: ... — ...'. The chapter-intro/ModuleObjectives slides decode (they use innerHTML), so the damage is in quizzes, tables, ECC props, and SpeculationSizingBuilder. fix: Replace ALL numeric/named entities in slides.tsx, quizzes.ts and SpeculationSizingBuilder.tsx plain-string positions with literal characters (— “ ” – ’ × ▲ ▼). Do not rely on dangerouslySetInnerHTML — convert the source strings. — RESOLVED 2026-06-10: full rebuild landed (the wave build never reached the tree); entity sweep 408→0; ECC grids → ReadingSpreads; 22→38 min; flat persistence + hidden scratch keys; fixture authored + driven clean (0 interaction errors). ✓ resolved
- [blocker · D1] CARRIED FORWARD — UNRESOLVED. Time-on-task ~22 min, not 35. config.ts still declares duration:'22 min' and ModuleObjectives self-declares the same. 24 sub-slides: 26 ExpandableConceptCard click-to-expand instances across 7+ grid slides (~1 min each), 5 one-paragraph chapter intros, 5 single-question quizzes (6-1..6-5). Only 3-2 (BubbleHistoryExplorer) and the 4-4 configurator hold a student past ~2 min. With the anchor sim absent (finding 1) there is no depth anchor to carry the module. Under the 30-min floor = thin. fix: Depth comes with the missing anchor sim plus converting at least two ECC grids into worked interactions (e.g. the 4-2/4-3 tax trap as a compute-the-bill beat). Update config duration only after real depth lands. — RESOLVED 2026-06-10: full rebuild landed (the wave build never reached the tree); entity sweep 408→0; ECC grids → ReadingSpreads; 22→38 min; flat persistence + hidden scratch keys; fixture authored + driven clean (0 interaction errors). ✓ resolved
- [should-fix · B3] CARRIED FORWARD — UNRESOLVED. Row chevrons render as literal text. slides.tsx:1057 is a JS expression-container string {open ? '▲' : '▼'} which does not decode; capture 18 shows '▼' next to each vehicle row in the 5-2 table. Subsumed by the module-wide B3 fix but called out as the chevron specifically. fix: Replace the chevron JS strings at slides.tsx:1057 with literal ▲ / ▼ or an SVG chevron. — RESOLVED 2026-06-10: full rebuild landed (the wave build never reached the tree); entity sweep 408→0; ECC grids → ReadingSpreads; 22→38 min; flat persistence + hidden scratch keys; fixture authored + driven clean (0 interaction errors). ✓ resolved
- [should-fix · D2] CARRIED FORWARD — UNRESOLVED. No interaction fixture exists for the anchor: manifest shows interaction:null on all 24 slides, so the 4-4 burst only ever shows the static persona-pick card grid. The configure phase (slider, two rule pickers, live stacked exposure bar, total-loss scenario, 10x reflection) and the saved phase — the only genuinely interactive moments in SpeculationSizingBuilder — are never proven in render. fix: Add a capture fixture that picks Kostya, drags the slider, selects both rules, and commits; recapture the 4-4 burst. (Moot if the anchor sim is rebuilt per finding 1.) — RESOLVED 2026-06-10: full rebuild landed (the wave build never reached the tree); entity sweep 408→0; ECC grids → ReadingSpreads; 22→38 min; flat persistence + hidden scratch keys; fixture authored + driven clean (0 interaction errors). ✓ resolved
- [should-fix · B2] CARRIED FORWARD — UNRESOLVED. speculation-sizing-plan deliverable persists only raw scratch: persona ('kostya'/'jana'/'liam'), casinoPercent (number), takeProfitRule ('2x'), walkAwayRule ('50'), committed. commit() at SpeculationSizingBuilder.tsx:121 writes no flat costSummary/decision string; the saved phase prints raw values like 'Take-profits at: 2x' and 'Walk-away at: -50%'. deliverableFieldLabels.ts FINLIT_HIDDEN_FIELDS (line 180/220) contains only 'committed' — persona/casinoPercent/takeProfitRule/walkAwayRule stay visible, so the cert-brief renders raw rows like 'Walk Away Rule: 50'. fix: On commit, write a flat human-readable summary (e.g. 'Kostya — 8% casino slice ($24/mo), take profits at 3x, walk away at -50%') and add persona/casinoPercent/takeProfitRule/walkAwayRule to FINLIT_HIDDEN_FIELDS. — RESOLVED 2026-06-10: full rebuild landed (the wave build never reached the tree); entity sweep 408→0; ECC grids → ReadingSpreads; 22→38 min; flat persistence + hidden scratch keys; fixture authored + driven clean (0 interaction errors). ✓ resolved
- [should-fix · D5] CARRIED FORWARD — UNRESOLVED. 26 ExpandableConceptCard instances vs 0 ReadingSections. 7+ content slides (1-2 table aside, 2-3, 2-4, 3-3, 3-4, 4-2, 4-3, 5-3) are 2-3-card ECC grids — click-to-expand ceremony where READ MORE reveals prose that largely repeats the preview (capture 19-full shows the 5-3 'One rule works across all four. Casino money.' 3-card grid). The calibration module subscriptions-and-creep uses zero ECCs (prose ReadingSections + bespoke interactives). Structurally this is a card-grid worksheet. Fails D4 (>=1 active block per reading) and filler-cut. fix: Collapse ECC pairs that repeat their previews; convert the tax-trap pair (4-2/4-3) into a single compute-the-bill interaction. — RESOLVED 2026-06-10: full rebuild landed (the wave build never reached the tree); entity sweep 408→0; ECC grids → ReadingSpreads; 22→38 min; flat persistence + hidden scratch keys; fixture authored + driven clean (0 interaction errors). ✓ resolved
- [should-fix · L6] CARRIED FORWARD — UNRESOLVED. All four chapter heroes are abstract nature textures: marble (2-1), sediment (3-1), riverstones for 'Sizing the bet' (4-1, capture 13), strata (5-1), plus oceanwaves intro. None topic-carrying. Riverstones for 'sizing the bet' is exactly the abstract-nature-in-body pattern the gate bans. Calibration module uses topical lifestyle photography. fix: Swap chapter heroes for topic-carrying photography (phone with sportsbook/exchange UI, scratch tickets, candlestick chart on a screen) from the studio's lifestyle library. — RESOLVED 2026-06-10: full rebuild landed (the wave build never reached the tree); entity sweep 408→0; ECC grids → ReadingSpreads; 22→38 min; flat persistence + hidden scratch keys; fixture authored + driven clean (0 interaction errors). ✓ resolved
- [should-fix · L3] CARRIED FORWARD — UNRESOLVED. Slide 1-3 'Same $130. Two different machines. Pick one.' is ~60% dead canvas pre-interaction (capture 04-f5): two thin option cards and a one-line hint float at the top of an otherwise empty viewport. fix: Give the two options visual weight (outcome-preview skeletons or the 10-year math as a ghosted chart) so the canvas is filled before the click. — RESOLVED 2026-06-10: full rebuild landed (the wave build never reached the tree); entity sweep 408→0; ECC grids → ReadingSpreads; 22→38 min; flat persistence + hidden scratch keys; fixture authored + driven clean (0 interaction errors). ✓ resolved
- [nice-to-have · D5] Minimum-effort signal: stripped of the one real explorer (3-2) and the static configurator (4-4), the module is a sequence of comparison tables, ECC card grids and single-question quizzes. The best beat (BubbleHistoryExplorer) is solid but is the only thing rivaling sibling modules; nothing here is memorable enough to pass the fun test. Even with the entity/depth blockers fixed, this would read 'at' at best — a worksheet with one good interactive, not a module a student tells a friend about. fix: Treat the anchor-sim rebuild as the depth carry, and earn a second bespoke beat (the tax-trap compute) rather than leaving the middle chapters as ECC grids. — RESOLVED 2026-06-10: full rebuild landed (the wave build never reached the tree); entity sweep 408→0; ECC grids → ReadingSpreads; 22→38 min; flat persistence + hidden scratch keys; fixture authored + driven clean (0 interaction errors). ✓ resolved
slide 4 BEAT — full burst
slide 10 f1 → f5 + mobile
slide 11 f1 → f5 + mobile
slide 12 f1 → f5 + mobile
slide 13 f1 → f5 + mobile
slide 14 BEAT — full burst
slide 15 f1 → f5 + mobile
slide 16 f1 → f5 + mobile
slide 17 f1 → f5 + mobile
slide 18 f1 → f5 + mobile
slide 19 f1 → f5 + mobile
slide 20 f1 → f5 + mobile
slide 21 f1 → f5 + mobile
slide 22 f1 → f5 + mobile