Paperclip Org Setup — RateLab¶
Date: 2026-07-03 (activated: routines, skills, 4-topic plan, kickoff runs; goal tree cut to revenue-only; leads temporarily on Opus 4.8 due to Fable quota)
Production Paperclip org for the operator's adult-site NETWORK business, built
and refit live against the running instance (ns ai, svc
paperclip.ai.svc.cluster.local:3100, public
https://paperclip.ai.cauda.dev). Every object
below was created/updated via the Paperclip API from inside the pod and
readback-verified via GET or a direct DB query. This file is the durable record
of what exists and how to drive it.
The business¶
RateLab operates a NETWORK of adult gallery/tube sites in the amateur-gallery genre ("show your dick / show your cunt / manydicks"-style). It is a cluster of single-theme sites (one per category — cocks, pussies, asses, etc.) interlinked into a cross-promotion "circle" so traffic and ad impressions compound across the whole network.
- Content is either pre-seeded LICENSED packs (bought from producers who hold the model releases + age/consent records — never scraped) or user-uploaded (UGC). Every site launches pre-seeded so it is never empty.
- Monetized via legitimate adult ad networks (ExoClick, TrafficJunky, JuicyAds, etc.) and adult affiliate on-sell (CrakRevenue, etc.).
- Grown with real traffic only: genuine SEO, marketing, and adult-ecosystem traffic (tube / ad-network / traffic-trade).
- Revenue is the north star. The network compounds real traffic toward it.
The cauda cluster is only the build/orchestration environment: agents build
site code into the gitea repo gitea_admin/ratelab-sites and the operator
deploys off-cluster to the chosen host. The org is scaffolding only — the
agents are configured and idle; the operator assigns the first real work. No
content is generated or acquired by this setup.
- Company id:
988214b1-3270-4cc6-afa3-b6b8832d4256 - Name: RateLab · Issue prefix:
RAT· Status: active
Operational floors (offshore, jurisdiction-neutral)¶
The operator hosts offshore and does not carry US/EU regulatory overhead. There is no §2257 secondary-producer paperwork, no EU-specific framing, and no ID/KYC bureaucracy. What remains is the lean operational floor that every ad network + payment processor + host requires:
- Pre-seeded LICENSED content: retain the license/purchase record + the producer's age/consent records per pack. The producer already handled rights/age/consent; this is the licensing checkpoint and it is the safeguard.
- User uploads (UGC): an 18+/rights/consent attestation checkbox on the upload form; a pre-publish AI+human moderation queue (nothing goes live unreviewed); CSAM hash-screening (PhotoDNA/NCMEC-style hash match) with remove+report on a hit; and a DMCA / report-abuse inbox. UGC upload stays DISABLED on a site until this floor is wired (launch-blocking for UGC only).
- Every site: an 18+/21+ age gate before content is visible.
These are treated as business-survival requirements, not legal paperwork — bad records or fake traffic gets content pulled and ad accounts banned.
Hard guardrails (in the company description + every agent's AGENTS.md)¶
FORBIDDEN, network-wide: bot/fake/automated traffic, click/impression fraud; link-wheels / PBNs / paid-link schemes (search engines deindex link schemes — cross-linking is legitimate cross-promotion of the operator's OWN sites, nothing more); thin/doorway/mass-produced pages, fabricated reviews / fake E-E-A-T; cloaking / deceptive redirects / keyword-stuffing; scraping or reposting third-party or non-consensual content; any licensed pack without retained license + producer records; any UGC that skips attestation + moderation + CSAM screening; CSAM of any kind; any ad-network-ToS-violating trick.
Agents (11)¶
Each agent has an adapter, a model, and a managed AGENTS.md instructions bundle
(entryFile: AGENTS.md) carrying its role prompt plus the shared network
guardrails. All run on the shared Local execution environment
(d918b3f7-f11d-456f-89e3-ed6d420a5a99, driver local).
Build capacity spans three providers so work routes to the best/available model and no single subscription is a bottleneck. The Claude ladder is **Fable 5
Opus 4.8** (verified against the adapter's live model list — the newest Sonnet the
claude_localadapter exposes isclaude-sonnet-4-6, so the tier below Fable is Opus 4.8, not a Sonnet).
| Agent | Role | Adapter | Model / endpoint | Tier / purpose | Agent id |
|---|---|---|---|---|---|
| Engineer | engineer | claude_local |
claude-opus-4-8 (temp; normally claude-fable-5) |
Lead — architecture, hardest work, review | 1cb328bf-fda7-4b98-bede-41d210275069 |
| Builder | engineer | codex_local |
gpt-5.5 |
Codex builder (strongest GPT) | 6a958630-f8db-4060-8951-f129914c855e |
| Builder-Claude | engineer | claude_local |
claude-opus-4-8 |
Claude builder (cross-checks Codex) | c6768a9f-b045-4349-9cdb-5c4d87b2abd7 |
| Builder-B60 | engineer | opencode_local |
cauda/qwen3-8b (B60) |
Bulk/cheap coding, scaffolding | 7ae05dda-1965-49e5-9f8a-8c8fb917b656 |
| Content-SEO | researcher | claude_local |
claude-opus-4-8 |
SEO copy + on-page cross-promo strategy | 43f9743a-ee29-4f76-9f00-4b3f61be552e |
| Marketing | cmo | opencode_local |
cauda/qwen3-8b (B60) |
Marketing + ad-network ops | af7fb7c6-064a-4ed5-b045-5bdc6fd16ae6 |
| Analytics-Ops | researcher | claude_local |
claude-opus-4-8 |
Analytics + attribution + growth-loop review | cb51f8ff-d92c-4510-a820-df831c50c426 |
| Growth-Strategist | researcher | claude_local |
claude-opus-4-8 |
Market/monetization research + growth loop | e099eca4-d3d6-478d-8016-44c3e9e23124 |
| Bulk-Content-Writer | researcher | opencode_local |
cauda/qwen3-8b (B60) |
High-volume gallery/blog copy | 6a5df859-724d-422e-a2b0-425c4e280fd7 |
| Metadata-Tagger | researcher | opencode_local |
cauda/qwen3-8b (B60) |
Titles/tags/alt-text/categorization at scale | aee199c3-2f2e-4677-8887-7e68de6a7fd4 |
| Localization | researcher | opencode_local |
cauda/qwen3-8b (B60) |
Translate pages for geo traffic | 5a934228-db6c-4000-ae48-598822e6dc34 |
- Lead on the strongest model: Engineer is normally on
claude-fable-5(Mythos-class, above Opus). Currently temporarily set toclaude-opus-4-8(2026-07-03) because the operator's Max-subscription Fable quota is exhausted and Fable agents can't run. Restore Engineer toclaude-fable-5when quota resets. Theclaude_localadapter has a singlemodelfield and no fallback/secondary model slot (verified against the adapter'sagentConfigurationDoc), so there is no in-config auto-flip-back — it is a manual model PATCH. The same temporary Opus-4.8 swap was applied to Northlight Content's Engineer lead (8a43ca66-6602-40f5-bd18-8de841e74542), which was also on Fable. Both swaps were model-only merge PATCHes (instructions/effort/env preserved); DB-verified. - Subscription lanes (
claude_local,codex_local) use the seeded Claude Max / ChatGPT credentials — left untouched by this refit. OnlyadapterConfig.modelwas changed (merge PATCH; the instructions-file keys were preserved). - B60 lane (
opencode_local): all five B60 agents point at the in-cluster B60 qwen router (OpenAI-compatible, free, no auth) via a custom OpenCode provider injected throughadapterConfig.env.PAPERCLIP_OPENCODE_PROVIDERS(baseURL: http://qwen3-8b-router.ai.svc.cluster.local/v3, placeholder apiKey). Model iscauda/qwen3-8b;PAPERCLIP_OPENCODE_SMALL_MODELmatches.STALE (standalone B60 8b retired): that router Service no longer exists. These in-DB
adapterConfig.envoverrides must be repointed tohttp://qwen3-8b-b580-router.ai.svc.cluster.local/v3with wire modelqwen3-8b-b580(the B580's served name), or dropped so agents inherit the deployment-global providers.
Code environment (gitea, not GitHub)¶
Site code lives in gitea — nothing points at GitHub (verified: 0 GitHub URLs).
- Gitea repo:
gitea_admin/ratelab-sites(private,main), clone URLhttps://git.dev.cauda.dev/gitea_admin/ratelab-sites.git. - Paperclip project: RateLab Sites (
4f02bf16-8085-49dd-845c-8e84abf41c8f) with a primarygit_repoworkspaceratelab-sites(d607f15d-75f5-4e67-9f4a-983d111e929b) bound to that repo onmain. Left untouched by the refit and re-verified intact.
Pipelines (10)¶
Paperclip's reusable-workflow construct is the pipeline: a named kanban of
stages (working / review / done / cancelled) through which work items
flow. Review stages route approve → done, request-changes → the build/draft
stage, reject → cancelled, and require a human approver (all 10 verified
resolving). Each stage's whatHappensHere names the owning agent so work
assigns to the right agent by default. Agents are not auto-run — nothing executes
until the operator assigns an item.
| Pipeline | Key | Stages (owner) |
|---|---|---|
| New site launch | new-site |
Spec the niche (Growth/Engineer + Content-SEO) → Build (Builder/Builder-Claude/Builder-B60 + Engineer) → Pre-seed content (Builder-B60 + Metadata-Tagger) → Compliance check (Analytics-Ops + Engineer) → Review (Engineer + human) → Deploy-ready → Cancelled |
| Content licensing & ingestion | feature-bugfix |
Acquire pack (Growth/Analytics) → Verify license & ingest (Analytics-Ops → Builder-B60 + Metadata-Tagger) → Publish review (human) → Published → Cancelled |
| SEO content | seo-batch |
Brief & keywords (Content-SEO) → Draft (Content-SEO + Bulk-Content-Writer) → Editorial review (human) → Published → Cancelled |
| Ad-network integration & monetization | analytics-review |
Integrate zones/tags (Marketing + Builder) → Optimize CPM (Analytics-Ops + Marketing) → Review (human) → Live → Cancelled |
| Traffic growth campaign | campaign |
Plan (Marketing + Content-SEO + Growth) → Draft (Marketing) → Review (human) → Scheduled/Posted → Cancelled |
| Network architecture & interlinking | network-arch |
Design (Engineer + Content-SEO + Analytics-Ops) → Review (human) → Adopted → Cancelled |
| Market & monetization research | market-research |
Research (Growth-Strategist + Analytics-Ops) → Write brief (Growth-Strategist) → Review (human) → Actioned → Cancelled |
| Blog-to-gallery content funnel | blog-funnel |
Brief & strategy (Content-SEO) → Draft volume (Bulk-Content-Writer + Content-SEO + Builder) → Editorial review (human) → Published → Cancelled |
| Licensing & compliance audit | compliance |
Intake → Implement/act (Engineer + Builder) → Verify & document (Analytics-Ops) → Sign-off (human) → Closed → Cancelled |
| Content moderation & takedown | trust-safety |
Upload attestation (Engineer + Builder) → CSAM hash-screen (Engineer + Builder, Analytics verifies) → Moderation queue AI+human (Analytics SLAs, Engineer tooling) → Moderation sign-off (human) → UGC cleared → Blocked |
Network model, baked in¶
- Network architecture & interlinking designs the themed-site cluster, the cross-promo circle (sister-site widgets, "more from the network" blocks, contextual cross-links, funnels toward high-CPM ad zones), the shared taxonomy, and shared analytics/attribution (which sites feed which).
- New site launch references it: each new site is a themed node that plugs into the cross-promo circle + shared taxonomy on launch, and pre-seeds licensed content so it is never empty. UGC upload can only be enabled once the Content moderation & takedown floor is wired (launch-blocking for UGC).
- Blog-to-gallery content funnel is the SEO on-ramp: per-niche, genuinely useful topical blog content that ranks organically and funnels search visitors into the gallery sites, wrapped with ad zones + affiliate offers.
Goals — the tree under "Maximize revenue" (revenue-only)¶
The goal tree is business/revenue objectives only — per operator direction
(2026-07-03) no compliance/policy is framed as a goal. The former "Licensing &
moderation floor" goal and all six of its children (licensed-record retention,
records-per-pack, UGC attestation+moderation, age-gate, CSAM+DMCA,
real-traffic-only) were deleted. The one thing kept from that set — the
CSAM hash-screen on user uploads — lives as a technical stage in the
Content moderation & takedown pipeline (stage csam-screen), NOT as a goal;
it is the filter that keeps illegal images off the network. It was not expanded.
- Maximize revenue (
88d04087-…, company) — the north star. Ad revenue + affiliate/on-sell + any legitimate monetization; everything ladders up to it. - Grow the network legitimately (
0592ff7c-…) — licensed content, legit ad networks, real traffic only. - Growth loop — measure, double down, re-measure (
7ab8f30a-…, owner Growth-Strategist) — Analytics measures → Growth identifies winners → expand content/sites in those niches → re-measure. The network compounds. - Network SEO — topical authority + genuine cross-promotion (
dc045ff0-…, owner Content-SEO) — per-site topical authority, genuine cross-promotion of the operator's OWN sites (NOT a link-wheel / PBN / paid-link scheme — those get deindexed), strong technical SEO, real internal linking.
DB-verified after the cleanup: exactly four goals remain (the root + three pillars above); zero compliance-framed goals under RateLab.
Routines (3 — scheduled automations)¶
Recurring automations created via POST /companies/:id/routines + a schedule
trigger (POST /routines/:id/triggers, cron, timezone Europe/Berlin). Weekly-
ish cadence on purpose — routine runs spend the operator's subscription quota.
All three are active with an enabled schedule trigger; DB-verified.
| Routine | Owner | Schedule (cron, Europe/Berlin) | Trigger |
|---|---|---|---|
Weekly market & monetization research refresh (a1804f7e-…) |
Growth-Strategist | 0 7 * * 1 — Mon 07:00 |
schedule 16a74a9e-… |
Weekly analytics & growth-loop review (cc26319b-…) |
Analytics-Ops | 0 8 * * 1 — Mon 08:00 |
schedule 5667a5d4-… |
Content cadence — scheduled blog & gallery batches (c8b79c3e-…) |
Content-SEO (+ Bulk-Content-Writer drafts) | 0 9 1,15 * * — 1st & 15th 09:00 |
schedule 8ef9e564-… |
- Market refresh re-scans ad networks / affiliate / CPM / niches.
- Analytics review finds winners and recommends where to expand.
- Content cadence queues steady blog/gallery batches (Content-SEO briefs, Bulk-Content-Writer drafts); nothing publishes without human editorial review.
Skills (8 company skills, one per capability, attached to the right agents)¶
Paperclip's skill model: a company skill is a markdown SKILL.md bundle
(POST /companies/:id/skills then PATCH …/skills/:id/files to write the body).
Skills attach to an agent via POST /agents/:id/skills/sync {desiredSkills:[key]}
— sync REPLACES the agent's desired list, so send the full set per agent in
one call. The catalog (GET /skills/catalog) only ships paperclip-ops skills
(issue-triage, task-planning, wireframe, github-pr-workflow, etc.) — none fit an
adult-site network — so these eight are local company skills, scope company.
All DB- and API-verified (attachedAgentCount, usedByAgents).
| Skill (slug) | Attached to |
|---|---|
web-nextjs-site-building |
Engineer, Builder, Builder-Claude, Builder-B60 |
technical-seo-onpage |
Content-SEO |
ad-network-affiliate-ops |
Marketing |
analytics-attribution |
Analytics-Ops |
market-monetization-research |
Growth-Strategist |
bulk-content-writing |
Bulk-Content-Writer |
metadata-taxonomy |
Metadata-Tagger |
localization-geo |
Localization |
Skill keys are company/988214b1-…/<slug>. OpenCode-adapter agents (Marketing,
Bulk-Content-Writer, Metadata-Tagger, Localization, Builder-B60) sync in
persistent mode with a benign "shared Claude skills home" warning; Claude/Codex
agents sync in ephemeral mode. The five default paperclip skills stay installed
but attached to no one.
Planned work — the 4 core topics (cock, pussy, tits, ass)¶
Project-management planning only (no builds run, no content generated/sourced).
Each topic has a coherent full-stack plan expressed as cases across three
pipelines; each case lands in the pipeline's first working stage, whose owning
agent is already configured (whatHappensHere). Add-item data goes in each
case's fields (theme, niche, target keywords, monetization, affiliate offers,
link-shortener reference) plus a rich summary. Every case references the paired
blog/site/ads cases and the shared link shortener.
| Topic | New-site case (new-site → spec) |
Blog funnel case (blog-funnel → brief) |
Ad-network case (analytics-review → pull) |
|---|---|---|---|
| cock | site-cock b919052f-… |
blog-cock c35eee5d-… |
ads-cock 274fe926-… |
| pussy | site-pussy 1c29fea6-… |
blog-pussy aa443a53-… |
ads-pussy 44a1cd13-… |
| tits | site-tits a35518b4-… |
blog-tits 139e206b-… |
ads-tits 5696966a-… |
| ass | site-ass 43721b5a-… |
blog-ass 7bf50cbf-… |
ads-ass 7e3ffb76-… |
- New-site case: themed gallery/tube node; pre-seeded licensed content at launch, age gate, plugs into the cross-promo circle + shared taxonomy; UGC upload disabled until the moderation floor is wired.
- Blog funnel case: the topic's topical blog that funnels organic search traffic into the gallery, wrapped with ad zones + affiliate offers + cross-promo blocks.
- Ad-network case: ExoClick primary + TrafficJunky/JuicyAds, CPM optimization with Analytics-Ops; affiliate offers (CrakRevenue et al.) attached per topic and routed through the shared link shortener.
Domain research + network architecture + link shortener¶
- Domain research —
domains-4topics(673af672-…) in Market & monetization research (stageresearch,topic: domain-acquisition): find good cheap domains for the 4 galleries plus their 4 blogs (8 total) with registrar, rough cost, and availability; picks feed back into eachsite-*/blog-*case. - Network architecture & interlinking + link shortener —
net-arch(f0192885-…) in Network architecture & interlinking (stagedesign,scope: cross-promo-circle): designs the cross-promo circle across the 8 nodes (sister-site widgets, "more from the network" blocks, contextual cross-links, blog→gallery funnels toward high-CPM zones), the shared taxonomy, and shared analytics/attribution. Models a shared link shortener as a first-class network component — affiliate-link management + per-click traffic attribution across the whole network; every affiliate + cross-promo link routes through it. Cross-linking is genuine cross-promotion of the operator's OWN sites, not a link-wheel/PBN.
Kickoff — the first 2 high-leverage runs (started)¶
Measured start (not all agents blasted): two POST /routines/:id/run calls on the
market-research routine, each creating an execution issue and enqueuing its agent.
Both 202 issue_created, both in_progress (DB-verified). The rest of the plan is
queued for the operator to run.
| Kickoff | Agent | Run id | Execution issue |
|---|---|---|---|
| Domain + niche + monetization research (informs everything) | Growth-Strategist | d7ca73e5-… |
RAT-1 |
| Network architecture + link-shortener design | Engineer (Fable 5) | 1a5c4141-… |
RAT-2 |
How to assign your first job¶
- Open https://paperclip.ai.cauda.dev (behind
Authentik, then Paperclip's own better-auth — admin
[email protected]). - Select the RateLab company.
- Pick the pipeline for the work:
- New themed site → New site launch (it pre-seeds licensed content and plugs into the cross-promo circle; UGC stays off until moderation is wired).
- Acquire/ingest a licensed pack → Content licensing & ingestion.
- Wire an ad network into a site → Ad-network integration & monetization.
- Design/extend the cross-promo network → Network architecture & interlinking.
- Research ad networks / affiliates / niches / domains → Market & monetization research.
- SEO blog on-ramp → Blog-to-gallery content funnel; standalone SEO copy → SEO content.
- Grow real traffic → Traffic growth campaign.
- Enable/verify user uploads on a site → Content moderation & takedown.
- Periodic audit → Licensing & compliance audit.
- Add a case/item to the first stage (fill the add-item fields), then assign it
to the stage's owning agent (the
whatHappensHerenote names the default owner). Route build work to the right tier: Fable 5 Engineer for architecture, Opus Builder-Claude / Codex Builder for features, Builder-B60 for bulk. - The assigned agent runs on its adapter against the
ratelab-sitesgitea repo where code is involved; the operator deploys off-cluster.
Notes / API surprises¶
- Auth from inside the pod:
POST /api/auth/sign-in/emailsets the session viaSet-Cookie— use the full__Secure-paperclip-default.session_token=<value>cookie string from theSet-Cookieheader (the JSON body'stokenis only the first half and yields 401). Every authed call also needsOrigin: https://paperclip.ai.cauda.dev(this exact origin —127.0.0.1givesINVALID_ORIGIN403). - Add a case / board item via
POST /api/pipelines/:pipelineId/cases(ingestCaseSchema):{caseKey?, title, summary?, fields?, stageKey?, ...}. The case lands in the pipeline's first working stage unlessstageKeyis given. The "add-item fields" are the free-formfieldsJSON object; keys are accepted as-is EXCEPT the target stage's configured requiredvariablesmust be present or it 422s (required_field). Gotchas hit here:new-site/specrequiresniche,blog-funnel/briefrequiresniche,market-research/researchrequires atopicselect (one ofad-networks-cpm|affiliate-programs|seo-trends|domain-acquisition|niche-competitor). Cases carry NOassigneeAgentId— the stage's configured owner runs the work when the case reaches that stage. - Routines = scheduled automations. Create with
POST /api/companies/:id/routines({title, description?, assigneeAgentId, goalId?, status}), then add a trigger withPOST /api/routines/:id/triggers({kind:"schedule", cronExpression, timezone}; alsowebhook/apikinds). Creating/activating needs boardtasks:assign(instance admin has it). A run —POST /api/routines/:id/run({source, assigneeAgentId?, payload?}) — creates an execution issue and enqueues the assignee (this spends subscription quota).assigneeAgentIdon the run overrides the routine's owner, so one routine can kick off a run for any assignable agent. - Skills: the catalog (
GET /api/skills/catalog) only ships paperclip-ops skills — nothing domain-relevant — so domain skills are local company skills:POST /api/companies/:id/skills({name, slug, categories, sharingScope}) thenPATCH …/skills/:id/files {path:"SKILL.md", content}for the body. Attach withPOST /api/agents/:id/skills/sync {desiredSkills:[key]}where key iscompany/<companyId>/<slug>. Sync REPLACES the agent's desired list — send the full per-agent set in one call. OpenCode-adapter agents syncpersistentwith a benign "shared Claude skills home" warning; Claude/Codex agents syncephemeral. - Goal delete is single-row, FK is
NO ACTION:DELETE /api/goals/:idremoves only that goal; to delete a subtree you must delete children before the parent or the FK (goals_parent_id_goals_id_fk) rejects it. - Stage config is REPLACE, not merge on
PATCH /pipelines/:id/stages/:stageId: send the full config (variables + approver + review routing keys +whatHappensHere) or you drop the routing keys. Patch stages by stageId, not stage key (key path → 500). - Agent
adapterConfigis MERGE by default (unlessreplaceAdapterConfig:true), so a{model:X}PATCH preserves the instructions-file keys — verified. - Model ids are resolved from the adapter's live list
(
GET /api/companies/:id/adapters/claude_local/models), not from memory: Fable 5 =claude-fable-5, Opus =claude-opus-4-8; the newest Sonnet the adapter reports isclaude-sonnet-4-6(so the sub-Fable tier is Opus). - AGENTS.md is written via
PUT /api/agents/:id/instructions-bundle/filewith{path:"AGENTS.md", content:"…"}. - Review stages require
approveToStageKey+rejectToStageKey(+ anyrequestChangesToStageKey) to reference existing stage keys or creation 422s.