harmonics demo — the voice showcase (play / file / stream)#5
Conversation
…(devague /think) Converged Announcement Frame for issue #4: a `harmonics demo` verb that tours the agent voice across every design axis in three output modes — play live, write a file (--html gallery / --wav dir / --out concatenated), or stream via a public showcase() + --json. Dry-run by default; offline/deterministic pure path; articulation flag + dedicated 'articulations' row (per user decision). 12 claims + 15 honesty conditions, all confirmed; gate passed. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
Buildable plan seeded from the converged demo-command frame. 26 coverage
targets, all covered; acyclic graph. Waves: matrix -> showcase() core ->
{gallery, files, play} (wide, file-disjoint) -> CLI verb+register -> explain.
Each task is TDD-gated with its own test_demo_*.py.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
Curated 28-clip tour across 6 groups (intents, identity, shading, say, stress, articulations) as a pure ClipSpec data table — no rendering, no audio import. 14 tests. Covers c3,h10,c6,c10,h5,c14,h8. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
showcase() yields (label, axes, notes, wav) per matrix clip — deterministic, offline (no audio backend imported), reusing the existing pipeline. Extracts a public say.render_notes() (cmd_say behavior unchanged) so 'say' clips sound exactly like harmonics say. --articulation override re-renders the whole tour. 9 tests. Covers c9,h4,c5,h12,h13,c11,h2. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
render_gallery(clips) -> deterministic self-contained HTML: base64 WAV data-URIs, per-clip axes chips + note summary, both themes, no external hosts. 11 tests. Covers h6,c11. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
write_wav_dir (per-clip), write_concat_wav (one tour WAV with gaps), and json_payload (note-sequence-per-clip) — all offline, valid RIFF/WAVE, JSON-serializable. 14 tests. Covers c8,h3. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
play_clips(clips) plays each clip's wav via a lazy simpleaudio/sounddevice import; friendly CliError (not ImportError) when no backend is installed. 9 tests. Covers c8,h3. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
cmd_demo dispatches: dry-run lists clips+axes, --json streams note sequences, --html writes the gallery, --wav writes per-clip WAVs, --out writes one tour WAV, --play plays live. --articulation re-renders the whole tour (default None = each clip's own, so the articulations section still shows all four). 11 tests. Covers c1,h1,c4,h11,c7,h2,c8,h3,c12,c14,h8. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
Adds the ('demo',) explain entry documenting the three output modes mapped to
the three audiences (humans->--play/--html, developers->showcase(),
embedding->--json/showcase()), every flag, and --articulation; lists demo on
the root page. teken cli doctor . --strict stays green. Covers c2,h9,c12,h7.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
New harmonics demo command (issue #4). Also refreshes the stale README Status section (play/say/demo now shipped, not 'coming') and lists the three audio verbs in the CLI table. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
|
/agentic_review |
Code Review by Qodo
1. Gallery headers misgroup clips
|
PR Summary by QodoAdd
AI Description
Diagram
High-Level Assessment
Files changed (25)
|
Address qodo review on PR #5: - Group header derivation now strips a trailing ' (agent)' qualifier, so 'say (spark): ...' / 'say (daria): ...' group under one 'say' header instead of spawning a separate header per agent (was a visual misgrouping bug). - Gallery page title uses 'harmonics-cli' (the product/identity name) rather than the 'harmonics' command name, per the repo naming convention. Adds two regression tests. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj
|



harmonics demo— the voice showcase (play / file / stream)Closes #4. One command tours the whole agent voice across the design spine, in
three output modes — built end-to-end through the devague pipeline
(
/think→/spec-to-plan→/assign-to-workforce), so the spec and plan arecommitted alongside the code.
What ships
harmonics demorenders a curated 28-clip tour and can:--play(live) or--html FILE(a self-contained,browser-playable gallery: WAVs embedded as data-URIs, per-clip axes + note
summary, both light/dark themes, deterministic so it snapshot-tests).
--wav DIR(one WAV per clip),--out FILE(oneconcatenated tour WAV).
harmonics.demo.showcase()yields one(label, axes, note_sequence, wav_bytes)per clip;--jsonemits thenote-sequence-per-clip payload on stdout.
files needs an explicit flag (the producing-verb contract).
--articulation {discrete,speechy,smooth,alien}re-renders the whole tourin one voice; the default renders each clip in its own articulation, so the
dedicated
articulationssection still demonstrates all four styles.The tour matrix (
harmonics/demo/matrix.py) walks six groups: intents,identity, confidence/urgency shading, say-tracks-words, stress, and
articulations. This is packaging over the existing v0.5.0 pipeline — no new
synthesis; the pure text→notes path stays offline and dependency-free (only
--playneeds an audio backend).How it was built (7 tasks / 5 waves, TDD-gated)
demo/matrix.pyshowcase()coredemo/core.py,__init__.pydemo/gallery.pydemo/files.pydemo/play.pycli/_commands/demo.py,cli/__init__.pyexplain/catalog.pyEach task was built test-first in isolation and merged only with the suite green
before and after. A small refactor extracts
say.render_notes()as a publicfunction so
demo's spoken clips are byte-for-byte the realharmonics sayvoice (
cmd_saybehaviour unchanged).Gates
black/isort/flake8/bandit(0 issues) /markdownlintclean.teken cli doctor . --strictgreen;harmonics explain demoresolves; root page lists
demo.section is also de-staled: play/say/demo now shipped, not "coming").
Spec & plan (committed)
docs/specs/2026-07-08-harmonics-ships-a-demo-command-one-command-tours-t.mddocs/plans/2026-07-08-harmonics-ships-a-demo-command-one-command-tours-t.md🤖 Generated with Claude Code
https://claude.ai/code/session_01VMUvDkSHhthqU3c5HrhQuj