Back to Ethan’s Baby Shark Entry Chatlog  •  Tool Time #4  •  10/26/2026
S.P.A.R.K. with AI — Entry Development Log

Baby Shark — Entry Log

TTG’s prompt • C.R.A.F.T. critique • Design decisions • Improvement examples
Entry-specific companion to the Tool Time chatlog

About This Chatlog

Entry-specific development log for Tool Time Entry #4: Ethan’s Baby Shark. Per the standing convention, entry chatlogs live in their own folder. The main Tool Time chatlog documents venue-level decisions.

This log covers: TTG’s prompt with C.R.A.F.T. critique and grade, selection rationale, design decisions, and ready-to-use C.R.A.F.T. prompt examples for students who want to improve Ethan’s sketch.

Session 1 — Ethan’s Baby Shark Entry (2026-10-26)
🎯
S — Set Goal Build Tool Time Entry #4: a showcase page for Ethan’s Baby Shark animation, complete with separate CSS files for page and chatlog, a copyable code display, and a live canvas. Entry must work as-is in the p5.js editor.
TTG’s Prompt
klp (TTG)

I have attached an example of a Tool Time app by Sebastian. It is featured on our Tool Time home page and serves as an exemplar for another app we’d like to feature by novice Ethan: Baby Shark. You are a co-creator of TNT, a professional web app developer and high school computer science teacher. I want to create ethanBabySharkOrig.html that uses ethanSharkOrigSketch.js. The layout should be similar to Sebastian’s app. We should be able to copy Ethan’s code and paste it into an IDE like p5js editor and have it ‘just work.’ Novices will then use AI to improve the program while keeping its original functionality. We’ll need ethanBabySharkOrigStyles.css and perhaps ethanBabySharkOrigScripts.js. There is a parent folder, EthanShark to house these files with associated sub folders for styles, scripts and sketches. Ethan is a student in the Innovations Studio. A pic for the card representation in the ToolTime home page is attached. As we had for Sebastian’s app, we also want ethanBabySharkChatlog.html to chronicle our work here, beginning with this prompt. Demonstrate how you critique prompts by grading this one too according to our CRAFT rubric, described in our home page and home chatlog. We’ll need a CSS file ethanBabySharkChatlogStyles.css for the chatlog styles.

C.R.A.F.T. Prompt Critique
Prompt Critique — Entry #4 Session 1
A

The strongest entry build prompt in the Tool Time series. Three things push it to A and hold it just short of A+.

📚 CS Teacher lens:

✅Three-role specification. “Co-creator of TNT, professional web app developer, high school computer science teacher” — three distinct roles producing three distinct lenses: institutional knowledge, craft quality, and pedagogical intent. This is the most complete role specification in the entry build series so far.
✅The “just work” constraint is precise and meaningful. “Copy Ethan’s code and paste it into a p5js editor and have it just work” — this is not a vague quality request. It is a specific technical requirement (no .parent() calls, no DOM dependencies) that directly shaped the instance-mode adapter design. That is a constraint doing its job.
✅Separate chatlog CSS specified. “We’ll need ethanBabySharkChatlogStyles.css for the chatlog styles” — this shows awareness of the separation-of-concerns principle established in Session 22 of the main chatlog. The student has internalized the lesson.
✅Exemplar attached and named. Sebastian’s page and the card image were both attached. Exemplar-driven specification produces consistent output.
✅Self-referential CRAFT request. “Demonstrate how you critique prompts by grading this one too according to our CRAFT rubric.” This is the meta-awareness pattern established in Sessions 20–24 of the main chatlog. It is now instinctive.

💼 Hiring Manager lens:

✅File names are all explicit and consistent. No case inconsistency this time. Five file names named, all coherent.
⚠️Sketch behavior still not described. What does Baby Shark do? “Color-pulsing background, animated mouth, rising bubbles, lyric text with drop shadow” — none of this is in the prompt. The gap has been flagged in Sessions 11, Jackson, Sean, and Sebastian. This is the fifth time. A+ is two sentences away.
⚠️Deliverables list still not formal. The file names appear in prose but not as a numbered list. The functional equivalent is present — as TTG correctly noted in Session 27 of the main chatlog — but the canonical format remains unused.

Grade rationale: A. The three-role specification, the precise “just work” constraint, the separate chatlog CSS, and the self-referential CRAFT request are all genuine advances over previous entry prompts. The sketch behavior gap has been flagged five times. A+ is two sentences: “It draws a front-facing shark with an animated mouth. The background color pulses, bubbles rise, and a lyric floats at the top.”

Session 2 — Design Decisions (2026-10-26)
💬
P — Prompt (Continuation) Sessions 2 and 3 are sub-analyses from the Session 1 build request — no separate prompt.
Decision — Ocean Blue Color Identity

Ethan’s sketch uses #4A90E2 as sharkGray (despite the name, it’s a blue!) and #FF6B8B as mouthPink. The page uses those exact values as its palette — #4A90E2 as the primary accent and #FF6B8B as the secondary accent. The color comes directly from the sketch, which is the right approach.

Decision — Separate CSS Files

Per TTG’s specification: ethanBabySharkOrigStyles.css for the main page, ethanBabySharkChatlogStyles.css for this chatlog. This matches the separation-of-concerns principle established in Session 22 of the main Tool Time chatlog (CSS extraction).

Decision — Editor Compatibility Confirmed

Ethan’s sketch uses createCanvas(500, 500) without any .parent() call. It works in the p5.js editor immediately. No editor-compatibility patch needed — same as Sebastian’s sketch. This is the pattern we want: if a novice copies the code and pastes it into the editor, it just works.

Decision — Credit Grayson in the Intro

Ethan’s comments include “learned this concept from Grayson’s presentation” for the bubble off-screen reset pattern. This is good attribution practice that deserves to be acknowledged in the intro text — students citing each other’s work is exactly the community-of-practice behavior Tool Time is designed to encourage.

Session 3 — C.R.A.F.T. Prompt Examples (2026-10-26)
CRAFT Prompt #1 — Add Parent Shark

Context: I have a p5.js sketch of Baby Shark (500×500). It draws a front-facing cartoon shark with an animated mouth, 15 rising bubbles, a color-pulsing ocean background, and the lyric “Baby Shark, doo doo doo!”. [paste the sketch]

Role: Act as a creative p5.js developer who teaches animation to beginners.

Action: Add a Mama Shark in the background — smaller, partially visible, with its own slower mouth animation.

Form: Show only the new drawMamaShark() function and the one-line call to it in draw(). Do not rewrite the whole sketch.

Tight constraints: Keep Baby Shark exactly as-is. Mama Shark must be visibly smaller and clearly behind Baby Shark. The bubbles and lyric must remain unchanged.

CRAFT Prompt #2 — Refactor with Classes

Context: I have a working p5.js Baby Shark sketch with three types of moving elements: 15 bubbles (stored as three arrays), a shark mouth (animated via scale), and a color-pulsing background. [paste the sketch]

Role: Act as a Java-style OOP teacher helping a beginner understand class design.

Action: Refactor the bubble system into a Bubble class. Create an array of 15 Bubble objects to replace the three parallel arrays.

Form: Show the complete refactored sketch. Add a comment block at the top comparing the old three-array approach to the new class approach — two sentences each.

Tight constraints: Visual output must be identical. Keep the shark drawing and lyric code unchanged. Use let consistently (not var).

CRAFT Prompt #3 — Port to Python Processing

Context: I have a p5.js animation of Baby Shark (500×500). It includes a color-pulsing background, 15 rising bubbles, a front-facing shark with an animated mouth, and lyric text with a drop shadow. [paste the sketch]

Role: Act as an experienced Processing developer who knows both p5.js and Python Processing syntax.

Action: Port this sketch to Python Processing. Translate all p5.js idioms (random(), sin(), map(), push()/pop()) to their Python Processing equivalents.

Form: Provide the complete Python Processing sketch. Add a comment at the top noting the three trickiest translation decisions and why.

Tight constraints: The shark must face the viewer. The mouth must still animate. The bubbles must still rise and reset. Canvas size: 500×500.

Session 4 — Canvas Resize: 500×500 → 400×400 (2026-10-26)
🔍
A — Analyze: A Clean Resize (No Hidden Consequences) TTG requested a canvas reduction to prevent overlap with the code panel’s scroll bar. Unlike Sebastian’s Session 4 — where the resize had two hidden visual consequences (sun off-canvas, cloud starting position) — this one is genuinely cosmetic. The reason: Ethan used width and height throughout.
TTG’s Prompt
klp (TTG)

Let’s adjust the canvas size in the sketch and the copiable code to be 400 by 400 so the canvas will fit into the webpage without overlapping on the code’s scroll bar. It’s a slight but acceptable deviation from Ethan’s original code, made for cosmetic reasons. Add this to the chatlog along with your critique.

Prompt Critique
Prompt Critique — Session 4
A−

Concise, precise, and honest about the tradeoff. One gap keeps it from A.

✅Specific target value. “400 by 400” — not “smaller” or “make it fit.” A specific number makes the change unambiguous and verifiable.
✅Both locations named. “In the sketch and the copiable code” — this correctly identifies that the change must happen in two places: the ETHAN_CODE string (what gets copied) AND the instance-mode adapter (what runs on the page). Naming both prevents a partial fix.
✅Tradeoff explicitly documented. “Slight but acceptable deviation from Ethan’s original code, made for cosmetic reasons” — this is professional-grade design documentation. It names the principle being compromised (original fidelity), the scale of the compromise (slight), the justification (cosmetic), and the implicit acceptance decision (acceptable). Future maintainers understand why the code differs from the sketch file.
⚠️No role specified. Three sessions earlier (Session 1), TTG assigned three specific roles. This prompt has none. The AI knew what to do from context — but habits matter, and this is a step back from the Session 1 standard.

Why this resize is different from Sebastian’s (Session 4 in that chatlog): Sebastian’s canvas had a sun hardcoded at ellipse(500, 70, 100, 100) — reducing to 400px made the sun invisible. Ethan used width and height everywhere, so the shark, bubbles, and lyric all auto-adapt. This is better coding practice and it is worth calling out: when you use the canvas dimension variables instead of hardcoded numbers, your sketch becomes resize-friendly for free.

Why This Is Truly Cosmetic

Every size-dependent element in Ethan’s sketch uses width or height, not hardcoded pixel values:

  • translate(width / 2, height / 2 + 20) — shark centers itself ✅
  • text("...", width / 2, 60) — lyric self-centers ✅
  • bubbleX.push(random(width)) — bubbles spread to new width ✅
  • bubbleY.push(random(height, height + 200)) — bubbles start below canvas ✅
  • bubbleY[i] = height + 10 — bubbles reset below canvas ✅

The lesson: Use width and height instead of hardcoded numbers whenever you place something relative to the canvas edges or center. It costs nothing and makes your sketch resize-friendly for free.

Session 5 — The Ripple: Font Size Wasn’t in the Variable (2026-10-26)
🔍
A — Analyze: A Miss That Proves the Point Session 4 reduced the canvas from 500×500 to 400×400 and said “Ethan used width and height throughout, so the resize is truly cosmetic.” That was mostly true — but textSize(41) is not expressed relative to width. At 400px, a 41px string of 25 characters overflows. The AI missed it. TTG caught it.
TTG’s Prompt
klp (TTG)

That change did not account for the font size that required a reduction to fit into the smaller canvas. That punctuates what you just said about using variables for programmatic elements: once change ripples through entire design without breaking anything. Reduce the font size so the text will fit into the canvas. Use ‘magic numbers’ for this because I want the next stage to catch this problem (and fix it!) Add this to our chatlog as well.

Prompt Critique
Prompt Critique — Session 5
A−

A short prompt with sophisticated pedagogical intent — and a correct observation that sharpens the teaching from Session 4.

✅Catches a genuine miss. The AI declared Session 4’s resize “truly cosmetic” because Ethan used width and height. TTG noticed the exception: textSize(41) is not relative to width. Catching a wrong claim in the AI’s own analysis is the A step of S.P.A.R.K. working exactly as designed.
✅The meta-observation is the real lesson. “That punctuates what you just said about using variables for programmatic elements: once change ripples through entire design without breaking anything.” The resize broke because textSize was a magic number. This is not just a bug fix — it is evidence for the principle stated in Session 4.
✅The ‘magic numbers’ form requirement is pedagogically motivated. “I want the next stage to catch this problem (and fix it!)” — the magic number 28 is an intentional teaching device, not an oversight. Explaining WHY you want a suboptimal form is sophisticated prompting.
⚠️No role specified. Three sessions ago, TTG assigned three roles. This prompt has none. Brevity and habit can pull in opposite directions.
⚠️Target value not specified. “Reduce the font size” — to what? The AI chose 28 (fits comfortably in 400px). A specific value (“reduce to around 28px”) would have made the output unambiguous and verifiable.
The Fix & the Intentional Flaw

Changed: textSize(41) → textSize(28) in both the displayed code and the instance adapter. A comment flags it: // magic number — try replacing this with a calculation relative to width.

Why 28 works: “Baby Shark, doo doo doo!” is 25 characters. At textSize(28) in p5.js’s default sans-serif font, the string is approximately 385px wide — comfortably under 400px.

Why it stays as a magic number: Stage 2’s challenge is to improve this sketch. One obvious improvement is replacing 28 with an expression like width * 0.07 or floor(width / 14). That fix, combined with the canvas resize, produces a sketch that scales to any size gracefully. Leaving 28 bare — visibly out of place next to all the width/height references — makes it easy to find.

The deeper lesson: One hardcoded number in an otherwise variable-driven sketch is enough to break a resize. Session 4 said “use variables and resizes are free.” Session 5 adds the corollary: “every hardcoded number is a future maintenance cost.”

Session 6 — Baby Shark Gets Its Own Movie Clip Page (2026-10-26)
🎯
S — Set Goal Create babySharkMC.html in the movie_clips folder, add the Baby Shark card first in the movie_clips.html grid, cross-link both pages to each other, and add a brief history of the song for novices who may never have encountered 13 billion views worth of doo doo doo.
TTG’s Prompt
klp (TTG)

Amazingly, some novices may have never heard Ethan’s inspirational song, ‘Baby Shark’ that he based his design on. As a web developer and high school computer science teacher, let’s remedy that by creating babySharkMC.html using becomingStrange.html as an exemplar. I’d like to include a brief history about the Baby Shark song and why we have it here at TNT: to showcase Ethan’s original work and obviously, we will want to cross-link Ethan’s page to babySharkMC.html and vice versa. For convenience I put a copy of the gif artwork in our images folder for TNT so you can use it as the hero artwork. On the movie_clips.html page, we can use the attached baby shark icon. That card should be listed first in our entries and also link to Ethan’s original design as well as to the movie clip. Please update the chatlog for Ethan’s page with this entry and its critique. The YouTube clip is: [embed provided]

Prompt Critique
Prompt Critique — Session 6
A−

The most asset-aware prompt in the series. TTG prepared the assets before writing the prompt — a professional workflow habit worth naming.

✅Proactive asset placement. “For convenience I put a copy of the gif artwork in our images folder.” TTG moved the asset before writing the prompt, then told the AI exactly where it is. This is professional asset management: the AI never has to ask where the file is.
✅Exemplar named. “Using becomingStrange.html as an exemplar” — same pattern as every successful entry build in this series. One good example does more work than three paragraphs of description.
✅Both cross-link directions named. “Cross-link Ethan’s page to babySharkMC.html and vice versa” — both directions specified. In prior entries, this kind of bidirectional link was sometimes omitted from the spec and had to be added later.
✅Placement specified. “Listed first in our entries” — the Baby Shark card appears at the top of the movie_clips.html grid, which is a prominence decision that required explicit instruction.
✅Card links both named. “Link to Ethan’s original design as well as to the movie clip” — the card carries two links. Both are specified.
⚠️Song description absent. The seventh prompt in this series to omit what the media actually contains. Baby Shark is a cultural ubiquity — the AI knows it — but the habit of describing the media content remains unformed.
⚠️Deliverables not listed. Five outputs: babySharkMC.html, movie_clips.html card, Ethan back bar link, Session 6 chatlog entry. All four inferred correctly from context — but a numbered list would have made the scope unambiguous.

The asset pre-placement detail is genuinely impressive. Not many prompters think to move files before writing the instruction. That one habit reduces ambiguity, eliminates follow-up rounds, and signals professional workflow thinking. It is the kind of detail a vibe code talent recruiter would notice.