# Data kit — The Ceiling Is Not the Corpus

Everything the article claims, with the artifact behind it. Published 2026-09-09 (UTC).
**Every file in this directory is CC BY 4.0** — the hub's usual licence for a data kit, and it
covers all of it, because **this kit ships no audio**. The renders and the listening masters are
share-alike, because the corpus behind the adapter is, and they are served on the companion page
with their own manifests rather than in here. One licence, one directory, on purpose.

The article's own promise is the contents list:

> the corpus manifest with each track's licence, source and fingerprint; the provenance and
> credits files, including the seventeen excluded tracks and the licences their artists have
> since chosen; the style fence as a machine-readable file with its own fingerprint; the training
> log, the per-epoch losses, and the learning-rate series the warmup figure was read from; the
> walk's own log; the coherence bench's inputs, outputs and checksum file; the blind sheet's
> sealed key and our listener's answers exactly as typed, timestamped before the key was opened;
> and the pre-registration itself, which can be verified by restoring one line to its placeholder
> and hashing the file

All of it is here. Nothing in this kit is withheld to protect a result — read "What is NOT here,
and why" for the four things that are absent and the reason for each.

## The promise, file by file

| what the page promises | the files that keep it |
|---|---|
| the corpus manifest with each track's licence, source and fingerprint | `corpus-manifest.jsonl` (416 rows) · `corpus-manifest.sha256` · `credits.md` |
| the provenance and credits files, including the seventeen excluded tracks and the licences their artists have since chosen | `corpus-provenance.md` · `credits.md` · `relicensed-excluded.jsonl` (17 rows) · `licence-census.json` (574 rows) · `style-excluded.jsonl` (141 rows) · `intake-receipt.md` |
| the style fence as a machine-readable file with its own fingerprint | `house-wide-fence.json`, sha256 printed below · `fence-report.json`, which echoes that same digest as the fence that produced this corpus |
| the training log, the per-epoch losses, and the learning-rate series the warmup figure was read from | `train.log` · `train-lr-series.csv` · `train-events.tfevents` · `train-launch.sh` · `preprocess.log` · `train-vram.log` · `run-timeline.json` · `s-per-step.md` |
| the walk's own log | `walk-receipt.txt` · `ranged-walk.log` · `ranged-walk.py` |
| the coherence bench's inputs, outputs and checksum file | `coherence/` — both benches' crops, embeddings, indexes, code and results, and `RESULTS.sha256` |
| the blind sheet's sealed key and our listener's answers exactly as typed | `blind-key.json` · `listener-answers-raw-2026-09-06.txt` · `score-sitting.py` · `sitting-scored.json` |
| the pre-registration itself | `PREREG-HOUSE-ARMS.md`, with both amendments as they were filed |

## The fence, and its fingerprint

`house-wide-fence.json` is 661 bytes and hashes to

    088e25e57fe25d26f4d755b8915e13b5c34e320d902f365f64a905feaf10a30d

It was not projected — no path, host or person appears in it — so the digest above is both what
this kit publishes and what the freeze read. `fence-report.json` carries the same digest in its
own `fence_spec_sha256` field, so "which fence produced this corpus" is a hash on both sides
rather than a memory.

## The pre-registration's seal, and how to check it

`PREREG-HOUSE-ARMS.md` §0.4 registers its own seal and the procedure for testing it: copy the
sealed file, restore that one line to the placeholder it was hashed with, and hash the copy. The
amendments were appended afterwards and are excluded by the file's own tail, so the seal covers
the first 1,875 lines.

Run against the **unprojected** bytes, that is:

    head -n 1875 PREREG-HOUSE-ARMS.md \
      | sed 's/= 182e3361747811f2080c0c7f984630109fc4a0cbf559d2b67ca9bbf60495e3f2/= ⧖ TO BE FILLED AT SEAL/' \
      | sha256sum

and it returns `182e3361747811f2080c0c7f984630109fc4a0cbf559d2b67ca9bbf60495e3f2`, which is the
value §0.4 carries. That was run for this kit, on the file as it stood in the run's own
repository, before anything here was projected.

**The copy published here is projected and does not hash to it**, and pretending otherwise would
be worse than saying so. The unprojected file is 151,175 bytes and hashes to

    1dc9ac70f5498e4920d7641bfef62207f92f0f1f2c421177dfcad1996b7a678f

so the projection is checkable: a reader holding the original can reproduce that digest, and
`provenance.json` names every rule that fired on this file and how many times.

What the seal buys a reader is the ordering, and the ordering is the point: the registration was
sealed before the first training step (2026-09-06T09:52:02Z, `run-timeline.json`), and both
amendments are dated inside the file — A-H1 at 2026-09-06T01:03Z, before the freeze at 09:25:41Z;
A6-HOUSE at 2026-09-06T11:19Z, before the sitting that evening. Neither moved a threshold.

## Where every number on the page is written

The rule for this kit is the ordinary one: **if a number on the page disagrees with a file here,
the file wins.** This is the map.

| what the page says | where it is written |
|---|---|
| 574 tracks in the pool | the pool IS three files: `corpus-manifest.jsonl` (416) + `style-excluded.jsonl` (141) + `relicensed-excluded.jsonl` (17) |
| the eighty-five distinct genre tags the pool carries | the union of `tags.genre` across `corpus-manifest.jsonl` and `genre_tags` across `style-excluded.jsonl` |
| 141 removed by the style fence | `fence-report.json` → `excluded`; per track in `style-excluded.jsonl`, each row naming the out-tag that removed it in `removed_by`, and rolled up by tag in `fence-report.json` → `removal_table` |
| 284 gone from the catalogue entirely | `licence-census.json` → `coverage.absent_from_the_live_catalogue` |
| twenty still there but no longer openly licensed | `licence-census.json` → `licence_drifted`; the four moves in `fence-report.json` → `relicensed_since_2019.drift_matrix` |
| seventeen left the corpus, with old and new licence | `relicensed-excluded.jsonl`, one row each with `frozen_licence`, `today_licence` and `api_record_read_at` |
| 416 tracks · 35.1 hours · 95 artists · 278 CC BY-SA and 138 CC BY · 331 train | `corpus-manifest.jsonl` — count the rows; sum `duration_s`; distinct `artist_id`; group `licence.short`; count `split_side` |
| 85 held out, 59 of the 95 artists unseen | `split.json` → `holdout_tracks_actual`, `train_tracks_actual`, `straddling_artists` and the per-artist `walk`; the same figures fall out of `corpus-manifest.jsonl` |
| zero of five API digests matched | `api-digest-check.json` → `checked`, `digest_matches`, and the per-track rows |
| 161 to 203 kbps · correlation 0.997 · 1.26 kHz of ceiling lost | `api-route-verdict.md`, the re-encode comparison |
| 45,603 requests · 574 of 574 placed · zero failures | `walk-receipt.txt`, the `DONE` line — which states the transfer as **6,242.7 MB**, the figure the page prints as 6.1 GiB by reading it as mebibytes; every archive and every placed member is in `ranged-walk.log` |
| 4,593 items audited · 6,029 usable tracks · 510.6 hours | `archive-survey.md`, the audit set and the licence-tier totals |
| 944 tracks and 81 hours in the netlabel collections | `archive-survey-verdict.md`, "Usable tracks, hours and artists per licence rung" |
| nearly half the corpus captions to genre words alone | `corpus-manifest.jsonl`: 151 of the 331 training rows carry an empty `tags.instrument` **and** an empty `tags.mood_theme` — 45.6 % |
| no training track captioned to a single word | `corpus-manifest.jsonl` → `caption`; the shortest training captions are the two-word `deep house` |
| the modal caption, and the tag vocabulary | `corpus-manifest.jsonl` → `caption` · `caption-template.py` · `tag-words.json` · `captions-examples.txt` |
| 13 min 26 s preprocessing, 2.44 s per track | `run-timeline.json` → `stamps.preprocess_start` / `preprocess_end` and `derived`; the pass's own log is `preprocess.log` |
| 39 min 56 s training | `run-timeline.json` → `stamps.train_start` / `train_end` |
| 5.73 seconds per optimiser step (and the 5.74 and 5.77 beside it) | `s-per-step.md`, which gives all three denominators and points at `train.log`, `train-lr-series.csv` and `run-timeline.json` |
| 5.7 GiB peak memory on the card | `train.log`, the Training Complete banner. The card-delta reading from the 60-second sampler is separate and larger — 6,636 MiB — and is in `train-vram.log`; the banner is the allocator's figure and is the one the ledger marks authoritative |
| 44,040,192 parameters · rank 64 · alpha 128 · the whole recipe | `train.log`, the configuration block; `train-launch.sh` is the line that produced it |
| five epochs, 83 steps each, 415 optimiser steps | `train.log`; `run-timeline.json` → `derived` |
| 100 warmup steps asked for, 41 received | `train-launch.sh` and `train.log` for the 100; `train-lr-series.csv` for the 41 — the arithmetic is below |
| 0.8833 · 0.6778 · 0.6480 · 0.6494 · 0.6494 | `train.log`, the five `[OK] Epoch` lines; the shipped checkpoint is epoch 3 and its directory name carries the loss |
| 0.4489 · 0.3774 · 0.2203, with intervals | `coherence/house-metrics.json` → `P_A.comparator_read_not_recomputed` (the previous corpus, read rather than recomputed), `P_A.primary.house_wide_train`, `P_A.primary.house_artist_train` |
| not detected · p = 0.0001 · intervals apart | `coherence/house-metrics.json` → `P_A.verdict_primary`, `P_A.secondary_permutation.p_one_sided_house_less_spread`, `H1_HOUSE.cis_overlap`, `H1_HOUSE.permutation.p_one_sided` |
| 15 of 24 · 10 of 24 · 7 of 24 monotone | `coherence/house-render-metrics.json` → `H3_HOUSE.toward`, `H3b_HOUSE.toward`, `H5_HOUSE.monotone_of_24`, each with its registered verdict beside it |
| twenty-four pairs, twelve sentinels, clears at 18 of 24 | `blind-key.json` → `scoring_trials`, `sentinels`, `block_A_threshold`, `sentinel_band` |
| 15 answered · 9 no difference · 11 untouched · 4 adapter | `sitting-scored.json`, and `python3 score-sitting.py` re-derives it from `blind-key.json` and the answers file in front of you |
| eleven of twelve identical pairs heard as identical, one not | `sitting-scored.json` → `sentinels`; the note that made it the exception is trial 27 in `listener-answers-raw-2026-09-06.txt` |
| all four adapter wins were requests for something other than house | `sitting-scored.json` → `adapter_win_styles` |
| five preferences on the four requests that ask for house, all to the untouched model | `sitting-scored.json` → `house_asking_requests` |
| the trigger word alone moved 3 of 12; the weights moved 7 of 12 | `coherence/house-render-metrics.json` → `BLOCK_T.token_moved_toward.toward` and `BLOCK_T.weights_moved_toward.toward` |
| 7.9462 against 7.9527, on a floor of 7.6527 | `coherence/house-render-metrics.json` → `PQ_FLOOR`, with every clip's four axes under `per_clip` |
| the memorisation screen, reported as descriptive | `coherence/house-render-metrics.json` → `A2_HOUSE_MEMORISATION`, with the threshold, the distribution it was read against, and why it is descriptive |
| all eighty-five within tolerance of −16 LUFS | `companion/records.json` → per clip `listening_copy.lufs_integrated`; the delivered range is −16.20 to −15.90 |
| −16.012 LUFS untouched against −16.005 adapter | `companion/records.json` → the same field, meaned by `arm` |
| 38 of the 85 are not a constant gain; 14 of 24 on one arm and 9 of 24 on the other | `companion/gain-probe.json` → `constant_gain` per clip, joined to `arm` in `companion/records.json`. The two-sided Fisher exact test on those four counts is p = 0.2476 |
| the three fingerprints for every clip | `companion/records.json` (`output_sha256`, `listening_copy.sha256`) and `companion/master-records.json` (`raw_sha256`, `master_sha256`) |
| renders of the same request on two machines are not byte-identical | `companion/records.json` → `cross_box_check`, both digests and the consequence |

**One figure on the page is not reproducible from this kit, and it is named rather than left to
be discovered.** The article says the first attempt at loudness-matching left eighteen of
eighty-five clips 1 to 2.3 dB louder than target. That reading was taken on a set of listening
copies that was **replaced before the sitting**; the corrected set is the one every file here
describes, and the discarded copies' own measurements did not survive into any published
artifact. What is checkable here is the corrected set: eighty-five of eighty-five inside
tolerance, and `companion/gain-probe.json` for what that fix turned out to cost.

## The warmup, in one piece of arithmetic

The launch line asked for 100 warmup steps and the trainer echoed 100 back. It used 41, because
its own scheduler takes the smaller of the requested value and a tenth of the total steps, and
415 // 10 is 41. **That is not read off the configuration — it is read off the curve**, and the
curve is `train-lr-series.csv`:

| optimiser step | learning rate |
|---:|---|
| 10 | 3.195122e-05 |
| 20 | 5.390244e-05 |
| 30 | 7.585366e-05 |
| 40 | 9.780488e-05 |
| 50 | 9.985861e-05 |
| 60 | 9.937090e-05 |

The first four are a straight line: the slope is 2.195122e-06 per step and it extends back to
1.0e-05 at step zero, so the line reaches the configured 1e-4 at **step 41.000000**. Steps 50 and
60 are already **below** 1e-4, which is what proves the warmup ended before step 50 rather than at
it. The peak step itself is not logged — the run logged every tenth step — so it is derived from
the series rather than read from a sample, and the derivation is the two lines above.

## What is NOT here, and why

**No audio bytes at all.** Every render, every listening master and the sitting's own copies are
served on the companion page with their own manifests. They are share-alike; this directory is
CC BY 4.0; keeping them apart is what makes both statements true. Every fingerprint is in
`companion/records.json` and `companion/master-records.json`.

**The corpus audio.** 416 recordings by other people are not redistributed here. What is
published instead is complete: the source URL, the licence the dataset recorded, the digest the
dataset published, the digest of the bytes actually written, and a per-file checksum list —
`corpus-manifest.jsonl` and `corpus-manifest.sha256`, 416 rows each.

**The adapter weights.** The LoRA file is not published. It is identified by sha256 inside
`companion/records.json`, so a reader can tell which adapter rendered which clip even without the
bytes.

**The Archive survey's flag appendix.** The survey's per-flag tables — every excluded item listed
under F-COMMERCIAL, F-NOTMUSIC, F-NONGENRE, F-AI, F-FENCE, F-DUP and F-FORMAT — are not
republished here. Their counts and the reasoning behind each class are in
`archive-survey-verdict.md`, and nothing from the Archive is in this adapter, so no figure on the
page depends on the row list.

**The model, the trainer and the embedder.** Named, linked and licence-checked in the article's
own credits; none of them is vendored here.

There is **no sealed key withheld** in this kit. The previous exhibit's blind key was held back
until a verdict existed; this one has a verdict, so the key ships with the answers it was sealed
against.

## What was projected out, and why

Every file here is published as recorded, with one class of change: **this house does not publish
the shape of its own machines.** Nothing measured was touched — every loss, learning rate,
duration, digest, byte count, loudness figure, distance, interval and p-value is as the
instrument wrote it, and every answer the listener typed is as he typed it.

- **Filesystem paths → role-relative paths.** An absolute path becomes the path it names
  (`music/…`, `estate/…`, `ace-house-data/…`). This is the rule that fires most: the crop tables
  alone carry one source path per crop.
- **Machine names → the role each played.** *The training box* is where the corpus was verified,
  the tensors written, the adapter trained, all eighty-five clips rendered and both coherence
  benches run. *The archive box* is where the ranged walk ran and where the one cross-box
  comparison render was made. *The laptop* is where the freeze, the licence audit and the intake
  tooling ran. Two JSON keys carry the same rule: the render records' two
  cross-box digest keys, each named for the machine that produced it, publish as
  `training_box_sha256` and `archive_box_sha256`.
- **The second box's card → its class.** It publishes as *a 96 GB workstation-class card*, never
  by model name. **The training card publishes by name — an RTX 3090** — as earlier exhibits on
  this shelf do, because it is hardware a reader might own and the page's argument is partly
  about that.
- **GPU serials, port numbers and a private network's name withheld.** That a card was pinned by
  UUID, that a service answered on a port, and that a connection was private are all published;
  the UUID, the port number and the network's name are not. They let nobody check anything and
  they fingerprint a machine.
- **The internal review shelf → its role.** It publishes as *the review shelf*.
- **The operator → his role.** *The operator* throughout, and *the listener* in the sitting's
  answers file, which is the role played there.

55 of this directory's 65 files are copies of bytes the run itself wrote.
**31 of those 55 carry at least one substitution.** For every one of them the
table below gives the rules that fired, the sha256 of the bytes **before** projection, and the
sha256 of what is published — so the projection is checkable by anyone holding the originals, and
`provenance.json` carries the same information per file with the count of each rule.

| file | rules fired | sha256 before projection | sha256 as published |
|---|---|---|---|
| `PREREG-HOUSE-ARMS.md` | card-to-class ×3, host-to-role ×34, identity-withheld ×7, network-withheld ×1, path-to-role ×41, person-to-role ×19, port-withheld ×8, shelf-to-role ×3 | `1dc9ac70f5498e4920d7641bfef62207f92f0f1f2c421177dfcad1996b7a678f` | `966edc67435fe7819cd9f55a9b755064be3cd612245932f905a2f2d6d788f02b` |
| `api-route-verdict.md` | host-to-role ×1, path-to-role ×6, person-to-role ×1 | `67757349b23398d341034a1f5308af663226cec7e7be3bfb3b9b89cd45c6ce91` | `b20705b6fa6be77d8e1b6d3733d2cafab7b6f5cbf3c4fc89f59e72b25451a258` |
| `captions-examples.txt` | path-to-role ×2 | `efe48c4402de6110ab57e949397a040153b2ba6e591e74bfbb94346bd81fc030` | `785ae3d3c3f509a317c670a6661932001a168baecaf43b800c3a2f47261ebd5b` |
| `coherence/RESULTS.md` | card-to-class ×1, host-to-role ×2 | `f3e6e9e19529c162a99965a3df254a4097a653688b7ee141e51813f255087aff` | `510ea259c4eb096d02b136e6f80181006a301d542e35035b1482668583a0f46f` |
| `coherence/corpus-crop.log` | host-to-role ×1, path-to-role ×1 | `3560b4fa6e29fcd5fbe711da625af2ce46042c777bdf14e67eeaa939d8c65d8f` | `81853639d6960d870b34f658db3d5de98ac8362982bb556365d232731849160b` |
| `coherence/corpus-crops.csv` | path-to-role ×2241 | `276803f58229ffaf681e542040335c8abf1704b0cdc3efb8895f3bdedb283fa4` | `0aada96f032fcb5d72b8ad1ed8c63169a0b0ade3605ceb99fd05e17bf314948a` |
| `coherence/corpus-embed.log` | path-to-role ×2 | `e266bf995c5de524a184e229165d7a41b8e4fd822206805dade17ebd3d6c5014` | `0d2eaff1b8f31ed8a8870ca8eb33ac0862d7c6153bef0cda501a822438cbf53b` |
| `coherence/corpus-embeddings-index.csv` | path-to-role ×2241 | `6cf8eb6d2ea3b27891a2f13c597c87655730268e364d6be86cbeb49f2d829e8f` | `4c6a97cf73f3da9b3237f939791513c5a91d589d263a45c1eee96d9ad18a88ec` |
| `coherence/house-metrics.json` | path-to-role ×1 | `a9f73276ae8cc3331dc82dc8f209693131b10e80b4d6f1adba14cce028441c43` | `4d2ca9d6d3b52efbdaa5b350798dfb040ddf0e8d7a0631055357cc1ac9db7197` |
| `coherence/house_metrics.py` | path-to-role ×1 | `5cf5e08f2c51e587f554f235c14b8cf244adbb1551176e3bdad122b88157bdea` | `9b1f700e7ed1a9edf81f8dccf69a02d7fd90a45e5617ed99cc1b5e8fc4c828f1` |
| `coherence/plan_house_crops.py` | host-to-role ×1 | `2a92c2632a4edc4cdbd50e4cacad70fcd04ce6a91e657009a1ffd88981e3ece1` | `afbcc58085f3e9557d3aea23919034f73284e14f98f8b87b01672dd0680ebeff` |
| `coherence/render-crops.csv` | path-to-role ×252 | `b5986baf87db6b939272cc3f78822afd0063c836f194d7356538185aac1d2ee6` | `c8283540aa7646b48605297051917b9d031ad45224edc3af3c7d6134411019b2` |
| `coherence/render-embeddings-index.csv` | path-to-role ×252 | `1e175154a1d08537fc8c28899649df2377fe8f40d939b02e409fcd5f96b0772b` | `a2b1da3fe98ad3f6f3efeac5a4ca8b019108abadcc26b1471d3c882f2016d08c` |
| `companion/records.json` | card-to-class ×1, host-to-role ×2, path-to-role ×270 | `2937e8c5a71ca2e9c72fb7a77c5e7303484db3fcd97ec7d1195ec50642924d6b` | `faf1d02946a493f5cdd123f581b3791d33c7438a0ec885b943373ed708cfeaf6` |
| `corpus-provenance.md` | path-to-role ×1 | `a6e4b40b445af2e5b122c8a2de8eb45232a3e1984436760fa5ab43c2085cd2fa` | `de243fb0d210bbc2437272c9ae9412b3aaceec56679eabdc517a1e4ab18a1368` |
| `credits.md` | path-to-role ×1 | `5a0f0d2476572f91bac789c76d5d63e47bfb811f93c9a50167aac0d6fb2e471e` | `a43f6f5b1ee0b54dc48abc24f876abddc3f21d29c2fe4d44cb8ff264a79edbe7` |
| `dataset.json` | path-to-role ×331 | `4e9552c5bab561a0cbb929fc27f506030ad83c19771126d861602f22ad6c8f60` | `9a93db01f94bcacfaf1c2c14ddd8660f11333a999fcaad791c9eaa5fcb50b1a4` |
| `fence-report.json` | path-to-role ×3 | `f22fa6de6e4b865e2b5b5b4d75c2f3226310dd08a95c2de9372e4622e9b32983` | `e0aa9f4aa2f875333c3a2da890023622048de5d5fc268b0ec4ece0d952e07f3f` |
| `freeze-receipt.json` | host-to-role ×3, path-to-role ×3 | `64bdb0ceed76e16de4b778d61caac677026ccea6caf1d489671654b9e6537ed3` | `a5a3a9d1bb238d21f574e4042746d8af513149102852a88e26bd4add7e1ffdbc` |
| `freeze-receipts.md` | host-to-role ×1, path-to-role ×1 | `6e8aea38337be19f2ee7fa136c7582c990eb5b689292d663ec4f1bc7effae79b` | `91804e184bd345957faa7cad14c3f706faf9dbe863d6ec2d50571fbf7dbc9e34` |
| `intake-receipt.md` | path-to-role ×1 | `a6e4b40b445af2e5b122c8a2de8eb45232a3e1984436760fa5ab43c2085cd2fa` | `de243fb0d210bbc2437272c9ae9412b3aaceec56679eabdc517a1e4ab18a1368` |
| `licence-census.json` | path-to-role ×1 | `597f53a1e8519718f241a81f3687f8e810fdac203450ebc40f070fcfd007bf4e` | `c98ca262af5f9e108aaf19a4d435472774f73123a1442cf240e13eefb6e6cb1a` |
| `listener-answers-raw-2026-09-06.txt` | person-to-role ×1 | `3a79bb6133a4dabab66a143e7872e71d64569b7c43fe5c4fdec52fd20b1b5175` | `e10ee738c0f02c0fd63042bd2945216b5240f352532aa9d56462372f7ad6eeb2` |
| `preprocess.log` | path-to-role ×7 | `5c8c121ad91a0ba382d14f4102e3cc6b5629aed99048848e2911e52658b49572` | `12e5abf10af27b4272a21ccbac05ea6fb9a8e027ea6a486b375c0a16341eed0a` |
| `ranged-walk.log` | path-to-role ×2 | `a0d4c5b57cb2875acd71f046ef275548569e88f826964b92271a90c51ea45b28` | `22330e49236db2ee0b9591977db45f2d8b763fb87b22b648911fead13c7404b6` |
| `ranged-walk.py` | host-to-role ×2 | `f329fab95b485f6d9828f85ce9a08c18fcf9caf06bedfd34c153a39f2faeac72` | `d528c8acee1d04e6163c779632ee1c38f5d015da154921928cc26b2b9f53bda2` |
| `split.json` | path-to-role ×2 | `3e1a1c25eb324e1fe81e35e0b21127fad093589517bb23226f9bf4a1590c0eb9` | `1f829dd6b7979287e0de9a77b8facf8f73cc81215b6b4aad4412db193b550a13` |
| `tag-words.json` | path-to-role ×1 | `dc949cb14ebace0db796612c43d4f36de47753ae5d0ceab2e39967f58b046d68` | `a2b9de3bbe0f84fd65dd9e66efcb2aa9a29ab7dd57bebb2c21b6692f429109e0` |
| `train-launch.sh` | host-to-role ×1, identity-withheld ×1, path-to-role ×5 | `cac0000109966d0773f6f4a0fb304346a9b9324609e2d7b19fd0e557f76c673f` | `05541cf85ea15ecd802a9e621e0f90d0b0eb8e76d8f1ccb7e6c97de80f62b4e4` |
| `train.log` | path-to-role ×23 | `4a1594f1433c7ece50f927804b33ab520ad72bc72d276c6fe97e7d9861a1d2cb` | `9a90d8385092e0b160e8ee0f9afff5a1b22986b48d5d9d55b07287aded5853b4` |
| `walk-receipt.txt` | path-to-role ×2 | `0425ec6e86db9f2a7347fcafc8944ab5edee29ea01b911e3a0418f06beb8e837` | `ab5556143c1987366a4d96a37755ab010c35b089aec5925917ef60ad5a88871e` |

The other 24 carried nothing to project and are byte-identical to the run's own copies:
`api-digest-check.json`, `archive-survey-verdict.md`, `archive-survey.md`, `blind-key.json`, `caption-template.py`, `coherence/RESULTS.sha256`, `coherence/corpus-embeddings.npz`, `coherence/house-render-metrics.json`, `coherence/house_render_metrics.py`, `coherence/render-centroid.csv`, `coherence/render-embeddings.npz`, `coherence/render-pairs.csv`, `coherence/screen.py`, `companion/gain-probe.json`, `companion/master-records.json`, `corpus-manifest.jsonl`, `corpus-manifest.sha256`, `house-wide-fence.json`, `near-duplicate-scan.json`, `relicensed-excluded.jsonl`, `split-rule.py`, `style-excluded.jsonl`, `train-events.tfevents`, `train-vram.log`.

**5 files were written or computed here rather than copied.** `train-lr-series.csv` is
read out of `train-events.tfevents`; `run-timeline.json` is read off the four stamp files the
runbook writes either side of each stage; `sitting-scored.json` is the output of
`score-sitting.py` in this directory; and `score-sitting.py` and `s-per-step.md` were written for
this kit. Two of them — `train-lr-series.csv` and `sitting-scored.json` — regenerate from bytes
that are here. The last five files are the kit's own furniture: `README.md`, `MANIFEST.sha256`,
`index.json`, `provenance.json` and `index.html`.

**Four files were renamed, and the rename is the same rule as the rest.** The run wrote them
under names that carried a machine's name or a person's, so they publish as
`train-events.tfevents` (the trainer's event file, whose name embedded the host),
`coherence/corpus-crops.csv` and `coherence/render-crops.csv` (both written as `crops-<host>.csv`
by a planner that stamps the box into the filename), and `listener-answers-raw-2026-09-06.txt`
(recorded under the listener's own name). The bytes of the last three are unchanged by the
rename; the answers file carries one projected line and no other change. Other files here are
renamed for ordinary kit reasons — `manifest.jsonl` reads as `corpus-manifest.jsonl`, `FREEZE.json`
as `freeze-receipt.json` — and `provenance.json` lists every file under the name it has here.

**`coherence/RESULTS.sha256` is the bench's receipt, not this kit's.** It was computed over the
run's own unprojected bytes. Of the three files it lists, `RESULTS.md` and `house-metrics.json` were
projected and will not match; `house-render-metrics.json` was not touched and does. Running

    cd coherence && sha256sum -c RESULTS.sha256

prints exactly 2 `FAILED` and 1 `OK`; that is the disclosure, not a
defect. `MANIFEST.sha256` in this directory covers what is actually published.

## Two figures worth reading off the kit rather than off memory

**The largest shaped residual is 0.463 of full scale, not a third.** `companion/gain-probe.json`
fits one multiplier per listening copy against its own render and reports the largest sample
residual in int16 units. The worst is 15,173 units on `P10__house-0.5__seed5010` — 0.463 of full
scale — and the four worst clips all sit above 0.39. The count that matters for the arms is
unaffected: 38 of 85 are not a constant gain, 14 of the 24 untouched and 9 of the 24
full-strength, and the two-sided Fisher exact test on those counts is p = 0.2476.

**The Archive survey counted 924 distinct creators across all open rungs**, not 919:
`archive-survey.md`'s "Artists" table is the measurement, and `archive-survey-verdict.md` rolls
the same rungs up by provenance.

## One thing in this kit refuses to be tidy, on purpose

**The render records keep the harness's own field names, including the loudness spelling.** This
arc's records write `lufs_integrated` / `lufs_range` / `true_peak_dbtp` / `threshold`, and the
previous arc's third round wrote the same four measurements under different names. Normalising
them here would be a small kindness that hid a real trap — a fold that reads one spelling
silently drops clips instead of failing — so the records keep the harness's own words and
`companion/records.json` says which spelling it uses in its own `loudness_key_spelling` field.

## The files

| file | what it is |
|---|---|
| `MANIFEST.sha256` | Every kit file's sha256 in `sha256sum -c` form, over the bytes published here — provenance.json included. It does not list itself, index.json or index.html; index.json carries its digest instead. |
| `PREREG-HOUSE-ARMS.md` | The pre-registration, sealed before the first training step, with both amendments as they were filed and nothing else added: A-H1 (2026-09-06T01:03Z, before the freeze) and A6-HOUSE (2026-09-06T11:19Z, before the blind sitting's first block). Neither moved a threshold. How to verify the seal is in README.md. |
| `README.md` | What each file is, which promise on the page it keeps, where every number the page prints is written, what was projected out of every file and the sha256 of the bytes before projection, and what is NOT here. |
| `api-digest-check.json` | The five-file gate on the fast route: five tracks re-fetched from the catalogue's own API and hashed against the dataset's published digests, with each fetched file's format and the licence the API returned. Zero of five matched. |
| `api-route-verdict.md` | Why the fast route was rejected, in full: the digest gate, the re-encode comparison (correlation after sample-exact alignment, bitrates against the dataset's 320, the lost spectral ceiling), the catalogue decay the audit found, and the two API traps found on the way. |
| `archive-survey-verdict.md` | The survey's verdict: what the licence string alone would have bought, the disqualification classes and their counts, the netlabel slice that would be trustworthy, the artist-level overlap with this corpus, and the recommendation. Nothing from the Archive is in this adapter. |
| `archive-survey.md` | The other corpus, surveyed and not used: the Internet Archive census — the audit set, the rule for counting a track, licence-tier totals, artists, the provenance split that changes the picture, the genre census, and the per-item detail for the usable corpus. |
| `blind-key.json` | The blind sheet's sealed key: all thirty-six presentations, which arm was A and which was B, the clip id and sha256 of both files in every trial, the order seed, the block threshold and the sentinel band. Sealed on the training box before the listening page existed and opened after the sitting closed. |
| `caption-template.py` | The caption rule of record, as executable code: the head term, the tag order, the caps, and the de-camelisation lookup it applies. |
| `captions-examples.txt` | Twenty captions rendered from the frozen manifest, evenly spaced through it so the sample is not just its head. |
| `coherence/RESULTS.md` | The coherence bench's results in prose and tables: the corpus spreads with their intervals, both registered tests and their disagreement, the render predictions scored against what was registered, the quality floor, the memorisation screen, and what the run does not license anyone to say. |
| `coherence/RESULTS.sha256` | The bench's OWN receipt over its three output files, computed on the run's unprojected bytes. Files this kit projected will not match it; MANIFEST.sha256 covers the published bytes and README.md names which files differ. |
| `coherence/corpus-crop.log` | The corpus crop stage's transcript. |
| `coherence/corpus-crops.csv` | Every crop the corpus bench took, 2,241 rows: source track, its digest, the window, the offset, the crop's own digest, bytes, duration, sample rate and channels. |
| `coherence/corpus-embed.log` | The corpus embedding stage's transcript, including the loader's own warnings. |
| `coherence/corpus-embeddings-index.csv` | The row order of corpus-embeddings.npz — which crop is which vector. |
| `coherence/corpus-embeddings.npz` | Every embedding the corpus bench computed, as written. The corpus results are re-derivable from this file and the index beside it. |
| `coherence/house-metrics.json` | The corpus-coherence results as data: the instrument pins and seeds, every corpus's mean pairwise distance at equal N with its interval, the archived comparator rows read rather than recomputed, both registered tests with their verdicts, and the cross-split near-duplicate scan. |
| `coherence/house-render-metrics.json` | The render-coherence results as data: the three registered pull predictions and their scores, the trigger-word control against the weights, the perceptual quality floor per arm and per clip, and the memorisation screen with its threshold and the distribution it was read against. |
| `coherence/house_metrics.py` | The corpus bench itself, verbatim: the corpora it reads, the crop policy, the embedder pin, the metric and the interval procedure. |
| `coherence/house_render_metrics.py` | The render bench itself, verbatim: the predictions, the centroid rule, the quality floor and the memorisation screen. |
| `coherence/plan_house_crops.py` | The crop planner both benches shell out to. |
| `coherence/render-centroid.csv` | Each render's distance to the corpus centroid, one row per render. |
| `coherence/render-crops.csv` | Every crop the render bench took, 252 rows, same columns as the corpus crops. |
| `coherence/render-embeddings-index.csv` | The row order of render-embeddings.npz. |
| `coherence/render-embeddings.npz` | Every embedding the render bench computed, as written. |
| `coherence/render-pairs.csv` | Each base/adapter render pair and its two distances — the rows the pull predictions are scored on. |
| `coherence/screen.py` | The screen the bench applies before it will embed anything. |
| `companion/gain-probe.json` | The measurement that found the second loudness fault: for each of the eighty-five listening copies the listener actually heard, the single best-fit multiplier against its own render, the largest residual in int16 units, the fraction of samples off by more than one unit, and the verdict — a constant gain, or not. |
| `companion/master-records.json` | The all-linear re-master the companion page serves: one constant gain per file and nothing else, with the rule stated at the document level and, per clip, the raw and mastered digests, the gain applied, whether it reached the target, what bound it, and the loudness before and after. |
| `companion/records.json` | The render harness's own records for all eighty-five renders: the request exactly as the engine received it — caption as sent, seed, key, tempo, duration, step count, shift, guidance, normalisation — the adapter and its strength, the output digest, timings, VRAM, the loudness measured on the render and on the listening copy, the arm pair checks, the determinism control and the cross-box check. |
| `corpus-manifest.jsonl` | The corpus, one row per track (416): title, artist, album, the source URL, the licence as the dataset recorded it, the digest the dataset published and the digest of the bytes actually written, the mirror archive each came out of, measured duration, bitrate, loudness and bandwidth ceiling, every tag, the caption the template produced, and which side of the split it fell on. |
| `corpus-manifest.sha256` | The 416 checksums in `sha256sum -c` form, relative to the corpus audio directory. |
| `corpus-provenance.md` | How the corpus was assembled and what was measured on it: the route, the verification against the dataset's own digests, the licence audit and what it found, and the exclusions. |
| `credits.md` | The attribution owed: every one of the 416 tracks by title, artist and licence, plus the seventeen named as excluded with the licences their artists have since chosen. |
| `dataset.json` | The training dataset as the trainer received it: 331 samples, each with its audio path and the caption as sent, and the run's preprocessing settings at the head. |
| `fence-report.json` | The style fence applied: the spec's own sha256, the in-tags and out-tags, the removal table by tag, the relicensed class with its drift matrix, and the tag source with its digest. |
| `freeze-receipt.json` | The freeze's identity: what was frozen and when, with the file count and byte total for the corpus, the dataset and the tensors. |
| `freeze-receipts.md` | The freeze's own receipts, assertion by assertion, as the freeze script wrote them. |
| `house-wide-fence.json` | The style fence as a machine-readable file: the licences, the in-tags, the out-tags, the title regex and the ruling. This is the fence spec of record; its fingerprint is printed in README.md and echoed by fence-report.json. |
| `intake-receipt.md` | The download receipt, frozen at acquisition: what was fetched, from where, and what each response carried. |
| `licence-census.json` | The licence re-read that produced the second cut: all 574 tracks of the pool checked against the live catalogue seven years after the snapshot, one row each, with the licence the snapshot recorded, the licence the catalogue serves now, whether the track is there at all, and the UTC moment each was read. |
| `listener-answers-raw-2026-09-06.txt` | The listener's answers exactly as typed, in the order he typed them, batch by batch, with his own running tallies — recorded before the key was opened. Only the line naming him was projected; not one answer was touched. |
| `near-duplicate-scan.json` | The cross-split near-duplicate scan: every (held-out, training) pair below the first percentile of the training set's own distance distribution, named rather than assumed absent. |
| `preprocess.log` | The preprocessing pass's own log start to finish, with the settings it printed for itself and the 331 it wrote. |
| `ranged-walk.log` | The walk's own log: every archive opened, every member placed, every digest checked, start to finish. |
| `ranged-walk.py` | The walk itself, verbatim: the ranged reads, the stop rule, the per-file verification against the dataset's published digest, and the resume state. |
| `relicensed-excluded.jsonl` | The seventeen tracks that left the corpus because their artists have since chosen a more restrictive licence: the old licence, the new one, the URL each was read from, the UTC moment it was read, and the ruling that dropped them. |
| `run-timeline.json` | The run's own clock, read off the stamp files the runbook writes either side of each stage, with the durations those stamps imply and nothing else. |
| `s-per-step.md` | The three instruments that report seconds per optimiser step, all three numbers, the denominator each counts, and which one the lab's ledger marks authoritative — plus the trainer banner's fourth reading, named so it does not ambush anyone. |
| `score-sitting.py` | The join, as executable code: it reads the sealed key and the listener's answers, prints both files' digests, and derives every count the page states about the sitting. No tally in this kit is typed. |
| `sitting-scored.json` | The output of score-sitting.py, committed so a reader who does not run it still has the numbers: the scoring trials, the directional answers by arm, the sentinels, the adapter's four wins with the style each request asked for, and the subgroup for the four requests that ask for house. |
| `split-rule.py` | The holdout rule as an executable pure function — the one implementation the freeze and any dry run share, so the split cannot disagree with itself. |
| `split.json` | The split as frozen: the rule verbatim, the caption rule, the per-artist walk that chose the held-back side, the arithmetic, the registered faults, and the 331 training and 85 held-out track ids by name. |
| `style-excluded.jsonl` | The 141 tracks the style fence removed, one row each: the genre tags they carried, which out-tag removed them, the licence, the duration and the ruling. |
| `tag-words.json` | The de-camelisation table the caption template applies, 135 mappings across genre, instrument and mood. A tag absent from it is a hard error rather than a silent pass-through. |
| `train-events.tfevents` | The training run's TensorBoard event file, exactly as the trainer wrote it: the learning-rate and loss scalars every ten steps, and the per-layer gradient norms every fifty. train-lr-series.csv is read out of this file. |
| `train-launch.sh` | The launch line, verbatim — every flag the run was given, including the 100 warmup steps it asked for and did not get. |
| `train-lr-series.csv` | The learning-rate series the warmup figure was read from, with the loss logged beside it: 41 rows, one per logged step, each with its UTC stamp. Derived from train-events.tfevents; README.md gives the arithmetic that puts the peak at step 41. |
| `train-vram.log` | The card sampler's 60-second readings across the training window: memory used and free, utilisation, temperature, power draw against the 250 W cap, and host RAM — plus the line that says the sampler stopped when its subject did. |
| `train.log` | The trainer's own log start to finish: the configuration it printed for itself, the five per-epoch lines, the five checkpoint writes, and the Training Complete banner. Filesystem paths projected; the card named. |
| `walk-receipt.txt` | The walk's start and finish lines: what was already on disk, the rate it held itself to, and the counts it finished on. |

`index.json`, `provenance.json` and `index.html` are the kit's own manifest, its projection
record and the browsable listing generated from this directory. None of the three lists itself.
