Commit Graph

21 Commits

Author SHA1 Message Date
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
sweetman.eth 974557ced7 chore: prune orphaned vendored references from content skills (#80)
Six reference files were vendored into content skills whose own SKILL.md
never cites or uses them. Under the Portable Skill Contract, a skill vendors
only the shared files it actually reads; these copies were dead weight the
drift check still had to keep byte-identical.

Removed (445 lines, verified uncited in each skill's SKILL.md and unused by
any script):
- write-caption (text-only, never posts): analyze-gate, content-api, song-sourcing
- reactive-post (routes to a format skill): content-api, song-sourcing
- make-graphics (static image, no audio): song-sourcing

Kept every reference a skill actually cites (e.g. reactive-post keeps
analyze-gate — its Stop hook uses it). Canonical /references copies and the
video/asset-pack skills that use these files are untouched.

Dropped the six copy registrations from scripts/vendored.json. All gates pass:
check_vendored, portability_lint, validate_manifests, check_resolvable.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 16:33:10 -05:00
sweetman.eth de3a365225 feat: add recoup-platform-track-onboarding + internal activation scorecards (#79)
New public skill: score an account against the eight-checkpoint Recoup
activation funnel (signup → artist → socials → chat → valuation → catalog
claim → first scheduled task → paying) using the caller's own API key, then
route to the skill that completes the next step. Read-only by design; the
activation bar is claim-a-catalog + first-scheduled-task within week one,
since scheduled tasks are the behavior that separates retained accounts
from ghosts (validated on the 2026-07-13→20 signup cohort, where all four
signups stalled before step 7).

The checkpoint definition is canonical in the new skill and vendored into
recoup-internal-account-health-report (per-account grade in the verdict)
and recoup-internal-weekly-usage-review (signup-cohort scorecard),
registered in scripts/vendored.json.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 13:21:04 -05:00
sweetman.eth a121239492 feat(social-ship-posts): wire the account story canon (NARRATIVE.md) into the loop (#77)
* feat(social-ship-posts): wire the account story canon (NARRATIVE.md) into the loop

Draft step now requires naming which storyline arc and character a post
serves (from the account workspace's NARRATIVE.md story bible) before
writing copy; the log step records the arc for continuity. Accounts
without a canon get flagged to the owner.

Grounded in the sweetman account data (2026-07-06 scrape): narrative
posts (builder BTS, integrity creed, named-artist earnings) are the
consistent winners; launch-framed posts flatline.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(resolver): route the facetime video skill; allow dots in skill slugs

Pre-existing drift surfaced by this PR's CI run: the
recoup-internal-video-grok-1.5-imagine-facetime skill landed with no
RESOLVER.md intent row, failing the no-dark-skills check repo-wide.

Adding the row alone wasn't enough — check_resolvable.py's SKILL_TOKEN
regex ([a-z0-9-]+) can't match a slug containing a dot, so the skill
could never be marked reachable. Widen the regex to accept dot-separated
segments and add the Tier 3 route.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(resolver-eval): routing fixture for the facetime video skill; dot-safe slug regex

Second gate of the same pre-existing drift: the coverage ratchet requires
a positive fixture per skill, and run_resolver_eval.py carries its own
copy of the dotless SKILL_TOKEN regex, so the facetime skill could
neither be routed nor covered. Widen the regex (matching
check_resolvable.py) and add the positive fixture with an adversarial
'not' against recoup-content-make-video.

All five validate-job steps pass locally.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 16:46:14 -05:00
Sidney Swift 9439f67999 docs(vendoring): correct vendored.json _comment re: canonical location
cubic flagged that the _comment claimed all canonicals live at the repo root, but
3 of 24 groups have skill-internal canonicals — files shared only between sibling
skills with no root copy (methodology.md, recoup-api.md, and the release variant of
response-shapes.md, which can't sit at references/response-shapes.md since that name
already holds the different research variant). Hoisting isn't possible/desirable, so
align the docs with reality instead:

- scripts/vendored.json: _comment now says canonical is the root copy where the file
  exists at root, else one skill copy for sibling-only shared files.
- AGENTS.md: same softening of the "root is always canonical" line.

No group data changed; check_vendored still passes (62 copies / 24 groups).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 03:07:14 -04:00
Sidney Swift 3590eb500f chore(vendoring): wire vendored.json to the shared files it should guard
After the flatten, check_vendored was a no-op (0 groups) — but the repo still
vendors heavily: per the Portable Skill Contract each skill is self-contained, so
references/templates/fixtures shared by multiple skills are copied into each skill.
Those copies (workflows.md ×6, the content references ×5 each, flamingo-api.md ×3,
the deal templates, the demo data room, …) were unregistered and could silently drift.

- scripts/vendored.json: register all cross-skill / skill↔root duplicates — 24 groups
  (1 dir: fixtures/demo-data-room; 23 file), 62 copies. Canonical = the repo-root
  references/ , templates/ , fixtures/ copy (or one skill copy where no root copy exists).
- AGENTS.md: drop the now-stale "vendored.json is currently empty" note from the glossary.

check_vendored now verifies 62 copies across 24 groups; all five gates exit 0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 02:51:52 -04:00
Sidney Swift 0a10e58129 fix(review): address cubic PR findings
- scripts/run_resolver_eval.py: LLM-tier router system prompt referenced the old
  "recoup-records plugin" → "Recoup Skills plugin" (cubic #1).
- resolver-eval.jsonl: add adversarial gating negatives so the eval defends the
  invariant that internal skills must NOT fire without the recoup-internal keyword
  (de-gated valuation/caption/overview requests route to the customer skill, not
  the internal one). The dev/eval internal skills have no customer-request surface,
  noted inline (cubic #2).
- README.md: reword the Manual install so it matches the flat-plugin architecture
  (the repo root is the plugin) instead of "point your agent at skills/" (cubic #3).
- hooks/check-env.sh: same stale-"recoup-records" class as cubic #1 — updated the
  SessionStart directive to "Recoup Skills".

All five validators still exit 0 (eval: 40 positives + 10 adversarial negatives).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 02:42:41 -04:00
Sidney Swift d3f22cb7e9 refactor: collapse marketplace into one flat plugin; namespace internal skills
Collapse the marketplace-of-3-plugins (recoup-skills + recoup-records +
recoup-internal) into a single flat plugin rooted at the repo root (Option A).

- skills/ is now the flat, de-duplicated union: 25 recoup-records skills + 6
  internal skills, renamed to the 5-token recoup-internal-* convention and gated
  by a literal "recoup-internal" trigger keyword in each description.
- Removed 15 legacy public skills: 11 functional twins of bundle skills (their
  capability lives on in recoup-* / recoup-internal-*) and 4 orphans with no
  bundle twin (chart-metric, song-writing, streaming-growth, trend-to-song),
  per the agreed bundle-only set.
- Rehomed recoup-records' non-skill components to the repo root: agents/, hooks/,
  references/, templates/, fixtures/, RESOLVER.md, resolver-eval.jsonl.
- Deleted the two nested plugin manifest trees and the whole plugins/ directory.
- Manifests reduced to a single entry (recoup-skills, source "."), rebranded as
  the all-in-one and bumped to 2.0.0, across all four runtime manifests.
- RESOLVER.md gains a Tier 3 "internal" section; resolver-eval.jsonl gains a
  recoup-internal-* routing fixture per internal skill.
- Repointed check_resolvable.py / run_resolver_eval.py at the repo root and
  emptied scripts/vendored.json (no cross-plugin copies remain).
- Updated README, AGENTS.md/CLAUDE.md, and the CI comment for the flat structure.

Tradeoff (accepted): no more subset installs ("just records" / "just internal"),
and the 6 internal skills now ship publicly via `npx skills add recoupable/skills`
(gated, but installable). All five validation gates pass; final set = 31 skills.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 02:21:38 -04:00
Sidney Swift cd6ca12073 chore(skills): remove stale content and migrate docs to resolver model
Stop documenting API surface, fields, and plans that no longer exist, and
align the convention docs with the shipped 4-token + RESOLVER.md model.

- recoup-records research/release skills: drop removed-endpoint denylists and
  dead Chartmetric fields (career_stage, match_strength, cm_statistics, ...)
  plus "old engine gone" archaeology from the SKILLs, endpoints.md,
  response-shapes.md, and workflows.md (canonical + vendored copies kept
  byte-identical).
- recoup-records README + manifests: remove the experiment banner, "focused
  plugins" history, and dead doc links; marketplace catalogs drop the stale
  "chartmetric" keyword; connect-account memory marker renamed off the old
  recoup-setup skill name; recoup-valuation-api points at recoup-roster-add-artist.
- docs/: delete superseded journey docs (skill-rename-proposal[-v3],
  ab-eval-results, experiment-rolled-up-skills, fat-skills-benchmark) and
  de-reference fat-skills-benchmark from the gate scripts.
- AGENTS.md, skill-naming.md, TEMPLATE.md: migrate naming to
  recoup-[domain]-[verb]-[noun] and routing from "router skill" to RESOLVER.md
  dispatch (incl. the two routing gates).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 22:55:41 -04:00
Sidney Swift 178c17d82d refactor(recoup-internal): rename skills to recoup-[domain]-[verb]-[noun]
- Rename the 5 recoup-internal skills to the records naming convention:
  issue-management -> recoup-issue-write-tracker,
  issue-implementation -> recoup-issue-implement-tdd,
  skill-pack-benchmark -> recoup-skill-benchmark-pack,
  valuation-sales-pipeline -> recoup-sales-work-pipeline,
  recoup-account-status -> recoup-account-health-report
- Update frontmatter names, cross-references, scripts, and the README table
- Decouple from the public skills/ library in vendored.json: the renamed
  skills intentionally diverge from the library originals (which keep their
  own convention), so they are no longer byte-identical vendored copies

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 21:33:38 -04:00
Sidney Swift 2afd558aef Merge origin/main into experiment/rolled-up-skills
Fold main's two new skills into the consolidated two-plugin layout instead of the
old per-domain plugins they were authored against:

- recoup-account-status (#45) — was added under the now-removed recoup-essentials
  plugin; relocated to top-level canonical skills/recoup-account-status and
  vendored into recoup-internal.
- valuation-sales-pipeline (#46) — kept as the top-level canonical it landed as,
  and vendored into recoup-internal.

Resolves the recoup-essentials/README.md modify/delete conflict by honoring the
rollup's deletion (recoup-essentials is gone). vendored.json gains both new copy
groups; recoup-internal README lists all five skills. All 5 validation gates pass.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 16:43:05 -04:00
Sidney Swift 3f38461bbe refactor(plugins): rename recoup-engineering -> recoup-internal
Reframe the engineering plugin as Recoup's internal-ops toolkit — the home for
all internal-facing skills, as opposed to the artist/label-facing recoup-records.
The three existing skills (issue-management, issue-implementation,
skill-pack-benchmark) are unchanged; sales-pipeline + account-status land in the
follow-up merge with origin/main.

Updates the plugin dir, its three per-harness manifests, the README, both
marketplace.json registries (kept in parity), vendored.json copy paths, and the
repo structure docs (README.md, AGENTS.md). All 5 validation gates pass.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 16:39:19 -04:00
Sidney Swift f055b8eee2 feat(recoup-records): wire LLM resolver eval and sharpen skill routing boundaries
- run_resolver_eval.py: replace the LLM-tier stub with a real router test that
  hands each fixture the Stage-1 skill descriptions + intent to the Vercel AI
  Gateway (stdlib HTTP, certifi TLS), asserts it routes to `expected` and never
  a `not`, and gates on a configurable pass-rate threshold.
- Sharpen recoup-catalogs / recoup-research / recoup-songs descriptions to draw
  clear boundaries (deal diligence vs web/playlist research vs audio analysis)
  so Stage-1 routing is unambiguous.
2026-06-22 16:10:40 -04:00
Sidney Swift 15310b7767 chore(plugins): consolidate to recoup-records + recoup-engineering
Remove the six focused source plugins (essentials, research, deals, content,
song-analysis, releases). recoup-records is now a self-contained, hand-maintained
"record label in a box", so the focused sources are no longer needed.

- prune scripts/vendored.json to surviving groups (39 -> 4)
- drop removed plugins from both marketplace.json registries (kept in parity)
- delete defunct scripts/build_records_plugin.py generator + its CI comment
- update AGENTS.md / README.md / recoup-records README to the new structure

All 5 CI gates pass (portability, vendored, manifests, resolver x2).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-20 01:17:37 -04:00
Sidney Swift 15d54b4e33 feat(recoup-engineering): add engineering plugin + skill-pack-benchmark skill
Add a skill-pack-benchmark skill that grades any plugin or skills folder
against the frontier (gstack, gbrain, compound-engineering, PM OS): a
deterministic measure.py plus a frontier reference and a 15-dimension
scorecard. Bundle it with the two existing issue skills into a new
recoup-engineering plugin — three per-harness manifests, README, LICENSE,
icon, marketplace entries in both registries, and vendored drift-check groups
so the plugin copies stay byte-identical to their canonical skills/ sources.

Retire the build_records_plugin.py --check gate from AGENTS.md to match CI,
which already replaced it with the resolver reachability + eval gates now that
recoup-records is hand-maintained.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 00:33:11 -04:00
Sidney Swift fa43304923 feat(recoup-records): tested routing, compounding memory, fatter content skills
Make the "record label in a box" bundle a first-class, hand-maintained plugin
and apply the fat-skills benchmark (docs/fat-skills-benchmark.md):

- RESOLVER.md dispatcher for all 44 skills (7 domains + cross-domain
  disambiguation) so routing decisions live in one tested place at 40+-skill
  scale, where description-only matching starts to break down.
- scripts/check_resolvable.py: reachability gate (no "dark" skills; every route
  resolves). scripts/run_resolver_eval.py + resolver-eval.jsonl: routing
  fixtures (44 positives + 20 adversarial negatives) with coverage enforced so
  fixtures ratchet alongside skills. Both wired into CI; retired the
  bundle-drift gate (records is now maintained directly, drift accepted).
- recoup-learn: compounding-memory skill (research-broadly / write-once / dedup
  / discoverability) so each run makes the next cheaper.
- SessionStart hook upgraded from passive env-advice to a single imperative,
  arbitrated directive (route-through-RESOLVER, or run /recoup-setup first).
- Fattened the genuinely-thin content visual leaves to the exemplar shape
  (phased procedure + diarization + decision-brief + analyze-gate verification
  loop): content-caption, cover-art, thumbnail, visualizer.

Also adds docs/fat-skills-benchmark.md (the frontier-vs-Recoup analysis) and
docs/research (the research wiki as a submodule, pointed at recoupable/research).

Fixtures live at the plugin root, not tests/ (which is gitignored), so CI can
run them on a fresh checkout.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 00:21:58 -04:00
Sidney Swift 07071b7e5a feat(recoup-records): add songwriting + catalog-value to the bundle
Pull two curated standalone skills into the recoup-records bundle via the
generator's new EXTRA_SKILLS map: recoup-songwriting (from skills/song-writing,
kept out of the audio song-* family) and recoup-catalog-value (from
skills/catalog-value-estimator).

Disambiguate the two overlaps a triggering test surfaced:
- input-gate recoup-catalog-value (public data, no seller files) vs
  recoup-deal-value (ingested data room); drop the shared "what is this catalog
  worth" trigger from deal-value.
- separate the "hook" overlap: recoup-songwriting = written lyrical/melodic hook
  (no audio); recoup-song-hook = clip-worthy moment in a recording.

Update docs/skill-naming.md to as-built (43 skills).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-15 23:33:18 -04:00
Sidney Swift a0195fe2a9 chore(skills): drop slash-commands, standardize on skills-only
Skills already auto-register a /skill-name entry on every harness, and
custom commands are merged into skills on Claude Code and removed on
Codex — so a separate commands/ layer is redundant or dead weight.

- Remove commands/ from recoup-content and recoup-research; stop
  build_records_plugin.py from bundling commands + writing the Cursor
  commands path
- Drop the commands path/prose from content manifests + both marketplace
  registries; regenerate the recoup-records bundle
- Add a "No slash-commands — skills only" rule to AGENTS.md and fix the
  docs/READMEs that referenced commands

Also includes the in-progress recoup-label-in-a-box restructuring already
present in the working tree (skill renames to scope-token names,
song-analysis consolidation, and the generated recoup-records bundle).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-15 22:58:02 -04:00
Sidney Swift bb34b5982e Add recoup-releases plugin + two research monitor skills
Rebrand the copied release-workflow plugin to recoup-releases and resolve
all of its chained-skill references to real skills.

- recoup-releases: full rostrum→recoup rebrand (manifests, README, LICENSE,
  skills, scripts, agents, hooks, fixtures).
- Rewire chained refs to existing skills: song-tiktok-velocity→recoup-tiktok-per-song,
  brand-voice→recoup-brand-voice-caption, sync-licensing-monitor→recoup-song-sync-brief,
  marketing-planner→recoup-release-start.
- Create two recoup-research skills (real /research/* endpoints, refuse to
  fabricate): recoup-new-release-monitor (launch-day drop confirmation + alert)
  and recoup-streaming-check (snapshot-diff spike/drop spot-check); rewire the
  remaining release refs to these.
- Vendor endpoints.md + response-shapes.md into both new skills; bump
  recoup-research 0.2.0→0.3.0 (3 manifests + both marketplace catalogs);
  register recoup-releases v0.1.0 in both catalogs.
- Add build-time plugin-authoring reference docs under docs/.

Gates: portability 56, vendored 153/35, manifests 22 + parity.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-07 21:13:52 -04:00
Sidney Swift 2ca4e7a03a Add artist-resolution navigation layer + finalize plugin restructure
Teach agents how to navigate "which artist?": browse a roster, target a
specific roster artist, research any artist, or add a new one — so they
look up real artists via the API instead of fabricating personas.

recoup-api:
- document x-api-key auth alongside the Bearer sandbox token
- add a 4-mode router (research / browse roster / specific roster artist / add)
- add roster discovery (orgs -> artists) with verified field shapes
- add a stop rule: empty roster or agent+@recoupable.com key => surface it,
  never invent an artist
recoup-artist-workspace: fall back to the API for inventory when there is no
  sandbox filesystem (was: "never call the API")
account-resolver (+ vendored copies): /artists/{account_id}/socials uses
  account_id (verified; row id 404s); add browse-without-a-name + empty/agent guard
recoup-setup: Step 6 now reaches the artist hop and flags throwaway keys
e2e-review: replace the hallucinated 1920s Gatsby Grace persona with real,
  API-sourced data (US pop artist on Rostrum Pacific)

Also folds in the in-progress plugin rename/unification (plugins/{content,deals,
...} -> plugins/recoup-*) and marketplace updates. Validation gates pass:
portability, vendored parity, manifests.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-07 20:18:27 -04:00
Sidney Swift aaf9c06c42 Unify skills, plugins, and marketplace into one cross-harness source of truth (#33)
* feat: consolidate skills + plugins into single recoupable/skills repo

Unify the open skills library, rich plugins, and the marketplace registry
into one repo to kill the drift between recoupable/marketplace (live) and
recoupable/skills (stale), and the Claude/Codex registry mismatches.

Structure:
- skills/                     generic, install-anywhere library skills
- plugins/{research,catalog,content}/   rich plugins (commands, agents, evals, refs)
- .claude-plugin/marketplace.json + .agents/plugins/marketplace.json
  unified registries listing the library (source ".") + 3 plugins

Content reconciliation (single-source the duplicated short-video):
- Promote the newer short-video to the library and bundle its references
  (short-video-manual.md, song-sourcing.md) inside skills/short-video/
  so the library skill is self-contained.
- Remove the duplicated short-video + content-creation from plugins/content.
- Rewrite recoup-content-create to inline the async pipeline and reference
  library skills (short-video, content-creation, create-artist) by name,
  decoupling it from in-tree relative paths.
- Refresh plugins/content README + legacy command to drop dead in-tree refs.

Validated e2e: all manifest sources resolve, every SKILL.md has valid
frontmatter, no duplicate skill names (42 distinct), JSON parses clean.

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat: make all 42 skills cross-harness portable (self-contained)

Reject the Claude-only ${CLAUDE_PLUGIN_ROOT} pattern (verified: doesn't
expand in markdown bodies, runtime CWD is the user project) in favor of
the compound-engineering self-containment model so every skill runs on
any harness (Claude Code, Codex, Cursor, bare npx skills), not just as a
Claude marketplace plugin.

- Portable Skill Contract added to AGENTS.md + contributing.md
- scripts/: portability_lint, check_vendored (file + recursive-dir drift),
  validate_manifests (+ dual-manifest parity), vendored.json (27 groups)
- research (10): vendor the used shared refs per skill; md-links -> backtick
- catalog (17): vendor plugin-root refs + deal-workspace template +
  demo-data-room fixtures + full 17-script set into 8 script-bearing skills;
  kill cross-skill dep (royalty-audit<-catalog-analysis); rephrase prose
- library (14) + content (1): fix mir links, de-path cross-skill prose,
  replace dead content-strategy.md ref with inline guidance
- ci: .github/workflows/validate.yml runs lint + drift + manifests

Verified: lint 42/42 portable, drift 174 copies/27 groups, manifests
13 files + parity OK. Vendored catalog scripts execute from skill dir.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor: vendor catalog scripts as per-skill dependency closures

The first portability pass copied the full 17-script catalog toolkit into
all 8 script-bearing skills (136 copies). Most skills invoke far fewer:
dashboard 1, kickoff 1, report 2. Replace the superset with each skill's
true closure — scripts named in SKILL.md plus their transitive deps:
run-deal-checks's 5 subprocess validators, auto-column-map's importlib
normalize target, and the shared _helpers import.

Drops 80 dead copies (174 -> 94 tracked). Verified: lint 42/42, drift
94/27 green, and the dynamic subprocess/importlib chains execute from
each tightened skill dir.

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor(deals): fold 14 deal skills into 6 workflow stages

Collapse the deal skills into start / ingest / analysis / dashboard /
report / demo so the slash menu reads as a natural workflow. Most users
only run the orchestrator, so granular skills became modes, params, and
bundled reference playbooks. Nothing dropped.

- start: absorbs workspace-setup + carries deal-type modes
  (buy-side / seller-prep / financing / post-close)
- analysis: absorbs rights-reviewer, royalties-auditor,
  financing-underwriter, seller-prep, post-close-admin as references/*.md
- dashboard: absorbs quality-checker pre-share QC gate
- report: absorbs memo-maker (memo assembly + packages)
- vendored.json slug-remapped + resynced; hooks.json Gate B fixed;
  plugin README rewritten to the true 6

Gates green: portability_lint (31 portable), check_vendored (85 copies /
25 groups), validate_manifests (13 files + parity). Repo-wide sweep:
zero lingering old deal slugs.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: address cubic review findings on deal validators + docs

Resolves 9 review comments from cubic-dev-ai on PR #33.

P1:
- protect-source-files.sh: also match relative `deals/*/source/*` paths
  (Write/Edit tools pass repo-relative paths; the leading-segment glob alone
  missed them, leaving immutable source files writable).
- validate-evidence-ledger.py: guard non-dict top-level JSON (array/primitive
  no longer crashes with AttributeError; emits a clean error).
- deal-workspace.md: workpapers list now `nps-bridge.json` + `nls-bridge.json`
  (two files, matching the dashboard validator) instead of a combined file.

P2:
- validate-deal-workspace.py: catch OSError/UnicodeDecodeError, not just
  JSONDecodeError, so unreadable/non-UTF8 files report cleanly.
- validate-normalized-ledger.py: report empty `ledger_line_id` values as a
  data-integrity error instead of silently accepting them.
- validate-findings-evidence.py: handle malformed JSON in both loaders;
  emit a structured `invalid_findings_file` result instead of a traceback.
- content plugin manifests: author email -> agent@recoupable.com to match
  marketplace.json + branding.
- deal-workspace.md: `valuation-scenarios.md` -> `valuation-summary.json`
  (matches the workspace + dashboard validators).

P3:
- AGENTS.md: align Skill Format (templates/, fixtures/) with the Portable
  Contract; drop the contradictory assets/ reference.

Vendored copies resynced (20). Gates green: portability 31, vendored 85, manifests 13.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: rename root plugin recoupable-skills -> recoup-skills

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: drop -plugin suffix from plugin names (recoup-deals/research/content)

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs: rebrand root library to "Recoup Skills" + add CLAUDE.md symlink

- README.md / AGENTS.md titles: "Recoupable Skills" -> "Recoup Skills"
- displayName fields (marketplace + codex manifest) -> "Recoup Skills"
- README skill-dir tree: assets/ -> templates/ + fixtures/ (matches AGENTS.md contract)
- CLAUDE.md -> AGENTS.md symlink so Claude Code reads the same instructions

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs: add Plugins section to README; drop ' Plugin' from research/content titles

Co-authored-by: Cursor <cursoragent@cursor.com>

* feat: add recoup-song-* skills for Music Flamingo audio analysis

Add a P0 router skill (recoup-song-analyzer) plus five focused P1
workflow skills built on the Music Flamingo /api/songs/analyze endpoint:

- recoup-song-analyzer: entry point — resolves audio URL, picks preset,
  routes to focused workflows
- recoup-song-metadata-tagger: structured catalog metadata
- recoup-song-lyrics-transcriber: sectioned lyric sheet (draft)
- recoup-song-playlist-pitch-maker: DSP/editorial pitch + positioning
- recoup-song-sync-brief-maker: supervisor sync brief + clearance risk
- recoup-song-mix-feedback-reviewer: technical mix critique

Canonical endpoint reference lives in recoup-song-analyzer and is
vendored byte-identical into the other five (registered in
scripts/vendored.json). README skill table updated. All three gates
pass (portability, vendor drift, manifests).

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor: promote recoup-song-* skills into recoup-songs plugin

Convert the six loose recoup-song-* skills into a cohesive recoup-songs
plugin, matching the structure of recoup-deals/research/content.

- git mv skills/recoup-song-* -> plugins/songs/skills/ (history preserved)
- promote canonical flamingo-api.md to plugins/songs/references/ and vendor
  it byte-identical into all 6 skills (analyzer included) — fixes the prior
  smell where recoup-song-analyzer owned the reference the others depended on
- add plugin manifests (.claude-plugin + .cursor-plugin), README, LICENSE
- register recoup-songs in both marketplace files (.claude-plugin + .agents)
- root README: drop the analyzer skills-table row, add Recoup Songs to the
  Plugins table

All 3 gates pass: portability (37), vendor drift (91 copies / 26 groups),
manifests (15 files + dual-manifest parity).

Co-authored-by: Cursor <cursoragent@cursor.com>

* refactor: shorten recoup-song-* P1 skill names (drop action suffixes)

Drop the action-noun suffix from the five P1 skills so the names read as
the thing they produce, not the actor:

- recoup-song-metadata-tagger      -> recoup-song-metadata
- recoup-song-lyrics-transcriber   -> recoup-song-lyrics
- recoup-song-playlist-pitch-maker -> recoup-song-playlist-pitch
- recoup-song-sync-brief-maker     -> recoup-song-sync-brief
- recoup-song-mix-feedback-reviewer-> recoup-song-mix-feedback

git mv preserves history. Updated SKILL.md name frontmatter, analyzer
decision-tree handoffs, sibling cross-references, plugin README skill
table, and scripts/vendored.json paths. recoup-song-analyzer (router)
unchanged. All 3 gates pass.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: address cubic review comments on PR #33

- validate-findings-evidence.py: a present-but-malformed evidence-ledger.json
  is now a hard error (invalid_ledger_file) instead of being silently
  downgraded to an empty set, which could report status: ok without
  validating any evidence references. Missing ledger stays tolerable.
- validate-normalized-ledger.py: only inspect ledger_line_id values when the
  column exists, so empty strings no longer leak into the dedup sets and
  produce a confusing "duplicate empty id" error on top of the real
  missing-column error.
- Standardize all plugin author emails on agent@recoupable.com (documented
  support email) across marketplace + plugin.json manifests for consistency.
- Re-vendored 9 byte-identical script copies; all 3 gates green.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 03:10:19 -04:00