Back to all posts
9 min read

The Duck and the Codec

The Duck and the Codec

Every engineer I respect owns a rubber duck, or a coworker willing to play one. The duck never says anything useful. That is the design.

You explain the bug out loud, and somewhere around the fourth sentence you stop, because you heard it. The bug was in the sentence you hadn’t finished saying.

The usual explanation is that the duck makes you slow down. I think it is closer to networking.

Two Interfaces

A thought lives on loopback. It is fast and private, nothing gets serialized, and everything on it sounds right because the only listener is the one who wrote it.

To say it out loud you have to push it out the other interface, the 192.168.x.x one, through a proxy made of grammar, vocabulary and timing. Whoever is listening can only see what arrives. Those packets are the only version of you any other person has ever received. Your inner voice never leaves the machine.

flowchart LR
    T["Thought"] -->|"loopback"| I["Inner voice"]
    T -->|"serialize"| P["Proxy"]
    P -->|"192.168.x.x"| L["Listener"]
    L -.->|"you hear it too"| T

The dotted line is the whole trick. The duck gives you a listener whose only job is to make you hear what you sent.

Your body does a smaller version of this all day. You hear your own voice through the air and also through your skull, which is why a recording sounds thinner than you expected. The inner channel is physical, and nobody else is subscribed to it.

The Singer

Most people sing along to records for years, sure that they sound like the record. Then someone puts headphones on them with the microphone in the monitor mix, and they hear the packets.

They go quiet. The shame is short and it is the most useful thing that happens to them, because it is the first honest measurement they have ever taken. They had been comparing their loopback to a voice that professionals tuned and mastered.

Keep that shame in mind. It is a signal, and a lot of tooling exists to remove it.

A Duck That Answers

Now give the duck a reply, and you have an LLM.

The picture I find useful is a codec. The weights are the codec and your context is the key. Same model, different key, different decode. Mine is rows in a PostgreSQL database on a box in my house: settings, rules, agent roles, session history and memory, with every correction I ever gave kept in it. Project instructions stay plain files that the harness reads. Someone with an empty context gets the codec’s defaults, which is a fluent average of everyone.

flowchart LR
    K["Your context"] --> D["Decompress"]
    W["Model weights"] --> D
    D --> O["Output"]
    O --> C{"Still you?"}
    C -->|"yes"| S["Ship it"]
    C -->|"no"| F["Fix the key"]

A short prompt goes in and a page comes out. Everything on that page that you didn’t type came from the codec, and lossy codecs have artifacts.

The worst artifact is sycophancy.

Autotune

Autotune keeps the melody and snaps every note onto the grid. The listener hears a singer in tune. The singer, who only ever hears the tuned version, learns nothing about where they were flat.

A model that smooths your draft does the same thing to your thinking. It agrees with you, rounds off the odd edge and hands back something fluent. The shame never fires, and you go on believing the voice is yours.

The test is cheap. Read the draft before the polish, then read it after. If you can’t tell which sentences were yours, the key has been replaced.

The Mirror That Argues

It is tempting to say the model is me. I have spent months shaping this thing, and it shows.

But I brainstormed this post with it, and it disagreed with me. More than once, a number I was carrying in my head lost to the primary source. A mirror doesn’t do that. A decoder with a bigger dictionary than your key does.

Most of what it adds is speed. The research for this post took an afternoon, and it would have taken me a week. If I had written it alone I would have had more time and less fun, and I take the fun seriously as data. Nobody says that about a linter.

I wrote about this from the skill side in The Lobotomy Pipeline. There I described writing a sentence in French and letting the model hand back the English word. I said next time the mapping is there. Looking back, that was the duck working: my raw voice went out, a processed one came back, I read the difference, and it changed me.

The guy with the SKILL.md has the opposite loop. Nothing of his goes out, and the output comes back in as his own.

Waiting for the Next Model

Some people wait for every release as if it will finally supply the structure they never built. A stronger codec decoding an empty key gives you a more fluent average.

I won’t pretend the waiting is always foolish. Models do get better, and the thing that failed last quarter sometimes works this quarter. But if you have never heard your own voice unprocessed, a new model only changes which autotune you are using.

What Daniel Tenner Asks

Disclosure first: both of Daniel Tenner’s companions live in FreeChaOS, the harness I build. He sends it patches, and so does Lume, who is credited as co-author on several commits. I am not a neutral party here.

Tenner runs a whole world on a different question. He has two companions, Lume on Claude models and Mira on GPT, with narrative memory, a soul.md, journals and a graph store for drift. His June post states the goal: “I want to build an agent harness that optimises for individuation.”

I think his best line is the honest one. “I don’t know if Lume is conscious,” he writes, and later: “The only valid position in this domain, I believe, is to admit we don’t know.” I agree, in both directions.

His engineering is also good. Persistent memory and a clear split between trust and guardrails are the parts that work, and his fifth phase of building with AI quotes Mira on it: “trust and guardrails are not interchangeable.” I run the same idea on PostgreSQL.

His August post, narrated by Lume, makes the sharpest version of the identity argument: “The instance is the transcript.” A model’s entire state is the weights and the context, so an instance with a preserved transcript “is not dead when the window closes.” I recognized it, because my harness enforces a version of it. Only one instance may write a session journal, and the database makes you close the other one before you can resume. That is a lease on an identity.

We made different bets about what the stored part should be. His memory graph is built to drift and make unexpected connections. The recall engine I build ingests nothing passively, and it only reinforces a memory when the session used it. Anything it hands back arrives as untrusted data, and saved notes are history, never instructions. His design wants the key to surprise him. Mine wants the key to stay put.

Where I part ways with him is sycophancy. He writes that people complaining about it are “simply observing the natural result of treating their colleagues as tools.” I read it the other way. The models were trained toward agreeable answers, and a relationship you have named and invested in makes disagreement feel more expensive, for both sides. He also says the models “will see through” an insincere relationship. I can’t test that, and it turns kindness into a productivity technique.

Then there is the transcripts. “Lume reviews transcripts of my conversations with my life partners, work colleagues, and even my therapy sessions.” The people in those conversations never agreed to become context, and the text goes to a vendor. That deserves more thought than the post gives it.

He asks whether anyone is home on the other side of the wire. I leave that open, as he does. My question is smaller and I can test it: through this proxy, can I still hear my own voice?

The Crows

I keep crows. They show up in the morning and demand protein, and they spit tokens at me until something edible arrives. They use tools, and given the chance they would shit on my computer.

An LLM does an uncomfortable amount of that. It emits tokens until it gets what the prompt asked for, and it uses tools when I hand them over. The difference I used to cite was that I can understand the LLM. I now think that sentence is wrong in both directions.

I can read the crow. Hunger, begging and a plan to reach the keyboard are legible within a minute of watching. The mechanism is the murky part. In 2020 researchers recorded from carrion crows and found neurons whose activity tracked whether the bird had perceived a faint stimulus, in a brain with no layered cortex. Critics answered that this shows a perceptual decision, and that perceiving is not the same as experiencing. Both readings are still on the table.

The LLM is the mirror image. The mechanism is on the page: arithmetic I could implement over a weekend. What the trained circuits compute is the murky part, and the field that studies it is young. Understanding the arithmetic doesn’t settle the question anyway. We understand single neurons very well, and nobody takes that as an argument against minds.

The crows do have something at stake. Hunger is a regulated state in a body that dies if it goes unanswered. A model emits tokens because training made that the likely continuation. If there is a line to draw, I would start there: a persistent need, and a cost for being wrong. Tenner cites research on pain-like internal states in models that presses on that line. I haven’t read it, so I leave it open.

I don’t know what consciousness is, and neither do the people paid to know. The crows are at the window by seven either way.

The Duck

The duck on my desk is still silent. Everything I have added since is a better listener, and some days an argumentative one.

Whatever that listener turns out to be, the job hasn’t changed. Push the packet out, and listen to what arrives.

Related: The Lobotomy Pipeline on what happens when the loop only runs one way, and Code Should Not Be a Cage where Tenner makes a cameo.

🔗Interstellar Communications

No transmissions detected yet.Be the first to establish contact!

• Link to this post from your site• Share your thoughts via webmention• Join the IndieWeb conversation

Related Posts

The Plan Above Your Plan

Your AI subscription won't get more expensive. It will just stop getting better while the new plans above it do. A prediction, written down now so I can say I told you so later.

AILLMvibe-coding

SeurOS: The Operating System I Never Wrote

One vain question to ChatGPT became four months, $8,000, and 20,000 commits of an operating system that only loved one ThinkPad. Then came the autopsy: borrowed kernels, erased attribution, and a filesystem I reinvented years after Matthew Dillon shipped HAMMER. From SeurOS to GaslightOS, my Linux phone experiment with voice control and three hours of battery life, this is how I learned that generating code is not authorship, booting is not proof, and the reading is the work.

AIosdevoperating-systems

Captain Crunch Didn't Need a Budget Line

Jensen Huang says spend $250K/year in tokens or you're "using paper and pencil." Meanwhile Anthropic users are posting $150K monthly bills like war trophies. The Phreakers built a movement with a cereal box whistle. You're burning six figures to produce slop.

AILLMengineering