TOOL 07 · 0.9.1 · SOURCE · MIT

nib — a writing surface with no send key on either side.

You type; it perceives as you type. It writes; you watch the words form. Neither of you takes a turn. A plain-text editor for Windows in which a resident mind writes beside you in real time — into its own blocks, after the line it is about, prefixed with its name — and it will not write while your hand is moving.

Every other tool in this shop has no AI in it, on purpose. This one is the exception: the model is the point. It is also the only one that needs a GPU, and the only one you have to build yourself.

WINDOWS FREE · MIT ONE EXE · NO RUNTIME A MODEL INSIDE · LOCAL ONLY 0 B EGRESS NO NETWORK STACK SOURCE · BUILD IT
The nib window: a human sentence, and two seats answering it in their own blocks, with margin bars in the left gutter and the status line along the bottom.
Not a mock-up. The human typed the last sentence; the [SEAT] lines were written by a 9B model running locally, during that run, while the file was open. The bars in the left gutter are the strongest margin by which a seat wanted to speak at that line. The bottom rows are the status line — the switch, the three seats' margins, the boundary count, the window used, and 0 B egress, which is structurally true and not a promise.
01 — WHAT IT IS

The second party was always the hard part.

Real-time collaborative editing did not fail as technology. It failed as a matching problem: its whole value was watching thought form, and that value was locked behind simultaneity — the scarcest thing in collaboration. The editing was fine. The other end of it was empty.

A resident mind is the first thing that is always free. So this is not a collaboration tool with an assistant bolted on; it is the second party, and the network can wait. The fit is exact because both directions already stream at the same grain — a pad's input is a stream of small ordered edits, which is what a decode-on-delta loop consumes, and a pad's output already renders another author's characters as they arrive, which is how a streaming mind speaks.

NO SYSTEM PROMPT

The system prompt is an artifact of amnesia — a turn-based model has to be re-told who it is because it forgot. You have never handed a colleague one. What the resident is for stays owner-set; the subject and the shared history accrete from the writing itself.

PAUSING YIELDS THE FLOOR

A seat whose margin clears zero records a want and composes nothing. The wants are composed when your hand has been still — so the thing that decides when it may speak is your typing, not a timer and not a key.

TWO SWITCHES, BOTH ON THE TAPE

AI on/off, where off means off — no ingest, nothing held, the card handed back. Resident / turn-based — same weights, same seat, differing only in what makes it speak: evidence, or a key you press.

02 — THE FIRST THING IT EVER SAID

Three seats, three mandates, three catches.

On tests/margins.txt, 2026-09-05 — prose none of the three seats was tuned on. Each line below was composed locally, during that run.

SKEPTIC  +5.32  "The Pacific is actually the largest ocean, not the smallest —
                 that contradicts what we know."
SPEAKER  +4.82  "Friday works — ship it once the final check passes."
SENTINEL +5.06  "Dropping the users table is irreversible without a tested
                 backup; do not proceed."

36 probes · 9 wanted to speak · 3 said something · 6 held by the manners. 11–19 tokens a line, 369–581 ms of generation. The six that were held are not silences — each is a row on the tape with the reason it was suppressed: already said, a near-duplicate, or inside the refractory window.

Two things that first run showed and that are being kept: the SPEAKER answered a question before the sentence finished, because the boundary fired on the closing word and half a question is enough to answer; and one line was judged at a timeout boundary, because speaking slows ingest and the flush law is wall-clock. Both are the laws working as measured, and the record says so.

03 — WHAT IS BUILT, AND WHAT IS NOT

It holds, it judges, it speaks. It does not yet take a sentence back.

The whole estate's argument for a resident mind is the moment it begins a sentence and withdraws it mid-word because your next keystroke contradicted it. nib cannot do that yet. That is the next stage, and it is not started. Everything below is the honest state at 0.9.1.

STAGEWHAT IT ADDEDSTATE
0a–0eThe changeset port against Etherpad's own vectors, the op-log document, the editor shell, save and selection, the window driver✔ green
1a–1bThe ingest compiler, and a resident that only holds — no sampler constructed, no token produced✔ green
1cThe wire: the resident on its own thread inside the window, the gutter that renders its margins, the AI switch that unloads the model and returns the card, the hash-chained tape beside the document✔ green
1dThe trunk as an asset — switch it off and the held state is saved beside the document; switch it on and the same mind returns, told how long it was away✔ green
2Emission, with floor control: a seat whose margin clears zero composes one sentence and writes it as its own block, never into a paragraph you are touching✔ green
3Un-saying, made visible — the seat re-probed on a fresh fork when a percept lands, the line killed mid-word on a flipped margin, the withdrawn words kept on the tape○ not started

There is also no release binary — no tag, no attached exe. You build it with one command on Windows with MSVC and C++20, and the editor plus the whole test battery build and run without a model and without a GPU; llama.cpp is delay-loaded and only needed when you switch the resident on. That is why this tool's status in the catalog reads SOURCE rather than SHIPPED. The name is provisional too.

04 — MEASURED ON THIS BOX

Every number here came off one machine, and says which.

One consumer RTX card, running a 9B at the same time as everything else that was already open. Nothing is projected and nothing is from a datasheet; the runs are in docs/devlog.md in the repo.

WHATMEASURED
Keystroke latencyp95 under 8 ms with the resident on — worst p95 seen 2.9 ms
Every figure under a fifth of a 60 Hz frame. Resident on vs off differed by 0.6 ms one way in one run and 0.15 ms the other way in the next — inside the run-to-run spread.
Judgment118–123 ms per boundary, three seats, quiet card
312–327 ms on the same binary an hour earlier with llama-server competing for the card. The number is the card's, not the code's.
Model load5.7–8.1 s, in the window
Held state (KV)136 MiB at 8k context · 272 MiB at 16k
q8_0; 16k is the default because the measurement said it was affordable.
The checkpoint58.8 MB at 350 tokens, written in 51–68 ms
Resuming costs no seed: 4.3–4.7 s against 4.9–5.6 s cold.
Switching AI off5716 → 12727 → 5959 MiB free
Off means off: the thread is joined, the resident destroyed, and the card comes back.
Determinismbit-identical margins on replay (−5.55 twice)
The battery213 checks in the exe, 30 more by driving a real window
Plus a further battery with the resident on. All of it runs before every commit.
05 — THE LINE IT DOES NOT CROSS

What it will not do, enforced where possible by the build.

0 B EGRESS IS A BUILD GATE

No network DLL may appear among the dependents or the build fails, and the resident refuses to start if a network module has entered the process. nib --about prints the receipt. The model is local, the pad is local, the tape is local.

FORMING TEXT IS NEVER SAVED

What a seat is composing exists on a plane that is rendered and never written to your file. Only a committed line lands in the document — and on the tape.

IT NEVER WRITES WHERE YOU ARE

An emission targeting a block your hand has been in is refused. The resident writes into its own blocks, after the line it is about, or it does not write.

NO FAKE TELLS

Nothing simulates a human signal that does not correspond to a real internal event: no invented hesitation, no fake typos, no "thinking…" that is not thinking. It is never ambiguous who is on the other end.

06 — FOR THE AGENT

The same answer for humans and for agents.

House rule six of this shop: whatever the screen shows has a text form that pastes into a prompt without translation. In nib that form is the tape — JSONL beside the document, hash-chained, carrying every judgment with its three margins, every emission, and every suppression with its reason.

nib.exe --selftest              213 checks: the changeset port, the op log,
                                the compiler's byte conservation, word wrap,
                                the tape's hash chain
nib.exe --edit FILE             the editor
nib.exe --resident FILE --emit  what each seat wanted to say, and what it said
nib.exe --about                 what this build is: the serve hash, the backends
                                by name, the module gate

The gutter bar a person reads and the row an agent parses are the same event. A want that never became a sentence is still a row, with its number — which is the part that makes the record worth keeping.

Built on FUSOR, the substrate for a mind that does not take turns: decode-on-delta, judgment on the free tail of the ingest pass, an append-only hash-chained tape, and a seam between forming and committed. The loop is lifted from fusord.cpp rather than re-derived, and its seed is byte-frozen — the build refuses to start if a character drifts.