# Node router

*Which file documents which node*

This page is a router, not a reference. Each language family has one file under
[`features/`](names.md) with its syntax, a compiling example and its pitfalls. Grep
`features/INDEX.md` (its **Name index** lists every node, joinery kind and property a feature
file declares) or use the table below. The binding contract is `docs/KDL_AUTHORING.md`; where
this directory and that document disagree, the document wins and the disagreement is a bug to
report.

**Facts that apply to every node** (KDL_AUTHORING §1, §4, §7b):

- Dimensions are floats: `19.0`, never `19`. `units=mm` is the only unit; `(in)34.5` is an
  inch literal, `(in)"1-3/4"` (a string) is a fractional-inch literal (`34 1/2`, `3/4`, `1'-2"`), and
  `inch(x)` converts in an expression. `--set`/`overrides` also take length text (`"34 1/2"`, `"12.7mm"`).
- Z is negative going down from a part's top face: `z=0.0` is the top, `z=-90.0` is 90 mm down.
- A **quoted string is a CEL expression**; a **bare word is a name or enum**. `x="width / 2.0"`
  is an expression, `normal=pos_x` is a name. Never quote an enum value.
- Features on one part are order-independent: every cutter is unioned and cut once.
- Enum lists (`edges`, `faces`) are **child nodes**; KDL v2 has no array literal.
- `join` (not `connect`) takes `male=Part@Mark female=Part@Mark`, unquoted.

## Node to file

| You are writing | Nodes | File |
| --- | --- | --- |
| The root, parameters, expressions, limits | `project` `params` `meta` `unit_display`, CEL functions | [`project-and-params`](project-and-params.md) |
| Materials, finish, colour, purchased hardware | `materials` `material` `hardware` `hardware_use` `hardware_mount` `finish` `color` | [`materials-and-hardware`](materials-and-hardware.md) |
| A part template, its stock, grain and marks | `component` `stock` `mark` `tilt=` `heading=` | [`components-and-stock`](components-and-stock.md) |
| A part that moves (drawer, door, lid, vise chop): checked over its travel | `travel` | [`travel`](travel.md) |
| Placing parts | `assembly` `part` `by` `pos` `rot` `mirror` `repeat` `role=reference` | [`parts-and-assemblies`](parts-and-assemblies.md) |
| Importing or choosing a build variant | `import` `collection` `choice` `slots` `construction` | [`reuse-and-collections`](reuse-and-collections.md) |
| Cuts into a face or edge | `dado` `groove` `rabbet` `chamfer` `roundover` `moulding` `taper` `hole` `trim` | [`edge-and-face-cuts`](edge-and-face-cuts.md) |
| A cut-out or curved outline | `cut_path` `line` `arc` `polyline` `path` | [`cut-paths`](cut-paths.md) |
| A smooth spline edge, a named compound path | `spline` `circle` `path` `cut_path` | [`paths-and-splines`](paths-and-splines.md) |
| Veneer or laminate faces | `veneer` `match` | [`veneer-and-laminate`](veneer-and-laminate.md) |
| Turned parts | `shape=round` `section` `circle` `pommel` | [`round-stock-sections`](round-stock-sections.md) |
| A member curved along its own length (a crest rail, a splat) | `bend` `arc` `spline` | [`curved-members`](curved-members.md) |
| Any joint: marks, `join`, clearance, which kind | `joinery` `join` `butt` | [`joinery-contract`](joinery-contract.md) |
| Dowels, pocket holes, biscuits, dominos, edge glue | `dowel` `pocket_hole` `biscuit` `domino` `edge_glue` | [`joinery-fasteners`](joinery-fasteners.md) |
| Mortise and tenon, round tenon, pin, wedge, key | `mortise_and_tenon` `round_tenon` | [`joinery-tenons`](joinery-tenons.md) |
| Laps, bridles, box joints, dovetails | `half_lap` `cross_lap` `bridle` `box_joint` `dovetail_*` `sliding_dovetail` | [`joinery-laps-and-boxes`](joinery-laps-and-boxes.md) |
| Mitres, panel-frame corners | `miter` `stile_and_rail` | [`joinery-frames`](joinery-frames.md) |

`features/INDEX.md` is generated from the files' front matter and also lists any family file
added after this table was written. **Check it first.**

## Words that are accepted but cut nothing

The parser knows these names; the build records them as **skipped** (scene JSON `"skipped"`,
and a `ww check` warning) instead of failing, so a design with one still compiles and does
not do what you meant.

- `lamination`: glued-up stock, not material removal. Model the finished thickness as plain
  `stock`.
- `pocket`, `mortise`, `tenon`, `dovetail` written as a **feature**: these are joints. Write
  a `joinery` and a `join`.

## Limits (compiler-enforced, the same in CLI, server and browser)

Source 256 KiB; nesting depth 64; 2,000 parts and 1,000 features per part after every
`repeat` expands; one `repeat` 4,096 iterations (nested ones multiply). The diagnostic names
the limit it hit. Details: `features/project-and-params.md`.
