VextCAD

Checking

Independent intent

Requirements describe the user’s needs independently of the model and its selectors. vxl check admits syntax and types; only a build obtains geometric evidence. For each delivered exact part, read its terminals[].structural_gate and measures together. The top-level structural_gate is one representative subject, not every part's result; each terminal gate names its own subject and GAR-bound step_digest. If exact-solid admission fails, inspect summary structural_gate and warnings; solid_count is not_measured with structural_gate_failed even when the raw count matches its nominal. If structural_gate.outcome is pass while root_exact and all_exact are false, read admission_rule, uncertainty_mm, and each status explanation. The bounded-tolerance rule admits only a certified curve-on-surface deviation at or below cap_mm; each edge status carries that certificate and comparison. A face unorientable_shape row names the edge context(s) from which that face status was derived. Per-status admitted_by appears only when the gate passed; a failed row keeps its diagnostic certificate without describing the context as admitted. These fields explain the existing admission result; they do not weaken or replace exact-solid admission. Session terminal mass properties use the same admitted copy as verification probes; a raw checker status alone does not imply that this copy is invalid. Refused admission remains unmeasured; standalone part mass-properties has a separate contract.

Requirements

Required fields for the conventions card

Each row also needs id and kind. subject names the delivered subject; operands names a pair. Alternatives shown with | are exclusive. See the generated reference for optional fields and detailed constraints.

Kind Required fields beyond id, kind
solid_count, closed_delivered_mesh subject
bend subject, axis:{at,dir}, window:{axial,radial}, start, radius, thickness, angle
sheet_thickness subject, thickness
envelope subject, exactly one of bounds, size, min, max
hole subject, diameter, axis, axis_at, exactly one of through or blind
slot subject, from, to, axis, width, exactly one of through or blind
planar_face subject, normal, at or through
fillet_radius subject, radius, between
chamfer_size subject, distance, between
outer_diameter subject, diameter, axis, axis_at, span:{from,to}
sharp_boundary subject, between, run
finishing_run subject, between, run, finish
draft_angle subject, wall, pull, neutral, angle
feature_distance operands, between, along, distance
variable_fillet_radius subject, between, run, stations
text subject, content, placement, mode, depth, region, measurement
volume_range subject, min, max
conical_surface subject, axis, axis_at, span, diameters
spherical_surface subject, center, diameter
toroidal_surface subject, center, axis, major_radius, minor_radius
revolved_profile subject, axis, origin, radial, profile
face_angle subject, between, angle
clearance operands, min
minimum_wall subject, min, disk:{on,center,radius,margin?}
gear_teeth subject, axis, window, module, teeth, pressure_angle, face_width
gear_mesh operands, gears, center_distance, backlash, stations, tol
thread subject, form, major_diameter, minor_diameter, pitch, length, ends, audit, plus feature or explicit locator
helix subject, radius, pitch, turns, section, plus feature or explicit locator
swept_section subject, path, profile; x for polygon
loft_sections subject, frame, sections
guide_rail subject, points
section_frame subject, frame, sections, law; angles for vertex_mean_twist
spline_surface subject, face, nominal
surface_probe subject, face, probes
thickened_wall subject, faces, mode, thickness; along for mode along
surface_seam subject, between, class
partition part, split, pieces, scope
section_contour subject, plane, at least one of loops, area, perimeter, profile
imprint_region subject, on, nonempty near
import_admission subject, import, as_read
repair_budget subject, import, allow, max_tolerance, max_growth, max_deviation
enclosed_cavity_count subject, count
unmeasured exactly one of subject or operands, plus describe

Requirement cookbook

Each exact feature requirement locates one feature. For delivered mesh kinds use the mesh card. A planar_face / std.datum_plane is a plane: several coplanar faces (feet, a patterned part, a face split by a groove) are measured as one. normal is outward from the material; on a pocket or groove face it points into the void (groove floor: +z). A build row opposite_normal_at_station means: reverse normal. There is no expect field for feature locator cardinality (VXL-R601); component_count and enclosed_cavity_count use count. Use near or requirement at_each to disambiguate. Defaults materialize at check time.

Feature to requirement table

Feature → statement → the requirement that catches it being wrong. "Catches" means a build with that mistake does not RELEASE. Every exact part also takes solid_count and closed_delivered_mesh; mesh topology uses component_count instead of solid_count.

Statement / feature Requirement that catches it Cannot be measured
box envelope (bounds), planar_face, volume_range; sharp_boundary for an unmodified straight crease —
cylinder outer_diameter (outward wall, axis and one maximal full-turn band), envelope, planar_face, volume_range roundness, unsupported trims
extrude envelope, a tilted planar_face (normal+through+near), volume_range curved sides
union solid_count (bodies that did not join), envelope/volume_range, fillet_radius/planar_face at the joint —
cut slot for a through/blind stadium profile, hole for a cylindrical tool; planar_face+near for a pocket floor or shoulder; minimum_wall; envelope/volume_range unsupported floor/profile forms
intersect envelope, volume_range, planar_face —
pattern envelope/volume_range (count and spacing as extent/material); one at_each requirement per instance that matters which instance is where; a requirement never counts
mirror envelope/volume_range; the feature's own requirement at its mirrored position —
hole, through hole with through:[a,b] (diameter, axis, position, both ends) —
interrupted bore beside a groove one hole with band:[from,to] per complete cylindrical-wall segment, at its exact trim stations a band across the groove; mouth/exit host stations; mouths or countersink with band
hole, blind hole with blind:{mouth:<len>,floor:<len>} a blind hole whose floor corner is chamfered
hole + counterbore two hole on one axis: bore through:[far face, shoulder], counterbore blind:{mouth:entry,floor:shoulder}; planar_face at the shoulder the counterbore diameter except through that second hole; a chamfered inner corner
hole + countersink one hole over the whole thickness (or blind) with countersink:{diameter,angle,at}; opposite-end mouths sharp expectation composes omission of mouths makes no style-absence claim; unknown blend chains stay not measured
hole + thread a required thread, an explicit locator, ends:"blind" or "through" and an audit range; a blind hole also takes a planar_face floor finite planes only; no whole-surface certificate; full-profile external ends and overhang are measured
thread (external/internal) required thread; author major/minor/pitch/length/winding/ends yourself the internal flank form; the whole surface between the finite planes
helix / coil / spring required helix; plain ends only physical spring load, stiffness, fatigue; intended use as helix, coil or spring
multi-target hole one hole/through per wall the drill crosses a range over two walls (a cardinality mismatch)
fillet or profile-drawn round fillet_radius for supported local geometry; finishing_run for the complete stated planar interval unsupported support pairs or incomplete tangent boundaries remain nonpass; volume alone cannot prove a round
chamfer chamfer_size for local size; finishing_run for complete convex perpendicular run; a mouth chamfer is the hole's countersink concave (VXL-R670) or non-perpendicular edges; a counterbore inner corner or blind floor corner makes the hole not_measured; a chamfer on a curved edge or a countersink has no measurable kind (VXL-V811)
place envelope with bounds; the feature's requirement where the move puts it size cannot see a move; a body symmetric under the rotation
shell minimum_wall (disk on an outer face), planar_face at outer ± thickness, volume_range, hole through:[outer, outer±wall] per wall; for a sealed exact cavity, enclosed_cavity_count with required: true and count: N cavity shape or void volume; opening the wrong face with the right count
split + partition partition on its checkpoints (count, side, exact cut areas, no overlap; full_v1 adds coverage and volume); each piece's own requirements an unstated cut law; a B-spline face portion by name (G401)
imprint + imprint_region imprint_region (locate, extent, area, boundary); planar_face still measures the support as one plane the imprint's material (it changes none); the old support face name where one face is needed (G408)
two parts clearance (min, or contacts for a designed contact) a flat B-spline contact (reported absent)

A counterbore crossing an exterior cone chamfer can measure on raw-exact geometry when its complete upper wall boundary is certified on the top plane and exterior cone, and its planar floor rim is complete. blind.mouth is the highest boundary station; evidence records the mouth station range. The current proof covers positive Z mouths with a parallel, off-axis cone. Interior pocket floors, B-spline hosts, unproven edges and additional wall trims refuse.

Measurement card

Measurement card: outer_diameter needs diameter, principal axis, axis_at and span:{from,to} equal to one maximal full-turn band of the observed outward cylinder wall (within boundary tolerance), not an arbitrary sub-interval of a band. A band is a connected station interval where the validated chart cells cover the whole turn exactly once; it ends at a full circular ring or at a retained boundary station where coverage becomes partial. A plain complete wall has one band equal to its full axial extent. With several bands, the authored span selects the matching band; if none matches, the row is a measured Fail and reports every observed band. A later Boolean may therefore leave a measurable intact band even when it notches another part of the same wall. The candidate's existing wall_incomplete classification is retained; nonempty bands make only the matching OD span measurable. Unsupported non-line trims remain wall_trim_unsupported for OD. Plain through-hole measurements also admit exact residual inward walls: circular/generator mouth recesses need an intact full-turn band and observed end arcs; curved interior interruptions need two complete terminal rings. The actual un-eroded cylinder volume must be clear. If this clearance check overlaps material, a residual wall alone does not prove a closure: the row is not_measured / native_proof_indeterminate, with observed stations and full-turn bands locating the uncertified region. A proved blind floor inside the authored window still fails. Explicit mouth-style expectations still need their complete opening proof. Through-hole candidate groups intersect their authored station window; the whole connected wall remains in the evidence. Coverage rejection and actual remaining faces stay visible even when the carrier and observed stations pass. For a grip at z=20 with length 56 ending at the guard's bottom face z=76, write the whole maximal band:

{"id":"r_grip_od","kind":"outer_diameter","subject":"dagger","diameter":24,
 "axis":"z","axis_at":[0,0,0],"span":{"from":20,"to":76}}

sharp_boundary and finishing_run need independent between:{first:{planar:{normal,at|through}},second:{planar:{normal,at|through}}} and run:{axis,from,to} with increasing endpoints; no names or nested near. A finishing run adds exactly one finish:{fillet:{radius,tol?}} or finish:{chamfer:{distance,tol?}}. Every relevant segment must qualify, and interior gaps fail; local size rows do not prove full coverage. A blind slot uses blind:{mouth,floor} instead of through; its complete planar stadium floor and empty observed prism are measured. Slot/OD boundary defaults to position; slot boundary is positive, below width/2 and half blind depth (R689). Equal blind mouth/floor stations first report R611 at blind; change one station to the intended open end or floor, since no positive tolerance can create depth. Position may be zero with explicit positive boundary. Complete exact-analytic through slots also measure under bounded-tolerance admission when U is certified: positions/stations expand by U and widths/diameters/lengths by 2U. A tolerance boundary crossed by that interval stays indeterminate, not measured. End-radius selection uses width/2 and half width tolerance plus U. A complete connected split bore is one measured group with every sorted member face; disconnected walls remain separate and unsupported trims cannot pass. Write mouths:[{at:<declared open station>}] for an explicit sharp opening; omit it only when no absence-of-modification claim is intended. Complete Sharp chains pass, proved modifications fail, and Unknown/incomplete chains stay not measured. See the tested mouth and split recipes. Sharp-mouth/split-bore corpus: 18 fixtures, six RELEASE and twelve designated-row HOLD in the recorded native measurements.

A sharp-run gap with proved detail.modified_intervals requires removing the chamfer, fillet or break-producing cut in parts[].steps to restore the raw crease over run.from..run.to. A finishing-run gap instead requires finishing the missing segment with the authored finish. Correct between or run only if they misstate the intended geometry. For ambiguous cylinder groups, narrow positive locate around axis_at only when axes differ; coaxial groups instead need the intended diameter and span or through/blind/band extent to distinguish them, or removal of unintended competing geometry. For per-probe resource limits, simplify topology in parts[].steps on subject; removing redundant requirements alone cannot repair that scan.

Full rules: VXL §7 (statements) and §10.1 (requirement kinds).

Requirement templates

Locate a requirement by geometry written from the document's params (normal with at/through), not by a construction face name: a requirement that names the faces its own step's selector used follows the same wrong build (VXL-W980).

Kind Template Cannot prove
solid_count {"kind":"solid_count","subject":"bracket"} anything about shape
envelope {"bounds":{"min":[0,0,0],"max":[30,40,40]},"tol":0.05} interior features
gear_teeth {"subject":"wheel","axis":{"at":[0,0,0],"dir":[0,0,1]},"window":{"axial":[-1,9],"radial":[10,30]},"module":2,"teeth":24,"pressure_angle":20,"face_width":8} complete raw-trim prism evidence is required; explicitly demand tol.base / tol.angle for separately bracketed base diameter / pressure angle; helical/bevel/worm/internal teeth, root fillets, tip relief; an ISO 1328 / AGMA grade
rack_teeth {"subject":"rack","at":[0,0,0],"pitch_dir":[1,0,0],"height_dir":[0,1,0],"window":{"pitch":[-80,80],"height":[-20,10],"width":[-1,11]},"module":2,"teeth":12,"pressure_angle":20,"face_width":10,"height":15} six planar-face probes measure count, pitch, tooth thickness, tip/root plane positions, back height, flank angle and face width; a probe without its full census cannot PASS; helical racks, root fillets, a rack-pinion mesh clause
hole {"diameter":4.5,"axis":"z","axis_at":[15,14,0],"through":[0,4],"tol":{"diameter":0.05,"position":0.05}}; blind "blind":{"mouth": 12, "floor": 7.6}; exact wall trims "band":[4,8] (exclusive with through/blind and mouth/countersink expectations); countersink "countersink":{"diameter":6.8,"angle":90,"at":40} thread geometry needs a separate thread requirement, including for full-profile external threads; which cylinder when two coaxial ones are equally close
slot {"from":[8,10,0],"to":[22,10,0],"width":6,"through":[0,5], "axis": "z"} a non-obround slot
planar_face {"normal":"-z","at":0,"near":{"x":[0,30],"y":[0,40]},"flatness":0.01,"tol":{"offset":0.05}}; tilted: normal:[0,0.866,-0.5] + through sharp boundaries, face angles
fillet_radius {"radius":1,"between":[{"planar":{"normal":"+z","at":"plate"}},{"planar":{"normal":"+y","at":"arm"}}]} unsupported support pairs or incomplete trims; a nested near inside between (VXL-R671) or two named supports whose bounds do not meet (VXL-R672); see the support/trim profiles
chamfer_size {"distance":0.5,"between":[{"planar":{"normal":"+z","at":"height"}},{"planar":{"normal":"+x","at":"width"}}],"tol":0.05} non-perpendicular supports; a concave edge. It checks three things: both setbacks equal distance, both faces of between are where you say, and the chamfer is 45 degrees. Write between as the two faces the chamfer step's edge lies between, with their real stations; if the stock dimension is a parameter, write the station with the same parameter (e.g. {"normal": "+z", "at": "height"}), not a number
thread {"form":"internal","major_diameter":4,"minor_diameter":"std_thread_pilot_diameter(4mm, 0.7mm)","pitch":0.7,"length":6,"ends":"blind","audit":[1,5],"tol":{"diameter":0.05,"profile":0.05}} with an explicit axis/at locator or a feature datum the internal flank form; the whole surface between the finite planes
helix {"radius":7,"pitch":3.2,"turns":3.25,"section":{"circle":{"diameter":1.4}},"ends":"plain","end_coils":0} and a locator physical load/stiffness/fatigue; intended use as helix, coil or spring
volume_range {"min":"0.999 * a * a * a","max":"1.001 * a * a * a"} (nominal as a formula; never min=max) where material is
closed_delivered_mesh {"artifact":"stl"}; on a cavity-bearing exact subject also require {"kind":"enclosed_cavity_count","subject":"part","count":N} Core 3MF (not decoded); cavity count by itself
component_count {"subject":"part","count":2}; this is the literal surface-component topology count, so one outer plus one inner shell is 2 material occupancy, closure, containment or orientation
enclosed_cavity_count {"subject":"part","count":1,"required":true}; exact and mesh delivered subjects void shape, void volume, drainage or accessibility
clearance {"operands":["bracket","tool_base"],"min":0.5} (min > 0); designed contact "contacts":[{"planar":{"normal":"+z","at":12}}] a flat B-spline contact (reported absent)
minimum_wall {"min":3,"tol":0.02,"disk":{"on":{"planar":{"normal":"+x","at":30}},"center":[30,12,12],"radius":1.5,"margin":0.5}} the thinnest point of a whole feature; exact nominal thickness
unmeasured {"describe":"all exposed faces are surface grind Ra 1.6"} declared_unmeasured; detail.describe and the explanation retain the authored text and name kind/required choices; use a supported measurable claim or required:false for an intentionally optional disclosure (the latter does not measure the claim)

minimum_wall.min is a lower threshold; the decision depth is min - tol with 0 <= tol < min. disk.margin must be positive and is additional clearance from the disk perimeter to every boundary of its selected face, not a thickness tolerance.

A near window includes its bounds and tests the candidate entity's centroid. It selects the whole entity and never clips it. It does not change measurement tolerances.

hole.axis accepts a principal direction token or a nonzero 3-vector. Stations are signed distances dot(point, normalized_authored_axis) from the part origin along the axis as written. The verifier canonicalizes the axis (first normalized component above the 1e-12 direction tolerance positive) and negates through, band, blind.mouth/blind.floor, mouths[].at and countersink.at stations when it flips, preserving the authored mouth/exit order. Zero, degenerate or non-finite vectors are VXL-G301. Hole operations retain oriented drill directions. For axis:[1,0,1], stations are (x+z)/sqrt(2): include the bore's translation in through/blind/band, and give any point on its line as axis_at; its axial component is ignored. Diameter, position and boundary tolerances apply as for principal axes; the complete cylindrical-wall proof is still required. Direction is a strict locator predicate, so a 2° wrong axis can report not_measured/no_cylinder_in_window, while a uniquely located, proven bore with wrong diameter, position or nearby stations reports its actual values and fails. Through-hole and band discovery requires overlap with the authored station interval; a wholly disjoint interval can also report no_cylinder_in_window.

hole.blind names its open end and floor as {"mouth":<len>,"floor":<len>}. A slot names 3D end-centre points with from and to, a width, an axis, and exactly one through:[from,to] or blind:{mouth,floor}. Endpoint components along axis are ignored. The retired positional hole extent is an error (VXL-R674).

Reserved gap kind (reported unsupported, HOLD when required): global_wall. opening has a closed mesh-only payload (mesh card); it is refused on an exact subject. Kinds that used to be reserved are now measurable: thread, helix, gear_teeth, gear_mesh, slot, counterbore, blind_hole, fillet_radius_general, contact_clearance, chamfer_size, feature_distance and text. The spellings counterbored_hole, countersunk_hole, fillet, contact and chamfer are refused as removed aliases (for countersunk_hole write kind: "hole" with a countersink style; countersink.at is allowed only on a through hole). thread, helix and material_region are measurable kinds, not reserved. For material_region, author a cylinder {origin,axis,radius,length} or a right-handed box {origin,x,y,z,size}, expected state:"material" or "void", and positive boundary_clearance. Complete planar/cylindrical boundary exclusion and an actual interior classifier are required; unsupported carriers, incomplete proof and exhausted fixed proof budgets keep required rows at HOLD. A wrong interior state after complete exclusion or a certified boundary witness FAILs. Any other kind is VXL-R602.

Sheet requirements

Use the complete two-bend bracket for both requirement shapes. State the intended final geometry independently of construction names. Neither requirement measures the authored K factor.

  • bend locates one connected group of coaxial cylindrical skins in reopened STEP. Give the delivered subject; axis:{at,dir} and window:{axial:[from,to],radial:[inner,outer]} in the subject frame; a perpendicular unit radial start; expected inner radius, radial thickness, and positive angle from flat (at most 180 degrees). Axial stations are signed from axis.at along axis.dir; positive sweep follows the right-hand rule. The window selects the entire connected group; optional span:[from,to] restricts the measured axial band. Radius and angle do not select candidates. Zero or multiple groups are non-passes. Complete coverage and tangent planar joins are required; proven gaps or duplicate coverage fail. Unsupported trims, incomplete census or exhausted budget remain non-passes. Optional tol:{radius,thickness,angle} defaults to 0.05 mm, 0.05 mm and 0.1 degree; length tolerances must be positive and at most 1 mm, angle tolerance positive and at most 5 degrees. At most eight bend/partition census rows are admitted per build.
  • sheet_thickness needs subject and positive thickness; optional absolute tol defaults to 0.05 mm and must be nonnegative and strictly less than thickness. It checks whole-subject modeled gauge in the reopened STEP: paired planes, coaxial cylinders, cones (parallel generatrices at normal distance t; same-station radius difference t/cos(beta)), concentric spheres (radius difference t), and ring tori (same centre circle, minor-radius difference t), matching whole 3D trimmed boundaries and ruled side closures. Wedges, extra bosses, mismatched trims and unpaired finishing faces fail. Unsupported surface laws, unsupported boundary laws or incomplete acquisition are not_measured; differently segmented partner boundaries remain non-pass. It does not assert a global minimum distance between arbitrary points, and works independently of construction names or whether the part was made with sheet.
  • Fidelity: a sheet whose outline crosses a strip obliquely or with a line/arc chain is built in the certified bounded profile (check summary sheet_shells[].fidelity = certified_bounded). On such a sheet sheet_thickness, flat_pattern and a bend that selects a bounded bend are not_measured with reason bounded_geometry_requires_bounded_fidelity until you add "fidelity":{"bounded":{"max_deviation":1e-6}} (a positive length of at most 1e-3 mm; the certified target is 1e-8 mm). They then pass only when every certified fold bound is at most that allowance and every exact clause holds; the report shows certified_bound_mm. Leave fidelity out on exact sheets and on bend rows for exact bends (hem, jog, corner, bead bends beside a bounded tab stay exact rows).

Keep-out recipes

A keep-out is a part with role:"keep_out". It is verified, never delivered; acceptance is forbidden. Author it in the same frame as the request, then write a clearance requirement against the deliverable.

Recipe Shape Rule
Tool access cylinder at the screw axis, axis into the part start the tool off the entry face; clearance.min > 0
Fastener head cylinder or box around the head axis cover the head diameter plus a small ring
Fit gauge the mating profile as an extrude stand it off the seat; a designed contact is clearance with contacts, never min: 0
Cable path a box/cylinder sleeve keep clearance.min off every nearby face

Stand-off rule. Touching counts as a collision. Start every keep-out more than clearance.min away from the seat face, or, when the two are meant to touch there, declare that plane in the clearance's contacts and keep min positive. VXL-W930 fires for any clearance whose operands meet on an undeclared plane, or whose declared contact the predicted boxes do not meet (static, predicted boxes only; silence is not measured proof).

Evidence grades

Exact

Exact evidence proves only the measured claim on its named subject. A static check is not a measurement.

ConservativeBound

Under mesh_conservative_v1, Exact PASS or a safe-side ConservativeBound may pass. Keep each measurement’s admission and locator limits from the mesh card.

Estimate and diagnostic-only

An Estimate never satisfies a required check. Compact replies, entity filters and diagnostic previews never decide RELEASE. Required Unknown, incomplete admission and exhausted budgets hold.

HOLD and repair

Read report/summary.json and report/revision-packet.json; fix one typed problem and rebuild within the gated loop budgets. Unresolved problems mean HOLD. Use vextcad vxl explain FILE --target ID for source expression dependencies; repair X101 using its bounded candidates (compact replies show the first candidates), and use Q501 did_you_mean only as spelling help.

For tilted hole hosts, rounded decimal coordinates can tilt a face beyond the frozen 1e-12 direction-component tolerance and cause host_adjacency_invalid or a mouth/floor host refusal. Use exact VXL expressions such as "20mm * sin(5deg)" and "20mm * cos(5deg)", or construct the face by a rotation. Increasing requirement tolerances does not relax this host-normal check.

Traps

Each line is a trap with the code it raises. vextcad vxl explain CODE prints the full rule.

Trap Code
A thread hole needs a numeric depth, is cut after every other feature of its binding (shell, fillet, chamfer, Boolean), and verifies only through a required thread requirement VXL-C415, VXL-C418, VXL-W977
A thread pitch must be ≤ half the diameter and 1–64 turns; a thread costs about 1,300 triangles per turn VXL-C416, VXL-W973
A counterbore or countersink must fit the material behind its entry face (the wall of a shelled part), else VXL-C440 at the style or VXL-X109 at build; a blind hole deeper than the wall is a port and has no floor VXL-C440, VXL-X109, VXL-Q513
A through range is per wall: one drill through two walls takes one requirement per wall [outer, outer±wall]; a range over both is a mismatch build not_measured: locator_cardinality_mismatch
volume_range needs a real range (never min = max): a correct 10 mm cube measures 999.9999999999998 mm³ build HOLD
A requirement that names the faces its own step's selector used is not independent VXL-W980
Without countersink or an explicit mouths sharp expectation, no absence-of-cone claim is made; a complete sharp expectation fails on a proved cone/shoulder VXL-R683 rejects a same-end countersink/sharp conflict
Unsupported floor/inner-corner forms cannot pass a hole proof; a mouth chamfer is an observed cone, while unsupported fillet/blend chains remain Unknown/not measured —
A chamfer with no chamfer_size requirement is warned; a counterbore mouth chamfer is re-read as a countersink of the counterbore VXL-W920
A chamfer on a curved edge (a rounded-corner arc, a boss rim, a hole floor or shoulder, a countersink) has no measurable kind VXL-V811
A delivered thread or helix without a required typed feature requirement is warned; full-profile external threads are measured with uncut ends and recorded overhang VXL-W977
clearance contacts are 1–4 distinct planes with min > 0, written with at (an axis coordinate for a principal normal, the signed offset along the normalized normal for an oblique one); each needs positive shared planar area or a certified cylinder/plane line contact; a zero normal is refused VXL-R665, VXL-G301, VXL-R620
chamfer_size is convex and perpendicular only VXL-R670, VXL-R664
A second shell on the same body, or on a body composed with it, is refused VXL-C436
Faces opened by a shell change only its target: a name another live binding still carries is refused, and proven removals are reserved VXL-N122, VXL-Q513
A shell's open takes 1–8 distinct face selectors (no edge, no hole rim); thickness is (0, 20] mm VXL-Q511, VXL-Q512, VXL-Q514, VXL-C411
The kernel cannot build every shell: the build fails and installs nothing VXL-X106
A second coaxial hole can enlarge an existing bore from its entry annulus; its diameter must exceed the existing bore, and its anchor must lie on the entry plane VXL-X104, VXL-C410
One style per hole; its diameter must exceed the hole and its depth fit the extent VXL-C412, VXL-C413, VXL-C417
A fillet or chamfer at the countersink neck (cone meets bore) is refused VXL-C419
fillet_radius supports are two planes 10–170° apart, or an admitted plane/cylinder pair whose axis is parallel or perpendicular to the plane; other pairs refuse VXL-R661
A countersink expectation's at is the mouth station; at on a blind hole, or a tolerance alone, is refused VXL-R666, VXL-R667, VXL-R668
A slot needs distinct from/to end centres, positive width, and exactly one nonempty through or directed blind VXL-R662, VXL-R611, VXL-S011
Feature locators: one entity per requirement, no expect field; component_count and enclosed_cavity_count use count VXL-R601, VXL-R602
A place or shell that cannot move or remove a contained name safely (another live binding shares it) VXL-N122
A hole enters square to its face; a tilted, sideways or outward axis is refused, never snapped VXL-C441 (first hole of a box or cylinder), VXL-X111 (build)
fillet_radius is not_measured: unsupported_representation with explanation "end arc sweep differs from the expected sweep by … rad": the rounded face does not run the full angle between the two faces in between — another feature cut it, or between names a face the fillet does not end on. Check between (and near); a residual of a whole fraction of a turn (0.785 = 45°) means a different pair of faces —
Hole/OD boundary must be positive; slot boundary must be positive, below half width and half blind depth; default errors point at originating position VXL-R611 (hole/OD), VXL-R689 (slot)
between: a nested near inside a planar query (VXL-R671); two named supports whose construction bounds do not meet (VXL-R672) VXL-R671, VXL-R672
An outward cylinder (boss/standoff) is retained as an exclusion from inward hole matches; use OD for one whole maximal full-turn band outer_diameter
A blind hole deeper than its wall is a port: it builds and has no floor VXL-Q513, VXL-X101
A multi-target hole needs targets 2–8 distinct bindings, each with a planar entry face at at VXL-C432–VXL-C435
toward not perpendicular to the plane; a quaternion rotation VXL-G310/VXL-G311, VXL-G320
A Boolean target = tool; at and center together; a disjoint tool; a cut that splits the part VXL-C401, VXL-W970/VXL-W971, solid_count
A fragment, use or std problem; a name containing __; a reference to a repeated use VXL-F1xx, VXL-N104, VXL-N101
A selector without expect; the wrong edge count at build VXL-Q502, VXL-X101
A split needs both sides of its cutter; a missing side, a repeated side, or bind together with count is refused VXL-C512
A split or imprint on a body carrying a modelled thread, coil or gear is refused in this version VXL-C516
A partition needs scope, 2–8 pieces and a real split step; a section statement is refused (write section_contour) VXL-R742, VXL-R740, VXL-C519
After an imprint the old support face is two faces; select <region> or <region>.outside, and never fillet/chamfer the flat imprinted boundary VXL-G408
A keep-out flush with its seat; an occurrence that touches nothing; a need with no covers or unmodeled VXL-W930, VXL-W940, VXL-W950

Final-file checks

Output contract

  • Exactly one authored source file: <name>.vxl.json, schema: "vextcad.vxl.v1", units mm and degrees. Native delivery files (such as STEP, STL or 3MF) are separate outputs produced by a build.
  • Prefer composition: define a reusable shape in defs[] and use it, use at_each for statements and each for array entries, and use the sealed std library (declare "std": "vxl-std-2") for screw holes, tool access and datums. A use expands in place at check/build time; the expanded form is what runs, and no private __ id is ever writable.
  • Write the compact form: omit title, notes and every field that equals its default; use typed functions for repeated formulas, variants[] for named finite override sets, and define a defs[] fragment when the same group of statements would otherwise appear three or more times.
  • A missing fact is blocking when different answers give geometrically different parts or it is an interface dimension of something the user owns. Ask via questions[]; check never blocks on it.
  • If you reuse a standard dimension, declare the source in assumptions[]; a length param whose id starts with head_, nut_, washer_, screw_, bolt_, thread_ or insert_ and is not sourced is VXL-W960 — take it from a std_ table, record it, or rename it.
  • Run vxl check and read result.ok, result.errors, result.warnings, and result.notes until clean before uploading. Never present a document you have not checked.

Executable facts

The stdlib test instructions cover check versus measure, a missed hole, selector cardinality, Estimate/HOLD and compact HOLD. The 20-document manifest uses existing handwritten examples; check success makes no new build verdict claim.

Delivery decision

Every required need must have acceptable measured evidence. Read the actual label and cell; macOS arm64 development builds remain HOLD. Deliver HOLD files with that label and unresolved questions visible; only an obtained RELEASE may be called RELEASE.

Conventions card

Paste-ready prompt card: CONVENTIONS.md. std library: STD.md; the reference states each rule once.

Examples

  • req_chamfer_size
  • req_fillet_general
  • req_sharp_boundary

Print deliveries automatically receive required assembly and AMS slot checks based on the authored composed parts and configured presets. A scene export directly targeting a scene import automatically receives a required byte-exact check; edited exports do not. These checks appear in the verification report and missing observations are nonpass. Do not author print_assembly, ams_slots, or scene_export_exact requirements. scene_reopen_equal remains an authored comparison of selected operands and fields.

For flat_pattern, deliver distinct formed and flat subjects from one part; the flat binding needs the capability retained by unfold. State a world anchor on the fixed planar skin, an independent default k_factor in [0,1], required scope:"full" or scope:"developable_regions", and optional tol (0.001 mm by default, at least 1e-9 mm). Each optional bends override uses an independent axis + window locator and K, and must find exactly one measured bend. Read the brep_flat_pattern_partition clauses: both reopened STEP censuses, whole gauge, fold tree, signed line/circle boundary equality and bend-table bijection must pass. Output-byte readback alone does not prove development. R870–R879 explain static refusals. Forms require developable_regions and independent world masks[].form locators for every complete form (dimple centre/normal/radius window or capsule end centres/normal/ half-width window). Masks retain the whole gauge proof, cover both skins, and must match measured forms and flat footprints one-to-one; missing/extra/wrong masks FAIL. Coverage is partial, FORM contains closed tangent boundaries, and the flat body is a nominal layout. full with forms stays non-PASS. See flat-pattern masks.