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:
vadimwit
2026-07-10 09:28:52 +01:00
parent c78baf4943
commit ce24d5490f
2 changed files with 51 additions and 8 deletions
+4 -2
View File
@@ -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