fix(app): progression commit-layer tuning — survive fills, replace on evidence (task L-31)
COMMIT_VOTES=2 (unchanged, ~one bar), REPLACE_VOTES=3 (a transient or
flapping detection can never displace a committed loop; section change
replaces one commit later), NULL_CLEAR=6 (post-L-30, nulls only start
~28 commits after the loop last played — traced exactly). Vote ref now
{committedKey, candidateKey, candidateCount}; agreement resets rivals.
Diff = one hunk in the progression useEffect; audio-contract grep
clean. Ride-along: theory.js docstring overclaim softened (L-30 gate
finding b), comment-only. Critic PASS (independent re-trace of all
five scenarios + 3 hostile traces; REPLACE_VOTES=3 proven load-bearing).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+4
-2
@@ -600,8 +600,10 @@ function canonicalize(pattern) {
|
||||
* section outscores a longer stale one. Requires ≥2 EXACT occurrences: an
|
||||
* edit-tolerant occurrence corroborates a loop but cannot establish it — a
|
||||
* loop means the sequence came back exactly, and a ghost slice that absorbs a
|
||||
* noise chord into itself occurs exactly only once by construction. Returns
|
||||
* the canonical (rotation-normalised) best pattern.
|
||||
* noise chord into itself rarely recurs exactly (only phase-locked corruption
|
||||
* of the same slot by the same chord can make one recur — and such data is
|
||||
* genuinely periodic at that longer length). Returns the canonical
|
||||
* (rotation-normalised) best pattern.
|
||||
*/
|
||||
export function detectRepeatingProgression(history) {
|
||||
if (!history || history.length < 6) return null
|
||||
|
||||
Reference in New Issue
Block a user