diff --git a/COMPLETED.md b/COMPLETED.md index b5dd80f..83f42ff 100644 --- a/COMPLETED.md +++ b/COMPLETED.md @@ -114,7 +114,7 @@ folder still resolves the bank). - Storage: `SetProjExtState` / `GetProjExtState`, namespace `"reasampler"`, keys `bank_index` (serialized JSON) and `project_guid`; relative paths only in the persisted index. - Project identity: keyed off a **minted GUID** stored in ext state (REAPER exposes no native per-project GUID), not the raw `ReaProject*` — a recycled pointer cannot misread a project switch as a Save-As. - Save-As: **copy** semantics (Daniel's decision) — the `reasampler_bank/` folder is copied under the new `.rpp`; the old project's bank stays intact. Every ext-state write calls `MarkProjectDirty` so captures/GUID changes flush on the normal save. -- Known limitation (narrow, accepted): if a user does Save-As, closes the copy *without saving*, then reopens that copy to a *different* folder while the original is also open, identities can collide. Force-saving after Save-As would close the hole but was rejected as violating non-destructive. +- Save-As collision — fixed (DAW-verified): the project-identity classifier now keys off the **`ReaProject*` object identity** (`sameProjectObject` signal), not the stored GUID alone. A different project object (tab-switch or open) is always treated as a Load and never relocates a bank, so two Save-As-forked projects sharing a copied GUID on disk cannot cross-contaminate. A forked sibling that still shares the original GUID is re-GUID'd on detection so identities diverge. The hole is closed without force-saving — non-destructive preserved. ---