Skip to content

feat(beats): audio analysis pipeline + DARKXSIDE catalog - #1030

Merged
POWERFULMOVES merged 1 commit into
mainfrom
feat/beats-analysis-pipeline
Mar 19, 2026
Merged

POWERFULMOVES merged 1 commit into
mainfrom
feat/beats-analysis-pipeline

Conversation

@POWERFULMOVES

Copy link
Copy Markdown
Owner

Summary

  • Add 4 beats analysis tools: analyze_beats.py (ffmpeg lavfi fingerprinting), beats_to_cgp.py (beats → CGP geometry), chit_a2ui_bridge.py (CGP → A2UI animation), ingest_gdrive_beats.py (Google Drive ingestion)
  • Include DARKXSIDE SoundCloud catalog (pmoves/data/beats/) with 80+ tracks, fingerprints, and tempo-grouped playlists

Feeds

W4 (immersive demo content pipeline) — audio → geometry → animation chain for cataclysmstudios.com

Test plan

  • Verify analyze_beats.py runs with ffmpeg available
  • Verify beats_to_cgp.py produces valid CGP packets from fingerprint data
  • Confirm playlist M3U8 files reference valid track paths

🤖 Generated with Claude Code

Add beats analysis tools for the W4 immersive demo content pipeline:
- analyze_beats.py: audio fingerprinting (ffmpeg lavfi, ebur128, spectral)
- beats_to_cgp.py: beats → CGP geometry conversion
- chit_a2ui_bridge.py: CGP → A2UI animation specs bridge
- ingest_gdrive_beats.py: Google Drive beats ingestion

Include DARKXSIDE SoundCloud catalog (pmoves/data/beats/) with
fingerprints, playlists, and tempo-grouped M3U8 files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Mar 19, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 166 files, which is 16 over the limit of 150.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0bfa26ce-2c4d-4b77-b8d7-fbdb445b5f7e

📥 Commits

Reviewing files that changed from the base of the PR and between 7e96e4b and d195aaa.

⛔ Files ignored due to path filters (12)
  • pmoves/data/beats/soundcloud/darkxside/14 Track 14.m4a is excluded by !**/*.m4a
  • pmoves/data/beats/soundcloud/darkxside/808 Low.m4a is excluded by !**/*.m4a
  • pmoves/data/beats/soundcloud/darkxside/Lira 9.m4a is excluded by !**/*.m4a
  • pmoves/data/beats/soundcloud/darkxside/Looops 6long.m4a is excluded by !**/*.m4a
  • pmoves/data/beats/soundcloud/darkxside/MATTER COMMANDER.mp3 is excluded by !**/*.mp3
  • pmoves/data/beats/soundcloud/darkxside/NICE BABY.m4a is excluded by !**/*.m4a
  • pmoves/data/beats/soundcloud/darkxside/STARBLAST.mp3 is excluded by !**/*.mp3
  • pmoves/data/beats/soundcloud/darkxside/Shaelamix1loudLONG 183bpm.mp3 is excluded by !**/*.mp3
  • pmoves/data/beats/soundcloud/darkxside/Storms.m4a is excluded by !**/*.m4a
  • pmoves/data/beats/soundcloud/darkxside/Whosupnext - 01.m4a is excluded by !**/*.m4a
  • pmoves/data/beats/soundcloud/darkxside/inquiringcuriousmind.mp3 is excluded by !**/*.mp3
  • pmoves/data/beats/soundcloud/darkxside/the legend of Rattlesnake Jake.mp3 is excluded by !**/*.mp3
📒 Files selected for processing (166)
  • pmoves/data/beats/playlists/Allegro_balanced_Bright.m3u8
  • pmoves/data/beats/playlists/Allegro_balanced_Deep.m3u8
  • pmoves/data/beats/playlists/Moderato_balanced_Bright.m3u8
  • pmoves/data/beats/playlists/groups_summary.json
  • pmoves/data/beats/soundcloud/darkxside/.archive
  • pmoves/data/beats/soundcloud/darkxside/.fingerprints.json
  • pmoves/data/beats/soundcloud/darkxside/1.info.json
  • pmoves/data/beats/soundcloud/darkxside/14 Track 14.info.json
  • pmoves/data/beats/soundcloud/darkxside/808 Low.info.json
  • pmoves/data/beats/soundcloud/darkxside/808 SIGNS.info.json
  • pmoves/data/beats/soundcloud/darkxside/808 SIGNS.opus
  • pmoves/data/beats/soundcloud/darkxside/ARCANE NIGHT.info.json
  • pmoves/data/beats/soundcloud/darkxside/ARCANE NIGHT.opus
  • pmoves/data/beats/soundcloud/darkxside/Absynth Club mix.info.json
  • pmoves/data/beats/soundcloud/darkxside/Absynth Club mix.opus
  • pmoves/data/beats/soundcloud/darkxside/Aquary 4.info.json
  • pmoves/data/beats/soundcloud/darkxside/Aquary 4.opus
  • pmoves/data/beats/soundcloud/darkxside/Aquary Rnb.info.json
  • pmoves/data/beats/soundcloud/darkxside/Aquary Rnb.opus
  • pmoves/data/beats/soundcloud/darkxside/Arcade Low - 2.info.json
  • pmoves/data/beats/soundcloud/darkxside/Arcade Low - 2.opus
  • pmoves/data/beats/soundcloud/darkxside/Ask Me.info.json
  • pmoves/data/beats/soundcloud/darkxside/Ask Me.opus
  • pmoves/data/beats/soundcloud/darkxside/Ask You.info.json
  • pmoves/data/beats/soundcloud/darkxside/Ask You.opus
  • pmoves/data/beats/soundcloud/darkxside/Asylum 2 nice.info.json
  • pmoves/data/beats/soundcloud/darkxside/Asylum 2 nice.opus
  • pmoves/data/beats/soundcloud/darkxside/BEATS.info.json
  • pmoves/data/beats/soundcloud/darkxside/BOLLYWOOD MADNESS.info.json
  • pmoves/data/beats/soundcloud/darkxside/BOLLYWOOD MADNESS.opus
  • pmoves/data/beats/soundcloud/darkxside/BoomBap Low Long.info.json
  • pmoves/data/beats/soundcloud/darkxside/BoomBap Low Long.opus
  • pmoves/data/beats/soundcloud/darkxside/CLANK.info.json
  • pmoves/data/beats/soundcloud/darkxside/CLANK.opus
  • pmoves/data/beats/soundcloud/darkxside/Crush no # 71.info.json
  • pmoves/data/beats/soundcloud/darkxside/Crush no # 71.opus
  • pmoves/data/beats/soundcloud/darkxside/DARKXSIDE (All).info.json
  • pmoves/data/beats/soundcloud/darkxside/Darque 8.info.json
  • pmoves/data/beats/soundcloud/darkxside/Darque 8.opus
  • pmoves/data/beats/soundcloud/darkxside/FIRST BOSS.info.json
  • pmoves/data/beats/soundcloud/darkxside/FIRST BOSS.opus
  • pmoves/data/beats/soundcloud/darkxside/FLATTERY 4.info.json
  • pmoves/data/beats/soundcloud/darkxside/FLATTERY 4.opus
  • pmoves/data/beats/soundcloud/darkxside/Final Chrono 3.info.json
  • pmoves/data/beats/soundcloud/darkxside/Final Chrono 3.opus
  • pmoves/data/beats/soundcloud/darkxside/Final Chrono Dark Rev A.info.json
  • pmoves/data/beats/soundcloud/darkxside/Final Chrono Dark Rev A.opus
  • pmoves/data/beats/soundcloud/darkxside/Frayed.info.json
  • pmoves/data/beats/soundcloud/darkxside/Frayed.opus
  • pmoves/data/beats/soundcloud/darkxside/Gone till remember.info.json
  • pmoves/data/beats/soundcloud/darkxside/Gone till remember.opus
  • pmoves/data/beats/soundcloud/darkxside/Guitary Dwstro 3busy 4.info.json
  • pmoves/data/beats/soundcloud/darkxside/Guitary Dwstro 3busy 4.opus
  • pmoves/data/beats/soundcloud/darkxside/HERE.info.json
  • pmoves/data/beats/soundcloud/darkxside/HERE.opus
  • pmoves/data/beats/soundcloud/darkxside/Happy Practice.info.json
  • pmoves/data/beats/soundcloud/darkxside/Happy Practice.opus
  • pmoves/data/beats/soundcloud/darkxside/Harbinger.info.json
  • pmoves/data/beats/soundcloud/darkxside/Harbinger.opus
  • pmoves/data/beats/soundcloud/darkxside/Hip Hops n Star Snaps.info.json
  • pmoves/data/beats/soundcloud/darkxside/Hip Hops n Star Snaps.opus
  • pmoves/data/beats/soundcloud/darkxside/IMCRAZY.info.json
  • pmoves/data/beats/soundcloud/darkxside/IMCRAZY.opus
  • pmoves/data/beats/soundcloud/darkxside/Ice Cream 3 In 1.info.json
  • pmoves/data/beats/soundcloud/darkxside/Ice Cream 3 In 1.opus
  • pmoves/data/beats/soundcloud/darkxside/Jazz2loud.info.json
  • pmoves/data/beats/soundcloud/darkxside/Jazz2loud.opus
  • pmoves/data/beats/soundcloud/darkxside/Johnny 5.info.json
  • pmoves/data/beats/soundcloud/darkxside/Johnny 5.opus
  • pmoves/data/beats/soundcloud/darkxside/Krukky 18drums 6frek 4premaster 4b.info.json
  • pmoves/data/beats/soundcloud/darkxside/Krukky 18drums 6frek 4premaster 4b.opus
  • pmoves/data/beats/soundcloud/darkxside/LITTY.info.json
  • pmoves/data/beats/soundcloud/darkxside/LITTY.opus
  • pmoves/data/beats/soundcloud/darkxside/Lately.info.json
  • pmoves/data/beats/soundcloud/darkxside/Lately.opus
  • pmoves/data/beats/soundcloud/darkxside/Life Ex Machina.info.json
  • pmoves/data/beats/soundcloud/darkxside/Life Ex Machina.opus
  • pmoves/data/beats/soundcloud/darkxside/Like you a lot.info.json
  • pmoves/data/beats/soundcloud/darkxside/Like you a lot.opus
  • pmoves/data/beats/soundcloud/darkxside/Lira 9.info.json
  • pmoves/data/beats/soundcloud/darkxside/Looops 6long.info.json
  • pmoves/data/beats/soundcloud/darkxside/Lost Tapes A Side B Side - 1.info.json
  • pmoves/data/beats/soundcloud/darkxside/Lost Tapes A Side B Side - 1.opus
  • pmoves/data/beats/soundcloud/darkxside/MATTER COMMANDER.info.json
  • pmoves/data/beats/soundcloud/darkxside/MULTI BIT DARK.info.json
  • pmoves/data/beats/soundcloud/darkxside/MULTI BIT DARK.opus
  • pmoves/data/beats/soundcloud/darkxside/MULTIBIT.info.json
  • pmoves/data/beats/soundcloud/darkxside/MULTIBIT.opus
  • pmoves/data/beats/soundcloud/darkxside/Mood no# 3.info.json
  • pmoves/data/beats/soundcloud/darkxside/Mood no# 3.opus
  • pmoves/data/beats/soundcloud/darkxside/NICE BABY.info.json
  • pmoves/data/beats/soundcloud/darkxside/Piano Wax 76 Bpm dnb Dark.info.json
  • pmoves/data/beats/soundcloud/darkxside/Piano Wax 76 Bpm dnb Dark.opus
  • pmoves/data/beats/soundcloud/darkxside/Piano Wax Loud.info.json
  • pmoves/data/beats/soundcloud/darkxside/Piano Wax Loud.opus
  • pmoves/data/beats/soundcloud/darkxside/RAKS LIT.info.json
  • pmoves/data/beats/soundcloud/darkxside/RAKS LIT.opus
  • pmoves/data/beats/soundcloud/darkxside/RAKS SLOW.info.json
  • pmoves/data/beats/soundcloud/darkxside/RAKS SLOW.opus
  • pmoves/data/beats/soundcloud/darkxside/Rak no# 10 mix issue no# 4.info.json
  • pmoves/data/beats/soundcloud/darkxside/Rak no# 10 mix issue no# 4.opus
  • pmoves/data/beats/soundcloud/darkxside/Rav Low.info.json
  • pmoves/data/beats/soundcloud/darkxside/Rav Low.opus
  • pmoves/data/beats/soundcloud/darkxside/Ree 3b 25.info.json
  • pmoves/data/beats/soundcloud/darkxside/Ree 3b 25.opus
  • pmoves/data/beats/soundcloud/darkxside/Reminiscence.info.json
  • pmoves/data/beats/soundcloud/darkxside/Reminiscence.opus
  • pmoves/data/beats/soundcloud/darkxside/SCARD.info.json
  • pmoves/data/beats/soundcloud/darkxside/SCARD.opus
  • pmoves/data/beats/soundcloud/darkxside/SIRIUSSADHAPPYMIX.info.json
  • pmoves/data/beats/soundcloud/darkxside/SIRIUSSADHAPPYMIX.opus
  • pmoves/data/beats/soundcloud/darkxside/SOUL MOVES.info.json
  • pmoves/data/beats/soundcloud/darkxside/SOUL MOVES.opus
  • pmoves/data/beats/soundcloud/darkxside/STARBLAST.info.json
  • pmoves/data/beats/soundcloud/darkxside/Shae lullaby.info.json
  • pmoves/data/beats/soundcloud/darkxside/Shae lullaby.opus
  • pmoves/data/beats/soundcloud/darkxside/Shaelamix1loudLONG 183bpm.info.json
  • pmoves/data/beats/soundcloud/darkxside/Shrooms 9 Low slow change.info.json
  • pmoves/data/beats/soundcloud/darkxside/Shrooms 9 Low slow change.opus
  • pmoves/data/beats/soundcloud/darkxside/Sketch 5 116.44 LOUD.info.json
  • pmoves/data/beats/soundcloud/darkxside/Sketch 5 116.44 LOUD.opus
  • pmoves/data/beats/soundcloud/darkxside/Sketch 8 B Loud Dark.info.json
  • pmoves/data/beats/soundcloud/darkxside/Sketch 8 B Loud Dark.opus
  • pmoves/data/beats/soundcloud/darkxside/Sketchy tech 11.info.json
  • pmoves/data/beats/soundcloud/darkxside/Sketchy tech 11.opus
  • pmoves/data/beats/soundcloud/darkxside/Star Dreams ⧸ Wild Far.info.json
  • pmoves/data/beats/soundcloud/darkxside/Star Dreams ⧸ Wild Far.opus
  • pmoves/data/beats/soundcloud/darkxside/Starscreams and Loud Scars.info.json
  • pmoves/data/beats/soundcloud/darkxside/Starscreams and Loud Scars.opus
  • pmoves/data/beats/soundcloud/darkxside/Storms.info.json
  • pmoves/data/beats/soundcloud/darkxside/Strange Love.info.json
  • pmoves/data/beats/soundcloud/darkxside/Strange Love.opus
  • pmoves/data/beats/soundcloud/darkxside/Strange things.info.json
  • pmoves/data/beats/soundcloud/darkxside/Strange things.opus
  • pmoves/data/beats/soundcloud/darkxside/Street Fighter Lower.info.json
  • pmoves/data/beats/soundcloud/darkxside/Street Fighter Lower.opus
  • pmoves/data/beats/soundcloud/darkxside/TALK SLOW.info.json
  • pmoves/data/beats/soundcloud/darkxside/TALK SLOW.opus
  • pmoves/data/beats/soundcloud/darkxside/THE ALIEN IN THE WINDOW.info.json
  • pmoves/data/beats/soundcloud/darkxside/THE ALIEN IN THE WINDOW.opus
  • pmoves/data/beats/soundcloud/darkxside/THE SMALLEST VIOLINS.info.json
  • pmoves/data/beats/soundcloud/darkxside/THE SMALLEST VIOLINS.opus
  • pmoves/data/beats/soundcloud/darkxside/THEY'LL KILL YOU (OOMPA LOOMPA mix).info.json
  • pmoves/data/beats/soundcloud/darkxside/THEY'LL KILL YOU (OOMPA LOOMPA mix).opus
  • pmoves/data/beats/soundcloud/darkxside/TRACKS.info.json
  • pmoves/data/beats/soundcloud/darkxside/The Calm Storm.info.json
  • pmoves/data/beats/soundcloud/darkxside/The Calm Storm.opus
  • pmoves/data/beats/soundcloud/darkxside/The Harbringer.info.json
  • pmoves/data/beats/soundcloud/darkxside/The Harbringer.opus
  • pmoves/data/beats/soundcloud/darkxside/The Setup Just Leave Me Alone ⧸ Don't Leave Me Alone.info.json
  • pmoves/data/beats/soundcloud/darkxside/The Setup Just Leave Me Alone ⧸ Don't Leave Me Alone.opus
  • pmoves/data/beats/soundcloud/darkxside/WACK.info.json
  • pmoves/data/beats/soundcloud/darkxside/WACK.opus
  • pmoves/data/beats/soundcloud/darkxside/WEIRD v1.info.json
  • pmoves/data/beats/soundcloud/darkxside/WEIRD v1.opus
  • pmoves/data/beats/soundcloud/darkxside/When.info.json
  • pmoves/data/beats/soundcloud/darkxside/When.opus
  • pmoves/data/beats/soundcloud/darkxside/Whosupnext - 01.info.json
  • pmoves/data/beats/soundcloud/darkxside/inquiringcuriousmind.info.json
  • pmoves/data/beats/soundcloud/darkxside/the empath.info.json
  • pmoves/data/beats/soundcloud/darkxside/the empath.opus
  • pmoves/data/beats/soundcloud/darkxside/the legend of Rattlesnake Jake.info.json
  • pmoves/tools/analyze_beats.py
  • pmoves/tools/beats_to_cgp.py
  • pmoves/tools/chit_a2ui_bridge.py
  • pmoves/tools/ingest_gdrive_beats.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/beats-analysis-pipeline
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d195aaacb4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +573 to +574
gname = name_group(members)
m3u = write_playlist(gname, members, output)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Make playlist names unique per cluster

Because gname is derived only from coarse tempo/timbre/energy buckets, distinct KMeans clusters can collapse to the same label. When that happens write_playlist() rewrites the earlier .m3u8, and downstream selection by name becomes ambiguous; this commit already contains five Allegro_balanced_Bright entries in pmoves/data/beats/playlists/groups_summary.json but only one Allegro_balanced_Bright.m3u8. That drops tracks from the exported catalog and makes later beats_to_cgp.py --group/dump --group calls unable to target the overwritten clusters.

Useful? React with 👍 / 👎.

Comment on lines +188 to +192
"constellations": [{
"id": _stable_id(f"c_{group_name}"),
"label": group_name,
"anchor": anchor,
"spectrum": [group_sv["Hz"], group_sv["delta"], 1.0 - abs(group_sv["kappa"])],

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Nest emitted constellations under each super-node

group_to_cgp() emits the constellation in a top-level constellations array, but the repo’s CGP consumers traverse super_nodes[*].constellations (pmoves/services/gateway/gateway/api/workflow.py:204 and pmoves/services/gateway/gateway/api/viz.py:127). In the packets produced here, super_nodes[0] has no constellations at all, so the gateway cannot collect constellation IDs or render the SVG view for these beats packets even though the top-level array is populated.

Useful? React with 👍 / 👎.

Comment on lines +93 to +94
anchors = cgp_data.get("anchors", [])
for idx, anchor in enumerate(anchors):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Read canonical CGP fields when building A2UI scenes

This bridge only looks for top-level anchors and spectral_signatures, but the canonical geometry schema and the new beats exporter use super_nodes[*].constellations[*].anchor and points instead (pmoves/contracts/schemas/geometry/cgp.v1.schema.json, pmoves/tools/beats_to_cgp.py). For any CGP produced in this repo, both loops are empty, so elements stays empty and the Remotion render is just a blank scene.

Useful? React with 👍 / 👎.

@POWERFULMOVES
POWERFULMOVES merged commit 78d0caa into main Mar 19, 2026
5 of 6 checks passed
@POWERFULMOVES

Copy link
Copy Markdown
Owner Author

🌿 PR Trim — Thread Classification

# File Issue Classification Action
1 analyze_beats.py Playlist names not unique per cluster 📋 Noted Fix lands with Phase 11 tool implementation
2 beats_to_cgp.py Constellations not nested under super-nodes 📋 Noted Fix lands with Phase 11 tool implementation
3 chit_a2ui_bridge.py Not reading canonical CGP fields 📋 Noted Fix lands with Phase 11 tool implementation

Summary: All 3 threads reference tooling under active development (Phase 11 beats pipeline). The SKILL.md documents the intended architecture; the Python tools will implement these patterns when built. No follow-up commit needed — issues are tracked as part of the Phase 11 implementation scope.

POWERFULMOVES added a commit that referenced this pull request Mar 20, 2026
Addresses actionable review threads from 6 admin-merged PRs:

- SKILL.md (cipher-beats): fix ffmeg→ffmpeg typo, add code block language
  tags, normalize analysed→analyzed spelling (#1031)
- SKILL.md (holographic-blocks): add code block language tags, use
  canonical geometry.cgp.v1 subject name (#1031)
- portal.js: preserve gateway URL scheme (http/https→ws/wss), replace
  fabricated Math.random() stats with "—" placeholder (#1033)
- patterns.yaml: restrict CHIT bypass patterns from bare substrings to
  scoped make-target/file-path regexes (#1035)
- container-agent/app.py: include upstream service probes in healthy
  summary assessment (#1035)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
POWERFULMOVES added a commit that referenced this pull request Mar 20, 2026
- analyze_beats.py: append cluster ID to group names preventing .m3u8
  playlist file collisions when clusters share tempo/timbre/energy bucket
- beats_to_cgp.py: nest constellations inside super_nodes per CGP v1.0
  spec — gateway consumers traverse super_nodes[*].constellations[*]
- chit_a2ui_bridge.py: traverse canonical nested CGP paths instead of
  reading non-existent top-level anchors/spectral_signatures fields;
  also maps individual track points to A2UI sub-elements

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@POWERFULMOVES

Copy link
Copy Markdown
Owner Author

PR #1030 — Code Bug Fixes Landed

Commit 15ea0011 resolves the 3 confirmed code bugs from pr-trim classification:

Fix 1: Playlist name collisions — analyze_beats.py

  • Problem: name_group() maps to max 75 unique names (5 tempo × 5 timbre × 3 energy). Clusters sharing the same bucket overwrite each other's .m3u8 files.
  • Fix: Append cluster index: name_group(members)f"{name_group(members)}_c{gid}"

Fix 2: Constellation nesting — beats_to_cgp.py

  • Problem: constellations emitted as top-level array. CGP v1.0 spec requires super_nodes[*].constellations.
  • Fix: Moved constellations array inside super_nodes[0] dict.

Fix 3: Wrong CGP field paths — chit_a2ui_bridge.py

  • Problem: Bridge read from non-existent top-level anchors and spectral_signatures fields → empty A2UI scenes.
  • Fix: Traverse canonical nested path super_nodes[*].constellations[*] for anchor, spectrum, and points. Also maps individual track points to sub-elements.

All 3 fixes are structural (schema compliance, data integrity) — no behavioral changes to the pipeline logic.

@POWERFULMOVES
POWERFULMOVES deleted the feat/beats-analysis-pipeline branch April 21, 2026 13:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant