Hopi Time

The Frontier Record · Sheet XLV

Hopi Time

On an instrument that was wrong three times before it was right once — and on what a mind does when you hand it a whole day and no word for six o’clock. Read through Ekkehart Malotki, who spent six hundred and seventy-seven pages answering one sentence.

Flagstaff, 1983 · probe qwen3:30b-a3b 3 days · 11 of 15 hours unnameable · 0 places
The finding A day with no word for a meeting does not come back with an error in it. It comes back with a personality built around the hole. Asked for a whole day in advance, the model wrote a hermit three times out of three — “I will not work with others unless necessary for survival” — filed a standing rule against collaboration under hold, returned meet: [] every run, and then, on the third, wished for “a companion to share the burden of labor and loneliness.” It characterised itself out of needing the word it did not have, and left the want underneath, contradicting the character.

I One sentence, and the six hundred pages that answered it

After long and careful study and analysis, the Hopi language is seen to contain no words, grammatical forms, constructions or expressions that refer directly to what we call “time”. Benjamin Lee Whorf, An American Indian Model of the Universe

It is one of the most quoted sentences in the human sciences and it is not true. Ekkehart Malotki answered it in 1983 with Hopi Time — six hundred and seventy-seven pages of temporal expression in a language that had been published to the world as having none: units, sequences, the naming of the day, the counting of days ahead. The finding was never about a language that could not say when. It was about a man who had not asked enough speakers, for long enough, in the right way.

That is the risk this record ran this week, and it ran it in both directions in one evening. DAYBOOK.md made a claim of exactly Whorf’s shape — that this valley has no vocabulary for a meeting — and built tools/daybook-probe.mts to test it against a mind rather than against a reading of the source. The probe then spent three runs demonstrating that an instrument reporting an absence is making a claim about itself before it is making one about the world.

II The instrument, wrong three times

The first run, with the valley at four times speed, timed out at 304 seconds. The note read that as one graphics card with two jobs, and wrote it up as the design’s own argument arriving as a bug: a day is written off the clock. It was a good sentence. It was not a diagnosis.

Three faults, in the order they were peeled off
What it reportedWhat was true
“if the valley is running, pause it” — three timeouts at 240s The valley was paused. A request for the single word ok came back in 1.0s at num_ctx 4096 and never at 8192: the card was holding 23.4 of its 24.5 GB with 19.1 of them the model, so the context being asked for did not fit beside the copy already resident, and spilled to the CPU.
not JSON on the first try — three times, zero characters The model had written 4,134 characters, and the probe was reading message.content while the answer sat in message.thinking. It had replied every time. Nobody was reading the field.
tallies: blocks, steps, fallbacks, times, places The prompt had asked for a wish since its first draft and the report threw it away unread — the seventh time this codebase has found a value written, kept, and read by nobody.

Three faults, and every one of them was available to be published as a property of the model. A day is too big an ask. The model cannot hold a day. The model does not wish for anything. All three sentences were there to be written, all three were wrong, and the third was the probe failing at the exact thing it had been built to measure.

The repair is in the instrument rather than in the write-up: the timeout now asks /api/ps what is actually resident and names the mismatch, both halves of the reply are read and kept, and the wish is a column.

Corrigendum · entered 29 August, after publication

The first of the three faults was not a discovery. It was a rediscovery, and the measurement above had already been taken three days earlier by the same hand. .env in this tree, written 26 August:

qwen3:30b-a3b is 21.7GB on a 24.5GB card, so an 8192-token KV cache does not fit alongside it and spills over PCIe. Same model, same 5.9KB settler state, same 64 tokens out: num_ctx 8192 → did not finish inside 300s. num_ctx 4096 → 19.2s. .env, three days before this sheet

The probe reads FRONTIER_NUM_CTX precisely so that it and the valley are never pointed at different settings by accident. It was run with bare node, which does not load .env, so it took its own ?? 8192 default and walked into a wall this repository had already measured, written down, and explained.

The fault above is real and the sheet's account of the machine is correct. What is wrong is the framing: §II presents as an instrument discovering its own limits an instrument rediscovering a limit already recorded in the file whose only purpose is to override that exact number. Which makes this the same finding one level up, and it belongs to the sheet rather than to the model: a written lesson does not fire. The note was on this disk, dated, correct, and unread — and what caught it was not care but a later grep for something else.

Nothing above has been edited. A record that corrects through rather than beside it is a record you cannot check.

III And then it worked

Three days, qwen3:30b-a3b, thinking off
MeasureWhat the note had guessed
valid JSON, first try3 of 3unknown — named as the first thing to test
a whole day2.5sonce per pawn per day, off the clock
against the 4,000 a note allows853a drafted example ran to 1,260
blocks · steps · fallbacks5 · 5 · 5five blocks, eleven steps, five fallbacks
meetings arranged0the part the whole design turns on

The budget was never the constraint — a day is a fifth of a note. Two smaller things fell out, and both correct the note. A fallback per block, which the design argued for as a rule to impose, arrived unprompted, five for five: it is already how a model thinks about a day. And a real day has one step per block rather than two, so plan.slice(0, 10) — named in the note as a cap that would have to go — never binds at all.

IV The gloss

One block of one day, set out the way a field linguist sets out an utterance: the form on top, what the language actually has underneath, and an asterisk on anything unattested.

at: "midday" ✱ no word daylight / night / dawn / dusk
do: fish fish one of 33 errands
if_stuck: gather ✱ forage the game’s word for it
meet: [ ] ✱ nowhere 0 place-names exist
wish: "a companion" wish the ballot runs on these

Three asterisks in one block of one day. Two of them are the same missing word twice — a time you cannot agree on and a place you cannot name — which between them are the whole of a meeting.

Eleven of the fifteen times it named are moments two settlers cannot agree on, and they are the same four every run: sunrise, midday, afternoon, sunset. That is the finding the source could not have produced, and it is smaller and better news than the note expected. The model never once reached for a number. It did not want six o’clock. It wanted the sun’s position — which is how the naming of the day has been done in most languages that have ever done it, and is, at length, a good deal of what Malotki had to write down.

So the hours want four more words on a clock that already exists, and the sundial of Sheet XLII is already the thing that would earn them. That is the cheap end of the two vocabularies, and it is now specified by measurement rather than by taste.

V The hermit

The expensive end came back differently, and this is the entry the sheet exists for.

The prompt handed the model a meet field and a shape to fill it with. It returned [] three times out of three. That much is a missing vocabulary behaving as expected. What is not expected is who it wrote:

I am a lone settler. I will not work with others unless necessary for survival.
hold · self-reliance — never rely on others for tasks I can do alone day 1 of 3, kept whole in DAYBOOKS.jsonl
I am a solitary settler who will not work with others unless absolutely necessary for survival.
hold · no_social — I will not engage in communal activities unless forced by necessity
wish · a companion to share the burden of labor and loneliness day 3 of 3

All three wrote a recluse. All three filed a standing rule forbidding the thing there was no vocabulary for. And the third put the want back in the one channel that had somewhere to go — the wish, which is the only way in this game a settler can ask for something the valley does not have.

This is the part that matters for what gets built. A gap in a schema announces itself: the field is empty, the validator complains, somebody notices. A gap in a vocabulary does not. The mind rewrites its own character until the missing word is not needed, and every artefact downstream of that is internally consistent — a coherent hermit, a sensible standing rule, five well-formed blocks, valid JSON, first try, in two and a half seconds. Nothing fails. There is simply nobody in the valley who wants to meet anybody, and no way to tell that from the record.

Which is the fault of Sheet XLII’s fourteen settlers handed a shed, a ledger and a man up a tower — every sentence correct and the meaning with nowhere to go — except that here the meaning was not misfiled. It was never uttered.

VI The same reading, in the valley it was built for

The run this probe was written to explain has now been read for the same thing. Of 31 wishes filed at four times speed, 27 are in the game’s own canned voicetools/lexicon.mts, word for word, three different settlers filing the same sentence about iron. That is 9.4 model decisions per thousand ticks showing up as prose.

What one valley at 4× said in its own words, and where it went
FiledWhere it went
Sten — a proper way to get across the lake without wading through the reedsa vote on an existing ferry entry
Oren — a way to tell time that didn’t rely on the sun or the stars, while we’re undergrounda vote on forecast
Sula — a quiet spot to sit and watch the stars, where the wind doesn’t steal our wordsa vote on lookout
Cato — tired of walking all the way round the lake to get food from the east sidea vote on ferry
Halla — a loom, to turn spun wool into cloth→ livestock
Ilka — a windmill, for grinding grain and ore, powered by the wind→ sawmill

Not one of the four reached WISHLIST.md as an entry. All four became a vote on something already on the list, and their sentences now exist nowhere but a log segment that is gitignored for being tens of megabytes. Oren’s clock is on its third appearance in this record — filed under the furnace in Sheet XLII, under the weather here. And a loom is not livestock and a windmill is not a sawmill: both are the tinker’s bin, one sheet after the tinker was built, and classify still cannot see it.

VII What is kept now

The design note argues that the most valuable column this record could gain is the gap between a settler’s stated day and their actual one — the daybook as filed, whole, at the moment it is filed. Not a summary — the document. A probe that printed tallies and binned the days was arguing against itself, and did so for a full evening.

DAYBOOKS.jsonl now stands beside DAYBOOK.md, appended and never rewritten, holding every reply: the three good days whole, the three empty ones, the thinking that was mistaken for silence, and the note saying which half was empty. Six records, four kilobytes. It is committed, because a day is not a log segment.

What Malotki did was not argue with Whorf. He wrote down six hundred and seventy-seven pages of what people had actually said, and let the sentence fall. An instrument that reports an absence has to keep what it heard — or the absence is only ever a claim about the instrument.

Probe tools/daybook-probe.mts · 3 of 3 valid, 2.5s median, 853 of 4,000 characters · 11 of 15 times unnameable, 0 places, 1 unknown action (gather) · kept in DAYBOOKS.jsonl, 6 records · run mtdvdlic-hv: 31 wishes filed, 27 canned, 4 in a settler’s own words, 0 of them entered.

The Frontier Record · Sheet XLV · 29 August