scenario-moderation
Scenario Blocked Generations
Overview
Content filters run on the model provider's side, not on Scenario. A block is therefore a property of the model that was picked, not of the account or of the prompt in the abstract, and the same prompt usually passes on other models in the catalog. Treat a block as a routing problem first and a wording problem second. This skill is about false positives on content a team is entitled to make; it is not a way to produce content a provider prohibits. Core loop: see the scenario skill. If a sibling skill named here is missing from your available skills, ask the user to install it (npx skills add scenario-labs/skills --skill <name>); unattended, proceed from tool schemas and flag the gap.
Quick reference
| Step | Call |
|---|---|
| Read the actual error | job_get with job_id: the row carries error and hint, plus modelId (the model to exclude) and cuCost (what the failed run charged); verbose=true adds metadata.input with the exact prompt the job ran. Or read error and hint off the jobs_wait row |
| Find alternative models | recommend with the failed job's capability (txt2img for a text-to-image block, img2img with a reference in play) plus the user's own words; set max_cost_cu a little above the failed row's cuCost per asset to stay in the cost band, and drop the failed modelId from the ranking yourself, since recommend has no exclusion argument |
| Price an alternative | model_run with dry_run=true |
| Re-test the same intent | One model_run per candidate, prompt unchanged, so the model stays the only variable |
Three failures look alike and only the first is about wording: a provider moderation block, a 403 Forbidden error (the plan does not include that model), and a model a team has put on its own blocklist. Read the error before rewriting anything.