Files
recoupable__skills/resolver-eval.jsonl
sweetman.eth f6e9010f52 feat(music-video): split recoup-music-video out of recoup-internal-marketing (#132)
* feat(music-video): split recoup-music-video out of recoup-internal-marketing

references/music-video.md was 377 lines of hard-won craft living inside the
internal daily-marketing run, gated behind the recoup-internal keyword and
therefore unreachable by customers — while its own routing table sent
customer-facing work to recoup-content-make-video, whose backend has been
cold since April.

Promotes it to a customer-facing skill. recoup-internal-marketing keeps a
routing row and loses the file; nothing else about it changes, and
seedance.md's run log stays where it is.

v1 is generated-song only. The source doc already split on provenance, and
taking that branch drops every rights gate — no master-recording consent, no
label or producer sign-off, no featured-voice gate — because there is no
master. Casting invented characters was already the default, so the likeness
gate goes too. Bringing your own song is v2 and is named as out of scope so
nobody improvises those gates.

Three changes for leaving the internal workspace:

- Scaffolds from scratch. There is no content/letal-xlug/ in a customer
  sandbox. hyperframes is pinned to 0.7.5 for the documented reason.
- Paid steps go through the Recoup API with RECOUP_ACCESS_TOKEN, never a fal
  key in the sandbox, so credits meter and our key stays server-side.
- Composes FOR the free tier's 15 seconds rather than truncating a long film
  to them. A truncated film is the worst possible first impression.

Ends by printing the media URL as JSON on stdout, which is what the chat
renders a player from.

Implements row 10 of recoupable/app#2052

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KcNQAfA3nS7BTrMB3bXsnX

* fix(music-video): match the shipped api#887/docs#328 contract, drop unavailable lip-sync

This skill was drafted before api#887 and docs#328 shipped and drifted
from what actually exists:

- Stills and motion now call POST $RECOUP_API/api/content/image and
  /api/content/video (matching the /api/music pattern already used
  for the song step), not raw fal — the skill's own rule ("never put
  an API key in the sandbox") ruled out the fal.subscribe() snippet
  it still had.
- Dropped the OmniHuman/lip-sync row entirely: /api/content/video is
  pinned to H3 Max only, with no mode or model parameter — lip-sync
  isn't reachable from the sandbox at all right now. Reframed the
  mouth-visible/no-mouth scene-table split around framing choices
  instead of a model choice, and moved lip-sync to "Not yet (v2)".
- Fixed H3 Max pricing to the verified rate: promo is $0.02/s at 768P
  (not $0.04) through 2026-09-07 (not 2026-09-01); standing rate
  $0.08/s was already right. Billing scales the unit count at 768P,
  not a separate per-second rate.
- prompt_expansion_mode: "disabled" isn't a valid value on the real
  schema (balanced | quality, default balanced).
- Vendored the missing skills/recoup-internal-marketing/references/
  hooks.md copy the split PR left out — the skill referenced it but
  never carried it, which failed portability_lint.

All five validation gates pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KcNQAfA3nS7BTrMB3bXsnX

* fix(music-video): resolve merge conflicts with main, drop stale OmniHuman mention

Merged origin/main (#133, #134) into this branch. The real conflict was
skills/recoup-internal-marketing/references/music-video.md — main edited it
while this branch deletes/renames it into recoup-music-video/SKILL.md; git's
three-way merge resolved cleanly since the two edits touched different
sections, and both of #133's craft additions (the muse-image plate-lock test
finding, the expanded content-filter trigger list) landed in the new skill.

Two follow-up fixes the merge itself didn't cover:
- skills/recoup-internal-marketing/SKILL.md:180 referenced the now-deleted
  references/music-video.md by backtick path (portability_lint treats that
  as a live file reference) — reworded to name the new skill instead.
- video-formats.md's routing-table row for music video still said "OmniHuman
  for mouths" — stale since api#887 shipped H3-Max-only, no lip-sync route.

Pre-existing on main, not touched here: recoup-minimax-music-3 (#134) fails
portability_lint/check_resolvable/run_resolver_eval on its own — missing
references/video-pipeline.md and no RESOLVER.md route. Out of scope for
this PR.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KcNQAfA3nS7BTrMB3bXsnX

* fix(minimax-music-3): fix the pre-existing CI break from #134

main itself has been red since #134 merged 2026-09-02 — confirmed
against its own CI run (33697344025), not just this branch:

- recoup-minimax-music-3/SKILL.md referenced another skill's file by
  backtick path (`references/video-pipeline.md`, which lives in
  recoup-internal-marketing), which portability_lint correctly reads
  as a same-skill file that must exist in this skill's own directory.
  Reworded as a plain-prose handoff to the other skill, matching the
  house convention used everywhere else in this repo (name the skill,
  don't backtick a path into it).
- The skill had no RESOLVER.md route and no resolver-eval fixture, so
  check_resolvable and run_resolver_eval would have failed it too the
  moment portability_lint stopped blocking the job at step 1.

Out of scope for the music-video split this PR is actually about, but
it was blocking CI on this branch (and on main) regardless of what
this PR touches, so fixed here rather than leaving main red.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KcNQAfA3nS7BTrMB3bXsnX

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-03 15:46:55 -05:00

96 lines
10 KiB
JSON

# Resolver-eval fixtures — middle-tier (domain-grouped skills).
# One JSON object per line: {"intent": <user phrasing>, "expected": <skill that owns it>, "not": [<must-not-fire>]}
# Run: python3 scripts/run_resolver_eval.py
# Goal: prove each skill fires for a real phrasing, and the cross-skill forks route correctly.
# --- platform ---
{"intent": "set me up, verify my email and give me an api key", "expected": "recoup-platform-connect-account"}
{"intent": "how far am I in setting up recoup, what should I do next", "expected": "recoup-platform-track-onboarding", "not": ["recoup-platform-connect-account"]}
{"intent": "did I finish onboarding my account, show my activation checklist", "expected": "recoup-platform-track-onboarding"}
{"intent": "scaffold my workspace folders and mirror my roster into artists/", "expected": "recoup-platform-build-os"}
{"intent": "turn this repo into our label's self-managing music-company OS", "expected": "recoup-platform-build-os"}
{"intent": "call the recoup api to fetch this artist's socials", "expected": "recoup-platform-api-access"}
{"intent": "edit this google doc and sync it to a sandbox file", "expected": "recoup-platform-api-access"}
{"intent": "email me this weekly report as an html email", "expected": "recoup-platform-email-helper", "not": ["recoup-platform-api-access"]}
{"intent": "send the daily trends summary to the artist's manager", "expected": "recoup-platform-email-helper"}
{"intent": "that worked, remember this so we don't redo it next time", "expected": "recoup-platform-capture-lesson"}
# --- roster ---
{"intent": "onboard a new signing and set up their folder", "expected": "recoup-roster-add-artist"}
{"intent": "our org is empty with no artists yet — bulk-onboard our whole roster at once", "expected": "recoup-roster-onboard", "not": ["recoup-roster-add-artist"]}
{"intent": "what artists do I have, list my roster", "expected": "recoup-roster-list-artists"}
{"intent": "organize this artist's files and update their brand", "expected": "recoup-roster-manage-artist"}
# --- research ---
{"intent": "research Drake and give me an overview of how they're doing", "expected": "recoup-research-artist-overview"}
{"intent": "where are this artist's fans and what markets should we expand to", "expected": "recoup-research-artist-overview"}
{"intent": "find emerging unsigned artists in afrobeats", "expected": "recoup-research-find-talent"}
{"intent": "which playlists should this catalog target and where are the gaps", "expected": "recoup-research-playlist-targets", "not": ["recoup-song-placement-pitch"]}
{"intent": "find the manager and press contacts and draft outreach", "expected": "recoup-research-find-contacts"}
{"intent": "give me the weekly brief on what changed for this artist", "expected": "recoup-research-weekly-brief", "not": ["recoup-release-plan-rollout"]}
{"intent": "deep research why this song went viral, with citations", "expected": "recoup-research-the-web"}
{"intent": "enrich this record label with structured facts and recent news", "expected": "recoup-research-the-web"}
# --- song (audio-grounded) ---
{"intent": "generate an original song for this ad, no existing recording", "expected": "recoup-minimax-music-3", "not": ["recoup-music-video", "recoup-song-analyze-audio"]}
{"intent": "analyze this track's audio, bpm key genre and a mix critique", "expected": "recoup-song-analyze-audio"}
{"intent": "find the best 15 seconds of this song to clip", "expected": "recoup-song-find-hook", "not": ["recoup-content-make-video"]}
{"intent": "write a playlist pitch and sync brief for this single from the audio", "expected": "recoup-song-placement-pitch", "not": ["recoup-research-playlist-targets"]}
# --- content ---
{"intent": "write an instagram caption in this artist's voice", "expected": "recoup-content-write-caption"}
{"intent": "make square cover art and a youtube thumbnail with a hook line", "expected": "recoup-content-make-graphics"}
{"intent": "make a tiktok video of the artist with their song", "expected": "recoup-content-make-video"}
{"intent": "make a looping spotify canvas with no text", "expected": "recoup-content-make-video"}
{"intent": "give me a whole content pack, 30 posts for the launch", "expected": "recoup-content-asset-pack"}
{"intent": "they just crossed 1B streams, make something off that", "expected": "recoup-content-reactive-post", "not": ["recoup-research-artist-overview"]}
# --- release ---
{"intent": "start a release and take it end to end with a brief and rollout schedule", "expected": "recoup-release-plan-rollout", "not": ["recoup-research-weekly-brief"]}
{"intent": "did this artist's single drop yet, set a launch alert", "expected": "recoup-release-track-drop"}
# --- catalog (the valuation fork) ---
{"intent": "review and underwrite this catalog deal end to end", "expected": "recoup-catalog-review-deal"}
{"intent": "clean and normalize this messy royalty data room", "expected": "recoup-catalog-review-deal"}
{"intent": "write the IC memo and export a shareable pdf", "expected": "recoup-catalog-review-deal"}
{"intent": "estimate this catalog's value from public streaming data, no seller files", "expected": "recoup-catalog-estimate-value", "not": ["recoup-research-the-web"]}
{"intent": "how much did this artist earn from their NFT sales", "expected": "recoup-nft-valuation", "not": ["recoup-catalog-estimate-value"]}
{"intent": "value this artist's catalog, she sold music NFTs on zora", "expected": "recoup-nft-valuation", "not": ["recoup-catalog-estimate-value", "recoup-catalog-review-deal"]}
{"intent": "measure her onchain earnings and fold them into the valuation", "expected": "recoup-nft-valuation"}
# --- internal (Recoup staff only; gated by the recoup-internal keyword) ---
{"intent": "recoup-internal write a tracking issue for the auth migration", "expected": "recoup-internal-dev-issue-tracker"}
{"intent": "recoup-internal ship issue #412 end to end, docs-first and test-driven", "expected": "recoup-internal-dev-ship-issue"}
{"intent": "recoup-internal benchmark this skills folder against the frontier", "expected": "recoup-internal-eval-skill-benchmark"}
{"intent": "recoup-internal run the daily sales sweep and tell me who to follow up with", "expected": "recoup-internal-sales", "not": ["recoup-internal-weekly-usage-review"]}
{"intent": "recoup-internal work the valuation funnel and advance this Attio lead", "expected": "recoup-internal-funnel-valuation-pipeline", "not": ["recoup-internal-sales"]}
{"intent": "recoup-internal account health snapshot for this account", "expected": "recoup-internal-account-health-report"}
{"intent": "recoup-internal run the weekly usage review, what happened while I was gone", "expected": "recoup-internal-weekly-usage-review", "not": ["recoup-internal-account-health-report"]}
{"intent": "recoup-internal draft and ship a launch post for LinkedIn and X", "expected": "recoup-internal-social-ship-posts"}
{"intent": "recoup-internal make a FaceTime-call style AI video ad with Grok Imagine", "expected": "recoup-internal-video-grok-1.5-imagine-facetime", "not": ["recoup-content-make-video"]}
{"intent": "recoup-internal apply to this Upwork job posting I just pasted", "expected": "recoup-internal-upwork", "not": ["recoup-internal-sales"]}
{"intent": "recoup-internal is this Upwork client worth spending connects on", "expected": "recoup-internal-upwork", "not": ["recoup-internal-sales"]}
{"intent": "recoup-internal write the cover letter and screening answers for this contract job", "expected": "recoup-internal-upwork", "not": ["recoup-research-find-contacts"]}
{"intent": "recoup-internal a client replied to my Upwork proposal, what do I say", "expected": "recoup-internal-upwork", "not": ["recoup-internal-sales"]}
{"intent": "recoup-internal run the Upwork pipeline, why is nothing converting", "expected": "recoup-internal-upwork", "not": ["recoup-internal-weekly-usage-review"]}
# --- gating invariant: WITHOUT the recoup-internal keyword, internal skills must NOT fire ---
# Only the internal skills with a plausible customer-facing collision get a negative; the dev/eval
# skills (issue-tracker, ship-issue, eval-skill-benchmark) have no customer-request surface to confuse.
{"intent": "what's this catalog worth from public streaming data", "expected": "recoup-catalog-estimate-value", "not": ["recoup-internal-funnel-valuation-pipeline"]}
{"intent": "write a caption for the artist's instagram post", "expected": "recoup-content-write-caption", "not": ["recoup-internal-social-ship-posts"]}
{"intent": "how is this artist doing across streaming and socials", "expected": "recoup-research-artist-overview", "not": ["recoup-internal-account-health-report"]}
{"intent": "pitch this song for a sync placement", "expected": "recoup-song-placement-pitch", "not": ["recoup-internal-upwork"]}
{"intent": "recoup-internal audit how last night's task emails went", "expected": "recoup-internal-task-email-audit"}
{"intent": "recoup-internal are we still sending empty footer-only emails from scheduled tasks", "expected": "recoup-internal-task-email-audit"}
{"intent": "recoup-internal do today's marketing on our own account", "expected": "recoup-internal-marketing", "not": ["recoup-internal-social-ship-posts"]}
{"intent": "recoup-internal what should we post today", "expected": "recoup-internal-marketing", "not": ["recoup-content-write-caption"]}
{"intent": "recoup-internal our hooks are weak, work out what to make today", "expected": "recoup-internal-marketing", "not": ["recoup-content-make-video"]}
{"intent": "recoup-internal do today's marketing run end to end for our own account", "expected": "recoup-internal-marketing", "not": ["recoup-internal-social-ship-posts"]}
{"intent": "recoup-internal scrape our socials, pick today's topic and build the video", "expected": "recoup-internal-marketing", "not": ["recoup-internal-social-ship-posts", "recoup-content-make-video"]}
{"intent": "recoup-internal our hooks have been weak lately, sort out today's content run", "expected": "recoup-internal-marketing", "not": ["recoup-internal-social-ship-posts"]}
{"intent": "make a music video for my song", "expected": "recoup-music-video"}
{"intent": "turn this track into a music video", "expected": "recoup-music-video"}
{"intent": "I want a music video about a couple living through an earthquake", "expected": "recoup-music-video"}
{"intent": "recoup-internal scrape our socials, pick today's topic and build the video", "expected": "recoup-internal-marketing", "not": ["recoup-music-video"]}