Dots Lab · experiment 002 · open source

Your model ships
with a voice.
Take it out.

Every frontier model writes in roughly the same register. Read three sentences and you know. pre-chatgpt is a writing foundation that strips that voice, so the one you build on top is yours.

5 layers of tells4 writer levels33 files, self lintedMIT

The problem

The vocabulary changes every generation. The shape never does.

Word filters miss the point. Expert judges explain their calls with structure 79% of the time, vocabulary only 53%. So the foundation works top down: stance, then structure, then syntax, then rhythm, then words. Fix the shape and the words have somewhere to live.

  • 01stance
  • 02structure
  • 03syntax
  • 04rhythm
  • 05vocabulary

Process · the drafts that died

Version 0.1 was written from memory. Then the research got a vote.

The first draft was every tell we were sure about. Each claim was demoted to a hypothesis and sent to find its measurement. These four never came back.

  • The em dash is the giveaway.

    Refuted. Twelve models run 0 to 10.62 per 1,000 words against a human 3.23, and four sit at or below the human mean. Population signal, not a per document tell.

  • Humans vary sentence length. Set a variance floor.

    Killed. The human and machine ranges overlap too much for any floor to hold.

  • Cut the discourse markers. They sound generated.

    Backwards. Humans use more of them, not fewer.

  • Cut rhetorical questions.

    Backwards. Humans ask 1.72 per 1,000 words. Machines ask 0.08.

The catalog

The tells that survived have names and numbers.

Five files of them, lexical to punctuation. Every rule declares what kind of claim it is: published means someone fetched the measurement, judgment means craft and says so. Six of the load bearing ones:

  • The participial tail

    published

    humans 1.7 per 1k words · tuned models 224 to 527% of that

    , allowing teams to move faster.

    Support stopped opening four tabs to answer one question.

  • Nominalization

    published

    humans 14.6 per 1k · models 145 to 214%

    The implementation resulted in a reduction of errors.

    We changed the process. Errors fell.

  • The triad

    judgment

    three is the number a model picks when nothing argues for another

    discovery, serendipity, and browsing

    Two examples, or one good one.

  • Throat clearing

    judgment

    the piece starts one topic above the topic

    In today's rapidly evolving landscape...

    Start where the verdict is.

  • Collocation stiffness

    observed

    cover the noun, guess the adjective, be right

    mounting pressure, enduring value

    The adjective the noun did not come with.

  • The moral coda

    judgment

    a closing sentence about we, attached to nothing

    ...the spaces we build shape who we become.

    End on the thing, not the species.

The difference

One brief. One model. Twice.

The repo's own worked example, word for word: explain in about 150 words why a library kept its books. Left, the model with nothing in context. Right, the same model with the foundation at Level 2. Watch the highlighter read.

Stock

nothing in context

In today's rapidly evolving information landscape, public libraries face mounting pressure to reimagine what they offer. The Bracken Road library is no exception. In 2022, officials proposed removing half of the collection to make way for eight study rooms, sparking an important conversation about what a modern library truly represents. Rather than rushing to judgment, staff spent a full year tracking every loan, gathering data that would prove invaluable. The findings were striking: seven out of ten books were borrowed by readers who had come in for something else entirely, highlighting the enduring value of discovery, serendipity, and browsing. In March 2023, the board voted to keep the shelves, removing only 1,400 titles unborrowed since 2014 and situating three study rooms in the old reference room. Ultimately, the Bracken Road story is not just a story about shelves. It is a reminder that the spaces we build end up shaping the communities we become.

pre-chatgpt · L2

the foundation in context

They kept the shelves because somebody finally counted. For a year the staff logged every loan and whether you'd come in for that book. Seven out of ten times you hadn't. You walked out with something you found on the way to something else, which is the whole argument for the shelves, and it's the only version of it that ever convinced me. The 2022 plan was to pull half the books out for eight study rooms. In March the board kept the shelves and put three study rooms in the old reference room instead. The 1,400 books that hadn't been borrowed since 2014 are gone and nobody will miss them. Nobody knows what those seven would've done if the shelves had gone. So we've got study rooms and we've still got the shelves. I miss the reference room. That's a small thing to be annoyed about and I'm going to be annoyed anyway.

six tells, one passhover to pause and read

The dial

Four levels, like weights in a family.

A typeface ships Light to Bold. This ships Student to Literary, each bound to a register of real pre 2022 human writing. Same library, same four facts, four writers.

A comment on a neighbourhood thread, typed on a phone.

They kept the shelves because somebody finally counted. For a year the staff logged every loan and whether you'd come in for that book. Seven out of ten times you hadn't. You walked out with something you found on the way to something else, and it's the only version of the argument that ever convinced me.

Process · how it was built

Evidence first, rules second, and the repo polices itself.

  1. 01

    Write down what the model believes

    Version 0.1 came from model knowledge: every tell we could name, written as rules. Then every one of them was demoted to a hypothesis.

  2. 02

    Build a baseline that predates the flood

    Ground truth human text must predate November 2022. Scrape today's web and you are measuring AI against AI: 13.5% of 2024 PubMed abstracts already read as LLM processed.

  3. 03

    Make the research confirm or kill

    Published measurements first, our own corpus second. Four favorite rules died. Every survivor carries a tag: published, measured, observed, or judgment.

  4. 04

    Make the repo gate itself

    A repo about machine tells cannot ship files containing them. The linter scores every product file at Level 3 and fails the build on a miss.

  5. 05

    Preregister a bar. Report the miss.

    The benchmark ran against a bar written down before the run. It missed, the README says so, and the numbers ship with the repo.

checks · the gate
$ node checks/lint-repo.mjs

  core/02-tells-syntax.md         92  pass
  levels/L2-everyday.md           88  pass
  research/06-discourse.md        84  pass
  README.md                       86  pass
  ...

  0 of 33 gated files under the
  level 3 threshold · exit 0

A repo about machine tells cannot ship files that contain them.

The receipts

It missed its own bar. It ships the miss.

A three arm benchmark on 72 held out prompts, judged against a bar preregistered before the run. Most projects would bury this page. It is the most useful one in the repo.

the bar, preregisteredgap closed 0.30 · p < 0.05
the result, held outgap closed 0.07 to 0.13 · p 0.067 missed
what genuinely movedL2 contractions reached the human median · L1 tails and nominalizations closed half their gaps
what went backwardsL3 professional, driven by passive rate
blind judgesstill called both arms machine written, 48 of 48 on controls

So the honest claim is narrow: the output sits measurably closer to human writing on specific, named features. Nothing here says it reads as human, and nothing here chases detectors. Full protocol and numbers: bench/RESULTS.md.

Neutral on purpose. Yours by design.

No personality, nothing to strip out. It is the layer under a voice, not the voice. Clone it, pick a level, put your brand on top.

in an agentClaude Code and Cursor read CLAUDE.md on their own
in a chatpaste PROMPT.md as the first message
pick a levelnode setup.mjs

© 2026 Dots Studio · MIT · never fabricates · experiment 001 is a typeface