affaan-m/ECC · critical · ContractError
request crosses the dry-run boundary
Error message
{modality} request crosses the dry-run boundary What it means
Every individual request inside a modality manifest must also obey the dry-run boundary: dry_run=true, submit=false, provider_calls int 0, provider_execution=false, and provider_call_mode='disabled'. A request violating any of these raises this ContractError.
Solutions
- Set provider_call_mode='disabled' plus dry_run=true, submit=false, provider_execution=false, provider_calls=0 on every request in the manifest.
- Audit each request object individually — the manifest may pass the boundary check while individual requests violate it.
- Regenerate requests from the dry-run template instead of copying from live-run configurations.
- Add a pre-commit or CI lint that rejects request objects with provider_call_mode != 'disabled'.
Example fix
// before
request = {"dry_run": true, "submit": false, "provider_calls": 0, "provider_execution": false, "provider_call_mode": "single"}
// after
request = {"dry_run": true, "submit": false, "provider_calls": 0, "provider_execution": false, "provider_call_mode": "disabled"} Defensive patterns
Strategy: validation
Validate before calling
def request_within_boundary(req):
return (req.get("dry_run") is True
and req.get("submit") is False
and type(req.get("provider_calls")) is int
and req.get("provider_calls") == 0
and req.get("provider_execution") is False
and req.get("provider_call_mode") == "disabled")
assert all(request_within_boundary(r) for m in manifests for r in m["requests"]) Type guard
def is_disabled_request(req: dict) -> bool:
return req.get("provider_call_mode") == "disabled" and req.get("dry_run") is True \
and req.get("submit") is False and req.get("provider_execution") is False \
and type(req.get("provider_calls")) is int and req.get("provider_calls") == 0 Try / catch
try:
validate_manifests(manifests_dir)
except ContractError as e:
if "request crosses the dry-run boundary" in str(e):
sanitize_requests(manifests_dir) # force provider_call_mode='disabled' etc.
validate_manifests(manifests_dir)
else:
raise Prevention
- Set provider_call_mode='disabled' explicitly on every request — the manifest-level check does not cover it.
- Build requests from a single dry-run factory function so boundary flags are never omitted.
- Lint request objects in CI for all five boundary conditions before bundling.
- Never copy request objects from live-execution examples.
When it happens
Trigger: A request entry with dry_run=false; submit=true; provider_calls=1; provider_calls missing (None fails type check); provider_execution=true; or provider_call_mode set to 'single'/'batch' instead of 'disabled'.
Common situations: Requests copied from a live-execution example; forgetting to set provider_call_mode='disabled' (it is only checked here, not on the manifest); leaving per-request overrides enabled from a prior real run; template requests carrying provider flags that the manifest-level check does not cover.
Understand the failure class
Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.
Related errors
- manifest crosses the dry-run boundary
- ECC_DRY_RUN must be "1" or "0" when set
- effect recipe crosses the dry-run provider boundary
- fal call failed after one attempt; job acceptance may be…
- genre crosses the dry-run boundary
AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16).
Data as JSON: /api/errors/145d7af4ac8e079b.
Report an issue: GitHub.
Appendix: source
Thrown at skills/taste-application/scripts/tasteforge/contract.py:304
if missing:
raise ContractError(f"missing modality manifests: {sorted(missing)}")
for modality in _REQUIRED_MODALITIES:
payload = json.loads((manifests_dir / f"{modality}.json").read_text(encoding="utf-8"))
if payload.get("modality") != modality or not payload.get("requests"):
raise ContractError(f"invalid or empty {modality} manifest")
if (payload.get("dry_run") is not True or payload.get("submit") is not False
or type(payload.get("provider_calls")) is not int
or payload.get("provider_calls") != 0
or payload.get("provider_execution") is not False):
raise ContractError(f"{modality} manifest crosses the dry-run boundary")
for request in payload["requests"]:
if (request.get("dry_run") is not True
or request.get("submit") is not False
or type(request.get("provider_calls")) is not int
or request.get("provider_calls") != 0
or request.get("provider_execution") is not False
or request.get("provider_call_mode") != "disabled"):
raise ContractError(f"{modality} request crosses the dry-run boundary")
def validate_artifact_receipt(out_dir: str | Path, receipt: dict[str, Any]) -> None:
"""Verify that the receipt binds every emitted artifact and its provenance."""
out_dir = Path(out_dir).resolve()
entries = receipt.get("evidence_artifacts")
if not isinstance(entries, list):
raise ContractError("receipt evidence_artifacts must be a list")
if not all(isinstance(entry, dict) for entry in entries):
raise ContractError("receipt evidence_artifacts entries must be objects")
known_sources: set[tuple[str, str]] = set()
source_durations: dict[tuple[str, str], float] = {}
for key in ("references", "evidence_files"):
sources = receipt.get(key, [])
if not isinstance(sources, list):
raise ContractError(f"receipt {key} must be a list")
for source in sources:
if not isinstance(source, dict):View on GitHub (pinned to 8321021c54)