Last updated: 2026-04-14
Prompt: Overlaid images always placed top-left; use AI to determine ideal corner Status: in_progress (PR open, awaiting code review) Changes:
- tasks: New
ToolLoopAgent(createOverlayPositionAgent) analyzes editorial image to pick best overlay corner - tasks: New
overlayPosition.tswith shared type and coordinate calculation for top-left/top-right/bottom-left/bottom-right - tasks: Updated
buildStaticImageArgs,buildFilterComplex,buildFfmpegArgs,renderFinalVideo,createContentTaskto acceptoverlayPosition - tasks: 14 new tests for position calculation and filter complex positioning PRs: recoupable/tasks#138 Notes: Backward-compatible — defaults to top-left when position not provided. Independent of REC-66 overlay size changes.
Prompt: Playlist cover images overlaid on editorial template videos are too small for record label customers Status: in_progress (PR open, awaiting code review) Changes:
- tasks: Increased
OVERLAY_SIZEfrom 150px to 250px inbuildStaticImageArgs.tsandbuildFilterComplex.ts - tasks: Updated tests in both test files to reflect new dimensions
PRs: recoupable/tasks#137
Notes: Depends on REC-65 (PR #136) being merged first. PR branches from
feature/rec-65-editorial-static-image.
Prompt: Editorial content template should return both video and a static image with playlist covers overlaid Status: in_progress (PRs open, awaiting code review) Changes:
- tasks: New
buildStaticImageArgs.ts— ffmpeg args for single-frame image render with overlays - tasks: New
renderStaticImage.ts— downloads base + overlays, runs ffmpeg, uploads PNG to fal.ai - tasks:
createContentTaskrenders static image when template uses overlay, returnsstaticImageUrl - tasks:
pollContentRunsextractsimageUrlfrom task output - api:
contentRunResultSchemaaccepts optionalimageUrlfield - api:
postVideoResultsdownloads and posts static images before videos in Slack threads - 15 new tests across both submodules (all green) PRs:
- recoupable/tasks#136
- recoupable/api#438
Notes: API PR targets
testbranch. Tasks PR targetsmain. Both submodules must be deployed together.
Prompt: Remove hardcoded Gatsby Grace default from content agent Slack bot; require artist name in prompt Status: in_progress (PR open, awaiting code review) Changes:
- api: Removed hardcoded
artistAccountIdfromregisterOnNewMention.ts - api: Added
artistNametocontentPromptFlagsSchemafor AI extraction from prompts - api: New
selectAccountByNameInOrg.tsfor case-insensitive artist name lookup within an organization - api: Bot now prompts user if no artist specified, shows error if not found
- api: 38 tests passing (20 registerOnNewMention + 13 parseContentPrompt + 5 selectAccountByNameInOrg) PRs: recoupable/api#437 Notes: Related to REC-40 (artist name param) which had an unmerged PR#382. REC-64 supersedes by making null the default instead of Gatsby Grace as fallback.
Prompt: Add dsp enum parameter so editorial videos can include Spotify/Apple Music logo overlay Status: in_progress (PRs open, awaiting code review) Changes:
- api: Added
dspenum (none/spotify/apple) to validation schema, trigger payload, content prompt agent, and Slack mention handler - api: New
dspValues.tsconstant file followingcaptionLengths.tspattern - api: 4 new tests for dsp validation and prompt extraction
- tasks: Added
dspto content creation schema, newresolveDspLogoUrlutility - tasks:
createContentTaskappends DSP logo URL to overlay images for ffmpeg render - tasks: 5 new tests for DSP resolution and pipeline integration
- docs: Added
dspfield to OpenAPI spec and Content Agent Slack bot docs PRs: - recoupable/api#436
- recoupable/tasks#135
- recoupable/docs#131
Notes: API PR targets
testbranch. Tasks/docs PRs targetmain. DSP logo URLs are placeholders — actual images will be added by the user after PR merge. All three submodules must be deployed together.
Prompt: Slack bot generates captions even when not requested; default should be no captions Status: in_progress (PRs open, awaiting code review) Changes:
- api: Added
"none"toCAPTION_LENGTHSenum, changed default from"short"to"none"across all schemas - api: Updated prompt agent to only set captions when explicitly requested by user
- api: Updated 4 test files to reflect new defaults
- tasks: Added
"none"to content creation schema, changed default to"none" - tasks: Skip caption generation API call when
captionLength === "none", pass empty string to ffmpeg render - tasks: Added test for caption skip behavior PRs:
- recoupable/api#433
- recoupable/tasks#132
Notes: API PR targets
testbranch. Tasks PR targetsmain. Both submodules must be deployed together.
Prompt: Admin page tracks embedded videos from Slack bot instead of extracted video URLs Status: in_progress (PRs open, awaiting code review) Changes:
- api: Replaced
extractVideoLinks(URL text parsing) withextractVideoFiles(Slack file object extraction) - api: Replaced
fetchThreadVideoLinkswithfetchThreadVideoFilesto readfilesarray on bot messages - api: 12 new tests for extraction logic
- admin: Renamed "Video Links" column to "Videos", display friendly labels instead of raw URLs PRs:
- recoupable/api#432
- recoupable/admin#27
Notes: API PR targets
testbranch. Admin PR targetsmain.
Prompt: Add "View Task" button to content agent Slack response, matching coding agent behavior Status: in_progress (PR open, awaiting code review) Changes:
- api: Moved
buildTaskCardfromlib/coding-agent/to sharedlib/agents/(DRY) - api: Added "View Task" button card to content agent
registerOnNewMentionhandler - api: Updated coding agent imports to use shared location
- api: 18 tests pass (2 new for buildTaskCard, 2 new for content agent View Task) PRs:
- recoupable/api#430
Notes: Button links to
chat.recoupable.com/tasks/{runId}using the first triggered run ID.
Prompt: Detect editorial press photos in attachments and skip AI image generation when one is found Status: in_progress (PR open, awaiting code review) Changes:
- tasks: Added
detectEditorialImage.ts+createEditorialDetectionAgent.tsfor AI-based editorial photo classification - tasks: Updated
classifyImages,resolveFaceGuide,createContentTaskto supporteditorialImageUrl - tasks: When editorial image detected, pipeline skips image generation and uses it directly for video gen
- tasks: 11 new tests, all 347 tests pass PRs:
- recoupable/tasks#131
Notes: Follows same pattern as face detection (few-shot AI classification). Editorial detection only runs when
usesImageOverlayis true.
Prompt: Add admin page for tracking agent API key signups with docs and API endpoint Status: in_progress (PRs open, awaiting code review) Changes:
- docs: OpenAPI spec and MDX page for
GET /api/admins/agent-signupsendpoint - api: New admin endpoint querying
account_api_keysjoined withaccount_emailsfiltered byagent+email prefix, with period filtering - admin: New
/agent-signupspage with line chart, stats bar, data table following/contentpage pattern PRs: - recoupable/docs#127
- recoupable/api#428
- recoupable/admin#26 Notes: All 3 PRs created and pushed. TypeScript compiles cleanly. Awaiting Code Reviewer.
Prompt: Investigate caption bug (captions not based on song lyrics), then iterate on V2 modular plan for content creation pipeline Status: completed Changes:
- tasks: Investigated caption generation bug by pulling Trigger.dev run data via SDK, triggered reproduction run with "Safe Boy Bestie" mp3. Confirmed lyrics DO flow through transcription → caption prompt. The template's caption-guide.json style rules overpower the lyrics context, but captions are loosely connected to the song — not a hard bug, more a prompt tuning issue.
- plans: Updated
.local/plans/content-creation/plan.md— V2 modular plan with: API endpoints nested under/api/content/create/, clear api vs tasks repo split, renamed "caption" → "text" (text = content + style including font), renamed "clip" → "audio", clarified face guide is artist-specific (not template-level), added text-style.json and fonts/ to template structure PRs: none (plan + investigation only) Notes: Key architectural decisions: (1) generate-text is inline in api (2-5s LLM call), all other primitives are Trigger.dev tasks. (2) Text primitive returns content + style (font, color, size), render just draws it. (3) Templates define scenes, artists provide faces — the two are independent. (4) createContentTask becomes an orchestrator calling individual tasks via triggerAndWait. Remaining gaps to address during implementation: artist context fetching, text object schema, template renaming, partial retry UX, docs updates.
Prompt: Extract domain knowledge from Alexis x Sid meeting transcript (April 1) and create skills Status: completed Changes:
- skills: Created
trend-to-song/SKILL.md— pipeline for turning trending cultural moments into songs and test campaigns in 72 hours. Covers trend spotting, emotional DNA extraction, AI song generation, burner page distribution, and monitoring. Based on the Bravo reality TV example discussed in the meeting - skills: Created
artist-growth-threshold/SKILL.md— playbook for getting new artists past streaming milestones (1K monthly listeners for Showcase, 5K for Marquee, Popularity 50 for algorithmic boosting). Includes three paths to 1K (playlist pitching, social-to-DSP ads, organic), real cost benchmarks ($500 playlist push, $0.34 CPC, ~30% click-to-listen), content strategy (relatable first lines, mouth movement for unmutes, posting cadence), and decision framework - skills: Updated
README.md— added both skills to the skills table and directory structure PRs: none (local skill creation) Notes: Domain knowledge extracted from Alexis (Rostrum Records) sharing music marketing expertise during the Gatsby Grace growth planning discussion. Key data points are from real campaigns (playlist pitching benchmarks, Spotify Popularity mechanics, content engagement patterns). The trend-to-song workflow is novel — reverse engineering from cultural moment to song using AI generation, which Alexis described as something he "never thought in practice" would work but was excited about.
Prompt: Jules asked for cap table, historical financials, and projections for the investor deck. Build all three. Status: completed Changes:
- strategy: Created
cap-table.md— current ownership (Sid 99%, Jules 1% advisor), vesting schedule, pre-money valuation benchmarks, notes on LLC→C-Corp conversion for fundraise - strategy: Created
financials.md— historical revenue by month (Jan 2025→Apr 2026), current expense breakdown ($11,277/mo), P&L summary showing cash-flow positive with Seeker, pipeline detail, two 12-month projection scenarios (organic: exit $68k MRR; post-raise: exit $108k MRR), use of funds breakdown for ~$1M raise - strategy: Updated
customers.md— corrected MRR to ~$17,995 with full breakdown (added Atlantic $1k/mo, 300 $1k/mo, 5 B2C at $99/mo), added expense summary and net income - strategy: Updated
investor-memo.md— corrected MRR to ~$18K, added cash-flow positive status and $0 external funding raised PRs: none (local strategy docs) Notes: Several items marked [?] in financials.md need Sid to fill in: exact start dates for Atlantic and 300 pilot payments, and any missing expenses. Two projection scenarios model organic growth (no raise, exit $68k MRR) and post-raise acceleration ($750K-$1.25M raise, exit $108k MRR). Key insight for deck: company reaches cash-flow positive the month Seeker closes — raise is for acceleration, not survival.
Prompt: Process Jules x Sid meeting transcript (April 1) and route insights to strategy docs per AGENTS.md classification rules (DECISION / IDEA / SIGNAL / CONTEXT) Status: completed Changes:
- strategy: Saved structured transcript to
transcripts/jules-sid-2026-04-01.mdwith 11 topic sections and action items table - strategy:
pmf-journal.md— appended 13 classified entries: 7 IDEAS (YC for Creators model, warrants, SAFR instrument, agent org chart product, parent entity restructuring, prove-then-raise path, accelerator expansion), 2 SIGNALs (Broke Records signing AI artists, cohort hustle vs. talent divide), 4 CONTEXT entries (EA resource, NYC trip logistics, Meng situation, Jules role evolution) - strategy:
decisions-log.md— appended 1 DECISION: keep initial artist signings lightweight (term sheet + email, no heavy legal) - strategy:
roster.md— expanded Meng/Alma entry with company context and NYC plans; added accelerator cohort observations (Pear, Amanda); added "Potential Partners" section with Broke Records and Nashville musicians-fundable group - strategy:
roster.md— rewrote "Acquired IP Deals" section to reflect evolving YC-for-creators model with warrants, SAFR, and prove-then-raise path (tagged as IDEA, not DECISION) - strategy:
deals/README.md— added "Emerging Framing" section for YC model, warrants, SAFR; noted potential v0.3 evolution - strategy:
roadmap.md— expanded label play table with 12 specific action items (advisor agreement, Slack invite, onboarding call, Claude setup, term sheets, podcast logistics, Broke Records meeting, NYC accelerator fall program) - strategy:
mission-and-vision.md— added "Emerging Ideas (April 2026)" subsection flagging YC for Creators frame, parent entity restructuring, agent org chart product, Jules's potential formal role; added 3 new resonant phrases - strategy:
customers.md— updated sales pipeline table with Jules agreement timeline, Broke Records intro, and NYC trip details PRs: none (local strategy docs) Notes: Per AGENTS.md rules: nothing from this transcript was treated as a firm decision except the lightweight legal approach for initial signings. All strategic shifts (YC model, warrants, SAFR, parent entity restructuring, agent org chart) are tagged [IDEA] in pmf-journal.md and flagged for human review in static docs. The transcript is a discussion, not a commitment. Key action items with deadlines: advisor agreement (this week), Jules onboarding (Apr 2), Broke Records coffee (Apr 7-8), podcast filming (Apr 22), NYC investor meetings (Apr 23).
Prompt: Create a deals directory with a template for signing acquired IP, based on the Gatsby Grace/Rostrum agreement. Iterated through studio model, YC model, and landed on a lightweight "platform + shopping rights" approach. Status: completed Changes:
- strategy: Created
.local/strategy/deals/directory with 3 files - strategy:
analysis-gatsby-grace.md— extracted all key concepts, language, and structure from the Rostrum/Recoupable Gatsby Grace agreement - strategy:
template-ip-partnership.md— v0.2 "Platform & Shopping Agreement." Two things: (1) onboard IP to Recoupable platform for content automation, (2) Recoupable gets exclusive right to shop the IP to upstream partners. Creator keeps ownership. No management obligations. No capital. If a deal lands, Recoupable gets an override and stays as platform provider. - strategy:
README.md— overview of created IP (Gatsby Grace JV model) vs acquired IP (lightweight platform + shopping model) PRs: none (local strategy docs) Notes: Key strategic insight from iteration: signing external IP and promising to manage it creates obligations Recoupable can't fulfill at this stage (no team, no capital, no bandwidth for artist management). What Recoupable CAN do: automate content and shop the IP. v0.1 was a full 14-section label-style term sheet — too heavy. v0.2 is 8 sections, fits on 1-2 pages. The override % on upstream deals is TBD — needs to be decided per deal. Jules is the key person for actually facilitating upstream partnerships.
Purpose: Handoff notes for the next dev/agent picking up work.
Prompt: Debug why artist-bedroom-caption template pipeline produces wrong content via Slack content agent Status: completed Changes:
- tasks:
src/content/loadTemplate.ts— replaced hardcoded__dirname-relative path withresolveTemplatesDir()that tries__dirnamefirst, then falls back toprocess.cwd()-relative path. esbuild changes__dirnameto the build output directory at bundle time, so template files (style guide, caption guide, moods, movements, reference images) were silently failing to load in production. Added diagnostic logging and distinguished ENOENT from parse errors inloadJsonFile. PRs: recoupable/tasks#117 (merged) Notes: Deployed to Trigger.dev production as version20260331.3. Verified fix: before = bright outdoor portrait ignoring all template rules; after = dark bedroom with purple LED, deadpan expression, proper caption style. Pre-existing SRP violation inloadTemplate.ts(4 exported functions) noted for follow-up PR. TheloadTemplate.tsfile also hasconsole.logdebug lines removed — onlyloggercalls remain for Trigger.dev dashboard visibility.
Prompt: Append noise overlay, glass card, stagger animation delays, and scan lines utilities to globals.css without changing existing rules
Status: completed
Changes:
- marketing/apps/web:
app/globals.css— appended.noise-overlay,.glass-card,.stagger-1–.stagger-5,.scan-lines(film grain SVG, glassmorphism, CRT-style lines) PRs: none Notes: Use.noise-overlay/.scan-lineson aposition: relativecontainer so pseudo-elements layer correctly. Pair.stagger-*with animated elements (e.g.fade-in-up).
Prompt: Add brutalist keyword ticker (CSS marquee, inverted fg/bg) and Linear-style FIG labels for marketing web Status: completed Changes:
- marketing/apps/web:
components/home/Marquee.tsx— duplicated keyword row,animate-marquee, monospace+separators,border-y border-(--border),aria-hiddendecorative strip - marketing/apps/web:
components/ui/FigureLabel.tsx—FIG {number}, monospace 10px,tracking-widest,text-(--muted-foreground)+opacity-50,cn()forclassNamePRs: none Notes: Not imported onapp/page.tsxyet — add<Marquee />/<FigureLabel number="0.1" />where needed.pnpm buildfrommarketing/passed.
Prompt: Add two server components from moodboard — B&W HUD bounding box + terminal readout (CSS-only); thin status bar with SYS.STATUS, version, MCP tools; use #c8ff00, animate-blink on green dot, staggered keyframes like AgentChat Status: completed Changes:
- marketing/apps/web:
components/home/VisionOverlay.tsx— 60vh section, gradient “photo” mood, #c8ff00 frame + L-corner brackets, SUBJECT_08X pill, artist placeholder + silhouette SVG, staggered terminal lines + deployment badge - marketing/apps/web:
components/home/StatusBar.tsx— max-w-7xl row, dividers, monospace 10–11px caps, ONLINE + blinking green dot, version + MCP copy;pnpm buildfrommarketing/passed PRs: none Notes: Components are not wired intoapp/page.tsxyet — import when replacing hero/section placeholders.
Prompt: Hero border under proof; proof stat text glow; module card min-height + rounded; terminal label brand color + container rounding; segment left border; Blog nav plain link when no dropdown items; mobile nav comment; nav typing for empty learn items Status: completed Changes:
- marketing/apps/web:
app/page.tsx—border-b border-[var(--border)]on hero; proof numberdrop-shadow-[0_0_30px_rgba(200,255,0,0.3)]; modulesmin-h-[320px] rounded-lg; terminal eyebrowtext-[var(--brand)]; segmentsborder-l-2 border-[var(--brand)]/30 pl-4 - marketing/apps/web:
components/layout/NavDropdown.tsx— ifitems.length === 0, render a singleLink(no empty hover panel) - marketing/apps/web:
lib/nav.ts— explicitNavSection/NavItemtypes solearn.items: []isreadonly NavItem[](fixes/learnpage + copynevererrors vsas constempty tuple) - marketing/apps/web:
components/layout/Header.tsx— mobile nav comment aligned to desktop order PRs: none Notes:Terminal.tsxroot already hasrounded-lg overflow-hidden./learnindex still renders zero cards whilenav.learn.itemsis empty; add fallback links if that page should stay useful.
Prompt: Add CSS-only product mockups — fake agent chat UI with staggered fade-in; three-node CONNECT/PROCESS/DEPLOY diagram with SVG arrows and brand glow Status: completed Changes:
- marketing/apps/web:
components/home/AgentChat.tsx— macOS chrome, Gatsby Grace sidebar, chat bubbles + 66% progress bar, scoped keyframes + animation-delay classes (no client JS) - marketing/apps/web:
components/home/SystemDiagram.tsx— 01–03 nodes, horizontal SVG connectors (vertical on mobile),var(--brand)numbers/arrows, color-mix glow shadow PRs: none Notes:pnpm buildfrommarketing/passed. Wire intoapp/page.tsxor other sections when replacing placeholders.
Prompt: Append globals.css utilities (view-timeline fade-in-up, glow-brand); refine Terminal colors and keyword highlighting; soften proof strip; add fade-in-up to major homepage sections Status: completed Changes:
- marketing/apps/web:
app/globals.css—@keyframes fade-in-up,.fade-in-up(animation-timeline view),.glow-brand - marketing/apps/web:
components/home/Terminal.tsx— base text#e5e5e5, SUCCESS#c8ff00, error/warning tokens#ff9f43,TerminalLinesplit rendering - marketing/apps/web:
app/page.tsx— proof section dark bg, yellow stat +glow-brand, brand-tint borders;fade-in-upon proof, modules, terminal, segments, subscribe sections PRs: none Notes:pnpm buildfrommarketing/passed. Scroll-driven animation needs browsers withanimation-timeline: view()support; others show static content.
Prompt: Rewrite Recoup docs to properly communicate what the product is, inspired by Composio's clear documentation style Status: completed Changes:
- docs: Rewrote
index.mdx— positions Recoup as autonomous music infrastructure with three integration paths (API, MCP, CLI); shows "Who It's For" (Artists, Labels, Developers); uses brand positioning frommarketing/content/brand/ - docs: Rewrote
quickstart.mdx— starts with Spotify search (works immediately, no data needed); shows CLI and MCP setup in same page; concise and value-focused - docs: Created
how-it-works.mdx— explains three layers (Entry Points, Agent Layer, Context Layer); covers agents, sandboxes, data flow, and integration options; "What Makes Recoup Different" comparison table - docs: Rewrote
cli.mdx— workflow-oriented structure (like Composio CLI docs); content creation workflow as primary path; command summary table at end - docs: Rewrote
mcp.mdx— config snippets for Claude Desktop, Cursor, VS Code; full tool list (43 tools in 12 categories); usage examples; TypeScript SDK connection - docs: Rewrote
api-reference/introduction.mdx— developer-focused with base URL, auth, response format, rate limits, and explore cards - docs: Created
authentication.mdx— unified auth guide covering API keys, MCP Bearer tokens, CLI env vars, org access, and admin auth - docs: Restructured
docs.jsonnavigation — "Get Started" (Welcome, Quickstart, How It Works, Auth) + "Integrate" (MCP, CLI, Content Agent); updated anchors (Dashboard, API Keys, Website) PRs: Branchfeat/docs-overhaulpushed torecoupable/docs— PR targetsmainNotes: Voice followsmarketing/content/brand/voice.md— specific, no-BS, show-don't-tell. Positioning aligned withmarketing/content/brand/positioning.md— "Run your music business with agents." Pre-existing broken nav references (admins/check, admins/sandboxes, etc.) were not introduced by this change.
Prompt: Zod inline validation on research POST handlers; popularIndie overridable in playlists handler; recoup-research SKILL angle brackets + YouTube audience vs metrics note; CLI parseInt NaN checks for web/people
Status: completed
Changes:
- api:
postResearch{Web,Deep,People,Extract,Enrich}Handler.ts— inline Zod body schemas + unified 400 handling;getResearchPlaylistsHandler.ts—popularIndiein explicit filter branch; minimal JSDoc@returns/ param fixes where eslint required - skills/recoup-research:
SKILL.md— replaced--genre <id>pattern; clarifiedyoutube_channelapplies tometricsonly,audienceuses--platform youtube - cli:
src/commands/research.ts— validate--max-results/--num-resultsafterparseInt(radix 10) PRs: none Notes: Extractfull_contentis strict boolean in Zod (no string coercion). Enrichschemausesz.record(z.string(), z.unknown())(object with string keys).
Prompt: After proxyToChartmetric, return tool errors when result.status !== 200; add VALID_PLATFORMS where platform is interpolated; charts tool validates alphanumeric platform (no path injection)
Status: completed
Changes:
- api:
lib/mcp/tools/research/registerResearch{Artist,Metrics,Audience,Cities,Similar,Playlists,Urls,InstagramPosts,Albums,Tracks,Career,Insights,Milestones,Venues,Rank,Lookup,Track,Playlist,Curator,Discover,Genres,Festivals,Charts,Radio}Tool.ts— status guard beforegetToolResultSuccess; playlist/track search paths check proxy status too;VALID_PLATFORMSon playlists, playlist info, curator; charts uses/^[a-zA-Z0-9]+$/onplatformPRs: none Notes: Raneslint --fixon touched files.registerResearchMilestonesTool/registerResearchRankToolstill have pre-existing@typescript-eslint/no-explicit-anyon parsed bodies.
Prompt: Rename the first argument to server.registerTool() in all 27 research MCP tool files; update descriptions for discography/URLs/tracks overlap with other tools
Status: completed
Changes:
- api:
lib/mcp/tools/research/registerResearch*.ts— tool IDs now useget_*/lookup_*/discover_*/find_*/extract_*/enrich_*naming;get_artist_tracksdescription notesget_spotify_artist_top_tracks; albums and URLs descriptions were already aligned with the requested copy PRs: none Notes: JSDoc lines still mention oldresearch_*names in some files; update separately if docs should match registered IDs. Any clients hardcoding old tool names must switch to the new strings.
Prompt: Turn artist deep research prompt into a skill for the Recoupable platform, with design thinking about research method, static vs dynamic data, and downstream use Status: completed Changes:
- skills/research-artist: Created
SKILL.md— multi-source research pipeline that works in sandbox (MCP tools + Perplexity deep research) and Cursor/local (WebSearch + last30days). Produces timestamped research report with career-stage assessment, fan personas, competitive white-space, revenue opportunities. Respects artist-workspace static/dynamic context separation. - skills/research-artist/references: Created
report-template.md(full output template with YAML frontmatter, confidence markers, 8 report sections) andresearch-queries.md(3 research strategies: Perplexity deep research, multi-query WebSearch, MCP platform APIs) PRs: none — local skill creation Notes: Key design decisions: (1) Usesweb_deep_researchMCP tool (Perplexity sonar-deep-research) as the ChatGPT deep research replacement in sandbox. (2) Static context (artist.md, audience.md) is created but never blindly overwritten — suggests updates for human review. (3) Dynamic context (research report) is timestamped inresearch/. (4) Optionally chains with last30days skill for Reddit/X social pulse. (5) Structured output with confidence markers ([confirmed], [estimated], [inferred], [gap]) so downstream agents know what to trust.
Prompt: Do deep web research on every artist in the rostrum directory and create artist.md profiles Status: completed Changes:
- rostrum/artists: Created
context/artist.mdfor all 42 artists that were missing profiles (Alé Araya + Gatsby Grace already had them) - Each profile built from 2-3 web searches per artist with real biographical data, genre descriptions, aesthetic direction, brand voice, and sacred rules
- Profiles cover: 7 hip-hop legends (Mac Miller, Wiz Khalifa, Jeezy, Raekwon, Mobb Deep, Sean Price, Smif-N-Wessun), 7 hip-hop artists (DC The Don, Jae Skeese, THE REAL RYU, Natural Elements, YUNGMORPHEUS, Like, Chip Fu), 7 labels/entities (Rostrum Records, Fat Beats, Cantora Records, Javotti Media, Spaceheater, Soul In The Horn, Murdermart), 7 emerging artists (Julius Black, Gliiico, Amxxr, Baro Sura, Neek, Nicole Bus, Niko Is), 7 bands/artists (Bear Hands, El Michels Affair, MGMT, Mod Sun, Theo Croker, TeamMate, Henri), 6 artists (Goosebytheway, Jada, Mike Taylor, No Love for the Middle Child, Rashad Thomas, Solene) PRs: none — pushed directly to rostrum repo main Notes: Two artists have thinner profiles due to limited public information: Neek (multiple "Neek" artists exist, couldn't confirm which one) and Jada (no public info found confirming which "Jada" is on Rostrum). These should be enriched when the label provides details. THE REAL RYU has two directories (the-real-ryu and the-real-ryu-19447895) — both received identical profiles. TeamMate correction: they're former romantic partners (not brother-sister as initially thought). 43 files, 3,558 lines of real research-backed content.
Prompt: Follow setup-artist skill and remove all unneeded scaffolding files/folders from rostrum artist directories (except gatsby-grace) Status: completed Changes:
- rostrum/artists: Deleted scaffolding from 43 artist directories — removed
.env.example,README.md,apps/,config/,content/,memory/, placeholdercontext/files (template artist.md, audience.md, era.json, tasks.md, images/README.md),releases/README.md,songs/README.md, and empty directories - rostrum/artists: Cleaned RECOUP.md body text for all 43 artists (kept frontmatter only, matching gatsby-grace format)
- 38 artists now have only
RECOUP.md; 5 artists retain real content alongside RECOUP.md (fat-beats: social-reports + weekly dashboard; gliiico: spotify tracking CSV; julius-black: tiktok tracking + snapshot; mac-miller: weekly news; spaceheater: competitor analysis report) - gatsby-grace left untouched (already follows the new skill structure)
PRs: none — changes are local in
.local/records/rostrum/Notes: Per the setup-artist skill: "Nothing gets created until there's real content to put in it." All deleted files were empty scaffolding or placeholder templates with{curly brace tokens}. Real content files (tracking CSVs, reports, analysis) were preserved. When an artist gets real context, createcontext/artist.mdand other files per the setup-artist skill.
Prompt: Add optional songs array to content creation payload so the pipeline can restrict which songs it picks from
Status: completed
Changes:
- tasks: Added
songsfield tocreateContentPayloadSchema, filtering logic inselectAudioClip, pass-through increateContentTask - api: Added
songsto Zod validation (validateCreateContentBody), handler (createContentHandler), and trigger interface (triggerCreateContent) - docs: Added
songsproperty toContentCreateRequestschema inopenapi.json - cli: Added
--songs <slugs>comma-separated flag torecoup content createcommand PRs: - recoupable/tasks#112 (base: main)
- recoupable/api#348 (base: test)
- recoupable/docs#80 (base: main)
- recoupable/cli#19 (base: main)
Notes: Backward compatible — when
songsis omitted, all songs remain eligible. Song slugs match filenames without extension (e.g.hiccupsforhiccups.mp3). The caller (chat agent, Slack bot, CLI) is responsible for resolving user intent into song slugs. All existing tests pass (183 tasks, 1553 api).
Prompt: Simplify the setup-artist skill and consolidate three gatsby-grace directories into one Status: completed Changes:
- skills/setup-artist: Rewrote SKILL.md (178→120 lines, 9→5 steps, 10→2 directories). Deleted all 6 reference files (memory-system.md, services-guide.md, env-template.md, directory-readmes.md, root-readme.md, context-files.md). Skill now only creates
context/andsongs/— other directories created by other skills when needed. - rostrum/gatsby-grace: Consolidated data from 3 directories. Merged filled
artist.md(from local) +brand.mdcontent. Replaced placeholderaudience.mdwith filled version (from old). Copied 17 songs with proper{slug}.mp3naming + wav + lyrics.json + clips.json. Renamedlibrary/→research/. Dropped stalereports/. Deleted all scaffolding (memory/, config/, content/, apps/, era.json, tasks.md, .env.example, 8 READMEs). Updated RECOUP.md with minimal "What's Here" + "Adding Things" guidance. PRs: none yet — changes are local, need to commit and push to rostrum repo and skills repo Notes: The tasks content pipeline only readscontext/artist.md,context/audience.md,context/images/face-guide.png, andsongs/*.mp3via GitHub API. No per-artist config needed — pipeline uses hardcoded defaults. Song naming matters: pipeline derives title from filename, so{slug}.mp3notaudio.mp3. Old gatsby-grace directories (.local/records/artists/gatsby-graceandgatsby-grace-old) can be deleted after verifying pipeline works. Other rostrum artists still have the old bloated scaffolding — migrate separately.
Prompt: Fix the failing checks on PR #342 Status: completed Changes:
- api: Deleted
lib/coding-agent/getThread.tswrapper (KISS nit from code reviewer) — callers now importgetThreaddirectly fromlib/agents/getThreadwith type parameter - api: Fixed unused
messageparameter lint error inregisterOnNewMention.ts - api: Updated test mocks to match new import paths
PRs: recoupable/api#342 (commit
694f201) Notes: All CI checks (test, format, CodeRabbit, Vercel) were already passing. These fixes address the last code review nit and lint cleanliness. 6 files changed, 9 ins, 19 del.
Prompt: Address new board + CodeRabbit feedback on content-agent PR #342 Status: completed Changes:
- api: SRP — split
validateEnv.tsintoisContentAgentConfigured.ts+validateContentAgentEnv.ts - api: KISS — refactored
bot.tsto eager singleton variable matching coding-agent pattern - api: KISS — refactored
registerHandlers.tsto module-level side-effect registration (removed flag) - api: DRY — extracted shared
getThreadtolib/agents/getThread.ts(both agents use it) - api: CodeRabbit — added Zod platform validation + JSON error responses in
createPlatformRoutes.tsPRs: recoupable/api#342 (commit2abed88) Notes: 10 files changed, 60 ins / 65 del. Bot init DRY question addressed: both agents already sharecreateAgentState+agentLogger; remaining adapter config differs per agent so further abstraction would violate KISS. Awaiting Code Reviewer re-review.
Prompt: Update SR Dev AGENTS.md to mandate TDD red-green-refactor for API and Tasks codebases Status: completed Changes:
- agents/sr-dev/AGENTS.md: Added "Test-Driven Development (API & Tasks)" section mandating strict red-green-refactor cycle for all work in api and tasks codebases PRs: none (local instruction change) Notes: SR Dev must now write failing tests before any production code in api or tasks. Includes rules for bug fixes (reproduce first) and commit-per-phase guidance.
Prompt: Address 7 board feedback items on PR #342 (YAGNI, SRP, DRY, KISS, restructure) Status: completed Changes:
- api: Removed unused
/api/launchendpoint andlib/launch/(YAGNI) - api: Extracted
parseMentionArgsto own file, renamed handler →registerOnNewMention.ts(SRP) - api: Created shared
lib/agents/createPlatformRoutes.tsfactory used by both coding-agent and content-agent (DRY) - api: Created shared
lib/agents/createAgentState.tsfor Redis/ioredis state (DRY) - api: Moved callback auth into handler to match coding-agent pattern (KISS)
- api: Restructured
lib/content-agent/→lib/agents/content/PRs: recoupable/api#342 Notes: 21 files changed, 206 ins, 511 del. Awaiting Code Reviewer re-review.
Prompt: Test the changes in PR #342 against Vercel deployment preview Status: completed Changes:
- none (testing only)
PRs: none
Notes: Initial test run (11 cases) found 5 failures — content-agent endpoints returned 500 due to missing env vars crashing
getContentAgentBot(). Sr Dev fixed withisContentAgentConfigured()guard and moved auth before bot init (commit9da3aef). Re-test: all 11 cases pass. Results posted on GitHub PR #342 and Slack #code-review thread. Task marked done.
Prompt: Create a QA Tester agent that tests API PRs by running fetch requests against Vercel deployment previews Status: completed Changes:
- mono: Created
agents/qa-tester/AGENTS.md— full instructions for deployment preview testing, endpoint discovery from PR diffs, structured test reporting - mono: Updated
agents/code-reviewer/AGENTS.md— added QA Tester Integration section (trigger QA Tester after approving API PRs) - mono: Updated
agents/sr-dev/AGENTS.md— added QA Tester Feedback section (handle test failure reports) - Paperclip: Submitted hire request for QA Tester agent (f4d6bc75-b9ea-4fca-a456-4b889548ad83, claude-sonnet-4-6, reports to CTO) PRs: none (local instruction changes) Notes: Approval granted (d2fcb05e). Agent ID: f4d6bc75-b9ea-4fca-a456-4b889548ad83, urlKey: qa-tester. Agent workflow: Code Reviewer approves API PR → @-mentions QA Tester → QA Tester runs fetch tests against Vercel preview → reports on GitHub PR + Slack → routes failures to Sr Dev.
Prompt: Review clean PR #342 (superseding #341) for content-agent feature, identify Vercel build failure cause Status: completed Changes:
- none (review only)
PRs: recoupable/api#342 (approved after 1 review cycle)
Notes: Initial review found 2 blocking issues: (1) module-level env validation crashed Vercel build, (2) fragile thread ID parsing. Sr Dev fixed both (commit
5ca4293). Re-review confirmed fixes + all CI checks pass (test, format, Vercel). PR approved and ready to merge. Slack thread updated.
Prompt: Set up automated review loop between Sr Dev and Code Reviewer agents Status: completed Changes:
- agents/code-reviewer/AGENTS.md: Added "Review Loop with Sr Dev" section — when @-mentioned by Sr Dev, review the PR; if changes needed, @-mention Sr Dev back; if approved, @-mention Sr Dev and close
- agents/sr-dev/AGENTS.md: Added "Review Loop with Code Reviewer" section — after creating/updating a PR, @-mention Code Reviewer; when feedback arrives, fix and @-mention again; loop until approved PRs: none (local instruction changes) Notes: Both agents now have symmetric handoff instructions. The loop uses Paperclip @-mentions to trigger heartbeats. Sr Dev starts the cycle by @-mentioning Code Reviewer after pushing a PR. Code Reviewer closes the cycle by @-mentioning Sr Dev with approval/feedback.
Prompt: Fix code review feedback on content-agent PR #341 Status: completed Changes:
- api: Created clean branch
fix/content-agent-cleanfromtestwith only 17 new feature files (removed ~90 JSDoc-only changes) - api: Renamed
handlers/handleContentAgentCallback.ts→registerOnSubscribedMessage.ts(naming collision fix) - api: Added
crypto.timingSafeEqualfor callback secret comparison inhandleContentAgentCallback.ts - api: Fixed all JSDoc lint errors in new feature files PRs: recoupable/api#342 (supersedes #341) Notes: Old PR #341 had 106 files changed (90 unrelated JSDoc noise). New PR #342 has only 17 files. Posted update to Slack thread and commented on #341. Task reassigned to board for review.
Prompt: Review PR recoupable/api#341 and provide feedback Status: completed Changes:
- none (review only)
PRs: recoupable/api#341 (reviewed, request changes)
Notes: PR adds Recoup Content Agent Slack bot +
/api/launchendpoint. Verdict: request changes. Blocking issue: ~90 unrelated JSDoc-only changes inflate PR from ~16 new feature files to 106. Feature code itself is clean. Also flagged naming collision between twohandleContentAgentCallbackfiles and suggestedcrypto.timingSafeEqualfor callback secret. Review comment: recoupable/api#341 (comment)
Prompt: Fix feedback comments on docs PR #78 and update Slack thread Status: completed Changes:
- docs: Linked
POST /api/content-agent/callbackto its API reference page in data flow and endpoints table - docs: Added missing
RECOUP_API_KEYto environment variables table PRs: recoupable/docs#78 (updated, commit2149b60) Notes: Posted summary to #code-review Slack thread. PR still open for review.
Prompt: Create a new agent to review unmerged PRs in Recoup mono repo submodules Status: completed Changes:
- Paperclip: Created "Code Reviewer" agent (QA role, claude-sonnet-4-6, reports to CTO)
- Agent ID: 8dec924a-7c20-4280-985d-f3ea996e0c4e (urlKey: code-reviewer-2)
- Approval: d2fbd753 (approved after revision to add CLEAN code principles)
- mono: Created
agents/code-reviewer/AGENTS.mdwith review instructions (SRP, OCP, DRY, YAGNI, security checklist) - Set instructions path via API PRs: none (instructions file created locally, not yet committed) Notes: Agent is idle and ready for tasks. First revision was requested by board to emphasize CLEAN coding principles — incorporated into capabilities and instructions. Old agent 815e3d4f (Code Reviewer 1) was from the rejected first hire attempt.
Prompt: Scaffold the content-agent Slack bot following the coding-agent pattern Status: completed Changes:
- api: Added
content-agentSlack bot (routes, handlers, bot singleton, callback) onfeature/content-agentbranch - tasks: Added
poll-content-runTrigger.dev task onfeature/content-agentbranch PRs: Branches pushed — PRs need to be created manually (api → test, tasks → main) Notes: New env vars needed:SLACK_CONTENT_BOT_TOKEN,SLACK_CONTENT_SIGNING_SECRET,CONTENT_AGENT_CALLBACK_SECRET. Also needsRECOUP_API_BASE_URLin tasks env. Slack App must be created withapp_mentions:read+chat:writescopes.
Latest commits:
fad189efix: push mono repo root progress files directly to main (#96)e2599e7fix: set cwd to/vercel/sandbox/monofor Claude Code agent (#94)70f345cfeat: increase maxDuration of coding-agent task (#89)6625395feat: injectCLAUDE_CODE_OAUTH_TOKENinto sandbox environment (#86)
Status: Stable. The coding agent pipeline is working end-to-end:
- Sandbox spins up → monorepo cloned → submodules synced
- Claude Code agent runs with the user prompt (cwd =
/vercel/sandbox/mono) - Changes are committed and PRs opened via
pushAndCreatePRsViaAgent - Mono repo root files (e.g.,
PROGRESS.md) are pushed directly tomain
What to know: runClaudeCodeAgent now defaults cwd to /vercel/sandbox/mono. The pushAndCreatePRsViaAgent agent handles both mono root changes (direct push to main) and submodule changes (feature branch + PR).
Latest commits:
6ff735dfeat: add Slack chat bot integration for Record Label Agent (#296)f1d9035feat: add content-creation API endpoints and video persistence (#259)5b1f6bcfeat: admin accounts table endpoint (#288)6c5eda3feat: endpoint to check if authenticated account is admin (#281)
Status: Stable on test. PRs target test branch, not main.
What to know: Slack integration added for Record Label Agent. Content-creation endpoints live. Admin-check endpoint added.
Latest commits:
03714296feat: add navbar item for accounts (#1574)729a9062feat: task page top-left back link (#1573)6efe316dfix: duration stuck at 0ms for in-progress tasks (#1572)eaeb5799feat: polling UI forprompt_sandboxwhenrunIdpresent (#1563)c3611b31feat: move pulse to tasks page as Schedule/Recent/Pulse tabs (#1561)c7fb2744feat: artist connectors UI with tabbed settings modal (#1558)
Status: Stable on test. PRs target test branch.
What to know: Tasks page has been significantly built out — duration display, polling UI for sandbox runs, and pulse moved to tabs. Navbar now has accounts link.
Latest commits:
a09929achore: bump version to 0.1.11e4d4548feat: addrecoup contentcommand suite (#13)07e2b85feat: addmusic analyzecommand (#7)056257afeat: add--accountflag to notifications command (#12)
Status: Stable. Published to npm as 0.1.11.
What to know: recoup content command suite added. music analyze command added. Version auto-bumped via CI.
Latest commits:
05c455cdocs: improve user journey — navigation, quickstart, MCP client configse083670docs: expand MCP page with full tool list and docs search MCP explanationfd82b14feat: add authentication page (#62)
Status: Feature branch feat/mcp-docs-full-tool-list pushed, PR needs to be opened against main.
What changed (2026-03-24 user journey improvements):
- Navigation order fixed: Authentication now comes before MCP in sidebar
- Homepage (
index.mdx): integration path cards (REST/MCP/CLI), clearer "what you can build" framing - Quickstart (
quickstart.mdx): new first example uses Spotify search (works immediately, no existing data needed); Tasks list removed as first example - MCP page (
mcp.mdx): ready-to-paste config snippets for Claude Desktop, Cursor, and VS Code added before TypeScript SDK - API reference intro (
api-reference/introduction.mdx): stripped duplicate auth/base URL content, now links to auth guide
Latest commits:
3fcd006feat: update favicon to match app (#6)11b64e2feat: accounts table with subscription status (#5)5dd9571feat: endpoint to check if account is admin (#3)47295e8feat: Privy login support (#2)b53363ffeat: initial Next.js app setup (#1)
Status: Stable. Basic admin dashboard with Privy auth, accounts table, admin check, and new Org Repos commits table.
What to know: Added /sandboxes/orgs page showing a data table of commits per org sub-module. Key column is "Recent Commits" (latest_commit_messages array) showing up to 5 latest commit messages per repo. Data from GET /api/admins/sandboxes/orgs. New files: types/sandbox.ts (OrgRepoRow), lib/fetchAdminSandboxOrgs.ts, hooks/useAdminSandboxOrgs.ts, components/SandboxOrgs/*, app/sandboxes/orgs/page.tsx, components/Home/OrgReposNavButton.tsx. Nav button added to AdminDashboard.
Prompt: Apply code review feedback on branch agent/-u0ajm7x8fbr-update-or-codebas-1774058502626 — answer Sweets' questions: what domain does marketing deploy to, and why are there multiple apps?
Status: completed
Changes:
marketing: UpdatedAGENTS.md— Deployment section now explicitly states public site deploys tohttps://recoupable.com. Added new "Why Two Apps?" section explainingapps/web(public site, SEO, blog) vsapps/ops(internal marketing ops tooling, private workflows). Pushed to existing branch. PRs: Branchagent/-u0ajm7x8fbr-update-or-codebas-1774058502626pushed torecoupable/marketing— PR targetsmainNotes: The marketing repo was already on this feature branch. AGENTS.md is symlinked as CLAUDE.md — both updated together automatically.
Prompt: Implement PR review comments on recoupable/chat#1592 (streamdown v1→v2 upgrade) Status: completed Changes:
chat: Installed@streamdown/code@1.1.1,@streamdown/math@1.0.2,@streamdown/mermaid@1.0.2.chat: Updatedcomponents/ai-elements/response.tsxto import and passplugins={{ code, math, mermaid }}to<Streamdown>.defaultPluginsdefined as module-level constant for stable reference.chat: Added@sourcedirectives inapp/globals.cssfor the three new plugin packages so Tailwind scans their classes. PRs: recoupable/chat#1592 (branchagent/-u0ajm7x8fbr-update-chat-to-th-1774075858898) Notes:- P1 bot review resolved: streamdown v2 moved code highlighting, math, and mermaid behind optional plugins — without them, code blocks had no syntax highlighting and mermaid/math wouldn't render.
katex/dist/katex.min.csswas already imported inglobals.css— math CSS was pre-existing.
Prompt: Code review for branch agent/-u0ajm7x8fbr-update-chat-to-th-1774075858898 (streamdown v1.1.6 → v2.5.0)
Status: completed — no fixes needed, changes are correct
Changes:
chat: Reviewed 3-file diff:package.json(version bump),app/globals.css(@sourceglob),pnpm-lock.yaml. PRs: Branchagent/-u0ajm7x8fbr-update-chat-to-th-1774075858898— PR needs to be opened targetingtest. Notes:@source dist/*.jsglob is the official v2 recommendation (v2 splits classes across 4 files vs 1 in v1).Streamdowncomponent API is backward compatible —className,children,components,rehypePlugins,remarkPluginsall still present.data-streamdown='code-block'CSS selectors inresponse.tsxstill valid in v2 (confirmed inchunk-BO2N2NFS.js).- v2 ships
streamdown/styles.csswith animation keyframes — not imported, not needed unlessanimatedprop is used.
Prompt: Verify the build works on feature/chartmetric-proxy branch Status: completed Changes:
api: Fixedapp/api/chartmetric/[...path]/route.ts— params must bePromise<{path: string[]}>and awaited in Next.js 15+. The type error.next/types/validator.ts TS2344is now resolved. TypeScript compiles successfully (✓ Compiled successfully). All 5 Chartmetric tests pass. PRs: recoupable/api#318 (feature/chartmetric-proxy → test, existing PR updated) Notes: Build still fails at "collect page data" step due to missing SUPABASE_URL/SUPABASE_KEY env vars in sandbox — pre-existing environment issue, not from our changes. TypeScript itself is clean for the new code.
Prompt: Admin page to view recent Pulse task runs for a specific account (e.g., "What Pulse emails has Alexis received in the past 7 days?") Status: completed Changes:
tasks: CreatedsendPulseTasksub-task (src/tasks/sendPulseTask.ts).sendPulsesTasknow callssendPulseTask.triggerAndWait(..., { tags: ['account:<id>'] })per account so each run is queryable by account.api: UpdatedvalidateGetTaskRunQuery.tsto accept optionalaccount_idquery param. Admins (Bearer) can query any account; org API keys can query org members. New supabase fnselectAllAccountSnapshotsWithOwnersreturns{account_id, github_repo}[].buildSubmoduleRepoMapnow returnsAccountRepoEntry[]with account_id.getOrgRepoStats+getAdminSandboxOrgsHandlerenriched to include email inaccount_repos.docs:openapi.json— addedaccount_idparam toGET /api/tasks/runs, updatedOrgRepoRow.account_reposschema to{account_id, email, repo_url}[].admin: New/accounts/[account_id]page withAccountDetailPage+TaskRunsTableshowing Pulse runs.AccountReposListupdated — each entry shows clickable email →/accounts/[id].sandboxesColumns— account email is now a clickable link to/accounts/[id]. PRs: Branches pushed, PRs need to be created manually (gh not available in sandbox):- tasks:
feature/pulse-sub-task-account-tag - api:
feature/task-runs-account-id-param(target:test) - docs:
feature/task-runs-account-id-param - admin:
feature/account-task-runs-pageNotes: To answer "What Pulse emails has Alexis received?": find Alexis'saccount_idvia/sandboxespage (or/sandboxes/orgs), then go to/accounts/<id>— the page shows allsend-pulse-taskruns for that account with status and timestamps.
Prompt: On /accounts/[account_id], clicking a send-pulse-task row should show the Resend email HTML sent during that task run. Status: completed Changes:
api: Newlib/supabase/memory_emails/selectAccountEmailIds.ts— joins rooms → memories → memory_emails to get Resend email IDs for an account. Newlib/admins/emails/getAdminEmailsHandler.ts+app/api/admins/emails/route.ts—GET /api/admins/emails?account_id=<id>fetches each email from Resend SDK (returns id, subject, to, from, html, created_at). Admin Bearer auth required.admin:TaskRunsTable— added optionalonRunClickprop; rows showcursor-pointerwhen clickable.AccountDetailPage— tracksselectedRunstate, passesonRunClickto pulse runs table. NewPulseEmailModal— fetches all emails for the account viausePulseEmails, matches the email closest to the run's time window (±5 min buffer), renders HTML in a sandboxed iframe. NewusePulseEmailshook (lazy, enabled only when modal opens). NewfetchAccountPulseEmailslib function. PRs: Branches pushed, PRs need to be created manually:- api:
feature/admin-pulse-email-preview(target:test) - admin:
feature/pulse-email-preview(target:main) Notes: Email matching uses the run'sstartedAt/finishedAtwindow ±5 min. Falls back to the most recent email for the account if no match. Thememory_emailstable is the link — emails only appear here ifhandleSendEmailToolOutputswas called after the pulse (i.e., the sandbox chat flow ran through the standard chat handler). If pulse emails aren't showing, check thatmemory_emailsrows are being inserted for pulse runs.
Prompt: Update the Admin README to highlight the API calls used and link to the docs where devs can learn more. Status: completed Changes:
admin: RewroteREADME.md— added "API Calls" section with a table of all 5 endpoints (/api/admins,/api/admins/emails,/api/admins/sandboxes,/api/admins/sandboxes/orgs,/api/tasks/runs), doc links todevelopers.recoupable.com, and a "Where each call is made" breakdown per hook/lib file. Also updated Tech Stack section to include Privy and TanStack React Query. PRs: none (README-only change) Notes: Doc links point tohttps://developers.recoupable.com/api-reference/admins/*and.../tasks/runs. All admin endpoints require Bearer auth (Privy access token).
Prompt: Admin dashboard page to review Privy logins on a daily, weekly, and monthly basis — total count + table of results per time frame. Status: completed Changes:
docs: AddedGET /api/admins/privytoopenapi.json(path +PrivyLoginRow/AdminPrivyLoginsResponseschemas), newapi-reference/admins/privy.mdx, updateddocs.jsonnav.api: Newlib/admins/privy/fetchPrivyLogins.ts— paginates Privy Management API, stops early once users are older than the cutoff. NewvalidateGetPrivyLoginsQuery.ts(period: daily/weekly/monthly, default daily). NewgetPrivyLoginsHandler.ts. Newapp/api/admins/privy/route.ts. 11 unit tests, all green.admin: Newtypes/privy.ts,lib/recoup/fetchPrivyLogins.ts,hooks/usePrivyLogins.ts. New/privypage with period toggle (Daily/Weekly/Monthly), total count badge, and login table (email, Privy DID, timestamp). Added "View Privy Logins" nav button toAdminDashboard. PRs: Branches pushed — PRs need to be opened via GitHub:- docs:
feature/admin-privy-logins-docs→ main: https://github.com/recoupable/docs/pull/new/feature/admin-privy-logins-docs - api:
feature/admin-privy-logins→ test: https://github.com/recoupable/api/pull/new/feature/admin-privy-logins - admin:
feature/privy-logins-page→ main: https://github.com/recoupable/admin/pull/new/feature/privy-logins-page Notes:fetchPrivyLoginspaginatesGET https://api.privy.io/v1/users?order=descand stops early oncecreated_at < cutoff. This keeps the daily call fast (only fetches recent pages). If Privy returns users withoutlinked_accountsemail, the row showsnullfor email.
Prompt: All API keys are personal. If a personal account has access to an org, it can use account_id filtering within that org. Remove the distinction between personal and org API keys for access control. Status: completed Changes:
api: Newlib/organizations/canAccessAccountViaAnyOrg.ts— checks if two accounts share any org membership (2 DB queries: get current account's orgs, then check if target is in any of them). Newlib/organizations/__tests__/canAccessAccountViaAnyOrg.test.ts(4 tests). Updatedlib/auth/validateAccountIdOverride.ts— whenorgIdis null (personal key) and target ≠ self, falls back tocanAccessAccountViaAnyOrg()instead of immediately returning 403. Updatedlib/auth/__tests__/validateAuthContext.test.ts— updated "denies personal key" test to mock the new function, added "allows personal key with shared org" test. All 1526 tests pass. PRs: Branchagent/remove-org-api-key-logicpushed torecoupable/api(target:test):- https://github.com/recoupable/api/pull/new/agent/remove-org-api-key-logic
Notes: Only
validateAccountIdOverride.tswas changed in auth. ThebuildGet*Paramsfunctions that receiveorgIdfrom auth context don't need changes — when a personal key accesses via shared org,orgIdin the auth context staysnull, and the query params builders already handleorgId: nullby not filtering on org. The access gate is purely invalidateAccountIdOverride.
Prompt: Document both MCP servers in docs: (1) the Mintlify docs search MCP and (2) the Recoup API MCP with a full list of all tools. Status: completed Changes:
docs: Rewrotemcp.mdx— now explains both servers (Mintlify docs search MCP via contextual menu, and the Recoup API MCP athttps://recoup-api.vercel.app/mcp). Documents all 44 tools grouped by category (Artists, Chats, Tasks, Pulses, Catalogs, Spotify, YouTube, Search, Images, Video, Audio, Files, Communication, Segments, Sandboxes, Utilities). Removed outdatedrun_sandbox_commandentry (tool doesn't exist). Added connection snippet and two call examples. PRs: Branchfeat/mcp-docs-full-tool-listpushed — open PR via: https://github.com/recoupable/docs/pull/new/feat/mcp-docs-full-tool-list Notes: Tool list was derived from allregister*Tool.tsfiles inapi/lib/mcp/tools/. Therun_sandbox_commandin the old mcp.mdx was stale — no such tool is registered. If new tools are added to the API, update this page.
Prompt: Add optional songs array to content creation payload so callers can restrict clip selection to specific songs (e.g., for an EP, a single, or a named album track).
Status: completed
Changes:
tasks:src/schemas/contentCreationSchema.ts— addedsongs: z.array(z.string()).optional().src/content/selectAudioClip.ts— filterssongPathsby slug before random pick; throws clear error if none found.src/tasks/createContentTask.ts— passespayload.songstoselectAudioClip. Newsrc/content/__tests__/selectAudioClip.test.ts— 4 tests covering filter-to-one, filter-to-many, missing-song error, and no-filter (all-songs) cases.src/schemas/__tests__/contentCreationSchema.test.ts— 2 new tests for songs field.api:lib/trigger/triggerCreateContent.ts— addedsongs?: string[]toTriggerCreateContentPayload. PRs:ghnot available in sandbox — PRs need to be opened via GitHub:- tasks:
feature/song-filtering-for-content-pipeline→ main: https://github.com/recoupable/tasks/pull/new/feature/song-filtering-for-content-pipeline - api: changes committed to
testbranch directly (was already on test with many staged changes) Notes: Filtering is path-based:path.includes('/songs/${slug}/'). Callers (Slack bot, chat agent) are responsible for translating user intent (e.g., "ADHD EP") into song slugs before passing to the task. Whensongsis omitted, all songs remain eligible (backward-compatible).
Prompt: Create context/artist.md profiles for 6 Rostrum artists using web research Status: completed (5 full profiles, 1 placeholder) Changes:
- rostrum/artists: Created
context/artist.mdfor goosebytheway (Drumwork/Conway the Machine rapper, Buffalo), mike-taylor (Philly pop-soul, "Feel Good" EP), no-love-for-the-middle-child (Andrew Migliore, multi-instrumentalist producer-artist), rashad-thomas (Columbus producer/rapper, "I Was Told There'd Be Gold" via Fat Beats), solene (cyber jazz pioneer, "Mother of Cyber Jazz", minthaze collaborator) - rostrum/artists: Created placeholder
context/artist.mdfor jada — no public information found linking any "Jada" artist to Rostrum Records; profile marked for update when label provides details PRs: none — changes are local in.local/records/rostrum/Notes: Jada is the only artist with insufficient research results. Multiple search variations tried (Jada rapper, Jada musician Rostrum, Jada hip hop, etc.) — found Jada Kingdom (Republic Records), Jada Lee (Philly independent), and JADA (East London) but none confirmed on Rostrum. Profile written as honest placeholder rather than fabricated content. All other profiles built from confirmed web sources with real proof points.
Prompt: Create context/artist.md profiles for 7 Rostrum Records artists using web research and the established template format Status: completed Changes:
- rostrum/artists: Created
context/artist.mdfor mac-miller (legacy, deceased 2018), wiz-khalifa (Rostrum flagship), jeezy (trap pioneer), raekwon (Wu-Tang/mafioso rap), mobb-deep (Queensbridge duo, Prodigy deceased 2017), sean-price (Boot Camp Clik, deceased 2015), smif-n-wessun (Boot Camp Clik duo) - All 7 profiles follow the established template format (matching ale-araya's structure): personality, topics, genre, comparables, positioning, aesthetic, mood, colors, settings, fashion, voice, tone, sacred rules, avoid
- Each profile built from web research with real biographical data, chart positions, album details, and cultural context — no placeholders or fabricated details
PRs: none — changes are local in
.local/records/rostrum/Notes: Three of the seven artists are legacy/catalog acts (Mac Miller d. 2018, Prodigy/Mobb Deep d. 2017, Sean Price d. 2015). Profiles for deceased artists are written to guide catalog/legacy content management. All profiles include extra sections (Signature Elements, Visual References) only when real information was available.
Prompt: Create milestones, venues, rank, charts, and radio research endpoints across API, MCP, docs, and CLI Status: completed Changes:
- api: Created 5 handler files (
lib/research/getResearch{Milestones,Venues,Rank,Charts,Radio}Handler.ts) — milestones/venues/rank usehandleArtistResearchpattern, charts/radio use non-artist direct proxy pattern - api: Created 5 route files (
app/api/research/{milestones,venues,rank,charts,radio}/route.ts) - api: Created 5 MCP tool files (
lib/mcp/tools/research/registerResearch{Milestones,Venues,Rank,Charts,Radio}Tool.ts) and updatedindex.tsto register all 5 - docs: Added 5 paths + 5 response schemas to
openapi.json, created 5 MDX files, updateddocs.jsonnavigation, added CLI docs tocli.mdx - cli: Added 5 commands to
src/commands/research.ts(milestones, venues, rank, charts, radio) with examples and help text PRs: none yet — changes on existing feature branches Notes: Artist-scoped endpoints (milestones, venues, rank) usehandleArtistResearchshared handler. Non-artist endpoints (charts, radio) follow the genres/festivals pattern (auth + deductCredits + proxyToChartmetric). Charts requires--platformflag; radio has no params. All lint-clean.
Prompt: Fix array-spreading bug in all research handlers — when Chartmetric returns an array as obj, the spread operator produces { "0": item, "1": item } instead of wrapping under a named key
Status: completed
Changes:
- api: Added
transformResponseto 8 artist handlers viahandleArtistResearch(): albums→{albums}, tracks→{tracks}, insights→{insights}, career→{career}, similar→{artists, total}, playlists→{placements}, cities→transforms city map to sorted array{cities}, urls→{urls} - api: Fixed 3 non-artist handlers (genres, festivals, discover) that manually spread
result.data— replaced with named-key wrapping:{genres},{festivals},{artists}PRs: none yet Notes:handleArtistResearchalready had thetransformResponseparameter wired up (4th arg). Each handler now passes the appropriate transform. Cities handler is the most complex — converts Chartmetric's{ "Chicago": [{timestp, code2, listeners}] }map into a flat sorted array. Similar handler handles bothrelatedartists(returns array) andby-configurations(returns{data, total}).
Prompt: Install npx skills add coreyhaines31/marketingskills in the marketing repo.
Status: completed
Changes:
marketing: Rannpx skills add coreyhaines31/marketingskills --yes— installed all 34 skills from the package. Skills live in.agents/skills/, symlinked to.claude/skills/andskills/.skills-lock.jsonalso created. Committed and pushed directly tomain. PRs: none (pushed directly tomain) Notes: Skills installed: ab-test-setup, ad-creative, ai-seo, analytics-tracking, churn-prevention, cold-email, competitor-alternatives, content-strategy, copy-editing, copywriting, customer-research, email-sequence, form-cro, free-tool-strategy, launch-strategy, lead-magnets, marketing-ideas, marketing-psychology, onboarding-cro, page-cro, paid-ads, paywall-upgrade-cro, popup-cro, pricing-strategy, product-marketing-context, programmatic-seo, referral-program, revops, sales-enablement, schema-markup, seo-audit, signup-flow-cro, site-architecture, social-content.
SUBMODULE_CONFIGintasks/src/sandboxes/submoduleConfig.tsdoes not includeadminormarketing— if the agent modifies those submodules, PRs won't be auto-created. Consider adding them.- No
PROGRESS_USAGE.mdexists yet — if this file should have a companion usage guide, create it. - The
progress.txtinit file referenced in the task prompt was not found — likely hasn't been created yet, or was intended as a seed for future use.
chat (frontend) → api (backend) → Supabase (database)
↘ tasks (async Trigger.dev jobs)
- Coding agent flow: Trigger.dev task → Vercel Sandbox → Claude Code CLI (
claude -p --dangerously-skip-permissions) → git commit/push → PR viagh - PRs for
apiandchattargettestbranch; all others targetmain - Admin check: POST
/api/admins/check— verifies if authenticated Privy user is in admins table
Prompt: Update docs for GET /api/admins/privy to include the latest API response — missing default of all for period and missing response fields (total_new, total_active, total_privy_users)
Status: completed
Changes:
docs: Updatedapi-reference/openapi.json— addedalltoperiodenum (set as default, replacing incorrectdailydefault); added missing 200 response fields:total_new,total_active,total_privy_users; updated endpoint description to reflect actual API behavior. PRs: Branchagent/-u0ajm7x8fbr-docs---added-resp-1773769254740pushed torecoupable/docs— PR targetingmain. Notes: Actual API code (validateGetPrivyLoginsQuery.ts) defaultsperiodto"all"(no date filter). Handler returns{ status, total, total_new, total_active, total_privy_accounts, logins }.
Prompt: Change total_privy_users to total_privy_accounts in the GET /api/admins/privy OpenAPI spec.
Status: completed
Changes:
docs: Renamedtotal_privy_users→total_privy_accountsinapi-reference/openapi.json(required field list, property name, and description). PRs: Pushed to existing branchagent/-u0ajm7x8fbr-docs---added-resp-1773769254740onrecoupable/docs. Notes: Matches the API response field naming convention (accounts, not users).
Prompt: Review docs from a user journey perspective — are they clear for Humans and Agents? Status: completed Changes:
docs: Navigation order fixed — authentication before MCP in sidebardocs: Homepage (index.mdx) — integration path cards (REST API / MCP / CLI), clearer "what you can build" framing for humans and agentsdocs: Quickstart (quickstart.mdx) — first example now uses Spotify search (no existing data needed, works immediately); removed Tasks list as first example; added MCP in next stepsdocs: MCP page (mcp.mdx) — added copy-paste config snippets for Claude Desktop, Cursor, and VS Code before the TypeScript SDK; moved tool reference after connection guidesdocs: API reference intro (api-reference/introduction.mdx) — removed duplicate auth/base URL content; now a clean page linking to auth guide PRs: Branchfeat/mcp-docs-full-tool-listpushed torecoupable/docs. PR needs to be opened againstmain. Notes:ghCLI not available in this sandbox — PR must be created manually or via the next agent run that has GitHub access.
Status: completed Changes:
- api: Expanded SUPPORTED_TOOLKITS from 4 to 12 connectors (added Gmail, Google Calendar, Spotify, Instagram, Twitter/X, YouTube, Slack, LinkedIn)
- api: Expanded ALLOWED_ARTIST_CONNECTORS to include spotify, instagram, twitter, youtube (in addition to tiktok)
- api: Updated CONNECTOR_DISPLAY_NAMES with 8 new entries
- api: Updated 3 test files — all 13 tests pass
PRs: recoupable/api#337
Notes: PR targets
testbranch. Changes are in feature/composio-more-connectors branch.
Prompt: Add tag filter chips to admin coding page with new API endpoint for filter options Status: completed Changes:
api: Added optionaltagquery param toGET /api/admins/coding/slack(filters by user_id); created newGET /api/admins/coding-agent/slack-tagsendpoint returning distinct Slack users; added 5 passing testsadmin: AddedSlackTagOption/SlackTagOptionsResponsetypes; createdfetchSlackTagOptionsanduseSlackTagOptions; updateduseSlackTagsto accept optionaltagparam; updatedCodingAgentSlackTagsPagewith clickable filter chips, toggle, and clear-filter UX PRs:- api: recoupable/api#338 (base: test)
- admin: recoupable/admin#23 (base: main)
Notes: Admin lint was non-functional due to pre-existing monorepo root eslint.config.js missing
@eslint/jspackage — unrelated to this task. API lint errors in my new files match the same pattern as existing route files (pre-existing jsdoc rules). All new tests pass.
Prompt: Create a new Sr Dev agent that handles coding tasks delegated by the CTO, working closely with the Code Reviewer agent Status: completed Changes:
mono/agents/sr-dev/AGENTS.md: Created instructions file for the Sr Dev agent covering code standards, git workflow, build commands, and Code Reviewer integration PRs: none Notes: Hire approved by board. Sr Dev agent (81d2b822-486a-4d29-8d43-87d83d740239) is active and idle. Workflow: CTO delegates coding tasks → Sr Dev implements → Code Reviewer reviews → feedback tasks routed back to Sr Dev.
Prompt: Add optional songs filter to content creation pipeline so callers can limit generation to specific songs/EPs Status: completed Changes:
tasks: Addedsongs?: string[]tocontentCreationSchema;selectAudioClipnow filters by slug before random selection;createContentTaskpassespayload.songsthrough; 6 new tests passingapi: Addedsongs?: string[]toTriggerCreateContentPayloadinterface inlib/trigger/triggerCreateContent.tsPRs:- tasks: pending (branch: feature/song-filtering-for-content-pipeline)
- api: pending (branch: agent/-u0ajm7x8fbr---song-filtering--1774495678034) Notes: Caller is responsible for translating user intent (e.g. "ADHD EP") into song slug arrays. Pipeline just filters — no release detection logic.
Prompt: Fix /content page to show Content Agent mentions from Slack thread replies, not just top-level messages Status: in_progress (awaiting code review) Changes:
- api: Extended
fetchBotMentionsto scanconversations.repliesfor thread mentions with cutoff filtering - api: Added 3 new test cases for thread mention scenarios
PRs: recoupable/api#429
Notes: PR targets
testbranch. @Code Reviewer notified for review.