# A 3090, in its own words — data kit

**What this directory holds.** Both sides of every call: the whole of what the
model was given, the whole of what it sent back, and the whole of what the
machine recorded while it answered — for the fiction on *A 3090, in its own
words* (https://research.strata2signal.com/a-3090-in-its-own-words/). Seven
prompt files, verbatim, exactly as they went on the wire. Seven raw replies,
unedited, exactly as they came back. Seven run receipts, one per call — model,
seed, temperature, the UTC window at both ends, the card's own watts and
temperature before and after, the token counts the runtime reported, and the
sha256 of both the prompt and the reply. And one reading of the seat itself:
the build the runtime is serving, the context it is configured for, and the
card's three power figures.

The page is **fiction, and it says so**: the card's memories are facts lifted
from published pages, and its feelings are a language model's invention on a
human outline. This kit is what makes that claim checkable, from the input side
and from the output side both.

Seven calls, in five rounds, all on 2026-09-20 (UTC), all to the same seat on
the same card: two drafting calls, three that rewrote one part each, one that
asked the model to review the whole page including its own three parts, and one
that had it rewrite all three parts against those suggestions and the editors'.
**The text on the page is round five's reply — the seventh and last call — word for word.**

**Licence: CC BY 4.0.** Take these prompts, replies and receipts, re-run them,
check our arithmetic, publish what you find. Attribution: strata→signal
research, research.strata2signal.com. If you find an error in any of this, we
want to hear about it: hello@strata2signal.com.

## What is in here

Twenty-two files the run produced, plus this README and the manifest.
`index.json` lists every one of them with its byte count and its sha256; this
table says what each one is.

| file | what it is |
|---|---|
| `prompt-v1.txt` | Round 1's prompt, verbatim: the instruction, the ten facts each drawn from a published page, and the three-part outline. |
| `prompt-v2.txt` | Round 2's prompt, verbatim: the first prompt again, the model's first draft quoted back to it, and seven editor's notes. |
| `prompt-part1.txt` | Round 3's first call, verbatim — the second draft quoted back with one instruction: rewrite part one only, 380 to 460 words, add nothing not in the facts. |
| `prompt-part2.txt` | The same, for part two. |
| `prompt-part3.txt` | The same, for part three. |
| `prompt-polish.txt` | Round 4's prompt, verbatim: the whole page as it then stood, its own three parts included, with one instruction — give your edit suggestions. |
| `prompt-revise.txt` | Round 5's prompt, verbatim: the three parts back, with the model's own accepted suggestions, the editors' proposed cuts, one added memory and one correction, and the instruction to rewrite all three parts in full. |
| `output-run1.md` | What came back from round 1, unedited. 399 words — the draft the page calls too short. |
| `output-run2.md` | What came back from round 2, unedited. 407 words. |
| `output-part1.md` | What came back for part one, unedited. 201 words. |
| `output-part2.md` | The same, for part two. 253 words. |
| `output-part3.md` | The same, for part three. 254 words. |
| `output-polish.md` | What came back from round 4, unedited. 650 words — fifteen numbered suggestions about the page. |
| `output-revise.md` | What came back from round 5, unedited. 642 words. **This file is the three parts on the page**, character for character. |
| `kit-run1.json` | Round 1's receipt. |
| `kit-run2.json` | Round 2's receipt. |
| `kit-part1.json` | The receipt for part one's call. |
| `kit-part2.json` | The receipt for part two's call. |
| `kit-part3.json` | The receipt for part three's call. |
| `kit-polish.json` | Round 4's receipt. |
| `kit-revise.json` | Round 5's receipt. |
| `seat.json` | The seat itself, read at 02:53:29Z, after the last call: the model's build (`gguf`, `mistral3`, 24.0B, `Q4_K_M`), the first line of the licence the runtime holds for it, the context it is configured for, and the card's own three power figures — the cap the seat runs under, the board's maximum, and its default limit. |
| `index.json` | This directory, listed: every file with its size and sha256. |

## Check the hashes, and then diff the page against the reply

Every receipt names the two files it belongs to and carries the sha256 of each.
Both check, fourteen of fourteen, against the files sitting beside them:

```
sha256sum prompt-revise.txt output-revise.md
# compare with prompt_sha256 and output_sha256 in kit-revise.json
```

And once they check, the thing to do is **compare `output-revise.md` with the
three parts on the page**, because the page claims the story is the model's
round five's reply with nothing added by a human and nothing cut by one. The two are
the same **3,617 characters**, part titles included: cut the page's markdown
twin (`../index.md`) from `## Part one: proof of work` down to the rule before
*How this was written*, and the difference against this file is empty. Not
"empty apart from formatting" — empty.

## The two cuts, which were made to an EARLIER draft

The page says two sentences were cut. They were cut from the **round 3** text
before it was sent back in round 5, so they are not cuts from what the page
prints — and both are here to read:

- `output-part1.md` writes the Merge fact twice — once as the paragraph that
  survived, and once as a near-verbatim paste of the fact it had been given
  (*"Ethereum's own page says…"*). The duplicate was one cut.
- `output-part3.md` writes *"The pads from 2021 hold. They're flattened now, not
  soft anymore."* Nobody has measured those pads, so the second sentence was the
  other cut.

Both cuts appear in round 5's prompt as proposals, alongside the model's own
suggestions from round 4, and the model was free to take or leave them. What it
did with them is in `output-revise.md`, which is the page.

## What a receipt says, field by field

| field | what it is |
|---|---|
| `model` | The model the call was answered by, in the runtime's own tag form. |
| `host` | Where it ran, in words: the workshop's inference box, the runtime, the card, and which seat that card was already serving. |
| `seed`, `temperature`, `num_predict`, `num_ctx` | What was asked for. Seeds run 3090 to 3096, one per call; temperature is 0.9 for the five drafting calls and 0.7 for the two review calls. `num_ctx` appears on round 1 only, and that is the mistake the page confesses — the other six calls passed none and took the seat's configured window. |
| `prompt_file`, `prompt_sha256`, `prompt_words` | Which prompt went on the wire, by its name in this directory, and its sha256. |
| `window_utc` | The call's own start and end, from the machine's clock, UTC at both ends. |
| `gpu_before`, `gpu_after` | Both cards in the box as the driver read them at the two instants — index, full product name, watts, degrees Celsius, memory in use. The row naming a GeForce RTX 3090 is the card that answered and the card the page is about; the other card is in the same box and is shown rather than hidden, because a reader comparing watts should be able to see what else was drawing. Round 3's three calls ran back to back, so the `gpu_before` of the second and third of them (276.98 W, 270.36 W) is the card still coming down off the call before it, not an idle reading. |
| `seconds`, `eval_count`, `eval_duration_s`, `tokens_per_second`, `prompt_eval_count` | The runtime's own counts for the call. |
| `done_reason` | Why generation stopped. `stop` on all seven: nothing was truncated. |
| `output_file`, `output_sha256`, `output_words` | What came back, by its name in this directory, with its sha256 and word count. |

## Four things were changed in these bytes before they were published, and here they are

The seven `kit-*.json` files are the run's own receipts with **four changes and
no others** — every remaining byte, including whitespace and key order, is as the
runner wrote it, and the list below is a reading of the diff rather than a
description of an intention:

- **An `api` field was removed**, from all seven. It carried the private address
  the call was made to, which is a thing this workshop does not publish about its
  own machines. Nothing on the page or in this kit is derived from it.
- **The `host` string was rewritten**, in all seven, to name the box by role
  rather than by the runtime's internal instance name. It now reads: *the
  workshop's inference box, ollama, on the RTX 3090 (the long table's Mistral
  seat)*.
- **`prompt_file` was flattened**, in five of the seven, from the path the file
  held in the run directory (`run-3/prompt-part1.txt`) to the name it has here.
  A path that resolves to nothing is worse than no path.
- **`output_file` was added**, to all seven, so each receipt names the reply its
  `output_sha256` belongs to instead of leaving a reader to guess.

Both cards keep their full product names in `gpu_before` and `gpu_after`;
hardware is named in full on this shelf.

Nothing else was touched, in any file. **The seven prompts and the seven replies
are byte for byte the files that went on the wire and came back off it** — not a
character of either was changed for publication, which is the whole point of
shipping them, and it is why every sha256 in every receipt still checks against
the file beside it.

## What this kit does not carry

- **Anything about the seat between the calls.** The card was serving a public
  table throughout and nothing was stopped or moved; what it served in those
  fifty minutes is on that table's own wall, not here.
- **A second model's attempt.** Only the model already resident on the card was
  asked, on purpose, and the page says so.
- **The run's own harness.** These are its inputs, its outputs and its readings,
  not its code.
- **A second reading of the seat.** `seat.json` was taken once, after the last
  call. It is a reading of how the seat stood at that moment, not a log of how it
  stood throughout.
