---
title: "Error codes"
description: "Every code the pipeline can emit, grouped by prefix, with the explanation written for a model repairing a document rather than a developer reading a stack trace."
url: https://kaicad.barpom.xyz/docs/validation/error-codes
schema: "0.1"
source: packages/spec/src/codes.ts
generated: true
---

# Error codes

Every code kaicad can emit. The registry is **append-only**: a code that has been seen by
someone's LLM, or counted in an evaluation run, keeps meaning the same thing forever.
Retiring a rule marks its code retired and never reuses the number.

The explanations below are written for a model repairing a document. That is a docs decision
that lives in code — they are stored beside the registry, in `packages/spec/src/codes.ts`, so the report, the
authoring pack and this page cannot disagree.

| Prefix | Owns | Codes |
| --- | --- | --- |
| `SCH-` | Schema and document structure | 6 |
| `RES-` | Resolution — parameters, expressions, catalogue lookups | 9 |
| `GEO-` | Geometry and assembly | 8 |
| `FAS-` | Fasteners and fixtures | 8 |
| `MFG-` | Manufacturing and stock | 6 |
| `STR-` | Structural | 4 |
| `DOM-` | Domain rules and standards | 4 |
| `PTH-` | Paths and service voids | 3 |

## SCH — Schema and document structure

### SCH-001

**The document is not valid YAML** · default severity: error

The file could not be parsed. Most often an indentation error, or a value containing a colon that needs quoting.

### SCH-002

**The document does not match the schema** · default severity: error

A required key is missing, or a value has the wrong type. The path points at the exact location.

### SCH-003

**Unknown schema version** · default severity: error

The `schema:` line names a version this build does not know. Get the current authoring pack from the app.

### SCH-004

**The document was written for an older schema** · default severity: warning

The design was migrated forward automatically. It will keep compiling, but regenerate it from the current pack when convenient.

### SCH-005

**Units other than millimetres** · default severity: error

This format is metric only. Every length is a number of millimetres.

### SCH-006

**Duplicate identifier** · default severity: error

Two parts, materials, parameters or joints share an id. Ids must be unique.

## RES — Resolution — parameters, expressions, catalogue lookups

### RES-001

**Expression could not be parsed** · default severity: error

The expression language supports arithmetic, comparison, min, max, round, ceil, floor, abs, and references to parameters, materials, parts and catalogue values. Nothing else.

### RES-002

**Reference to something that does not exist** · default severity: error

An expression names a parameter, material, part or catalogue entry that is not in the document.

### RES-003

**Circular reference between derived values** · default severity: error

Two or more derived parameters depend on each other, so neither can be computed.

### RES-004

**Parameter is outside its declared range** · default severity: error

The value given falls outside the `min`/`max` the parameter itself declares.

### RES-005

**Catalogue entry not found** · default severity: error

A material, fixture or standard id does not exist in the pinned catalogue. Check the catalogue reference in the authoring pack.

### RES-006

**Feature position is over- or under-specified** · default severity: error

Give exactly one of `at`, `center`, or a `from`/`to` pair. Giving several is ambiguous; giving none leaves the feature unplaced.

### RES-007

**Anchor path does not resolve** · default severity: error

A mate names a part, instance or anchor that does not exist. Anchor paths look like `side_rail@left:face.start`.

### RES-008

**Expression produced a value of the wrong kind** · default severity: error

A length expression returned a string or a boolean, or a count returned a fraction.

### RES-009

**Material narrowed to a stock size that is not made** · default severity: error

The thickness or width asked for is not available in that species and class. The suggestion lists the nearest real sizes.

## GEO — Geometry and assembly

### GEO-001

**Parts overlap** · default severity: error

Two solids occupy the same space. Usually a mate that needs an offset, or a missing joint.

### GEO-002

**Part is not connected to anything** · default severity: error

The part has no joint to any other part, so it would fall on the floor. Every part needs at least one joint, directly or through a group.

### GEO-003

**Feature falls outside the blank** · default severity: error

A feature is positioned past the edge of the board it is cut into.

### GEO-004

**Feature removes too much material** · default severity: warning

A cut leaves less than a third of the board thickness behind, which is fragile in solid wood.

### GEO-005

**Features intersect each other** · default severity: warning

Two cuts in the same part overlap. Sometimes intentional, often a sign of a position error.

### GEO-006

**The assembled piece exceeds its declared envelope** · default severity: error

The finished dimensions are larger than `requirements.max_envelope` allows.

### GEO-007

**No ground part** · default severity: error

Nothing is held still, so the assembly has no fixed reference. Name one part in `assembly.ground`.

### GEO-008

**Mate leaves the roll undetermined** · default severity: warning

The default roll was used because the two anchors do not fix it. Add `align.roll` if the part is rotated the wrong way.

## FAS — Fasteners and fixtures

### FAS-001

**Fastener is too close to an edge** · default severity: error

Driving a screw nearer the edge than the fixture allows splits the board. The suggestion gives the minimum distance for this fixture and species.

### FAS-002

**Fastener is too close to an end** · default severity: error

End grain splits more readily than edge grain, so the end distance is larger.

### FAS-003

**Insufficient engagement in the receiving part** · default severity: error

The screw does not reach far enough into the second board to hold. Either use a longer fastener or a thinner first board.

### FAS-004

**Fastener would break through the far face** · default severity: error

The fastener is longer than the material behind it.

### FAS-005

**Fastener driven into end grain** · default severity: warning

End-grain screw holding is roughly half of face-grain holding. Consider a dowel, an insert or a different joint.

### FAS-006

**Fasteners are spaced too closely** · default severity: warning

Closely spaced fasteners along the grain can split a board.

### FAS-007

**Joint declared removable but uses glue** · default severity: error

`requirements.knock_down` is set, but this joint is glued, so the piece cannot be taken apart.

### FAS-008

**No fixture given for a hardware joint** · default severity: error

Joint kinds other than `butt` and `glue_only` need a `fixture:`.

## MFG — Manufacturing and stock

### MFG-001

**Part is longer than any available board** · default severity: error

No stock length in the catalogue can produce this part.

### MFG-002

**Part is wider than the stock it is cut from** · default severity: error

The part needs a glue-up, or a wider board. Say which in the design rather than leaving it implied.

### MFG-003

**Part exceeds the declared maximum part length** · default severity: error

`requirements.max_part_length` exists because the piece has to get into the room. This part will not.

### MFG-004

**Feature needs a tool that is not available** · default severity: warning

The design uses a cut the declared `requirements.tools` cannot make. The suggestion names an alternative joint.

### MFG-005

**Sheet yield is poor** · default severity: info

The parts nest badly on the sheet. A small dimension change may save a sheet.

### MFG-006

**Rounded dimension breaks a clearance that the exact value passed** · default severity: warning

The cut list shows a rounded number that would fail a check the model passed. D13: cut to the exact figure, or change the design so the rounded one works.

## STR — Structural

### STR-001

**Deflection exceeds the limit** · default severity: error

Under the declared load the member sags more than `requirements.deflection_limit`. The suggestion gives the depth that would satisfy it.

### STR-002

**Shelf sag exceeds the limit** · default severity: warning

The shelf span is too long for its material and thickness. Add a support, thicken it, or add a stiffening edge.

### STR-003

**Wood movement is not accommodated** · default severity: warning

A wide solid-wood panel is fixed across its width, so seasonal movement will split it or push the joint apart.

### STR-004

**Racking resistance is inadequate** · default severity: warning

The frame has no panel, brace or fixed back to resist being pushed sideways.

## DOM — Domain rules and standards

### DOM-001

**Slat gap exceeds the standard maximum** · default severity: error

Mattress warranties and support both depend on the gap between slats. The suggestion gives the slat count that closes it.

### DOM-002

**A required standard is not satisfied** · default severity: error

The design lists a standard in `requirements.must_satisfy` and does not meet it.

### DOM-003

**Dimension is outside the ergonomic range** · default severity: warning

Seat, table and counter heights have narrow comfortable ranges. The suggestion gives the range for this item type.

### DOM-004

**Mattress clearance is too tight or too loose** · default severity: warning

Too tight and the mattress will not drop in; too loose and it slides around.

## PTH — Paths and service voids

### PTH-001

**Cable path is not continuous** · default severity: error

A declared path has a gap: no grommet, notch or void connects two segments.

### PTH-002

**Service void is unreachable** · default severity: warning

There is no access to the void once the piece is assembled.

### PTH-003

**Path is too tight for the declared cable bundle** · default severity: warning

The smallest cross-section on the path is smaller than the bundle it must carry.
