{
  "schema": "leumas.docs.page/1",
  "id": "skill:leumas-studio#domains/revenue",
  "slug": "skills/leumas-studio/domains/revenue",
  "kind": "tools",
  "bucket": "skill",
  "title": "Revenue — what you can do",
  "name": "Revenue",
  "eyebrow": "what you can do",
  "chip": null,
  "summary": "<!-- GENERATED by ops/tools/skill-sync — do not edit by hand. Run pnpm skills:sync. -->",
  "keywords": [
    "leumas-studio",
    "fetch remember",
    "skill-sync",
    "pnpm",
    "skills",
    "edit",
    "hand",
    "generated"
  ],
  "audience": "both",
  "funnel": {
    "product": null,
    "cta": null
  },
  "body": "<!-- GENERATED by ops/tools/skill-sync — do not edit by hand. Run `pnpm skills:sync`. -->\n\n# Revenue — what you can do\n\n`/admin/d/revenue` · pillar `account`\n\nRun, schedule and account for the revenue streams — what each one really calls here, and what it recorded.\n\n## Fetch this, never remember it\n\nThese change per install and per release. Call for them - a list written here would be a future lie.\n\n| What | Call | Why |\n|---|---|---|\n| the streams this install operates, with coverage and ledger totals side by side | `GET /api/revenue/summary` | coverage depends on which adapters and provider connections THIS deployment has; the same stream is 90% wired on one install and 50% on another |\n| step by step, what one stream will really do here | `GET /api/revenue/streams/<id>/bindings` | the only honest answer to \"will this publish anything\" — it names every simulated step and why it is simulated |\n| what a run actually did | `GET /api/jobs?kind=revenue.recipe` | a revenue run IS a job; progress, trace, cancel and retry live there and are not duplicated in this domain |\n| what is scheduled | `GET /api/planner/occurrences?from=&to=` | a revenue schedule IS a plan on the shared planner, so the calendar is the planner’s, not this domain’s |\n\n## How to actually do things here\n\nWritten by hand, because the order and the traps are the part no file can derive.\n\n### Find out whether a stream can really do the thing somebody asked for\n\n1. `GET /api/revenue/streams/<id>` — read `coverage.steps`.\n2. A step of kind `executor` or `ledger` runs for real. `gap` answers with a receipt and `reason` says why.\n3. `gate` means the run stops and waits for a person, indefinitely and without holding a slot.\n\n**Trap:** Never infer capability from the stream NAME or its category. `dropshipping` sounds fully automated and is 56% simulated here, because no supplier catalog adapter exists in this repo — the stream file’s own Gap clause says so, and the binding table quotes it.\n\n### Run a stream\n\n1. `POST /api/revenue/streams/<id>/run` with `{recipeId, bindings}` — this is a PREVIEW; it answers 202 with a job id.\n2. Watch the job. A `simulated: true` step result is the receipt, not the work.\n3. To do it for real, send `{mode: \"execute\"}`. It will still park at every publish, money or destructive gate.\n\n**Trap:** A preview writes NO ledger rows, so `GET /api/revenue/ledger` staying empty after a preview is correct rather than broken. Reporting \"the run recorded revenue\" after a preview is the single easiest mistake to make in this domain.\n\n### Schedule a stream\n\n1. `POST /api/revenue/streams/<id>/schedule` with `{recipeId: \"scheduled\", schedule: {cron: \"0 9 * * 1\"}}`.\n2. It becomes a plan of kind `revenue.recipe`; confirm it in `GET /api/planner/occurrences`.\n\n**Trap:** A schedule does not imply consent to spend: the plan carries its own `mode` and it defaults to preview, so arming a cadence on a stream that charges a card is a second, separate decision.\n\n### Reconcile a run whose books are wrong\n\n1. Run the `recovery` recipe with `{mode: \"execute\"}` and the original run’s ids in `bindings`.\n\n**Trap:** Recovery re-runs the LEDGER half only, and that is the whole reason it exists — re-running `manual` to fix the books would publish the video a second time.\n\n## Tabs\n\nEvery one is a real URL. A tab with its own section below carries a real job.\n\n| Tab | Path | Group | What it is for |\n|---|---|---|---|\n| `(index)` | - | - | - |\n| `factories` | - | - | - |\n| `clones` | - | - | - |\n| `ledger` | - | - | - |\n\n## API\n\nMounted prefixes that serve this domain: `/api/revenue`\n\nThe full route table is `leumas-capabilities/reference/api-routes.md`.\n\n",
  "source": {
    "path": ".claude/skills/leumas-studio/reference/domains/revenue.md",
    "blobSha": "",
    "commit": "",
    "committedAt": "",
    "provenance": "no-git",
    "bytes": 3696,
    "hash": "b208834d689d13a395621317b70ce28354142362"
  },
  "urls": {
    "html": "/p/skills/leumas-studio/domains/revenue",
    "json": "/docs/skills/leumas-studio/domains/revenue.json",
    "md": "/docs/skills/leumas-studio/domains/revenue.md"
  },
  "links": {
    "composes": [],
    "usedBy": [],
    "product": [],
    "howTo": [],
    "skills": []
  }
}
