Follow-up to #933, which made core read the full mix from the RESERVED full stem (feedpak §5.3, spec 1.15.0 / feedpak-spec#53) instead of the original_audio: key this repo invented.
#933 could not delete the key outright: every pack in the wild carries it. A sample of the local library was 40/40 original_audio: original/full.ogg, so dropping the read would have silently taken the pristine full mix away from the entire library at once. It therefore left two pieces of scaffolding behind, and this issue is the demolition.
What is still standing
lib/sloppak.py — _legacy_full_mix(), the deprecated read of manifest.get("original_audio"). It logs a one-line deprecation notice naming the migration tool. Its literal key string is deliberate: tools/check_spec_conformance.py AST-scans for manifest.get("<literal>"), so hoisting it into a constant would hide the read from the gate and let the grandfather entry go stale (the comment on the function says so).
- The
song_info WS aliases original_audio_url / has_original_audio, which now carry the same values as full_mix_url / has_full_mix. They exist so a stems plugin built against the old frame keeps working across one release.
- The
original_audio entry in feedpak-spec-exceptions.yml. It is the last one in the file; deleting it empties the grandfather list.
- The deprecation tests in
tests/test_sloppak_full_mix_load.py (the ones under the "DEPRECATED ... delete with the key" heading) and tests/test_migrate_full_mix_stem.py in its entirety.
Preconditions
Then
When this closes, no manifest key core touches is undeclared by the spec, and the grandfather list is empty.
Follow-up to #933, which made core read the full mix from the RESERVED
fullstem (feedpak §5.3, spec 1.15.0 / feedpak-spec#53) instead of theoriginal_audio:key this repo invented.#933 could not delete the key outright: every pack in the wild carries it. A sample of the local library was 40/40
original_audio: original/full.ogg, so dropping the read would have silently taken the pristine full mix away from the entire library at once. It therefore left two pieces of scaffolding behind, and this issue is the demolition.What is still standing
lib/sloppak.py—_legacy_full_mix(), the deprecated read ofmanifest.get("original_audio"). It logs a one-line deprecation notice naming the migration tool. Its literal key string is deliberate:tools/check_spec_conformance.pyAST-scans formanifest.get("<literal>"), so hoisting it into a constant would hide the read from the gate and let the grandfather entry go stale (the comment on the function says so).song_infoWS aliasesoriginal_audio_url/has_original_audio, which now carry the same values asfull_mix_url/has_full_mix. They exist so a stems plugin built against the old frame keeps working across one release.original_audioentry infeedpak-spec-exceptions.yml. It is the last one in the file; deleting it empties the grandfather list.tests/test_sloppak_full_mix_load.py(the ones under the "DEPRECATED ... delete with the key" heading) andtests/test_migrate_full_mix_stem.pyin its entirety.Preconditions
tools/migrate_full_mix_stem.pyhas been run over the pack library, and--verifyreportsokfor every pack.full_mix_url(got-feedback/feedback-plugin-stems), and a desktop build carrying it has gone out — the aliases exist for exactly the window where a user has new core and an older bundled plugin.original_audio— the full mix is a stem, and the spec already says so #933: it emits{id: full, file: stems/full.ogg, default: off}).Then
_legacy_full_mix()and its call site;LoadedSloppak.full_mixcomes only from thefullstem.original_audioentry fromfeedpak-spec-exceptions.yml. The gate fails if the entry goes stale, so this cannot be quietly forgotten — that is by design.tools/migrate_full_mix_stem.pyitself.When this closes, no manifest key core touches is undeclared by the spec, and the grandfather list is empty.