Send the work. Handle the result.
Include the completed work, its requirements, and enough evidence to check it. TUC returns JSON your workflow can act on.
Try the handoff without a key
The public preview gate checks one sanitized text, code, or JSON file with fixed rules. It calls no external model, does not save the input or result, and exits 0 on pass, 1 on fail, or 2 when more evidence is required.
curl -fsSLO https://ultimate-critic.fly.dev/tuc-preview-gate.py python tuc-preview-gate.py generated.py --type code --task "Review this generated code safely."
Download tuc-preview-gate.py. The public limit is 10,000 characters and five runs per minute. Do not submit credentials, secrets, private source, or sensitive customer data.
Connect an AI agent
Connect a Streamable HTTP MCP client directly to https://ultimate-critic.fly.dev/mcp. Supply the tenant key as a secret X-API-Key header for paid evaluation and usage tools; omit it for the no-key preview.
The standalone stdio alternative reads the tenant key from TUC_API_KEY; the key is never a tool argument.
curl -fsSLO https://ultimate-critic.fly.dev/tuc-mcp-server.py
Download the MCP server or open the setup guide.
1. Build the request
| Field | Purpose |
|---|---|
artifact_type | Text, code, image, UI, game scene, JSON, or mixed. |
artifact | Generated content, files, evidence, and builder metadata. |
intent | Prompt, requirements, constraints, and success criteria. |
evaluation_profile | Domain-specific judgment such as code review, factuality, visual design, or game scene. |
rubric | Optional criteria supplied by the account owner. |
reference_materials | Facts or source material the artifact must respect. |
Quote the package before submission
Founding access includes 1,000 review credits. Standard packages use 1 credit, extended packages use 5, and full packages use 10. Call the quote endpoint with the same request body; it does not run an evaluation, store the artifact, or consume credits.
quote = critic.quote_review_credits(payload) print(quote["tier"], quote["credits"])
| Tier | Encoded package boundary | Credits |
|---|---|---|
| Standard | Up to 256 KiB, 8 files, no images | 1 |
| Extended | Up to 2 MiB, 16 files, 3 images | 5 |
| Full | Up to 8 MiB, 32 files, 8 images | 10 |
2. Python SDK
from sdks.python.ultimate_critic import UltimateCriticClient
critic = UltimateCriticClient(
base_url="https://YOUR_TUC_HOST/api",
api_key="YOUR_TENANT_KEY",
)
result = critic.evaluate({
"artifact_type": "code",
"artifact": {
"content": generated_code,
"metadata": {"builder_model": "your-builder-model"},
},
"intent": {
"prompt": "Implement a safe division helper.",
"requirements": ["Return a typed error for division by zero."],
"constraints": ["Do not swallow exceptions."],
},
"domain": "software",
"evaluation_profile": "code_review",
})
if result["overall"]["verdict"] != "pass":
repair_agent(result["findings"])
3. REST
curl https://YOUR_TUC_HOST/api/v1/evaluate \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_TENANT_KEY" \
-d '{
"artifact_type": "text",
"artifact": {
"content": "The generated artifact",
"metadata": {"builder_model": "your-builder-model"}
},
"intent": {
"prompt": "Write the requested artifact",
"requirements": ["State the conclusion clearly"]
},
"domain": "general",
"evaluation_profile": "general_quality"
}'
4. Run it asynchronously
job = critic.queue_evaluation(
payload,
idempotency_key=f"{build_id}:{artifact_sha256}",
)
while job["status"] in {"queued", "running"}:
job = critic.get_job(job["id"])
result = job["result"]
Reuse the idempotency key only when retrying the same request. A different payload with the same key returns an error.
5. Enforce the verdict
match result["overall"]["verdict"]:
case "pass":
release(result["evaluation_id"])
case "fail":
create_atomic_repairs(result["findings"])
case "insufficient_evidence":
request_more_evidence(result["metadata"]["evidence_issues"])
6. Check the repair
Create one repair for each finding. After the work changes, submit it again and attach the new evaluation to the repair. Verification requires a new passing result and any evidence requested by the finding.
ticket = critic.create_repair({
"source_evaluation_id": result["evaluation_id"],
"finding_id": result["findings"][0]["id"],
"invariant": "The artifact must satisfy the stated requirement.",
"observed_error": result["findings"][0]["title"],
"likely_root_cause": "Builder omitted a required edge case.",
"gap_kind": "COGNITION",
"transformation": "Implement the missing edge-case behavior.",
"verification_method": "Re-evaluate the repaired artifact.",
"retry_limit": 3,
})