One canonical store with derived selectors
Not:
• ad hoc local state in each panel
• copied arrays
• parallel models for timeline vs grid vs layouts
Instead:
• one canonical project store
• normalized entities
• selectors / derived view models per workspace
Example mental model
Canonical entities
• sounds
• events
• sources
• layouts
• constraints
• sections
• performance mappings
Derived selectors
• composeTimelineView
• optimizeGridView
• candidateLayoutCards
• practicePlaybackView
• soundsBrowserItems
That way:
• every surface is reading from the same truth
• different modes can still present different derived views
• renames and assignments propagate everywhere
⸻
Product rule I would enforce
Nothing should store duplicated display data if it can reference an entity ID
For example:
Bad:
• timeline row stores "Hat 1"
• grid pad stores "Hat 1"
• layout card stores "Hat 1"
Better:
• all of them store soundId: "snd_hat1"
• the display name comes from canonical sound state
That one discipline will save you a lot of pain.
One canonical store with derived selectors
Not:
• ad hoc local state in each panel
• copied arrays
• parallel models for timeline vs grid vs layouts
Instead:
• one canonical project store
• normalized entities
• selectors / derived view models per workspace
Example mental model
Canonical entities
• sounds
• events
• sources
• layouts
• constraints
• sections
• performance mappings
Derived selectors
• composeTimelineView
• optimizeGridView
• candidateLayoutCards
• practicePlaybackView
• soundsBrowserItems
That way:
• every surface is reading from the same truth
• different modes can still present different derived views
• renames and assignments propagate everywhere
⸻
Product rule I would enforce
Nothing should store duplicated display data if it can reference an entity ID
For example:
Bad:
• timeline row stores "Hat 1"
• grid pad stores "Hat 1"
• layout card stores "Hat 1"
Better:
• all of them store soundId: "snd_hat1"
• the display name comes from canonical sound state
That one discipline will save you a lot of pain.