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.
Files changed (227) hide show
  1. danceflow_stemlab-1.5.0/.github/dancerudiments-recording-ref +1 -0
  2. danceflow_stemlab-1.5.0/.github/workflows/arcadians-demo.yml +210 -0
  3. danceflow_stemlab-1.5.0/.github/workflows/arcadians-pages.yml +110 -0
  4. danceflow_stemlab-1.5.0/.github/workflows/arcadians-timeline.yml +94 -0
  5. danceflow_stemlab-1.5.0/.github/workflows/recordings.yml +72 -0
  6. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/.github/workflows/release.yml +73 -1
  7. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/AGENTS.md +10 -0
  8. danceflow_stemlab-1.5.0/MANIFEST.in +61 -0
  9. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/PKG-INFO +264 -2
  10. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/README.md +261 -0
  11. danceflow_stemlab-1.5.0/docs/arcadians-release-demo.md +281 -0
  12. danceflow_stemlab-1.5.0/docs/arcadians-timeline.md +211 -0
  13. danceflow_stemlab-1.5.0/docs/beat-inputs.md +58 -0
  14. danceflow_stemlab-1.5.0/docs/recording-pairs.md +158 -0
  15. danceflow_stemlab-1.5.0/docs/released-viewers.md +213 -0
  16. danceflow_stemlab-1.5.0/docs/rudiment-recordings.md +248 -0
  17. danceflow_stemlab-1.5.0/docs/screenshots/recording-comparison.png +0 -0
  18. danceflow_stemlab-1.5.0/docs/viewer-controls.md +100 -0
  19. danceflow_stemlab-1.5.0/examples/recordings/generate_demo.py +68 -0
  20. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/mcp-registry/server.json +2 -2
  21. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/.codex-plugin/plugin.json +1 -1
  22. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/plugin.json +1 -1
  23. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/pyproject.toml +2 -2
  24. danceflow_stemlab-1.5.0/scripts/Release-DanceFlow.ps1 +57 -0
  25. danceflow_stemlab-1.5.0/scripts/arcadians_http.py +140 -0
  26. danceflow_stemlab-1.5.0/scripts/assemble_arcadians_site.py +89 -0
  27. danceflow_stemlab-1.5.0/scripts/build_arcadians_demo.py +339 -0
  28. danceflow_stemlab-1.5.0/scripts/build_arcadians_pair_demos.py +302 -0
  29. danceflow_stemlab-1.5.0/scripts/build_arcadians_timeline.py +221 -0
  30. danceflow_stemlab-1.5.0/scripts/check_arcadians_audio.py +361 -0
  31. danceflow_stemlab-1.5.0/scripts/check_arcadians_timeline.py +223 -0
  32. danceflow_stemlab-1.5.0/scripts/check_semantic_runtime.py +80 -0
  33. danceflow_stemlab-1.5.0/scripts/check_torchaudio_decode.py +97 -0
  34. danceflow_stemlab-1.5.0/scripts/check_viewer_build.py +8 -0
  35. danceflow_stemlab-1.5.0/scripts/configure_viewer_build.py +12 -0
  36. danceflow_stemlab-1.5.0/scripts/publish_arcadians_pages.py +275 -0
  37. danceflow_stemlab-1.5.0/scripts/release_suite.py +525 -0
  38. danceflow_stemlab-1.5.0/scripts/timeline_display_checks.py +141 -0
  39. danceflow_stemlab-1.5.0/scripts/viewer_releases.py +314 -0
  40. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/PKG-INFO +264 -2
  41. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/SOURCES.txt +50 -0
  42. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/requires.txt +2 -1
  43. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/__init__.py +1 -1
  44. danceflow_stemlab-1.5.0/src/stemlab/analysis/rudiment_batch.py +252 -0
  45. danceflow_stemlab-1.5.0/src/stemlab/analysis/rudiment_pairs.py +276 -0
  46. danceflow_stemlab-1.5.0/src/stemlab/analysis/rudiment_recordings.py +420 -0
  47. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/beattransformer.py +2 -0
  48. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/common.py +13 -5
  49. danceflow_stemlab-1.5.0/src/stemlab/beats/inputs.py +85 -0
  50. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/cli.py +17 -0
  51. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/pipeline.py +52 -15
  52. danceflow_stemlab-1.5.0/src/stemlab/recording_cli.py +248 -0
  53. danceflow_stemlab-1.5.0/src/stemlab/static_timeline.py +332 -0
  54. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/app.js +5022 -4836
  55. danceflow_stemlab-1.5.0/src/stemlab/web/static-timeline.js +34 -0
  56. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/timeline.css +1 -1
  57. danceflow_stemlab-1.5.0/tests/test_arcadians_http.py +210 -0
  58. danceflow_stemlab-1.5.0/tests/test_arcadians_pages_publish.py +222 -0
  59. danceflow_stemlab-1.5.0/tests/test_arcadians_pair_demos.py +225 -0
  60. danceflow_stemlab-1.5.0/tests/test_arcadians_release_demo.py +197 -0
  61. danceflow_stemlab-1.5.0/tests/test_arcadians_runtime.py +314 -0
  62. danceflow_stemlab-1.5.0/tests/test_arcadians_timeline.py +325 -0
  63. danceflow_stemlab-1.5.0/tests/test_beat_inputs.py +160 -0
  64. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_release.py +2 -1
  65. danceflow_stemlab-1.5.0/tests/test_release_suite.py +385 -0
  66. danceflow_stemlab-1.5.0/tests/test_rudiment_pairs.py +238 -0
  67. danceflow_stemlab-1.5.0/tests/test_rudiment_recordings.py +261 -0
  68. danceflow_stemlab-1.5.0/tests/test_static_timeline.py +231 -0
  69. danceflow_stemlab-1.5.0/tests/test_viewer_controls.py +35 -0
  70. danceflow_stemlab-1.5.0/tests/test_viewer_releases.py +242 -0
  71. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_web_frontend.py +5 -1
  72. danceflow_stemlab-1.4.2/MANIFEST.in +0 -24
  73. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/.agents/plugins/marketplace.json +0 -0
  74. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/.github/workflows/codex-plugin.yml +0 -0
  75. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/CONTRIBUTING.md +0 -0
  76. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/LICENSE +0 -0
  77. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/branding/README.md +0 -0
  78. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/branding/logo-monochrome.svg +0 -0
  79. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/branding/logo.png +0 -0
  80. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/branding/logo.svg +0 -0
  81. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/codex-plugin.md +0 -0
  82. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/codex-publishing.md +0 -0
  83. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/cue-alignment.md +0 -0
  84. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/evidence-models.md +0 -0
  85. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/docs/midi.md +0 -0
  86. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/.mcp.json +0 -0
  87. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/README.md +0 -0
  88. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/branding/logo-monochrome.svg +0 -0
  89. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/branding/logo.png +0 -0
  90. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/branding/logo.svg +0 -0
  91. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/mcp.json +0 -0
  92. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/skills/stemlab/SKILL.md +0 -0
  93. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/plugins/stemlab/skills/stemlab/references/tools.md +0 -0
  94. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/benchmark_evidence_corpus.py +0 -0
  95. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/build_codex_plugin.py +0 -0
  96. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/capture_loop_workflow.py +0 -0
  97. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/check_codex_timeline.py +0 -0
  98. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/loop_demo.py +0 -0
  99. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/prepare_codex_marketplace.py +0 -0
  100. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/publish_mcp_registry.py +0 -0
  101. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/scripts/smoke_midi.py +0 -0
  102. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/setup.cfg +0 -0
  103. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/dependency_links.txt +0 -0
  104. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/entry_points.txt +0 -0
  105. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/danceflow_stemlab.egg-info/top_level.txt +0 -0
  106. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/__main__.py +0 -0
  107. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/__init__.py +0 -0
  108. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/evidence/__init__.py +0 -0
  109. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/evidence/adapters.py +0 -0
  110. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/evidence/registry.py +0 -0
  111. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/evidence/runner.py +0 -0
  112. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/evidence/worker.py +0 -0
  113. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/harmony.py +0 -0
  114. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/loops.py +0 -0
  115. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/lyrics.py +0 -0
  116. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/__init__.py +0 -0
  117. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/adapters.py +0 -0
  118. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/artifacts.py +0 -0
  119. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/registry.py +0 -0
  120. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/runner.py +0 -0
  121. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/midi/worker.py +0 -0
  122. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/phrase_loops.py +0 -0
  123. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/registry.py +0 -0
  124. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/rhythm.py +0 -0
  125. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/rudiment_matches.py +0 -0
  126. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/runner.py +0 -0
  127. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/semantic_audio.py +0 -0
  128. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/semantic_text.py +0 -0
  129. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/song_map.py +0 -0
  130. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/sonic.py +0 -0
  131. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/structure.py +0 -0
  132. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/tempo_regimes.py +0 -0
  133. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/analysis/transcription.py +0 -0
  134. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/audio.py +0 -0
  135. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/__init__.py +0 -0
  136. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/base.py +0 -0
  137. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/beatnet.py +0 -0
  138. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/beats/beatthis.py +0 -0
  139. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/bootstrap.py +0 -0
  140. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/branding.py +0 -0
  141. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/canonical.py +0 -0
  142. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/clip_cli.py +0 -0
  143. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/clip_match.py +0 -0
  144. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/__init__.py +0 -0
  145. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/__main__.py +0 -0
  146. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/bridge.py +0 -0
  147. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/jobs.py +0 -0
  148. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/paths.py +0 -0
  149. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/server.py +0 -0
  150. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/tasks.py +0 -0
  151. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/timeline.py +0 -0
  152. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/codex/worker.py +0 -0
  153. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/cue_cli.py +0 -0
  154. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/cues.py +0 -0
  155. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/lyric_lrc.py +0 -0
  156. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/manifest.py +0 -0
  157. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/models.py +0 -0
  158. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/__init__.py +0 -0
  159. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/base.py +0 -0
  160. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/bsroformer.py +0 -0
  161. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/common.py +0 -0
  162. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/demucs.py +0 -0
  163. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/openunmix.py +0 -0
  164. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/separators/scnet.py +0 -0
  165. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/server.py +0 -0
  166. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/sonic_visualiser.py +0 -0
  167. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/spectrogram.py +0 -0
  168. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/spectrogram_repair.py +0 -0
  169. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/speech.py +0 -0
  170. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/types.py +0 -0
  171. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/util.py +0 -0
  172. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/vamp.py +0 -0
  173. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/vamp_runtime.py +0 -0
  174. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/arcadians-cover.jpg +0 -0
  175. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/arcadians-reference.json +0 -0
  176. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/index.html +0 -0
  177. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/web/style.css +0 -0
  178. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/webui.py +0 -0
  179. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/src/stemlab/word_alignment.py +0 -0
  180. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_analysis_registry.py +0 -0
  181. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_arcadians_fixture.py +0 -0
  182. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_arcadians_rudiments.py +0 -0
  183. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_audio_normalization.py +0 -0
  184. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_bar_phase.py +0 -0
  185. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_beat_consensus.py +0 -0
  186. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_beat_this_bootstrap.py +0 -0
  187. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_beatnet_bootstrap.py +0 -0
  188. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_beatnet_compat.py +0 -0
  189. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_branding.py +0 -0
  190. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_bsroformer_adapter.py +0 -0
  191. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_canonical.py +0 -0
  192. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_canonical_extended.py +0 -0
  193. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_clip_match.py +0 -0
  194. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_bridge.py +0 -0
  195. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_jobs.py +0 -0
  196. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_package.py +0 -0
  197. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_protocol.py +0 -0
  198. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_codex_timeline.py +0 -0
  199. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_cue_integration.py +0 -0
  200. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_cues.py +0 -0
  201. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_deep_harmony.py +0 -0
  202. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_deep_lyrics.py +0 -0
  203. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_deep_sonic_rhythm.py +0 -0
  204. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_distribution_identity.py +0 -0
  205. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_docker_contract.py +0 -0
  206. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_evidence_models.py +0 -0
  207. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_loop_integration.py +0 -0
  208. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_loops.py +0 -0
  209. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_lyric_lrc.py +0 -0
  210. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_manifest.py +0 -0
  211. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_midi_adapters.py +0 -0
  212. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_midi_extraction.py +0 -0
  213. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_midi_integration.py +0 -0
  214. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_midi_registry.py +0 -0
  215. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_models.py +0 -0
  216. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_phrase_loops.py +0 -0
  217. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_repository_hygiene.py +0 -0
  218. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_rudiment_matches.py +0 -0
  219. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_server.py +0 -0
  220. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_song_map.py +0 -0
  221. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_sonic_visualiser.py +0 -0
  222. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_sonic_visualiser_workspace.py +0 -0
  223. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_spectrogram.py +0 -0
  224. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_speech_repetition.py +0 -0
  225. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_vamp.py +0 -0
  226. {danceflow_stemlab-1.4.2 → danceflow_stemlab-1.5.0}/tests/test_vamp_runtime.py +0 -0
  227. {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.