fix(banks): enforce unique bank display names in-model + B3 review minors

This commit is contained in:
2026-07-25 01:29:47 -04:00
parent cbfc13c4e0
commit ccf65415c9
6 changed files with 169 additions and 22 deletions
+9 -4
View File
@@ -90,9 +90,12 @@ reasons:
So: `bank_book` is an ordered registry of `{ bank id, display name, ordinal,
BankIndex }`, pool seeded as bank-zero. Bank id is the stable key (minted GUID-style
on create); name and ordinal are mutable. `BankIndex` is untouched. This is the
defer-the-feature, design-the-seam principle: the seam is a container above the
tested core, not a modification of it.
on create); name and ordinal are mutable. Display names are **unique** — two banks
cannot share a name (compared trimmed + case-insensitively, so "Drums" and "drums"
are the same name), enforced in the model on create and rename; the pool's "Pool" is
reserved by the same rule. `BankIndex` is untouched. This is the defer-the-feature,
design-the-seam principle: the seam is a container above the tested core, not a
modification of it.
---
@@ -349,7 +352,9 @@ Mirrors the capture and Design View pillars exactly.
- Ordered bank registry: `{ bank id, display name, ordinal, BankIndex }`; pool
seeded with fixed id + fixed name.
- Create / rename / reorder / delete named banks; pool-privilege rules enforced
here (reject delete-pool, reject rename-pool, never zero banks).
here (reject delete-pool, reject rename-pool, never zero banks). Display names are
unique — create/rename reject a name already used by another bank (trimmed +
case-insensitive; the pool's "Pool" is protected).
- Active-bank id (get/set, defaults to pool); resolve the active bank's `BankIndex`.
- Move / copy a sample between banks — index-only, destination collapse-by-hash
observed, move removes the source entry.