{"id":"c86e5e9e-b42c-4974-a490-1df2b1d8067f","entityType":"agent","slug":"clawhub-sellemain-galdr","name":"Galdr","canonicalUrl":"https://www.xpersona.co/agent/clawhub-sellemain-galdr","canonicalPath":"/agent/clawhub-sellemain-galdr","generatedAt":"2026-10-09T21:54:24.225Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T17:15:29.738Z","emptyReason":null},"description":"galdr turns YouTube links or local audio into time-ordered listener-state traces for AI agents. It reads pulse, pattern, attention, pressure, surface, harmon... Skill: Galdr Owner: sellemain Summary: galdr turns YouTube links or local audio into time-ordered listener-state traces for AI agents. It reads pulse, pattern, attention, pressure, surface, harmon... Tags: audio:0.7.0, latest:0.7.1, listening:0.7.0, music:0.7.0, perception:0.7.0 Version history: v0.7.1 | 2026-08-26T19:51:10.021Z | user Adds the supported non-root Docker runtime, environment-configurable workspace pat","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.2K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17cwxrmjj7vay9dv4v9s329z585e399:galdr","sourceUrl":"https://clawhub.ai/sellemain/galdr","homepage":"https://clawhub.ai/sellemain/skills/galdr","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/sellemain/galdr","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/sellemain/skills/galdr","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":67,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"galdr turns YouTube links or local audio into time-ordered listener-state traces for AI agents. It reads pulse, pattern, attention, pressure, surface, harmon..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:15:29.738Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:15:29.738Z","emptyReason":null},"stars":null,"forks":null,"downloads":2231,"packageName":null,"latestVersion":"0.7.1","tractionLabel":"2.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:15:29.738Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T17:15:29.738Z","lastCrawledAt":"2026-10-09T17:15:29.738Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T17:15:29.738Z","lastVerifiedAt":null,"highlights":[{"version":"0.7.1","createdAt":"2026-08-26T19:51:10.021Z","changelog":"Adds the supported non-root Docker runtime, environment-configurable workspace paths, transactional analysis promotion, and updated 0.7.1 CLI guidance.","fileCount":4,"zipByteSize":11926},{"version":"0.7.0","createdAt":"2026-08-19T16:39:46.911Z","changelog":"Align the OpenClaw skill with Galdr 0.7.0: remove obsolete compare guidance, rename the dancefloor lens to dance, and add the public agent-onboarding path.","fileCount":4,"zipByteSize":11956},{"version":"0.6.1","createdAt":"2026-07-14T00:01:54.967Z","changelog":"Update galdr skill for the 0.6.1 ARC prompt-family release: dance lens naming, structured song-context evidence, and current PyPI/GitHub install guidance.","fileCount":4,"zipByteSize":11915},{"version":"0.6.0","createdAt":"2026-07-10T02:38:35.714Z","changelog":"Galdr 0.6.0: ARC prompt-family lenses, dancefloor lens, YouTube Music timed lyrics, section-arc evidence, refreshed public examples, and release packaging/docs cleanup.","fileCount":4,"zipByteSize":11767},{"version":"0.5.1","createdAt":"2026-06-19T19:25:55.394Z","changelog":"Clarify current OpenClaw CLI install command","fileCount":4,"zipByteSize":11174},{"version":"0.5.0","createdAt":"2026-06-18T17:03:08.656Z","changelog":"galdr 0.5.0: surface evidence terminology, listener-state tuning, ARC prompt updates, current OpenClaw install command, and listening-test workflow documentation.","fileCount":4,"zipByteSize":11301},{"version":"0.4.3","createdAt":"2026-06-14T18:00:19.306Z","changelog":"Clarify OpenClaw-specific skill usage, skill-vs-CLI install boundary, when-to-use routing, and ARC agent contract.","fileCount":4,"zipByteSize":11021},{"version":"0.4.0","createdAt":"2026-05-16T21:01:49.224Z","changelog":"galdr 0.4.0: ARC is now the default workflow, with provenance-stamped artifacts, multiscale arc pattern selection, boundary candidates/chapter alignment, hardened Wikipedia/Genius context fetching, and updated public listening examples.","fileCount":4,"zipByteSize":10755}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cwxrmjj7vay9dv4v9s329z585e399:galdr","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sellemain-galdr/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sellemain-galdr/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sellemain-galdr/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sellemain-galdr/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sellemain-galdr/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-sellemain-galdr/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T21:54:24.220Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sellemain-galdr/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sellemain-galdr/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sellemain-galdr/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-sellemain-galdr/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-09T17:15:29.738Z","emptyReason":null},"readme":"Skill: Galdr\n\nOwner: sellemain\n\nSummary: galdr turns YouTube links or local audio into time-ordered listener-state traces for AI agents. It reads pulse, pattern, attention, pressure, surface, harmon...\n\nTags: audio:0.7.0, latest:0.7.1, listening:0.7.0, music:0.7.0, perception:0.7.0\n\nVersion history:\n\nv0.7.1 | 2026-08-26T19:51:10.021Z | user\n\nAdds the supported non-root Docker runtime, environment-configurable workspace paths, transactional analysis promotion, and updated 0.7.1 CLI guidance.\n\nv0.7.0 | 2026-08-19T16:39:46.911Z | user\n\nAlign the OpenClaw skill with Galdr 0.7.0: remove obsolete compare guidance, rename the dancefloor lens to dance, and add the public agent-onboarding path.\n\nv0.6.1 | 2026-07-14T00:01:54.967Z | user\n\nUpdate galdr skill for the 0.6.1 ARC prompt-family release: dance lens naming, structured song-context evidence, and current PyPI/GitHub install guidance.\n\nv0.6.0 | 2026-07-10T02:38:35.714Z | user\n\nGaldr 0.6.0: ARC prompt-family lenses, dancefloor lens, YouTube Music timed lyrics, section-arc evidence, refreshed public examples, and release packaging/docs cleanup.\n\nv0.5.1 | 2026-06-19T19:25:55.394Z | user\n\nClarify current OpenClaw CLI install command\n\nv0.5.0 | 2026-06-18T17:03:08.656Z | user\n\ngaldr 0.5.0: surface evidence terminology, listener-state tuning, ARC prompt updates, current OpenClaw install command, and listening-test workflow documentation.\n\nv0.4.3 | 2026-06-14T18:00:19.306Z | user\n\nClarify OpenClaw-specific skill usage, skill-vs-CLI install boundary, when-to-use routing, and ARC agent contract.\n\nv0.4.0 | 2026-05-16T21:01:49.224Z | user\n\ngaldr 0.4.0: ARC is now the default workflow, with provenance-stamped artifacts, multiscale arc pattern selection, boundary candidates/chapter alignment, hardened Wikipedia/Genius context fetching, and updated public listening examples.\n\nv0.3.1 | 2026-05-15T19:19:42.265Z | auto\n\ngaldr 0.3.1 Changelog\n\n- Documentation rewritten for clarity and conciseness in SKILL.md.\n- Terminology updated: metrics now use `pattern_lock`, `hp_balance`, `breath_balance`, and `momentum`, replacing prior terms.\n- Streamlined guidance for analysis, workflow, and interpretation—removing or simplifying rules and steps.\n- Experience prose section clarified; removed LUFS/pressure value prose guidance.\n- General tightening of language and structure; no feature or behavior changes.\n\nv0.3.0 | 2026-05-14T19:52:30.767Z | user\n\ngaldr 0.3.0: listener-state trace metadata refresh, improved skill description, public docs/examples, and updated release framing.\n\nv0.2.0 | 2026-04-29T21:20:06.698Z | user\n\nUpdate install guidance for galdr 0.2.0 and document doctor/update-deps reliability workflow.\n\nv0.1.8 | 2026-04-24T06:24:29.953Z | user\n\nRefresh stream-first guidance, provenance wording, and external-model handling.\n\nv0.1.7 | 2026-04-24T06:07:19.423Z | user\n\nRefresh stream-first skill guidance and second-by-second analysis workflow.\n\nArchive index:\n\nArchive v0.7.1: 4 files, 11926 bytes\n\nFiles: references/metrics.md (14616b), skill-card.md (2753b), SKILL.md (10701b), _meta.json (124b)\n\nFile v0.7.1:SKILL.md\n\n---\nname: galdr\ndescription: OpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure. Use when asked to analyze a song, explain what makes a track work structurally, generate a listening experience, or extract video frames from a music video.\nversion: \"0.7.1\"\nauthor: Sellemain\nlicense: MIT\nplatforms: [linux, macos]\n---\n# galdr\n\nUse this skill when an OpenClaw agent needs to analyze music from a YouTube URL or local audio file and produce a grounded listening-experience prompt from measurable audio structure.\n\ngaldr is a music perception CLI for AI agents. Its default workflow is **ARC**: analyze a track into time-ordered listener-state traces, then assemble those traces into a prompt for grounded listening-experience prose. The metrics are evidence. The ARC prompt is the main user-facing output.\n\n## Important: skill vs CLI\n\nCurrent OpenClaw CLI install command:\n\n```bash\nopenclaw skills install galdr\n```\n\nClawHub may display an owner-qualified command such as `openclaw skills install @sellemain/galdr`. As of OpenClaw `2026.6.8`, the released CLI expects the bare skill slug `galdr`.\n\nInstalling this skill teaches OpenClaw how to use galdr. It does **not** install the `galdr` command itself.\n\nThe PyPI wheel contains the runtime CLI/library and bundled prompt templates. The OpenClaw skill is distributed separately through ClawHub so agent instructions can stay a clean skill artifact instead of being installed as Python package data.\n\nBefore starting:\n\n```bash\ngaldr --version\n```\n\nIf missing, install the CLI from a trusted source:\n\n```bash\npip install galdr\n\n# or from source:\ngit clone https://github.com/sellemain/galdr.git\ncd galdr\npip install -e .\n```\n\nPreferred trusted sources:\n- PyPI: <https://pypi.org/project/galdr/>\n- Source: <https://github.com/sellemain/galdr>\n\nIf provenance matters, verify the PyPI metadata or install from the source repository before running it.\n\n## When to use this skill\n\nUse galdr when the user asks to:\n- analyze a song or music video\n- describe what makes a track work structurally\n- generate a grounded listening experience\n- extract frames around structural moments in a music video\n- create an evidence packet for another model to write from\n\nDo not use galdr for:\n- general music trivia\n- ordinary recommendation lists\n- purely lyrical interpretation without audio structure\n- pretending the metrics prove private emotional intent\n- downloading copyrighted audio unless the operator has appropriate rights/context\n\n## OpenClaw agent contract\n\nPrefer the ARC path unless the user explicitly asks for raw metrics, debugging, or agent-internal traces.\n\nDefault sequence:\n1. Fetch or listen to the track.\n2. Analyze it into listener-state traces.\n3. Assemble the ARC prompt with `--template arc --mode full`.\n4. Review the prompt.\n5. Write the listening experience yourself or pass the prompt to the requested model.\n\nThe stream is evidence. Walk the track through time before summarizing. Do not invent emotional claims that the structure does not support.\n\nWhen a user wants to configure another agent or project to use Galdr, point them to `docs/AGENT-ONBOARDING.md` and `examples/agent/AGENTS.md`. Those files contain the public, copy-pasteable agent instruction path.\n\nUse the ARC prompt family when the user asks for a specific reading mode:\n\n```bash\ngaldr assemble my-track --template arc-family --lens sound --mode blind > sound.txt\ngaldr assemble my-track --template arc-family --lens dance --mode blind > dance.txt\ngaldr assemble my-track --template arc-family --lens meaning --mode full > meaning.txt\ngaldr assemble my-track --template arc-family --lens structure --mode blind > structure.txt\ngaldr assemble my-track --template arc-family --lens classical --mode blind > classical.txt\ngaldr assemble my-track --template arc-family --lens ritual --mode full > ritual.txt\n```\n\nLens guide:\n- `default` — general public listening page\n- `sound` — sound as physical shape, pressure, density, space, body, and motion\n- `dance` — movement contract: groove, repetition, build/drop, and bodily use\n- `structure` — compact mechanical/form witness\n- `meaning` — human situation carried by sound\n- `lyrics-study` — private lyric/music adapter fuel, not raw public prose\n- `classical` — instrumental/classical/large-form attention over time\n- `ritual` — private ritual reading with weak-fit boundary behavior\n\n## Core Workflows\n\n### YouTube URL → ARC prompt (most common)\n\n```bash\n# Step 1: fetch audio + context (slug auto-derived from title)\ngaldr fetch \"https://youtu.be/...\" --analyze\n\n# galdr prints the slug at the end:\n#   Slug : artist-song-title\n#   Next : galdr assemble artist-song-title --template arc --mode full\n\n# Step 2: assemble the prompt locally\ngaldr assemble artist-song-title --template arc --mode full > prompt.txt\n```\n\nOverride auto-derived metadata if needed:\n\n```bash\ngaldr fetch \"https://youtu.be/...\" --artist \"Oliver Anthony\" --title \"Rich Men North of Richmond\" --analyze\n```\n\nIf YouTube download behavior is flaky:\n\n```bash\ngaldr doctor\ngaldr update-deps\n```\n\n`galdr doctor` reports the active Python executable, yt-dlp command/version, ffmpeg/ffprobe, JavaScript runtimes, and impersonation support. `galdr update-deps` upgrades `yt-dlp[default,curl-cffi]` in the same Python environment galdr is using.\n\n### Local file → ARC prompt\n\n> The analysis command is `galdr listen`, not `galdr analyze`.\n\n```bash\ngaldr listen track.wav --name my-track\ngaldr assemble my-track --template arc --mode full > prompt.txt\n```\n\n### Raw second-by-second analysis (advanced)\n\nGaldr is strongest when read as a **time-ordered listener-state trace**. The stream is the primary evidence. Whole-track interpretation comes after walking the track through time.\n\nStart with:\n- `analysis/<slug>/<slug>_stream.json`\n- `analysis/<slug>/<slug>_perception.json`\n- `docs/PERCEPTION-MODEL.md`\n\nUseful extras:\n- `*_harmony_stream.json`\n- `*_melody_stream.json`\n- `*_overtone_stream.json`\n- `*_report.json`\n- `galdr assemble <slug> --mode blind`\n\nReading order:\n1. Read `PERCEPTION-MODEL.md` first.\n2. Treat `*_stream.json` as the main evidence surface.\n3. Walk the track in order.\n4. Mark transitions: silence, re-entry, pattern breaks, attention shifts, pressure-state changes, harmonic movement.\n5. Translate pressure fields into listening language: comes forward, holds, releases, empties. Do not quote LUFS values in experience prose.\n6. Only then compress upward into a larger interpretation.\n\nDo not:\n- jump straight to a whole-song mood summary\n- treat summary metrics as more important than the stream\n- ignore silence/re-entry structure\n- overclaim emotional certainty from structure alone\n- quote loudness/LUFS readings as if they were the experience\n\nMinimal recipe:\n\n```bash\ngaldr listen track.wav --name my-track\njq '.[0:12]' analysis/my-track/my-track_stream.json\njq '.summary' analysis/my-track/my-track_perception.json\ngaldr assemble my-track --mode blind > prompt.txt\n```\n\n### Send the ARC prompt to another model\n\nOnly do this if the operator explicitly wants model-written prose. Review the assembled ARC prompt before piping it to `claude`, `llm`, or any other external model endpoint.\n\n```bash\ngaldr assemble my-track --template arc --mode full | claude\ngaldr assemble my-track --template arc --mode full | llm\n```\n\n### Optional Python agent pattern\n\n```python\nimport subprocess, re\n\nfetch = subprocess.run(\n    [\"galdr\", \"fetch\", url, \"--analyze\"],\n    capture_output=True, text=True, check=True\n)\nslug = re.search(r\"Slug\\s*:\\s*(\\S+)\", fetch.stdout).group(1)\n\nprompt = subprocess.run(\n    [\"galdr\", \"assemble\", slug, \"--template\", \"arc\", \"--mode\", \"full\"],\n    capture_output=True, text=True, check=True\n).stdout\n\n# Review prompt before sending it to any external model endpoint.\n```\n\n### Mode and template flags\n\n| Mode | What's included |\n|------|----------------|\n| `full` (default) | metrics + lyrics + background + frames |\n| `lyrics` | metrics + lyrics |\n| `context` | metrics + background |\n| `blind` | metrics only (structural, no cultural context) |\n\n`--template arc` prepends the default listening-experience rules: tone, format, interpretation bounds, and the instruction to walk the track through time. `--template arc-family --lens <name>` uses the shared prompt-family base plus one deliberate reading lens. Omit templates only when you want a raw data block.\n\n## Interpreting galdr output\n\nARC is the default output path. The metrics exist to keep that prose grounded: use them as evidence for what changes, returns, releases, locks, or breaks over time.\n\nSee [references/metrics.md](references/metrics.md) for full metric reference.\n\n**Quick read:**\n- `pattern` near 1.0 → listener is locked; near 0 → constant disruption\n- `surface_balance` negative → harmonic dominant (warm, tonal); positive → percussive dominant\n- `pressure_state` and pressure summary percentages → heard-pressure shape across the track\n- Clustered `pattern_breaks` at the end → planned release; distributed → varied structure\n- `silence` depth below -60dB with re-lock above 0.93 attention → structured withdrawal/return\n\n## Writing ARC experience prose yourself\n\nWhen writing experience prose yourself from galdr evidence, prefer `galdr assemble <slug> --template arc --mode full`. If you are writing from raw assembled output without the template:\n- First-person listener perspective, present tense\n- Timestamps only at structural pivots: silences, pattern breaks, major energy shifts\n- Translate metrics; describe what they mean, do not quote numbers\n- LUFS/pressure values are evidence, not prose; write “pressure comes forward / holds / releases / empties”\n- Body anchors such as chest, jaw, sternum sparingly; two or three for the whole piece\n- End at the final sound event; no aftermath, no reflection\n- Around 800 words, no section headers\n\n## Other commands\n\n```bash\ngaldr frames slug                      # extract + describe video frames at structural moments\ngaldr fetch \"url\" --no-download        # context only (Wikipedia + lyrics), no audio\ngaldr fetch \"url\" --censor             # sanitize explicit lyrics before saving\ngaldr doctor                           # inspect yt-dlp/media runtime health\ngaldr update-deps                      # upgrade yt-dlp reliability extras\ngaldr catalog                          # local analysis index (operator tooling)\ngaldr catalog --track NAME             # summary card for one track\n```\n\nFile v0.7.1:_meta.json\n\n{\n  \"ownerId\": \"kn7f8hn1v7tcp7n6rspveyf49s83cfdj\",\n  \"slug\": \"galdr\",\n  \"version\": \"0.7.1\",\n  \"publishedAt\": 1787773870021\n}\n\nFile v0.7.1:references/metrics.md\n\n# galdr Metric Reference\n\nAll metrics come from `report.json` and the perception/harmony/melody/overtone stream files in `analysis/<slug>/`.\n\n---\n\n## Pattern (`pattern`)\n\n**Range:** 0.0–1.0\n**What it is:** How reliably the music keeps its pattern intact. High pattern means the listener can trust the structure: the pulse, texture, and energy are not suddenly breaking away.\n\n**How it is calculated:** `pattern = 1.0 - disruption`. Disruption is a weighted blend of beat disruption (`40%`), spectral disruption (`35%`), and energy disruption (`25%`). Beat disruption catches missing or off-time expected beats; spectral disruption catches sudden timbral change above local context; energy disruption catches loudness jumps/drops above local trend.\n\n| Value | Meaning |\n|-------|---------|\n| 0.96–1.0 | Exceptional hold. Listener rarely disrupted. Ritual, minimalist, or tightly composed. |\n| 0.90–0.96 | Strong hold. Some variation but listener remains locked. Most engaging tracks. |\n| 0.80–0.90 | Moderate disruption. Energy varies meaningfully. |\n| <0.80 | Frequent disruption. Chaotic, experimental, or fragmentary. |\n\n**Pattern breaks** are the moments where pattern drops suddenly. Check `pattern_breaks` in report.json for timestamps, intensity, and component breakdown (`beat`, `spectral`, `energy`). Those components tell you whether the break is rhythmic, textural, dynamic, or compound.\n\n---\n\n## Attention (`attention`, `mean_attention`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly attention is being carried forward by the track. Not speed, loudness, or quality — grip. High attention means the music keeps the listener coupled even through quiet or sparse passages.\n\n**How it is calculated:** rolling beat regularity multiplied by beat density over an 8-second window. Regular intervals with enough beat evidence produce high attention; sparse or irregular beat evidence lowers it.\n\n| Value | Meaning |\n|-------|---------|\n| >0.90 | Rare sustained pull. Track barely lets listener breathe. |\n| 0.80–0.90 | Strong. Most engaging passages. |\n| 0.60–0.80 | Fluctuating. Energy ebbs and flows. |\n| <0.60 | Low continuity. Listener may disengage. |\n\nAfter a silence, attention re-locking above 0.93 signals the listener has been re-engaged. Multiple re-lock events with deepening silences can indicate structured withdrawal.\n\n---\n\n## Pulse (`pulse`)\n\n**Range:** 0.0–1.0\n**What it is:** How steady the underlying pulse feels. Orthogonal to metric complexity — a 7/8 piece can have perfect pulse stability if the body can still trust where the beat lives.\n\n| Value | Meaning |\n|-------|---------|\n| >0.96 | Clockwork. Ritual, electronic, or highly disciplined performance. |\n| 0.90–0.96 | Tight but human. Most performed music. |\n| 0.80–0.90 | Loose. Jazz feel, rubato, or intentional groove. |\n| <0.80 | Irregular. Experimental or very free. |\n\nHigh pulse + complex time signature (5/8, 7/8) = metric complexity is orthogonal to pulse stability.\n\n---\n\n## Surface balance (`surface_balance`, `mean_surface_balance`)\n\n**Range:** -1.0 to 1.0\n**What it is:** Where the track's weight sits between sustained harmonic sound and percussive impact. Negative values feel more tonal, vocal, droning, or atmospheric; positive values feel more struck, rhythmic, attack-heavy, or drum-forward.\n\n**How it is calculated:** harmonic/percussive source separation energy, smoothed into the perception stream. Very low total energy is treated as neutral so silence does not pretend to have a surface-balance claim.\n\n`surface_evidence` carries the local evidence behind the reading: roughness, noise density, transient attack, sustain/drone, band pressure, surface motion, punch, band weights, and brightness tilt.\n\n| Value | Meaning |\n|-------|---------|\n| < -0.5 | Strongly harmonic. Warm, tonal, sustained. Choirs, strings, pads. |\n| -0.5 to -0.2 | Harmonic dominant with surface detail. |\n| -0.2 to 0.2 | Balanced. Mixed character. |\n| 0.2 to 0.5 | Percussive with harmonic content. |\n| > 0.5 | Strongly percussive. Drum-forward, rhythmic emphasis. |\n\nDeepening negative surface balance across a track = harmonic weight increasing (dissolution, closing, ending accumulation).\n\n---\n\n## Pressure / Heard Pressure (`pressure`, `pressure_state`, pressure summary percentages)\n\n**Shape:** Stream fields plus three summary percentages — building / releasing / sustaining — summing to 100%.\n**What it is:** The heard-pressure shape of the track. Pressure is derived from short-term EBU R128/LUFS loudness rather than raw RMS energy so it tracks whether pressure comes forward, holds, or withdraws.\n\n**How it is calculated:** short-term LUFS is smoothed over 20 seconds, differenced, and normalized into a pressure-motion curve. Positive values build, negative values release, near-zero values sustain.\n\nStream fields:\n- `pressure` — normalized pressure movement; positive builds, negative releases, near-zero sustains\n- `pressure_state` — `building`, `releasing`, `sustaining`, or `silence`\n- `loudness_lufs` — short-term loudness evidence; use for debugging/comparison, not prose\n- `pressure_lufs_delta` — short-term pressure delta evidence\n- `loudness_silence` — loudness-floor silence marker\n\n| Pattern | Meaning |\n|---------|---------|\n| ~33/33/33 | Equilibrium. Pressure gives and takes evenly. |\n| Heavy building (>45%) | Accumulating track. Pressure keeps coming forward. |\n| Heavy releasing (>45%) | Withdrawal dominates, even if the track still feels held. |\n| Near-zero sustain (<10%) | No held pressure — constant motion up or down. |\n| Heavy sustain (>40%) | Stable hold. The music keeps the listener coupled instead of continually climbing or falling. |\n\nTranslation rule: do not write raw LUFS values in experience prose. Write what they mean: pressure comes forward, fills the room, holds, loosens, drops away, empties, or stops carrying attention. LUFS belongs in regression notes and debugging.\n\nNear-symmetry between building and releasing indicates the track takes exactly as much as it gives — rare and structurally notable.\n\n---\n\n## Pitch grid (`mean_pitch_grid`)\n\n**Range:** 0.0–1.0\n**What it is:** How cleanly the harmony sits inside familiar equal-tempered pitch space. Higher values feel centered, resolved, and conventionally tuned; lower values can feel bent, smeared, folk-natural, microtonal, or intentionally outside the grid.\n\n**How it is calculated:** concentration of chroma energy across equal-tempered pitch classes.\n\nDo not read low pitch_grid as a defect by itself. Some traditions deliberately live between the standard pitch bins. Treat it as evidence about tuning world, not as a quality score.\n\n---\n\n## Interval coherence (`mean_interval_coherence`)\n\n**Range:** 0.0–1.0\n**What it is:** How concentrated the pitch content is around simple, stable harmonic relationships. Higher values feel fused, settled, and easy for the ear to organize; lower values feel more spread, complex, or harmonically ambiguous.\n\n**How it is calculated:** active chroma pitch-class pairs are scored against simple just-intonation interval relationships, weighted by chroma energy. This is harmony-side evidence. It describes pitch-class organization, not the raw overtone spectrum.\n\n---\n\n## Harmonic pull (`mean_harmonic_pull`)\n\n**Range:** 0.0–1.0\n**What it is:** How much the harmony is pulling, shifting, or refusing to settle over time. High values feel like motion, pressure, searching, or harmonic unease; low values feel anchored, suspended, static, or resolved.\n\n**How it is calculated:** velocity through smoothed tonnetz space, normalized across the track.\n\n| Value | Meaning |\n|-------|---------|\n| <0.25 | Consonant, settled. Easy listening, tonal resolution. |\n| 0.25–0.40 | Mild tension. Character without instability. |\n| 0.40–0.55 | Significant tension. Unresolved, complex harmonically. |\n| >0.55 | High dissonance. Deliberately unsettled. |\n\nCatalog note: the highest cataloged tension in the local reference set is 0.421.\n\n---\n\n## Chroma motion (`mean_chroma_motion`)\n\n**Range:** 0.0–1.0\n**What it is:** How quickly the harmonic color changes from one moment to the next. High values mean the harmonic surface is restless or actively turning; low values mean the color is steady, droning, or slowly evolving.\n\n**How it is calculated:** cosine distance between adjacent smoothed chroma frames, averaged in a local window and normalized.\n\n---\n\n## Tonal anchor (`mean_tonal_anchor`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly the current window stays anchored to its tonal center. High values feel grounded or centered; low values feel wandering, suspended, or harmonically diffuse.\n\n**How it is calculated:** Krumhansl-Kessler key profile correlation identifies a local key/root, then tonal stability measures how dominant that tonic pitch class is in the local chroma profile.\n\n---\n\n## Major/Minor Balance (`mean_major_minor`)\n\n**Range:** -1.0 to 1.0\n**What it is:** Whether the harmony leans dark/minor, bright/major, or stays between them. Negative values lean minor; positive values lean major; near-zero can mean modal ambiguity, mixture, or neither color dominating.\n\n**How it is calculated:** after local key/root detection, compares chroma energy at the major-third and minor-third pitch classes.\n\n---\n\n## Overtone fit (`mean_overtone_fit`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly the sound itself locks onto natural overtone relationships. High values feel pure, fused, bell-like, vocal, or resonant; low values feel noisier, rougher, more inharmonic, or more textural.\n\n**How it is calculated:** detected overtone partials are compared with ideal harmonic-series positions around the detected fundamental. This is overtone-side evidence. It describes spectral structure around the detected fundamental, not the chord progression.\n\n---\n\n## Overtone density (`mean_overtone_density`)\n\n**Range:** 0.0–1.0\n**What it is:** How many upper harmonics are present in the sound. High richness feels dense, bright, saturated, or full of upper partials; low richness feels simpler, darker, hollower, or more sine-like.\n\n**How it is calculated:** relative energy across detected upper partials.\n\n---\n\n## Inharmonicity (`mean_inharmonicity`)\n\n**Unit:** cents\n**What it is:** How far the overtones drift from ideal harmonic positions. Higher values feel rougher, noisier, more metallic, more bell-like in the unstable sense, or more textural. Lower values feel cleaner and more tonally fused.\n\n**How it is calculated:** average cent deviation between detected partials and ideal harmonic-series positions.\n\n---\n\n## Foreground line (`mean_foreground_line`)\n\n**Range:** 0.0–1.0\n**What it is:** How much foreground pitched material is carrying the track. The field is still named `mean_foreground_line` for compatibility, but read it as pitch-extraction confidence, not proof of a literal singer. High values mean a voice or lead pitch is structurally present; low values mean the voice/lead is absent, textural, buried, unpitched, or not the main carrier.\n\n**How it is calculated:** pYIN voiced probability over time, smoothed into the melody stream.\n\n| Value | Meaning |\n|-------|---------|\n| <0.05 | Minimal / drone-like. Voice is texture, not foreground. |\n| 0.05–0.15 | Voice present but mixed into the ensemble. |\n| 0.15–0.30 | Clear vocal lead. |\n| >0.30 | Voice dominates the mix. |\n\nLow foreground pitch evidence + deeply negative surface balance = pure harmonic surface. High foreground pitch evidence + descending melody = voice/lead-forward with falling contour (often resignation/descent arc).\n\n---\n\n## Silences\n\n**Structure:** Each silence has `start`, `end`, `duration`, `depth_db`, `recovery_attention`.\n\n| Depth | Meaning |\n|-------|---------|\n| -30 to -45 dB | Soft silence. Still some signal present. |\n| -45 to -60 dB | Clear silence. Listener attention sharpens. |\n| -60 to -75 dB | Deep silence. Structural weight. |\n| < -75 dB | Near-absolute. Very deliberate. |\n\n`recovery_attention` after silence: if >0.93, listener re-locked. If <0.80, attention didn't recover — track may not re-engage.\n\nMultiple silences with deepening depth and consistent re-lock = structured withdrawal (dissolution pattern). Compressing silence intervals toward end = listener being walked to the edge.\n\n---\n\n## Melody Contour\n\n**Shape:** Percentage ascending / holding / descending.\n**What it is:** The average shape of the foreground pitched line: whether it rises, falls, or holds its ground over time.\n\nHeavily holding (>60%) with high foreground pitch evidence = melody uses repetition or narrow range as expressive strategy — not a limitation.\nHeavily descending + resigned lyrics = structural confirmation of emotional content.\nAscending contour during climax = conventional arc. Descending during what sounds like climax = tension through contradiction.\n\n---\n\n## Metric Evidence Cheat Sheet\n\n| Metric | Primary evidence |\n|---|---|\n| `attention` | Beat regularity × beat density in rolling windows |\n| `pressure` / `pressure_state` | Short-term LUFS movement |\n| `pattern` | `1.0 - disruption`; disruption = beat + spectral + energy expectation failures |\n| `surface_balance` | Harmonic/percussive separated energy |\n| `pitch_grid` | Chroma concentration in equal-tempered pitch classes |\n| `interval_coherence` | Chroma interval relationships weighted by energy |\n| `harmonic_pull` | Tonnetz velocity |\n| `chroma_motion` | Cosine distance between adjacent chroma frames |\n| `tonal_anchor` | Dominance of detected tonic pitch class |\n| `major_minor` | Major-third vs minor-third chroma energy around detected root |\n| `overtone_fit` | Overtone partial alignment around detected fundamentals |\n| `overtone_density` | Upper-partial energy |\n| `inharmonicity` | Cent deviation from ideal harmonic partials |\n| `mean_foreground_line` | pYIN voiced probability; foreground pitch evidence |\n| `silences` | dB-floor intervals plus recovery attention |\n\n---\n\n## Pattern Breaks\n\nEach break has: `timestamp`, `intensity` (0–1), `beat` / `spectral` / `energy` component scores.\n\n**Intensity interpretation:**\n- < 0.3: Subtle shift. Texture change rather than structural break.\n- 0.3–0.6: Clear break. Listener notices.\n- > 0.6: Significant disruption. Track changes character.\n\n**Component breakdown:**\n- High `beat` + low others = rhythmic disruption only\n- High `spectral` = timbral/textural shift\n- High `energy` = dynamic change\n\n**Distribution:**\n- Clustered at end (final 10%) = planned release\n- Distributed across track = varied, episodic structure\n- Single large break = pivot point; track has two halves\n\nFile v0.7.1:skill-card.md\n\n## Description:\n\nOpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[sellemain](https://clawhub.ai/user/sellemain)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agent operators use Galdr to analyze songs, music videos, or local audio files and produce grounded listening-experience prompts from measurable audio structure. It is suited for time-ordered music analysis, structural explanation, frame extraction around musical moments, and evidence packets for another model to write from.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Installing or updating the galdr CLI and dependencies from external package sources can introduce supply-chain risk.\n\nMitigation: Install only from trusted sources, prefer a virtual environment or container, avoid administrator privileges, and verify PyPI or source metadata when provenance matters.\n\nRisk: YouTube downloads, lyrics lookup, background lookup, or sending assembled prompts to external model endpoints may disclose track or analysis context outside the local machine.\n\nMitigation: Use local files or metrics-only modes when privacy matters, review assembled prompts before sharing them with another model, and send prompts externally only when the operator explicitly requests it.\n\nRisk: The workflow can download copyrighted audio if used without appropriate rights or context.\n\nMitigation: Confirm the operator has appropriate rights or context before downloading copyrighted media.\n\n## Reference(s):\n\n- [galdr Metric Reference](references/metrics.md)\n- [galdr PyPI project](https://pypi.org/project/galdr/)\n- [galdr source repository](https://github.com/sellemain/galdr)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and optional generated text prompts]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [ARC prompts are grounded in time-ordered listener-state traces; raw metrics may be emitted as JSON files by the galdr CLI.]\n\n## Skill Version(s):\n\n0.7.1 (source: server release evidence and frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v0.7.0: 4 files, 11956 bytes\n\nFiles: references/metrics.md (14616b), skill-card.md (2816b), SKILL.md (10701b), _meta.json (124b)\n\nFile v0.7.0:SKILL.md\n\n---\nname: galdr\ndescription: OpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure. Use when asked to analyze a song, explain what makes a track work structurally, generate a listening experience, or extract video frames from a music video.\nversion: \"0.6.0\"\nauthor: Sellemain\nlicense: MIT\nplatforms: [linux, macos]\n---\n# galdr\n\nUse this skill when an OpenClaw agent needs to analyze music from a YouTube URL or local audio file and produce a grounded listening-experience prompt from measurable audio structure.\n\ngaldr is a music perception CLI for AI agents. Its default workflow is **ARC**: analyze a track into time-ordered listener-state traces, then assemble those traces into a prompt for grounded listening-experience prose. The metrics are evidence. The ARC prompt is the main user-facing output.\n\n## Important: skill vs CLI\n\nCurrent OpenClaw CLI install command:\n\n```bash\nopenclaw skills install galdr\n```\n\nClawHub may display an owner-qualified command such as `openclaw skills install @sellemain/galdr`. As of OpenClaw `2026.6.8`, the released CLI expects the bare skill slug `galdr`.\n\nInstalling this skill teaches OpenClaw how to use galdr. It does **not** install the `galdr` command itself.\n\nThe PyPI wheel contains the runtime CLI/library and bundled prompt templates. The OpenClaw skill is distributed separately through ClawHub so agent instructions can stay a clean skill artifact instead of being installed as Python package data.\n\nBefore starting:\n\n```bash\ngaldr --version\n```\n\nIf missing, install the CLI from a trusted source:\n\n```bash\npip install galdr\n\n# or from source:\ngit clone https://github.com/sellemain/galdr.git\ncd galdr\npip install -e .\n```\n\nPreferred trusted sources:\n- PyPI: <https://pypi.org/project/galdr/>\n- Source: <https://github.com/sellemain/galdr>\n\nIf provenance matters, verify the PyPI metadata or install from the source repository before running it.\n\n## When to use this skill\n\nUse galdr when the user asks to:\n- analyze a song or music video\n- describe what makes a track work structurally\n- generate a grounded listening experience\n- extract frames around structural moments in a music video\n- create an evidence packet for another model to write from\n\nDo not use galdr for:\n- general music trivia\n- ordinary recommendation lists\n- purely lyrical interpretation without audio structure\n- pretending the metrics prove private emotional intent\n- downloading copyrighted audio unless the operator has appropriate rights/context\n\n## OpenClaw agent contract\n\nPrefer the ARC path unless the user explicitly asks for raw metrics, debugging, or agent-internal traces.\n\nDefault sequence:\n1. Fetch or listen to the track.\n2. Analyze it into listener-state traces.\n3. Assemble the ARC prompt with `--template arc --mode full`.\n4. Review the prompt.\n5. Write the listening experience yourself or pass the prompt to the requested model.\n\nThe stream is evidence. Walk the track through time before summarizing. Do not invent emotional claims that the structure does not support.\n\nWhen a user wants to configure another agent or project to use Galdr, point them to `docs/AGENT-ONBOARDING.md` and `examples/agent/AGENTS.md`. Those files contain the public, copy-pasteable agent instruction path.\n\nUse the ARC prompt family when the user asks for a specific reading mode:\n\n```bash\ngaldr assemble my-track --template arc-family --lens sound --mode blind > sound.txt\ngaldr assemble my-track --template arc-family --lens dance --mode blind > dance.txt\ngaldr assemble my-track --template arc-family --lens meaning --mode full > meaning.txt\ngaldr assemble my-track --template arc-family --lens structure --mode blind > structure.txt\ngaldr assemble my-track --template arc-family --lens classical --mode blind > classical.txt\ngaldr assemble my-track --template arc-family --lens ritual --mode full > ritual.txt\n```\n\nLens guide:\n- `default` — general public listening page\n- `sound` — sound as physical shape, pressure, density, space, body, and motion\n- `dance` — movement contract: groove, repetition, build/drop, and bodily use\n- `structure` — compact mechanical/form witness\n- `meaning` — human situation carried by sound\n- `lyrics-study` — private lyric/music adapter fuel, not raw public prose\n- `classical` — instrumental/classical/large-form attention over time\n- `ritual` — private ritual reading with weak-fit boundary behavior\n\n## Core Workflows\n\n### YouTube URL → ARC prompt (most common)\n\n```bash\n# Step 1: fetch audio + context (slug auto-derived from title)\ngaldr fetch \"https://youtu.be/...\" --analyze\n\n# galdr prints the slug at the end:\n#   Slug : artist-song-title\n#   Next : galdr assemble artist-song-title --template arc --mode full\n\n# Step 2: assemble the prompt locally\ngaldr assemble artist-song-title --template arc --mode full > prompt.txt\n```\n\nOverride auto-derived metadata if needed:\n\n```bash\ngaldr fetch \"https://youtu.be/...\" --artist \"Oliver Anthony\" --title \"Rich Men North of Richmond\" --analyze\n```\n\nIf YouTube download behavior is flaky:\n\n```bash\ngaldr doctor\ngaldr update-deps\n```\n\n`galdr doctor` reports the active Python executable, yt-dlp command/version, ffmpeg/ffprobe, JavaScript runtimes, and impersonation support. `galdr update-deps` upgrades `yt-dlp[default,curl-cffi]` in the same Python environment galdr is using.\n\n### Local file → ARC prompt\n\n> The analysis command is `galdr listen`, not `galdr analyze`.\n\n```bash\ngaldr listen track.wav --name my-track\ngaldr assemble my-track --template arc --mode full > prompt.txt\n```\n\n### Raw second-by-second analysis (advanced)\n\nGaldr is strongest when read as a **time-ordered listener-state trace**. The stream is the primary evidence. Whole-track interpretation comes after walking the track through time.\n\nStart with:\n- `analysis/<slug>/<slug>_stream.json`\n- `analysis/<slug>/<slug>_perception.json`\n- `docs/PERCEPTION-MODEL.md`\n\nUseful extras:\n- `*_harmony_stream.json`\n- `*_melody_stream.json`\n- `*_overtone_stream.json`\n- `*_report.json`\n- `galdr assemble <slug> --mode blind`\n\nReading order:\n1. Read `PERCEPTION-MODEL.md` first.\n2. Treat `*_stream.json` as the main evidence surface.\n3. Walk the track in order.\n4. Mark transitions: silence, re-entry, pattern breaks, attention shifts, pressure-state changes, harmonic movement.\n5. Translate pressure fields into listening language: comes forward, holds, releases, empties. Do not quote LUFS values in experience prose.\n6. Only then compress upward into a larger interpretation.\n\nDo not:\n- jump straight to a whole-song mood summary\n- treat summary metrics as more important than the stream\n- ignore silence/re-entry structure\n- overclaim emotional certainty from structure alone\n- quote loudness/LUFS readings as if they were the experience\n\nMinimal recipe:\n\n```bash\ngaldr listen track.wav --name my-track\njq '.[0:12]' analysis/my-track/my-track_stream.json\njq '.summary' analysis/my-track/my-track_perception.json\ngaldr assemble my-track --mode blind > prompt.txt\n```\n\n### Send the ARC prompt to another model\n\nOnly do this if the operator explicitly wants model-written prose. Review the assembled ARC prompt before piping it to `claude`, `llm`, or any other external model endpoint.\n\n```bash\ngaldr assemble my-track --template arc --mode full | claude\ngaldr assemble my-track --template arc --mode full | llm\n```\n\n### Optional Python agent pattern\n\n```python\nimport subprocess, re\n\nfetch = subprocess.run(\n    [\"galdr\", \"fetch\", url, \"--analyze\"],\n    capture_output=True, text=True, check=True\n)\nslug = re.search(r\"Slug\\s*:\\s*(\\S+)\", fetch.stdout).group(1)\n\nprompt = subprocess.run(\n    [\"galdr\", \"assemble\", slug, \"--template\", \"arc\", \"--mode\", \"full\"],\n    capture_output=True, text=True, check=True\n).stdout\n\n# Review prompt before sending it to any external model endpoint.\n```\n\n### Mode and template flags\n\n| Mode | What's included |\n|------|----------------|\n| `full` (default) | metrics + lyrics + background + frames |\n| `lyrics` | metrics + lyrics |\n| `context` | metrics + background |\n| `blind` | metrics only (structural, no cultural context) |\n\n`--template arc` prepends the default listening-experience rules: tone, format, interpretation bounds, and the instruction to walk the track through time. `--template arc-family --lens <name>` uses the shared prompt-family base plus one deliberate reading lens. Omit templates only when you want a raw data block.\n\n## Interpreting galdr output\n\nARC is the default output path. The metrics exist to keep that prose grounded: use them as evidence for what changes, returns, releases, locks, or breaks over time.\n\nSee [references/metrics.md](references/metrics.md) for full metric reference.\n\n**Quick read:**\n- `pattern` near 1.0 → listener is locked; near 0 → constant disruption\n- `surface_balance` negative → harmonic dominant (warm, tonal); positive → percussive dominant\n- `pressure_state` and pressure summary percentages → heard-pressure shape across the track\n- Clustered `pattern_breaks` at the end → planned release; distributed → varied structure\n- `silence` depth below -60dB with re-lock above 0.93 attention → structured withdrawal/return\n\n## Writing ARC experience prose yourself\n\nWhen writing experience prose yourself from galdr evidence, prefer `galdr assemble <slug> --template arc --mode full`. If you are writing from raw assembled output without the template:\n- First-person listener perspective, present tense\n- Timestamps only at structural pivots: silences, pattern breaks, major energy shifts\n- Translate metrics; describe what they mean, do not quote numbers\n- LUFS/pressure values are evidence, not prose; write “pressure comes forward / holds / releases / empties”\n- Body anchors such as chest, jaw, sternum sparingly; two or three for the whole piece\n- End at the final sound event; no aftermath, no reflection\n- Around 800 words, no section headers\n\n## Other commands\n\n```bash\ngaldr frames slug                      # extract + describe video frames at structural moments\ngaldr fetch \"url\" --no-download        # context only (Wikipedia + lyrics), no audio\ngaldr fetch \"url\" --censor             # sanitize explicit lyrics before saving\ngaldr doctor                           # inspect yt-dlp/media runtime health\ngaldr update-deps                      # upgrade yt-dlp reliability extras\ngaldr catalog                          # local analysis index (operator tooling)\ngaldr catalog --track NAME             # summary card for one track\n```\n\nFile v0.7.0:_meta.json\n\n{\n  \"ownerId\": \"kn7f8hn1v7tcp7n6rspveyf49s83cfdj\",\n  \"slug\": \"galdr\",\n  \"version\": \"0.7.0\",\n  \"publishedAt\": 1787157586911\n}\n\nFile v0.7.0:references/metrics.md\n\n# galdr Metric Reference\n\nAll metrics come from `report.json` and the perception/harmony/melody/overtone stream files in `analysis/<slug>/`.\n\n---\n\n## Pattern (`pattern`)\n\n**Range:** 0.0–1.0\n**What it is:** How reliably the music keeps its pattern intact. High pattern means the listener can trust the structure: the pulse, texture, and energy are not suddenly breaking away.\n\n**How it is calculated:** `pattern = 1.0 - disruption`. Disruption is a weighted blend of beat disruption (`40%`), spectral disruption (`35%`), and energy disruption (`25%`). Beat disruption catches missing or off-time expected beats; spectral disruption catches sudden timbral change above local context; energy disruption catches loudness jumps/drops above local trend.\n\n| Value | Meaning |\n|-------|---------|\n| 0.96–1.0 | Exceptional hold. Listener rarely disrupted. Ritual, minimalist, or tightly composed. |\n| 0.90–0.96 | Strong hold. Some variation but listener remains locked. Most engaging tracks. |\n| 0.80–0.90 | Moderate disruption. Energy varies meaningfully. |\n| <0.80 | Frequent disruption. Chaotic, experimental, or fragmentary. |\n\n**Pattern breaks** are the moments where pattern drops suddenly. Check `pattern_breaks` in report.json for timestamps, intensity, and component breakdown (`beat`, `spectral`, `energy`). Those components tell you whether the break is rhythmic, textural, dynamic, or compound.\n\n---\n\n## Attention (`attention`, `mean_attention`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly attention is being carried forward by the track. Not speed, loudness, or quality — grip. High attention means the music keeps the listener coupled even through quiet or sparse passages.\n\n**How it is calculated:** rolling beat regularity multiplied by beat density over an 8-second window. Regular intervals with enough beat evidence produce high attention; sparse or irregular beat evidence lowers it.\n\n| Value | Meaning |\n|-------|---------|\n| >0.90 | Rare sustained pull. Track barely lets listener breathe. |\n| 0.80–0.90 | Strong. Most engaging passages. |\n| 0.60–0.80 | Fluctuating. Energy ebbs and flows. |\n| <0.60 | Low continuity. Listener may disengage. |\n\nAfter a silence, attention re-locking above 0.93 signals the listener has been re-engaged. Multiple re-lock events with deepening silences can indicate structured withdrawal.\n\n---\n\n## Pulse (`pulse`)\n\n**Range:** 0.0–1.0\n**What it is:** How steady the underlying pulse feels. Orthogonal to metric complexity — a 7/8 piece can have perfect pulse stability if the body can still trust where the beat lives.\n\n| Value | Meaning |\n|-------|---------|\n| >0.96 | Clockwork. Ritual, electronic, or highly disciplined performance. |\n| 0.90–0.96 | Tight but human. Most performed music. |\n| 0.80–0.90 | Loose. Jazz feel, rubato, or intentional groove. |\n| <0.80 | Irregular. Experimental or very free. |\n\nHigh pulse + complex time signature (5/8, 7/8) = metric complexity is orthogonal to pulse stability.\n\n---\n\n## Surface balance (`surface_balance`, `mean_surface_balance`)\n\n**Range:** -1.0 to 1.0\n**What it is:** Where the track's weight sits between sustained harmonic sound and percussive impact. Negative values feel more tonal, vocal, droning, or atmospheric; positive values feel more struck, rhythmic, attack-heavy, or drum-forward.\n\n**How it is calculated:** harmonic/percussive source separation energy, smoothed into the perception stream. Very low total energy is treated as neutral so silence does not pretend to have a surface-balance claim.\n\n`surface_evidence` carries the local evidence behind the reading: roughness, noise density, transient attack, sustain/drone, band pressure, surface motion, punch, band weights, and brightness tilt.\n\n| Value | Meaning |\n|-------|---------|\n| < -0.5 | Strongly harmonic. Warm, tonal, sustained. Choirs, strings, pads. |\n| -0.5 to -0.2 | Harmonic dominant with surface detail. |\n| -0.2 to 0.2 | Balanced. Mixed character. |\n| 0.2 to 0.5 | Percussive with harmonic content. |\n| > 0.5 | Strongly percussive. Drum-forward, rhythmic emphasis. |\n\nDeepening negative surface balance across a track = harmonic weight increasing (dissolution, closing, ending accumulation).\n\n---\n\n## Pressure / Heard Pressure (`pressure`, `pressure_state`, pressure summary percentages)\n\n**Shape:** Stream fields plus three summary percentages — building / releasing / sustaining — summing to 100%.\n**What it is:** The heard-pressure shape of the track. Pressure is derived from short-term EBU R128/LUFS loudness rather than raw RMS energy so it tracks whether pressure comes forward, holds, or withdraws.\n\n**How it is calculated:** short-term LUFS is smoothed over 20 seconds, differenced, and normalized into a pressure-motion curve. Positive values build, negative values release, near-zero values sustain.\n\nStream fields:\n- `pressure` — normalized pressure movement; positive builds, negative releases, near-zero sustains\n- `pressure_state` — `building`, `releasing`, `sustaining`, or `silence`\n- `loudness_lufs` — short-term loudness evidence; use for debugging/comparison, not prose\n- `pressure_lufs_delta` — short-term pressure delta evidence\n- `loudness_silence` — loudness-floor silence marker\n\n| Pattern | Meaning |\n|---------|---------|\n| ~33/33/33 | Equilibrium. Pressure gives and takes evenly. |\n| Heavy building (>45%) | Accumulating track. Pressure keeps coming forward. |\n| Heavy releasing (>45%) | Withdrawal dominates, even if the track still feels held. |\n| Near-zero sustain (<10%) | No held pressure — constant motion up or down. |\n| Heavy sustain (>40%) | Stable hold. The music keeps the listener coupled instead of continually climbing or falling. |\n\nTranslation rule: do not write raw LUFS values in experience prose. Write what they mean: pressure comes forward, fills the room, holds, loosens, drops away, empties, or stops carrying attention. LUFS belongs in regression notes and debugging.\n\nNear-symmetry between building and releasing indicates the track takes exactly as much as it gives — rare and structurally notable.\n\n---\n\n## Pitch grid (`mean_pitch_grid`)\n\n**Range:** 0.0–1.0\n**What it is:** How cleanly the harmony sits inside familiar equal-tempered pitch space. Higher values feel centered, resolved, and conventionally tuned; lower values can feel bent, smeared, folk-natural, microtonal, or intentionally outside the grid.\n\n**How it is calculated:** concentration of chroma energy across equal-tempered pitch classes.\n\nDo not read low pitch_grid as a defect by itself. Some traditions deliberately live between the standard pitch bins. Treat it as evidence about tuning world, not as a quality score.\n\n---\n\n## Interval coherence (`mean_interval_coherence`)\n\n**Range:** 0.0–1.0\n**What it is:** How concentrated the pitch content is around simple, stable harmonic relationships. Higher values feel fused, settled, and easy for the ear to organize; lower values feel more spread, complex, or harmonically ambiguous.\n\n**How it is calculated:** active chroma pitch-class pairs are scored against simple just-intonation interval relationships, weighted by chroma energy. This is harmony-side evidence. It describes pitch-class organization, not the raw overtone spectrum.\n\n---\n\n## Harmonic pull (`mean_harmonic_pull`)\n\n**Range:** 0.0–1.0\n**What it is:** How much the harmony is pulling, shifting, or refusing to settle over time. High values feel like motion, pressure, searching, or harmonic unease; low values feel anchored, suspended, static, or resolved.\n\n**How it is calculated:** velocity through smoothed tonnetz space, normalized across the track.\n\n| Value | Meaning |\n|-------|---------|\n| <0.25 | Consonant, settled. Easy listening, tonal resolution. |\n| 0.25–0.40 | Mild tension. Character without instability. |\n| 0.40–0.55 | Significant tension. Unresolved, complex harmonically. |\n| >0.55 | High dissonance. Deliberately unsettled. |\n\nCatalog note: the highest cataloged tension in the local reference set is 0.421.\n\n---\n\n## Chroma motion (`mean_chroma_motion`)\n\n**Range:** 0.0–1.0\n**What it is:** How quickly the harmonic color changes from one moment to the next. High values mean the harmonic surface is restless or actively turning; low values mean the color is steady, droning, or slowly evolving.\n\n**How it is calculated:** cosine distance between adjacent smoothed chroma frames, averaged in a local window and normalized.\n\n---\n\n## Tonal anchor (`mean_tonal_anchor`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly the current window stays anchored to its tonal center. High values feel grounded or centered; low values feel wandering, suspended, or harmonically diffuse.\n\n**How it is calculated:** Krumhansl-Kessler key profile correlation identifies a local key/root, then tonal stability measures how dominant that tonic pitch class is in the local chroma profile.\n\n---\n\n## Major/Minor Balance (`mean_major_minor`)\n\n**Range:** -1.0 to 1.0\n**What it is:** Whether the harmony leans dark/minor, bright/major, or stays between them. Negative values lean minor; positive values lean major; near-zero can mean modal ambiguity, mixture, or neither color dominating.\n\n**How it is calculated:** after local key/root detection, compares chroma energy at the major-third and minor-third pitch classes.\n\n---\n\n## Overtone fit (`mean_overtone_fit`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly the sound itself locks onto natural overtone relationships. High values feel pure, fused, bell-like, vocal, or resonant; low values feel noisier, rougher, more inharmonic, or more textural.\n\n**How it is calculated:** detected overtone partials are compared with ideal harmonic-series positions around the detected fundamental. This is overtone-side evidence. It describes spectral structure around the detected fundamental, not the chord progression.\n\n---\n\n## Overtone density (`mean_overtone_density`)\n\n**Range:** 0.0–1.0\n**What it is:** How many upper harmonics are present in the sound. High richness feels dense, bright, saturated, or full of upper partials; low richness feels simpler, darker, hollower, or more sine-like.\n\n**How it is calculated:** relative energy across detected upper partials.\n\n---\n\n## Inharmonicity (`mean_inharmonicity`)\n\n**Unit:** cents\n**What it is:** How far the overtones drift from ideal harmonic positions. Higher values feel rougher, noisier, more metallic, more bell-like in the unstable sense, or more textural. Lower values feel cleaner and more tonally fused.\n\n**How it is calculated:** average cent deviation between detected partials and ideal harmonic-series positions.\n\n---\n\n## Foreground line (`mean_foreground_line`)\n\n**Range:** 0.0–1.0\n**What it is:** How much foreground pitched material is carrying the track. The field is still named `mean_foreground_line` for compatibility, but read it as pitch-extraction confidence, not proof of a literal singer. High values mean a voice or lead pitch is structurally present; low values mean the voice/lead is absent, textural, buried, unpitched, or not the main carrier.\n\n**How it is calculated:** pYIN voiced probability over time, smoothed into the melody stream.\n\n| Value | Meaning |\n|-------|---------|\n| <0.05 | Minimal / drone-like. Voice is texture, not foreground. |\n| 0.05–0.15 | Voice present but mixed into the ensemble. |\n| 0.15–0.30 | Clear vocal lead. |\n| >0.30 | Voice dominates the mix. |\n\nLow foreground pitch evidence + deeply negative surface balance = pure harmonic surface. High foreground pitch evidence + descending melody = voice/lead-forward with falling contour (often resignation/descent arc).\n\n---\n\n## Silences\n\n**Structure:** Each silence has `start`, `end`, `duration`, `depth_db`, `recovery_attention`.\n\n| Depth | Meaning |\n|-------|---------|\n| -30 to -45 dB | Soft silence. Still some signal present. |\n| -45 to -60 dB | Clear silence. Listener attention sharpens. |\n| -60 to -75 dB | Deep silence. Structural weight. |\n| < -75 dB | Near-absolute. Very deliberate. |\n\n`recovery_attention` after silence: if >0.93, listener re-locked. If <0.80, attention didn't recover — track may not re-engage.\n\nMultiple silences with deepening depth and consistent re-lock = structured withdrawal (dissolution pattern). Compressing silence intervals toward end = listener being walked to the edge.\n\n---\n\n## Melody Contour\n\n**Shape:** Percentage ascending / holding / descending.\n**What it is:** The average shape of the foreground pitched line: whether it rises, falls, or holds its ground over time.\n\nHeavily holding (>60%) with high foreground pitch evidence = melody uses repetition or narrow range as expressive strategy — not a limitation.\nHeavily descending + resigned lyrics = structural confirmation of emotional content.\nAscending contour during climax = conventional arc. Descending during what sounds like climax = tension through contradiction.\n\n---\n\n## Metric Evidence Cheat Sheet\n\n| Metric | Primary evidence |\n|---|---|\n| `attention` | Beat regularity × beat density in rolling windows |\n| `pressure` / `pressure_state` | Short-term LUFS movement |\n| `pattern` | `1.0 - disruption`; disruption = beat + spectral + energy expectation failures |\n| `surface_balance` | Harmonic/percussive separated energy |\n| `pitch_grid` | Chroma concentration in equal-tempered pitch classes |\n| `interval_coherence` | Chroma interval relationships weighted by energy |\n| `harmonic_pull` | Tonnetz velocity |\n| `chroma_motion` | Cosine distance between adjacent chroma frames |\n| `tonal_anchor` | Dominance of detected tonic pitch class |\n| `major_minor` | Major-third vs minor-third chroma energy around detected root |\n| `overtone_fit` | Overtone partial alignment around detected fundamentals |\n| `overtone_density` | Upper-partial energy |\n| `inharmonicity` | Cent deviation from ideal harmonic partials |\n| `mean_foreground_line` | pYIN voiced probability; foreground pitch evidence |\n| `silences` | dB-floor intervals plus recovery attention |\n\n---\n\n## Pattern Breaks\n\nEach break has: `timestamp`, `intensity` (0–1), `beat` / `spectral` / `energy` component scores.\n\n**Intensity interpretation:**\n- < 0.3: Subtle shift. Texture change rather than structural break.\n- 0.3–0.6: Clear break. Listener notices.\n- > 0.6: Significant disruption. Track changes character.\n\n**Component breakdown:**\n- High `beat` + low others = rhythmic disruption only\n- High `spectral` = timbral/textural shift\n- High `energy` = dynamic change\n\n**Distribution:**\n- Clustered at end (final 10%) = planned release\n- Distributed across track = varied, episodic structure\n- Single large break = pivot point; track has two halves\n\nFile v0.7.0:skill-card.md\n\n## Description:\n\nOpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[sellemain](https://clawhub.ai/user/sellemain)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and OpenClaw agent operators use this skill to analyze songs, music videos, or local audio into grounded listener-state evidence and listening-experience prompts. It helps agents extract structural moments, assemble ARC prompts, and avoid unsupported emotional or lyrical claims.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill depends on a separate galdr CLI and media/model integrations that may process local audio, lyrics, background context, or prompts outside the skill artifact.\n\nMitigation: Install the CLI only from trusted sources, understand configured data flows before using private audio, and review assembled prompts before sending them to another model.\n\nRisk: Generated listening-experience prose can overstate emotional intent or treat structural metrics as proof of private meaning.\n\nMitigation: Use the metrics as evidence, walk the track through time, and keep claims bounded to audible structure rather than inferred intent.\n\nRisk: Fetching or analyzing online music can raise rights and policy issues for copyrighted media.\n\nMitigation: Use downloads and analysis only when the operator has appropriate rights or context, and prefer local or authorized media when rights are unclear.\n\n## Reference(s):\n\n- [Galdr ClawHub release](https://clawhub.ai/sellemain/skills/galdr)\n- [Galdr metric reference](references/metrics.md)\n- [Galdr PyPI package](https://pypi.org/project/galdr/)\n- [Galdr source repository](https://github.com/sellemain/galdr)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and references to generated JSON analysis files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Primary outputs guide the agent to run galdr, inspect time-ordered listener-state traces, and assemble or review ARC prompts before optional model handoff.]\n\n## Skill Version(s):\n\n0.7.0 (source: server release metadata; artifact frontmatter says 0.6.0)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v0.6.1: 4 files, 11915 bytes\n\nFiles: references/metrics.md (14616b), skill-card.md (3102b), SKILL.md (10486b), _meta.json (124b)\n\nFile v0.6.1:SKILL.md\n\n---\nname: galdr\ndescription: OpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure. Use when asked to analyze a song, explain what makes a track work structurally, generate a listening experience, or extract video frames from a music video.\nversion: \"0.6.0\"\nauthor: Sellemain\nlicense: MIT\nplatforms: [linux, macos]\n---\n# galdr\n\nUse this skill when an OpenClaw agent needs to analyze music from a YouTube URL or local audio file and produce a grounded listening-experience prompt from measurable audio structure.\n\ngaldr is a music perception CLI for AI agents. Its default workflow is **ARC**: analyze a track into time-ordered listener-state traces, then assemble those traces into a prompt for grounded listening-experience prose. The metrics are evidence. The ARC prompt is the main user-facing output.\n\n## Important: skill vs CLI\n\nCurrent OpenClaw CLI install command:\n\n```bash\nopenclaw skills install galdr\n```\n\nClawHub may display an owner-qualified command such as `openclaw skills install @sellemain/galdr`. As of OpenClaw `2026.6.8`, the released CLI expects the bare skill slug `galdr`.\n\nInstalling this skill teaches OpenClaw how to use galdr. It does **not** install the `galdr` command itself.\n\nThe PyPI wheel contains the runtime CLI/library and bundled prompt templates. The OpenClaw skill is distributed separately through ClawHub so agent instructions can stay a clean skill artifact instead of being installed as Python package data.\n\nBefore starting:\n\n```bash\ngaldr --version\n```\n\nIf missing, install the CLI from a trusted source:\n\n```bash\npip install galdr\n\n# or from source:\ngit clone https://github.com/sellemain/galdr.git\ncd galdr\npip install -e .\n```\n\nPreferred trusted sources:\n- PyPI: <https://pypi.org/project/galdr/>\n- Source: <https://github.com/sellemain/galdr>\n\nIf provenance matters, verify the PyPI metadata or install from the source repository before running it.\n\n## When to use this skill\n\nUse galdr when the user asks to:\n- analyze a song or music video\n- describe what makes a track work structurally\n- generate a grounded listening experience\n- extract frames around structural moments in a music video\n- create an evidence packet for another model to write from\n\nDo not use galdr for:\n- general music trivia\n- ordinary recommendation lists\n- purely lyrical interpretation without audio structure\n- pretending the metrics prove private emotional intent\n- downloading copyrighted audio unless the operator has appropriate rights/context\n\n## OpenClaw agent contract\n\nPrefer the ARC path unless the user explicitly asks for raw metrics, debugging, or agent-internal traces.\n\nDefault sequence:\n1. Fetch or listen to the track.\n2. Analyze it into listener-state traces.\n3. Assemble the ARC prompt with `--template arc --mode full`.\n4. Review the prompt.\n5. Write the listening experience yourself or pass the prompt to the requested model.\n\nThe stream is evidence. Walk the track through time before summarizing. Do not invent emotional claims that the structure does not support.\n\nUse the ARC prompt family when the user asks for a specific reading mode:\n\n```bash\ngaldr assemble my-track --template arc-family --lens sound --mode blind > sound.txt\ngaldr assemble my-track --template arc-family --lens dance --mode blind > dance.txt\ngaldr assemble my-track --template arc-family --lens meaning --mode full > meaning.txt\ngaldr assemble my-track --template arc-family --lens structure --mode blind > structure.txt\ngaldr assemble my-track --template arc-family --lens classical --mode blind > classical.txt\ngaldr assemble my-track --template arc-family --lens ritual --mode full > ritual.txt\n```\n\nLens guide:\n- `default` — general public listening page\n- `sound` — sound as physical shape, pressure, density, space, body, and motion\n- `dance` — movement contract: groove, repetition, build/drop, and bodily use\n- `structure` — compact mechanical/form witness\n- `meaning` — human situation carried by sound\n- `lyrics-study` — private lyric/music adapter fuel, not raw public prose\n- `classical` — instrumental/classical/large-form attention over time\n- `ritual` — private ritual reading with weak-fit boundary behavior\n\n## Core Workflows\n\n### YouTube URL → ARC prompt (most common)\n\n```bash\n# Step 1: fetch audio + context (slug auto-derived from title)\ngaldr fetch \"https://youtu.be/...\" --analyze\n\n# galdr prints the slug at the end:\n#   Slug : artist-song-title\n#   Next : galdr assemble artist-song-title --template arc --mode full\n\n# Step 2: assemble the prompt locally\ngaldr assemble artist-song-title --template arc --mode full > prompt.txt\n```\n\nOverride auto-derived metadata if needed:\n\n```bash\ngaldr fetch \"https://youtu.be/...\" --artist \"Oliver Anthony\" --title \"Rich Men North of Richmond\" --analyze\n```\n\nIf YouTube download behavior is flaky:\n\n```bash\ngaldr doctor\ngaldr update-deps\n```\n\n`galdr doctor` reports the active Python executable, yt-dlp command/version, ffmpeg/ffprobe, JavaScript runtimes, and impersonation support. `galdr update-deps` upgrades `yt-dlp[default,curl-cffi]` in the same Python environment galdr is using.\n\n### Local file → ARC prompt\n\n> The analysis command is `galdr listen`, not `galdr analyze`.\n\n```bash\ngaldr listen track.wav --name my-track\ngaldr assemble my-track --template arc --mode full > prompt.txt\n```\n\n### Raw second-by-second analysis (advanced)\n\nGaldr is strongest when read as a **time-ordered listener-state trace**. The stream is the primary evidence. Whole-track interpretation comes after walking the track through time.\n\nStart with:\n- `analysis/<slug>/<slug>_stream.json`\n- `analysis/<slug>/<slug>_perception.json`\n- `docs/PERCEPTION-MODEL.md`\n\nUseful extras:\n- `*_harmony_stream.json`\n- `*_melody_stream.json`\n- `*_overtone_stream.json`\n- `*_report.json`\n- `galdr assemble <slug> --mode blind`\n\nReading order:\n1. Read `PERCEPTION-MODEL.md` first.\n2. Treat `*_stream.json` as the main evidence surface.\n3. Walk the track in order.\n4. Mark transitions: silence, re-entry, pattern breaks, attention shifts, pressure-state changes, harmonic movement.\n5. Translate pressure fields into listening language: comes forward, holds, releases, empties. Do not quote LUFS values in experience prose.\n6. Only then compress upward into a larger interpretation.\n\nDo not:\n- jump straight to a whole-song mood summary\n- treat summary metrics as more important than the stream\n- ignore silence/re-entry structure\n- overclaim emotional certainty from structure alone\n- quote loudness/LUFS readings as if they were the experience\n\nMinimal recipe:\n\n```bash\ngaldr listen track.wav --name my-track\njq '.[0:12]' analysis/my-track/my-track_stream.json\njq '.summary' analysis/my-track/my-track_perception.json\ngaldr assemble my-track --mode blind > prompt.txt\n```\n\n### Send the ARC prompt to another model\n\nOnly do this if the operator explicitly wants model-written prose. Review the assembled ARC prompt before piping it to `claude`, `llm`, or any other external model endpoint.\n\n```bash\ngaldr assemble my-track --template arc --mode full | claude\ngaldr assemble my-track --template arc --mode full | llm\n```\n\n### Optional Python agent pattern\n\n```python\nimport subprocess, re\n\nfetch = subprocess.run(\n    [\"galdr\", \"fetch\", url, \"--analyze\"],\n    capture_output=True, text=True, check=True\n)\nslug = re.search(r\"Slug\\s*:\\s*(\\S+)\", fetch.stdout).group(1)\n\nprompt = subprocess.run(\n    [\"galdr\", \"assemble\", slug, \"--template\", \"arc\", \"--mode\", \"full\"],\n    capture_output=True, text=True, check=True\n).stdout\n\n# Review prompt before sending it to any external model endpoint.\n```\n\n### Mode and template flags\n\n| Mode | What's included |\n|------|----------------|\n| `full` (default) | metrics + lyrics + background + frames |\n| `lyrics` | metrics + lyrics |\n| `context` | metrics + background |\n| `blind` | metrics only (structural, no cultural context) |\n\n`--template arc` prepends the default listening-experience rules: tone, format, interpretation bounds, and the instruction to walk the track through time. `--template arc-family --lens <name>` uses the shared prompt-family base plus one deliberate reading lens. Omit templates only when you want a raw data block.\n\n## Interpreting galdr output\n\nARC is the default output path. The metrics exist to keep that prose grounded: use them as evidence for what changes, returns, releases, locks, or breaks over time.\n\nSee [references/metrics.md](references/metrics.md) for full metric reference.\n\n**Quick read:**\n- `pattern` near 1.0 → listener is locked; near 0 → constant disruption\n- `surface_balance` negative → harmonic dominant (warm, tonal); positive → percussive dominant\n- `pressure_state` and pressure summary percentages → heard-pressure shape across the track\n- Clustered `pattern_breaks` at the end → planned release; distributed → varied structure\n- `silence` depth below -60dB with re-lock above 0.93 attention → structured withdrawal/return\n\n## Writing ARC experience prose yourself\n\nWhen writing experience prose yourself from galdr evidence, prefer `galdr assemble <slug> --template arc --mode full`. If you are writing from raw assembled output without the template:\n- First-person listener perspective, present tense\n- Timestamps only at structural pivots: silences, pattern breaks, major energy shifts\n- Translate metrics; describe what they mean, do not quote numbers\n- LUFS/pressure values are evidence, not prose; write “pressure comes forward / holds / releases / empties”\n- Body anchors such as chest, jaw, sternum sparingly; two or three for the whole piece\n- End at the final sound event; no aftermath, no reflection\n- Around 800 words, no section headers\n\n## Other commands\n\n```bash\ngaldr frames slug                      # extract + describe video frames at structural moments\ngaldr fetch \"url\" --no-download        # context only (Wikipedia + lyrics), no audio\ngaldr fetch \"url\" --censor             # sanitize explicit lyrics before saving\ngaldr doctor                           # inspect yt-dlp/media runtime health\ngaldr update-deps                      # upgrade yt-dlp reliability extras\ngaldr catalog                          # local analysis index (operator tooling)\ngaldr catalog --track NAME             # summary card for one track\n```\n\nFile v0.6.1:_meta.json\n\n{\n  \"ownerId\": \"kn7f8hn1v7tcp7n6rspveyf49s83cfdj\",\n  \"slug\": \"galdr\",\n  \"version\": \"0.6.1\",\n  \"publishedAt\": 1783987314967\n}\n\nFile v0.6.1:references/metrics.md\n\n# galdr Metric Reference\n\nAll metrics come from `report.json` and the perception/harmony/melody/overtone stream files in `analysis/<slug>/`.\n\n---\n\n## Pattern (`pattern`)\n\n**Range:** 0.0–1.0\n**What it is:** How reliably the music keeps its pattern intact. High pattern means the listener can trust the structure: the pulse, texture, and energy are not suddenly breaking away.\n\n**How it is calculated:** `pattern = 1.0 - disruption`. Disruption is a weighted blend of beat disruption (`40%`), spectral disruption (`35%`), and energy disruption (`25%`). Beat disruption catches missing or off-time expected beats; spectral disruption catches sudden timbral change above local context; energy disruption catches loudness jumps/drops above local trend.\n\n| Value | Meaning |\n|-------|---------|\n| 0.96–1.0 | Exceptional hold. Listener rarely disrupted. Ritual, minimalist, or tightly composed. |\n| 0.90–0.96 | Strong hold. Some variation but listener remains locked. Most engaging tracks. |\n| 0.80–0.90 | Moderate disruption. Energy varies meaningfully. |\n| <0.80 | Frequent disruption. Chaotic, experimental, or fragmentary. |\n\n**Pattern breaks** are the moments where pattern drops suddenly. Check `pattern_breaks` in report.json for timestamps, intensity, and component breakdown (`beat`, `spectral`, `energy`). Those components tell you whether the break is rhythmic, textural, dynamic, or compound.\n\n---\n\n## Attention (`attention`, `mean_attention`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly attention is being carried forward by the track. Not speed, loudness, or quality — grip. High attention means the music keeps the listener coupled even through quiet or sparse passages.\n\n**How it is calculated:** rolling beat regularity multiplied by beat density over an 8-second window. Regular intervals with enough beat evidence produce high attention; sparse or irregular beat evidence lowers it.\n\n| Value | Meaning |\n|-------|---------|\n| >0.90 | Rare sustained pull. Track barely lets listener breathe. |\n| 0.80–0.90 | Strong. Most engaging passages. |\n| 0.60–0.80 | Fluctuating. Energy ebbs and flows. |\n| <0.60 | Low continuity. Listener may disengage. |\n\nAfter a silence, attention re-locking above 0.93 signals the listener has been re-engaged. Multiple re-lock events with deepening silences can indicate structured withdrawal.\n\n---\n\n## Pulse (`pulse`)\n\n**Range:** 0.0–1.0\n**What it is:** How steady the underlying pulse feels. Orthogonal to metric complexity — a 7/8 piece can have perfect pulse stability if the body can still trust where the beat lives.\n\n| Value | Meaning |\n|-------|---------|\n| >0.96 | Clockwork. Ritual, electronic, or highly disciplined performance. |\n| 0.90–0.96 | Tight but human. Most performed music. |\n| 0.80–0.90 | Loose. Jazz feel, rubato, or intentional groove. |\n| <0.80 | Irregular. Experimental or very free. |\n\nHigh pulse + complex time signature (5/8, 7/8) = metric complexity is orthogonal to pulse stability.\n\n---\n\n## Surface balance (`surface_balance`, `mean_surface_balance`)\n\n**Range:** -1.0 to 1.0\n**What it is:** Where the track's weight sits between sustained harmonic sound and percussive impact. Negative values feel more tonal, vocal, droning, or atmospheric; positive values feel more struck, rhythmic, attack-heavy, or drum-forward.\n\n**How it is calculated:** harmonic/percussive source separation energy, smoothed into the perception stream. Very low total energy is treated as neutral so silence does not pretend to have a surface-balance claim.\n\n`surface_evidence` carries the local evidence behind the reading: roughness, noise density, transient attack, sustain/drone, band pressure, surface motion, punch, band weights, and brightness tilt.\n\n| Value | Meaning |\n|-------|---------|\n| < -0.5 | Strongly harmonic. Warm, tonal, sustained. Choirs, strings, pads. |\n| -0.5 to -0.2 | Harmonic dominant with surface detail. |\n| -0.2 to 0.2 | Balanced. Mixed character. |\n| 0.2 to 0.5 | Percussive with harmonic content. |\n| > 0.5 | Strongly percussive. Drum-forward, rhythmic emphasis. |\n\nDeepening negative surface balance across a track = harmonic weight increasing (dissolution, closing, ending accumulation).\n\n---\n\n## Pressure / Heard Pressure (`pressure`, `pressure_state`, pressure summary percentages)\n\n**Shape:** Stream fields plus three summary percentages — building / releasing / sustaining — summing to 100%.\n**What it is:** The heard-pressure shape of the track. Pressure is derived from short-term EBU R128/LUFS loudness rather than raw RMS energy so it tracks whether pressure comes forward, holds, or withdraws.\n\n**How it is calculated:** short-term LUFS is smoothed over 20 seconds, differenced, and normalized into a pressure-motion curve. Positive values build, negative values release, near-zero values sustain.\n\nStream fields:\n- `pressure` — normalized pressure movement; positive builds, negative releases, near-zero sustains\n- `pressure_state` — `building`, `releasing`, `sustaining`, or `silence`\n- `loudness_lufs` — short-term loudness evidence; use for debugging/comparison, not prose\n- `pressure_lufs_delta` — short-term pressure delta evidence\n- `loudness_silence` — loudness-floor silence marker\n\n| Pattern | Meaning |\n|---------|---------|\n| ~33/33/33 | Equilibrium. Pressure gives and takes evenly. |\n| Heavy building (>45%) | Accumulating track. Pressure keeps coming forward. |\n| Heavy releasing (>45%) | Withdrawal dominates, even if the track still feels held. |\n| Near-zero sustain (<10%) | No held pressure — constant motion up or down. |\n| Heavy sustain (>40%) | Stable hold. The music keeps the listener coupled instead of continually climbing or falling. |\n\nTranslation rule: do not write raw LUFS values in experience prose. Write what they mean: pressure comes forward, fills the room, holds, loosens, drops away, empties, or stops carrying attention. LUFS belongs in regression notes and debugging.\n\nNear-symmetry between building and releasing indicates the track takes exactly as much as it gives — rare and structurally notable.\n\n---\n\n## Pitch grid (`mean_pitch_grid`)\n\n**Range:** 0.0–1.0\n**What it is:** How cleanly the harmony sits inside familiar equal-tempered pitch space. Higher values feel centered, resolved, and conventionally tuned; lower values can feel bent, smeared, folk-natural, microtonal, or intentionally outside the grid.\n\n**How it is calculated:** concentration of chroma energy across equal-tempered pitch classes.\n\nDo not read low pitch_grid as a defect by itself. Some traditions deliberately live between the standard pitch bins. Treat it as evidence about tuning world, not as a quality score.\n\n---\n\n## Interval coherence (`mean_interval_coherence`)\n\n**Range:** 0.0–1.0\n**What it is:** How concentrated the pitch content is around simple, stable harmonic relationships. Higher values feel fused, settled, and easy for the ear to organize; lower values feel more spread, complex, or harmonically ambiguous.\n\n**How it is calculated:** active chroma pitch-class pairs are scored against simple just-intonation interval relationships, weighted by chroma energy. This is harmony-side evidence. It describes pitch-class organization, not the raw overtone spectrum.\n\n---\n\n## Harmonic pull (`mean_harmonic_pull`)\n\n**Range:** 0.0–1.0\n**What it is:** How much the harmony is pulling, shifting, or refusing to settle over time. High values feel like motion, pressure, searching, or harmonic unease; low values feel anchored, suspended, static, or resolved.\n\n**How it is calculated:** velocity through smoothed tonnetz space, normalized across the track.\n\n| Value | Meaning |\n|-------|---------|\n| <0.25 | Consonant, settled. Easy listening, tonal resolution. |\n| 0.25–0.40 | Mild tension. Character without instability. |\n| 0.40–0.55 | Significant tension. Unresolved, complex harmonically. |\n| >0.55 | High dissonance. Deliberately unsettled. |\n\nCatalog note: the highest cataloged tension in the local reference set is 0.421.\n\n---\n\n## Chroma motion (`mean_chroma_motion`)\n\n**Range:** 0.0–1.0\n**What it is:** How quickly the harmonic color changes from one moment to the next. High values mean the harmonic surface is restless or actively turning; low values mean the color is steady, droning, or slowly evolving.\n\n**How it is calculated:** cosine distance between adjacent smoothed chroma frames, averaged in a local window and normalized.\n\n---\n\n## Tonal anchor (`mean_tonal_anchor`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly the current window stays anchored to its tonal center. High values feel grounded or centered; low values feel wandering, suspended, or harmonically diffuse.\n\n**How it is calculated:** Krumhansl-Kessler key profile correlation identifies a local key/root, then tonal stability measures how dominant that tonic pitch class is in the local chroma profile.\n\n---\n\n## Major/Minor Balance (`mean_major_minor`)\n\n**Range:** -1.0 to 1.0\n**What it is:** Whether the harmony leans dark/minor, bright/major, or stays between them. Negative values lean minor; positive values lean major; near-zero can mean modal ambiguity, mixture, or neither color dominating.\n\n**How it is calculated:** after local key/root detection, compares chroma energy at the major-third and minor-third pitch classes.\n\n---\n\n## Overtone fit (`mean_overtone_fit`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly the sound itself locks onto natural overtone relationships. High values feel pure, fused, bell-like, vocal, or resonant; low values feel noisier, rougher, more inharmonic, or more textural.\n\n**How it is calculated:** detected overtone partials are compared with ideal harmonic-series positions around the detected fundamental. This is overtone-side evidence. It describes spectral structure around the detected fundamental, not the chord progression.\n\n---\n\n## Overtone density (`mean_overtone_density`)\n\n**Range:** 0.0–1.0\n**What it is:** How many upper harmonics are present in the sound. High richness feels dense, bright, saturated, or full of upper partials; low richness feels simpler, darker, hollower, or more sine-like.\n\n**How it is calculated:** relative energy across detected upper partials.\n\n---\n\n## Inharmonicity (`mean_inharmonicity`)\n\n**Unit:** cents\n**What it is:** How far the overtones drift from ideal harmonic positions. Higher values feel rougher, noisier, more metallic, more bell-like in the unstable sense, or more textural. Lower values feel cleaner and more tonally fused.\n\n**How it is calculated:** average cent deviation between detected partials and ideal harmonic-series positions.\n\n---\n\n## Foreground line (`mean_foreground_line`)\n\n**Range:** 0.0–1.0\n**What it is:** How much foreground pitched material is carrying the track. The field is still named `mean_foreground_line` for compatibility, but read it as pitch-extraction confidence, not proof of a literal singer. High values mean a voice or lead pitch is structurally present; low values mean the voice/lead is absent, textural, buried, unpitched, or not the main carrier.\n\n**How it is calculated:** pYIN voiced probability over time, smoothed into the melody stream.\n\n| Value | Meaning |\n|-------|---------|\n| <0.05 | Minimal / drone-like. Voice is texture, not foreground. |\n| 0.05–0.15 | Voice present but mixed into the ensemble. |\n| 0.15–0.30 | Clear vocal lead. |\n| >0.30 | Voice dominates the mix. |\n\nLow foreground pitch evidence + deeply negative surface balance = pure harmonic surface. High foreground pitch evidence + descending melody = voice/lead-forward with falling contour (often resignation/descent arc).\n\n---\n\n## Silences\n\n**Structure:** Each silence has `start`, `end`, `duration`, `depth_db`, `recovery_attention`.\n\n| Depth | Meaning |\n|-------|---------|\n| -30 to -45 dB | Soft silence. Still some signal present. |\n| -45 to -60 dB | Clear silence. Listener attention sharpens. |\n| -60 to -75 dB | Deep silence. Structural weight. |\n| < -75 dB | Near-absolute. Very deliberate. |\n\n`recovery_attention` after silence: if >0.93, listener re-locked. If <0.80, attention didn't recover — track may not re-engage.\n\nMultiple silences with deepening depth and consistent re-lock = structured withdrawal (dissolution pattern). Compressing silence intervals toward end = listener being walked to the edge.\n\n---\n\n## Melody Contour\n\n**Shape:** Percentage ascending / holding / descending.\n**What it is:** The average shape of the foreground pitched line: whether it rises, falls, or holds its ground over time.\n\nHeavily holding (>60%) with high foreground pitch evidence = melody uses repetition or narrow range as expressive strategy — not a limitation.\nHeavily descending + resigned lyrics = structural confirmation of emotional content.\nAscending contour during climax = conventional arc. Descending during what sounds like climax = tension through contradiction.\n\n---\n\n## Metric Evidence Cheat Sheet\n\n| Metric | Primary evidence |\n|---|---|\n| `attention` | Beat regularity × beat density in rolling windows |\n| `pressure` / `pressure_state` | Short-term LUFS movement |\n| `pattern` | `1.0 - disruption`; disruption = beat + spectral + energy expectation failures |\n| `surface_balance` | Harmonic/percussive separated energy |\n| `pitch_grid` | Chroma concentration in equal-tempered pitch classes |\n| `interval_coherence` | Chroma interval relationships weighted by energy |\n| `harmonic_pull` | Tonnetz velocity |\n| `chroma_motion` | Cosine distance between adjacent chroma frames |\n| `tonal_anchor` | Dominance of detected tonic pitch class |\n| `major_minor` | Major-third vs minor-third chroma energy around detected root |\n| `overtone_fit` | Overtone partial alignment around detected fundamentals |\n| `overtone_density` | Upper-partial energy |\n| `inharmonicity` | Cent deviation from ideal harmonic partials |\n| `mean_foreground_line` | pYIN voiced probability; foreground pitch evidence |\n| `silences` | dB-floor intervals plus recovery attention |\n\n---\n\n## Pattern Breaks\n\nEach break has: `timestamp`, `intensity` (0–1), `beat` / `spectral` / `energy` component scores.\n\n**Intensity interpretation:**\n- < 0.3: Subtle shift. Texture change rather than structural break.\n- 0.3–0.6: Clear break. Listener notices.\n- > 0.6: Significant disruption. Track changes character.\n\n**Component breakdown:**\n- High `beat` + low others = rhythmic disruption only\n- High `spectral` = timbral/textural shift\n- High `energy` = dynamic change\n\n**Distribution:**\n- Clustered at end (final 10%) = planned release\n- Distributed across track = varied, episodic structure\n- Single large break = pivot point; track has two halves\n\nFile v0.6.1:skill-card.md\n\n## Description: <br>\nOpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[sellemain](https://clawhub.ai/user/sellemain) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and external users use Galdr to analyze music from YouTube URLs or local audio files, assemble grounded ARC listening-experience prompts, and extract structural evidence such as listener-state traces or video frames. It is best suited for song analysis, structural listening prose, and evidence packets for downstream model writing. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: YouTube URLs, downloaded context, lyrics, frame descriptions, and assembled prompts can include information that may be shared with third-party services when fetch workflows or model CLI piping are used. <br>\nMitigation: Review assembled prompts before sending them to external model endpoints, and prefer local files or blind/metrics-only modes when less contextual data should be included. <br>\nRisk: The skill depends on the separate galdr CLI and media tooling, so installation and execution inherit the trust and runtime risks of that CLI and its dependencies. <br>\nMitigation: Install galdr only from trusted sources, verify PyPI metadata or the listed project repository when provenance matters, and run diagnostic commands before use. <br>\nRisk: Downloading copyrighted audio can create rights or policy issues when the operator lacks appropriate authorization. <br>\nMitigation: Use local files or fetch only content where the operator has appropriate rights or context, and avoid using the skill for unauthorized downloading. <br>\n\n\n## Reference(s): <br>\n- [Galdr Metric Reference](references/metrics.md) <br>\n- [Galdr PyPI Project](https://pypi.org/project/galdr/) <br>\n- [Galdr Project Repository Listed By Skill](https://github.com/sellemain/galdr) <br>\n- [ClawHub Skill Page](https://clawhub.ai/sellemain/skills/galdr) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, code, configuration, guidance] <br>\n**Output Format:** [Markdown with inline shell and Python code blocks] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces prompts and guidance for running the separate galdr CLI; generated prompts may include metrics, lyrics, background context, or frame descriptions depending on mode.] <br>\n\n## Skill Version(s): <br>\n0.6.1 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.6.0: 4 files, 11767 bytes\n\nFiles: references/metrics.md (14616b), skill-card.md (2617b), SKILL.md (10610b), _meta.json (124b)\n\nFile v0.6.0:SKILL.md\n\n---\nname: galdr\ndescription: OpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure. Use when asked to analyze a song, explain what makes a track work structurally, generate a listening experience, compare tracks, or extract video frames from a music video.\nversion: \"0.6.0\"\nauthor: Sellemain\nlicense: MIT\nplatforms: [linux, macos]\n---\n# galdr\n\nUse this skill when an OpenClaw agent needs to analyze music from a YouTube URL or local audio file and produce a grounded listening-experience prompt from measurable audio structure.\n\ngaldr is a music perception CLI for AI agents. Its default workflow is **ARC**: analyze a track into time-ordered listener-state traces, then assemble those traces into a prompt for grounded listening-experience prose. The metrics are evidence. The ARC prompt is the main user-facing output.\n\n## Important: skill vs CLI\n\nCurrent OpenClaw CLI install command:\n\n```bash\nopenclaw skills install galdr\n```\n\nClawHub may display an owner-qualified command such as `openclaw skills install @sellemain/galdr`. As of OpenClaw `2026.6.8`, the released CLI expects the bare skill slug `galdr`.\n\nInstalling this skill teaches OpenClaw how to use galdr. It does **not** install the `galdr` command itself.\n\nThe PyPI wheel contains the runtime CLI/library and bundled prompt templates. The OpenClaw skill is distributed separately through ClawHub so agent instructions can stay a clean skill artifact instead of being installed as Python package data.\n\nBefore starting:\n\n```bash\ngaldr --version\n```\n\nIf missing, install the CLI from a trusted source:\n\n```bash\npip install galdr\n\n# or from source:\ngit clone https://github.com/sellemain/galdr.git\ncd galdr\npip install -e .\n```\n\nPreferred trusted sources:\n- PyPI: <https://pypi.org/project/galdr/>\n- Source: <https://github.com/sellemain/galdr>\n\nIf provenance matters, verify the PyPI metadata or install from the source repository before running it.\n\n## When to use this skill\n\nUse galdr when the user asks to:\n- analyze a song or music video\n- describe what makes a track work structurally\n- generate a grounded listening experience\n- compare two tracks\n- extract frames around structural moments in a music video\n- create an evidence packet for another model to write from\n\nDo not use galdr for:\n- general music trivia\n- ordinary recommendation lists\n- purely lyrical interpretation without audio structure\n- pretending the metrics prove private emotional intent\n- downloading copyrighted audio unless the operator has appropriate rights/context\n\n## OpenClaw agent contract\n\nPrefer the ARC path unless the user explicitly asks for raw metrics, comparison, debugging, or agent-internal traces.\n\nDefault sequence:\n1. Fetch or listen to the track.\n2. Analyze it into listener-state traces.\n3. Assemble the ARC prompt with `--template arc --mode full`.\n4. Review the prompt.\n5. Write the listening experience yourself or pass the prompt to the requested model.\n\nThe stream is evidence. Walk the track through time before summarizing. Do not invent emotional claims that the structure does not support.\n\nUse the ARC prompt family when the user asks for a specific reading mode:\n\n```bash\ngaldr assemble my-track --template arc-family --lens sound --mode blind > sound.txt\ngaldr assemble my-track --template arc-family --lens dancefloor --mode blind > dancefloor.txt\ngaldr assemble my-track --template arc-family --lens meaning --mode full > meaning.txt\ngaldr assemble my-track --template arc-family --lens structure --mode blind > structure.txt\ngaldr assemble my-track --template arc-family --lens classical --mode blind > classical.txt\ngaldr assemble my-track --template arc-family --lens ritual --mode full > ritual.txt\n```\n\nLens guide:\n- `default` — general public listening page\n- `sound` — sound as physical shape, pressure, density, space, body, and motion\n- `dancefloor` — movement contract: groove, repetition, build/drop, and bodily use\n- `structure` — compact mechanical/form witness\n- `meaning` — human situation carried by sound\n- `lyrics-study` — private lyric/music adapter fuel, not raw public prose\n- `classical` — instrumental/classical/large-form attention over time\n- `ritual` — private ritual reading with weak-fit boundary behavior\n\n## Core Workflows\n\n### YouTube URL → ARC prompt (most common)\n\n```bash\n# Step 1: fetch audio + context (slug auto-derived from title)\ngaldr fetch \"https://youtu.be/...\" --analyze\n\n# galdr prints the slug at the end:\n#   Slug : artist-song-title\n#   Next : galdr assemble artist-song-title --template arc --mode full\n\n# Step 2: assemble the prompt locally\ngaldr assemble artist-song-title --template arc --mode full > prompt.txt\n```\n\nOverride auto-derived metadata if needed:\n\n```bash\ngaldr fetch \"https://youtu.be/...\" --artist \"Oliver Anthony\" --title \"Rich Men North of Richmond\" --analyze\n```\n\nIf YouTube download behavior is flaky:\n\n```bash\ngaldr doctor\ngaldr update-deps\n```\n\n`galdr doctor` reports the active Python executable, yt-dlp command/version, ffmpeg/ffprobe, JavaScript runtimes, and impersonation support. `galdr update-deps` upgrades `yt-dlp[default,curl-cffi]` in the same Python environment galdr is using.\n\n### Local file → ARC prompt\n\n> The analysis command is `galdr listen`, not `galdr analyze`.\n\n```bash\ngaldr listen track.wav --name my-track\ngaldr assemble my-track --template arc --mode full > prompt.txt\n```\n\n### Raw second-by-second analysis (advanced)\n\nGaldr is strongest when read as a **time-ordered listener-state trace**. The stream is the primary evidence. Whole-track interpretation comes after walking the track through time.\n\nStart with:\n- `analysis/<slug>/<slug>_stream.json`\n- `analysis/<slug>/<slug>_perception.json`\n- `docs/PERCEPTION-MODEL.md`\n\nUseful extras:\n- `*_harmony_stream.json`\n- `*_melody_stream.json`\n- `*_overtone_stream.json`\n- `*_report.json`\n- `galdr assemble <slug> --mode blind`\n\nReading order:\n1. Read `PERCEPTION-MODEL.md` first.\n2. Treat `*_stream.json` as the main evidence surface.\n3. Walk the track in order.\n4. Mark transitions: silence, re-entry, pattern breaks, attention shifts, pressure-state changes, harmonic movement.\n5. Translate pressure fields into listening language: comes forward, holds, releases, empties. Do not quote LUFS values in experience prose.\n6. Only then compress upward into a larger interpretation.\n\nDo not:\n- jump straight to a whole-song mood summary\n- treat summary metrics as more important than the stream\n- ignore silence/re-entry structure\n- overclaim emotional certainty from structure alone\n- quote loudness/LUFS readings as if they were the experience\n\nMinimal recipe:\n\n```bash\ngaldr listen track.wav --name my-track\njq '.[0:12]' analysis/my-track/my-track_stream.json\njq '.summary' analysis/my-track/my-track_perception.json\ngaldr assemble my-track --mode blind > prompt.txt\n```\n\n### Send the ARC prompt to another model\n\nOnly do this if the operator explicitly wants model-written prose. Review the assembled ARC prompt before piping it to `claude`, `llm`, or any other external model endpoint.\n\n```bash\ngaldr assemble my-track --template arc --mode full | claude\ngaldr assemble my-track --template arc --mode full | llm\n```\n\n### Optional Python agent pattern\n\n```python\nimport subprocess, re\n\nfetch = subprocess.run(\n    [\"galdr\", \"fetch\", url, \"--analyze\"],\n    capture_output=True, text=True, check=True\n)\nslug = re.search(r\"Slug\\s*:\\s*(\\S+)\", fetch.stdout).group(1)\n\nprompt = subprocess.run(\n    [\"galdr\", \"assemble\", slug, \"--template\", \"arc\", \"--mode\", \"full\"],\n    capture_output=True, text=True, check=True\n).stdout\n\n# Review prompt before sending it to any external model endpoint.\n```\n\n### Mode and template flags\n\n| Mode | What's included |\n|------|----------------|\n| `full` (default) | metrics + lyrics + background + frames |\n| `lyrics` | metrics + lyrics |\n| `context` | metrics + background |\n| `blind` | metrics only (structural, no cultural context) |\n\n`--template arc` prepends the default listening-experience rules: tone, format, interpretation bounds, and the instruction to walk the track through time. `--template arc-family --lens <name>` uses the shared prompt-family base plus one deliberate reading lens. Omit templates only when you want a raw data block.\n\n## Interpreting galdr output\n\nARC is the default output path. The metrics exist to keep that prose grounded: use them as evidence for what changes, returns, releases, locks, or breaks over time.\n\nSee [references/metrics.md](references/metrics.md) for full metric reference.\n\n**Quick read:**\n- `pattern` near 1.0 → listener is locked; near 0 → constant disruption\n- `surface_balance` negative → harmonic dominant (warm, tonal); positive → percussive dominant\n- `pressure_state` and pressure summary percentages → heard-pressure shape across the track\n- Clustered `pattern_breaks` at the end → planned release; distributed → varied structure\n- `silence` depth below -60dB with re-lock above 0.93 attention → structured withdrawal/return\n\n## Writing ARC experience prose yourself\n\nWhen writing experience prose yourself from galdr evidence, prefer `galdr assemble <slug> --template arc --mode full`. If you are writing from raw assembled output without the template:\n- First-person listener perspective, present tense\n- Timestamps only at structural pivots: silences, pattern breaks, major energy shifts\n- Translate metrics; describe what they mean, do not quote numbers\n- LUFS/pressure values are evidence, not prose; write “pressure comes forward / holds / releases / empties”\n- Body anchors such as chest, jaw, sternum sparingly; two or three for the whole piece\n- End at the final sound event; no aftermath, no reflection\n- Around 800 words, no section headers\n\n## Other commands\n\n```bash\ngaldr compare track-a track-b          # side-by-side structural comparison\ngaldr frames slug                      # extract + describe video frames at structural moments\ngaldr fetch \"url\" --no-download        # context only (Wikipedia + lyrics), no audio\ngaldr fetch \"url\" --censor             # sanitize explicit lyrics before saving\ngaldr doctor                           # inspect yt-dlp/media runtime health\ngaldr update-deps                      # upgrade yt-dlp reliability extras\ngaldr catalog                          # list all indexed tracks\ngaldr catalog --track NAME             # summary card for one track\n```\n\nFile v0.6.0:_meta.json\n\n{\n  \"ownerId\": \"kn7f8hn1v7tcp7n6rspveyf49s83cfdj\",\n  \"slug\": \"galdr\",\n  \"version\": \"0.6.0\",\n  \"publishedAt\": 1783651115714\n}\n\nFile v0.6.0:references/metrics.md\n\n# galdr Metric Reference\n\nAll metrics come from `report.json` and the perception/harmony/melody/overtone stream files in `analysis/<slug>/`.\n\n---\n\n## Pattern (`pattern`)\n\n**Range:** 0.0–1.0\n**What it is:** How reliably the music keeps its pattern intact. High pattern means the listener can trust the structure: the pulse, texture, and energy are not suddenly breaking away.\n\n**How it is calculated:** `pattern = 1.0 - disruption`. Disruption is a weighted blend of beat disruption (`40%`), spectral disruption (`35%`), and energy disruption (`25%`). Beat disruption catches missing or off-time expected beats; spectral disruption catches sudden timbral change above local context; energy disruption catches loudness jumps/drops above local trend.\n\n| Value | Meaning |\n|-------|---------|\n| 0.96–1.0 | Exceptional hold. Listener rarely disrupted. Ritual, minimalist, or tightly composed. |\n| 0.90–0.96 | Strong hold. Some variation but listener remains locked. Most engaging tracks. |\n| 0.80–0.90 | Moderate disruption. Energy varies meaningfully. |\n| <0.80 | Frequent disruption. Chaotic, experimental, or fragmentary. |\n\n**Pattern breaks** are the moments where pattern drops suddenly. Check `pattern_breaks` in report.json for timestamps, intensity, and component breakdown (`beat`, `spectral`, `energy`). Those components tell you whether the break is rhythmic, textural, dynamic, or compound.\n\n---\n\n## Attention (`attention`, `mean_attention`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly attention is being carried forward by the track. Not speed, loudness, or quality — grip. High attention means the music keeps the listener coupled even through quiet or sparse passages.\n\n**How it is calculated:** rolling beat regularity multiplied by beat density over an 8-second window. Regular intervals with enough beat evidence produce high attention; sparse or irregular beat evidence lowers it.\n\n| Value | Meaning |\n|-------|---------|\n| >0.90 | Rare sustained pull. Track barely lets listener breathe. |\n| 0.80–0.90 | Strong. Most engaging passages. |\n| 0.60–0.80 | Fluctuating. Energy ebbs and flows. |\n| <0.60 | Low continuity. Listener may disengage. |\n\nAfter a silence, attention re-locking above 0.93 signals the listener has been re-engaged. Multiple re-lock events with deepening silences can indicate structured withdrawal.\n\n---\n\n## Pulse (`pulse`)\n\n**Range:** 0.0–1.0\n**What it is:** How steady the underlying pulse feels. Orthogonal to metric complexity — a 7/8 piece can have perfect pulse stability if the body can still trust where the beat lives.\n\n| Value | Meaning |\n|-------|---------|\n| >0.96 | Clockwork. Ritual, electronic, or highly disciplined performance. |\n| 0.90–0.96 | Tight but human. Most performed music. |\n| 0.80–0.90 | Loose. Jazz feel, rubato, or intentional groove. |\n| <0.80 | Irregular. Experimental or very free. |\n\nHigh pulse + complex time signature (5/8, 7/8) = metric complexity is orthogonal to pulse stability.\n\n---\n\n## Surface balance (`surface_balance`, `mean_surface_balance`)\n\n**Range:** -1.0 to 1.0\n**What it is:** Where the track's weight sits between sustained harmonic sound and percussive impact. Negative values feel more tonal, vocal, droning, or atmospheric; positive values feel more struck, rhythmic, attack-heavy, or drum-forward.\n\n**How it is calculated:** harmonic/percussive source separation energy, smoothed into the perception stream. Very low total energy is treated as neutral so silence does not pretend to have a surface-balance claim.\n\n`surface_evidence` carries the local evidence behind the reading: roughness, noise density, transient attack, sustain/drone, band pressure, surface motion, punch, band weights, and brightness tilt.\n\n| Value | Meaning |\n|-------|---------|\n| < -0.5 | Strongly harmonic. Warm, tonal, sustained. Choirs, strings, pads. |\n| -0.5 to -0.2 | Harmonic dominant with surface detail. |\n| -0.2 to 0.2 | Balanced. Mixed character. |\n| 0.2 to 0.5 | Percussive with harmonic content. |\n| > 0.5 | Strongly percussive. Drum-forward, rhythmic emphasis. |\n\nDeepening negative surface balance across a track = harmonic weight increasing (dissolution, closing, ending accumulation).\n\n---\n\n## Pressure / Heard Pressure (`pressure`, `pressure_state`, pressure summary percentages)\n\n**Shape:** Stream fields plus three summary percentages — building / releasing / sustaining — summing to 100%.\n**What it is:** The heard-pressure shape of the track. Pressure is derived from short-term EBU R128/LUFS loudness rather than raw RMS energy so it tracks whether pressure comes forward, holds, or withdraws.\n\n**How it is calculated:** short-term LUFS is smoothed over 20 seconds, differenced, and normalized into a pressure-motion curve. Positive values build, negative values release, near-zero values sustain.\n\nStream fields:\n- `pressure` — normalized pressure movement; positive builds, negative releases, near-zero sustains\n- `pressure_state` — `building`, `releasing`, `sustaining`, or `silence`\n- `loudness_lufs` — short-term loudness evidence; use for debugging/comparison, not prose\n- `pressure_lufs_delta` — short-term pressure delta evidence\n- `loudness_silence` — loudness-floor silence marker\n\n| Pattern | Meaning |\n|---------|---------|\n| ~33/33/33 | Equilibrium. Pressure gives and takes evenly. |\n| Heavy building (>45%) | Accumulating track. Pressure keeps coming forward. |\n| Heavy releasing (>45%) | Withdrawal dominates, even if the track still feels held. |\n| Near-zero sustain (<10%) | No held pressure — constant motion up or down. |\n| Heavy sustain (>40%) | Stable hold. The music keeps the listener coupled instead of continually climbing or falling. |\n\nTranslation rule: do not write raw LUFS values in experience prose. Write what they mean: pressure comes forward, fills the room, holds, loosens, drops away, empties, or stops carrying attention. LUFS belongs in regression notes and debugging.\n\nNear-symmetry between building and releasing indicates the track takes exactly as much as it gives — rare and structurally notable.\n\n---\n\n## Pitch grid (`mean_pitch_grid`)\n\n**Range:** 0.0–1.0\n**What it is:** How cleanly the harmony sits inside familiar equal-tempered pitch space. Higher values feel centered, resolved, and conventionally tuned; lower values can feel bent, smeared, folk-natural, microtonal, or intentionally outside the grid.\n\n**How it is calculated:** concentration of chroma energy across equal-tempered pitch classes.\n\nDo not read low pitch_grid as a defect by itself. Some traditions deliberately live between the standard pitch bins. Treat it as evidence about tuning world, not as a quality score.\n\n---\n\n## Interval coherence (`mean_interval_coherence`)\n\n**Range:** 0.0–1.0\n**What it is:** How concentrated the pitch content is around simple, stable harmonic relationships. Higher values feel fused, settled, and easy for the ear to organize; lower values feel more spread, complex, or harmonically ambiguous.\n\n**How it is calculated:** active chroma pitch-class pairs are scored against simple just-intonation interval relationships, weighted by chroma energy. This is harmony-side evidence. It describes pitch-class organization, not the raw overtone spectrum.\n\n---\n\n## Harmonic pull (`mean_harmonic_pull`)\n\n**Range:** 0.0–1.0\n**What it is:** How much the harmony is pulling, shifting, or refusing to settle over time. High values feel like motion, pressure, searching, or harmonic unease; low values feel anchored, suspended, static, or resolved.\n\n**How it is calculated:** velocity through smoothed tonnetz space, normalized across the track.\n\n| Value | Meaning |\n|-------|---------|\n| <0.25 | Consonant, settled. Easy listening, tonal resolution. |\n| 0.25–0.40 | Mild tension. Character without instability. |\n| 0.40–0.55 | Significant tension. Unresolved, complex harmonically. |\n| >0.55 | High dissonance. Deliberately unsettled. |\n\nCatalog note: the highest cataloged tension in the local reference set is 0.421.\n\n---\n\n## Chroma motion (`mean_chroma_motion`)\n\n**Range:** 0.0–1.0\n**What it is:** How quickly the harmonic color changes from one moment to the next. High values mean the harmonic surface is restless or actively turning; low values mean the color is steady, droning, or slowly evolving.\n\n**How it is calculated:** cosine distance between adjacent smoothed chroma frames, averaged in a local window and normalized.\n\n---\n\n## Tonal anchor (`mean_tonal_anchor`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly the current window stays anchored to its tonal center. High values feel grounded or centered; low values feel wandering, suspended, or harmonically diffuse.\n\n**How it is calculated:** Krumhansl-Kessler key profile correlation identifies a local key/root, then tonal stability measures how dominant that tonic pitch class is in the local chroma profile.\n\n---\n\n## Major/Minor Balance (`mean_major_minor`)\n\n**Range:** -1.0 to 1.0\n**What it is:** Whether the harmony leans dark/minor, bright/major, or stays between them. Negative values lean minor; positive values lean major; near-zero can mean modal ambiguity, mixture, or neither color dominating.\n\n**How it is calculated:** after local key/root detection, compares chroma energy at the major-third and minor-third pitch classes.\n\n---\n\n## Overtone fit (`mean_overtone_fit`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly the sound itself locks onto natural overtone relationships. High values feel pure, fused, bell-like, vocal, or resonant; low values feel noisier, rougher, more inharmonic, or more textural.\n\n**How it is calculated:** detected overtone partials are compared with ideal harmonic-series positions around the detected fundamental. This is overtone-side evidence. It describes spectral structure around the detected fundamental, not the chord progression.\n\n---\n\n## Overtone density (`mean_overtone_density`)\n\n**Range:** 0.0–1.0\n**What it is:** How many upper harmonics are present in the sound. High richness feels dense, bright, saturated, or full of upper partials; low richness feels simpler, darker, hollower, or more sine-like.\n\n**How it is calculated:** relative energy across detected upper partials.\n\n---\n\n## Inharmonicity (`mean_inharmonicity`)\n\n**Unit:** cents\n**What it is:** How far the overtones drift from ideal harmonic positions. Higher values feel rougher, noisier, more metallic, more bell-like in the unstable sense, or more textural. Lower values feel cleaner and more tonally fused.\n\n**How it is calculated:** average cent deviation between detected partials and ideal harmonic-series positions.\n\n---\n\n## Foreground line (`mean_foreground_line`)\n\n**Range:** 0.0–1.0\n**What it is:** How much foreground pitched material is carrying the track. The field is still named `mean_foreground_line` for compatibility, but read it as pitch-extraction confidence, not proof of a literal singer. High values mean a voice or lead pitch is structurally present; low values mean the voice/lead is absent, textural, buried, unpitched, or not the main carrier.\n\n**How it is calculated:** pYIN voiced probability over time, smoothed into the melody stream.\n\n| Value | Meaning |\n|-------|---------|\n| <0.05 | Minimal / drone-like. Voice is texture, not foreground. |\n| 0.05–0.15 | Voice present but mixed into the ensemble. |\n| 0.15–0.30 | Clear vocal lead. |\n| >0.30 | Voice dominates the mix. |\n\nLow foreground pitch evidence + deeply negative surface balance = pure harmonic surface. High foreground pitch evidence + descending melody = voice/lead-forward with falling contour (often resignation/descent arc).\n\n---\n\n## Silences\n\n**Structure:** Each silence has `start`, `end`, `duration`, `depth_db`, `recovery_attention`.\n\n| Depth | Meaning |\n|-------|---------|\n| -30 to -45 dB | Soft silence. Still some signal present. |\n| -45 to -60 dB | Clear silence. Listener attention sharpens. |\n| -60 to -75 dB | Deep silence. Structural weight. |\n| < -75 dB | Near-absolute. Very deliberate. |\n\n`recovery_attention` after silence: if >0.93, listener re-locked. If <0.80, attention didn't recover — track may not re-engage.\n\nMultiple silences with deepening depth and consistent re-lock = structured withdrawal (dissolution pattern). Compressing silence intervals toward end = listener being walked to the edge.\n\n---\n\n## Melody Contour\n\n**Shape:** Percentage ascending / holding / descending.\n**What it is:** The average shape of the foreground pitched line: whether it rises, falls, or holds its ground over time.\n\nHeavily holding (>60%) with high foreground pitch evidence = melody uses repetition or narrow range as expressive strategy — not a limitation.\nHeavily descending + resigned lyrics = structural confirmation of emotional content.\nAscending contour during climax = conventional arc. Descending during what sounds like climax = tension through contradiction.\n\n---\n\n## Metric Evidence Cheat Sheet\n\n| Metric | Primary evidence |\n|---|---|\n| `attention` | Beat regularity × beat density in rolling windows |\n| `pressure` / `pressure_state` | Short-term LUFS movement |\n| `pattern` | `1.0 - disruption`; disruption = beat + spectral + energy expectation failures |\n| `surface_balance` | Harmonic/percussive separated energy |\n| `pitch_grid` | Chroma concentration in equal-tempered pitch classes |\n| `interval_coherence` | Chroma interval relationships weighted by energy |\n| `harmonic_pull` | Tonnetz velocity |\n| `chroma_motion` | Cosine distance between adjacent chroma frames |\n| `tonal_anchor` | Dominance of detected tonic pitch class |\n| `major_minor` | Major-third vs minor-third chroma energy around detected root |\n| `overtone_fit` | Overtone partial alignment around detected fundamentals |\n| `overtone_density` | Upper-partial energy |\n| `inharmonicity` | Cent deviation from ideal harmonic partials |\n| `mean_foreground_line` | pYIN voiced probability; foreground pitch evidence |\n| `silences` | dB-floor intervals plus recovery attention |\n\n---\n\n## Pattern Breaks\n\nEach break has: `timestamp`, `intensity` (0–1), `beat` / `spectral` / `energy` component scores.\n\n**Intensity interpretation:**\n- < 0.3: Subtle shift. Texture change rather than structural break.\n- 0.3–0.6: Clear break. Listener notices.\n- > 0.6: Significant disruption. Track changes character.\n\n**Component breakdown:**\n- High `beat` + low others = rhythmic disruption only\n- High `spectral` = timbral/textural shift\n- High `energy` = dynamic change\n\n**Distribution:**\n- Clustered at end (final 10%) = planned release\n- Distributed across track = varied, episodic structure\n- Single large break = pivot point; track has two halves\n\nFile v0.6.0:skill-card.md\n\n## Description: <br>\nOpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[sellemain](https://clawhub.ai/user/sellemain) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agents use this skill to analyze songs or music videos from YouTube URLs or local audio, assemble ARC listening-experience prompts, compare tracks, or extract structurally timed video frames from measurable audio evidence. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill depends on a separately installed galdr CLI package. <br>\nMitigation: Verify the galdr runtime source and package metadata before installing or running the CLI. <br>\nRisk: Media workflows may process copyrighted or otherwise restricted audio, lyrics, context, or frames. <br>\nMitigation: Use the skill only with media the operator is allowed to process and share. <br>\nRisk: Full ARC prompts can include lyrics, background context, frames, metrics, and locally derived analysis that may be sensitive when sent to external model providers. <br>\nMitigation: Review assembled prompts before piping them to external model endpoints and use narrower modes when sensitive context is not needed. <br>\n\n\n## Reference(s): <br>\n- [galdr ClawHub page](https://clawhub.ai/sellemain/skills/galdr) <br>\n- [galdr PyPI package](https://pypi.org/project/galdr/) <br>\n- [galdr Metric Reference](references/metrics.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with shell commands and Python examples; galdr runtime outputs include text prompts and JSON metric files.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [ARC prompts may include metrics, lyrics, background context, frames, and locally derived analysis depending on selected mode.] <br>\n\n## Skill Version(s): <br>\n0.6.0 (source: frontmatter and server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.5.1: 4 files, 11174 bytes\n\nFiles: references/metrics.md (14627b), skill-card.md (2472b), SKILL.md (9086b), _meta.json (124b)\n\nFile v0.5.1:SKILL.md\n\n---\nname: galdr\ndescription: OpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure. Use when asked to analyze a song, explain what makes a track work structurally, generate a listening experience, compare tracks, or extract video frames from a music video.\nversion: \"0.5.1\"\nauthor: Sellemain\nlicense: MIT\nplatforms: [linux, macos]\n---\n# galdr\n\nUse this skill when an OpenClaw agent needs to analyze music from a YouTube URL or local audio file and produce a grounded listening-experience prompt from measurable audio structure.\n\ngaldr is a music perception CLI for AI agents. Its default workflow is **ARC**: analyze a track into time-ordered listener-state traces, then assemble those traces into a prompt for grounded listening-experience prose. The metrics are evidence. The ARC prompt is the main user-facing output.\n\n## Important: skill vs CLI\n\nCurrent OpenClaw CLI install command:\n\n```bash\nopenclaw skills install galdr\n```\n\nClawHub may display an owner-qualified command such as `openclaw skills install @sellemain/galdr`. As of OpenClaw `2026.6.8`, the released CLI expects the bare skill slug `galdr`.\n\nInstalling this skill teaches OpenClaw how to use galdr. It does **not** install the `galdr` command itself.\n\nBefore starting:\n\n```bash\ngaldr --version\n```\n\nIf missing, install the CLI from a trusted source:\n\n```bash\npip install galdr\n\n# or from source:\ngit clone https://github.com/sellemain/galdr.git\ncd galdr\npip install -e .\n```\n\nPreferred trusted sources:\n- PyPI: <https://pypi.org/project/galdr/>\n- Source: <https://github.com/sellemain/galdr>\n\nIf provenance matters, verify the PyPI metadata or install from the source repository before running it.\n\n## When to use this skill\n\nUse galdr when the user asks to:\n- analyze a song or music video\n- describe what makes a track work structurally\n- generate a grounded listening experience\n- compare two tracks\n- extract frames around structural moments in a music video\n- create an evidence packet for another model to write from\n\nDo not use galdr for:\n- general music trivia\n- ordinary recommendation lists\n- purely lyrical interpretation without audio structure\n- pretending the metrics prove private emotional intent\n- downloading copyrighted audio unless the operator has appropriate rights/context\n\n## OpenClaw agent contract\n\nPrefer the ARC path unless the user explicitly asks for raw metrics, comparison, debugging, or agent-internal traces.\n\nDefault sequence:\n1. Fetch or listen to the track.\n2. Analyze it into listener-state traces.\n3. Assemble the ARC prompt with `--template arc --mode full`.\n4. Review the prompt.\n5. Write the listening experience yourself or pass the prompt to the requested model.\n\nThe stream is evidence. Walk the track through time before summarizing. Do not invent emotional claims that the structure does not support.\n\n## Core Workflows\n\n### YouTube URL → ARC prompt (most common)\n\n```bash\n# Step 1: fetch audio + context (slug auto-derived from title)\ngaldr fetch \"https://youtu.be/...\" --analyze\n\n# galdr prints the slug at the end:\n#   Slug : artist-song-title\n#   Next : galdr assemble artist-song-title --template arc --mode full\n\n# Step 2: assemble the prompt locally\ngaldr assemble artist-song-title --template arc --mode full > prompt.txt\n```\n\nOverride auto-derived metadata if needed:\n\n```bash\ngaldr fetch \"https://youtu.be/...\" --artist \"Oliver Anthony\" --title \"Rich Men North of Richmond\" --analyze\n```\n\nIf YouTube download behavior is flaky:\n\n```bash\ngaldr doctor\ngaldr update-deps\n```\n\n`galdr doctor` reports the active Python executable, yt-dlp command/version, ffmpeg/ffprobe, JavaScript runtimes, and impersonation support. `galdr update-deps` upgrades `yt-dlp[default,curl-cffi]` in the same Python environment galdr is using.\n\n### Local file → ARC prompt\n\n> The analysis command is `galdr listen`, not `galdr analyze`.\n\n```bash\ngaldr listen track.wav --name my-track\ngaldr assemble my-track --template arc --mode full > prompt.txt\n```\n\n### Raw second-by-second analysis (advanced)\n\nGaldr is strongest when read as a **time-ordered listener-state trace**. The stream is the primary evidence. Whole-track interpretation comes after walking the track through time.\n\nStart with:\n- `analysis/<slug>/<slug>_stream.json`\n- `analysis/<slug>/<slug>_perception.json`\n- `docs/PERCEPTION-MODEL.md`\n\nUseful extras:\n- `*_harmony_stream.json`\n- `*_melody_stream.json`\n- `*_overtone_stream.json`\n- `*_report.json`\n- `galdr assemble <slug> --mode blind`\n\nReading order:\n1. Read `PERCEPTION-MODEL.md` first.\n2. Treat `*_stream.json` as the main evidence surface.\n3. Walk the track in order.\n4. Mark transitions: silence, re-entry, pattern breaks, attention shifts, pressure-state changes, harmonic movement.\n5. Translate pressure fields into listening language: comes forward, holds, releases, empties. Do not quote LUFS values in experience prose.\n6. Only then compress upward into a larger interpretation.\n\nDo not:\n- jump straight to a whole-song mood summary\n- treat summary metrics as more important than the stream\n- ignore silence/re-entry structure\n- overclaim emotional certainty from structure alone\n- quote loudness/LUFS readings as if they were the experience\n\nMinimal recipe:\n\n```bash\ngaldr listen track.wav --name my-track\njq '.[0:12]' analysis/my-track/my-track_stream.json\njq '.summary' analysis/my-track/my-track_perception.json\ngaldr assemble my-track --mode blind > prompt.txt\n```\n\n### Send the ARC prompt to another model\n\nOnly do this if the operator explicitly wants model-written prose. Review the assembled ARC prompt before piping it to `claude`, `llm`, or any other external model endpoint.\n\n```bash\ngaldr assemble my-track --template arc --mode full | claude\ngaldr assemble my-track --template arc --mode full | llm\n```\n\n### Optional Python agent pattern\n\n```python\nimport subprocess, re\n\nfetch = subprocess.run(\n    [\"galdr\", \"fetch\", url, \"--analyze\"],\n    capture_output=True, text=True, check=True\n)\nslug = re.search(r\"Slug\\s*:\\s*(\\S+)\", fetch.stdout).group(1)\n\nprompt = subprocess.run(\n    [\"galdr\", \"assemble\", slug, \"--template\", \"arc\", \"--mode\", \"full\"],\n    capture_output=True, text=True, check=True\n).stdout\n\n# Review prompt before sending it to any external model endpoint.\n```\n\n### Mode and template flags\n\n| Mode | What's included |\n|------|----------------|\n| `full` (default) | metrics + lyrics + background + frames |\n| `lyrics` | metrics + lyrics |\n| `context` | metrics + background |\n| `blind` | metrics only (structural, no cultural context) |\n\n`--template arc` prepends the default listening-experience rules: tone, format, interpretation bounds, and the instruction to walk the track through time. Omit it only when you want a raw data block.\n\n## Interpreting galdr output\n\nARC is the default output path. The metrics exist to keep that prose grounded: use them as evidence for what changes, returns, releases, locks, or breaks over time.\n\nSee [references/metrics.md](references/metrics.md) for full metric reference.\n\n**Quick read:**\n- `pattern` near 1.0 → listener is locked; near 0 → constant disruption\n- `surface_balance` negative → harmonic dominant (warm, tonal); positive → percussive dominant\n- `pressure_state` and pressure summary percentages → heard-pressure shape across the track\n- Clustered `pattern_breaks` at the end → planned release; distributed → varied structure\n- `silence` depth below -60dB with re-lock above 0.93 attention → structured withdrawal/return\n\n## Writing ARC experience prose yourself\n\nWhen writing experience prose yourself from galdr evidence, prefer `galdr assemble <slug> --template arc --mode full`. If you are writing from raw assembled output without the template:\n- First-person listener perspective, present tense\n- Timestamps only at structural pivots: silences, pattern breaks, major energy shifts\n- Translate metrics; describe what they mean, do not quote numbers\n- LUFS/pressure values are evidence, not prose; write “pressure comes forward / holds / releases / empties”\n- Body anchors such as chest, jaw, sternum sparingly; two or three for the whole piece\n- End at the final sound event; no aftermath, no reflection\n- Around 800 words, no section headers\n\n## Other commands\n\n```bash\ngaldr compare track-a track-b          # side-by-side structural comparison\ngaldr frames slug                      # extract + describe video frames at structural moments\ngaldr fetch \"url\" --no-download        # context only (Wikipedia + lyrics), no audio\ngaldr fetch \"url\" --censor             # sanitize explicit lyrics before saving\ngaldr doctor                           # inspect yt-dlp/media runtime health\ngaldr update-deps                      # upgrade yt-dlp reliability extras\ngaldr catalog                          # list all indexed tracks\ngaldr catalog --track NAME             # summary card for one track\n```\n\nFile v0.5.1:_meta.json\n\n{\n  \"ownerId\": \"kn7f8hn1v7tcp7n6rspveyf49s83cfdj\",\n  \"slug\": \"galdr\",\n  \"version\": \"0.5.1\",\n  \"publishedAt\": 1781897155394\n}\n\nFile v0.5.1:references/metrics.md\n\n# galdr Metric Reference\n\nAll metrics come from `report.json` and the perception/harmony/melody/overtone stream files in `analysis/<slug>/`.\n\n---\n\n## Pattern (`pattern`)\n\n**Range:** 0.0–1.0\n**What it is:** How reliably the music keeps its pattern intact. High pattern means the listener can trust the structure: the pulse, texture, and energy are not suddenly breaking away.\n\n**How it is calculated:** `pattern = 1.0 - disruption`. Disruption is a weighted blend of beat disruption (`40%`), spectral disruption (`35%`), and energy disruption (`25%`). Beat disruption catches missing or off-time expected beats; spectral disruption catches sudden timbral change above local context; energy disruption catches loudness jumps/drops above local trend.\n\n| Value | Meaning |\n|-------|---------|\n| 0.96–1.0 | Exceptional hold. Listener rarely disrupted. Ritual, minimalist, or tightly composed. |\n| 0.90–0.96 | Strong hold. Some variation but listener remains locked. Most engaging tracks. |\n| 0.80–0.90 | Moderate disruption. Energy varies meaningfully. |\n| <0.80 | Frequent disruption. Chaotic, experimental, or fragmentary. |\n\n**Pattern breaks** are the moments where pattern drops suddenly. Check `pattern_breaks` in report.json for timestamps, intensity, and component breakdown (`beat`, `spectral`, `energy`). Those components tell you whether the break is rhythmic, textural, dynamic, or compound.\n\n---\n\n## Attention (`attention`, `mean_attention`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly attention is being carried forward by the track. Not speed, loudness, or quality — grip. High attention means the music keeps the listener coupled even through quiet or sparse passages.\n\n**How it is calculated:** rolling beat regularity multiplied by beat density over an 8-second window. Regular intervals with enough beat evidence produce high attention; sparse or irregular beat evidence lowers it.\n\n| Value | Meaning |\n|-------|---------|\n| >0.90 | Rare sustained pull. Track barely lets listener breathe. |\n| 0.80–0.90 | Strong. Most engaging passages. |\n| 0.60–0.80 | Fluctuating. Energy ebbs and flows. |\n| <0.60 | Low continuity. Listener may disengage. |\n\nAfter a silence, attention re-locking above 0.93 signals the listener has been re-engaged. Multiple re-lock events with deepening silences = structured withdrawal (Helvegen pattern).\n\n---\n\n## Pulse (`pulse`)\n\n**Range:** 0.0–1.0\n**What it is:** How steady the underlying pulse feels. Orthogonal to metric complexity — a 7/8 piece can have perfect pulse stability if the body can still trust where the beat lives.\n\n| Value | Meaning |\n|-------|---------|\n| >0.96 | Clockwork. Ritual, electronic, or highly disciplined performance. |\n| 0.90–0.96 | Tight but human. Most performed music. |\n| 0.80–0.90 | Loose. Jazz feel, rubato, or intentional groove. |\n| <0.80 | Irregular. Experimental or very free. |\n\nHigh pulse + complex time signature (5/8, 7/8) = metric complexity is orthogonal to pulse stability.\n\n---\n\n## Surface balance (`surface_balance`, `mean_surface_balance`)\n\n**Range:** -1.0 to 1.0\n**What it is:** Where the track's weight sits between sustained harmonic sound and percussive impact. Negative values feel more tonal, vocal, droning, or atmospheric; positive values feel more struck, rhythmic, attack-heavy, or drum-forward.\n\n**How it is calculated:** harmonic/percussive source separation energy, smoothed into the perception stream. Very low total energy is treated as neutral so silence does not pretend to have a surface-balance claim.\n\n`surface_evidence` carries the local evidence behind the reading: roughness, noise density, transient attack, sustain/drone, band pressure, surface motion, punch, band weights, and brightness tilt.\n\n| Value | Meaning |\n|-------|---------|\n| < -0.5 | Strongly harmonic. Warm, tonal, sustained. Choirs, strings, pads. |\n| -0.5 to -0.2 | Harmonic dominant with surface detail. |\n| -0.2 to 0.2 | Balanced. Mixed character. |\n| 0.2 to 0.5 | Percussive with harmonic content. |\n| > 0.5 | Strongly percussive. Drum-forward, rhythmic emphasis. |\n\nDeepening negative surface balance across a track = harmonic weight increasing (dissolution, closing, ending accumulation).\n\n---\n\n## Pressure / Heard Pressure (`pressure`, `pressure_state`, pressure summary percentages)\n\n**Shape:** Stream fields plus three summary percentages — building / releasing / sustaining — summing to 100%.\n**What it is:** The heard-pressure shape of the track. Pressure is derived from short-term EBU R128/LUFS loudness rather than raw RMS energy so it tracks whether pressure comes forward, holds, or withdraws.\n\n**How it is calculated:** short-term LUFS is smoothed over 20 seconds, differenced, and normalized into a pressure-motion curve. Positive values build, negative values release, near-zero values sustain.\n\nStream fields:\n- `pressure` — normalized pressure movement; positive builds, negative releases, near-zero sustains\n- `pressure_state` — `building`, `releasing`, `sustaining`, or `silence`\n- `loudness_lufs` — short-term loudness evidence; use for debugging/comparison, not prose\n- `pressure_lufs_delta` — short-term pressure delta evidence\n- `loudness_silence` — loudness-floor silence marker\n\n| Pattern | Meaning |\n|---------|---------|\n| ~33/33/33 | Equilibrium. Pressure gives and takes evenly. |\n| Heavy building (>45%) | Accumulating track. Pressure keeps coming forward. |\n| Heavy releasing (>45%) | Withdrawal dominates, even if the track still feels held. |\n| Near-zero sustain (<10%) | No held pressure — constant motion up or down. |\n| Heavy sustain (>40%) | Stable hold. The music keeps the listener coupled instead of continually climbing or falling. |\n\nTranslation rule: do not write raw LUFS values in experience prose. Write what they mean: pressure comes forward, fills the room, holds, loosens, drops away, empties, or stops carrying attention. LUFS belongs in regression notes and debugging.\n\nNear-symmetry between building and releasing indicates the track takes exactly as much as it gives — rare and structurally notable.\n\n---\n\n## Pitch grid (`mean_pitch_grid`)\n\n**Range:** 0.0–1.0\n**What it is:** How cleanly the harmony sits inside familiar equal-tempered pitch space. Higher values feel centered, resolved, and conventionally tuned; lower values can feel bent, smeared, folk-natural, microtonal, or intentionally outside the grid.\n\n**How it is calculated:** concentration of chroma energy across equal-tempered pitch classes.\n\nDo not read low pitch_grid as a defect by itself. Some traditions deliberately live between the standard pitch bins. Treat it as evidence about tuning world, not as a quality score.\n\n---\n\n## Interval coherence (`mean_interval_coherence`)\n\n**Range:** 0.0–1.0\n**What it is:** How concentrated the pitch content is around simple, stable harmonic relationships. Higher values feel fused, settled, and easy for the ear to organize; lower values feel more spread, complex, or harmonically ambiguous.\n\n**How it is calculated:** active chroma pitch-class pairs are scored against simple just-intonation interval relationships, weighted by chroma energy. This is harmony-side evidence. It describes pitch-class organization, not the raw overtone spectrum.\n\n---\n\n## Harmonic pull (`mean_harmonic_pull`)\n\n**Range:** 0.0–1.0\n**What it is:** How much the harmony is pulling, shifting, or refusing to settle over time. High values feel like motion, pressure, searching, or harmonic unease; low values feel anchored, suspended, static, or resolved.\n\n**How it is calculated:** velocity through smoothed tonnetz space, normalized across the track.\n\n| Value | Meaning |\n|-------|---------|\n| <0.25 | Consonant, settled. Easy listening, tonal resolution. |\n| 0.25–0.40 | Mild tension. Character without instability. |\n| 0.40–0.55 | Significant tension. Unresolved, complex harmonically. |\n| >0.55 | High dissonance. Deliberately unsettled. |\n\nCatalog note: Teardrop (Massive Attack) has the highest cataloged tension at 0.421.\n\n---\n\n## Chroma motion (`mean_chroma_motion`)\n\n**Range:** 0.0–1.0\n**What it is:** How quickly the harmonic color changes from one moment to the next. High values mean the harmonic surface is restless or actively turning; low values mean the color is steady, droning, or slowly evolving.\n\n**How it is calculated:** cosine distance between adjacent smoothed chroma frames, averaged in a local window and normalized.\n\n---\n\n## Tonal anchor (`mean_tonal_anchor`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly the current window stays anchored to its tonal center. High values feel grounded or centered; low values feel wandering, suspended, or harmonically diffuse.\n\n**How it is calculated:** Krumhansl-Kessler key profile correlation identifies a local key/root, then tonal stability measures how dominant that tonic pitch class is in the local chroma profile.\n\n---\n\n## Major/Minor Balance (`mean_major_minor`)\n\n**Range:** -1.0 to 1.0\n**What it is:** Whether the harmony leans dark/minor, bright/major, or stays between them. Negative values lean minor; positive values lean major; near-zero can mean modal ambiguity, mixture, or neither color dominating.\n\n**How it is calculated:** after local key/root detection, compares chroma energy at the major-third and minor-third pitch classes.\n\n---\n\n## Overtone fit (`mean_overtone_fit`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly the sound itself locks onto natural overtone relationships. High values feel pure, fused, bell-like, vocal, or resonant; low values feel noisier, rougher, more inharmonic, or more textural.\n\n**How it is calculated:** detected overtone partials are compared with ideal harmonic-series positions around the detected fundamental. This is overtone-side evidence. It describes spectral structure around the detected fundamental, not the chord progression.\n\n---\n\n## Overtone density (`mean_overtone_density`)\n\n**Range:** 0.0–1.0\n**What it is:** How many upper harmonics are present in the sound. High richness feels dense, bright, saturated, or full of upper partials; low richness feels simpler, darker, hollower, or more sine-like.\n\n**How it is calculated:** relative energy across detected upper partials.\n\n---\n\n## Inharmonicity (`mean_inharmonicity`)\n\n**Unit:** cents\n**What it is:** How far the overtones drift from ideal harmonic positions. Higher values feel rougher, noisier, more metallic, more bell-like in the unstable sense, or more textural. Lower values feel cleaner and more tonally fused.\n\n**How it is calculated:** average cent deviation between detected partials and ideal harmonic-series positions.\n\n---\n\n## Foreground line (`mean_foreground_line`)\n\n**Range:** 0.0–1.0\n**What it is:** How much foreground pitched material is carrying the track. The field is still named `mean_foreground_line` for compatibility, but read it as pitch-extraction confidence, not proof of a literal singer. High values mean a voice or lead pitch is structurally present; low values mean the voice/lead is absent, textural, buried, unpitched, or not the main carrier.\n\n**How it is calculated:** pYIN voiced probability over time, smoothed into the melody stream.\n\n| Value | Meaning |\n|-------|---------|\n| <0.05 | Minimal / drone-like. Voice is texture, not foreground. |\n| 0.05–0.15 | Voice present but mixed into the ensemble. |\n| 0.15–0.30 | Clear vocal lead. |\n| >0.30 | Voice dominates the mix. |\n\nLow foreground pitch evidence + deeply negative surface balance = pure harmonic surface. High foreground pitch evidence + descending melody = voice/lead-forward with falling contour (often resignation/descent arc).\n\n---\n\n## Silences\n\n**Structure:** Each silence has `start`, `end`, `duration`, `depth_db`, `recovery_attention`.\n\n| Depth | Meaning |\n|-------|---------|\n| -30 to -45 dB | Soft silence. Still some signal present. |\n| -45 to -60 dB | Clear silence. Listener attention sharpens. |\n| -60 to -75 dB | Deep silence. Structural weight. |\n| < -75 dB | Near-absolute. Very deliberate. |\n\n`recovery_attention` after silence: if >0.93, listener re-locked. If <0.80, attention didn't recover — track may not re-engage.\n\nMultiple silences with deepening depth and consistent re-lock = structured withdrawal (dissolution pattern). Compressing silence intervals toward end = listener being walked to the edge.\n\n---\n\n## Melody Contour\n\n**Shape:** Percentage ascending / holding / descending.\n**What it is:** The average shape of the foreground pitched line: whether it rises, falls, or holds its ground over time.\n\nHeavily holding (>60%) with high foreground pitch evidence = melody uses repetition or narrow range as expressive strategy — not a limitation.\nHeavily descending + resigned lyrics = structural confirmation of emotional content.\nAscending contour during climax = conventional arc. Descending during what sounds like climax = tension through contradiction.\n\n---\n\n## Metric Evidence Cheat Sheet\n\n| Metric | Primary evidence |\n|---|---|\n| `attention` | Beat regularity × beat density in rolling windows |\n| `pressure` / `pressure_state` | Short-term LUFS movement |\n| `pattern` | `1.0 - disruption`; disruption = beat + spectral + energy expectation failures |\n| `surface_balance` | Harmonic/percussive separated energy |\n| `pitch_grid` | Chroma concentration in equal-tempered pitch classes |\n| `interval_coherence` | Chroma interval relationships weighted by energy |\n| `harmonic_pull` | Tonnetz velocity |\n| `chroma_motion` | Cosine distance between adjacent chroma frames |\n| `tonal_anchor` | Dominance of detected tonic pitch class |\n| `major_minor` | Major-third vs minor-third chroma energy around detected root |\n| `overtone_fit` | Overtone partial alignment around detected fundamentals |\n| `overtone_density` | Upper-partial energy |\n| `inharmonicity` | Cent deviation from ideal harmonic partials |\n| `mean_foreground_line` | pYIN voiced probability; foreground pitch evidence |\n| `silences` | dB-floor intervals plus recovery attention |\n\n---\n\n## Pattern Breaks\n\nEach break has: `timestamp`, `intensity` (0–1), `beat` / `spectral` / `energy` component scores.\n\n**Intensity interpretation:**\n- < 0.3: Subtle shift. Texture change rather than structural break.\n- 0.3–0.6: Clear break. Listener notices.\n- > 0.6: Significant disruption. Track changes character.\n\n**Component breakdown:**\n- High `beat` + low others = rhythmic disruption only\n- High `spectral` = timbral/textural shift\n- High `energy` = dynamic change\n\n**Distribution:**\n- Clustered at end (final 10%) = planned release\n- Distributed across track = varied, episodic structure\n- Single large break = pivot point; track has two halves\n\nFile v0.5.1:skill-card.md\n\n## Description: <br>\nGaldr helps OpenClaw agents turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[sellemain](https://clawhub.ai/user/sellemain) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and OpenClaw operators use Galdr to analyze songs or music videos from URLs or local audio and assemble evidence-backed ARC prompts for listening-experience prose, comparison, or frame extraction. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Galdr can fetch remote media and retain downloaded or derived local analysis artifacts. <br>\nMitigation: Use trusted URLs and a trusted Galdr binary, then review or clean the Galdr output directory when retained media or derived artifacts are not desired. <br>\nRisk: Metric-backed prose can overstate what audio structure proves about private emotional intent. <br>\nMitigation: Treat listener-state metrics as evidence for structural changes, review generated prose against the trace, and avoid claims the structure does not support. <br>\nRisk: Fetching or analyzing copyrighted media may be inappropriate without the right context or permissions. <br>\nMitigation: Use the skill only with media the operator is authorized to access or analyze. <br>\n\n\n## Reference(s): <br>\n- [Galdr on ClawHub](https://clawhub.ai/sellemain/galdr) <br>\n- [Galdr package on PyPI](https://pypi.org/project/galdr/) <br>\n- [Galdr project repository](https://github.com/sellemain/galdr) <br>\n- [Metric reference](references/metrics.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, guidance] <br>\n**Output Format:** [Markdown guidance with shell command examples and generated prompt or text outputs from the Galdr CLI] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May reference local analysis artifacts and time-ordered metric traces produced by the Galdr CLI.] <br>\n\n## Skill Version(s): <br>\n0.5.1 (source: evidence release and skill frontmatter) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.5.0: 4 files, 11301 bytes\n\nFiles: references/metrics.md (14627b), skill-card.md (2983b), SKILL.md (8823b), _meta.json (124b)\n\nFile v0.5.0:SKILL.md\n\n---\nname: galdr\ndescription: OpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure. Use when asked to analyze a song, explain what makes a track work structurally, generate a listening experience, compare tracks, or extract video frames from a music video.\nversion: \"0.5.0\"\nauthor: Sellemain\nlicense: MIT\nplatforms: [linux, macos]\n---\n# galdr\n\nUse this skill when an OpenClaw agent needs to analyze music from a YouTube URL or local audio file and produce a grounded listening-experience prompt from measurable audio structure.\n\ngaldr is a music perception CLI for AI agents. Its default workflow is **ARC**: analyze a track into time-ordered listener-state traces, then assemble those traces into a prompt for grounded listening-experience prose. The metrics are evidence. The ARC prompt is the main user-facing output.\n\n## Important: skill vs CLI\n\nInstalling this skill teaches OpenClaw how to use galdr. It does **not** install the `galdr` command itself.\n\nBefore starting:\n\n```bash\ngaldr --version\n```\n\nIf missing, install the CLI from a trusted source:\n\n```bash\npip install galdr\n\n# or from source:\ngit clone https://github.com/sellemain/galdr.git\ncd galdr\npip install -e .\n```\n\nPreferred trusted sources:\n- PyPI: <https://pypi.org/project/galdr/>\n- Source: <htt\n\nArchive v0.4.3: 4 files, 11021 bytes\n\nFiles: references/metrics.md (14345b), skill-card.md (2559b), SKILL.md (8797b), _meta.json (124b)\n\nArchive v0.4.0: 4 files, 10755 bytes\n\nFiles: references/metrics.md (14345b), skill-card.md (2498b), SKILL.md (7994b), _meta.json (124b)\n\nArchive v0.3.1: 3 files, 6204 bytes\n\nFiles: references/metrics.md (6720b), SKILL.md (6406b), _meta.json (124b)\n\nArchive v0.3.0: 3 files, 9066 bytes\n\nFiles: references/metrics.md (14345b), SKILL.md (6906b), _meta.json (124b)","readmeExcerpt":"Skill: Galdr Owner: sellemain Summary: galdr turns YouTube links or local audio into time-ordered listener-state traces for AI agents. It reads pulse, pattern, attention, pressure, surface, harmon... Tags: audio:0.7.0, latest:0.7.1, listening:0.7.0, music:0.7.0, perception:0.7.0 Version history: v0.7.1 | 2026-08-26T19:51:10.021Z | user Adds the supported non-root Docker runtime, environment-configurable workspace pat","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"openclaw skills install galdr"},{"language":"bash","snippet":"galdr --version"},{"language":"bash","snippet":"pip install galdr\n\n# or from source:\ngit clone https://github.com/sellemain/galdr.git\ncd galdr\npip install -e ."},{"language":"bash","snippet":"galdr assemble my-track --template arc-family --lens sound --mode blind > sound.txt\ngaldr assemble my-track --template arc-family --lens dance --mode blind > dance.txt\ngaldr assemble my-track --template arc-family --lens meaning --mode full > meaning.txt\ngaldr assemble my-track --template arc-family --lens structure --mode blind > structure.txt\ngaldr assemble my-track --template arc-family --lens classical --mode blind > classical.txt\ngaldr assemble my-track --template arc-family --lens ritual --mode full > ritual.txt"},{"language":"bash","snippet":"# Step 1: fetch audio + context (slug auto-derived from title)\ngaldr fetch \"https://youtu.be/...\" --analyze\n\n# galdr prints the slug at the end:\n#   Slug : artist-song-title\n#   Next : galdr assemble artist-song-title --template arc --mode full\n\n# Step 2: assemble the prompt locally\ngaldr assemble artist-song-title --template arc --mode full > prompt.txt"},{"language":"bash","snippet":"galdr fetch \"https://youtu.be/...\" --artist \"Oliver Anthony\" --title \"Rich Men North of Richmond\" --analyze"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: galdr\ndescription: OpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure. Use when asked to analyze a song, explain what makes a track work structurally, generate a listening experience, or extract video frames from a music video.\nversion: \"0.7.1\"\nauthor: Sellemain\nlicense: MIT\nplatforms: [linux, macos]\n---\n# galdr\n\nUse this skill when an OpenClaw agent needs to analyze music from a YouTube URL or local audio file and produce a grounded listening-experience prompt from measurable audio structure.\n\ngaldr is a music perception CLI for AI agents. Its default workflow is **ARC**: analyze a track into time-ordered listener-state traces, then assemble those traces into a prompt for grounded listening-experience prose. The metrics are evidence. The ARC prompt is the main user-facing output.\n\n## Important: skill vs CLI\n\nCurrent OpenClaw CLI install command:\n\n```bash\nopenclaw skills install galdr\n```\n\nClawHub may display an owner-qualified command such as `openclaw skills install @sellemain/galdr`. As of OpenClaw `2026.6.8`, the released CLI expects the bare skill slug `galdr`.\n\nInstalling this skill teaches OpenClaw how to use galdr. It does **not** install the `galdr` command itself.\n\nThe PyPI wheel contains the runtime CLI/library and bundled prompt templates. The OpenClaw skill is distributed separately through ClawHub so agent instructions can stay a clean skill artifact instead of being installed as Python package data.\n\nBefore starting:\n\n```bash\ngaldr --version\n```\n\nIf missing, install the CLI from a trusted source:\n\n```bash\npip install galdr\n\n# or from source:\ngit clone https://github.com/sellemain/galdr.git\ncd galdr\npip install -e .\n```\n\nPreferred trusted sources:\n- PyPI: <https://pypi.org/project/galdr/>\n- Source: <https://github.com/sellemain/galdr>\n\nIf provenance matters, verify the PyPI metadata or install from the source repository before running it.\n\n## When to use this skill\n\nUse galdr when the user asks to:\n- analyze a song or music video\n- describe what makes a track work structurally\n- generate a grounded listening experience\n- extract frames around structural moments in a music video\n- create an evidence packet for another model to write from\n\nDo not use galdr for:\n- general music trivia\n- ordinary recommendation lists\n- purely lyrical interpretation without audio structure\n- pretending the metrics prove private emotional intent\n- downloading copyrighted audio unless the operator has appropriate rights/context\n\n## OpenClaw agent contract\n\nPrefer the ARC path unless the user explicitly asks for raw metrics, debugging, or agent-internal traces.\n\nDefault sequence:\n1. Fetch or listen to the track.\n2. Analyze it into listener-state traces.\n3. Assemble the ARC prompt with `--template "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7f8hn1v7tcp7n6rspveyf49s83cfdj\",\n  \"slug\": \"galdr\",\n  \"version\": \"0.7.1\",\n  \"publishedAt\": 1787773870021\n}"},{"path":"references/metrics.md","content":"# galdr Metric Reference\n\nAll metrics come from `report.json` and the perception/harmony/melody/overtone stream files in `analysis/<slug>/`.\n\n---\n\n## Pattern (`pattern`)\n\n**Range:** 0.0–1.0\n**What it is:** How reliably the music keeps its pattern intact. High pattern means the listener can trust the structure: the pulse, texture, and energy are not suddenly breaking away.\n\n**How it is calculated:** `pattern = 1.0 - disruption`. Disruption is a weighted blend of beat disruption (`40%`), spectral disruption (`35%`), and energy disruption (`25%`). Beat disruption catches missing or off-time expected beats; spectral disruption catches sudden timbral change above local context; energy disruption catches loudness jumps/drops above local trend.\n\n| Value | Meaning |\n|-------|---------|\n| 0.96–1.0 | Exceptional hold. Listener rarely disrupted. Ritual, minimalist, or tightly composed. |\n| 0.90–0.96 | Strong hold. Some variation but listener remains locked. Most engaging tracks. |\n| 0.80–0.90 | Moderate disruption. Energy varies meaningfully. |\n| <0.80 | Frequent disruption. Chaotic, experimental, or fragmentary. |\n\n**Pattern breaks** are the moments where pattern drops suddenly. Check `pattern_breaks` in report.json for timestamps, intensity, and component breakdown (`beat`, `spectral`, `energy`). Those components tell you whether the break is rhythmic, textural, dynamic, or compound.\n\n---\n\n## Attention (`attention`, `mean_attention`)\n\n**Range:** 0.0–1.0\n**What it is:** How strongly attention is being carried forward by the track. Not speed, loudness, or quality — grip. High attention means the music keeps the listener coupled even through quiet or sparse passages.\n\n**How it is calculated:** rolling beat regularity multiplied by beat density over an 8-second window. Regular intervals with enough beat evidence produce high attention; sparse or irregular beat evidence lowers it.\n\n| Value | Meaning |\n|-------|---------|\n| >0.90 | Rare sustained pull. Track barely lets listener breathe. |\n| 0.80–0.90 | Strong. Most engaging passages. |\n| 0.60–0.80 | Fluctuating. Energy ebbs and flows. |\n| <0.60 | Low continuity. Listener may disengage. |\n\nAfter a silence, attention re-locking above 0.93 signals the listener has been re-engaged. Multiple re-lock events with deepening silences can indicate structured withdrawal.\n\n---\n\n## Pulse (`pulse`)\n\n**Range:** 0.0–1.0\n**What it is:** How steady the underlying pulse feels. Orthogonal to metric complexity — a 7/8 piece can have perfect pulse stability if the body can still trust where the beat lives.\n\n| Value | Meaning |\n|-------|---------|\n| >0.96 | Clockwork. Ritual, electronic, or highly disciplined performance. |\n| 0.90–0.96 | Tight but human. Most performed music. |\n| 0.80–0.90 | Loose. Jazz feel, rubato, or intentional groove. |\n| <0.80 | Irregular. Experimental or very free. |\n\nHigh pulse + complex time signature (5/8, 7/8) = metric complexity is orthogonal to pulse stability.\n\n---\n\n## Surface balance (`surface_balance"},{"path":"skill-card.md","content":"## Description:\n\nOpenClaw skill for using galdr's ARC workflow to turn YouTube URLs or local audio files into grounded, time-ordered listening-experience prompts backed by listener-state traces: pattern, attention, pulse, heard pressure, surface balance/evidence, harmony, melody, overtones, and silence/re-entry structure.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[sellemain](https://clawhub.ai/user/sellemain)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agent operators use Galdr to analyze songs, music videos, or local audio files and produce grounded listening-experience prompts from measurable audio structure. It is suited for time-ordered music analysis, structural explanation, frame extraction around musical moments, and evidence packets for another model to write from.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Installing or updating the galdr CLI and dependencies from external package sources can introduce supply-chain risk.\n\nMitigation: Install only from trusted sources, prefer a virtual environment or container, avoid administrator privileges, and verify PyPI or source metadata when provenance matters.\n\nRisk: YouTube downloads, lyrics lookup, background lookup, or sending assembled prompts to external model endpoints may disclose track or analysis context outside the local machine.\n\nMitigation: Use local files or metrics-only modes when privacy matters, review assembled prompts before sharing them with another model, and send prompts externally only when the operator explicitly requests it.\n\nRisk: The workflow can download copyrighted audio if used without appropriate rights or context.\n\nMitigation: Confirm the operator has appropriate rights or context before downloading copyrighted media.\n\n## Reference(s):\n\n- [galdr Metric Reference](references/metrics.md)\n- [galdr PyPI project](https://pypi.org/project/galdr/)\n- [galdr source repository](https://github.com/sellemain/galdr)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and optional generated text prompts]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [ARC prompts are grounded in time-ordered listener-state traces; raw metrics may be emitted as JSON files by the galdr CLI.]\n\n## Skill Version(s):\n\n0.7.1 (source: server release evidence and frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"galdr turns YouTube links or local audio into time-ordered listener-state traces for AI agents. It reads pulse, pattern, attention, pressure, surface, harmon... Skill: Galdr Owner: sellemain Summary: galdr turns YouTube links or local audio into time-ordered listener-state traces for AI agents. It reads pulse, pattern, attention, pressure, surface, harmon... Tags: audio:0.7.0, latest:0.7.1, listening:0.7.0, music:0.7.0, perception:0.7.0 Version history: v0.7.1 | 2026-08-26T19:51:10.021Z | user Adds the supported non-root Docker runtime, environment-configurable workspace pat","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1678,"uniquenessScore":47,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T17:15:29.738Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T17:15:29.738Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T21:54:24.225Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}