Validate scene
scene_validateValidate a revision against a profile; returns issues with codes, severities, and suggested candidate operations. Default: synchronous, from the stored scene summary. deep=true opens the scene in Blender for real mesh analysis (non-manifold, watertight, degenerate, overhangs) and returns a job handle (idempotencyKey required). General deep validation checks evaluated watertightness (open surfaces warn) and zero-area faces/zero-length edges (errors). additionalChecks can add interior_faces and uv_layers. The queued response states requested coverage; completed reports state actual object counts and skipped/partial checks, including pair-budget limits. intersectionMaxPairTriangleWork can raise cumulative pair work from 8 million to at most 64 million; time and memory caps stay fixed. Validation can be scoped with objectNamePattern/excludeNamePattern. intersectionMaxDepthSamples separately raises optional penetration sampling from 32,000 to at most 256,000 within the same time cap. Sampling completion is separate from candidate-pair coverage. resumeFrom with deep=true continues remaining depth samples on the source's exact revision/settings without repeating collision detection. Only the per-job depth sample budget may change; historical reports without checkpoints cannot resume. Repair suggestions can be alternatives: read suggestedOperationsMode and suggestedOperationsNote before applying them. job_get/job_wait return checked totals plus reportArtifactId. Use job_report with this jobId for complete summary totals and ordered issue/object/print-object pages or section=report for all JSON bytes. Inline details may be truncated; profile three_d_print carries a print report (dimensions mm, volume, filament estimate, bed fit). If a deep run does not give you what you need, mesh.analyze_quality is the SECOND route to the same class of measurement: it reports non_manifold, zero_area_faces, degenerate_edges, sharp_angles, stretched_uvs and interior_faces, and it runs INSIDE a scene_apply batch, so you can measure and repair in one job. A build whose deep validation returned nothing downloaded the GLB and wrote its own topology checker instead, because nothing said this existed.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| deep | No | ||
| profile | No | Default general; continuation inherits its source profile. | |
| projectId | Yes | Stable project ID returned by project_create or projects_list. | |
| resumeFrom | No | Completed source validation and immutable report; requires deep=true and a partial resumable depth checkpoint. | |
| revisionId | No | "HEAD" (default) uses the project's current head | |
| idempotencyKey | No | Stable caller-chosen key for safe retries of this same request. | |
| additionalChecks | No | Deep-only checks added to the profile: interior_faces tests faces whose every edge has more than two face users; uv_layers checks UV presence. Interior-face topology is not an exhaustive volumetric self-intersection test. | |
| objectNamePattern | No | Restrict validation to objects whose name matches, e.g. "Watch_*". Without this a studio backdrop is included in the print bounding box, reporting a 42 mm product as 1870 mm and making the three_d_print report unusable. | |
| excludeNamePattern | No | Drop objects whose name matches, e.g. "Studio_*". Applied after objectNamePattern. Use this when the parts you care about share no common prefix — which is the normal case for an assembly (Case_Body, Bezel_Ring, Dial_Plate, Crown…). Include-only filtering left no way to say "everything except the backdrop", so the backdrop's own open shell and its bounding box polluted every report and a field build hand-triaged 51 findings down to the 3 that were real. | |
| intersectionMaxDepthSamples | No | Deep-only optional penetration-depth sample budget, shared across detected pairs. Default 32,000; maximum 256,000. Sampling runs after surface-crossing detection and does not change candidate-pair coverage. The existing 20-second deadline and geometry caps still apply. Inspect depthSamplesComplete and each penetrationDepthStatus; a larger budget does not guarantee a depth witness or an exhaustive maximum. Scope objects with objectNamePattern/excludeNamePattern. When pair detection completed and the report contains a partial depth checkpoint, scene_validate.resumeFrom continues its remaining samples on the pinned revision. Otherwise a new scoped validation repeats the work. | |
| intersectionMaxPairTriangleWork | No | Deep-only cumulative intersection pair work: the sum of both objects' evaluated triangle counts for each checked pair. Default 8,000,000; maximum 64,000,000. A larger budget can complete more pairs using cached trees. The 20-second deadline, tree geometry and candidate storage limits remain fixed; optional depth samples have a separate intersectionMaxDepthSamples budget. The job's execution deadline still applies. Retry with a new idempotencyKey; this reruns the check rather than resuming it. Read actual coverage; raising this limit never guarantees a pass. |