docs: retire the bake mono collapse and FX-GUID keying entries, file what they left behind

Both landed with accepted consequences rather than avoided ones, so COMPLETED
carries the identity move and the offline-FX degrade. Two line-ceiling entries
and the DAW-unverified GUID stability are now tracked.
This commit is contained in:
2026-08-02 20:10:01 -04:00
parent 430faff230
commit bd7d6857e5
2 changed files with 113 additions and 52 deletions
+47
View File
@@ -1135,3 +1135,50 @@ exercises "the manifest parses, the layout computes, the exact-size proof fails"
the payload boundary instead. No production module was touched — the wave adds test-tree
files, the corpus, its README, the verification script, and one path variable in the root
`CMakeLists.txt`.
### Resample-bake mono collapse — closes the `docs/TODO.md` deferral (ad-hoc)
`prepareLanding` (`src/shell/capture/bake_landing.cpp`) now applies the shared lossless
mono collapse to the staged buffer — via a new thin wrapper `applyMonoCollapse` in
`src/core/capture/wav_codec.cpp` — before the hash and the channel-count read, so the
hash, the entry, and the written file all come from one collapsed buffer. A dead-center
(dual-mono) bake now lands as a 1-channel file exactly as a dead-center offline capture
already does; a true-stereo bake is byte-identical to before, asserted on bytes and on
hash.
**The blocker this deferral originally cited has cleared.** `bake_land.cpp` was
another team's freshly-landed remediation surface at the time; that remediation has
since landed, which is what made taking this item this wave safe.
**Consequences accepted, not avoided:**
- A dead-center bake's **content identity moves** — the hash now covers the collapsed
bytes, so a dual-mono bake will not hash-dedup against a stereo twin already in the
bank, and its derived file name changes. This was already documented as accepted for
the other capture paths in `src/core/capture/CLAUDE.md`; the bake path now inherits
it rather than being an exception.
- `BakeOutcome::channelCount` now answers 1 for a dead-center bake, which flips the
instrument's channel-mode auto-default to Mono. Safe: the audio is identical either
way when the source was dead-center, and the consuming site was already written
anticipating that value.
### Design View FX-GUID keying for `restoreFxOffline` — closes the `docs/TODO.md` deferral (ad-hoc)
`restoreFxOffline` (`src/shell/view/view.cpp`) now returns each parked track's per-FX
offline state to the plugin it was captured from, keyed by the FX's own GUID
(`TrackFX_GetFXGUID`) rather than its slot index. New pure module
`src/core/view/fx_offline.{h,cpp}` holds the keying types (`FxKeying`: Identity/Slot),
the per-FX snapshot/plan types, and `resolveFxRestore`, which matches each captured
state against the chain as it stands at restore time. `view_state` gained a v2 schema
that writes the identity array beside the v1 slot array, so an older build reading a
v2 blob keeps the behaviour it had rather than losing every FX state.
**Consequences accepted, not avoided:**
- A dropped FX (one whose captured identity is no longer live in the chain at restore
time) is left **offline**, as park left it, with its snapshot already cleared — the
console report names the drop and the recovery.
- The console report uses the quiet `!SHOW:` form on every path, so it never
force-opens the console window.
**Left open, filed to `docs/TODO.md`:** FX-GUID stability itself — whether
`TrackFX_GetFXGUID` survives a chain reorder while parked — is unverified in the DAW
(SWS issue #802 names a specific way it might not hold).