mirror of
https://github.com/recoupable/skills.git
synced 2026-09-14 20:26:58 +08:00
fix/sales-draft-approval
21 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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>
|
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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. |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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>
|