Every LLM you've ever used is frozen at birth — trained once, shipped, fossilized. This one rewrites its own weights while it runs. There's a live one in this page. Scroll.
The moment a model ships, it stops learning. Every conversation, every correction, every new fact it meets — evaporates when the context window ends. The industry's fixes are prosthetics:
None of them change the model. Experience should leave a mark.
The loss signal is the deepest part: next-observation prediction error. No labels. No reward model. No human feedback. The model predicts what comes next, gets surprised, and rewrites a small bounded piece of itself.
Reality is the teacher.
# the whole loop for observation in reality: surprise = -log p(observation) # predict → measure error if surprise > expected: # surprise gate fast_weights -= lr * grad # rewrite yourself fast_weights *= decay # bounded — never drift far
This is a real fast-weight character model (vanilla JS, ~200 lines, the same surprise-gate + decay + reset mechanism as the 2B system — miniaturized). It was born knowing nothing.
Learn new things, or keep the old ones — neuroscience's classic dilemma. On a real 2B model, it reduces to EMA decay on the fast weights. Drag it. These are our actual measurements:
Without the decay: gain +3.3 but forgetting +7.09 — the model lobotomizes itself. With decay 0.98: gain +0.89, base drift +0.03. One knob resolves the dilemma.
| claim | evidence |
|---|---|
| It's a domain expert | strands probe NLL 4.85 → 2.22, 8/8 improved |
| It learns while running | continual OOD stream NLL 6.18 → 5.37, pure inference |
| It doesn't forget | base expertise during OOD learning: Δ −0.01 |
| Watchable, live | P(correct) 0.09 → 0.74 in demo.ipynb, greedy 3/3 |
| Agent turns → weight change | P(fact) 0.002 → 0.571 over 8 strands-agent turns |
| Provable off-switch | reset() → bit-identical to base, Δlogits = 0 |
# pip install strands-slm from strands import Agent from slm import SLM agent = Agent(model=SLM("cagataydev/strands-qwen3-vl-2b")) agent("...") # ← this turn PHYSICALLY changed the model's weights
Two independent experiment tracks — run blind to each other — hit the identical wall:
Teach it fact A until mastered, then hammer fact B, then ask about A again. Watch high plasticity overwrite — the same interference we measured on the 2B model (P: 0.571 → 0.090).
And the deepest finding: making test-time learning store durable knowledge requires multi-layer placement + replay + consolidation… which is distillation, running continuously.
Fast weights catch experience.
Slow weights consolidate it.
Wake and sleep.
Biology needed both. Now we've measured why.
Every agent framework improves by changing prompts, tools, retrieval. This is the first where using the agent changes its weights. Run it for a month and it's no longer the model you downloaded — it's your model. With a reset button, and an audit log of every surprise that changed it.
The thing that comes after
"training runs."