diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..1ceb6ac --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,17 @@ +## What + + + +## feedpak surface + + + +- [ ] This PR does **not** change how the app reads/writes feedpaks (manifest keys, pack files, folder layout) +- [ ] …or it does, and the spec change landed first via the [FEP process](https://github.com/got-feedback/feedpak-spec/blob/main/CONTRIBUTING.md) — FEP / spec PR: `got-feedback/feedpak-spec#___` — and `.feedpak-spec-ref` is bumped to the merged SHA in this PR + +## Checklist + +- [ ] `CHANGELOG.md` `[Unreleased]` updated (user-visible changes) +- [ ] Tests added/updated for new behaviour +- [ ] Commits are DCO signed off (`git commit -s`) diff --git a/CLAUDE.md b/CLAUDE.md index 9f6f973..c8486e3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -588,6 +588,20 @@ tab, key/scale annotations, etc.). Published as **feedpak**; this codebase still **sloppak** name internally — same on-disk format. [docs/sloppak-spec.md](docs/sloppak-spec.md) is a local pointer + code map. +**The spec is sacrosanct — read it BEFORE changing how this app reads or writes packs.** The +spec repo defines the format; this app merely implements it ("a change is not part of the format +until it lands here" — feedpak-spec/GOVERNANCE.md). Any new manifest key, file, or directory the +app touches must land in the spec **first**, via the +[FEP process](https://github.com/got-feedback/feedpak-spec/blob/main/CONTRIBUTING.md) (proposal +issue → one spec PR updating spec + schemas + example + changelog → then bump `.feedpak-spec-ref` +here in the same PR as your code). CI enforces this: the `feedpak-spec` job +([docs/feedpak-spec-gate.md](docs/feedpak-spec-gate.md)) fails any PR whose code touches a +manifest key the pinned spec doesn't declare, and there is **no in-repo bypass** — the exceptions +file is a closed grandfather list that only shrinks. If the format seems to be missing something +you need, that's a FEP conversation, not a workaround. (Cautionary tale: `original_audio`, #933 — +shipped without a spec entry, and third-party packers reverse-engineered a folder convention out +of a code comment.) + **Key code:** - `lib/sloppak.py` — format detection, zip/directory resolution, metadata extraction, song loading - `lib/sloppak_convert.py` — sloppak assembly pipeline, Demucs stem splitting