music/ACE_STEP_BED_WORKLIST.md
CANON SUBORDINATION — this document is PROPOSAL-TIER: it serves canon and never outranks it.
The canon: the CVD · the T1 foundation docs · the T0 registries (registries/) · the spine
(docs/spine/CH_*.md) · the region pages (_source/02_Tier_2_Region_Pages/). Authority order:docs/DOC_MAP.md§ 0.
Canon served (scanned from this document's own citations — widen it by hand where it is thin):
T0_SFX_Registry
READ THAT CANON FIRST — open it and derive from it before you build anything from this document.
If this document disagrees with canon, CANON WINS and this document is the defect — fix the
document, never the canon. Nothing here is applied until it is ratified into canon.
The machine form is build/audio/ace_step_bed_worklist.json, emitted by
harness/emit_music_cues.py. It is script-emitted rather than hand-typed so it cannot drift from
the cue table, and so a re-emit shrinks it automatically as real beds land.
Generation runs on a later GPU slot. This lane produced the worklist and the licence read, and
nothing was generated and nothing was downloaded.
The read was performed before any download and before any GPU hour, and it was performed as a real
question — a licence read is only worth recording if it could have come back negative. It did not.
The negative branch is named here rather than assumed away: had the read found a genuine triggered
prohibition, this half of the lane would have stopped and flagged.
The code licence. ace-step/ACE-Step-1.5 ships an unmodified MIT licence: header `MIT
License, copyright line Copyright (c) 2026 ACEStep`. There is **no clause restricting use of the
generated outputs**, no acceptable-use policy, and no field-of-use limit.
The output-use terms, checked separately — because a permissive code licence and a restrictive
output policy routinely ship together in audio models, and reading only the first is how a lane
convinces itself it is clear. The acestep-v15-xl-sft model card carries licence field mit,
states the model is *commercial-ready*, states that *generated music can be used for commercial
purposes*, and states that training used licensed, royalty-free/public-domain and synthetic
MIDI-to-audio data. No acceptable-use policy and no commercial restriction on generated audio
appears.
Verdict: no triggered prohibition. The bed half proceeds.
The one real risk is the repo-name collision, and it is pinned by URL rather than by name.
ace-step/ACE-Step — the v1 repo — is Apache-2.0 with a four-minute cap. ace-step/ACE-Step-1.5
is MIT with a 600-second cap and the XL series. Different repos, different licences, and anyone
searching "ACE-Step" lands on the Apache one. Any later row citing "ACE-Step" without a URL is
unverified by construction.
Both reads are recorded in docs/tooling_download_manifest.json as rows DL_0008 and DL_0009,
kind licence_read_pre_download — carrying no bytes and no destination, because nothing was pulled
and a read is recorded as a read rather than dressed up as a download. The commit revision is
recorded as owed and must be pinned at download time.
The permissive read above changes nothing about the material we already own.
The Sonniss bundle licence prohibits use as training data. No Sonniss file is ever a fine-tune
corpus, a LoRA corpus, or an audio conditioning input — for this generator or any other. **Direct
use only.**
The eleven landed Sonniss beds appear in the emitted worklist under landed_beds_excluded, which is
the point: they are listed there as the material a generated bed must not be derived from, so
the constraint travels on the artifact itself rather than living in a document somebody has to
remember to read.
The same wall stands on the cultural side and is older than the licence question: **no audio file of
a consecrated performance is ever a conditioning input, and no LoRA is ever trained on one.**
Reference-composition into a register is permitted; sampling a consecrated performance never is.
Every produced bed records its generating model and licence in its own row —
ACE-Step-1.5-XL-SFT (MIT). That is now a dispatch instruction rather than an assertion. Each
worklist item carries write_generation_licence_ref: "ACE-Step-1.5-XL-SFT (MIT)" and
write_to: "T0_SFX_Registry.generation_licence_ref on the produced bed's row", so the operator is
told the literal value and its destination column. The sentence used to state that every bed records
its licence while instructing nobody to write it, which is a promise with no actor.
And the constraint now travels onto the surface that reaches canon. The per-page §10 projection
block carries licence_class beside bed_source in its column set and restates the no-training rule
in its header, because that block is what gets written into a region page — the two artifacts a
generator operator reads were carrying the rule while the canon-facing one was not.
The cue table carries 216 rows. They split by bed_source into three lanes that never mix:
| bed_source | rows | who makes it |
|---|---|---|
sonniss_landed | 11 | already wired — 11 rows carrying 11 distinct beds, one row each, direct use, excluded from generation |
ace_step_worklist | 110 | the dispatch list below |
composer_in_loop | 95 | combat layers, stingers and motif statements — never generated |
The 110 are exactly the zone beds with no landed Sonniss bed behind them, plus every tension layer.
That split is not a preference, it is the lane rule: **generation owns beds, ambience and variation
volume; the identity people are meant to hum is the composer's.** A combat layer is a transformation
of an identity, so it is not on this list. A stinger is a motif statement in miniature, so it is not
either.
Each item carries what a dispatch needs and nothing it does not: cue_id, track_type,
adaptive_class (loop or adaptive), layer_role, the chapter and region page it belongs to, the
zone and site it plays in, the site's own terrain / ambient_threat / vril_density from the
spine, the chapter's emotional register, its register card pointer, and
may_use_sonniss_as_input: false on every single row.
A Tier-C cue whose region also carries a Tier-A payoff **must quote the parent head cell at least
once**, or the payoff has no soil to grow in.
That quotation is a **composer-authored stem laid over generated material, or fed as lego
conditioning — never a prompt.** The generator has no melodic conditioning that could honour a
prompt asking for a specific tune, so a prompt that names one produces something that merely sounds
adjacent, and a payoff built on an approximate quotation is a payoff that does not land. This is the
one place where the generated and composed lanes touch, and the direction of the handoff is fixed:
the composer's stem goes in, the generator does not come out with a melody.
or the image lane; the 2B-turbo tier is the windowed one.
loop-class item against its seam: a bed whose loop boundaryis audible is a bed that gets noticed, and a bed that gets noticed has stopped being a bed.
python harness/emit_music_cues.py after any bed lands. The worklist shrinks by construction, because a bed that lands in T0_SFX_Registry with an asset path is a
sonniss_landed or produced row on the next emit and drops off this list.