# Task index

*"How do I..." jump-in points, each pointing at the file with the real syntax*

Task-shaped jump-in points. Each answer is one or two lines and a pointer: the syntax, a
compiling example and the pitfalls are in the named file under [`features/`](names.md).
Where a file marks something **not built**, it is also recorded by the compiler as skipped, not
an error, so a design that uses it still compiles and silently lacks the cut: read the
file's *Pitfalls* section. Before you rely on a "not built" line here, check `features/INDEX.md`
for a newer file that builds it.

## Shape and material

- **Taper a leg.** `taper start_z= end_z= target_dim= { faces ... }` in the leg's
  `component`. [`edge-and-face-cuts`](edge-and-face-cuts.md).
- **Make a turned part (leg, spindle, chess piece).** `stock <Material> shape=round diameter= z=`
  plus a `section` of `circle` stations. A leg square at the top and turned below keeps square
  `stock` and a `section` that stops short of the top (the pommel). Not built: a non-circular
  varying section, and a mark on the curved surface (only the flat axis ends take marks).
  [`round-stock-sections`](round-stock-sections.md).
- **Cut a curved outline (round top, felloe, bootjack notch).** `cut_path` with `line`, `arc`,
  `polyline`; `keep="inside"` makes the path the new footprint, `keep="outside"` pierces a
  cut-out. A smooth freeform edge (a cloud lift, a serpentine front, a vase splat) is a
  `spline` through points, sampled to a tolerance, and a whole round is a `circle`; a named
  `path <Name> { ... }` holds a compound path. [`cut-paths`](cut-paths.md),
  [`paths-and-splines`](paths-and-splines.md).
- **Round or ease an edge, or rebate it.** `chamfer`, `roundover`, `rabbet` with an `edges`
  child list; selectors include `top_perimeter`, `bottom_perimeter`, `front_perimeter`,
  `top_n ... bottom_w` and the `upright_*` arrises. [`edge-and-face-cuts`](edge-and-face-cuts.md).
- **Bevel an edge.** `bevel angle=35.0 { edges top_s }`, or `bevel face=pos_z edge=neg_y angle=35.0 [depth=]`
  for any edge. `chamfer size=` is the 45 degree equal-leg case. [`bevel-and-rabbet`](bevel-and-rabbet.md).
- **Cut a moulding profile (ovolo, cove, ogee, bead).** `moulding section= size= { edges ... }`;
  `half_round` and `cockbead` are applied strips, their own narrow `component`.
  [`edge-and-face-cuts`](edge-and-face-cuts.md).
- **Cut a slot, not a round hole.** `hole diameter= depth= length= axis=x|y`.
  [`edge-and-face-cuts`](edge-and-face-cuts.md).
- **Level a raked leg's foot to the floor.** `trim reference=world normal=pos_z at=0.0 { faces ... }`;
  name a side face, not the end. [`edge-and-face-cuts`](edge-and-face-cuts.md).
- **Glue up thick stock from boards.** `lamination` is not built as material removal. Model the
  finished thickness as plain `stock` and note it in a comment.
- **Veneer or laminate a face.** `veneer face= material= ...`; a laminate is the same node with
  a `type=sheet` material. [`veneer-and-laminate`](veneer-and-laminate.md).
- **Inlay a banding or stringing line round a panel.** `banding face= material= width= depth= offset=`
  or `stringing face= material= offset=`: one node cuts the groove and generates the flush
  filler, mitred at the corners; `pattern=herringbone`, `angle=90` for cross-banding.
  [`banding-and-stringing`](banding-and-stringing.md).
- **Choose a material, a finish, a display colour.** `material ... finish="'danish oil'"
  color="#c8a06e"`; `color` is presentation only. [`materials-and-hardware`](materials-and-hardware.md).
- **Add a hinge, pull or drawer slide.** A `hardware` catalogue item (a slide takes
  `travel_distance` `slide_depth` `load_kg`), then `hardware_use <Name> qty=` or a
  `hardware_mount` join. It reaches the hardware schedule, never the cut list.
  [`materials-and-hardware`](materials-and-hardware.md).

## Joining two parts

Start at [`joinery-contract`](joinery-contract.md): its kinds table names the file for
every joint, and its layout rule (marks facing each other, male mark on the male's end or
cheek) applies to all of them.

- **Prove a drawer, door or lid can move.** A `travel` child on the `join` that hangs it
  (`travel axis=-y body=assembly`, or `kind=angle` for a hinge). `ww check` sweeps it over its
  range against every other part and names the angle or distance at which anything fouls.
  [`travel`](travel.md).
- **Rail into a leg.** `mortise_and_tenon` ([`joinery-tenons`](joinery-tenons.md)).
- **Make a through tenon stand proud, drawbore, wedge or key it.** `through #true`, `proud`,
  `pin`, `wedge`, `key`: all in [`joinery-tenons`](joinery-tenons.md); each needs a
  square, axis-aligned frame.
- **Join at an angle (splayed leg, dished spoke).** An oblique `mortise_and_tenon`: the tenon
  runs along the male's shoulder normal as placed and may meet the female face up to 45 degrees
  off square. Give the mark an oriented facing with `tilt=` and `heading=` (RFC-0022, built).
  [`joinery-tenons`](joinery-tenons.md), [`components-and-stock`](components-and-stock.md).
  A compound mitre (a leaning, turning corner) is still not synthesised.
- **Join a turned rung into a leg.** `round_tenon diameter= length= clearance=`; it may be
  oblique (up to 45 degrees). [`joinery-tenons`](joinery-tenons.md).
- **Cross two members.** `half_lap`, `cross_lap`, `bridle`; **corner a box or drawer:**
  `box_joint`, `dovetail_through`, `dovetail_half_blind`; **capture a shelf in a housing:**
  `sliding_dovetail`. [`joinery-laps-and-boxes`](joinery-laps-and-boxes.md).
- **Size a dovetail or box joint's pins to the board.** `box_joint`: `pin_count` or
  `finger_width` (not both). Dovetails: `pin_count` or a graduated `repeat` of `pin index=
  width=`, not both. [`joinery-laps-and-boxes`](joinery-laps-and-boxes.md).
- **Mitre a corner or frame a panel.** `miter`, `stile_and_rail`.
  [`joinery-frames`](joinery-frames.md).
- **Use dowels, biscuits, dominos, pocket screws, or a glued seam.**
  [`joinery-fasteners`](joinery-fasteners.md).

## Placement, repetition and reuse

- **Place four legs at four corners.** Anchor each by the corner that lands there (`by
  top_sw/top_se/top_ne/top_nw`, no `rot`), or one anchor with `rot z=0/90/180/270`. Never mix
  the two: it swings the part out of the assembly. [`parts-and-assemblies`](parts-and-assemblies.md).
- **A true left/right pair.** `mirror x=|y=|z=<expr>` on the second `part`, not a `rot` plus
  hand-adjusted offsets. [`parts-and-assemblies`](parts-and-assemblies.md).
- **A row of parts or features.** `repeat <var> count=<n> { ... }` with `id="Name_{var}"`
  wherever an id could collide. Legal in an assembly, a component and a joinery body.
  [`parts-and-assemblies`](parts-and-assemblies.md).
- **Use the built-in drawer or my own library.** `import Alias from="std:drawer"
  export=DrawerBox` or `from="lib/x.kdl"`; override the assembly's params as child nodes on the
  `part`. [`reuse-and-collections`](reuse-and-collections.md).
- **Offer a build variant (face frame or frameless).** `collection` with a `choice`; the
  params are `coll_<name>` and `coll_<choice>_is_<word>`. [`reuse-and-collections`](reuse-and-collections.md).
- **Use an expression or a function.** A quoted string is CEL: `sin cos tan asin acos atan
  atan2 floor ceil round abs min max sqrt pow inch`, in degrees.
  [`project-and-params`](project-and-params.md).
- **Size a speaker port, or see a sealed or ported box's response.** `ac_port_length`,
  `ac_sealed_qtc` in a param; a `driver` and an `analysis` node, read with `ww analyze`.
  Litres, Hz, mm. [`speaker-analysis`](speaker-analysis.md).

## When none of this covers it

If the furniture genuinely has no representation (steam bending, a working
`lamination`), do not invent syntax. Model the closest buildable approximation, add a
`// RFC-NNNN:` comment at the line, and file `docs/rfc/NNNN-short-name.md` per
`docs/KDL_AUTHORING.md` §11. The template requires naming which existing examples you checked,
because a past RFC claimed a gap that `desk.kdl` had already closed.
