Skip to content

spec: retaining full after separation is a MUST — FEP #57 (version-scoped) - #58

Merged
topkoa merged 2 commits into
mainfrom
fep/full-must
Jul 16, 2026
Merged

spec: retaining full after separation is a MUST — FEP #57 (version-scoped)#58
topkoa merged 2 commits into
mainfrom
fep/full-must

Conversation

@topkoa

@topkoa topkoa commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

Implements FEP #57, Option B (the maintainer's pick): a version-scoped MUST, landing as a MINOR.

The change

§5.3, one normative verb — a Writer that separates a mixdown SHOULD MUST retain the full entry (default: false).

Why SHOULD was wrong

  • The audio is unrecoverable. Summing the per-instrument stems does not reproduce the mixdown — the spec says so in the same paragraph. A pack that dropped full permanently lost the only exact copy of the song.
  • Consumers now depend on it. §5.3 already recommends a Reader play full at unity gain to skip the separation loss (the feedBack stem mixer does exactly this). On any pack that exercised the old SHOULD's permission to drop full, that optimization silently degrades to a lossy recombination. Reader conformant, writer conformant, user gets worse audio than the format could guarantee.
  • SHOULD is the right strength for best-effort matters. Retaining the one irreplaceable artifact of a lossy transform is the difference between a reversible operation and a destructive one.

Why this is MINOR, not MAJOR

A blanket MUST would make previously-conformant packs (separated, full dropped) retroactively non-conformant — the §4.2 MAJOR trigger. Option B avoids that by gating the obligation to the pack's own version: it binds a Writer producing a pack at feedpak_version ≥ 1.16.0. A pack authored earlier is judged by the SHOULD in force when it was written, so nothing is retroactively invalidated and no pack needs regeneration. This mirrors how the spec already version-gates the 1.6.0 .jsonc and 1.9.0 audio-format relaxations. Additive in effect → MINOR.

The obligation is scoped to separating a mixdown, so a pack of real recorded multitrack stems (never separated) isn't forced to bounce one.

Not schema-enforceable

"IF this pack was separated THEN it contains full" is a cross-field conditional (separation inferred from stem_separation), which a JSON Schema can't express cleanly. It stays a normative Writer MUST that a validator/linter can check out-of-band — noted in the FEP.

Verification

  • check_versions.py passes (version line stays 1.15.0 — it bumps to 1.16.0 at release, with the other unreleased change).
  • Both examples validate; the extended example separates and retains full, so it's conformant under the new rule.
  • 57 tests pass.

No schema or example change — this is a Writer-obligation tightening, not a structural addition.

Summary by CodeRabbit

  • Documentation
    • Clarified that separated packs created with Feedpak version 1.16.0 or newer must retain the original full mixdown alongside instrument stems.
    • Confirmed that earlier packs retain the previous recommendation, preserving backward compatibility.
    • Updated schema guidance to reflect the version-specific requirement.

…, version-scoped)

Separation is lossy and the mixdown is unrecoverable once dropped, and consumers now depend on the
mixdown being present: a Reader that plays `full` at unity gain to avoid the separation loss
(§5.3's own recommendation) silently degrades to a lossy stem recombination on any pack that used
the old SHOULD's permission to discard it. Reader followed the spec, writer followed the spec, the
user got worse audio than the format could guarantee. SHOULD is the wrong strength for "don't
destroy the one irreplaceable copy of the audio".

So it is a MUST — gated to the pack's own version (feedpak_version >= 1.16.0), which is what keeps
this a MINOR rather than a MAJOR: a pack authored under an earlier version that separated without
`full` is still judged by the SHOULD that was in force when it was written, so NOTHING becomes
retroactively non-conformant and no pack needs regeneration. This mirrors how the spec already
version-gates the 1.6.0 .jsonc and 1.9.0 audio-format relaxations.

Scoped to the act of SEPARATING: a pack of real recorded multitrack stems, never separated from a
single mix, is not forced to manufacture one.

One normative verb, no new keys, no structural change. Not schema-enforceable (it's a cross-field
conditional — "if separated, then full present"); it stays a Writer MUST a linter can check.

Version line stays 1.15.0 (bumps to 1.16.0 at release, alongside the other unreleased change).
check_versions passes, both examples validate, 57 tests pass.

Signed-off-by: topkoa <topkoa@gmail.com>
@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 873c41ff-929a-4d51-b17b-ed7f66ab3cb0

📥 Commits

Reviewing files that changed from the base of the PR and between 43b744c and e337d7e.

📒 Files selected for processing (2)
  • schemas/manifest.schema.json
  • spec/feedpak-v1.md

📝 Walkthrough

Walkthrough

The PR makes retaining the full mixdown mandatory for separation outputs from packs authored with feedpak_version 1.16.0 or newer, while preserving SHOULD guidance for older packs. The specification, manifest schema, and changelog are updated consistently.

Changes

Full stem retention

Layer / File(s) Summary
Version-scoped separation requirement
spec/feedpak-v1.md, schemas/manifest.schema.json, CHANGELOG.md
The full stem must be retained with default: false for qualifying separation outputs, while older packs retain the earlier SHOULD guidance and multitrack-origin packs are excluded.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Possibly related issues

Possibly related PRs

Suggested reviewers: byrongamatos

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main spec change: making full retention mandatory after separation with version scoping.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fep/full-must

Comment @coderabbitai help to get the list of available commands.

@topkoa
topkoa requested a review from Copilot July 15, 2026 13:34
@topkoa

topkoa commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the feedpak v1 specification to tighten the Writer obligation around stem separation by making retention of the full mixdown a version-scoped MUST (per FEP #57 Option B), and documents the compatibility story in the changelog.

Changes:

  • In §5.3, changes the separation guidance from SHOULD to MUST and adds rationale + version scoping notes.
  • Adds an Unreleased changelog entry describing the new requirement and its non-retroactive (version-gated) nature.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
spec/feedpak-v1.md Tightens the normative Writer requirement to retain full after separation, with added version-scoping explanation.
CHANGELOG.md Documents the new version-scoped MUST in Unreleased notes, including compatibility impact.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread spec/feedpak-v1.md Outdated
@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
putComment timed out

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@spec/feedpak-v1.md`:
- Around line 404-418: Update the schema description for the separating Writer’s
retention of the full stem to match the version-scoped requirement: state SHOULD
for feedpak_version before 1.16.0 and MUST for feedpak_version 1.16.0 or newer.
Keep the existing structural validation unchanged and update only the normative
guidance in the relevant manifest schema description.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2846bc76-e48b-4c9c-9fa1-600e151936d6

📥 Commits

Reviewing files that changed from the base of the PR and between 7eae010 and 43b744c.

📒 Files selected for processing (2)
  • CHANGELOG.md
  • spec/feedpak-v1.md

Comment thread spec/feedpak-v1.md Outdated
Both review findings were the same gap from different angles: the version
scoping lived a paragraph away from the normative verb, so anything that
read just the rule — a human scanning §5.3, a validator grepping for
"MUST retain", or a schema consumer reading stemEntry.id's description —
saw an unconditional MUST and would misjudge pre-1.16.0 packs.

The MUST sentence now carries its own condition ("MUST — for packs
declaring feedpak_version 1.16.0 or newer; SHOULD for packs declaring an
earlier version"), the following paragraph is reworded as the expansion of
that condition rather than a surprise reveal, and the schema's stemEntry
description states the same gate.

Signed-off-by: topkoa <topkoa@gmail.com>
@topkoa
topkoa merged commit f945d98 into main Jul 16, 2026
8 checks passed
@topkoa
topkoa deleted the fep/full-must branch July 16, 2026 05:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants