danceflow-stemlab 1.4.2__tar.gz → 1.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- danceflow_stemlab-1.5.0/.github/dancerudiments-recording-ref +1 -0
- danceflow_stemlab-1.5.0/.github/workflows/arcadians-demo.yml +210 -0
- danceflow_stemlab-1.5.0/.github/workflows/arcadians-pages.yml +110 -0
- danceflow_stemlab-1.5.0/.github/workflows/arcadians-timeline.yml +94 -0
- danceflow_stemlab-1.5.0/.github/workflows/recordings.yml +72 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/.github/workflows/release.yml +73 -1
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/AGENTS.md +10 -0
- danceflow_stemlab-1.5.0/MANIFEST.in +61 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/PKG-INFO +264 -2
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/README.md +261 -0
- danceflow_stemlab-1.5.0/docs/arcadians-release-demo.md +281 -0
- danceflow_stemlab-1.5.0/docs/arcadians-timeline.md +211 -0
- danceflow_stemlab-1.5.0/docs/beat-inputs.md +58 -0
- danceflow_stemlab-1.5.0/docs/recording-pairs.md +158 -0
- danceflow_stemlab-1.5.0/docs/released-viewers.md +213 -0
- danceflow_stemlab-1.5.0/docs/rudiment-recordings.md +248 -0
- danceflow_stemlab-1.5.0/docs/screenshots/recording-comparison.png +0 -0
- danceflow_stemlab-1.5.0/docs/viewer-controls.md +100 -0
- danceflow_stemlab-1.5.0/examples/recordings/generate_demo.py +68 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/mcp-registry/server.json +2 -2
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/.codex-plugin/plugin.json +1 -1
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/plugin.json +1 -1
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/pyproject.toml +2 -2
- danceflow_stemlab-1.5.0/scripts/Release-DanceFlow.ps1 +57 -0
- danceflow_stemlab-1.5.0/scripts/arcadians_http.py +140 -0
- danceflow_stemlab-1.5.0/scripts/assemble_arcadians_site.py +89 -0
- danceflow_stemlab-1.5.0/scripts/build_arcadians_demo.py +339 -0
- danceflow_stemlab-1.5.0/scripts/build_arcadians_pair_demos.py +302 -0
- danceflow_stemlab-1.5.0/scripts/build_arcadians_timeline.py +221 -0
- danceflow_stemlab-1.5.0/scripts/check_arcadians_audio.py +361 -0
- danceflow_stemlab-1.5.0/scripts/check_arcadians_timeline.py +223 -0
- danceflow_stemlab-1.5.0/scripts/check_semantic_runtime.py +80 -0
- danceflow_stemlab-1.5.0/scripts/check_torchaudio_decode.py +97 -0
- danceflow_stemlab-1.5.0/scripts/check_viewer_build.py +8 -0
- danceflow_stemlab-1.5.0/scripts/configure_viewer_build.py +12 -0
- danceflow_stemlab-1.5.0/scripts/publish_arcadians_pages.py +275 -0
- danceflow_stemlab-1.5.0/scripts/release_suite.py +525 -0
- danceflow_stemlab-1.5.0/scripts/timeline_display_checks.py +141 -0
- danceflow_stemlab-1.5.0/scripts/viewer_releases.py +314 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/PKG-INFO +264 -2
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/SOURCES.txt +50 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/requires.txt +2 -1
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/__init__.py +1 -1
- danceflow_stemlab-1.5.0/src/stemlab/analysis/rudiment_batch.py +252 -0
- danceflow_stemlab-1.5.0/src/stemlab/analysis/rudiment_pairs.py +276 -0
- danceflow_stemlab-1.5.0/src/stemlab/analysis/rudiment_recordings.py +420 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/beattransformer.py +2 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/common.py +13 -5
- danceflow_stemlab-1.5.0/src/stemlab/beats/inputs.py +85 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/cli.py +17 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/pipeline.py +52 -15
- danceflow_stemlab-1.5.0/src/stemlab/recording_cli.py +248 -0
- danceflow_stemlab-1.5.0/src/stemlab/static_timeline.py +332 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/app.js +5022 -4836
- danceflow_stemlab-1.5.0/src/stemlab/web/static-timeline.js +34 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/timeline.css +1 -1
- danceflow_stemlab-1.5.0/tests/test_arcadians_http.py +210 -0
- danceflow_stemlab-1.5.0/tests/test_arcadians_pages_publish.py +222 -0
- danceflow_stemlab-1.5.0/tests/test_arcadians_pair_demos.py +225 -0
- danceflow_stemlab-1.5.0/tests/test_arcadians_release_demo.py +197 -0
- danceflow_stemlab-1.5.0/tests/test_arcadians_runtime.py +314 -0
- danceflow_stemlab-1.5.0/tests/test_arcadians_timeline.py +325 -0
- danceflow_stemlab-1.5.0/tests/test_beat_inputs.py +160 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_release.py +2 -1
- danceflow_stemlab-1.5.0/tests/test_release_suite.py +385 -0
- danceflow_stemlab-1.5.0/tests/test_rudiment_pairs.py +238 -0
- danceflow_stemlab-1.5.0/tests/test_rudiment_recordings.py +261 -0
- danceflow_stemlab-1.5.0/tests/test_static_timeline.py +231 -0
- danceflow_stemlab-1.5.0/tests/test_viewer_controls.py +35 -0
- danceflow_stemlab-1.5.0/tests/test_viewer_releases.py +242 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_web_frontend.py +5 -1
- danceflow_stemlab-1.4.2/MANIFEST.in +0 -24
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/.agents/plugins/marketplace.json +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/.github/workflows/codex-plugin.yml +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/CONTRIBUTING.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/LICENSE +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/branding/README.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/branding/logo-monochrome.svg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/branding/logo.png +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/branding/logo.svg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/codex-plugin.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/codex-publishing.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/cue-alignment.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/evidence-models.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/midi.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/.mcp.json +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/README.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/branding/logo-monochrome.svg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/branding/logo.png +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/branding/logo.svg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/mcp.json +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/skills/stemlab/SKILL.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/skills/stemlab/references/tools.md +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/benchmark_evidence_corpus.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/build_codex_plugin.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/capture_loop_workflow.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/check_codex_timeline.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/loop_demo.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/prepare_codex_marketplace.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/publish_mcp_registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/smoke_midi.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/setup.cfg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/dependency_links.txt +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/entry_points.txt +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/top_level.txt +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/__main__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/evidence/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/evidence/adapters.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/evidence/registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/evidence/runner.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/evidence/worker.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/harmony.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/loops.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/lyrics.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/adapters.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/artifacts.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/runner.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/worker.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/phrase_loops.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/rhythm.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/rudiment_matches.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/runner.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/semantic_audio.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/semantic_text.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/song_map.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/sonic.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/structure.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/tempo_regimes.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/transcription.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/audio.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/base.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/beatnet.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/beatthis.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/bootstrap.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/branding.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/canonical.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/clip_cli.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/clip_match.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/__main__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/bridge.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/jobs.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/paths.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/server.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/tasks.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/timeline.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/worker.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/cue_cli.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/cues.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/lyric_lrc.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/manifest.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/models.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/__init__.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/base.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/bsroformer.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/common.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/demucs.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/openunmix.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/scnet.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/server.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/sonic_visualiser.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/spectrogram.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/spectrogram_repair.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/speech.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/types.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/util.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/vamp.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/vamp_runtime.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/arcadians-cover.jpg +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/arcadians-reference.json +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/index.html +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/style.css +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/webui.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/word_alignment.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_analysis_registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_arcadians_fixture.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_arcadians_rudiments.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_audio_normalization.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_bar_phase.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_beat_consensus.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_beat_this_bootstrap.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_beatnet_bootstrap.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_beatnet_compat.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_branding.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_bsroformer_adapter.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_canonical.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_canonical_extended.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_clip_match.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_bridge.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_jobs.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_package.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_protocol.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_timeline.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_cue_integration.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_cues.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_deep_harmony.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_deep_lyrics.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_deep_sonic_rhythm.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_distribution_identity.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_docker_contract.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_evidence_models.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_loop_integration.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_loops.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_lyric_lrc.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_manifest.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_midi_adapters.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_midi_extraction.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_midi_integration.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_midi_registry.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_models.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_phrase_loops.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_repository_hygiene.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_rudiment_matches.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_server.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_song_map.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_sonic_visualiser.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_sonic_visualiser_workspace.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_spectrogram.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_speech_repetition.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_vamp.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_vamp_runtime.py +0 -0
- {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_word_alignment.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
b89d1b80fcd8a8d8e02394ec718b6f4debd97b94
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
name: Arcadians release demo
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_call:
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
pull_request:
|
|
7
|
+
paths:
|
|
8
|
+
- '.github/workflows/arcadians-demo.yml'
|
|
9
|
+
- '.github/workflows/release.yml'
|
|
10
|
+
- '.github/dancerudiments-recording-ref'
|
|
11
|
+
- 'scripts/build_arcadians_demo.py'
|
|
12
|
+
- 'scripts/check_arcadians_audio.py'
|
|
13
|
+
- 'scripts/arcadians_http.py'
|
|
14
|
+
- '.github/workflows/arcadians-timeline.yml'
|
|
15
|
+
- 'scripts/build_arcadians_timeline.py'
|
|
16
|
+
- 'scripts/build_arcadians_pair_demos.py'
|
|
17
|
+
- 'scripts/check_viewer_build.py'
|
|
18
|
+
- 'scripts/timeline_display_checks.py'
|
|
19
|
+
- 'web-client/**'
|
|
20
|
+
- '.github/viewer-*.json'
|
|
21
|
+
- 'scripts/viewer_releases.py'
|
|
22
|
+
- 'package*.json'
|
|
23
|
+
- 'src/stemlab/analysis/rudiment_pairs.py'
|
|
24
|
+
- 'src/stemlab/recording_cli.py'
|
|
25
|
+
- 'tests/test_rudiment_pairs.py'
|
|
26
|
+
- 'tests/test_arcadians_pair_demos.py'
|
|
27
|
+
- 'scripts/check_torchaudio_decode.py'
|
|
28
|
+
- 'scripts/check_semantic_runtime.py'
|
|
29
|
+
- 'tests/test_arcadians_runtime.py'
|
|
30
|
+
- 'docker/**'
|
|
31
|
+
- 'scripts/check_arcadians_timeline.py'
|
|
32
|
+
- 'scripts/assemble_arcadians_site.py'
|
|
33
|
+
- 'src/stemlab/static_timeline.py'
|
|
34
|
+
- 'src/stemlab/web/**'
|
|
35
|
+
- 'tests/test_static_timeline.py'
|
|
36
|
+
- 'tests/test_arcadians_timeline.py'
|
|
37
|
+
- 'tests/test_arcadians_http.py'
|
|
38
|
+
- 'src/stemlab/analysis/rudiment_recordings.py'
|
|
39
|
+
- 'src/stemlab/analysis/rudiment_batch.py'
|
|
40
|
+
- 'src/stemlab/beats/**'
|
|
41
|
+
- 'src/stemlab/pipeline.py'
|
|
42
|
+
- 'tests/test_beat_inputs.py'
|
|
43
|
+
- 'tests/test_arcadians_release_demo.py'
|
|
44
|
+
- 'examples/arcadians/**'
|
|
45
|
+
|
|
46
|
+
permissions:
|
|
47
|
+
contents: read
|
|
48
|
+
|
|
49
|
+
jobs:
|
|
50
|
+
static-regressions:
|
|
51
|
+
name: Check timeline export and combined publication contracts
|
|
52
|
+
runs-on: ubuntu-24.04
|
|
53
|
+
timeout-minutes: 15
|
|
54
|
+
steps:
|
|
55
|
+
- uses: actions/checkout@v7
|
|
56
|
+
with:
|
|
57
|
+
persist-credentials: false
|
|
58
|
+
- uses: actions/setup-python@v7
|
|
59
|
+
with:
|
|
60
|
+
python-version: '3.11'
|
|
61
|
+
- name: Install lightweight test dependencies, without model downloads
|
|
62
|
+
run: |
|
|
63
|
+
python -m pip install numpy scipy soundfile matplotlib fastapi rich 'typer>=0.12' platformdirs pytest pyyaml ruff
|
|
64
|
+
python -m pip install --no-deps -e .
|
|
65
|
+
- name: Require latest stable released viewers and rebuilt controls before inference
|
|
66
|
+
env:
|
|
67
|
+
GH_TOKEN: ${{ github.token }}
|
|
68
|
+
run: python scripts/check_viewer_build.py --latest
|
|
69
|
+
- name: Lint before expensive analysis
|
|
70
|
+
run: python -m ruff check src tests scripts
|
|
71
|
+
- name: Test static timeline, completeness validation, HTTP and publication
|
|
72
|
+
run: |
|
|
73
|
+
python -m pytest tests/test_static_timeline.py tests/test_arcadians_timeline.py tests/test_arcadians_http.py tests/test_arcadians_pages_publish.py tests/test_arcadians_runtime.py tests/test_beat_inputs.py tests/test_beat_consensus.py tests/test_viewer_controls.py
|
|
74
|
+
|
|
75
|
+
timeline:
|
|
76
|
+
if: github.event_name != 'pull_request'
|
|
77
|
+
needs: static-regressions
|
|
78
|
+
name: Complete Arcadians analysis and static timeline
|
|
79
|
+
uses: ./.github/workflows/arcadians-timeline.yml
|
|
80
|
+
permissions:
|
|
81
|
+
contents: read
|
|
82
|
+
|
|
83
|
+
build:
|
|
84
|
+
needs: timeline
|
|
85
|
+
name: Generate and audition full Arcadians batch
|
|
86
|
+
runs-on: ubuntu-24.04
|
|
87
|
+
timeout-minutes: 30
|
|
88
|
+
env:
|
|
89
|
+
STEMLAB_REQUIRE_RECORDINGS: '1'
|
|
90
|
+
DANCERUDIMENTS_REQUIRE_NATIVE: '1'
|
|
91
|
+
PYTHONUNBUFFERED: '1'
|
|
92
|
+
steps:
|
|
93
|
+
- uses: actions/checkout@v7
|
|
94
|
+
with:
|
|
95
|
+
persist-credentials: false
|
|
96
|
+
- uses: actions/setup-python@v7
|
|
97
|
+
with:
|
|
98
|
+
python-version: '3.11'
|
|
99
|
+
- name: Read the same verified release snapshot used by the timeline
|
|
100
|
+
id: companion
|
|
101
|
+
shell: bash
|
|
102
|
+
run: python scripts/check_viewer_build.py --outputs "$GITHUB_OUTPUT"
|
|
103
|
+
- uses: actions/checkout@v7
|
|
104
|
+
with:
|
|
105
|
+
repository: kieransimkin/DanceRudiments
|
|
106
|
+
ref: ${{ steps.companion.outputs.ref }}
|
|
107
|
+
path: .recording-dancerudiments
|
|
108
|
+
persist-credentials: false
|
|
109
|
+
- name: Install published native companion and lightweight recording dependencies
|
|
110
|
+
run: |
|
|
111
|
+
sudo apt-get update
|
|
112
|
+
sudo apt-get install --yes libsndfile1 ffmpeg
|
|
113
|
+
python -m pip install numpy scipy 'soundfile>=0.12' matplotlib rich 'typer>=0.12' platformdirs pytest pyyaml playwright
|
|
114
|
+
python scripts/viewer_releases.py install
|
|
115
|
+
python -m pip install --no-deps -e .
|
|
116
|
+
python -c "from dancerudiments import SampledRecording; from dancerudiments_authoring.harness import build_recording_harness, HARNESS_DISPLAY_API_VERSION; assert HARNESS_DISPLAY_API_VERSION == 1"
|
|
117
|
+
- name: Run release-demo and recording regression tests
|
|
118
|
+
run: python -m pytest tests/test_arcadians_http.py tests/test_arcadians_release_demo.py tests/test_rudiment_recordings.py tests/test_rudiment_matches.py tests/test_rudiment_pairs.py tests/test_arcadians_pair_demos.py
|
|
119
|
+
- name: Generate 48 full-song movements with the original MP3 included
|
|
120
|
+
env:
|
|
121
|
+
RELEASE_LABEL: ${{ github.ref_name }}
|
|
122
|
+
COMPANION_SHA: ${{ steps.companion.outputs.ref }}
|
|
123
|
+
shell: bash
|
|
124
|
+
run: |
|
|
125
|
+
# PR refs contain slashes; preview labels are not release claims.
|
|
126
|
+
LABEL="$RELEASE_LABEL"
|
|
127
|
+
if [[ "$GITHUB_EVENT_NAME" == 'pull_request' ]]; then LABEL="pr-${{ github.event.number }}"; fi
|
|
128
|
+
python scripts/build_arcadians_demo.py build \
|
|
129
|
+
--output dist/arcadians-pages \
|
|
130
|
+
--source-commit "$(git rev-parse HEAD)" \
|
|
131
|
+
--companion-commit "$COMPANION_SHA" \
|
|
132
|
+
--companion-license .recording-dancerudiments/LICENSE \
|
|
133
|
+
--release-tag "$LABEL"
|
|
134
|
+
- name: Install Chromium
|
|
135
|
+
run: python -m playwright install --with-deps chromium
|
|
136
|
+
- name: Run companion native recording and shared harness regressions
|
|
137
|
+
run: python -m unittest discover -s .recording-dancerudiments/tests/python -p test_recording.py -v
|
|
138
|
+
- name: Require audible source data and synchronized playback under the Pages URL prefix
|
|
139
|
+
run: |
|
|
140
|
+
python scripts/check_arcadians_audio.py dist/arcadians-pages \
|
|
141
|
+
--report dist/arcadians-audio-browser.json --screenshot dist/arcadians-comparison.png
|
|
142
|
+
python scripts/build_arcadians_demo.py verify dist/arcadians-pages
|
|
143
|
+
- name: Retrieve the same analysis run's exact float stems, outside the public site
|
|
144
|
+
uses: actions/download-artifact@v5
|
|
145
|
+
with:
|
|
146
|
+
name: stemlab-arcadians-recording-sources
|
|
147
|
+
path: recording-sources
|
|
148
|
+
- name: Generate stem-pair and average-comparison pages without rerunning separation
|
|
149
|
+
env:
|
|
150
|
+
COMPANION_SHA: ${{ steps.companion.outputs.ref }}
|
|
151
|
+
run: |
|
|
152
|
+
python scripts/build_arcadians_pair_demos.py --sources recording-sources \
|
|
153
|
+
--site dist/arcadians-pages --source-commit "$GITHUB_SHA" \
|
|
154
|
+
--companion-commit "$COMPANION_SHA" --companion-license .recording-dancerudiments/LICENSE
|
|
155
|
+
- name: Verify both additional galleries with original audio and native samples
|
|
156
|
+
run: |
|
|
157
|
+
python scripts/check_arcadians_audio.py dist/arcadians-pages --gallery arcadians-stems \
|
|
158
|
+
--report dist/arcadians-stems-audio-browser.json --screenshot dist/arcadians-stems-comparison.png
|
|
159
|
+
python scripts/check_arcadians_audio.py dist/arcadians-pages --gallery arcadians-averages \
|
|
160
|
+
--report dist/arcadians-averages-audio-browser.json --screenshot dist/arcadians-averages-comparison.png
|
|
161
|
+
- name: Retrieve the complete browser-validated timeline
|
|
162
|
+
uses: actions/download-artifact@v5
|
|
163
|
+
with:
|
|
164
|
+
name: stemlab-arcadians-timeline-pages
|
|
165
|
+
path: timeline-site
|
|
166
|
+
- name: Retrieve timeline QA separately, never into the public site
|
|
167
|
+
uses: actions/download-artifact@v5
|
|
168
|
+
with:
|
|
169
|
+
name: stemlab-arcadians-timeline-qa
|
|
170
|
+
path: dist/timeline-qa
|
|
171
|
+
- name: Assemble all four verified viewers into one Pages site
|
|
172
|
+
run: |
|
|
173
|
+
python scripts/assemble_arcadians_site.py --site dist/arcadians-pages \
|
|
174
|
+
--timeline timeline-site --qa dist/timeline-qa/arcadians-timeline-browser.json \
|
|
175
|
+
--source-sha "$GITHUB_SHA"
|
|
176
|
+
cp dist/timeline-qa/arcadians-timeline-browser.json dist/arcadians-timeline-browser.json
|
|
177
|
+
- name: Require matching HTTP QA for the complete four-viewer site
|
|
178
|
+
run: |
|
|
179
|
+
python scripts/publish_arcadians_pages.py verify --site dist/arcadians-pages \
|
|
180
|
+
--qa dist/arcadians-audio-browser.json --source-sha "$GITHUB_SHA"
|
|
181
|
+
- name: Freeze the tested public site as release assets
|
|
182
|
+
run: |
|
|
183
|
+
python scripts/build_arcadians_demo.py package dist/arcadians-pages --output dist/arcadians-release
|
|
184
|
+
- name: Upload only the verified public site
|
|
185
|
+
uses: actions/upload-artifact@v7
|
|
186
|
+
with:
|
|
187
|
+
name: stemlab-arcadians-pages
|
|
188
|
+
path: dist/arcadians-pages/
|
|
189
|
+
include-hidden-files: true
|
|
190
|
+
if-no-files-found: error
|
|
191
|
+
- name: Upload Arcadians release archive and provenance
|
|
192
|
+
uses: actions/upload-artifact@v7
|
|
193
|
+
with:
|
|
194
|
+
name: stemlab-arcadians-release-assets
|
|
195
|
+
path: dist/arcadians-release/*
|
|
196
|
+
if-no-files-found: error
|
|
197
|
+
- name: Retain browser validation evidence separately from the public site
|
|
198
|
+
if: always()
|
|
199
|
+
uses: actions/upload-artifact@v7
|
|
200
|
+
with:
|
|
201
|
+
name: stemlab-arcadians-browser-qa
|
|
202
|
+
path: |
|
|
203
|
+
dist/arcadians-comparison.png
|
|
204
|
+
dist/arcadians-audio-browser.json
|
|
205
|
+
dist/arcadians-timeline-browser.json
|
|
206
|
+
dist/arcadians-stems-audio-browser.json
|
|
207
|
+
dist/arcadians-averages-audio-browser.json
|
|
208
|
+
dist/arcadians-stems-comparison.png
|
|
209
|
+
dist/arcadians-averages-comparison.png
|
|
210
|
+
if-no-files-found: warn
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
name: Publish Arcadians demo to Pages
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
demo_run_id:
|
|
7
|
+
description: 'Successful Arcadians demo run ID; blank selects the latest on main'
|
|
8
|
+
type: string
|
|
9
|
+
required: false
|
|
10
|
+
default: ''
|
|
11
|
+
workflow_run:
|
|
12
|
+
workflows: ['Arcadians release demo']
|
|
13
|
+
branches: [main]
|
|
14
|
+
types: [completed]
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
publish:
|
|
21
|
+
# Explicit manual publication needs no package release or opt-in variable.
|
|
22
|
+
# Automatic publication retains the existing Pages opt-in. Never publish PRs.
|
|
23
|
+
if: >-
|
|
24
|
+
github.repository == 'kieransimkin/stemlab' &&
|
|
25
|
+
((github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main') ||
|
|
26
|
+
(github.event_name == 'workflow_run' && vars.STEMLAB_PAGES_ENABLED == 'true' &&
|
|
27
|
+
github.event.workflow_run.conclusion == 'success' &&
|
|
28
|
+
github.event.workflow_run.event == 'workflow_dispatch' &&
|
|
29
|
+
github.event.workflow_run.head_branch == 'main' &&
|
|
30
|
+
github.event.workflow_run.head_repository.full_name == 'kieransimkin/stemlab'))
|
|
31
|
+
runs-on: ubuntu-24.04
|
|
32
|
+
timeout-minutes: 15
|
|
33
|
+
concurrency:
|
|
34
|
+
group: stemlab-pages
|
|
35
|
+
cancel-in-progress: false
|
|
36
|
+
permissions:
|
|
37
|
+
contents: read
|
|
38
|
+
actions: read
|
|
39
|
+
pages: write
|
|
40
|
+
id-token: write
|
|
41
|
+
environment:
|
|
42
|
+
name: github-pages
|
|
43
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
44
|
+
steps:
|
|
45
|
+
# On workflow_run, github.sha is the trusted default-branch revision,
|
|
46
|
+
# not the triggering run's code. Artifacts are data, never executed.
|
|
47
|
+
- uses: actions/checkout@v7
|
|
48
|
+
with:
|
|
49
|
+
ref: ${{ github.sha }}
|
|
50
|
+
persist-credentials: false
|
|
51
|
+
- uses: actions/setup-python@v7
|
|
52
|
+
with:
|
|
53
|
+
python-version: '3.11'
|
|
54
|
+
- name: Check Pages is enabled and configured for Actions
|
|
55
|
+
id: pages
|
|
56
|
+
uses: actions/configure-pages@v5
|
|
57
|
+
continue-on-error: true
|
|
58
|
+
- name: Explain missing Pages configuration
|
|
59
|
+
if: steps.pages.outcome == 'failure'
|
|
60
|
+
run: |
|
|
61
|
+
echo '::error::Enable Settings > Pages > Source > GitHub Actions, then run this workflow again. The github-pages environment must permit main. No package release is required.'
|
|
62
|
+
exit 1
|
|
63
|
+
- name: Select successful same-repository demo and its exact artifacts
|
|
64
|
+
id: source
|
|
65
|
+
env:
|
|
66
|
+
GH_TOKEN: ${{ github.token }}
|
|
67
|
+
DEMO_RUN_ID: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.id || inputs.demo_run_id }}
|
|
68
|
+
run: python scripts/publish_arcadians_pages.py select --run-id "$DEMO_RUN_ID"
|
|
69
|
+
- name: Download verified public site from selected run
|
|
70
|
+
uses: actions/download-artifact@v5
|
|
71
|
+
with:
|
|
72
|
+
artifact-ids: ${{ steps.source.outputs.site_artifact_id }}
|
|
73
|
+
merge-multiple: true
|
|
74
|
+
run-id: ${{ steps.source.outputs.run_id }}
|
|
75
|
+
github-token: ${{ github.token }}
|
|
76
|
+
path: public-site
|
|
77
|
+
- name: Download that run's browser evidence separately
|
|
78
|
+
uses: actions/download-artifact@v5
|
|
79
|
+
with:
|
|
80
|
+
artifact-ids: ${{ steps.source.outputs.qa_artifact_id }}
|
|
81
|
+
merge-multiple: true
|
|
82
|
+
run-id: ${{ steps.source.outputs.run_id }}
|
|
83
|
+
github-token: ${{ github.token }}
|
|
84
|
+
path: browser-qa
|
|
85
|
+
- name: Verify source commit, real MP3, public allowlist and successful HTTP browser QA
|
|
86
|
+
env:
|
|
87
|
+
SOURCE_SHA: ${{ steps.source.outputs.source_sha }}
|
|
88
|
+
run: |
|
|
89
|
+
python scripts/publish_arcadians_pages.py verify \
|
|
90
|
+
--site public-site --qa browser-qa/arcadians-audio-browser.json --source-sha "$SOURCE_SHA"
|
|
91
|
+
- name: Upload only the verified public directory to Pages
|
|
92
|
+
uses: actions/upload-pages-artifact@v4
|
|
93
|
+
with:
|
|
94
|
+
path: public-site
|
|
95
|
+
- name: Deploy Arcadians visualizer and original MP3
|
|
96
|
+
id: deployment
|
|
97
|
+
uses: actions/deploy-pages@v4
|
|
98
|
+
- name: Require the public URL to serve this build and seekable audio
|
|
99
|
+
env:
|
|
100
|
+
PAGE_URL: ${{ steps.deployment.outputs.page_url }}
|
|
101
|
+
SOURCE_SHA: ${{ steps.source.outputs.source_sha }}
|
|
102
|
+
run: |
|
|
103
|
+
python scripts/publish_arcadians_pages.py live --url "$PAGE_URL" \
|
|
104
|
+
--site public-site --source-sha "$SOURCE_SHA"
|
|
105
|
+
echo "### Published Arcadians timeline and movement demos" >> "$GITHUB_STEP_SUMMARY"
|
|
106
|
+
echo "${PAGE_URL%/}/timeline/arcadians/" >> "$GITHUB_STEP_SUMMARY"
|
|
107
|
+
echo "${PAGE_URL%/}/arcadians-stems/" >> "$GITHUB_STEP_SUMMARY"
|
|
108
|
+
echo "${PAGE_URL%/}/arcadians-averages/" >> "$GITHUB_STEP_SUMMARY"
|
|
109
|
+
echo "${PAGE_URL%/}/arcadians/" >> "$GITHUB_STEP_SUMMARY"
|
|
110
|
+
echo "Source: $SOURCE_SHA. Public HTML and audio range request verified." >> "$GITHUB_STEP_SUMMARY"
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
name: Arcadians complete analysis timeline
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_call:
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
name: Analyse the full song and test the static React timeline
|
|
13
|
+
runs-on: ubuntu-24.04
|
|
14
|
+
timeout-minutes: 330
|
|
15
|
+
env:
|
|
16
|
+
PYTHONUNBUFFERED: '1'
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v7
|
|
19
|
+
with:
|
|
20
|
+
persist-credentials: false
|
|
21
|
+
- uses: actions/setup-python@v7
|
|
22
|
+
with:
|
|
23
|
+
python-version: '3.11'
|
|
24
|
+
- name: Require the latest released-viewer build before Docker
|
|
25
|
+
env:
|
|
26
|
+
GH_TOKEN: ${{ github.token }}
|
|
27
|
+
run: python scripts/check_viewer_build.py --latest
|
|
28
|
+
- name: Build the existing locked StemLab analysis environment for CPU
|
|
29
|
+
# The existing Dockerfile installs the verified Sonic Annotator/Vamp stack.
|
|
30
|
+
# No interactive installers, host GPU or non-commercial MuQ inference.
|
|
31
|
+
run: |
|
|
32
|
+
docker build -f docker/Dockerfile \
|
|
33
|
+
--build-arg TORCH_INDEX_URL=https://download.pytorch.org/whl/cpu \
|
|
34
|
+
--build-arg STEMLAB_BUILD_REF="$GITHUB_SHA" \
|
|
35
|
+
-t stemlab-timeline:ci .
|
|
36
|
+
- name: Run the complete core recipe on the original Arcadians MP3
|
|
37
|
+
# Model downloads use upstream registries, as in the normal local pipeline.
|
|
38
|
+
# Music is mounted because .dockerignore intentionally excludes audio.
|
|
39
|
+
run: |
|
|
40
|
+
mkdir -p "$RUNNER_TEMP/arcadians-timeline"
|
|
41
|
+
docker run --rm --entrypoint python \
|
|
42
|
+
-e OMP_NUM_THREADS=2 -e MKL_NUM_THREADS=2 \
|
|
43
|
+
-v "$RUNNER_TEMP/arcadians-timeline:/work" \
|
|
44
|
+
-v "$GITHUB_WORKSPACE/examples/arcadians:/opt/stemlab/examples/arcadians:ro" \
|
|
45
|
+
stemlab-timeline:ci /opt/stemlab/scripts/build_arcadians_timeline.py \
|
|
46
|
+
--results /work/analysis --output /work/site --source-commit "$GITHUB_SHA" \
|
|
47
|
+
--recording-sources /work/recording-sources
|
|
48
|
+
- name: Restore runner ownership of generated files
|
|
49
|
+
# Atomic JSON writes use 0600. Docker runs as root; transfer ownership,
|
|
50
|
+
# not world-readable permissions, even if analysis failed part-way.
|
|
51
|
+
if: always()
|
|
52
|
+
shell: bash
|
|
53
|
+
run: |
|
|
54
|
+
output="$RUNNER_TEMP/arcadians-timeline"
|
|
55
|
+
if [ -d "$output" ] && [ ! -L "$output" ]; then
|
|
56
|
+
sudo chown -R --no-dereference "$(id -u):$(id -g)" "$output"
|
|
57
|
+
fi
|
|
58
|
+
- name: Install browser verification tools only
|
|
59
|
+
run: |
|
|
60
|
+
python -m pip install numpy scipy soundfile matplotlib fastapi rich 'typer>=0.12' platformdirs pytest playwright
|
|
61
|
+
python -m pip install --no-deps -e .
|
|
62
|
+
python -m playwright install --with-deps chromium
|
|
63
|
+
- name: Require working static lanes, audio clock, seeking, zoom and saved-loop playback
|
|
64
|
+
run: |
|
|
65
|
+
python scripts/check_arcadians_timeline.py "$RUNNER_TEMP/arcadians-timeline/site" \
|
|
66
|
+
--require-core --report "$RUNNER_TEMP/arcadians-timeline/qa/arcadians-timeline-browser.json"
|
|
67
|
+
- name: Upload the tested timeline for the combined Pages build
|
|
68
|
+
uses: actions/upload-artifact@v7
|
|
69
|
+
with:
|
|
70
|
+
name: stemlab-arcadians-timeline-pages
|
|
71
|
+
path: ${{ runner.temp }}/arcadians-timeline/site/
|
|
72
|
+
if-no-files-found: error
|
|
73
|
+
- name: Share exact master and six float stems with the pair-demo job
|
|
74
|
+
uses: actions/upload-artifact@v7
|
|
75
|
+
with:
|
|
76
|
+
name: stemlab-arcadians-recording-sources
|
|
77
|
+
path: ${{ runner.temp }}/arcadians-timeline/recording-sources/
|
|
78
|
+
retention-days: 7
|
|
79
|
+
if-no-files-found: error
|
|
80
|
+
- name: Upload separate timeline browser evidence
|
|
81
|
+
if: always()
|
|
82
|
+
uses: actions/upload-artifact@v7
|
|
83
|
+
with:
|
|
84
|
+
name: stemlab-arcadians-timeline-qa
|
|
85
|
+
path: ${{ runner.temp }}/arcadians-timeline/qa/
|
|
86
|
+
if-no-files-found: warn
|
|
87
|
+
- name: Retain original analysis artifacts, not models or runtime caches
|
|
88
|
+
if: always()
|
|
89
|
+
uses: actions/upload-artifact@v7
|
|
90
|
+
with:
|
|
91
|
+
name: stemlab-arcadians-complete-analysis
|
|
92
|
+
path: ${{ runner.temp }}/arcadians-timeline/analysis/
|
|
93
|
+
retention-days: 7
|
|
94
|
+
if-no-files-found: warn
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
name: Recording batch and shared visualizer
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
jobs:
|
|
10
|
+
recordings:
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
timeout-minutes: 25
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: false
|
|
15
|
+
matrix:
|
|
16
|
+
include:
|
|
17
|
+
- os: ubuntu-latest
|
|
18
|
+
python: '3.10'
|
|
19
|
+
- os: windows-latest
|
|
20
|
+
python: '3.13'
|
|
21
|
+
env:
|
|
22
|
+
STEMLAB_REQUIRE_RECORDINGS: '1'
|
|
23
|
+
DANCERUDIMENTS_REQUIRE_NATIVE: '1'
|
|
24
|
+
defaults:
|
|
25
|
+
run:
|
|
26
|
+
shell: bash
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@v7
|
|
29
|
+
- uses: actions/setup-python@v7
|
|
30
|
+
with:
|
|
31
|
+
python-version: ${{ matrix.python }}
|
|
32
|
+
- name: Require the latest stable published companion releases
|
|
33
|
+
id: companion
|
|
34
|
+
env:
|
|
35
|
+
GH_TOKEN: ${{ github.token }}
|
|
36
|
+
run: python scripts/check_viewer_build.py --latest --outputs "$GITHUB_OUTPUT"
|
|
37
|
+
- uses: actions/checkout@v7
|
|
38
|
+
with:
|
|
39
|
+
repository: kieransimkin/DanceRudiments
|
|
40
|
+
ref: ${{ steps.companion.outputs.ref }}
|
|
41
|
+
path: .recording-dancerudiments
|
|
42
|
+
- name: Report exact companion revision
|
|
43
|
+
run: git -C .recording-dancerudiments rev-parse HEAD
|
|
44
|
+
- name: Install the verified published wheel and lightweight test dependencies
|
|
45
|
+
run: |
|
|
46
|
+
python -m pip install numpy scipy soundfile matplotlib rich "typer>=0.12" platformdirs pytest pyyaml playwright
|
|
47
|
+
python scripts/viewer_releases.py install
|
|
48
|
+
python -m pip install --no-deps -e .
|
|
49
|
+
- name: Require new shared APIs and native class; no fallback/skip
|
|
50
|
+
run: python -c "from dancerudiments_authoring.harness import build_recording_harness, HARNESS_DISPLAY_API_VERSION; assert HARNESS_DISPLAY_API_VERSION == 1; from dancerudiments import SampledRecording"
|
|
51
|
+
- name: DSP, routing, mandatory BPM, native playback and matching regressions
|
|
52
|
+
run: python -m pytest tests/test_rudiment_recordings.py tests/test_rudiment_matches.py tests/test_rudiment_pairs.py tests/test_arcadians_pair_demos.py
|
|
53
|
+
- name: Generate master/stem synthetic examples and a 48-candidate batch
|
|
54
|
+
run: python examples/recordings/generate_demo.py --output recording-demo
|
|
55
|
+
- name: Install Chromium
|
|
56
|
+
run: python -m playwright install --with-deps chromium
|
|
57
|
+
- name: Verify real local-file comparison, native samples, audio clock and reviews
|
|
58
|
+
run: python .recording-dancerudiments/tools/test_recording_harness.py recording-demo/batch/index.html --screenshot recording-comparison.png
|
|
59
|
+
- name: Verify new stem-pair and smoothing comparison harnesses
|
|
60
|
+
run: |
|
|
61
|
+
python .recording-dancerudiments/tools/test_recording_harness.py recording-demo/stem-pairs/index.html --screenshot stem-pairs-comparison.png
|
|
62
|
+
python .recording-dancerudiments/tools/test_recording_harness.py recording-demo/averages/index.html --screenshot averages-comparison.png
|
|
63
|
+
- uses: actions/upload-artifact@v7
|
|
64
|
+
if: always()
|
|
65
|
+
with:
|
|
66
|
+
name: recordings-${{ matrix.os }}-${{ matrix.python }}
|
|
67
|
+
path: |
|
|
68
|
+
recording-demo/
|
|
69
|
+
recording-comparison.png
|
|
70
|
+
stem-pairs-comparison.png
|
|
71
|
+
averages-comparison.png
|
|
72
|
+
if-no-files-found: warn
|
|
@@ -9,6 +9,12 @@ permissions:
|
|
|
9
9
|
contents: read
|
|
10
10
|
|
|
11
11
|
jobs:
|
|
12
|
+
arcadians-demo:
|
|
13
|
+
name: Build Arcadians audio-synchronised movement demo
|
|
14
|
+
uses: ./.github/workflows/arcadians-demo.yml
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
12
18
|
codex-package:
|
|
13
19
|
name: Validate and package Codex plugin
|
|
14
20
|
uses: ./.github/workflows/codex-plugin.yml
|
|
@@ -18,7 +24,7 @@ jobs:
|
|
|
18
24
|
contents: read
|
|
19
25
|
|
|
20
26
|
release-build:
|
|
21
|
-
needs: codex-package
|
|
27
|
+
needs: [codex-package, arcadians-demo]
|
|
22
28
|
name: Build and validate StemLab release
|
|
23
29
|
runs-on: ubuntu-22.04
|
|
24
30
|
steps:
|
|
@@ -29,6 +35,9 @@ jobs:
|
|
|
29
35
|
python-version: "3.10"
|
|
30
36
|
cache: pip
|
|
31
37
|
|
|
38
|
+
- name: Verify rebuilt frontend and released dependency snapshot
|
|
39
|
+
run: python scripts/check_viewer_build.py
|
|
40
|
+
|
|
32
41
|
- name: Native build requirements
|
|
33
42
|
run: |
|
|
34
43
|
sudo apt-get update
|
|
@@ -42,6 +51,9 @@ jobs:
|
|
|
42
51
|
python -m pip install -e '.[all,binary,dev]'
|
|
43
52
|
python -m pip install -U build twine
|
|
44
53
|
|
|
54
|
+
- name: Install and audit the same published native wheel used by demo CI
|
|
55
|
+
run: python scripts/viewer_releases.py install
|
|
56
|
+
|
|
45
57
|
- name: Verify release tag matches StemLab version
|
|
46
58
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
47
59
|
run: |
|
|
@@ -104,11 +116,18 @@ jobs:
|
|
|
104
116
|
name: stemlab-codex-plugin-ubuntu-latest
|
|
105
117
|
path: codex-release
|
|
106
118
|
|
|
119
|
+
- name: Retrieve browser-validated Arcadians release assets
|
|
120
|
+
uses: actions/download-artifact@v5
|
|
121
|
+
with:
|
|
122
|
+
name: stemlab-arcadians-release-assets
|
|
123
|
+
path: arcadians-release
|
|
124
|
+
|
|
107
125
|
- name: Assemble StemLab release directory and manifest
|
|
108
126
|
run: |
|
|
109
127
|
mkdir -p dist-release
|
|
110
128
|
cp dist/* dist-release/
|
|
111
129
|
cp codex-release/* dist-release/
|
|
130
|
+
cp arcadians-release/* dist-release/
|
|
112
131
|
if [[ -f build/nuitka/stemlab-linux-x86_64 ]]; then
|
|
113
132
|
cp build/nuitka/stemlab-linux-x86_64 dist-release/
|
|
114
133
|
chmod +x dist-release/stemlab-linux-x86_64
|
|
@@ -188,6 +207,59 @@ jobs:
|
|
|
188
207
|
--repo "$REPOSITORY" \
|
|
189
208
|
--clobber
|
|
190
209
|
|
|
210
|
+
arcadians-pages:
|
|
211
|
+
name: Publish Arcadians timeline and movement comparison to Pages
|
|
212
|
+
if: startsWith(github.ref, 'refs/tags/v') && github.repository == 'kieransimkin/stemlab' && vars.STEMLAB_PAGES_ENABLED == 'true'
|
|
213
|
+
needs: [github-release, arcadians-demo]
|
|
214
|
+
runs-on: ubuntu-24.04
|
|
215
|
+
concurrency:
|
|
216
|
+
group: stemlab-pages
|
|
217
|
+
cancel-in-progress: false
|
|
218
|
+
permissions:
|
|
219
|
+
contents: read
|
|
220
|
+
pages: write
|
|
221
|
+
id-token: write
|
|
222
|
+
environment:
|
|
223
|
+
name: github-pages
|
|
224
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
225
|
+
steps:
|
|
226
|
+
- uses: actions/checkout@v7
|
|
227
|
+
with:
|
|
228
|
+
persist-credentials: false
|
|
229
|
+
- uses: actions/setup-python@v7
|
|
230
|
+
with:
|
|
231
|
+
python-version: '3.11'
|
|
232
|
+
- name: Retrieve only the browser-validated public site
|
|
233
|
+
uses: actions/download-artifact@v5
|
|
234
|
+
with:
|
|
235
|
+
name: stemlab-arcadians-pages
|
|
236
|
+
path: public-site
|
|
237
|
+
- name: Configure GitHub Pages
|
|
238
|
+
uses: actions/configure-pages@v5
|
|
239
|
+
- name: Upload dedicated site directory, never the repository
|
|
240
|
+
uses: actions/upload-pages-artifact@v4
|
|
241
|
+
with:
|
|
242
|
+
path: public-site
|
|
243
|
+
- name: Deploy Arcadians visualizer and original MP3
|
|
244
|
+
id: deployment
|
|
245
|
+
uses: actions/deploy-pages@v4
|
|
246
|
+
- name: Verify all four public viewers and their seekable audio
|
|
247
|
+
env:
|
|
248
|
+
PAGE_URL: ${{ steps.deployment.outputs.page_url }}
|
|
249
|
+
run: |
|
|
250
|
+
python scripts/publish_arcadians_pages.py live --url "$PAGE_URL" \
|
|
251
|
+
--site public-site --source-sha "$GITHUB_SHA"
|
|
252
|
+
- name: Published demo summary
|
|
253
|
+
env:
|
|
254
|
+
PAGE_URL: ${{ steps.deployment.outputs.page_url }}
|
|
255
|
+
run: |
|
|
256
|
+
echo "### Arcadians timeline and movement demos" >> "$GITHUB_STEP_SUMMARY"
|
|
257
|
+
echo "${PAGE_URL}timeline/arcadians/" >> "$GITHUB_STEP_SUMMARY"
|
|
258
|
+
echo "${PAGE_URL}arcadians-stems/" >> "$GITHUB_STEP_SUMMARY"
|
|
259
|
+
echo "${PAGE_URL}arcadians-averages/" >> "$GITHUB_STEP_SUMMARY"
|
|
260
|
+
echo "${PAGE_URL}arcadians/" >> "$GITHUB_STEP_SUMMARY"
|
|
261
|
+
echo '48 master movements, 60 stem pairs, 180 averaging comparisons and complete timeline; original MP3, 145 BPM; beat phase unverified.' >> "$GITHUB_STEP_SUMMARY"
|
|
262
|
+
|
|
191
263
|
container-publish:
|
|
192
264
|
name: Build and publish release container
|
|
193
265
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
@@ -13,3 +13,13 @@
|
|
|
13
13
|
- Whenever a feature is added or changed, update the relevant README.md in the same change to reflect the resulting behaviour. This applies to every feature addition or modification, including APIs, commands, configuration, defaults, integrations and removals.
|
|
14
14
|
- Update affected feature descriptions, usage instructions, options, examples and limitations. For tools or packages with their own README.md, update that README as well as the repository README when its overview or usage is affected.
|
|
15
15
|
- Check the README against the implemented and verified behaviour before committing, opening or merging a PR, publishing a release or handing off the work. A feature change is incomplete until its README documentation is current; a changelog or other documentation does not replace this requirement.
|
|
16
|
+
|
|
17
|
+
## Released viewers and coordinated CI/CD
|
|
18
|
+
|
|
19
|
+
- Read [docs/released-viewers.md](docs/released-viewers.md) before changing dependency, build or release behaviour. The sibling layout is `DanceRudiments/`, `react-timeline-sequence/`, and `stemlab/` under one parent.
|
|
20
|
+
- Release the two companions first (React Timeline Sequence, then DanceRudiments), verify their configured publication workflows and public registries, then synchronize/rebuild/test/release StemLab. A merge or tag alone is not a verified release.
|
|
21
|
+
- StemLab must target the **latest stable official releases**. No unreleased main commit, mutable development override, local `file:` archive or vendor package may substitute for a missing release. Latest is resolved before the build and locked to exact published versions, release commits and registry hashes for that run; fail visibly on stale or incompatible dependencies rather than falling back silently.
|
|
22
|
+
- Use the canonical `stemlab/scripts/Release-DanceFlow.ps1` coordinator from the shared parent directory. Preview first; `-Execute` explicitly performs scoped commits, normal pushes and fresh tags; `-Resume` must preserve source identities and existing tags/assets. Never force-push, move release tags, commit unrelated work, bypass failed checks or change approvals/protections/credentials to manufacture a pass.
|
|
23
|
+
- Update this repository's README.md and AGENTS.md in the same change whenever release policy, dependency rules, automation, commands, controls or validation change. Keep relevant package/feature READMEs current too. A separate guide or changelog does not replace the root README update.
|
|
24
|
+
- Preserve the master-plus-drums/percussion beat-routing contract, 64-pips-per-beat native recording clock, per-dimension bars and combined waveform/spectrogram lanes. New UI features must be supplied by released shared APIs and genuinely rebuilt frontend assets, not copied engines or marker strings.
|
|
25
|
+
- Distinguish source CI, package publication, full-song inference, browser/audio QA, artifact packaging, actual Pages deployment and live URL/audio verification. Keep all four Arcadians pages together; do not report unexecuted, skipped or older-commit checks as success. CI playback evidence is not subjective listening QA.
|