Files
zooqueen ae80da5998 refactor(media-use): resolve every media type through api.hanzo.ai
Voice is POST /v1/audio/speech and word timings come from
POST /v1/audio/transcriptions over the rendered audio. Music, sound
effects, images, and video generate through /v1/audio/music,
/v1/audio/foley, /v1/images/generations, and /v1/videos/generations. The
shared catalog is a listing under media/<type>/ in our own object store,
browsed through /v1/s3 — an empty prefix reports itself as empty rather
than reading as a bad query.

One client (scripts/lib/api.mjs) holds every route and the one credential:
a Hanzo IAM token in $HANZO_API_KEY, read from Hanzo KMS. No credential
file, no per-repo .env, no per-provider CLI to install or keep current.
$HANZO_BASE_URL points the same code at a local Hanzo Engine.

Word timings are passed through, never interpolated: a caption cut on
invented boundaries reads as correct and drifts against the voice. When
the service returns text without them, the word array is empty and the
caller is told.

Deletes the provider cascade this replaces, its model ladders, and the
account linking in telemetry — the install id stands alone.
2026-08-13 17:18:37 -07:00

4.0 KiB

media-use usage dashboard

Reproducible definition of the media-use usage dashboard. The dashboard answers "how much is media-use used, for what, is reuse working, and what can't it satisfy" from the telemetry scripts/lib/telemetry.mjs already emits. Build it in an authorized Frames analytics project; this doc is the source of truth so it can be recreated. Local complement: resolve --stats (same questions, from .media/ + ~/.media, no dashboard access needed).

Identity (see scripts/lib/telemetry.mjs)

Events attribute to the same install as the CLI and studio — the shared install id in ~/.frames/config.json (anonymousId) and nothing else. No account is stitched in: pseudonymous, always. $ip:null. Opt-out: FRAMES_NO_TELEMETRY=1 / DO_NOT_TRACK=1 (also CI, dev).

Event catalog (verified present in-project)

Every event carries surface: "media-use". Event properties are coarse — never intent text, file names, or paths.

Event Fires on Key properties
media_use_resolve a resolve that produced/returned an asset type, source, provider, via, local_only, provider_override
media_use_resolve_miss a resolve that found nothing type, local_only, provider_override (no intent)
media_use_candidates --candidates / --dry-run listing type, counts
media_use_doctor_run --doctor ok, checks_failed, failed[]
media_use_compare grade-compare / compare command, cells, truncated, total, render_ready_timed_out
media_use_transcribe · media_use_duck · media_use_transcript_cut audio-engine ops op-specific

Dashboard tiles

  1. Invocation volume — query-trends, count of media_use_resolve over time (daily). "How much."
  2. By media type — media_use_resolve broken down by type (bgm/sfx/image/icon/logo/voice/grade/lut). "For what."
  3. Resolve hit-rate — trends formula: A / (A + B) where A = media_use_resolve, B = media_use_resolve_miss. "Is the catalog covering needs."
  4. Provider mix — media_use_resolve broken down by provider; a second tile by via (url / params-fallback / params) to catch CDN→params LUT downgrades.
  5. Top misses — media_use_resolve_miss broken down by type (the tuning signal — pair with local resolve --stats, which also shows the missed intents that telemetry deliberately omits).
  6. Doctor health — media_use_doctor_run broken down by failed[] (which dependency check fails most) + checks_failed distribution.
  7. Compare cost — media_use_compare by command, plus truncated / render_ready_timed_out rates (observe before lifting the 16-cell cap).
  8. Adoption (optional) — if the first_run property ships (plan U5), segment media_use_resolve first-run vs repeat.

Recreate in an analytics dashboard

For each tile, confirm the event/property schema, build its trend or breakdown, then add it to a dashboard. Keep names prefixed media-use: so the dashboard is greppable. Cross-surface note: because identity is shared with CLI/studio, you can also break these down by the same person across cli_command* and studio:* events.