Record song playlist curriculum passes

This commit is contained in:
Meta Vens 2026-05-31 10:09:12 +01:00
commit ce317de571
3 changed files with 33 additions and 7 deletions

View file

@ -255,3 +255,4 @@
{"date":"2026-05-31","area":"song-source-corpus","lesson":"The song-snippet swarm source corpus now defaults one folder up to `D:\\Music\\Reinier\\Heyoka` and recursively discovers supported audio files, so agents sample across the Heyoka `Gate Code`, `Mandelbass`, and `Marklar` folders instead of only one album folder.","evidence":"tools/run-song-snippet-trial-swarm.ps1; local corpus discovery found eight supported Heyoka tracks under the parent folder."}
{"date":"2026-05-31","area":"song-curriculum-dataset-distillation","lesson":"The song trial loop trains the dataset, not a single patch. Each agent now gets paired song challenges and must write one patch per target; every patch, hypothesis, metric, challenge artifact, evaluator fact, and distillation document becomes curriculum evidence in CultCache/Qdrant. The post-pass distiller writes pruned `.cc` stores with reusable scene roles, transfer rules, failure patterns, kept trials, dropped noise, and aggregate metrics, and retrieval links those distillation chunks back to kept scored trial IDs so future zero-shot production agents can actually receive the distilled context.","evidence":"tools/run-song-snippet-trial-swarm.ps1; tools/IpaTrialWorker/Program.cs; src/AquaSynth.Core/IpaTrialResults.cs; state/scratch.md"}
{"date":"2026-05-31","area":"song-curriculum-paired-pass","lesson":"A paired song-curriculum pass completed with five agents, two targets per agent, one patch per target, ten scored trials, ten target evidence bundles, sixty Qdrant chunks, and a distilled `.cc` store. Metrics were all `pressure`: best log-mel cosine `0.502128`, mean `0.377955`, worst `0.27853`, mean audio score `0.339432`. Distillation kept all ten and identified clocked dust/hat texture plus rubber/sub bass as reusable roles, while preserving the shaped-noise owner requirement as a transfer rule rather than letting static white hiss back into the curriculum.","evidence":"artifacts/parity/song-snippet-swarms/20260531T074935298/song-trial-results.cc; artifacts/parity/song-snippet-swarms/20260531T074935298/pass-001/distillation-report.md; artifacts/parity/song-snippet-swarms/20260531T074935298/pass-001/vector-index-after.md; artifacts/parity/song-snippet-swarms/20260531T074935298/pass-001/semantic-search-after.md"}
{"date":"2026-05-31","area":"song-curriculum-playlists-and-invalid-candidates","lesson":"Song curriculum passes now publish a playable top-candidate playlist per pass and keep invalid agent syntax as negative evidence instead of aborting the swarm. A two-pass paired run produced pass-001 best cosine `0.386098` with 8 playable candidates and 2 `render-failed` syntax casualties, then pass-002 improved to best cosine `0.502435`, mean cosine `0.352907`, 10 playable candidates, and 8 pressure verdicts after reading distilled pass-1 evidence. Playlist reports filter to candidates with actual rendered WAVs and list skipped non-playable failures separately.","evidence":"tools/run-song-snippet-trial-swarm.ps1; tools/IpaTrialWorker/Program.cs; artifacts/parity/song-snippet-swarms/20260531T084455803/pass-001/top-scoring-candidates.m3u; artifacts/parity/song-snippet-swarms/20260531T084455803/pass-002/top-scoring-candidates.m3u; artifacts/parity/song-snippet-swarms/20260531T084455803/pass-002/distillation-report.md"}

View file

@ -1785,3 +1785,20 @@ Next likely slice:
dust/hat texture plus rubber/sub bass. That is useful but still not victory:
the scene-noise lesson remains that background/recording color must be a
shaped role owner, not static hiss.
2026-05-31 two-pass song playlist slice:
- Added per-pass playable playlist output to `run-song-snippet-trial-swarm.ps1`.
Each pass writes `top-scoring-candidates.m3u` and
`top-scoring-candidates.md`, ranked by log-mel cosine over candidates that
actually rendered a WAV.
- Scoring now keeps the swarm alive when an agent writes invalid Aqua syntax:
invalid parse/lowering/render preparation becomes a `render-failed` trial
with `candidate_invalid`/`render_failed` metrics instead of aborting the
curriculum pass. This was forced by an agent writing illegal `wave=pulse`.
- Completed a two-pass run at
`artifacts/parity/song-snippet-swarms/20260531T084455803`. Pass 1 produced
10 trials, 8 playable candidates, best cosine `0.386098`, playable mean
`0.220027`, and 2 render-failed syntax casualties. Pass 2 used distilled
pass-1 evidence, produced 10 playable candidates, best cosine `0.502435`,
mean cosine `0.352907`, and 8 pressure verdicts.

View file

@ -186,24 +186,24 @@ function Write-PassPlaylist {
}
}
$ranked = @($rows | Sort-Object -Property @{ Expression = "LogMelCosine"; Descending = $true }, @{ Expression = "AudioScore"; Descending = $true } | Select-Object -First $TopCount)
$playable = @($rows | Where-Object { Test-Path -LiteralPath $_.CandidateWav })
$ranked = @($playable | Sort-Object -Property @{ Expression = "LogMelCosine"; Descending = $true }, @{ Expression = "AudioScore"; Descending = $true } | Select-Object -First $TopCount)
$skipped = @($rows | Where-Object { -not (Test-Path -LiteralPath $_.CandidateWav) })
$playlistPath = Join-Path $PassDirectory "top-scoring-candidates.m3u"
$reportPath = Join-Path $PassDirectory "top-scoring-candidates.md"
$playlist = New-Object System.Collections.Generic.List[string]
$playlist.Add("#EXTM3U")
$report = New-Object System.Collections.Generic.List[string]
$report.Add("# Top Scoring Song Candidates")
$report.Add("# Top Scoring Playable Song Candidates")
$report.Add("")
$report.Add(('playlist: `{0}`' -f $playlistPath))
$report.Add("")
$rank = 1
foreach ($row in $ranked) {
if (Test-Path -LiteralPath $row.CandidateWav) {
$title = "#{0} {1} cosine={2:0.######} score={3:0.######} verdict={4}" -f $rank, $row.CandidateId, $row.LogMelCosine, $row.AudioScore, $row.Verdict
$playlist.Add("#EXTINF:-1,$title")
$playlist.Add($row.CandidateWav)
}
$title = "#{0} {1} cosine={2:0.######} score={3:0.######} verdict={4}" -f $rank, $row.CandidateId, $row.LogMelCosine, $row.AudioScore, $row.Verdict
$playlist.Add("#EXTINF:-1,$title")
$playlist.Add($row.CandidateWav)
$report.Add(('- {0}. `{1}` / verdict `{2}` / cosine `{3:0.######}` / score `{4:0.######}` / rms `{5:0.######}` / centroid `{6:0.######}`' -f $rank, $row.CandidateId, $row.Verdict, $row.LogMelCosine, $row.AudioScore, $row.RmsRatio, $row.CentroidRatio))
$report.Add((' - candidate: `{0}`' -f $row.CandidateWav))
@ -212,6 +212,14 @@ function Write-PassPlaylist {
$rank++
}
if ($skipped.Count -gt 0) {
$report.Add("")
$report.Add("## Skipped Non-Playable Candidates")
foreach ($row in $skipped | Sort-Object -Property @{ Expression = "LogMelCosine"; Descending = $true }, @{ Expression = "AudioScore"; Descending = $true }) {
$report.Add(('- `{0}` / verdict `{1}` / cosine `{2:0.######}` / score `{3:0.######}` / expected candidate: `{4}`' -f $row.CandidateId, $row.Verdict, $row.LogMelCosine, $row.AudioScore, $row.CandidateWav))
}
}
Set-Content -LiteralPath $playlistPath -Value $playlist
Set-Content -LiteralPath $reportPath -Value $report
}