Design
The default input is the curriculum, not a sample
Most learners never open the config panel, so the array that loads by default is the only run they ever see. That makes it the lesson — and a tidy default that hides the property you came to teach quietly downgrades the whole thing to a movie.
You're building a sorting visualizer and you need a default array. So you reach for something tidy: six distinct numbers, no repeats, nothing that looks like a typo. [5, 2, 8, 1, 9, 3]. It sorts in a clean sweep, the bars rise into a staircase, it looks great. Ship it.
You have just deleted the most interesting thing about sorting, and almost nobody will notice — least of all the people you deleted it for.
The thing you deleted is stability: whether two equal elements come out in the order they went in. Merge sort keeps them put; quicksort can reorder them. It's the property you lean on every time you sort a table by one column and expect the previous column's order to survive. And it is completely invisible unless the input actually contains two equal elements. With six distinct values there is no equal pair to preserve or scramble, so the whole stability question plays out with nothing on screen that could answer it. The animation is correct. It teaches half of what it should.
Here is the uncomfortable fact that makes this matter: most learners never touch the config.
The panel is right there, array editor and presets and all, and the overwhelming majority scroll past it and press play on whatever loaded. So the default run isn't a sample you picked because it looked nice. It's the entire curriculum for everyone who doesn't fiddle — which is most of the room. Choosing it for prettiness instead of for the property is choosing to teach the wrong lesson to the majority, on purpose, without noticing you did it.
A default has to trigger the thing the lesson is about
Every lesson is supposed to leave you able to assert one sentence you couldn't before. "Merge sort is stable; quicksort isn't." "Binary search costs at most twenty probes for a million elements." Call it the takeaway. What I now ask the default run to do is make that sentence land on zero interaction.
So there's a one-question test for any default: play it, change nothing, and ask whether the learner can now state the takeaway. If the answer is "only if they open the config and turn something on," the default has quietly downgraded the lesson to watched an animation, learned nothing for everyone who trusted you to pick a good one.
A pretty default fails this test the most reliably, because pretty optimizes for the wrong variable. A clean staircase of distinct values looks finished. It just isn't informative — it has smoothed away the exact texture the lesson needed.
What a default that works looks like
The fix isn't subtle: choose the input that triggers the mechanism, not the one that avoids it.
My merge sort and quick sort lessons both load the same array — [38, 12, 56, 7, 12, 41, 23] — and the repeat is the point. There are two 12s in there. Run it through merge sort and the two 12s come out in the order they went in; run the identical input through quick sort and watch the partitioning shuffle them past each other. Same numbers, same opening frame, one visible difference, and the difference is the property. Delete one of the 12s to "clean up" the input and you've deleted the lesson with it.
Binary search wants a target the search has to work for. My default looks for 23 in [2, 5, 8, 12, 16, 23, 38, 56, 72, 91], and the first thing the algorithm checks is the midpoint — which is 16, not 23. So the target isn't sitting under the first probe. The search throws away the bottom half, then the top of what's left, and only lands on 23 on the third look. Drop the target onto the midpoint instead and it's found on probe one, and the "halve the range, halve it again" that the whole lesson exists to show never gets to happen. The awkward placement is the curriculum.
The same trap waits anywhere the mechanism is conditional. A hash table is only interesting when keys collide — when two of them want the same bucket and the table has to probe or chain its way out. A default whose keys each land in their own slot draws a tidy little row and shows you none of that. It's a hash-table lesson with the one hard part politely removed.
The input where it breaks is often the best one
Push this further and you land somewhere slightly counterintuitive: the most informative input is frequently the one where the idea fails.
A perceptron provably converges on data you can split with a straight line, and provably never converges on XOR, where no straight line works. A run on clean separable data shows you the happy path. A run on XOR shows you the boundary thrashing forever and teaches the actual limit of a linear classifier, which is the part worth knowing. Crank a learning rate too high and watch the loss diverge instead of settle. Let the collisions pile up. Knowing where an idea breaks is the difference between understanding it and recognizing it.
This is also why the same little control keeps reappearing across the lessons — fibonacci's recursion-tree / memo / table toggle, gradient descent's well-behaved-versus-divergent regimes, three scheduling policies running side by side. Contrast is the cheapest depth there is. Two runs that differ in exactly one variable teach a property faster than one flawless run ever will, and nobody has to narrate it: the learner reads the property straight off the gap between them.
So it's a line in the storyboard, before any code
Because this is so easy to get wrong by reflex, it became a line in the storyboard. Before a new lesson is implemented, the storyboard has to name the property the default surfaces — not "what's a nice-looking array" but "which exact input makes the takeaway visible with zero clicks." If the honest answer is "none of them, you have to open the config first," the default is wrong, and the fix is to change the default, not to hope people customize. They won't.
Most people press play once and never turn a knob. That single run is the entire lesson you taught them. The default input isn't the sample that happened to load — it's the curriculum, and the first question I ask about it now is whether someone who changes nothing walks away able to say the one sentence you built the whole thing to teach.
See it: open Merge Sort and watch the two 12s hold their order, then open Quick Sort on the same default and watch the partitioning flip them — same input, opposite outcome, one property made visible.