{
  "schema": "s2s-bench-v1",
  "exhibit": "chopin-in-five-minutes",
  "exhibit_title": "Teaching a Music Model Chopin in Five Minutes",
  "exhibit_url": "https://research.strata2signal.com/chopin-in-five-minutes/index.html",
  "licence": "CC BY 4.0",
  "attribution": "strata→signal research, research.strata2signal.com",
  "contact": "hello@strata2signal.com",
  "kind": "data-kit-provenance",
  "dataset": "ace-composers-2026-08 / article-chopin",
  "generated_utc": "2026-09-01T00:00:00Z",
  "what_this_is": "One adapter trained on one afternoon, the five clips it produced, and exactly what happened to each file on the way to this page. Artifact names and role names only — never a path, never a host.",
  "run_window_utc": {
    "trained_utc": "2026-08-29T19:54:05Z - 2026-08-29T19:58:56Z",
    "rendered_utc": "2026-08-29 and 2026-08-30",
    "rights_read_utc": "2026-08-27T18:55Z",
    "corpus_downloaded_utc": "2026-08-29T15:10:42Z - 2026-08-29T15:12:18Z"
  },
  "sanitisation_rules": {
    "path-to-role": "an absolute filesystem path becomes the role-relative path it names (music/checkpoints/..., adapters/...). Fired 17 times in train.log and once in adapter-config.json; those are the only two files it touched.",
    "box-name-to-role": "a machine name becomes what it did in this run. It fired ZERO times in the published files: the two logs name paths, not hosts. It is declared because the source material it was drawn from does name hosts, and a rule that was ready but unfired is worth saying so.",
    "page-stamp-spelled-out": "in rights-chain.md the campaign FAQ's own 'last updated' stamp is written as 'Friday, September 6, 1:59am (US Eastern)' rather than with the three-letter zone abbreviation the page uses, because this site publishes no zone abbreviations. The LICENCE QUOTE ITSELF IS VERBATIM and untouched; only that page-state stamp is spelled out, and the README says so."
  },
  "deliberately_unaltered": {
    "the log's bare timestamps": "the training box runs Etc/UTC and its log writes stamps with no zone marker. They are left exactly as written, and the README states they are UTC, because editing a timestamp inside a verbatim log is worse than explaining it.",
    "every measured value": "every loss, duration, byte count, parameter count and checksum is as the instrument wrote it. No epoch was dropped, smoothed or reordered — including epoch 9, whose loss goes UP (0.6295 -> 0.6598) before epoch 10 comes back down, which the article names in its own prose."
  },
  "omitted": {
    "the harness": "the trainer and the render service are not published; this kit ships receipts. The trainer is named and linked in the article's colophon.",
    "the adapter weights": "the 88 MB adapter file is not published here.",
    "the held-back five": "the list of which five recordings were held out is in the training dataset's own record and is not in this kit. Named as absent rather than approximated — see the README."
  },
  "open_caveats": {
    "no listening gate": "no blinded listening test has been run on these clips, so nothing here supports a claim that any clip sounds like Chopin. The article states this twice and names building that test as a later piece.",
    "unverified performer attribution": "CC0 imposes no attribution obligation and nothing depends on it, but per-track performer credit for the corpus is unverified and rights-chain.md says so.",
    "tempo and key adherence": "the request pins a bpm and a key; whether the audio honoured them was not checked. The article lists this among what it did not measure."
  },
  "what_was_not_touched": "Every number published here is as recorded. The five served clips are the exact rendered bytes — no transcode, no normalisation, no re-cut — which is why the fingerprints printed on the page are checkable against the files the page serves.",
  "self_reference": "index.json, provenance.json and index.html are not listed among the files they describe: a file cannot carry its own sha256. index.json carries provenance.json's.",
  "file_count": 10,
  "files": [
    {
      "file": "README.md",
      "role": "What is in the kit, what was projected out of it and why, the 24-versus-19 corpus note, and how to check every fingerprint yourself.",
      "media_type": "text/markdown",
      "bytes": 4986,
      "sha256": "7ca70dd44a5774d5b42a55948746fed412b94544fe691238bea6b8b45d68781d",
      "stripped": [],
      "strip_counts": {},
      "identical_to_original": true
    },
    {
      "file": "adapter-config.json",
      "role": "The finished adapter's PEFT configuration as saved beside the weights — the independent record of what the log describes. One filesystem path projected.",
      "media_type": "application/json",
      "bytes": 1027,
      "sha256": "6012741fb89ccec6dc5390267948c2839bab54471377ff33e55f01b52dfc1144",
      "stripped": [
        "absolute filesystem paths -> role names"
      ],
      "strip_counts": {
        "path-to-role": 1
      },
      "identical_to_original": false
    },
    {
      "file": "clips.json",
      "role": "The five audio files the page plays: full sha256, byte count and adapter strength for each, plus the map from every player on the page to the file behind it. Six players, five files — the baseline carries two captions because the page plays it twice, as Listen 1 and as the 0% rung.",
      "media_type": "application/json",
      "bytes": 4921,
      "sha256": "268eda69a2aa35d5029d4f6ca28cc34434c1fc86bd3e5271a61e09ccf7cbf348",
      "stripped": [],
      "strip_counts": {},
      "identical_to_original": true
    },
    {
      "file": "corpus-manifest.tsv",
      "role": "Every recording acquired for this corpus: sha256, filename and the source URL it was fetched from, 24 rows. The run trained on 19 of them; the README says why the two numbers differ and names the held-back list as absent rather than approximating it.",
      "media_type": "text/tab-separated-values",
      "bytes": 4445,
      "sha256": "17d90f880d3916c6f84b4d1ea012b86f98085d3bbf6929d32862e49386b66eef",
      "stripped": [],
      "strip_counts": {},
      "identical_to_original": true
    },
    {
      "file": "render-request.json",
      "role": "The render request VERBATIM — the exact JSON body submitted for every one of the five clips. There is no per-clip variant: the adapter's scale is set through the service's /v1/lora/scale endpoint and this payload is submitted unchanged, which is what makes the dial the only thing that moved.",
      "media_type": "application/json",
      "bytes": 522,
      "sha256": "3d00880b9ed7e1704854da6ca3f754988bb7427f9bf13c749fafdf5fcf875023",
      "stripped": [],
      "strip_counts": {},
      "identical_to_original": true
    },
    {
      "file": "rights-chain.md",
      "role": "How the recordings were established as CC0, read at the source: the composition layer, the commissioning project's own FAQ answer quoted verbatim, the Wayback URL it was read from with its read timestamp, why the live site could not be read, and the standing rule the read produced (an aggregator's licence facet is not a licence).",
      "media_type": "text/markdown",
      "bytes": 3591,
      "sha256": "643da8cbeeec1582767068a78d7e391cec58ccc7769566e7d73a1450701ab007",
      "stripped": [],
      "strip_counts": {},
      "identical_to_original": true
    },
    {
      "file": "train.log",
      "role": "The training run's own log, start to finish: the configuration it printed for itself (rank 64, alpha 128, dropout 0.1 on q/k/v/o projections; batch 1 x 4 accumulation; lr 1e-4; seed 42; bf16; ten epochs), the ten per-epoch loss lines, and the summary carrying 4m 49s and a 5.7 GiB peak. Filesystem paths projected to role names; every number as the instrument wrote it.",
      "media_type": "text/plain",
      "bytes": 8510,
      "sha256": "dad3839cec953e8c36a199f2a8f9afee7b4d37c36c6968bc887217170d715863",
      "stripped": [
        "absolute filesystem paths -> role names"
      ],
      "strip_counts": {
        "path-to-role": 17
      },
      "identical_to_original": false
    }
  ]
}
