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.
bendlocates one connected group of coaxial cylindrical skins in reopened STEP. Give the deliveredsubject;axis:{at,dir}andwindow:{axial:[from,to],radial:[inner,outer]}in the subject frame; a perpendicular unit radialstart; expected innerradius, radialthickness, and positiveanglefrom flat (at most 180 degrees). Axial stations are signed fromaxis.atalongaxis.dir; positive sweep follows the right-hand rule. The window selects the entire connected group; optionalspan:[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. Optionaltol:{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 eightbend/partitioncensus rows are admitted per build.sheet_thicknessneedssubjectand positivethickness; optional absolutetoldefaults 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 arenot_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 withsheet.- 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 sheetsheet_thickness,flat_patternand abendthat selects a bounded bend arenot_measuredwith reasonbounded_geometry_requires_bounded_fidelityuntil 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 showscertified_bound_mm. Leavefidelityout on exact sheets and onbendrows 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[]anduseit, useat_eachfor statements andeachfor array entries, and use the sealedstdlibrary (declare"std": "vxl-std-2") for screw holes, tool access and datums. Auseexpands 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,notesand every field that equals its default; use typed functions for repeated formulas,variants[]for named finite override sets, and define adefs[]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[];checknever blocks on it. - If you reuse a standard dimension, declare the source in
assumptions[]; a length param whose id starts withhead_,nut_,washer_,screw_,bolt_,thread_orinsert_and is not sourced isVXL-W960— take it from astd_table, record it, or rename it. - Run
vxl checkand readresult.ok,result.errors,result.warnings, andresult.notesuntil 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.