Add forever-stable "view_state" key under the "reasampler" namespace.
saveToActiveProject additionally serializes the ViewModeModel;
loadFromProject restores it on every load path, defaulting on an
absent/malformed key. Model state only — no visibility apply (D4).
Reads I_FOLDERDEPTH into a FolderTree (pure view_tree helper, unit-tested),
snapshots to-be-parked tracks before parking, runs the D1 planner, and applies
park/restore flag + per-FX-offline writes under an undo block. Master and
mute/solo untouched; acts only on tagged tracks.
Move completed M4 (persist) from PLAN.md to COMPLETED.md with a decisions
note (GUID identity, Save-As copy, MarkProjectDirty, known limitation);
update CLAUDE.md repo-identity to M0-M4 complete.
After capture, saveToActiveProject wrote ext state but left the project
clean, so Ctrl+S was a no-op and the bank was silently lost on close.
Also flushes the Save-As re-GUID on the normal save flow.
Serialize BankIndex to project ext state ('reasampler'), reload on project
load, resolve paths project-relative. Save-As copies the bank to the new .rpp;
identity keyed off a minted GUID (not the recycled ReaProject*) so project
switches don't clobber banks. Pure classifyProjectTransition tested.
Move completed M3 (offline capture spike) from PLAN.md to COMPLETED.md; close
the render-command and bank-format open questions; add capture_paths_tests to
the CLAUDE.md targets table and note M8 is dialog-free.
GetProjectPathEx returns REAPER's recording path (never empty); EnumProjects
returns the .rpp path (empty when unsaved) — the correct signal. Bank now
derives from the .rpp parent so it sits alongside the project file. Render
progress window documented as inherent to REAPER offline render.
RENDER_FORMAT now uses the base64 float-WAV config (raw bytes were rejected
into a 16-bit/44.1 fallback); RENDER_SRATE pinned to the project rate.
Unsaved projects prompt Save then refuse if cancelled — no default-location
fallback. Harden deriveBankPaths against empty projectDir.
ICaptureBackend/CaptureRequest seam + OfflineRenderBackend driving snapshotted
RENDER_* with dither/normalize forced off for bit-identical output, RenderFailed
via filesystem check, and a pure capture_paths lib with tests. Spike action registered.
Move completed M2 (peaks module) from PLAN.md to COMPLETED.md; add peaks_tests
to the CLAUDE.md targets table and update the pure-core status to M0-M2 done.
New STATIC lib + peaks_tests (CTest), mirroring bank_model. Float samples,
per-channel (no fold); exact integer bin spans handle remainder, short
buffers, and degenerate inputs with no OOB. Bin-span math guarded against
size_t overflow for pathological binCount.
Pure dependency-free core with self-contained JSON writer/parser. Absolute
paths (incl. drive-relative) rejected at the add boundary; \uXXXX decoded to
UTF-8 with surrogate pairs; malformed input returns nullopt.
Retarget README to ReaSampler and current build targets; reconcile
CLAUDE.md repo-identity + targets table to reaper_reasampler; archive
Milestone 0 from PLAN.md into new COMPLETED.md.
PLAN.md: living 12-milestone roadmap from CONTEXT.md's build order,
each with a verify gate and its precision invariant; open questions
carried forward. TODO.md: near-term M0-M2 slice as ordered tasks.