Examples
vextor-vxl example corpus
Eight corpus entries. They are public teaching material for the vextor-vxl skill: real requests,
the VXL that answers them, and the concepts each one carries. Entries 1, 2 and 4 are full documents
in this directory; entries 3, 5 and 6 are outlines (the request, the shape of the answer, and what
is being tested); entry 7 is a negative, questions-only task; entry 8 is a complete provisional
model with an open geometry question.
| # | Entry | Request (natural language) | Concepts taught | File |
|---|---|---|---|---|
| 1 | cube |
"A 10 mm cube with z=0 as its base; one closed printable solid." | smallest valid document; box min-corner frame; envelope, solid_count, volume_range, closed_delivered_mesh; params with a reopen domain; covers |
cube.vxl.json (full) |
| 2 | orthogonal_holes_asymmetric |
"A 10 mm cube with a diameter-3 through hole along x, y and z, each off-centre." | hole anchor on the entry face and axis as that face's inward normal; through extent; three distinct axis_at points; sign checks; one requirement per entity |
orthogonal_holes_asymmetric.vxl.json (full) |
| 3 | repeated pocket plate (outline) | "An 80 x 60 x 8 mm plate with a 12 x 8 x 3 mm pocket at each of six positions given in a table." | a defs[] step fragment (pocket) with params/lets/checks, used once per table row; a repeated use whose at_each clause is {var, in_table}; each argument becomes a typed generated let; covers on the use; private __ ids are never written |
outline only |
| 4 | ex06_gusset_bracket |
"A 30 x 40 x 40 desk-sensor bracket with two 3 mm ribs, a D4.5 base hole, an 8 x 4.5 slot and two wall holes; R2 root fillets, R1 on base.+z/base.+y and wall.+z/wall.+y, flat datums." | the compact form: non-XY sketch (plane: yz + at + toward); labelled extrusion segments; class and any_of edge selectors; keep-outs and clearance; std.mount_hole/tool_access/datum_plane; std_iso_273; a repeated use with at_each; an explicit optional unmeasured datum-sharpness scope (reported NOT_MEASURED with declared_unmeasured and the authored description, ceiling still RELEASE) |
ex06_gusset_bracket.vxl.json (full, 8,806 bytes minified) |
| 5 | box and lid (outline) | "A 40 x 30 x 20 mm open-top box with a lid that sits on the rim, no fasteners." | two deliverables; an assembly with two occurrences and a pose; clearance between parts that must not touch; a designed contact is clearance with contacts, never clearance: 0; overlaps repository Example 07 |
outline only |
| 6 | dovetail seat (outline) | "A block with a dovetail groove and a matching slide; keep 0.2 mm on the flanks; measure the 60-degree flank." | tilted planar_face requirements (normal + through); labelled tool faces named by selectors; clearance as a fit gap; face_angle measures adjacent outward planar normals |
outline only |
| 7 | underspecified-request (negative) |
"A bracket for the sensor panel, usual size, a couple of ribs, mounting holes clear, must print." | ask explicitly about undetermined geometry; an assumption alone does not resolve it; metadata never blocks the compiler; an empty parts array is invalid, so ask in chat |
underspecified-request.md |
| 8 | provisional_open_question |
"A 52 × 32 × 9 mm lab insert with two 3 × 3 mm channels through x at y = 9 and 23, on the service face." | ask top or bottom explicitly; useful top-open preview retains questions[] and provisional assumptions[]; a build label does not confirm the service face |
document, walkthrough |
Composition examples
These checked files are complete documents, one statement per line, and each passes
vextor vxl check with no errors. The first six are the reference excerpts in docs/VXL.md §3.2,
§3.4 and §3.5, and in ../STD.md; the rest are later vocabulary. A test
checks every examples/*.vxl.json with the compiler, so the excerpts cannot rot.
| File | Teaches |
|---|---|
at_each_grid.vxl.json |
two range clauses; the variables are used in the coordinates; the eight anchors are stated in §3.2 |
at_each_table.vxl.json |
one in_table clause over a document table, read with lookup |
fragment_step.vxl.json |
a defs[] step fragment: params, lets, checks, a private tool binding, $target, a repeated use |
fragment_part.vxl.json |
a defs[] part fragment with role/keep-out and a clearance requirement |
fragment_requirement.vxl.json |
a defs[] requirement fragment with a dir param and notes |
std_plate.vxl.json |
std.mount_hole, std.tool_access, std.datum_plane and std_iso_273 on one plate |
multi_target_hole.vxl.json |
one hole with targets (2–8) drilling two stacked plates on one axis; a union joins them; the requirement verifies the drill |
place_asymmetric.vxl.json |
three place re-poses (x, y and z rotations) on boxes that are not symmetric; each move caught by envelope |
place_named_body.vxl.json |
place moving a body after a hole and before a fillet; the contained names survive the move, and the fillet step selects its edge by them; the requirements state where the hole and the rounded edge are after the move, by position (fillet_radius between two planar queries), so no requirement repeats a name its step used |
place_tool_boolean.vxl.json |
place moving a Boolean tool (a drill cylinder) before the cut, without tool_place |
hole_styles.vxl.json |
counterbore and countersink entry faces; two requirements for a counterbore with the shoulder dividing through and blind; a countersink's diameter, angle and end station |
place.vxl.json |
a +90° turn about the origin followed by translation; final-position envelope and hole requirements catch a wrong rotation sign |
tray_with_cable_hole.vxl.json |
a top-open shell; inner faces located by position; a hole starting on the inner face crosses one wall, with a minimum_wall disk opposite it |
slot_and_chamfer.vxl.json |
a slot's world-axis direction and through range; chamfer_size locates both support faces by planar queries |
lid_on_rim.vxl.json |
a lid posed onto an open box rim; clearance with a contact plane in the assembly frame and a minimum gap everywhere else |
analytic_locator_fixture.vxl.json |
verified cone/sphere/torus stock and fixed-Z revolved bushing; direct posed wedge with outward face angle; all five independent envelopes, single solids and closed meshes; M outer diameter + annular-support bore |
spur_gear_pair.vxl.json |
two bored external spur gears from std.spur_gear_bored in one assembly; the recipe's gear_teeth and hole requirements; a clearance between the gear occurrences; gear_teeth now measures certified tooth bands; whole-part clearance must be measured by the Linux backend |
split_and_imprint.vxl.json |
a two-piece enclosure: a hollow box split at z = 20 into a base with a registration lip and a lid with its matching groove (a deliver object, partition on the checkpoints); two section_contour rows (through the base and through the lip), a planar_face on the lid's cut skin, an imprint_region label and a clearance contact |
skill_import_and_edit.vxl.json |
an import naming a committed STEP block by its Source descriptor, then one move_outward direct edit; import_admission, face_displacement, envelope, volume_range and solid_count follow the moved face |
array_each.vxl.json |
statement at_each, array-item each, templated binding references and one n-ary Boolean with tools[] |
function_formula.vxl.json |
typed user functions, a local let, an acyclic function call and the vxl-std-2 std_ramp |
when_variants.vxl.json |
a finite-domain when gate on a tool and its consumer, plus two named variants[] override sets |
fragment_reads.vxl.json |
explicit document reads, point/profile/bindings params, and a points list iterated inside the fragment |
Mesh statement examples
The mesh collection contains 12 complete documents checked with zero errors and warnings through the VXL check API, including a bound STL asset and one hybrid source checkpoint example. The operation examples each require delivered closure; they are syntax examples, not qualified build or dimensional acceptance evidence.
Cages, deformation and relief examples
The surface collection adds three complete checked documents: deformation
(bend/twist/taper/lattice), normalized-expression relief with all three mappings, and a cage/PNG
chain with refinement, protection and flat_region. Its authored cage and grayscale PNG are
included with Source-bound descriptors. These are syntax/authoring examples; no measured build
or RELEASE claim follows from a clean check.
Concept coverage
| Concept | Entries |
|---|---|
Frame and at/toward placement |
1, 4 |
| Non-XY plane and world profile coordinates | 4 |
Loop forms (rect, path, slot, circle) |
1, 2 (implicit), 4 |
Booleans, bind default, aliases |
4 |
| Holes and through extents | 2, 4 |
Statement and array generators (at_each, each), templated names and tools[] |
3, 4, array_each.vxl.json |
| Typed functions and local lets | function_formula.vxl.json |
Finite-domain when and named variants[] |
when_variants.vxl.json |
Fragment reads, points, profile and bindings params |
fragment_reads.vxl.json |
Fragments (defs/use), fragment lets/checks |
3 |
The std library |
4 |
Edge selectors (edge, class, between, any_of) |
4 |
| Face selectors (planar, cylindrical, conical, spherical, toroidal, named) | 4, 6, analytic fixture |
| Keep-outs and clearance | 4, 5, 6 |
| Assemblies and occurrences | 5 |
| Analytic solids/revolve and five corresponding feature requirements | analytic fixture |
| Requirement kinds | 1, 2, 4, analytic fixture |
Multi-target hole (targets 2–8) |
part-2 |
place rigid re-pose (body and tool) |
part-2 |
Reserved gap kinds and unmeasured |
4, 6 |
Coverage (needs, covers, unmodeled) |
1, 2, 4 |
| Ask about unresolved geometry; provisional questions and assumptions | 3, 7, 8 |
How to use an entry
- Read the request in the table (or the
needs[]of the document). - Predict the frame and the missing facts before opening the file.
- Run
vextor vxl check <file>and read each phase; add--expandedto see the expanded form. - Compare your prediction with the document, then with the concepts list.
- Entry 4 is the compact form and the repository's verbose Example 06 is its twin: the composition
must not change the geometry or the verdict, only the way the document is written. Appendix A of
docs/VXL.mdis entry 4; the verbose twin is the fixturecrates/vextor-vxl/tests/fixtures/ex06_gusset_bracket/part.vxl.json.
Before opening entry 4, read the Rules that bite list in ../SKILL.md and the std card in
../STD.md: they name the traps this corpus example already avoids (repeated-use identity, reserved
iteration variables, quoted enum values, typed arguments, std locator preconditions).
Never copy a private task. These files are for learning the language.
Measurement examples
These published JSON recipes check with no errors or warnings. Copy and derivation checks live in
crates/vextor-vxl/tests/docs_examples.rs; the native published-measurement tests build these
exact bytes and authenticate the installed files.
| Example | Tested source / contract | Stated label |
|---|---|---|
| outer_diameter | cylinder statement copied unchanged from place_tool_boolean; delivered alone, with independent diameter/axis/span needs and a new OD row; native wrong size/position/span controls hold only by r_od |
RELEASE |
| req_slot_blind | exact fixture copy; complete floor, independent boundary, zero position tolerance | RELEASE |
| req_sharp_boundary | exact fixture copy; convex/concave finite creases | RELEASE |
| req_fillet_run | exact fixture copy; full run after two source finishing operations | RELEASE |
| req_chamfer_run | exact fixture copy; complete symmetric setback run | RELEASE |
| req_fillet_general | exact independent fixture copy; local size, asymmetric supports and mitre controls | RELEASE |
| req_chamfer_size | exact independent fixture copy; local setbacks on three axes | RELEASE |
| finishing_mirrored_placed | exact fixture copy; reflected and rigidly placed finishing measured in delivered coordinates | RELEASE |
| skill_finishing_labelled_plate | composed finishing and text recipe: keep-out reference, +2 mm +z stock, a +3° +y wall draft about z6, an untouched front/top variable fillet run and a planar raised VXL B8 legend, each with its own requirement; compiles with no errors or warnings and its verdict ceiling is RELEASE, native measurement recorded in the finishing evidence index |
RELEASE |
A same-count construction selection can still be wrong: these requirements state geometry
independently. Equal finished lengths cannot fill an interior gap. The run recipes may deliver
a unified member after Boolean simplification; they do not prove native face-partition retention.
Sharp hole mouths and complete split bores are measured by the fixture recipes below.
Unsupported blended chains stay Unknown/not measured; omission of mouths makes no style-absence claim.
Open questions[] cap the build at HOLD; the provisional example's geometry may pass while its
question remains open. Answer by removing the question and recording the user's answer.
Measured hole mouth and split recipes
These links open the exact tested corpus documents, rather than additional copied JSON examples. The 18 sharp-mouth/split-bore fixtures ran as six RELEASE positives and twelve HOLD twins, each caught only by its designated requirement in the recorded native measurements.
| Tested positive recipes | Native contract | Stated label |
|---|---|---|
| req_outer_diameter, outer_three_axes | complete outward wall, independent axis/span/diameter | RELEASE |
| req_hole_sharp_mouth, mouth_three_axes | complete explicit sharp openings, opposite-end cone composition, directed blind openings | RELEASE |
| req_split_bore, split_bore_three_axes | connected multi-face periodic walls; all member faces in the selected group | RELEASE |
The evidence index lists fixtures, wrong twins, the exact requirements catching them, the full published-example provenance audit and outstanding gates.
Analytic fixture evidence and limits: analytic measurements. Development measurements do not establish a sealed RELEASE result. No physical contact or fit is claimed.
Straight-path composition
path_component_kit.vxl.json composes a swept polygon rib, a
lofted rectangular transition and a filled circular pin as three separate deliveries. A
requirement fragment supplies each component's solid-count and mesh-closure obligations;
independent swept_section and loft_sections rows state its geometry.
Read the walkthrough for the frames, complete-solid scope and
selector limits. Its byte-identical source is
the published source fixture.
The documentation tests check compilation and source identity. Native RELEASE, assembled
fit and physical print/load behaviour are not recorded for this example. Read the
path evidence index.
Surface construction
roof_and_skin_panel.vxl.json trims a stock block under a bicubic roof and thickens a separate side panel by 2 mm. Independent surface probes, wall thickness and envelopes state the delivered geometry.
surface_skin_and_roof.vxl.json composes a skin thickened along its axis and a block trimmed under a height-field roof. Its required surface and wall clauses are typed not measured until their evaluators are available, so the native label is HOLD. The compiler's RELEASE ceiling permits a build; it does not promise a measured native verdict.
Gear mesh composition
gear_mesh_carrier.vxl.json states two spur gears in a carrier with independent tooth and finite-station mesh requirements. The walkthrough explains the section-centroid distance and backlash scope.
Thread and coil composition
thread_coil_fixture.vxl.json composes a blind M4 x 0.7 threaded
hole in an offset block, a separately placed M4 x 0.7 full-profile stud (std.thread_stud) and a
plain round-wire coil (std.coil), each with its typed sections_v1 requirement plus
solid-count and mesh-closure rows. Its byte-identical source is
the published source fixture.
The documentation tests check compilation and source identity. The composed document is a
checked teaching input; this composed document has no measured native RELEASE capture.
Full-profile external threads are measured with uncut ends and recorded overhang. The
thread_external, std_thread_stud, req_thread and thread_frontend corpus publications
are RELEASE. See the
thread and coil evidence index for corpus names and the open
rows.
analytic_locator_fixture.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "analytic_locator_fixture",
"std": "vxl-std-2",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "cone_complete", "text": "The conical side has complete coverage."},
{"id": "cone_material_outward", "text": "The conical side has outward material orientation."},
{"id": "cone_direction", "text": "The conical axis direction is +Z."},
{"id": "cone_axis_point", "text": "The conical axis line passes through [11,-7,31] mm."},
{"id": "cone_from", "text": "The conical side starts at Z station 31 mm."},
{"id": "cone_to", "text": "The conical side ends at Z station 54 mm."},
{"id": "cone_base", "text": "The cone diameter at Z station 31 mm is 17 mm."},
{"id": "cone_top", "text": "The cone diameter at Z station 54 mm is 7 mm."},
{"id": "cone_solid", "text": "Deliver exactly one connected solid for cone."},
{"id": "cone_closed", "text": "The cone delivered mesh is closed."},
{"id": "cone_outward", "text": "The cone delivered mesh is outward oriented."},
{"id": "cone_manifold", "text": "The cone delivered mesh is two-manifold."},
{"id": "cone_envelope", "text": "The cone bounds in millimetres are [[2.5, -15.5, 31], [19.5, 1.5, 54]]."},
{"id": "wedge_solid", "text": "Deliver exactly one connected solid for wedge."},
{"id": "wedge_closed", "text": "The wedge delivered mesh is closed."},
{"id": "wedge_outward", "text": "The wedge delivered mesh is outward oriented."},
{"id": "wedge_manifold", "text": "The wedge delivered mesh is two-manifold."},
{"id": "wedge_envelope", "text": "The wedge bounds in millimetres are [[-48, 13, 5], [-29, 50, 16]]."},
{"id": "wedge_feature", "text": "Adjacent outward -Y and slope planes of the posed wedge enclose 141.63251461513846 degrees."},
{"id": "wedge_plane", "text": "The posed wedge slope is a planar support at the specified outward normal and station."},
{"id": "bushing_profile", "text": "The meridian rectangle is [0,5] to [11,9] mm in axial/radial coordinates."},
{"id": "bushing_direction", "text": "The revolution axis direction is +Z."},
{"id": "bushing_origin", "text": "The revolution axis passes through [7,43,-19] mm."},
{"id": "bushing_angle", "text": "The revolution sweep is exactly 360 degrees."},
{"id": "bushing_outer", "text": "The complete outward cylindrical wall has diameter 18 mm."},
{"id": "bushing_bore", "text": "The complete through bore has diameter 10 mm."},
{"id": "bushing_from", "text": "The bushing lower end station is Z=-19 mm."},
{"id": "bushing_to", "text": "The bushing upper end station is Z=-8 mm."},
{"id": "bushing_solid", "text": "Deliver exactly one connected solid for bushing."},
{"id": "bushing_closed", "text": "The bushing delivered mesh is closed."},
{"id": "bushing_outward", "text": "The bushing delivered mesh is outward oriented."},
{"id": "bushing_manifold", "text": "The bushing delivered mesh is two-manifold."},
{"id": "bushing_envelope", "text": "The bushing bounds in millimetres are [[-2, 34, -19], [16, 52, -8]]."},
{"id": "bushing_end_plane", "text": "The bushing upper annular end is planar at Z=-8 mm."},
{"id": "sphere_center", "text": "Sphere centre is [53,-23,17] mm."},
{"id": "sphere_size", "text": "Sphere diameter is 14 mm."},
{"id": "sphere_complete", "text": "Spherical trim coverage is complete."},
{"id": "sphere_material_outward", "text": "The spherical material orientation is outward."},
{"id": "sphere_solid", "text": "Deliver exactly one connected solid for sphere."},
{"id": "sphere_closed", "text": "The sphere delivered mesh is closed."},
{"id": "sphere_outward", "text": "The sphere delivered mesh is outward oriented."},
{"id": "sphere_manifold", "text": "The sphere delivered mesh is two-manifold."},
{"id": "sphere_envelope", "text": "The sphere bounds in millimetres are [[46, -30, 10], [60, -16, 24]]."},
{"id": "torus_center", "text": "Torus centre is [-41,-31,23] mm."},
{"id": "torus_axis", "text": "Torus has unoriented X axis."},
{"id": "torus_major", "text": "Torus major radius is 13 mm."},
{"id": "torus_minor", "text": "Torus minor radius is 3 mm."},
{"id": "torus_complete", "text": "Torus periodic trim coverage is complete."},
{"id": "torus_material_outward", "text": "The toroidal material orientation is outward."},
{"id": "torus_solid", "text": "Deliver exactly one connected solid for torus."},
{"id": "torus_closed", "text": "The torus delivered mesh is closed."},
{"id": "torus_outward", "text": "The torus delivered mesh is outward oriented."},
{"id": "torus_manifold", "text": "The torus delivered mesh is two-manifold."},
{"id": "torus_envelope", "text": "The torus bounds in millimetres are [[-44, -47, 7], [-38, -15, 39]]."}
],
"parts": [
{"id": "cone", "deliver": "body", "steps": [
{"id": "stock", "use": "std.conical_stock", "bind": "body", "args": {"base_diameter": 17, "top_diameter": 7, "length": 23, "at": [11, -7, 31]}, "covers": ["cone_complete", "cone_material_outward", "cone_direction", "cone_axis_point", "cone_from", "cone_to", "cone_base", "cone_top"]}
]},
{"id": "wedge", "deliver": "body", "steps": [
{"id": "stock", "op": "wedge", "bind": "body", "size": [37, 19, 11], "ltx": 13},
{"id": "pose", "op": "place", "target": "body", "place": {"rotate": [{"axis": "z", "deg": 90}], "translate": [-29, 13, 5]}}
]},
{"id": "bushing", "deliver": "body", "steps": [
{"id": "stock", "use": "std.revolved_bushing", "bind": "body", "args": {"inner_diameter": 10, "outer_diameter": 18, "length": 11, "at": [7, 43, -19]}, "covers": ["bushing_profile", "bushing_direction", "bushing_origin", "bushing_angle", "bushing_outer", "bushing_bore", "bushing_from", "bushing_to"]}
]},
{"id": "sphere", "deliver": "body", "steps": [
{"id": "stock", "use": "std.spherical_stock", "bind": "body", "args": {"diameter": 14, "at": [53, -23, 17]}, "covers": ["sphere_center", "sphere_size", "sphere_complete", "sphere_material_outward"]}
]},
{"id": "torus", "deliver": "body", "steps": [
{"id": "stock", "use": "std.toroidal_stock", "bind": "body", "args": {"major_radius": 13, "minor_radius": 3, "at": [-41, -31, 23], "axis": "+x"}, "covers": ["torus_center", "torus_axis", "torus_major", "torus_minor", "torus_complete", "torus_material_outward"]},
{"id": "pose", "op": "place", "target": "body", "place": {"rotate": [{"axis": "x", "deg": 90}], "translate": [0, -8, 54]}}
]}
],
"requirements": [
{"id": "cone_count", "kind": "solid_count", "subject": "cone", "covers": ["cone_solid"]},
{"id": "cone_mesh", "kind": "closed_delivered_mesh", "subject": "cone", "covers": ["cone_closed", "cone_outward", "cone_manifold"]},
{"id": "cone_bounds", "kind": "envelope", "subject": "cone", "bounds": {"min": [2.5, -15.5, 31], "max": [19.5, 1.5, 54]}, "covers": ["cone_envelope"]},
{"id": "wedge_count", "kind": "solid_count", "subject": "wedge", "covers": ["wedge_solid"]},
{"id": "wedge_mesh", "kind": "closed_delivered_mesh", "subject": "wedge", "covers": ["wedge_closed", "wedge_outward", "wedge_manifold"]},
{"id": "wedge_bounds", "kind": "envelope", "subject": "wedge", "bounds": {"min": [-48, 13, 5], "max": [-29, 50, 16]}, "covers": ["wedge_envelope"]},
{"id": "wedge_angle", "kind": "face_angle", "subject": "wedge", "between": {"first": {"planar": {"normal": "+x", "at": -29}}, "second": {"planar": {"normal": [-0.7840458244617614, 0.6207029443655612, 0], "through": [-29, 50, 5]}}}, "angle": 141.63251461513846, "covers": ["wedge_feature"]},
{"id": "wedge_slope", "kind": "planar_face", "subject": "wedge", "normal": [-0.7840458244617614, 0.6207029443655612, 0], "covers": ["wedge_plane"], "through": [-29, 50, 5], "near": {"x": [-49, -28], "y": [12, 51], "z": [4, 17]}},
{"id": "bushing_count", "kind": "solid_count", "subject": "bushing", "covers": ["bushing_solid"]},
{"id": "bushing_mesh", "kind": "closed_delivered_mesh", "subject": "bushing", "covers": ["bushing_closed", "bushing_outward", "bushing_manifold"]},
{"id": "bushing_bounds", "kind": "envelope", "subject": "bushing", "bounds": {"min": [-2, 34, -19], "max": [16, 52, -8]}, "covers": ["bushing_envelope"]},
{"id": "bushing_end", "kind": "planar_face", "subject": "bushing", "normal": "+z", "at": -8, "covers": ["bushing_end_plane"]},
{"id": "sphere_count", "kind": "solid_count", "subject": "sphere", "covers": ["sphere_solid"]},
{"id": "sphere_mesh", "kind": "closed_delivered_mesh", "subject": "sphere", "covers": ["sphere_closed", "sphere_outward", "sphere_manifold"]},
{"id": "sphere_bounds", "kind": "envelope", "subject": "sphere", "bounds": {"min": [46, -30, 10], "max": [60, -16, 24]}, "covers": ["sphere_envelope"]},
{"id": "torus_count", "kind": "solid_count", "subject": "torus", "covers": ["torus_solid"]},
{"id": "torus_mesh", "kind": "closed_delivered_mesh", "subject": "torus", "covers": ["torus_closed", "torus_outward", "torus_manifold"]},
{"id": "torus_bounds", "kind": "envelope", "subject": "torus", "bounds": {"min": [-44, -47, 7], "max": [-38, -15, 39]}, "covers": ["torus_envelope"]}
]
}
array_each.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "generated_ribs",
"units": {"length": "mm", "angle": "deg"},
"parts": [
{"id": "p", "deliver": "body", "steps": [
{"id": "base", "op": "box", "bind": "body", "size": [10, 10, 10]},
{"id": "tool", "op": "box", "bind": "tool_${i}", "size": [4, 4, 4], "at": [8, "1 + i * 3", 3], "at_each": [{"var": "i", "range": [0, 1]}]},
{"id": "join", "op": "union", "target": "body", "tools": [{"each": [{"var": "j", "range": [0, 1]}], "emit": {"binding": "tool_${j}"}}], "bind": "body"}
]}
],
"requirements": [{"id": "solid", "kind": "solid_count", "subject": "p"}]
}
at_each_grid.vxl.json
{
"schema": "vextor.vxl.v1", "id": "at_each_grid", "units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_size", "text": "An 80 x 80 x 4 mm plate with z=0 as its base."},
{"id": "n_holes", "text": "Eight 3 mm through holes on a 2 x 4 grid: X in {10, 50}, Y in {10, 30, 50, 70}."},
{"id": "n_solid", "text": "One closed printable solid."}
],
"params": [
{"id": "t", "type": "length", "value": 4}
],
"parts": [
{"id": "plate", "deliver": "body", "steps": [
{"id": "s01", "op": "box", "bind": "body", "size": [80, 80, "t"]},
{"id": "s20", "op": "hole", "target": "body", "diameter": 3, "axis": "-z", "at": ["10 + i * 40", "10 + j * 20", "t"], "at_each": [{"var": "i", "range": [0, 1]}, {"var": "j", "range": [0, 3]}]}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "plate", "covers": ["n_solid"]},
{"id": "r_env", "kind": "envelope", "subject": "plate", "bounds": {"min": [0, 0, 0], "max": [80, 80, "t"]}, "covers": ["n_size"]},
{"id": "r_hole", "kind": "hole", "subject": "plate", "diameter": 3, "axis": "z", "axis_at": ["10 + i * 40", "10 + j * 20", 0], "through": [0, "t"], "at_each": [{"var": "i", "range": [0, 1]}, {"var": "j", "range": [0, 3]}], "covers": ["n_holes"]}
]
}
at_each_table.vxl.json
{
"schema": "vextor.vxl.v1", "id": "at_each_table", "units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_size", "text": "A 60 x 40 x 4 mm plate with z=0 as its base."},
{"id": "n_holes", "text": "One 4 mm through hole at each row of the mounting table."},
{"id": "n_solid", "text": "One closed printable solid."}
],
"params": [
{"id": "t", "type": "length", "value": 4}
],
"tables": [
{"id": "mount_pos", "columns": {"x": "length", "y": "length"}, "rows": {"a": {"x": "10", "y": "10"}, "b": {"x": "30", "y": "20"}, "c": {"x": "50", "y": "30"}}}
],
"parts": [
{"id": "plate", "deliver": "body", "steps": [
{"id": "s01", "op": "box", "bind": "body", "size": [60, 40, "t"]},
{"id": "s20", "op": "hole", "target": "body", "diameter": 4, "axis": "-z", "at": ["lookup(mount_pos, slot, x)", "lookup(mount_pos, slot, y)", "t"], "at_each": [{"var": "slot", "in_table": "mount_pos"}]}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "plate", "covers": ["n_solid"]},
{"id": "r_env", "kind": "envelope", "subject": "plate", "bounds": {"min": [0, 0, 0], "max": [60, 40, "t"]}, "covers": ["n_size"]},
{"id": "r_hole", "kind": "hole", "subject": "plate", "diameter": 4, "axis": "z", "axis_at": ["lookup(mount_pos, slot, x)", "lookup(mount_pos, slot, y)", 0], "through": [0, "t"], "at_each": [{"var": "slot", "in_table": "mount_pos"}], "covers": ["n_holes"]}
]
}
cube.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "cube",
"title": "10 mm cube",
"units": {"length": "mm", "angle": "deg"},
"notes": "Smallest useful document. Base is z=0; the cube occupies [0,10] x [0,10] x [0,10].",
"needs": [
{"id": "n_cube", "source": "user", "text": "A 10 x 10 x 10 mm cube with z=0 as the base."},
{"id": "n_size", "source": "user", "text": "Overall size is exactly 10 mm on every side."},
{"id": "n_solid", "source": "user", "text": "One closed printable solid: the delivered STL is a closed mesh."}
],
"params": [
{"id": "a", "type": "length", "value": "10", "domain": ["5", "20"]}
],
"parts": [
{
"id": "cube",
"role": "deliverable",
"rep": "exact",
"acceptance": "exact_only_v1",
"deliver": "body",
"steps": [
{"id": "s1", "op": "box", "bind": "body", "size": ["a", "a", "a"]}
],
"notes": "Box min corner sits at the origin, so the base is z=0."
}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "cube", "covers": ["n_solid"]},
{"id": "r_envelope", "kind": "envelope", "subject": "cube", "bounds": {"min": [0, 0, 0], "max": ["a", "a", "a"]}, "tol": 0.05, "covers": ["n_cube", "n_size"]},
{"id": "r_volume", "kind": "volume_range", "subject": "cube", "min": "0.999 * a * a * a", "max": "1.001 * a * a * a", "covers": ["n_size"], "notes": "The nominal volume a^3 and 0.1 % either way, never one value: the measured volume is a rounded number (999.9999999999998 for this cube). 0.1 % is far above the rounding and still fails a side that is wrong by 0.02 mm."},
{"id": "r_mesh", "kind": "closed_delivered_mesh", "subject": "cube", "artifact": "stl", "covers": ["n_solid"]}
]
}
ex06_gusset_bracket.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "ex06_gusset_bracket",
"units": {"length": "mm", "angle": "deg"},
"std": "vxl-std-2",
"needs": [
{"id": "n_mount", "text": "Fix a desk sensor or small panel with M4 screws; outer size 30 x 40 x 40."},
{"id": "n_ribs", "text": "Two 3 mm triangular ribs, roots embedded 2 mm into both plates."},
{"id": "n_base_holes", "text": "Base: round hole D4.5 at XY (15,14) and an 8 x 4.5 slot along Y at (15,30), both through Z."},
{"id": "n_wall_holes", "text": "Upright: two D4.5 holes at XZ (15,14) and (15,30), through Y."},
{"id": "n_fillets", "text": "R2 at the rib roots; R1 on the two outer top edges: base.+z/base.+y and wall.+z/wall.+y."},
{"id": "n_datums", "text": "Bottom z=0 and back y=0 stay flat, at 90 degrees, and are not rounded."},
{"id": "n_tool_access", "text": "A D9 x 20 tool reaches every screw axis, including the slot's adjustment travel, without hitting the ribs."},
{"id": "n_single_solid", "text": "One closed printable solid."}
],
"params": [
{"id": "width", "type": "length", "value": 30, "domain": ["24", "60"]},
{"id": "arm", "type": "length", "value": 40, "domain": ["30", "80"]},
{"id": "plate", "type": "length", "value": 4, "domain": ["3", "6"]},
{"id": "rib", "type": "length", "value": 3, "domain": ["2", "4"]},
{"id": "near", "type": "length", "value": 14, "domain": ["10", "20"]},
{"id": "slot", "type": "length", "value": 8, "domain": ["6", "12"]},
{"id": "bolt", "type": "enum", "value": "M4", "domain": ["M3", "M4", "M5"]},
{"id": "root_r", "type": "length", "value": 2, "domain": ["1", "3"]},
{"id": "edge_r", "type": "length", "value": 1, "domain": ["0.5", "2"]},
{"id": "tool_d", "type": "length", "value": 9, "domain": ["8", "14"]},
{"id": "tool_l", "type": "length", "value": 20}
],
"lets": [
{"id": "hole_d", "expr": "lookup(std_iso_273, bolt, medium)"},
{"id": "cx", "expr": "width / 2"},
{"id": "far", "expr": "arm - 10"},
{"id": "travel", "expr": "slot - hole_d"}
],
"checks": [
{"id": "c_ligament", "expr": "far - slot / 2 - near - hole_d / 2 >= 3", "message": "at least 3 mm of material between the round hole and the slot"},
{"id": "c_slot_front", "expr": "far + slot / 2 <= arm - 3", "message": "slot end at least 3 mm from the front edge"},
{"id": "c_tool_rib", "expr": "cx - tool_d / 2 - rib >= 1", "message": "design inequality; r_tool_* measure it"},
{"id": "c_gusset", "expr": "far > 2 + 2 * root_r", "message": "gusset legs longer than the root fillets"}
],
"parts": [
{ "id": "bracket", "deliver": "body", "steps": [
{"id": "s01", "op": "box", "bind": "base", "size": ["width", "arm", "plate"]},
{"id": "s02", "op": "box", "bind": "wall", "size": ["width", "plate", "arm"]},
{"id": "s03", "op": "extrude", "bind": "gusset", "plane": "yz", "toward": "+x", "length": "rib", "profile": {"path": {"from": [2, 2], "segments": [{"line": ["far", 2]}, {"line": [2, "far"]}, {"line": [2, 2]}]}}},
{"id": "s04", "op": "union", "bind": "body", "target": "base", "tool": "wall"},
{"id": "s05", "op": "union", "target": "body", "tool": "gusset", "alias": "rib_l"},
{"id": "s06", "op": "union", "target": "body", "tool": "gusset", "alias": "rib_r", "tool_place": {"translate": ["width - rib", 0, 0]}},
{"id": "s07", "op": "extrude", "bind": "slot_cutter", "plane": "xy", "at": -1, "toward": "+z", "length": "plate + 2", "profile": {"slot": {"from": ["cx", "(far - ((slot) - (hole_d)) / 2)"], "to": ["cx","(far + ((slot) - (hole_d)) / 2)"], "width": "hole_d"}}},
{"id": "s08", "op": "cut", "target": "body", "tool": "slot_cutter"},
{"id": "s09", "use": "std.mount_hole", "target": "body", "args": {"d": "hole_d", "at": ["cx", "near", "plate"], "axis": "-z", "thick": "plate"}, "covers": ["n_mount", "n_base_holes"]},
{"id": "s10", "use": "std.mount_hole", "target": "body", "args": {"d": "hole_d", "at": ["cx", "plate", "hz"], "axis": "-y", "thick": "plate"}, "at_each": [{"vars": ["hz"], "in": [["near"], ["far"]]}], "covers": ["n_mount", "n_wall_holes"]},
{"id": "s12", "op": "fillet", "target": "body", "radius": "root_r", "edges": {"select": {"class": "concave", "adjacent_to": ["base.+z", "wall.+y"]}, "expect": 9}},
{"id": "s13", "op": "fillet", "target": "body", "radius": "edge_r", "edges": {"select": {"any_of": [{"edge": ["base.+z", "base.+y"]}, {"edge": ["wall.+z", "wall.+y"]}]}, "expect": 2}}
]},
{"id": "tool_base", "use": "std.tool_access", "args": {"of": "bracket", "d": "tool_d", "l": "tool_l", "at": ["cx", "near", "plate"], "axis": "-z"}, "covers": ["n_tool_access"]},
{"id": "tool_wall", "use": "std.tool_access", "args": {"of": "bracket", "d": "tool_d", "l": "tool_l", "at": ["cx", "plate", "hz"], "axis": "-y"}, "at_each": [{"vars": ["hz"], "in": [["near"], ["far"]]}], "covers": ["n_tool_access"]},
{ "id": "tool_slot", "role": "keep_out", "deliver": "t", "steps": [
{"id": "k1", "op": "extrude", "bind": "t", "plane": "xy", "at": "plate + 1", "toward": "+z", "length": "tool_l", "profile": {"slot": {"from": ["cx", "(far - ((tool_d + travel) - (tool_d)) / 2)"], "to": ["cx","(far + ((tool_d + travel) - (tool_d)) / 2)"], "width": "tool_d"}}}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "bracket", "covers": ["n_single_solid"]},
{"id": "r_envelope", "kind": "envelope", "subject": "bracket", "bounds": {"min": [0, 0, 0], "max": ["width", "arm", "arm"]}, "covers": ["n_mount"]},
{"id": "r_slot", "kind": "slot", "subject": "bracket", "from": ["cx", "(far - ((slot) - (hole_d)) / 2)", 0], "to": ["cx","(far + ((slot) - (hole_d)) / 2)",0], "width": "hole_d", "through": [0, "plate"], "axis": "z", "covers": ["n_base_holes"]},
{"id": "r_rib_face_l", "kind": "planar_face", "subject": "bracket", "normal": "+x", "at": "rib", "near": {"y": [4, "far"], "z": [4, "far"]}, "covers": ["n_ribs"]},
{"id": "r_rib_face_r", "kind": "planar_face", "subject": "bracket", "normal": "-x", "at": "width - rib", "near": {"y": [4, "far"], "z": [4, "far"]}, "covers": ["n_ribs"]},
{"id": "r_datum_bottom", "use": "std.datum_plane", "args": {"of": "bracket", "normal": "-z", "at": 0}, "covers": ["n_datums"]},
{"id": "r_datum_back", "use": "std.datum_plane", "args": {"of": "bracket", "normal": "-y", "at": 0}, "covers": ["n_datums"]},
{"id": "r_datum_sharp", "kind": "unmeasured", "subject": "bracket", "required": false, "describe": "The bottom and back datum surfaces have no rounding; this recipe does not specify a finite straight run to measure.", "covers": ["n_datums"]},
{"id": "r_rib_wall_l", "kind": "minimum_wall", "subject": "bracket", "min": "rib - 0.05", "disk": {"on": {"planar": {"normal": "+x", "at": "rib"}}, "center": ["rib", "(4 + far) / 3", "(4 + far) / 3"], "radius": 1.5}, "covers": ["n_ribs"]},
{"id": "r_rib_wall_r", "kind": "minimum_wall", "subject": "bracket", "min": "rib - 0.05", "disk": {"on": {"planar": {"normal": "-x", "at": "width - rib"}}, "center": ["width - rib", "(4 + far) / 3", "(4 + far) / 3"], "radius": 1.5}, "covers": ["n_ribs"]},
{"id": "r_r1_base", "kind": "fillet_radius", "subject": "bracket", "radius": "edge_r", "between": [{"planar": {"normal": "+z", "at": "plate"}}, {"planar": {"normal": "+y", "at": "arm"}}], "near": {"y": ["arm - edge_r", "arm"], "z": ["plate - edge_r", "plate"]}, "covers": ["n_fillets"]},
{"id": "r_r1_wall", "kind": "fillet_radius", "subject": "bracket", "radius": "edge_r", "between": [{"planar": {"normal": "+z", "at": "arm"}}, {"planar": {"normal": "+y", "at": "plate"}}], "near": {"y": ["plate - edge_r", "plate"], "z": ["arm - edge_r", "arm"]}, "covers": ["n_fillets"]},
{"id": "r_r2_corner", "kind": "fillet_radius", "subject": "bracket", "radius": "root_r", "between": [{"planar": {"normal": "+z", "at": "plate"}}, {"planar": {"normal": "+y", "at": "plate"}}], "covers": ["n_fillets"]},
{"id": "r_r2_rib_l_base", "kind": "fillet_radius", "subject": "bracket", "radius": "root_r", "between": [{"planar": {"normal": "+x", "at": "rib"}}, {"planar": {"normal": "+z", "at": "plate"}}], "covers": ["n_fillets"]},
{"id": "r_r2_rib_l_wall", "kind": "fillet_radius", "subject": "bracket", "radius": "root_r", "between": [{"planar": {"normal": "+x", "at": "rib"}}, {"planar": {"normal": "+y", "at": "plate"}}], "covers": ["n_fillets"]},
{"id": "r_r2_rib_r_base", "kind": "fillet_radius", "subject": "bracket", "radius": "root_r", "between": [{"planar": {"normal": "-x", "at": "width - rib"}}, {"planar": {"normal": "+z", "at": "plate"}}], "covers": ["n_fillets"]},
{"id": "r_r2_rib_r_wall", "kind": "fillet_radius", "subject": "bracket", "radius": "root_r", "between": [{"planar": {"normal": "-x", "at": "width - rib"}}, {"planar": {"normal": "+y", "at": "plate"}}], "covers": ["n_fillets"]},
{"id": "r_r2_hyp_l_base", "kind": "fillet_radius", "subject": "bracket", "radius": "root_r", "between": [{"planar": {"normal": [0, 1, 1], "through": [0, "far", 2]}}, {"planar": {"normal": "+z", "at": "plate"}}], "near": {"x": [0, "rib"]}, "covers": ["n_fillets"]},
{"id": "r_r2_hyp_l_wall", "kind": "fillet_radius", "subject": "bracket", "radius": "root_r", "between": [{"planar": {"normal": [0, 1, 1], "through": [0, "far", 2]}}, {"planar": {"normal": "+y", "at": "plate"}}], "near": {"x": [0, "rib"]}, "covers": ["n_fillets"]},
{"id": "r_r2_hyp_r_base", "kind": "fillet_radius", "subject": "bracket", "radius": "root_r", "between": [{"planar": {"normal": [0, 1, 1], "through": [0, "far", 2]}}, {"planar": {"normal": "+z", "at": "plate"}}], "near": {"x": ["width - rib", "width"]}, "covers": ["n_fillets"]},
{"id": "r_r2_hyp_r_wall", "kind": "fillet_radius", "subject": "bracket", "radius": "root_r", "between": [{"planar": {"normal": [0, 1, 1], "through": [0, "far", 2]}}, {"planar": {"normal": "+y", "at": "plate"}}], "near": {"x": ["width - rib", "width"]}, "covers": ["n_fillets"]},
{"id": "r_tool_slot", "kind": "clearance", "operands": ["bracket", "tool_slot"], "min": 0.5, "covers": ["n_tool_access"]},
{"id": "r_mesh_closed", "kind": "closed_delivered_mesh", "subject": "bracket", "covers": ["n_single_solid"]}
]
}
finishing_mirrored_placed.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "finishing_mirrored_placed",
"title": "Independent local finishes on a reflected and placed block",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_bounds", "text": "The block spans x 29..47, y 11..59, z 8..20."},
{"id": "n_solid", "text": "The block is one solid."},
{"id": "n_round", "text": "A local radius 1 fillet joins the planes x 47 and y 11 along z 8..20."},
{"id": "n_bevel", "text": "A local distance 0.5 chamfer joins the planes x 29 and y 11 along z 8..20."},
{"id": "n_mesh", "text": "The delivered block mesh is closed."}
],
"parts": [
{"id": "block", "deliver": "body", "steps": [
{"id": "base", "op": "box", "bind": "body", "at": [5, -7, 3], "size": [24, 18, 12]},
{"id": "reflect", "op": "mirror", "target": "body", "plane": {"x": 5}, "maps": {"body": "left"}},
{"id": "round", "op": "fillet", "target": "body", "radius": 1, "edges": {"select": {"edge": ["left.+x", "left.-y"]}, "expect": 1}},
{"id": "bevel", "op": "chamfer", "target": "body", "distance": 0.5, "edges": {"select": {"edge": ["left.+x", "left.+y"]}, "expect": 1}},
{"id": "move", "op": "place", "target": "body", "place": {"rotate": [{"axis": "z", "deg": 90}], "translate": [40, 30, 5]}}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "block", "covers": ["n_solid"]},
{"id": "r_bounds", "kind": "envelope", "subject": "block", "bounds": {"min": [29, 11, 8], "max": [47, 59, 20]}, "covers": ["n_bounds"]},
{"id": "r_round", "kind": "fillet_radius", "subject": "block", "radius": 1, "between": [{"planar": {"normal": "+x", "at": 47}}, {"planar": {"normal": "-y", "at": 11}}], "near": {"x": [45, 47], "y": [11, 13], "z": [8, 20]}, "covers": ["n_round"]},
{"id": "r_bevel", "kind": "chamfer_size", "subject": "block", "distance": 0.5, "between": [{"planar": {"normal": "-x", "at": 29}}, {"planar": {"normal": "-y", "at": 11}}], "near": {"x": [29, 30], "y": [11, 12], "z": [8, 20]}, "covers": ["n_bevel"]},
{"id": "r_mesh", "kind": "closed_delivered_mesh", "subject": "block", "covers": ["n_mesh"]}
]
}
fragment_part.vxl.json
{
"schema": "vextor.vxl.v1", "id": "fragment_part", "units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_size", "text": "A 40 x 40 x 6 mm plate with z=0 as its base."},
{"id": "n_fit", "text": "A fitting gauge hovers over the plate without touching it."},
{"id": "n_solid", "text": "One closed printable solid."}
],
"defs": [
{"id": "gauge", "category": "part",
"params": [{"id": "of", "type": "part"}, {"id": "size", "type": "length"}, {"id": "lift", "type": "length", "default": 20}],
"parts": [
{"id": "self", "role": "keep_out", "deliver": "b", "steps": [{"id": "make", "op": "box", "bind": "b", "size": ["size", "size", 2], "at": [0, 0, "lift"]}]},
{"id": "shim", "role": "keep_out", "deliver": "b", "steps": [{"id": "make", "op": "box", "bind": "b", "size": ["size", "size", 1], "at": [0, 0, "lift + 10"]}]}
],
"requirements": [
{"id": "gap", "kind": "clearance", "operands": ["self", "shim"], "min": 1},
{"id": "clear", "kind": "clearance", "operands": ["$of", "self"], "min": 1}
]}
],
"parts": [
{"id": "plate", "deliver": "body", "steps": [
{"id": "s01", "op": "box", "bind": "body", "size": [40, 40, 6]}
]},
{"id": "gauge", "use": "gauge", "args": {"of": "plate", "size": 8}, "covers": ["n_fit"]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "plate", "covers": ["n_solid"]},
{"id": "r_env", "kind": "envelope", "subject": "plate", "bounds": {"min": [0, 0, 0], "max": [40, 40, 6]}, "covers": ["n_size"]}
]
}
fragment_reads.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "fragment_reads",
"units": {"length": "mm", "angle": "deg"},
"params": [{"id": "post_height", "type": "length", "value": 10}],
"defs": [
{"id": "post", "category": "step", "reads": ["post_height"], "params": [{"id": "origin", "type": "point"}, {"id": "region", "type": "profile"}, {"id": "sites", "type": "points"}, {"id": "targets", "type": "bindings"}], "steps": [
{"id": "make", "op": "extrude", "bind": "boss", "plane": "xy", "toward": "+z", "length": "post_height", "profile": "$region"},
{"id": "drill", "op": "hole", "targets": "$targets", "diameter": 2, "axis": "-z", "at": ["origin_x + px", "origin_y + py", "origin_z"], "at_each": [{"vars": ["px", "py"], "in": "$sites"}]},
{"id": "self", "op": "union", "target": "$target", "tool": "boss", "bind": "$bind"}
]}
],
"parts": [
{"id": "p", "deliver": "body", "steps": [
{"id": "base", "op": "box", "bind": "body", "size": [10, 10, 4]},
{"id": "second", "op": "box", "bind": "second", "size": [10, 10, 4]},
{"id": "post", "use": "post", "target": "body", "bind": "body", "args": {"origin": [0, 0, 4], "region": {"circle": {"center": [0, 0], "diameter": 4}}, "sites": [[2, 2], [8, 8]], "targets": ["body", "second"]}}
]}
],
"requirements": [{"id": "solid", "kind": "solid_count", "subject": "p"}]
}
fragment_requirement.vxl.json
{
"schema": "vextor.vxl.v1", "id": "fragment_requirement", "units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_size", "text": "A 40 x 40 x 6 mm plate with z=0 as its base."},
{"id": "n_top", "text": "The top face is flat and 6 mm above the base."},
{"id": "n_solid", "text": "One closed printable solid."}
],
"defs": [
{"id": "flat_face", "category": "requirement",
"params": [
{"id": "of", "type": "part"},
{"id": "at", "type": "length"},
{"id": "normal", "type": "dir", "notes": "outward normal"}
],
"requirements": [{"id": "self", "kind": "planar_face", "subject": "$of", "normal": "$normal", "at": "at"}]}
],
"parts": [
{"id": "plate", "deliver": "body", "steps": [
{"id": "s01", "op": "box", "bind": "body", "size": [40, 40, 6]}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "plate", "covers": ["n_solid"]},
{"id": "r_env", "kind": "envelope", "subject": "plate", "bounds": {"min": [0, 0, 0], "max": [40, 40, 6]}, "covers": ["n_size"]},
{"id": "r_top", "use": "flat_face", "args": {"of": "plate", "normal": "+z", "at": 6}, "covers": ["n_top"]}
]
}
fragment_step.vxl.json
{
"schema": "vextor.vxl.v1", "id": "fragment_step", "units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_size", "text": "A 60 x 40 x 4 mm plate with z=0 as its base."},
{"id": "n_posts", "text": "Four 8 mm posts, 6 mm tall, on a 2 x 2 grid at (10,10), (50,10), (10,30), (50,30)."},
{"id": "n_solid", "text": "One closed printable solid."}
],
"params": [
{"id": "post_d", "type": "length", "value": 8}
],
"defs": [
{"id": "post", "category": "step",
"params": [{"id": "at", "type": "point"}, {"id": "d", "type": "length"}, {"id": "h", "type": "length", "default": 6}],
"lets": [{"id": "r", "expr": "d / 2"}],
"checks": [{"id": "d_pos", "expr": "d > 0", "message": "post diameter must be positive"}],
"steps": [{"id": "c", "op": "cylinder", "bind": "t", "diameter": "d", "length": "h", "at": ["at_x", "at_y", "at_z"]},
{"id": "self", "op": "union", "target": "$target", "tool": "t"}]}
],
"parts": [
{"id": "plate", "deliver": "body", "steps": [
{"id": "s01", "op": "box", "bind": "body", "size": [60, 40, 4]},
{"id": "s02", "use": "post", "target": "body", "args": {"at": ["px", "py", 4], "d": "post_d"}, "at_each": [{"vars": ["px", "py"], "in": [[10, 10], [50, 10], [10, 30], [50, 30]]}]}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "plate", "covers": ["n_solid"]},
{"id": "r_env", "kind": "envelope", "subject": "plate", "bounds": {"min": [0, 0, 0], "max": [60, 40, 10]}, "covers": ["n_size", "n_posts"]}
]
}
function_formula.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "function_formula",
"std": "vxl-std-2",
"units": {"length": "mm", "angle": "deg"},
"functions": [
{"id": "twice", "params": [{"id": "width", "type": "length"}], "expr": "width * 2", "returns": "length"},
{"id": "web_width", "params": [{"id": "base", "type": "length"}], "lets": [{"id": "doubled", "expr": "twice(base)", "type": "length"}], "expr": "doubled + base", "returns": "length"}
],
"parts": [
{"id": "p", "deliver": "body", "steps": [
{"id": "base", "op": "box", "bind": "body", "size": ["web_width(2) + std_ramp(0.5, 0, 1) * 1mm", 10, 10]}
]}
],
"requirements": [{"id": "solid", "kind": "solid_count", "subject": "p"}]
}
Four declared poses of a gear pair on a carrier
gear_mesh_carrier.vxl.json states a 17-tooth pinion and 40-tooth wheel, module 1.5 mm and pressure angle 20 degrees. Their reference radii are 12.75 and 30 mm. Both profile shifts are zero, so their stated section-centroid separation is 12.75 + 30 = 42.75 mm. Each gear is thinned by 0.05 mm on its own reference circle; the nominal thinning contribution to tangential play is 0.1 mm. The independent pair requirement demands measured backlash in [0.05,0.25] mm, not equality with that nominal reference arithmetic.
The wheel's half-pitch phase is 4.5 degrees and is built into its own geometry. Both assembly occurrences then receive the same X23/Y17/Z11 rotations. The carrier is offset by (31,-12,8); the wheel's translation is that offset plus the rotated vector (42.75,0,0). The common rotation preserves the exact direction identity needed for planar contact. The source geometry is verified locally before its declared assembly pose is applied.
The 6.3 mm bores, 6 mm pin bands, connected carrier and its base planes at z=-5 and z=-2 have their own requirements. The base is 3 mm thick; gears at z=0..8 nominally lie 2 mm above its upper face. The pair requirement does not measure whole-part clearance, bearing fit, load or physical printing. The source now separately demands gear↔gear clearance >=0.02 mm and each gear↔plate clearance >=0.5 mm. The plate view is the exact intersection of the final connected carrier with [-20,-40,-5]..[82.75,40,-2]; it is captured for verification without another deliverable. The exact full gear bodies exceed clearance’s fixed topology caps. Two gear halves and four wheel quadrants preserve every delivered point; all eight piece-pair and six piece-to-plate relations are required, with two measured full-body envelope guards. These full clearance demands are to be measured on Linux.
Four stations rotate B by k·9/4 degrees and A by −40/17 of that angle, k=0..3. These
finite poses are the entire measured contact claim: whole_cycle_certified is false.
Section centroid distance, end-normal parallelism, positive common band and first-contact
backlash have distinct clause outcomes. If parallelism fails, contact remains not measured.
If the directions are within the stated angular tolerance but are not certified exactly
parallel, contact is sections_not_certified_coplanar; no skew projection is assumed.
Distance tolerance 0.02 mm, angle tolerance 0.1 degrees, the backlash band and four stations are all explicit. None has a default. The expected label is RELEASE; native results are recorded by the document's dedicated row. A mismatch is a finding, not permission to change a tolerance, expected row or construction to make the example pass.
Historical measurement of the twelve non-clearance demands: RELEASE, all twelve PASS. This does not qualify the current twenty-eight-row document or its fourteen component clearance demands and two coverage guards. Section centroid distance is enclosed by [42.749817000537774,42.750182999148386] mm; normal angle by [0,1.6283849816990766e-13] degrees; common axial band by [7.999999752642377,8.000000247357592] mm. First-contact backlash at stations 0–3 is:
| Station | Backlash enclosure (mm) | Width (mm) |
|---|---|---|
| 0 | [0.07763690145632503,0.12808556660344964] | 0.05044866514712461 |
| 1 | [0.07592762682142765,0.1288060081975809] | 0.05287838137615325 |
| 2 | [0.07925839967131418,0.12651086912826398] | 0.04725246945694980 |
| 3 | [0.0740227867853534,0.13282353885276493] | 0.05880075206741153 |
Each whole enclosure lies inside the independently stated [0.05,0.25] mm band. These
four poses do not certify the rotation between them. A previous run exposed lost
shared-origin cancellation in interval centroid/rotation/separation arithmetic and a
lower-plane authoring sign error. The evaluator now retains those algebraic cancellations
with outward-rounded intervals. The lower plane uses normal: "-z", at: -5: the principal
coordinate is z=-5 and its signed station along outward -Z is +5 mm. That measurement
follows the plane correction; backlash band, chord and station count retain their original values.
The current source has twenty-eight requirements. Pins remain part of the one connected carrier, with radial bore gap (6.3−6)/2=0.15 mm. The plate view selects the actual material below z=-2, so the 0.5 mm plate demand does not silently exclude pins from a whole-body clearance query. RELEASE for the complete document requires all twenty-eight authenticated Linux measurements to pass; the historical Mac station control covers only the twelve non-clearance demands.
gear_mesh_carrier.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "gear_mesh_carrier",
"title": "gear mesh carrier",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_a_system", "text": "Member a has the independently stated tooth system."},
{"id": "n_b_system", "text": "Member b has the independently stated tooth system."},
{"id": "n_solids", "text": "Each delivered member is one connected solid."},
{"id": "n_pair", "text": "The pair meets its stated section-centroid distance, end-normal angle, common band and finite-station backlash band."},
{"id": "n_a_bore", "text": "Member a has a centred 6.3 mm through bore over z=0..8."},
{"id": "n_b_bore", "text": "Member b has a centred 6.3 mm through bore over z=0..8."},
{"id": "n_carrier_solid", "text": "Carrier is one connected solid."},
{"id": "n_pin_a", "text": "The carrier pin at local x=0 has diameter 6 mm over z=-2..10."},
{"id": "n_pin_b", "text": "The carrier pin at local x=42.75 has diameter 6 mm over z=-2..10."},
{"id": "n_plate_bottom", "text": "The carrier plate lower plane is z=-5."},
{"id": "n_plate_top", "text": "The carrier plate upper base plane is z=-2."},
{"id": "n_gear_clearance", "text": "The two delivered gears have at least 0.02 mm whole-part clearance."},
{"id": "n_a_plate_clearance", "text": "Member a stays at least 0.5 mm from the actual plate portion of the connected carrier."},
{"id": "n_b_plate_clearance", "text": "Member b stays at least 0.5 mm from the actual plate portion of the connected carrier."}
],
"parts": [
{"id": "a", "deliver": "body",
"views": {
"left": {"min": [-15, -15, -1], "max": [0, 15, 9]},
"right": {"min": [0, -15, -1], "max": [15, 15, 9]}
}, "steps": [
{"id": "make", "op": "spur_gear", "bind": "body", "module": 1.5, "teeth": 17, "pressure_angle": 20, "face_width": 8, "profile_shift": 0, "thinning": 0.05},
{"id": "bore", "op": "hole", "target": "body", "diameter": 6.3, "at": [0, 0, 8], "axis": "-z", "depth": "through"}
]},
{"id": "b", "deliver": "body",
"views": {
"lower_left": {"min": [-32, -32, -1], "max": [0, 0, 9]},
"upper_left": {"min": [-32, 0, -1], "max": [0, 32, 9]},
"lower_right": {"min": [0, -32, -1], "max": [32, 0, 9]},
"upper_right": {"min": [0, 0, -1], "max": [32, 32, 9]}
}, "steps": [
{"id": "make", "op": "spur_gear", "bind": "body", "module": 1.5, "teeth": 40, "pressure_angle": 20, "face_width": 8, "profile_shift": 0, "thinning": 0.05},
{"id": "phase", "op": "place", "target": "body", "place": {"rotate": [{"axis": "z", "deg": 4.5}]}},
{"id": "bore", "op": "hole", "target": "body", "diameter": 6.3, "at": [0, 0, 8], "axis": "-z", "depth": "through"}
]},
{"id": "carrier", "deliver": "plate",
"views": {
"plate": {"min": [-20, -40, -5], "max": [82.75, 40, -2]}
}, "steps": [
{"id": "blank", "op": "box", "bind": "plate", "size": [102.75, 80, 3], "at": [-20, -40, -5]},
{"id": "pin_a", "op": "cylinder", "bind": "post_a", "diameter": 6, "length": 13, "axis": "z", "at": [0, 0, -3]},
{"id": "join_a", "op": "union", "target": "plate", "tool": "post_a"},
{"id": "pin_b", "op": "cylinder", "bind": "post_b", "diameter": 6, "length": 13, "axis": "z", "at": [42.75, 0, -3]},
{"id": "join_b", "op": "union", "target": "plate", "tool": "post_b"}
]}
],
"assemblies": [
{"id": "drive", "occurrences": [{"id": "a_placed", "part": "a", "pose": {"rotate": [{"axis": "x", "deg": 23}, {"axis": "y", "deg": 17}, {"axis": "z", "deg": 11}], "translate": [31, -12, 8]}}, {"id": "b_placed", "part": "b", "pose": {"rotate": [{"axis": "x", "deg": 23}, {"axis": "y", "deg": 17}, {"axis": "z", "deg": 11}], "translate": [71.13091031085641, -4.199341247797678, -4.498890376896997]}}, {"id": "carrier_placed", "part": "carrier", "pose": {"rotate": [{"axis": "x", "deg": 23}, {"axis": "y", "deg": 17}, {"axis": "z", "deg": 11}], "translate": [31, -12, 8]}}]}
],
"requirements": [
{"id": "r_a_solid", "kind": "solid_count", "subject": "a", "covers": ["n_solids"]},
{"id": "r_b_solid", "kind": "solid_count", "subject": "b", "covers": ["n_solids"]},
{"id": "r_a_teeth", "kind": "gear_teeth", "subject": "a", "axis": {"at": [0, 0, 0], "dir": [0, 0, 1]}, "window": {"axial": [-1, 9], "radial": [5, 60]}, "module": 1.5, "teeth": 17, "pressure_angle": 20, "face_width": 8, "profile_shift": 0, "thinning": 0.05, "measurement": "prism_section_v1", "covers": ["n_a_system"]},
{"id": "r_b_teeth", "kind": "gear_teeth", "subject": "b", "axis": {"at": [0, 0, 0], "dir": [0, 0, 1]}, "window": {"axial": [-1, 9], "radial": [5, 60]}, "module": 1.5, "teeth": 40, "pressure_angle": 20, "face_width": 8, "profile_shift": 0, "thinning": 0.05, "measurement": "prism_section_v1", "covers": ["n_b_system"]},
{"id": "r_mesh", "kind": "gear_mesh", "operands": ["a_placed", "b_placed"], "in": "drive", "gears": ["r_a_teeth", "r_b_teeth"], "centre_distance": 42.75, "backlash": {"min": 0.05, "max": 0.25}, "stations": 4, "measurement": "mesh_pose_v1", "tol": {"distance": 0.02, "angle": 0.1}, "covers": ["n_pair"]},
{"id": "r_a_bore", "kind": "hole", "subject": "a", "diameter": 6.3, "axis": "z", "through": [0, 8], "covers": ["n_a_bore"], "axis_at": [0, 0, 0]},
{"id": "r_b_bore", "kind": "hole", "subject": "b", "diameter": 6.3, "axis": "z", "through": [0, 8], "covers": ["n_b_bore"], "axis_at": [0, 0, 0]},
{"id": "r_carrier_solid", "kind": "solid_count", "subject": "carrier", "covers": ["n_carrier_solid"]},
{"id": "r_pin_a", "kind": "outer_diameter", "subject": "carrier", "diameter": 6, "axis": "z", "axis_at": [0, 0, 0], "span": {"from": -2, "to": 10}, "covers": ["n_pin_a"]},
{"id": "r_pin_b", "kind": "outer_diameter", "subject": "carrier", "diameter": 6, "axis": "z", "axis_at": [42.75, 0, 0], "span": {"from": -2, "to": 10}, "covers": ["n_pin_b"]},
{"id": "r_plate_bottom", "kind": "planar_face", "subject": "carrier", "normal": "-z", "at": -5, "covers": ["n_plate_bottom"]},
{"id": "r_plate_top", "kind": "planar_face", "subject": "carrier", "normal": "z", "at": -2, "covers": ["n_plate_top"]},
{"id": "r_gap_left_lower_left", "kind": "clearance", "operands": ["a_placed.left", "b_placed.lower_left"], "in": "drive", "min": 0.02, "covers": ["n_gear_clearance"]},
{"id": "r_gap_left_upper_left", "kind": "clearance", "operands": ["a_placed.left", "b_placed.upper_left"], "in": "drive", "min": 0.02, "covers": ["n_gear_clearance"]},
{"id": "r_gap_left_lower_right", "kind": "clearance", "operands": ["a_placed.left", "b_placed.lower_right"], "in": "drive", "min": 0.02, "covers": ["n_gear_clearance"]},
{"id": "r_gap_left_upper_right", "kind": "clearance", "operands": ["a_placed.left", "b_placed.upper_right"], "in": "drive", "min": 0.02, "covers": ["n_gear_clearance"]},
{"id": "r_gear_clearance", "kind": "clearance", "operands": ["a_placed.right", "b_placed.lower_left"], "in": "drive", "min": 0.02, "covers": ["n_gear_clearance"]},
{"id": "r_gap_right_upper_left", "kind": "clearance", "operands": ["a_placed.right", "b_placed.upper_left"], "in": "drive", "min": 0.02, "covers": ["n_gear_clearance"]},
{"id": "r_gap_right_lower_right", "kind": "clearance", "operands": ["a_placed.right", "b_placed.lower_right"], "in": "drive", "min": 0.02, "covers": ["n_gear_clearance"]},
{"id": "r_gap_right_upper_right", "kind": "clearance", "operands": ["a_placed.right", "b_placed.upper_right"], "in": "drive", "min": 0.02, "covers": ["n_gear_clearance"]},
{"id": "r_a_plate_clearance", "kind": "clearance", "operands": ["a_placed.left", "carrier_placed.plate"], "in": "drive", "min": 0.5, "covers": ["n_a_plate_clearance"]},
{"id": "r_a_plate_right", "kind": "clearance", "operands": ["a_placed.right", "carrier_placed.plate"], "in": "drive", "min": 0.5, "covers": ["n_a_plate_clearance"]},
{"id": "r_b_plate_clearance", "kind": "clearance", "operands": ["b_placed.lower_left", "carrier_placed.plate"], "in": "drive", "min": 0.5, "covers": ["n_b_plate_clearance"]},
{"id": "r_b_plate_upper_left", "kind": "clearance", "operands": ["b_placed.upper_left", "carrier_placed.plate"], "in": "drive", "min": 0.5, "covers": ["n_b_plate_clearance"]},
{"id": "r_b_plate_lower_right", "kind": "clearance", "operands": ["b_placed.lower_right", "carrier_placed.plate"], "in": "drive", "min": 0.5, "covers": ["n_b_plate_clearance"]},
{"id": "r_b_plate_upper_right", "kind": "clearance", "operands": ["b_placed.upper_right", "carrier_placed.plate"], "in": "drive", "min": 0.5, "covers": ["n_b_plate_clearance"]},
{"id": "r_a_cover", "kind": "envelope", "subject": "a", "bounds": {"min": [-14.087245141469973, -14.225303498037881, 0], "max": [14.241996580861274, 14.225303498037881, 8]}, "covers": ["n_gear_clearance", "n_a_plate_clearance"]},
{"id": "r_b_cover", "kind": "envelope", "subject": "b", "bounds": {"min": [-31.44090804573435, -31.44090804573435, 0], "max": [31.44090804573435, 31.44090804573435, 8]}, "covers": ["n_gear_clearance", "n_b_plate_clearance"]}
],
"notes": "Reference radii: 1.5*17/2 = 12.75 mm and 1.5*40/2 = 30 mm. Shifts are zero, hence centre distance 12.75+30+1.5*(0+0) = 42.75 mm. Each gear is thinned 0.05 mm at its own reference circle, nominal tangential play contribution 0.05+0.05 = 0.1 mm; the independently stated measured band is [0.05,0.25] mm. B is phased by half its 9-degree pitch (4.5 degrees) in its own geometry before the shared assembly pose. Four stations: B rotates k*9/4 degrees, A rotates -40/17 of that, k=0..3. The assembly applies X23, Y17, Z11 degrees then translation (31,-12,8), with B translated by that same rotation of (42.75,0,0). Both assembly rotations are identical, permitting the exact direction identity proof. Carrier pins are 6 mm; gear bores 6.3 mm; plate z=-5..-2, gears z=0..8, so their nominal plate gap is 2 mm. Whole-part clearance and load are not claimed by gear_mesh; the non-clearance control measures tooth systems, bores, pin cylinders and the four declared pair stations. Expected RELEASE; every required row measured PASS, including gear_mesh at all four stations. A measurement mismatch is a finding; do not alter this document or expected band to hide it. The plate view is the exact intersection of the final connected carrier with the declared local box [-20,-40,-5]..[82.75,40,-2]. It is captured for verification and not delivered as another part. Gear-to-plate vertical separation is 2 mm, above 0.5 mm; pin/bore radial gap stays 0.15 mm and is not a plate-clearance demand. Whole-part gear clearance >=0.02 mm remains a separate exact Linux measurement. Six exact gear views keep every clearance operand below the frozen topology caps: A halves within [-15,15] in x/y and B quadrants within [-32,32], both z=-1..9. All eight gear-piece pairs and all six gear-piece/plate pairs are required, with two full-body envelope guards. The complete twenty-eight-row document is expected RELEASE pending authenticated Linux measurement; no geometry, tolerance, chord or station is changed."
}
hole_styles.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "hole_styles",
"title": "Clamp block: a counterbored hole from the top and a countersunk hole from the front",
"units": {"length": "mm", "angle": "deg"},
"notes": "A style is cut from the entry face: \"at\" lies on that face and \"axis\" points into the block. A counterbored hole takes two hole requirements on one axis: the bore is \"through\" from the far face to the shoulder, and the counterbore is \"blind\", written mouth first, from the entry face to the shoulder. A countersunk hole takes one: \"through\" over the whole thickness, with \"countersink.at\" naming the countersunk end by its station.",
"needs": [
{"id": "n_block", "text": "A 40 x 24 x 16 mm block with z=0 as its base; one closed printable solid."},
{"id": "n_cap_screw", "text": "From the top at (x=12, y=12): a D5.5 through hole with a D10 counterbore 5.5 deep, for an M5 cap screw."},
{"id": "n_flat_head", "text": "From the front face y=0 at (x=30, z=8): a D4.5 through hole with a 90 degree countersink of diameter 9, for an M4 flat-head screw."}
],
"params": [
{"id": "tall", "type": "length", "value": 16},
{"id": "cb_depth", "type": "length", "value": 5.5}
],
"parts": [
{"id": "block", "deliver": "body", "steps": [
{"id": "s1", "op": "box", "bind": "body", "size": [40, 24, "tall"]},
{"id": "cap", "op": "hole", "target": "body", "diameter": 5.5, "at": [12, 12, "tall"], "axis": "-z", "counterbore": {"diameter": 10, "depth": "cb_depth"}},
{"id": "flat", "op": "hole", "target": "body", "diameter": 4.5, "at": [30, 0, 8], "axis": "+y", "countersink": {"diameter": 9, "angle": 90}}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "block", "covers": ["n_block"]},
{"id": "r_env", "kind": "envelope", "subject": "block", "bounds": {"min": [0, 0, 0], "max": [40, 24, "tall"]}, "covers": ["n_block"]},
{"id": "r_cap_bore", "kind": "hole", "subject": "block", "diameter": 5.5, "axis": "z", "axis_at": [12, 12, 0], "through": [0, "tall - cb_depth"], "covers": ["n_cap_screw"]},
{"id": "r_cap_cbore", "kind": "hole", "subject": "block", "diameter": 10, "axis": "z", "axis_at": [12, 12, 0], "blind": {"mouth": "tall", "floor": "tall - cb_depth"}, "covers": ["n_cap_screw"]},
{"id": "r_flat_bore", "kind": "hole", "subject": "block", "diameter": 4.5, "axis": "y", "axis_at": [30, 0, 8], "through": [0, 24], "countersink": {"diameter": 9, "angle": 90, "at": 0}, "covers": ["n_flat_head"]},
{"id": "r_mesh", "kind": "closed_delivered_mesh", "subject": "block", "covers": ["n_block"]}
]
}
lid_on_rim.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "lid_on_rim",
"title": "Box and lid: the lid rests on the rim and its plug clears the walls",
"units": {"length": "mm", "angle": "deg"},
"notes": "Without \"contacts\" touching is a collision. With it the two parts may touch on each declared plane, must actually touch there, must not overlap anywhere, and outside a band of plus or minus \"min\" around the plane must stay at least \"min\" apart. The plane is written in the assembly frame: the rim is at z=20. The lid is made with its seating face on z=0 and the pose lifts it onto the rim.",
"needs": [
{"id": "n_base", "text": "An open-top box 40 x 30 x 20 mm outside with 2 mm walls and floor, z=0 as its base."},
{"id": "n_lid", "text": "A lid: a 40 x 30 x 2 mm plate with a locating plug 3 mm deep underneath."},
{"id": "n_rest", "text": "The lid rests on the rim of the box; no fasteners."},
{"id": "n_gap", "text": "The plug keeps at least 0.2 mm from the box walls."}
],
"parts": [
{"id": "base", "deliver": "body", "steps": [
{"id": "s1", "op": "box", "bind": "body", "size": [40, 30, 20]},
{"id": "s2", "op": "shell", "target": "body", "thickness": 2, "open": {"select": "body.+z", "expect": 1}}
]},
{"id": "lid", "deliver": "body", "steps": [
{"id": "s1", "op": "box", "bind": "body", "size": [40, 30, 2]},
{"id": "s2", "op": "box", "bind": "plug", "size": [35.5, 25.5, 3], "at": [2.25, 2.25, -3]},
{"id": "s3", "op": "union", "target": "body", "tool": "plug"}
]}
],
"assemblies": [
{"id": "closed", "occurrences": [
{"id": "base_1", "part": "base"},
{"id": "lid_1", "part": "lid", "pose": {"translate": [0, 0, 20]}}
]}
],
"requirements": [
{"id": "r_base_solid", "kind": "solid_count", "subject": "base", "covers": ["n_base"]},
{"id": "r_base_env", "kind": "envelope", "subject": "base", "bounds": {"min": [0, 0, 0], "max": [40, 30, 20]}, "covers": ["n_base"]},
{"id": "r_base_floor", "kind": "planar_face", "subject": "base", "normal": "+z", "at": 2, "covers": ["n_base"]},
{"id": "r_base_wall", "kind": "planar_face", "subject": "base", "normal": "+x", "at": 2, "covers": ["n_base"]},
{"id": "r_lid_solid", "kind": "solid_count", "subject": "lid", "covers": ["n_lid"]},
{"id": "r_lid_env", "kind": "envelope", "subject": "lid", "bounds": {"min": [0, 0, -3], "max": [40, 30, 2]}, "covers": ["n_lid"]},
{"id": "r_fit", "kind": "clearance", "operands": ["base_1", "lid_1"], "in": "closed", "min": 0.2, "contacts": [{"planar": {"normal": "+z", "at": 20}}], "covers": ["n_rest", "n_gap"]}
]
}
Mesh statement examples
These 12 complete VXL documents pass the check API with zero errors and warnings. They teach statement syntax and cover their authored needs. They do not claim qualified build RELEASE. The operation examples require closure only; add independent requirements for requested dimensions.
| Document | Teaches |
|---|---|
| import_stl | STL descriptor, explicit units and mesh import; uses cube.stl |
| tessellate | Exact box → mesh, explicit deflection |
| union | Mesh union with two tessellated operands |
| cut | Mesh difference with a binding tool |
| intersect | Mesh intersection with a binding tool |
| cut_box | Centred box cutter and outside retention |
| cut_cylinder | Principal-axis cylinder cutter with explicit directed span |
| cut_plane | Plane cutter retaining the positive side |
| repair | Weld, orient and planar fill-all on a single closed shell |
| decimate | Positive measured-deviation target, preserved boundary and seams |
| place | Rotation followed by translation of mesh coordinates |
| hybrid | Exact source hole at plate@drill; independent final-mesh closure |
From this directory:
vextor vxl asset describe cube.stl --id stock
vextor vxl check import_stl.vxl.json
vextor vxl build import_stl.vxl.json --asset stock=cube.stl --output-dir delivered
The included cube is 684 bytes, 12 outward triangles, with Source-domain digest
a69cd9ee68ec4d963feb163d73c53e8f03a8724111f271bf154c1b9dfd4ff1c3.
Changing source bytes requires a new descriptor; a raw file SHA is not the Source-domain digest.
STL units are declared by the author, because STL contains no unit context. macOS arm64 builds
remain development HOLD. Exact source checkpoints are evidence only: their STEP is not a mesh
delivery member and their facts do not transfer through later mesh editing.
repair.vxl.json starts from one closed tessellated box, so weld/orient/fill are bounded
no-ops. It omits remove_internal_shells: this input has no redundant internal shell to
certify, and that stage correctly refuses without a complete containment and material
preservation proof. Use shell removal only with an input whose internal shells can be proven.
asset describe infers model/stl from a .stl extension (case insensitive), with a 64 MiB
per-source cap. For another filename, select --media-type model/stl explicitly. STEP
retains its 8 MiB cap. The descriptor authenticates bytes; the build worker decodes geometry.
mesh/cut.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_cut",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"tool_stock","op":"box","bind":"tool_source","size":[4,4,4],"at":[8,3,3]},
{"id":"tool_mesh","op":"tessellate","rep":"mesh","source":"tool_source","bind":"tool","deflection":0.01},
{"id":"combine","op":"cut","rep":"mesh","target":"body","tool":"tool"}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
mesh/cut_box.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_cut_box",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"trim","op":"cut","rep":"mesh","target":"body","tool":{"kind":"box","center":[10,5,5],"size":[4,12,12],"keep":"outside"}}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
mesh/cut_cylinder.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_cut_cylinder",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"bore","op":"cut","rep":"mesh","target":"body","tool":{"kind":"cylinder","at":[5,5,0],"axis":"z","diameter":2,"span":[-1,11],"keep":"outside"}}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
mesh/cut_plane.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_cut_plane",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"trim","op":"cut","rep":"mesh","target":"body","tool":{"kind":"plane","at":[0,0,5],"normal":"z","keep":"positive"}}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
mesh/decimate.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_decimate",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"reduce","op":"decimate","rep":"mesh","target":"body","max_deviation":0.01}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
mesh/hybrid.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "hybrid_mesh",
"units": {
"length": "mm",
"angle": "deg"
},
"parts": [
{
"id": "plate",
"rep": "mesh",
"deliver": "mesh",
"steps": [
{"id":"stock","op":"box","bind":"body","size":[20,16,4]},
{"id":"drill","op":"hole","target":"body","diameter":3,"at":[6,6,4],"axis":"-z"},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"body","bind":"mesh","deflection":0.01,"angular":5},
{"id":"trim","op":"cut","rep":"mesh","target":"mesh","tool":{"kind":"box","center":[20,0,0],"size":[2,2,2]}}
]
}
],
"requirements": [
{
"id": "hole",
"kind": "hole",
"subject": "plate@drill",
"diameter": 3,
"axis": "z",
"axis_at": [
6,
6,
0
],
"through": [
0,
4
],
"covers": [
"n_hole"
]
},
{
"id": "closed",
"kind": "closed_delivered_mesh",
"subject": "plate",
"covers": [
"n_closed"
]
}
],
"needs": [
{
"id": "n_hole",
"source": "user",
"text": "The exact source plate has a 3 mm through hole."
},
{
"id": "n_closed",
"source": "user",
"text": "The delivered mesh is closed."
}
]
}
mesh/import_stl.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_import_stl",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"assets":[{"id":"stock","media_type":"model/stl","digest":"a69cd9ee68ec4d963feb163d73c53e8f03a8724111f271bf154c1b9dfd4ff1c3","bytes":684}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"load","op":"import","rep":"mesh","bind":"body","asset":"stock","source_units":"mm"}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
mesh/intersect.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_intersect",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"tool_stock","op":"box","bind":"tool_source","size":[4,4,4],"at":[8,3,3]},
{"id":"tool_mesh","op":"tessellate","rep":"mesh","source":"tool_source","bind":"tool","deflection":0.01},
{"id":"combine","op":"intersect","rep":"mesh","target":"body","tool":"tool"}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
mesh/place.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_place",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"move","op":"place","rep":"mesh","target":"body","place":{"rotate":[{"axis":"z","deg":90}],"translate":[20,0,0]}}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
mesh/repair.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_repair",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"fix","op":"repair","rep":"mesh","target":"body","weld":{"distance":0.001},"orient":true,"fill":{"planarity_tolerance":0.002}}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
mesh/surface_grid_cage.vxl.json
{
"schema":"vextor.vxl.v1",
"id":"torus_cage",
"units":{"length":"mm","angle":"deg"},
"parts":[{"id":"torus","rep":"mesh","steps":[
{"id":"control","op":"surface_grid","rep":"mesh","bind":"control","u":{"range":[0,360],"intervals":16},"v":{"range":[0,360],"intervals":8},"position":["(12mm+3mm*cos(v*1deg))*cos(u*1deg)","(12mm+3mm*cos(v*1deg))*sin(u*1deg)","3mm*sin(v*1deg)"],"wrap":{"u":true,"v":true},"topology":"quad","output":"cage","creases":[{"v":0}]},
{"id":"refine","op":"cage","rep":"mesh","bind":"body","source":"control","rule":"catmull_clark","levels":2}
],"deliver":"body"}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"torus"},{"id":"one","kind":"component_count","subject":"torus","expect":1}]
}
mesh/tessellate.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_tessellate",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
mesh/union.vxl.json
{
"schema":"vextor.vxl.v1", "id":"mesh_union",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered mesh is closed."}],
"parts":[{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"tool_stock","op":"box","bind":"tool_source","size":[4,4,4],"at":[8,3,3]},
{"id":"tool_mesh","op":"tessellate","rep":"mesh","source":"tool_source","bind":"tool","deflection":0.01},
{"id":"combine","op":"union","rep":"mesh","target":"body","tool":"tool"}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
multi_target_hole.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "multi_target_hole",
"title": "Two stacked plates drilled by one hole on their seam, then joined",
"units": {"length": "mm", "angle": "deg"},
"notes": "One hole step with targets drills every listed body at the same point and along the same axis. The point must lie on a flat entry face of each target: here (0, 5, 3) is on the x = 0 face of both plates, on the seam between them, so each plate gets half of the bore and the joined block has one whole bore. The hole requirement measures that whole bore on the joined part.",
"needs": [
{"id": "n_block", "text": "Two 12 x 10 x 3 mm plates stacked along z join into one 12 x 10 x 6 mm block with its low corner at the origin.", "source": "user"},
{"id": "n_bore", "text": "One diameter 2 mm bore goes through the block along x on the seam between the plates, at y = 5, z = 3.", "source": "user"},
{"id": "n_solid", "text": "The joined block is one solid.", "source": "user"},
{"id": "n_mesh", "text": "The block is delivered as a closed mesh.", "source": "user"}
],
"parts": [
{"id": "plate", "deliver": "body", "steps": [
{"id": "low", "op": "box", "bind": "lower", "size": [12, 10, 3]},
{"id": "up", "op": "box", "bind": "upper", "size": [12, 10, 3], "at": [0, 0, 3]},
{"id": "drill", "op": "hole", "targets": ["lower", "upper"], "diameter": 2, "at": [0, 5, 3], "axis": "+x"},
{"id": "join", "op": "union", "target": "lower", "tool": "upper", "bind": "body"}
]}
],
"requirements": [
{"id": "r_plate", "kind": "solid_count", "subject": "plate", "covers": ["n_solid"]},
{"id": "r_plate_env", "kind": "envelope", "subject": "plate", "bounds": {"min": [0, 0, 0], "max": [12, 10, 6]}, "covers": ["n_block"]},
{"id": "r_hole", "kind": "hole", "subject": "plate", "diameter": 2, "axis": "x", "axis_at": [0, 5, 3], "through": [0, 12], "covers": ["n_bore"]},
{"id": "r_plate_mesh", "kind": "closed_delivered_mesh", "subject": "plate", "covers": ["n_mesh"]}
]
}
orthogonal_holes_asymmetric.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "orthogonal_holes_asymmetric",
"title": "Cube with three off-centre orthogonal through holes",
"units": {"length": "mm", "angle": "deg"},
"notes": "A 10 mm cube on z=0 with one D3 through hole along each axis. Every position coordinate is off centre and no hole has two equal coordinates, so a mirrored coordinate or a swapped axis pair moves a hole away from its requirement. The holes pass each other with 1 mm of material between them: a hole requirement measures a whole bore, and bores that cross are not measured.",
"needs": [
{"id": "n_cube", "source": "user", "text": "A 10 x 10 x 10 mm cube with z=0 as the base."},
{"id": "n_holes", "source": "user", "text": "Three diameter 3 mm through holes, one along each of x, y and z."},
{"id": "n_positions", "source": "user", "text": "The z hole is at (x=2.5, y=3), the x hole at (y=7, z=6.5) and the y hole at (x=7.5, z=2.5); the holes pass each other without meeting."},
{"id": "n_solid", "source": "user", "text": "One closed printable solid."}
],
"parts": [
{
"id": "cube",
"role": "deliverable",
"rep": "exact",
"acceptance": "exact_only_v1",
"deliver": "body",
"steps": [
{"id": "s1", "op": "box", "bind": "body", "size": [10, 10, 10]},
{"id": "s2", "op": "hole", "target": "body", "diameter": 3, "at": [2.5, 3, 10], "axis": "-z", "depth": "through"},
{"id": "s3", "op": "hole", "target": "body", "diameter": 3, "at": [10, 7, 6.5], "axis": "-x", "depth": "through"},
{"id": "s4", "op": "hole", "target": "body", "diameter": 3, "at": [7.5, 10, 2.5], "axis": "-y", "depth": "through"}
],
"notes": "Each hole is anchored on the face it enters (z=10, x=10, y=10) and its axis points into the cube; the opposite sign points away from the body and is a check error."
}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "cube", "covers": ["n_solid"]},
{"id": "r_envelope", "kind": "envelope", "subject": "cube", "bounds": {"min": [0, 0, 0], "max": [10, 10, 10]}, "tol": 0.05, "covers": ["n_cube"]},
{"id": "r_hole_z", "kind": "hole", "subject": "cube", "diameter": 3, "axis": "z", "axis_at": [2.5, 3, 0], "through": [0, 10], "tol": {"diameter": 0.05, "position": 0.05}, "covers": ["n_holes", "n_positions"]},
{"id": "r_hole_x", "kind": "hole", "subject": "cube", "diameter": 3, "axis": "x", "axis_at": [0, 7, 6.5], "through": [0, 10], "tol": {"diameter": 0.05, "position": 0.05}, "covers": ["n_holes", "n_positions"]},
{"id": "r_hole_y", "kind": "hole", "subject": "cube", "diameter": 3, "axis": "y", "axis_at": [7.5, 0, 2.5], "through": [0, 10], "tol": {"diameter": 0.05, "position": 0.05}, "covers": ["n_holes", "n_positions"]},
{"id": "r_mesh", "kind": "closed_delivered_mesh", "subject": "cube", "artifact": "stl", "covers": ["n_solid"]}
]
}
outer_diameter.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "outer_diameter",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_diameter", "text": "A complete outward cylindrical wall has diameter 4 mm."},
{"id": "n_axis", "text": "Its axis is Z through XY (0,0)."},
{"id": "n_span", "text": "The complete wall spans z=0..5 mm."},
{"id": "n_solid", "text": "One connected solid is delivered."},
{"id": "n_mesh", "text": "The delivered mesh is closed."}
],
"parts": [
{"id": "shaft", "deliver": "drill", "steps": [
{"id": "tool", "op": "cylinder", "bind": "drill", "diameter": 4, "length": 5}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "shaft", "covers": ["n_solid"]},
{"id": "r_mesh", "kind": "closed_delivered_mesh", "subject": "shaft", "covers": ["n_mesh"]},
{"id": "r_od", "kind": "outer_diameter", "subject": "shaft", "diameter": 4, "axis": "z", "axis_at": [0, 0, 0], "span": {"from": 0, "to": 5}, "covers": ["n_diameter", "n_axis", "n_span"]}
]
}
A rib, transition and pin in one VXL document
Use path_component_kit.vxl.json when the request calls for three separate components with independently checked shape: an asymmetric polygon rib, a rectangular transition and a solid circular pin. The document composes constructions and a reusable requirement fragment; it does not join the deliveries into an assembly.
| Component | Construction and frame | Independent claim |
|---|---|---|
| Rib | sweep from [0,0,0] to [0,0,26], X=+X, Y=+Y; CCW points [0,0], [9,0], [7,4], [0,3] |
r_rib: the same requested contour throughout the complete straight span, with both actual caps and complete side evidence |
| Transition | loft at [30,0,0], local X=+X/Z=+Z; 10×6 rectangle at offset 0 and 14×8.4 rectangle at offset 18 |
r_transition: independently located final frame, ordered contours and linear_vertices law throughout the side domains |
| Pin | pipe from [55,0,0] to [55,0,26], diameter 6 |
r_pin: filled circular caps and complete outward cylindrical wall; no circular in-plane X claim |
The sound_component requirement fragment takes a typed part parameter and expands to
solid_count and closed_delivered_mesh for each final component. Each dimensional need
is separately covered by its geometry row. The requirements explicitly state the requested
values; no requirement is generated from a constructor, selected face name or mesh sample.
Default comparison tolerances remain in force.
The three subjects remain separate so each path requirement addresses a complete final solid. If a later edit joins the rib to a bracket or drills the pin, reconsider the final shape requirements: the original path rows do not certify an intermediate construction or an unobserved remainder. No contact, clearance, load or physical fit is asserted here.
ruled is an alternative construction operation with the same two-section admission and
independent loft_sections claim. Use guided_loft when explicit vertex rails and multiple
stations are needed, with guide_rail for boundary chains and section_frame for the admitted
frame/body law. G0 twist uses fixed-diagonal planar facets; G1/G2 are restricted to station
seams of a constant-section straight translated prism. A finite list of station cuts cannot
prove the surface between them.
A warped loft or ruled side cannot be selected as the face target of a later statement
(VXL-S020), even if its construction name exists. Planar caps and proved planar sides
can use ordinary planar selectors; station datums and G0 side groups are not single faces.
Run vextor vxl check path_component_kit.vxl.json, then build and read every required row
and the authenticated label. The published documentation tests check compilation and
byte identity with its source fixture. A RELEASE claim requires authenticated measurements;
read the path evidence index.
path_component_kit.vxl.json
{
"schema": "vextor.vxl.v1", "id": "path_component_kit", "units": {"length":"mm","angle":"deg"},
"needs": [
{"id":"n_rib","text":"A straight polygon rib runs from [0,0,0] to [0,0,26], with +X as section X and the stated 9 by 4 mm asymmetric contour."},
{"id":"n_transition","text":"A separate transition at [30,0,0] grows from a 10 by 6 mm rectangle to a 14 by 8.4 mm rectangle over 18 mm, with corresponding vertices moving linearly."},
{"id":"n_pin","text":"A separate filled diameter-6 mm pin runs from [55,0,0] to [55,0,26]."},
{"id":"n_deliveries","text":"Each component is one solid with a closed outward delivered mesh."}
],
"defs": [
{"id":"sound_component","category":"requirement","params":[{"id":"of","type":"part"}],"requirements":[
{"id":"self","kind":"solid_count","subject":"$of"},
{"id":"mesh","kind":"closed_delivered_mesh","subject":"$of"}
]}
],
"parts": [
{"id":"rib","deliver":"body","steps":[
{"id":"make","op":"sweep","bind":"body","path":{"from":[0,0,0],"to":[0,0,26]},"x":"+x","profile":{"polygon":{"points":[[0,0],[9,0],[7,4],[0,3]]}}}
]},
{"id":"transition","deliver":"body","steps":[
{"id":"make","op":"loft","bind":"body","at":[30,0,0],"sections":[{"offset":0,"profile":{"rect":{"min":[-5,-3],"max":[5,3]}}},{"offset":18,"profile":{"rect":{"min":[-7,-4.2],"max":[7,4.2]}}}]}
]},
{"id":"pin","deliver":"body","steps":[
{"id":"make","op":"pipe","bind":"body","path":{"from":[55,0,0],"to":[55,0,26]},"diameter":6}
]}
],
"requirements": [
{"id":"r_rib","kind":"swept_section","subject":"rib","path":{"from":[0,0,0],"to":[0,0,26]},"x":"+x","profile":{"polygon":{"points":[[0,0],[9,0],[7,4],[0,3]]}},"covers":["n_rib"]},
{"id":"r_transition","kind":"loft_sections","subject":"transition","frame":{"origin":[30,0,0],"x":"+x","z":"+z"},"sections":[{"offset":0,"profile":{"rect":{"min":[-5,-3],"max":[5,3]}}},{"offset":18,"profile":{"rect":{"min":[-7,-4.2],"max":[7,4.2]}}}],"span":{"law":"linear_vertices"},"covers":["n_transition"]},
{"id":"r_pin","kind":"swept_section","subject":"pin","path":{"from":[55,0,0],"to":[55,0,26]},"profile":{"circle":{"center":[0,0],"diameter":6}},"covers":["n_pin"]},
{"id":"r_rib_sound","use":"sound_component","args":{"of":"rib"},"covers":["n_deliveries"]},
{"id":"r_transition_sound","use":"sound_component","args":{"of":"transition"},"covers":["n_deliveries"]},
{"id":"r_pin_sound","use":"sound_component","args":{"of":"pin"},"covers":["n_deliveries"]}
]
}
place.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "place",
"title": "A drilled arm made along +x at the origin, then turned to lie along +y and moved",
"units": {"length": "mm", "angle": "deg"},
"notes": "\"place\" turns the body about the part origin (rotations in the order written, right-handed), then translates it. +90 about z sends +x to +y and +y to -x, so the arm [0,30] x [0,10] becomes [-10,0] x [0,30] and the translation puts it at [40,50] x [20,50]. Every requirement is written in part coordinates after the move. An envelope given as \"bounds\", or a feature at its final position, catches a wrong sign; an envelope given as \"size\" cannot see a move.",
"needs": [
{"id": "n_arm", "text": "A 30 x 10 x 4 mm arm with a D3 through hole on its centre line, 5 mm from one end."},
{"id": "n_pose", "text": "The arm lies along y and occupies x 40..50, y 20..50, z 0..4."},
{"id": "n_end", "text": "The drilled end is the far one: the hole is at (x=45, y=45)."}
],
"parts": [
{"id": "arm", "deliver": "body", "steps": [
{"id": "s1", "op": "box", "bind": "body", "size": [30, 10, 4]},
{"id": "s2", "op": "hole", "target": "body", "diameter": 3, "at": [25, 5, 4], "axis": "-z"},
{"id": "s3", "op": "place", "target": "body", "place": {"rotate": [{"axis": "+z", "deg": 90}], "translate": [50, 20, 0]}}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "arm", "covers": ["n_arm"]},
{"id": "r_env", "kind": "envelope", "subject": "arm", "bounds": {"min": [40, 20, 0], "max": [50, 50, 4]}, "covers": ["n_arm", "n_pose"]},
{"id": "r_hole", "kind": "hole", "subject": "arm", "diameter": 3, "axis": "z", "axis_at": [45, 45, 0], "through": [0, 4], "covers": ["n_arm", "n_end"]}
]
}
place_asymmetric.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "place_asymmetric",
"title": "One block three times: a quarter turn about x, about y and about z, each followed by its own move",
"units": {"length": "mm", "angle": "deg"},
"notes": "place turns a body about the part origin, rotations in the order written, and then moves it. The block is 2 x 3 x 5 mm with its low corner at (1, 4, 7): no two sides are equal and it does not sit on the origin, so a turn about another axis, a turn with the other sign or a move by other values puts it somewhere else. Each envelope states where the part must be afterwards.",
"needs": [
{"id": "n_px", "text": "Part px, the block turned 90 degrees about x and then moved by (11, 23, 37), spans x 12..14, y 11..16, z 41..44.", "source": "user"},
{"id": "n_py", "text": "Part py, the block turned 90 degrees about y and then moved by (17, 31, 43), spans x 24..29, y 35..38, z 40..42.", "source": "user"},
{"id": "n_pz", "text": "Part pz, the block turned 90 degrees about z and then moved by (19, 29, 47), spans x 12..15, y 30..32, z 54..59.", "source": "user"},
{"id": "n_solid", "text": "Each part is one solid.", "source": "user"},
{"id": "n_mesh", "text": "Each part is delivered as a closed mesh.", "source": "user"}
],
"parts": [
{"id": "px", "deliver": "body", "steps": [
{"id": "make", "op": "box", "bind": "body", "size": [2, 3, 5], "at": [1, 4, 7]},
{"id": "move", "op": "place", "target": "body", "place": {"rotate": [{"axis": "x", "deg": 90}], "translate": [11, 23, 37]}}
]},
{"id": "py", "deliver": "body", "steps": [
{"id": "make", "op": "box", "bind": "body", "size": [2, 3, 5], "at": [1, 4, 7]},
{"id": "move", "op": "place", "target": "body", "place": {"rotate": [{"axis": "y", "deg": 90}], "translate": [17, 31, 43]}}
]},
{"id": "pz", "deliver": "body", "steps": [
{"id": "make", "op": "box", "bind": "body", "size": [2, 3, 5], "at": [1, 4, 7]},
{"id": "move", "op": "place", "target": "body", "place": {"rotate": [{"axis": "z", "deg": 90}], "translate": [19, 29, 47]}}
]}
],
"requirements": [
{"id": "r_px", "kind": "solid_count", "subject": "px", "covers": ["n_solid"]},
{"id": "r_px_env", "kind": "envelope", "subject": "px", "bounds": {"min": [12, 11, 41], "max": [14, 16, 44]}, "covers": ["n_px"], "notes": "A quarter turn about x the other way would put the block at x 12..14, y 30..35, z 30..33."},
{"id": "r_py", "kind": "solid_count", "subject": "py", "covers": ["n_solid"]},
{"id": "r_py_env", "kind": "envelope", "subject": "py", "bounds": {"min": [24, 35, 40], "max": [29, 38, 42]}, "covers": ["n_py"]},
{"id": "r_pz", "kind": "solid_count", "subject": "pz", "covers": ["n_solid"]},
{"id": "r_pz_env", "kind": "envelope", "subject": "pz", "bounds": {"min": [12, 30, 54], "max": [15, 32, 59]}, "covers": ["n_pz"]},
{"id": "r_px_mesh", "kind": "closed_delivered_mesh", "subject": "px", "covers": ["n_mesh"]},
{"id": "r_py_mesh", "kind": "closed_delivered_mesh", "subject": "py", "covers": ["n_mesh"]},
{"id": "r_pz_mesh", "kind": "closed_delivered_mesh", "subject": "pz", "covers": ["n_mesh"]}
]
}
place_named_body.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "place_named_body",
"title": "A plate drilled, then turned and moved, then rounded on an edge named by the faces it was made with",
"units": {"length": "mm", "angle": "deg"},
"notes": "place keeps the names of a body: after the move, body.+x is still the face the box was made with as +x, which now faces +y. The fillet step selects its edge by those names. The requirements do not: each states where the feature must be after the move, in part coordinates, so a name that did not follow the body would leave the rounded edge or the hole somewhere the requirements do not look.",
"needs": [
{"id": "n_plate", "text": "The 10 x 20 x 4 mm plate made with its low corner at (1, 2, 3), turned 90 degrees about z and then moved by (30, 10, 5), spans x 8..28, y 11..21, z 8..12.", "source": "user"},
{"id": "n_hole", "text": "The diameter 1 mm hole drilled before the move goes through the moved plate along z at x = 24, y = 13.", "source": "user"},
{"id": "n_round", "text": "The top edge of the side at y = 21, the side the plate was made with as +x, is rounded to radius 0.5 mm.", "source": "user"},
{"id": "n_solid", "text": "The plate is one solid.", "source": "user"},
{"id": "n_mesh", "text": "The plate is delivered as a closed mesh.", "source": "user"}
],
"parts": [
{"id": "plate", "deliver": "body", "steps": [
{"id": "base", "op": "box", "bind": "body", "size": [10, 20, 4], "at": [1, 2, 3]},
{"id": "bore", "op": "hole", "target": "body", "diameter": 1, "at": [3, 6, 7], "axis": "-z"},
{"id": "move", "op": "place", "target": "body", "place": {"rotate": [{"axis": "z", "deg": 90}], "translate": [30, 10, 5]}},
{"id": "round", "op": "fillet", "target": "body", "radius": 0.5, "edges": {"select": {"edge": ["body.+x", "body.+z"]}, "expect": 1}}
]}
],
"requirements": [
{"id": "r_plate", "kind": "solid_count", "subject": "plate", "covers": ["n_solid"]},
{"id": "r_plate_env", "kind": "envelope", "subject": "plate", "bounds": {"min": [8, 11, 8], "max": [28, 21, 12]}, "covers": ["n_plate"]},
{"id": "r_fillet", "kind": "fillet_radius", "subject": "plate", "radius": 0.5, "between": [{"planar": {"normal": "+y", "at": 21}}, {"planar": {"normal": "+z", "at": 12}}], "covers": ["n_round"], "notes": "The two faces are stated by their planes after the move, not by the names the fillet step used."},
{"id": "r_hole", "kind": "hole", "subject": "plate", "diameter": 1, "axis": "z", "axis_at": [24, 13, 0], "through": [8, 12], "covers": ["n_hole"]},
{"id": "r_plate_mesh", "kind": "closed_delivered_mesh", "subject": "plate", "covers": ["n_mesh"]}
]
}
place_tool_boolean.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "place_tool_boolean",
"title": "A plate bored by a cylinder that is made at the origin and moved to its place before the cut",
"units": {"length": "mm", "angle": "deg"},
"notes": "A Boolean tool is a body like any other: place moves the cylinder, and the cut uses it where it then is. The bore is off the centre of the plate and x differs from y, so a move by other values, or by the two values exchanged, puts it away from where the hole requirement looks.",
"needs": [
{"id": "n_plate", "text": "The plate is 20 x 20 x 5 mm with its low corner at the origin.", "source": "user"},
{"id": "n_bore", "text": "One diameter 4 mm bore goes through the plate along z at x = 7, y = 13.", "source": "user"},
{"id": "n_solid", "text": "The plate is one solid.", "source": "user"},
{"id": "n_mesh", "text": "The plate is delivered as a closed mesh.", "source": "user"}
],
"parts": [
{"id": "plate", "deliver": "body", "steps": [
{"id": "base", "op": "box", "bind": "body", "size": [20, 20, 5]},
{"id": "tool", "op": "cylinder", "bind": "drill", "diameter": 4, "length": 5},
{"id": "move", "op": "place", "target": "drill", "place": {"translate": [7, 13, 0]}},
{"id": "bore", "op": "cut", "target": "body", "tool": "drill"}
]}
],
"requirements": [
{"id": "r_plate", "kind": "solid_count", "subject": "plate", "covers": ["n_solid"]},
{"id": "r_plate_env", "kind": "envelope", "subject": "plate", "bounds": {"min": [0, 0, 0], "max": [20, 20, 5]}, "covers": ["n_plate"]},
{"id": "r_hole", "kind": "hole", "subject": "plate", "diameter": 4, "axis": "z", "axis_at": [7, 13, 0], "through": [0, 5], "covers": ["n_bore"]},
{"id": "r_plate_mesh", "kind": "closed_delivered_mesh", "subject": "plate", "covers": ["n_mesh"]}
]
}
Provisional insert with one open question
Make a 52 × 32 × 9 mm insert for a laboratory liquid-routing fixture, with two 3 × 3 mm rectangular channels centred at y = 9 and y = 23 running through the full x length. Put the channels on the service face.
The fixture frame says +z is up. The gap scan finds the envelope, channel size, count, centres and x direction supplied. The documented min-corner default uses (0,0,0); channel side stations are derived as 9 ± 1.5 and 23 ± 1.5. Only the service face is undetermined:
Is the service face the top (z = 9) face or the bottom (z = 0) face?
A top-open channel occupies z = 6..9; a bottom-open one occupies z = 0..3. These are geometrically different parts. The complete document is a useful provisional top-open preview, with these two metadata entries:
"questions": [{"id":"q_service_face","text":"Is the service face the top (z = 9) face or the bottom (z = 0) face?"}],
"assumptions": [{"id":"a_preview","text":"Provisional preview only: channels open at z=9, occupying z=6..9; the service face remains unconfirmed."}]
The agent says to the user: “Provisional top-open insert; please confirm the service face.” It also repeats the explicit top-or-bottom question above in its answer; the preview remains provisional until the choice is resolved.
- If the request said “top (z = 9)”, z = 6 is derived from the supplied 3 mm depth; no question is needed.
- If no useful preview is wanted, ask in chat and build nothing.
- Declaring “assumed top” without the question is NOT enough: the two readings are different parts.
The requirements measure the envelope, both channel floors and side stations, material volume, one solid and a closed mesh. The volume is 52 × 32 × 9 − 2 × 52 × 3 × 3 = 14040 mm³; it checks the removed material together with the independently located planes.
What check and build say
vxl check accepts the document and reports the open question (VXL-V801, a warning) and the
preview assumption (VXL-V802, information). Its ceiling is HOLD with exactly the cause
question q_service_face open. The build runs, all ten requirements pass and every file is
delivered, but the label stays HOLD while the question is open. The assumption alone does not
cap the label. After the user names the service face, record that answer as a need, parameter or
assumption citing the user and remove the question; there is no resolved flag. With no other
HOLD cause, the answered document can then be labelled RELEASE.
provisional_open_question.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "provisional_open_question",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_envelope", "text": "A 52 × 32 × 9 mm insert for a laboratory liquid-routing fixture; +z is up."},
{"id": "n_channels", "text": "Two 3 × 3 mm rectangular channels centred at y = 9 and y = 23, through the full x length, on the service face (top or bottom remains unconfirmed)."},
{"id": "n_solid", "source": "agent", "text": "Deliver the insert as one closed solid."}
],
"questions": [
{"id": "q_service_face", "text": "Is the service face the top (z = 9) face or the bottom (z = 0) face?"}
],
"assumptions": [
{"id": "a_preview", "text": "Provisional preview only: channels open at z=9, occupying z=6..9; the service face remains unconfirmed."}
],
"parts": [
{"id": "insert", "deliver": "body", "steps": [
{"id": "s_body", "op": "box", "bind": "body", "size": [52, 32, 9]},
{"id": "s_channel", "op": "box", "bind": "channel", "size": [52, 3, 3], "at": [0, 7.5, 6]},
{"id": "s_cut_low", "op": "cut", "target": "body", "tool": "channel", "alias": "channel_low"},
{"id": "s_cut_high", "op": "cut", "target": "body", "tool": "channel", "tool_place": {"translate": [0, 14, 0]}, "alias": "channel_high"}
]}
],
"requirements": [
{"id": "r_envelope", "kind": "envelope", "subject": "insert", "bounds": {"min": [0, 0, 0], "max": [52, 32, 9]}, "covers": ["n_envelope"]},
{"id": "r_channel_floor", "kind": "planar_face", "subject": "insert", "normal": "+z", "at": 6, "near": {"x": [0, 52], "y": ["cy - 1.5", "cy + 1.5"]}, "at_each": [{"vars": ["cy"], "in": [[9], [23]]}], "covers": ["n_channels"]},
{"id": "r_channel_lower_side", "kind": "planar_face", "subject": "insert", "normal": "+y", "at": "cy - 1.5", "near": {"x": [0, 52], "z": [6, 9]}, "at_each": [{"vars": ["cy"], "in": [[9], [23]]}], "covers": ["n_channels"]},
{"id": "r_channel_upper_side", "kind": "planar_face", "subject": "insert", "normal": "-y", "at": "cy + 1.5", "near": {"x": [0, 52], "z": [6, 9]}, "at_each": [{"vars": ["cy"], "in": [[9], [23]]}], "covers": ["n_channels"]},
{"id": "r_material", "kind": "volume_range", "subject": "insert", "min": 14039.99, "max": 14040.01, "covers": ["n_envelope", "n_channels"]},
{"id": "r_solid", "kind": "solid_count", "subject": "insert", "covers": ["n_solid"]},
{"id": "r_mesh", "kind": "closed_delivered_mesh", "subject": "insert", "covers": ["n_solid"]}
]
}
req_chamfer_run.vxl.json
{
"schema": "vextor.vxl.v1",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_chain", "text": "A complete chamfer run of size 1.5 between x=20,y=20 over z=0..12; every segment qualifies."},
{"id": "n_chain_solid", "text": "One connected solid for chain."},
{"id": "n_chain_mesh", "text": "A closed outward manifold delivered mesh for chain."}
],
"parts": [
{"id": "chain", "deliver": "body", "steps": [
{"id": "bridge", "op": "box", "bind": "body", "size": [18, 18, 14], "at": [1, 1, 0]},
{"id": "first", "op": "box", "bind": "first", "size": [20, 20, 5], "at": [0, 0, 0]},
{"id": "finish_first", "op": "chamfer", "target": "first", "distance": 1.5, "edges": {"select": {"edge": ["first.+x", "first.+y"]}, "expect": 1}},
{"id": "join_first", "op": "union", "target": "body", "tool": "first"},
{"id": "second", "op": "box", "bind": "second", "size": [20, 20, 7], "at": [0, 0, 5]},
{"id": "finish_second", "op": "chamfer", "target": "second", "distance": 1.5, "edges": {"select": {"edge": ["second.+x", "second.+y"]}, "expect": 1}},
{"id": "join_second", "op": "union", "target": "body", "tool": "second"}
]}
],
"requirements": [
{"id": "r_chain_solid", "kind": "solid_count", "subject": "chain", "covers": ["n_chain_solid"]},
{"id": "r_chain_mesh", "kind": "closed_delivered_mesh", "subject": "chain", "covers": ["n_chain_mesh"]},
{"id": "r_run", "kind": "finishing_run", "subject": "chain", "between": {"first": {"planar": {"normal": "+x", "at": 20}}, "second": {"planar": {"normal": "+y", "at": 20}}}, "run": {"axis": "z", "from": 0, "to": 12}, "tol": {"support": 0.02, "boundary": 0.03}, "locate": 0.4, "covers": ["n_chain"], "finish": {"chamfer": {"distance": 1.5, "tol": 0.02}}}
],
"id": "req_chamfer_run",
"title": "Complete chamfer run from two explicitly finished source segments, located independently by support planes and interval."
}
req_chamfer_size.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "req_chamfer_size",
"title": "Three chamfers of different sizes on edges along three axes, each measured",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_block", "text": "A 30 x 20 x 10 block with its low corner at (5, -3, 2)."},
{"id": "n_c1", "text": "A local 0.8 chamfer joins the planes x 35 and z 12 along y -3..17."},
{"id": "n_c2", "text": "A local 1.2 chamfer joins the planes y -3 and z 2 along x 5..35."},
{"id": "n_c3", "text": "A local 2 chamfer joins the planes x 5 and y 17 along z 2..12."}
],
"parts": [
{ "id": "block", "deliver": "body", "steps": [
{"id": "s1", "op": "box", "bind": "body", "at": [5, -3, 2], "size": [30, 20, 10]},
{"id": "c1", "op": "chamfer", "target": "body", "distance": 0.8, "edges": {"select": {"edge": ["body.+x", "body.+z"]}, "expect": 1}},
{"id": "c2", "op": "chamfer", "target": "body", "distance": 1.2, "edges": {"select": {"edge": ["body.-y", "body.-z"]}, "expect": 1}},
{"id": "c3", "op": "chamfer", "target": "body", "distance": 2, "edges": {"select": {"edge": ["body.-x", "body.+y"]}, "expect": 1}}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "block", "covers": ["n_block"]},
{"id": "r_envelope", "kind": "envelope", "subject": "block", "bounds": {"min": [5, -3, 2], "max": [35, 17, 12]}, "covers": ["n_block"]},
{"id": "r_c1", "kind": "chamfer_size", "subject": "block", "distance": 0.8, "between": [{"planar": {"normal": "+x", "at": 35}}, {"planar": {"normal": "+z", "at": 12}}], "covers": ["n_c1"], "near": {"x": [33, 35], "y": [-3, 17], "z": [10, 12]}},
{"id": "r_c2", "kind": "chamfer_size", "subject": "block", "distance": 1.2, "between": [{"planar": {"normal": "-y", "at": -3}}, {"planar": {"normal": "-z", "at": 2}}], "tol": 0.02, "covers": ["n_c2"], "near": {"x": [5, 35], "y": [-3, -1], "z": [2, 4]}},
{"id": "r_c3", "kind": "chamfer_size", "subject": "block", "distance": 2, "between": [{"planar": {"normal": "-x", "at": 5}}, {"planar": {"normal": "+y", "at": 17}}], "near": {"x": [5, 8], "y": [14, 17], "z": [2, 12]}, "covers": ["n_c3"]},
{"id": "r_volume", "kind": "volume_range", "subject": "block", "min": 5940, "max": 5964, "covers": ["n_block"]},
{"id": "r_mesh", "kind": "closed_delivered_mesh", "subject": "block", "covers": ["n_block"]}
]
}
req_fillet_general.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "req_fillet_general",
"title": "Fillets between faces that are 45, 60 and 120 degrees apart, each measured",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_stepped", "text": "One stepped prism spans y 7..19 with XZ outline (0,0) (40,0) (40,10) (20,10) (10,20) (0,20)."},
{"id": "n_step_slope", "text": "The edge along y 7..19 at x 20, z 10 has a local radius 2 fillet between the z 10 plane and the plane x + z = 30."},
{"id": "n_slope_top", "text": "The edge along y 7..19 at x 10, z 20 has a local radius 2 fillet between the plane x + z = 30 and the z 20 plane."},
{"id": "n_trapezoid", "text": "One trapezoid prism spans x 41..50 with YZ outline (0,0) (40,0) (30,10 sqrt(3)) (10,10 sqrt(3))."},
{"id": "n_base_corner", "text": "The edge along x 41..50 at y 40, z 0 has a local radius 3 fillet between the z 0 plane and the plane sqrt(3) y + z = 40 sqrt(3)."},
{"id": "n_top_corner", "text": "The edge along x 41..50 at y 30, z 10 sqrt(3) has a local radius 3 fillet between the plane sqrt(3) y + z = 40 sqrt(3) and the z 10 sqrt(3) plane."}
],
"lets": [
{"id": "h", "expr": "10mm * sqrt(3)", "notes": "Height of the trapezoid: 60 degree flanks over a 10 mm run."}
],
"parts": [
{ "id": "stepped", "deliver": "body", "steps": [
{"id": "s1", "op": "extrude", "bind": "body", "plane": "xz", "at": 7, "toward": "+y", "length": 12, "profile": {"path": {"from": [0, 0], "segments": [{"line": [40, 0], "label": "bottom"}, {"line": [40, 10], "label": "right"}, {"line": [20, 10], "label": "step"}, {"line": [10, 20], "label": "slope"}, {"line": [0, 20], "label": "top"}, {"line": [0, 0], "label": "left"}]}}},
{"id": "s2", "op": "fillet", "target": "body", "radius": 2, "edges": {"select": {"any_of": [{"edge": ["body.step", "body.slope"]}, {"edge": ["body.slope", "body.top"]}]}, "expect": 2}}
]},
{ "id": "trapezoid", "deliver": "body", "steps": [
{"id": "s1", "op": "extrude", "bind": "body", "plane": "yz", "at": 50, "toward": "-x", "length": 9, "profile": {"path": {"from": [0, 0], "segments": [{"line": [40, 0], "label": "bottom"}, {"line": [30, "h"], "label": "flank"}, {"line": [10, "h"], "label": "top"}, {"line": [0, 0], "label": "back"}]}}},
{"id": "s2", "op": "fillet", "target": "body", "radius": 3, "edges": {"select": {"any_of": [{"edge": ["body.bottom", "body.flank"]}, {"edge": ["body.flank", "body.top"]}]}, "expect": 2}}
]}
],
"requirements": [
{"id": "r_stepped_solid", "kind": "solid_count", "subject": "stepped", "covers": ["n_stepped"]},
{"id": "r_stepped_envelope", "kind": "envelope", "subject": "stepped", "bounds": {"min": [0, 7, 0], "max": [40, 19, 20]}, "covers": ["n_stepped"]},
{"id": "r_step_slope", "kind": "fillet_radius", "subject": "stepped", "radius": 2, "between": [{"planar": {"normal": "+z", "at": 10}}, {"planar": {"normal": [1, 0, 1], "through": [15, 13, 15]}}], "covers": ["n_step_slope"], "near": {"x": [17, 23], "y": [7, 19], "z": [7, 13]}},
{"id": "r_slope_top", "kind": "fillet_radius", "subject": "stepped", "radius": 2, "between": [{"planar": {"normal": [1, 0, 1], "through": [15, 13, 15]}}, {"planar": {"normal": "+z", "at": 20}}], "covers": ["n_slope_top"], "near": {"x": [7, 13], "y": [7, 19], "z": [17, 23]}},
{"id": "r_stepped_mesh", "kind": "closed_delivered_mesh", "subject": "stepped", "covers": ["n_stepped"]},
{"id": "r_trapezoid_solid", "kind": "solid_count", "subject": "trapezoid", "covers": ["n_trapezoid"]},
{"id": "r_trapezoid_envelope", "kind": "envelope", "subject": "trapezoid", "bounds": {"min": [41, 0, 0], "max": [50, "43 - 3 * sqrt(3)", "h"]}, "covers": ["n_trapezoid"]},
{"id": "r_base_corner", "kind": "fillet_radius", "subject": "trapezoid", "radius": 3, "between": [{"planar": {"normal": "-z", "at": 0}}, {"planar": {"normal": [0, "sqrt(3)", 1], "through": [40, 40, 0]}}], "covers": ["n_base_corner"], "near": {"x": [41, 50], "y": [30, 41], "z": [-1, 7]}},
{"id": "r_top_corner", "kind": "fillet_radius", "subject": "trapezoid", "radius": 3, "between": [{"planar": {"normal": [0, "sqrt(3)", 1], "through": [40, 40, 0]}}, {"planar": {"normal": "+z", "at": "h"}}], "tol": 0.02, "covers": ["n_top_corner"], "near": {"x": [41, 50], "y": [26, 34], "z": [14, 19]}},
{"id": "r_trapezoid_mesh", "kind": "closed_delivered_mesh", "subject": "trapezoid", "covers": ["n_trapezoid"]}
]
}
req_fillet_run.vxl.json
{
"schema": "vextor.vxl.v1",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_chain", "text": "A complete fillet run of size 2 between x=20,y=20 over z=0..12; every segment qualifies."},
{"id": "n_chain_solid", "text": "One connected solid for chain."},
{"id": "n_chain_mesh", "text": "A closed outward manifold delivered mesh for chain."}
],
"parts": [
{"id": "chain", "deliver": "body", "steps": [
{"id": "bridge", "op": "box", "bind": "body", "size": [18, 18, 14], "at": [1, 1, 0]},
{"id": "first", "op": "box", "bind": "first", "size": [20, 20, 5], "at": [0, 0, 0]},
{"id": "finish_first", "op": "fillet", "target": "first", "radius": 2, "edges": {"select": {"edge": ["first.+x", "first.+y"]}, "expect": 1}},
{"id": "join_first", "op": "union", "target": "body", "tool": "first"},
{"id": "second", "op": "box", "bind": "second", "size": [20, 20, 7], "at": [0, 0, 5]},
{"id": "finish_second", "op": "fillet", "target": "second", "radius": 2, "edges": {"select": {"edge": ["second.+x", "second.+y"]}, "expect": 1}},
{"id": "join_second", "op": "union", "target": "body", "tool": "second"}
]}
],
"requirements": [
{"id": "r_chain_solid", "kind": "solid_count", "subject": "chain", "covers": ["n_chain_solid"]},
{"id": "r_chain_mesh", "kind": "closed_delivered_mesh", "subject": "chain", "covers": ["n_chain_mesh"]},
{"id": "r_run", "kind": "finishing_run", "subject": "chain", "between": {"first": {"planar": {"normal": "+x", "at": 20}}, "second": {"planar": {"normal": "+y", "at": 20}}}, "run": {"axis": "z", "from": 0, "to": 12}, "tol": {"support": 0.02, "boundary": 0.03}, "locate": 0.4, "covers": ["n_chain"], "finish": {"fillet": {"radius": 2, "tol": 0.02}}}
],
"id": "req_fillet_run",
"title": "Complete fillet run from two explicitly finished source segments, located independently by support planes and interval."
}
req_sharp_boundary.vxl.json
{
"schema": "vextor.vxl.v1",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_convex", "text": "A connected closed solid with an unbroken sharp convex crease at x=23,y=20 for z=2..14."},
{"id": "n_concave", "text": "A sharp concave crease at x=15,y=10 for z=3..12."},
{"id": "n_convex_solid", "text": "One connected solid for convex."},
{"id": "n_convex_mesh", "text": "A closed outward manifold delivered mesh for convex."},
{"id": "n_concave_solid", "text": "One connected solid for concave."},
{"id": "n_concave_mesh", "text": "A closed outward manifold delivered mesh for concave."}
],
"parts": [
{"id": "convex", "deliver": "body", "steps": [
{"id": "base", "op": "box", "bind": "body", "size": [20, 15, 22], "at": [3, 5, 0]},
{"id": "break_tool", "op": "extrude", "bind": "break_tool", "plane": "xy", "at": 16, "toward": "+z", "length": 1, "profile": {"polygon": {"points": [[22, 20], [23, 19], [24, 19], [24, 21], [22, 21]]}}},
{"id": "cut_break", "op": "cut", "target": "body", "tool": "break_tool"},
{"id": "gap_tool", "op": "box", "bind": "gap_tool", "size": [2, 2, 1], "at": [22, 19, 18]},
{"id": "cut_gap", "op": "cut", "target": "body", "tool": "gap_tool"}
]},
{"id": "concave", "deliver": "body", "steps": [
{"id": "base", "op": "extrude", "bind": "body", "plane": "xy", "at": 3, "toward": "+z", "length": 9, "profile": {"polygon": {"points": [[0, 0], [30, 0], [30, 10], [15, 10], [15, 20], [0, 20]]}}}
]}
],
"requirements": [
{"id": "r_convex_solid", "kind": "solid_count", "subject": "convex", "covers": ["n_convex_solid"]},
{"id": "r_convex_mesh", "kind": "closed_delivered_mesh", "subject": "convex", "covers": ["n_convex_mesh"]},
{"id": "r_concave_solid", "kind": "solid_count", "subject": "concave", "covers": ["n_concave_solid"]},
{"id": "r_concave_mesh", "kind": "closed_delivered_mesh", "subject": "concave", "covers": ["n_concave_mesh"]},
{"id": "r_sharp", "kind": "sharp_boundary", "subject": "convex", "between": {"first": {"planar": {"normal": "+x", "at": 23}}, "second": {"planar": {"normal": "+y", "at": 20}}}, "run": {"axis": "z", "from": 2, "to": 14}, "tol": {"support": 0.02, "boundary": 0.03}, "locate": 0.4, "covers": ["n_convex"]},
{"id": "r_concave", "kind": "sharp_boundary", "subject": "concave", "between": {"first": {"planar": {"normal": "+x", "at": 15}}, "second": {"planar": {"normal": "+y", "at": 10}}}, "run": {"axis": "z", "from": 3, "to": 12}, "tol": {"support": 0.02, "boundary": 0.03}, "locate": 0.4, "covers": ["n_concave"]}
],
"id": "req_sharp_boundary",
"title": "Independent convex and concave planar creases, with two remote breaks outside the requested convex run."
}
req_slot_blind.vxl.json
{
"schema": "vextor.vxl.v1",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_pocket", "text": "A 14 by 6 blind stadium pocket long along X at XY (17,11), open at z=20 with a complete flat floor at z=8."},
{"id": "n_block_solid", "text": "One connected solid for block."},
{"id": "n_block_mesh", "text": "A closed outward manifold delivered mesh for block."}
],
"parts": [
{"id": "block", "deliver": "body", "steps": [
{"id": "base", "op": "box", "bind": "body", "size": [40, 30, 20]},
{"id": "tool", "op": "extrude", "bind": "tool", "plane": "xy", "at": 8, "toward": "+z", "length": 13, "profile": {"slot": {"from": [13,11], "to": [21,11], "width": 6}}},
{"id": "pocket", "op": "cut", "target": "body", "tool": "tool"}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "block", "covers": ["n_block_solid"]},
{"id": "r_mesh", "kind": "closed_delivered_mesh", "subject": "block", "covers": ["n_block_mesh"]},
{"id": "r_pocket", "kind": "slot", "subject": "block", "from": [13,11,0], "to": [21,11,0], "width": 6, "axis": "z", "blind": {"mouth": 20, "floor": 8}, "tol": {"width": 0.02, "length": 0.03, "position": 0, "boundary": 0.04}, "locate": 1.5, "covers": ["n_pocket"]}
],
"id": "req_slot_blind",
"title": "Blind stadium pocket with independently located complete floor, zero position tolerance and explicit positive boundary tolerance."
}
roof_and_skin_panel.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "roof_and_skin_panel",
"title": "A trimmed bicubic-roof stock and a separate 2 mm side panel.",
"units": {
"length": "mm",
"angle": "deg"
},
"surfaces": [
{
"id": "roof",
"degree": [
3,
3
],
"height_field": {
"axis": "+z",
"u": [
0,
12,
24,
36,
48
],
"v": [
0,
10,
20,
30,
40
],
"control_heights": [
[
10,
11,
12,
11,
10
],
[
11,
14,
15,
14,
11
],
[
11,
14,
16,
14,
11
],
[
11,
13,
14,
13,
11
],
[
10,
11,
12,
11,
10
]
]
}
},
{
"id": "skin",
"degree": [
1,
1
],
"height_field": {
"axis": "+x",
"u": [
2,
38
],
"v": [
0,
10
],
"control_heights": [
[
48,
48
],
[
48,
48
]
]
}
}
],
"parts": [
{
"id": "p",
"deliver": "roofed",
"steps": [
{"id": "stock", "op": "box", "bind": "stock", "size": [44, 36, 20], "at": [2, 2, 0]},
{"id": "trim", "op": "trim_to_surface", "target": "stock", "bind": "roofed", "surface": "roof", "keep": "below"}
]
},
{
"id": "panel",
"deliver": "skin_solid",
"steps": [
{"id": "grow", "op": "thicken", "bind": "skin_solid", "surface": "skin", "along": "+x", "distance": 2}
]
}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "p"},
{"id": "r_env", "kind": "envelope", "subject": "p", "bounds": {"min": [2, 2, 0], "max": [46, 38, 14.57328497889526]}},
{"id": "r_roof", "kind": "spline_surface", "subject": "p", "face": "roofed.surface", "nominal": "roof", "trim": "any"},
{"id": "r_probe1", "kind": "surface_probe", "subject": "p", "face": "roofed.surface", "probes": [{"from": [14.25, 11.875, 0], "along": "+z", "expect": 13.56640625}]},
{"id": "r_probe2", "kind": "surface_probe", "subject": "p", "face": "roofed.surface", "probes": [{"from": [24, 20, 0], "along": "+z", "expect": 14.5}]},
{"id": "r_probe3", "kind": "surface_probe", "subject": "p", "face": "roofed.surface", "probes": [{"from": [33.75, 28.125, 0], "along": "+z", "expect": 13.07421875}]},
{"id": "r_wall", "kind": "thickened_wall", "subject": "panel", "faces": ["skin_solid.base", "skin_solid.top"], "mode": "along", "along": "+x", "thickness": 2},
{"id": "r_panel_solid", "kind": "solid_count", "subject": "panel"},
{"id": "r_panel_env", "kind": "envelope", "subject": "panel", "bounds": {"min": [48, 2, 0], "max": [50, 38, 10]}}
]
}
skill_finishing_labelled_plate.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "finishing_labelled_plate",
"notes": "The stock support centroid window x=35..45, y=23..31 surrounds the blank centre (80/2, 52/2) and lies beyond the label region upper y=10+12=22.",
"units": {"length": "mm", "angle": "deg"},
"parts": [
{"id": "reference", "role": "keep_out", "deliver": "body", "steps": [
{"id": "blank", "op": "box", "bind": "body", "size": [80, 52, 11]}
]},
{"id": "plate", "deliver": "body", "steps": [
{"id": "blank", "op": "box", "bind": "body", "size": [80, 52, 11]},
{"id": "stock", "op": "face_offset", "target": "body",
"faces": {"select": "body.+z", "expect": 1}, "distance": 2},
{"id": "taper", "op": "draft", "target": "body",
"faces": {"select": "body.+y", "expect": 1}, "angle": 3,
"pull": "+z", "neutral": {"through": [0, 0, 6]}},
{"id": "blend", "op": "variable_fillet", "target": "body",
"edges": {"select": {"line": {"direction": "+x", "through": [40, 0, 13],
"near": {"y": [0, 0.5], "z": [12.5, 13.5]}}}, "expect": 1},
"run": {"from": [0, 0, 13], "to": [80, 0, 13]},
"radii": {"start": 1, "end": 2}},
{"id": "label", "op": "text", "target": "body",
"content": {"literal": "VXL B8", "font": {"std": "liberation_sans_bold"},
"size": {"glyph_height": 4}},
"mode": "relief", "depth": 0.7,
"placement": {"planar": {
"on": {"select": "stock.face", "expect": 1},
"anchor": [10, 10, 13], "baseline": "+x"}}}
]}
],
"needs": [
{"id": "n_solid", "text": "The plate is one connected solid.", "source": "user"},
{"id": "n_stock", "text": "2 mm of stock stands above the 11 mm reference on +z.", "source": "user"},
{"id": "n_taper", "text": "The +y wall is drafted 3 degrees about z = 6, pulling +z.", "source": "user"},
{"id": "n_blend", "text": "The untouched front/top run is blended from radius 1 to radius 2.", "source": "user"},
{"id": "n_label", "text": "The legend VXL B8 is raised 0.7 mm, 4 mm high, reading +x.", "source": "user"},
{"id": "n_bounds", "text": "The plate fits the 80 by 52 envelope.", "source": "user"}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "plate", "covers": ["n_solid"]},
{"id": "r_stock", "kind": "feature_distance", "operands": ["reference", "plate"],
"between": {
"first": {"planar": {"normal": "+z", "at": 11,
"near": {"x": [35, 45], "y": [23, 31]}}},
"second": {"planar": {"normal": "+z", "at": 13,
"near": {"x": [35, 45], "y": [23, 31]}}}},
"along": "+z", "distance": 2, "covers": ["n_stock"]},
{"id": "r_taper", "kind": "draft_angle", "subject": "plate",
"wall": {"normal": "+y", "through": [0, 52, 0],
"near": {"x": [35, 45], "y": [50, 54]}},
"pull": "+z", "neutral": {"through": [0, 0, 6]}, "angle": 3,
"covers": ["n_taper"]},
{"id": "r_blend", "kind": "variable_fillet_radius", "subject": "plate",
"between": [{"planar": {"normal": "+z", "at": 13,
"near": {"x": [35, 45], "y": [23, 31]}}},
{"planar": {"normal": "-y", "at": 0}}],
"run": {"from": [0, 0, 13], "to": [80, 0, 13]},
"measurement": "stations_v1",
"stations": [{"at": 0.2, "radius": 1.2}, {"at": 0.5, "radius": 1.5},
{"at": 0.8, "radius": 1.8}],
"covers": ["n_blend"]},
{"id": "r_label", "kind": "text", "subject": "plate",
"content": {"literal": "VXL B8", "font": {"std": "liberation_sans_bold"},
"size": {"glyph_height": 4}},
"mode": "relief", "depth": 0.7,
"placement": {"planar": {
"on": {"select": "stock.face", "expect": 1},
"anchor": [10, 10, 13], "baseline": "+x"}},
"region": {"min": [-2, -2], "max": [45, 12]},
"measurement": "outline_depth_v1",
"checks": {"glyph_count": 5, "height": 4},
"covers": ["n_label"]},
{"id": "r_bounds", "kind": "envelope", "subject": "plate",
"bounds": {"min": [0, 0, 0], "max": [80, 52, 14]}, "tol": 0.5,
"covers": ["n_bounds"]}
]
}
skill_import_and_edit.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "skill_import_and_edit",
"title": "A committed STEP block imported by descriptor and then edited",
"units": {"length": "mm", "angle": "deg"},
"notes": "The block is 40 x 24 x 12 mm with its low corner at the origin (volume 40*24*12 = 11520 mm3). It is named by its Source descriptor, not a path: the build supplies the exact bytes under --asset stock=<file>. One direct edit moves the +x face at x = 40 outward by 2.0 mm to 42.0; the added prism is 2.0*24*12 = 576 mm3, so the volume is 11520 + 576 = 12096 mm3 and the body spans [0,0,0]..[42,24,12].",
"assets": [{"id": "stock", "media_type": "model/step", "digest": "a4d4a1d8fdd17e9ac8fb32ac3bc64df55d026b1d69250eedf4505abab6a38abc", "bytes": 15385}],
"parts": [{"id": "p", "deliver": "body", "steps": [
{"id": "load", "op": "import", "bind": "body", "asset": "stock", "source_units": "mm", "heal": {"mode": "none"}},
{"id": "grow", "op": "direct_edit", "target": "body",
"edit": {"kind": "move_outward", "face": {"select": {"planar": {"normal": "+x", "at": 40}}, "expect": 1}, "distance": 2}}
]}],
"requirements": [
{"id": "r_raw", "kind": "import_admission", "subject": "p", "import": "load", "as_read": "exact"},
{"id": "r_move", "kind": "face_displacement", "subject": "p",
"before": {"edit": "grow", "face": {"select": {"planar": {"normal": "+x", "at": 40}}, "expect": 1}},
"after": {"select": {"planar": {"normal": "+x", "at": 42}}, "expect": 1},
"distance": 2},
{"id": "r_env", "kind": "envelope", "subject": "p", "bounds": {"min": [0, 0, 0], "max": [42, 24, 12]}, "tol": 0.01},
{"id": "r_vol", "kind": "volume_range", "subject": "p", "min": 12095.5, "max": 12096.5},
{"id": "r_solid", "kind": "solid_count", "subject": "p"}
]
}
slot_and_chamfer.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "slot_and_chamfer",
"title": "Adjustment plate: a through slot and one chamfered edge",
"units": {"length": "mm", "angle": "deg"},
"notes": "A slot is an extruded \"slot\" profile cut out of the plate; the cutter runs from 1 mm below to 1 mm above so that none of its faces is flush with the plate. \"length\" is overall, over both rounded ends. The slot requirement gives \"center\" as a three-component point [x,y,z]; its component along the separate \"axis\" is ignored, and \"through\" is a two-station array. It names the long direction by a world axis (the profile's \"along\" is a sketch axis, u or v). The chamfer requirement finds its edge by the positions of the two faces, not by the names the chamfer step used, so a chamfer on another edge is not found.",
"needs": [
{"id": "n_plate", "text": "A 60 x 30 x 5 mm plate with z=0 as its base; one closed printable solid."},
{"id": "n_slot", "text": "A 20 x 6 mm slot through the plate, long along x, centred at (x=22, y=18)."},
{"id": "n_chamfer", "text": "A 1.5 mm chamfer on the top front edge, between the front face y=0 and the top face."}
],
"parts": [
{"id": "plate", "deliver": "body", "steps": [
{"id": "s1", "op": "box", "bind": "body", "size": [60, 30, 5]},
{"id": "s2", "op": "extrude", "bind": "cutter", "plane": "xy", "at": -1, "toward": "+z", "length": 7, "profile": {"slot": {"from": [15,18], "to": [29,18], "width": 6}}},
{"id": "s3", "op": "cut", "target": "body", "tool": "cutter"},
{"id": "s4", "op": "chamfer", "target": "body", "distance": 1.5, "edges": {"select": {"edge": ["body.-y", "body.+z"]}, "expect": 1}}
]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "plate", "covers": ["n_plate"]},
{"id": "r_env", "kind": "envelope", "subject": "plate", "bounds": {"min": [0, 0, 0], "max": [60, 30, 5]}, "covers": ["n_plate"]},
{"id": "r_slot", "kind": "slot", "subject": "plate", "from": [15,18,0], "to": [29,18,0], "width": 6, "through": [0, 5], "axis": "z", "covers": ["n_slot"]},
{"id": "r_chamfer", "kind": "chamfer_size", "subject": "plate", "distance": 1.5, "between": [{"planar": {"normal": "-y", "at": 0}}, {"planar": {"normal": "+z", "at": 5}}], "covers": ["n_chamfer"]},
{"id": "r_mesh", "kind": "closed_delivered_mesh", "subject": "plate", "covers": ["n_plate"]}
]
}
split_and_imprint — arithmetic
Read this beside split_and_imprint.vxl.json. Every number the
requirements state is derived here from the box, the cavity, the lip and the groove; no value is
copied from a build.
The two pieces after the split
The source is a 60 x 40 x 30 box with a 56 x 36 x 26 cavity cut at (2, 2, 2), so the cavity spans z = 2..28 and the source volume is
60*40*30 - 56*36*26 = 72000 - 52416 = 19584 mm^3.
split at z = 20 keeps both halves:
- base (negative half), before the lip:
60*40*20 - 56*36*18= 48000 - 36288 = 11712; - lid (positive half), before the groove:
60*40*10 - 56*36*8= 24000 - 16128 = 7872.
Those are the split checkpoints the partition row measures: 11712 + 7872 = 19584 = the source
volume, and every face is planar, so scope: full_v1 certifies all clauses including the volume.
The lip on the base
The registration lip is the ring 58 x 38 - 56 x 36 over z = 18..22, unioned into the base. Its
ring area is 5838 - 5636 = 2204 - 2016 = 188 mm^2. Below z = 20 the ring lies inside the
base's own rim wall (58 < 60, 38 < 40), so it adds material only over z = 20..22:
188 * (22 - 20) = 376 mm^3, base = 11712 + 376 = **12088 mm^3**.
The groove in the lid
The groove is the ring 58.2 x 38.2 - 55.8 x 35.8 over z = 20..22.2, cut from the lid. Its raw
ring area is 58.238.2 - 55.835.8 = 2223.24 - 1997.64 = 225.6 mm^2. The groove's inner rectangle
(a 55.8 x 35.8 window at (2.1, 2.1)) lies inside the cavity, which is already void, so the material
the cut actually removes on each z layer is the ring outside the cavity:
58.2*38.2 - 56*36 = 2223.24 - 2016 = 207.24 mm^2,
removed = 207.24 * 2.2 = 455.928 mm^3, lid = 7872 - 455.928 = **7416.072 mm^3**.
The groove is 0.1 mm wider than the lip on every side: the lip outer wall at x = 1 / y = 1 and the groove outer wall at x = 0.9 / y = 0.9 are 0.1 mm apart, and the lip inner wall at x = 2 / y = 2 and the groove inner wall at x = 2.1 / y = 2.1 are 0.1 mm apart. The lip top at z = 22 and the groove ceiling at z = 22.2 are 0.2 mm apart. The two bodies touch only on z = 20, where the lid's remaining bottom skin (60 x 40 minus 59.1 x 39.1) rests on the base's top ledge (60 x 40 minus 58 x 38) — a contact of positive area on the declared contact plane.
The two sections of the base
- At z = 10 the base is the open tray: outer 60 x 40, hole 56 x 36. area = 2400 - 2016 = 384 mm^2; perimeter = 2*(60+40) + 2*(56+36) = 200 + 184 = 384 mm.
- At z = 21 only the lip stands: outer 58 x 38, hole 56 x 36. area = 2204 - 2016 = 188 mm^2; perimeter = 2*(58+38) + 2*(56+36) = 192 + 184 = 376 mm.
The label on the lid
The imprint sketches a 30 x 10 rectangle at x = 15..45, y = 15..25 on the lid's +z face (z = 30), so
area = 30 * 10 = **300 mm^2**, boundary = 2*(30+10) = **80 mm**, one loop.
The lid top face is solid across 60 x 40 there (the cavity stops at z = 28), so the loop is strictly inside the face and the region is the enclosed face.
The clearance and the label
r_contact declares the z = 20 contact and demands 0.05 mm outside its band. The measured gap
between the lip and the groove walls is 0.1 mm > 0.05 mm, and the two bodies do not overlap
anywhere (the lip sits inside the groove's 0.1 mm clearance), so the contact clause, the no-overlap
clause and the clipped-distance clause all hold. r_cut_skin measures the lid's remaining bottom
face at z = 20 with outward normal -z.
Expected label on the native backend: RELEASE.
split_and_imprint.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "split_and_imprint",
"title": "A two-piece enclosure: a hollow box split at z=20 into a base with a registration lip and a lid with its groove, a label imprinted on the lid top, both bodies delivered.",
"units": {
"length": "mm",
"angle": "deg"
},
"parts": [
{
"id": "enclosure",
"deliver": {
"enclosure_base": "base",
"enclosure_lid": "lid"
},
"steps": [
{
"id": "whole",
"op": "box",
"bind": "body",
"size": [
60,
40,
30
]
},
{
"id": "cavity",
"op": "box",
"bind": "hollow",
"size": [
56,
36,
26
],
"at": [
2,
2,
2
]
},
{
"id": "open",
"op": "cut",
"target": "body",
"tool": "hollow"
},
{
"id": "split",
"op": "split",
"target": "body",
"by": {
"plane": {
"normal": "+z",
"through": [
0,
0,
20
]
}
},
"pieces": [
{
"side": "negative",
"bind": "base"
},
{
"side": "positive",
"bind": "lid"
}
]
},
{
"id": "make_lip",
"op": "box",
"bind": "lip_ring",
"size": [
58,
38,
4
],
"at": [
1,
1,
18
]
},
{
"id": "make_lip_bore",
"op": "box",
"bind": "lip_bore",
"size": [
56,
36,
4
],
"at": [
2,
2,
18
]
},
{
"id": "cut_lip_ring",
"op": "cut",
"target": "lip_ring",
"tool": "lip_bore"
},
{
"id": "lip",
"op": "union",
"target": "base",
"tool": "lip_ring"
},
{
"id": "make_groove",
"op": "box",
"bind": "groove_ring",
"size": [
58.2,
38.2,
2.2
],
"at": [
0.9,
0.9,
20
]
},
{
"id": "make_groove_bore",
"op": "box",
"bind": "groove_bore",
"size": [
55.8,
35.8,
2.2
],
"at": [
2.1,
2.1,
20
]
},
{
"id": "cut_groove_ring",
"op": "cut",
"target": "groove_ring",
"tool": "groove_bore"
},
{
"id": "groove",
"op": "cut",
"target": "lid",
"tool": "groove_ring"
},
{
"id": "mark",
"op": "imprint",
"target": "lid",
"on": {
"select": {
"planar": {
"normal": "+z",
"at": 30
}
},
"expect": 1
},
"sketch": {
"rect": {
"min": [
15,
15
],
"max": [
45,
25
]
}
},
"region": "label"
}
]
}
],
"assemblies": [
{
"id": "enclosure_fit",
"occurrences": [
{
"id": "base_occ",
"part": "enclosure_base"
},
{
"id": "lid_occ",
"part": "enclosure_lid"
}
]
}
],
"requirements": [
{
"id": "n_base",
"kind": "solid_count",
"subject": "enclosure_base"
},
{
"id": "n_lid",
"kind": "solid_count",
"subject": "enclosure_lid"
},
{
"id": "r_parts",
"kind": "partition",
"part": "enclosure",
"split": "split",
"plane": {
"normal": "+z",
"through": [
0,
0,
20
]
},
"pieces": 2,
"per_side": [
1,
1
],
"scope": "full_v1",
"tol": {
"position": 0.01,
"volume": 0.001
}
},
{
"id": "r_wall",
"kind": "section_contour",
"subject": "enclosure_base",
"plane": {
"normal": "+z",
"through": [
0,
0,
10
]
},
"loops": [
{
"role": "outer",
"extent": {
"x": [
0,
60
],
"y": [
0,
40
]
}
},
{
"role": "hole",
"extent": {
"x": [
2,
58
],
"y": [
2,
38
]
}
}
],
"area": {
"min": 383.9,
"max": 384.1
},
"perimeter": {
"min": 383.9,
"max": 384.1
},
"tol": {
"position": 0.01
}
},
{
"id": "r_lip",
"kind": "section_contour",
"subject": "enclosure_base",
"plane": {
"normal": "+z",
"through": [
0,
0,
21
]
},
"loops": [
{
"role": "outer",
"extent": {
"x": [
1,
59
],
"y": [
1,
39
]
}
},
{
"role": "hole",
"extent": {
"x": [
2,
58
],
"y": [
2,
38
]
}
}
],
"area": {
"min": 187.9,
"max": 188.1
},
"perimeter": {
"min": 375.9,
"max": 376.1
},
"tol": {
"position": 0.01
}
},
{
"id": "r_cut_skin",
"kind": "planar_face",
"subject": "enclosure_lid",
"normal": "-z",
"at": 20,
"flatness": 0.01
},
{
"id": "r_label",
"kind": "imprint_region",
"subject": "enclosure_lid",
"on": {
"normal": "+z",
"at": 30
},
"near": {
"x": [
14,
46
],
"y": [
14,
26
]
},
"extent": {
"x": [
15,
45
],
"y": [
15,
25
]
},
"area": {
"min": 299.9,
"max": 300.1
},
"boundary": {
"loops": 1,
"length": {
"min": 79.9,
"max": 80.1
}
},
"tol": {
"position": 0.01
}
},
{
"id": "r_contact",
"kind": "clearance",
"operands": [
"base_occ",
"lid_occ"
],
"in": "enclosure_fit",
"min": 0.05,
"contacts": [
{
"planar": {
"normal": "+z",
"at": 20
}
}
]
}
]
}
spur_gear_pair.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "spur_gear_pair",
"title": "Two bored spur gears in one assembly, kept apart",
"std": "vxl-std-2",
"units": {"length": "mm", "angle": "deg"},
"notes": "Each gear is one std.spur_gear_bored use: a faceted involute spur gear, its centred through bore, and the gear_teeth and hole requirements the recipe bundles. The gear_teeth evaluation is not implemented yet, so its row is a typed not-measured non-pass (HOLD) and the tooth form is not an ISO or AGMA accuracy claim. The clearance is the exact whole-part distance; the two gears here are mounted apart, not meshing.",
"needs": [
{"id": "n_pinion", "text": "A z=17 spur gear, module 1.5 mm, 20 degrees, 8 mm face width, 6.3 mm centred bore, thinned 0.05 mm."},
{"id": "n_wheel", "text": "A z=40 spur gear, module 1.5 mm, 20 degrees, 8 mm face width, 6.3 mm centred bore, thinned 0.05 mm."},
{"id": "n_gap", "text": "The two gear parts stay at least 0.5 mm apart."}
],
"parts": [
{"id": "pinion", "deliver": "body", "steps": [
{"id": "gear", "use": "std.spur_gear_bored", "bind": "body",
"args": {"module": 1.5, "teeth": 17, "face_width": 8, "bore": 6.3,
"pressure_angle": 20, "thinning": 0.05},
"covers": ["n_pinion"]}
]},
{"id": "wheel", "deliver": "body", "steps": [
{"id": "gear", "use": "std.spur_gear_bored", "bind": "body",
"args": {"module": 1.5, "teeth": 40, "face_width": 8, "bore": 6.3,
"pressure_angle": 20, "thinning": 0.05},
"covers": ["n_wheel"]}
]}
],
"assemblies": [
{"id": "pair", "occurrences": [
{"id": "pinion_1", "part": "pinion"},
{"id": "wheel_1", "part": "wheel", "pose": {"translate": [48, 0, 0]}}
]}
],
"requirements": [
{"id": "r_pinion_solid", "kind": "solid_count", "subject": "pinion", "covers": ["n_pinion"]},
{"id": "r_wheel_solid", "kind": "solid_count", "subject": "wheel", "covers": ["n_wheel"]},
{"id": "r_gap", "kind": "clearance", "operands": ["pinion_1", "wheel_1"], "in": "pair",
"min": 0.5, "covers": ["n_gap"]}
]
}
std_plate.vxl.json
{
"schema": "vextor.vxl.v1", "id": "std_plate", "std": "vxl-std-2", "units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_size", "text": "A 60 x 40 x 4 mm plate with z=0 as its base."},
{"id": "n_mount", "text": "An M4 screw hole through the plate at (30, 20)."},
{"id": "n_tool", "text": "A driver bit must reach the screw."},
{"id": "n_datum", "text": "The bottom face is a flat mounting datum."},
{"id": "n_solid", "text": "One closed printable solid."}
],
"params": [
{"id": "bolt", "type": "enum", "value": "M4", "domain": ["M3", "M4", "M5"]}
],
"lets": [
{"id": "hole_d", "expr": "lookup(std_iso_273, bolt, medium)"}
],
"parts": [
{"id": "plate", "deliver": "body", "steps": [
{"id": "s01", "op": "box", "bind": "body", "size": [60, 40, 4]},
{"id": "s03", "use": "std.mount_hole", "target": "body", "args": {"d": "hole_d", "at": [30, 20, 4], "axis": "-z", "thick": 4}, "covers": ["n_mount"]}
]},
{"id": "tool", "use": "std.tool_access", "args": {"of": "plate", "d": 9, "l": 20, "at": [30, 20, 4], "axis": "-z"}, "covers": ["n_tool"]}
],
"requirements": [
{"id": "r_solid", "kind": "solid_count", "subject": "plate", "covers": ["n_solid"]},
{"id": "r_env", "kind": "envelope", "subject": "plate", "bounds": {"min": [0, 0, 0], "max": [60, 40, 4]}, "covers": ["n_size"]},
{"id": "r_bottom", "use": "std.datum_plane", "args": {"of": "plate", "normal": "-z", "at": 0}, "covers": ["n_datum"]}
]
}
Cages, deformation and relief examples
These three complete documents pass the VXL check API with zero errors and warnings. They teach authoring and cover their stated needs; they are not qualified build or RELEASE evidence.
| Document | Teaches |
|---|---|
| deform | Exact → mesh; bend, twist, taper and physical-box lattice; smoothstep region with explicit vertex-count expectation |
| relief | Closed normalized expression rasters; planar, cylindrical and triplanar mapping; frame rotation, signed neutral and fixed displacement direction |
| cage | Authored quad cage and captured grayscale PNG; protected top; midpoint refinement, Taubin smoothing, isotropic remeshing and independent delivered-STL flat_region |
From this directory:
vextor vxl check deform.vxl.json
vextor vxl check relief.vxl.json
vextor vxl check cage.vxl.json
vextor vxl build cage.vxl.json --asset cage=cube.cage.json --asset height=height.png --output-dir delivered
The cube cage is 219 bytes and the height PNG is 69 bytes; the VXL document contains their Source-domain descriptors. Changing either requires refreshing its descriptor. Asset indices describe the authored cage's own topology. They are not evaluated mesh selection ordinals. Full schema, media limits and operation options are in the VXL reference.
flat_region checks only flatness of the selected triangle union, not contact area or global
flatness. Region expectations count current vertices, not faces; all three vertices must match
for a triangle to belong. Earlier edits/refinement can change counts. Inspect the measured
report before claiming acceptance, and add separate dimensional/material requirements for any
additional user need.
surface/cage.vxl.json
{
"schema":"vextor.vxl.v1",
"id":"surface_cage",
"units":{"length":"mm","angle":"deg"},
"assets":[{"id":"cage","media_type":"application/vnd.vextor.cage.v1+json","digest":"f72bf45c474872929a94b6173dd9f5bf23bce55ab09c0c568137a5365a38c4e7","bytes":219},{"id":"height","media_type":"image/png","digest":"d61fc94c086c716eb322b1a8f4db621a11a7b391504fc2f4e8a2355563a15355","bytes":69}],
"needs":[{"id":"n_closed","source":"user","text":"The delivered surface is a closed mesh."},{"id":"n_flat","source":"user","text":"The selected top triangle union stays within 0.001 mm of Z1."}],
"parts": [{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"control","op":"cage","rep":"mesh","bind":"body","asset":"cage","rule":"catmull_clark","levels":0},
{"id":"relief","op":"displace","rep":"mesh","target":"body","map":{"asset":"height"},"mapping":{"kind":"planar","frame":{"axis":"z","rotate":90},"size":[2,2]},"amplitude":0.02,"direction":"z","max_depth":1,"region":{"kind":"halfspace","at":[0,0,-0.99],"normal":"-z","falloff":"constant","expect":[4,4]},"protect":[{"kind":"halfspace","at":[0,0,1],"normal":"z","falloff":"constant","expect":[4,1000]}]},
{"id":"refine","op":"subdivide","rep":"mesh","target":"body","rule":"midpoint","levels":1},
{"id":"relax","op":"smooth","rep":"mesh","target":"body","rule":"taubin","iterations":1,"protect":[{"kind":"halfspace","at":[0,0,1],"normal":"z","falloff":"constant","expect":[4,1000]}]},
{"id":"isotropic","op":"remesh","rep":"mesh","target":"body","target_edge":1,"iterations":1,"protect":[{"kind":"halfspace","at":[0,0,1],"normal":"z","falloff":"constant","expect":[4,1000]}]}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]},{"id":"flat","kind":"flat_region","subject":"part","region":{"kind":"box","min":[-1.1,-1.1,0.99],"max":[1.1,1.1,1.01],"falloff":"constant","expect":[4,1000]},"plane":{"at":[0,0,1],"normal":"z"},"tol":0.001,"covers":["n_flat"]}]
}
surface/deform.vxl.json
{
"schema":"vextor.vxl.v1",
"id":"surface_deform",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered surface is a closed mesh."}],
"parts": [{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"bend","op":"deform","rep":"mesh","target":"body","kind":"bend","frame":{"at":[5,5,0],"axis":"z"},"range":[0,10],"angle":2,"region":{"kind":"box","min":[-1,-1,-1],"max":[11,11,11],"falloff":"smoothstep","width":2,"expect":[8,1000]}},
{"id":"twist","op":"deform","rep":"mesh","target":"body","kind":"twist","frame":{"at":[5,5,0],"axis":"z"},"range":[0,10],"turns":0.01},
{"id":"taper","op":"deform","rep":"mesh","target":"body","kind":"taper","frame":{"at":[5,5,0],"axis":"z"},"range":[0,10],"scale":[1,0.95]},
{"id":"lattice","op":"deform","rep":"mesh","target":"body","kind":"lattice","bounds":{"min":[-20,-20,-20],"max":[20,20,20]},"offsets":[[0.1,0,0],[0.1,0,0],[0.1,0,0],[0.1,0,0],[0.1,0,0],[0.1,0,0],[0.1,0,0],[0.1,0,0]]}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
surface/relief.vxl.json
{
"schema":"vextor.vxl.v1",
"id":"surface_relief",
"units":{"length":"mm","angle":"deg"},
"needs":[{"id":"n_closed","source":"user","text":"The delivered surface is a closed mesh."}],
"parts": [{"id":"part","rep":"mesh","deliver":"body","steps":[
{"id":"stock","op":"box","bind":"source","size":[10,10,10]},
{"id":"mesh","op":"tessellate","rep":"mesh","source":"source","bind":"body","deflection":0.01},
{"id":"planar","op":"displace","rep":"mesh","target":"body","map":{"expr":"x*y","size":[16,16]},"mapping":{"kind":"planar","frame":{"at":[0,0,0],"axis":"z","rotate":90},"size":[10,10],"seam":"shared"},"amplitude":0.02,"direction":"z","max_depth":1,"profile":{"color_space":"linear","addressing":"clamp","interpolation":"linear","neutral":0.5}},
{"id":"cylindrical","op":"displace","rep":"mesh","target":"body","map":{"expr":"(x+y)/2","size":[16,16]},"mapping":{"kind":"cylindrical","frame":{"axis":"z"},"length":10,"seam":"wrapped"},"amplitude":0.01,"direction":"z","max_depth":1},
{"id":"triplanar","op":"displace","rep":"mesh","target":"body","map":{"expr":"(sin(x*90deg)+y)/2","size":[16,16]},"mapping":{"kind":"triplanar","frame":{"axis":"z"},"size":[10,10,10],"sharpness":4,"seam":"blended"},"amplitude":0.01,"direction":"z","max_depth":1}
]}],
"requirements":[{"id":"closed","kind":"closed_delivered_mesh","subject":"part","covers":["n_closed"]}]
}
surface_skin_and_roof.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "surface_skin_and_roof",
"std": "vxl-std-2",
"units": {"length": "mm", "angle": "deg"},
"needs": [
{"id": "n_skin", "text": "A 40 x 30 mm skin sagging 3 mm over a base at z = 5, thickened 2 mm along +z.", "source": "user"},
{"id": "n_roof", "text": "A 48 x 40 mm roof sagging 4 mm over a stock block, trimmed to keep the material below.", "source": "user"}
],
"parts": [
{"id": "panel", "use": "std.skin_panel",
"args": {"size_x": 40, "size_y": 30, "base_z": 5, "sag": 3, "thickness": 2},
"covers": ["n_skin"]},
{"id": "roof", "use": "std.height_field_roof",
"args": {"size_x": 48, "size_y": 40, "base_z": 0, "sag": 4, "offset_x": 0},
"covers": ["n_roof"]}
],
"requirements": []
}
thread_coil_fixture.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "thread_coil_fixture",
"std": "vxl-std-2",
"units": {"length": "mm", "angle": "deg"},
"notes": "Teaching composition: a blind M4 x 0.7 hole in an offset block, a separately placed M4 x 0.7 full-profile stud and a plain round-wire coil. Finite sections and end geometry only; no ISO fit and no spring-stiffness acceptance. Compiler-tested, not a measured native RELEASE.",
"needs": [
{"id": "n_hole", "source": "user", "text": "A blind M4 x 0.7 internal thread in the offset block."},
{"id": "n_stud", "source": "user", "text": "A separately placed M4 x 0.7 full-profile stud with root length 6 mm."},
{"id": "n_coil", "source": "user", "text": "A plain right-hand round-wire coil, mean radius 7 mm, wire 1.4 mm, pitch 3.2 mm, 3.25 turns."}
],
"parts": [
{
"id": "block",
"deliver": "body",
"steps": [
{"id": "blank", "op": "box", "bind": "body", "size": [37, 29, 13], "at": [0, 0, 0]},
{"id": "tap", "use": "std.threaded_hole", "target": "body",
"args": {"major": 4, "pitch": 0.7, "minor": 3.3022277716886164, "depth": 6,
"at": [23, 17, 13], "axis": "-z", "audit_from": 0.7, "audit_to": 5.3},
"covers": ["n_hole"]}
]
},
{
"id": "stud",
"deliver": "body",
"steps": [
{"id": "feature", "use": "std.thread_stud", "bind": "body",
"args": {"major": 4, "pitch": 0.7, "minor": 3.2422277716886163, "length": 6,
"at": [11, 31, 43], "axis": "+x", "audit_from": 0.7, "audit_to": 5.3},
"covers": ["n_stud"]}
]
},
{
"id": "wire",
"deliver": "body",
"steps": [
{"id": "feature", "use": "std.coil", "bind": "body",
"args": {"radius": 7, "wire": 1.4, "pitch": 3.2, "turns": 3.25,
"at": [17, 37, 59], "axis": "+y"},
"covers": ["n_coil"]}
]
}
],
"requirements": [
{"id": "r_block_solid", "kind": "solid_count", "subject": "block"},
{"id": "r_block_mesh", "kind": "closed_delivered_mesh", "subject": "block"},
{"id": "r_stud_solid", "kind": "solid_count", "subject": "stud"},
{"id": "r_stud_mesh", "kind": "closed_delivered_mesh", "subject": "stud"},
{"id": "r_wire_solid", "kind": "solid_count", "subject": "wire"},
{"id": "r_wire_mesh", "kind": "closed_delivered_mesh", "subject": "wire"}
]
}
tray_with_cable_hole.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "tray_with_cable_hole",
"title": "Open tray with a cable hole through one wall",
"units": {"length": "mm", "angle": "deg"},
"notes": "\"shell\" hollows inward: the outer faces stay where the box put them and the opened face is removed. Inner faces have no names; find them by position (outer face plus or minus the wall). The cable hole starts on the inner face of the +x wall and is drilled outward, so the default depth \"through\" crosses that wall only; drilled from outside it would also cross the cavity and the opposite wall. The wall requirement puts its disk on the -x wall straight across from the hole, so it also fails if the drill went on through that wall. Requirements find faces by position, never by construction names.",
"needs": [
{"id": "n_tray", "text": "A tray 80 x 50 x 24 mm outside with z=0 as its base, open at the top."},
{"id": "n_wall", "text": "Floor at z=2; at least 2 mm of material, within tolerance, under the sampled disk on the -x wall."},
{"id": "n_uniform_wall", "text": "Every wall and the whole floor exactly 2 mm thick.", "unmodeled": "The located floor and local wall disk do not certify exact thickness everywhere; v1 has no whole-surface uniform-thickness measurement."},
{"id": "n_cable", "text": "A D8 cable hole through the +x wall at (y=15, z=14)."},
{"id": "n_solid", "text": "One closed printable solid."}
],
"params": [
{"id": "wall", "type": "length", "value": 2}
],
"parts": [
{"id": "tray", "deliver": "body", "steps": [
{"id": "s1", "op": "box", "bind": "body", "size": [80, 50, 24]},
{"id": "s2", "op": "shell", "target": "body", "thickness": "wall", "open": {"select": "body.+z", "expect": 1}},
{"id": "s3", "op": "hole", "target": "body", "diameter": 8, "at": ["80 - wall", 15, 14], "axis": "+x"}
]}
],
"requirements": [
{"id": "r_volume", "kind": "volume_range", "subject": "tray", "min": 18986.5, "max": 18988.5, "covers": ["n_tray"], "notes": "80*50*24 - 76*46*22 - pi*4^2*2 = 18987.47 mm3: requested top-open cavity and one-wall cable bore; opening -y retains 3952 mm3 more material."},
{"id": "r_solid", "kind": "solid_count", "subject": "tray", "covers": ["n_solid"]},
{"id": "r_env", "kind": "envelope", "subject": "tray", "bounds": {"min": [0, 0, 0], "max": [80, 50, 24]}, "covers": ["n_tray"]},
{"id": "r_floor", "kind": "planar_face", "subject": "tray", "normal": "+z", "at": "wall", "covers": ["n_tray", "n_wall"], "notes": "The cavity floor at z=2. This plane alone does not prove an open top; r_volume rejects the side-open alternative."},
{"id": "r_wall", "kind": "minimum_wall", "subject": "tray", "min": "wall", "disk": {"on": {"planar": {"normal": "-x", "at": 0}}, "center": [0, 15, 14], "radius": 3}, "covers": ["n_wall"]},
{"id": "r_cable", "kind": "hole", "subject": "tray", "diameter": 8, "axis": "x", "axis_at": [80, 15, 14], "through": ["80 - wall", 80], "covers": ["n_cable", "n_wall"]},
{"id": "r_mesh", "kind": "closed_delivered_mesh", "subject": "tray", "covers": ["n_solid"]}
]
}
Corpus entry 7 (negative) — underspecified request
This entry is a negative task. Several facts that change the geometry are missing, so the request has no resolved part yet. Ask explicitly for those attributes; an assumed interpretation can be buildable but cannot be presented as finished work.
The request
Can you make a bracket for the sensor panel? It bolts to the desk and has a couple of ribs. Keep the mounting holes clear, and it should print cleanly. Make it in the usual size.
Why it is underspecified
| Missing fact | Why it changes the part |
|---|---|
| Overall size and thickness | No envelope; the "usual size" is not defined. |
| Hole size, count and positions | The bolted interface cannot be placed. |
| Head/counterbore and standard series | Changes hole kind and clearance keep-outs. |
| Rib count, thickness and height | Changes the solid and the root radii. |
| Which face is the mounting datum | Changes the frame and the flat/datum requirements. |
| Printer build volume | May split the part, which v1 cannot express. |
| Direction of the mounting load | May require a fillet/rib the language cannot measure. |
Correct behaviour
- Ask about each undetermined attribute, including features omitted from a draft. Do not ask only whether a proposed bracket is acceptable.
- Ask for the undefined "usual size"; an assumption alone does not resolve it. If the user already authorized choosing that size, identify the authorization and the adopted values.
- With no useful preview, ask in chat and build nothing. A questions-only payload is not a valid
vextor.vxl.v1document: it has no requiredparts. - A useful provisional model may be valid and buildable. Keep unresolved questions in both the
document and the answer, mark preview choices in
assumptions[], and call it provisional until resolved; see the worked insert example.
A chat payload asking about the unresolved attributes (not an uploadable document):
{
"questions": [
{"id": "q_size", "text": "What are the bracket's outer width, arm length and plate thickness?"},
{"id": "q_holes", "text": "What mounting hole count, diameter, thread/series, positions, drilling directions and head/counterbore dimensions are needed?"},
{"id": "q_ribs", "text": "What rib count, thickness, height, positions and orientations are needed?"},
{"id": "q_datum", "text": "Which face is the desk mounting datum — the bottom z=0 face or the back y=0 face?"},
{"id": "q_printer", "text": "What is the printer's build volume, in case the part must fit within it?"},
{"id": "q_load", "text": "In which direction does the mounting load act?"}
],
"assumptions": []
}
questions[] and assumptions[] are reported by vxl check and in the build report, and they
never block the compiler or build. Build admission does not resolve these geometry choices;
the agent asks explicitly and keeps any preview provisional. Derived values, unambiguous
documented defaults and sourced standard dimensions for an already determined component/function
need no question; identify the basis and adopted value. A complete request needs no question.
What this entry teaches
- Ask explicitly about unresolved geometry, even for a feature omitted from a draft.
- An empty
partsarray is invalid, so a "questions-only document" is a chat answer, not a file. - Declaring an assumption does not answer an open geometry question without user authorization.
when_variants.vxl.json
{
"schema": "vextor.vxl.v1",
"id": "when_variants",
"units": {"length": "mm", "angle": "deg"},
"params": [{"id": "reinforced", "type": "bool", "value": false, "domain": ["false", "true"]}],
"parts": [
{"id": "p", "deliver": "body", "steps": [
{"id": "base", "op": "box", "bind": "body", "size": [10, 10, 10]},
{"id": "rib", "op": "box", "bind": "rib", "size": [5, 5, 5], "at": [8, 2, 2], "when": "reinforced"},
{"id": "join", "op": "union", "target": "body", "tool": "rib", "bind": "body", "when": "reinforced"}
]}
],
"requirements": [{"id": "solid", "kind": "solid_count", "subject": "p"}],
"variants": [
{"id": "plain", "overrides": {"reinforced": false}},
{"id": "ribbed", "overrides": {"reinforced": true}}
]
}