{"record":{"id":"b8dbe827cd93d32a","repo":"affaan-m/ECC","slug":"workflow-requires-dry-run-true-provider-execution-is","errorCode":null,"errorMessage":"workflow requires dry_run=true; provider execution is disabled","messagePattern":"workflow requires dry_run=true; provider execution is disabled","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"skills/taste-application/scripts/tasteforge/workflow.py","lineNumber":539,"sourceCode":"\n\ndef run_workflow(config_path: str | Path, out_dir: str | Path, *, probe: Probe | None = None) -> dict[str, Any]:\n    \"\"\"Execute the deterministic offline contract and return its receipt.\"\"\"\n    config_path = Path(config_path)\n    out_dir = Path(out_dir)\n    config = json.loads(config_path.read_text(encoding=\"utf-8\"))\n    probe = probe or probe_media\n\n    def resolve_input(raw_path: str) -> Path:\n        candidate = Path(raw_path).expanduser()\n        if not candidate.is_absolute():\n            candidate = config_path.parent / candidate\n        return Path(os.path.abspath(candidate))\n\n    if config.get(\"schema_version\") != 1:\n        raise ValueError(\"workflow schema_version must be 1\")\n    if config.get(\"dry_run\", True) is not True:\n        raise ValueError(\"workflow requires dry_run=true; provider execution is disabled\")\n    source_policy = config.get(\"source_availability_policy\", \"allow_unavailable\")\n    if source_policy not in {\"allow_unavailable\", \"require_available\"}:\n        raise ValueError(\"source_availability_policy must be allow_unavailable or require_available\")\n    genres = sorted(config.get(\"genres\", []), key=lambda item: item[\"number\"])\n    if not genres:\n        raise ValueError(\"workflow needs at least one numbered genre\")\n\n    output = _SafeOutput(out_dir)\n    output.prepare((\"genres\", \"manifests\", \"resolve\"))\n\n    references: list[dict[str, Any]] = []\n    specs: list[dict[str, Any]] = []\n    manifests: dict[str, dict[str, Any]] = {\n        modality: {\n            \"schema_version\": 1,\n            \"modality\": modality,\n            \"dry_run\": True,\n            \"submit\": False,","sourceCodeStart":521,"sourceCodeEnd":557,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/skills/taste-application/scripts/tasteforge/workflow.py#L521-L557","documentation":"run_workflow enforces the deterministic offline contract: candidate execution is disabled on every OS because no verified containment backend exists, so the workflow config must set dry_run=true and any provider-execution request is refused.","triggerScenarios":"Config contains \"dry_run\": false, or a truthy non-true value like \"true\" (string) or 1, which fails the strict `is not True` check.","commonSituations":"Users flipping dry_run to false expecting provider calls to work; YAML/JSON writers emitting the string \"true\"; older configs predating the dry-run-only enforcement.","solutions":["Set \"dry_run\": true (boolean) in the workflow config","Remove the dry_run key entirely — true is the default","If provider execution is needed, use a build/version of the tool that enables it"],"exampleFix":"// before\n\"dry_run\": false\n// after\n\"dry_run\": true","handlingStrategy":"validation","validationCode":"if config.get(\"dry_run\", True) is not True:\n    raise SystemExit(\"dry_run must be boolean true in this build; provider execution is disabled\")","typeGuard":"def is_dry_run(config: dict) -> bool:\n    return config.get(\"dry_run\", True) is True","tryCatchPattern":"try:\n    run_workflow(config)\nexcept ValueError as e:\n    if \"dry_run\" in str(e):\n        config[\"dry_run\"] = True\n        run_workflow(config)\n    else:\n        raise","preventionTips":["Omit the dry_run key (defaults to true) rather than setting it manually","Never write the string \"true\" or the number 1 for dry_run — only boolean true passes","Confirm tool version capabilities before attempting provider execution"],"tags":["config","dry-run","validation"],"backgroundTag":"invalid-config-value","analyzedSha":"8321021c54d670126ce3b2969d5deb880b4b0c2a","analyzedAt":"2026-09-16T10:08:13.343Z","contentChangedAt":"2026-09-16T10:08:13.343Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}