Skip to main content

The diagnostic code index

Every message koyu check returns, catalogued. There are 65 codes in 19 families: 49 errors and 16 warnings. This page shows which family a code belongs to and how heavy it is. The cause, a minimal reproduction, and the fix live on the family pages.

What check tells you stops at whether what is written is self-consistent as data. It says nothing about whether the building is usable — that is what koyu validate says, separately, with its 15 rules. The two are different types: check returns Diagnostic { code, severity } and validate returns Finding { rule, level }. Even the spellings differ on sight — a code is three letters plus two digits, a rule is chapter.rule (site.escape).

The human-facing check does not display codes. Get the code with --json before looking anything up here; the procedure is on Reading a diagnostic.

There are only two severities

severityMeaningcheck exit codecheck --strict exit code
errorThe composition does not stand up; no single shape can be made from what is written11
warningSuspect. It does stand up, and the shape is still determined01

Severity is an invariant property of a code. The same code is never an error in one file and a warning in another. When the weight has to change, the existing code keeps its severity and a new code is minted.

Looking up by symptom

SymptomCodes to look at
You wrote a boundary and were told the spaces "do not touch"BND04
You placed a door or window and were told "there is more than one segment"OPN05
You cannot get a window onto an external wallOPN04 OPN05
You wrote a stair or a void and were told offVRT01 VRT02 VRT03
You put a door on a stair and were told it "is not interpreted"VRT05
You laid out spaces and were told "the regions overlap"GEO02
The overlap appeared while subdividing a dwelling into roomsGEO02 — the fix is not the layout
A path on a boundary is reported undefinedREF01
A floor finish written as an area will not passSEG01 SEG02
You thought you wrote a level and were told "its level cannot be determined"SUF02
The floor-height arithmetic does not passHGT01 HGT02
No ceiling height or slab thickness written, and neither ceilings nor floors are generatedSUF01 SUF03
You wrote an attribute and it had no effectATT01 ATT02 ATT03
The site's figures do not agreecheck does not say — koyu validate's site.escape / site.area do
The stair's going or slope is crampedcheck does not say — koyu validate's stair.proportion / run.slope do
There is a hole in the envelopecheck does not say — koyu validate's envelope.gap does
The file dies without a single line being readSYN01

Every code

The order is the ledger's.

REF — references (1)

CodeseverityOne line
REF01errorReferences an undefined space

BND — boundaries (6)

CodeseverityOne line
BND01errorA boundary between a space and itself
BND02errorA duplicate boundary
BND03errorA wall boundary to a space on a different level
BND04errorThe spaces do not touch, so no boundary can be derived
BND05warningEdge-restricted and unrestricted boundaries coexist on one pair
BND06warningNo edge remains on the perimeter, so the segment is of zero length

LVL — levels (1)

CodeseverityOne line
LVL01errorTwo levels have the same z

GEO — overlapping regions (2)

CodeseverityOne line
GEO01errorThe regions of one space overlap each other
GEO02errorThe regions of two spaces overlap

VRT — vertical boundaries (6)

CodeseverityOne line
VRT01errorA vertical boundary needs a region and a level on both sides
VRT02errorA vertical boundary spans one step between adjacent levels
VRT03errorThe spaces of a vertical boundary do not overlap in plan
VRT04warningThe space above a void boundary is not type:void
VRT05warningAn opening on a vertical boundary is not interpreted
VRT06warningA seg on a vertical boundary is not interpreted

OPN — openings (8)

CodeseverityOne line
OPN01errorThe wrong axis for hinge
OPN02errorThe openings overlap
OPN03warningAn opening on an open boundary has no effect on passage
OPN04errorThere is no boundary segment on which to place the opening
OPN05errorThere is more than one boundary segment — ambiguous
OPN06errorThe opening is wider than the boundary segment
OPN07errorThe wrong axis for an explicit opening position
OPN08errorAn explicit opening position runs off the segment

SEG — uncounted subdivisions (8)

area (inside a room) is SEG01–SEG02; seg (along a boundary) is SEG03–SEG08.

CodeseverityOne line
SEG01errorAn area on a space with no region
SEG02warningAn area spills outside the region
SEG03warningA seg on an open boundary is not interpreted
SEG04errorThere is no boundary segment on which to place the seg
SEG05errorThere is more than one boundary segment for the seg — ambiguous
SEG06errorThe seg is wider than the boundary segment
SEG07errorThe wrong axis for an explicit seg position
SEG08errorAn explicit seg position runs off the segment

ZON — zones (2)

CodeseverityOne line
ZON01warningThere are no spaces beneath the zone
ZON02warningA space shares its path with a zone

HGT — the height invariant (2)

CodeseverityOne line
HGT01errorIt collides into the floor above
HGT02errorInsufficient coverage for a partial void

SUF — sufficiency (4)

CodeseverityOne line
SUF01errorThe ceiling height cannot be determined; no ceiling and no roof can be generated
SUF02errorThe level cannot be determined; not one solid can be generated
SUF03warningThe level has no slab, so not one floor is generated
SUF04warningA vertical-circulation declaration produces no shape at all

SIT — site outline (3)

CodeseverityOne line
SIT01errorThe site shape has a duplicate vertex
SIT02errorThe site shape is self-intersecting
SIT04warningNo zone corresponds to the polygon

SIT03 and SIT05 are retired numbers.

UID — identity (4)

CodeseverityOne line
UID01errorA uid cannot be a token of digits alone
UID02errorA uid cannot contain whitespace
UID03errorA duplicate uid
UID04errorA duplicate name within one container

ATT — attributes (3)

CodeseverityOne line
ATT01errorThe attribute takes a positive number
ATT02errorThe value is not in the ledger's vocabulary
ATT03errorThe key is not in the ledger and carries no namespace

DAY — daylight scope (1)

CodeseverityOne line
DAY01errordaylight is either 1 (in scope) or 0 (out of scope)

RUN — vertical circulation (4)

CodeseverityOne line
RUN01errorMore than one vertical-circulation declaration on one space
RUN02errorThe value must be a direction of travel, N/E/S/W
RUN03errorThe region is not a single rectangle, or the level is unknown
RUN05errorform is invalid, or the shape is not determined

RUN04, RUN06, RUN07 and RUN08 are retired numbers.

LIN — drawn lines (3)

CodeseverityOne line
LIN01errorThe line does not separate the two spaces
LIN02errorA vertical boundary cannot carry a line
LIN03warningThe line cuts nothing

COL — columns (2)

CodeseverityOne line
COL01warningNot one column stands for this declaration
COL02warningAn earlier declaration already took the same intersections

VER — language-version acceptance (4)

CodeseverityOne line
VER01errorA koyu 0.1 file has a touching pair with no boundary declared
VER02errorA koyu 0.3-or-earlier file has a habitable type with no daylight
VER03errorA koyu 0.4-or-earlier file uses 0.5 vocabulary
VER04errorA koyu 0.5-or-earlier file uses 1.0 vocabulary

SYN — syntax and composition (1)

CodeseverityOne line
SYN01errorA syntax or composition error

SYN01 is not a check of its own but the exception thrown while reading, copied into a single diagnostic. It appears only under check --json — without --json, check prints the exception as it is and exits 1.

Retired numbers

Numbers are never reused. Reusing one would make past output unreadable. Eleven are retired: six moved to koyu validate rules and four folded into the SUF family. What replaced what is on Retired diagnostic codes.

BND07 HGT03 HGT04 HGT05 RUN04 ENV01 RUN06 RUN07 RUN08 SIT03 SIT05

What a green check has not looked at

Green means the composition is self-consistent as data and a shape can be made from what is written. It says nothing about architectural validity. Two things in particular walk straight through it.

A sealed building. The default between touching spaces is a wall, and a wall is impassable without a door. A two-storey house with not one door written is green and completely sealed.

koyu doors <file> /L2/bed /out/road

If that answers "unreachable", the circulation is not connected. koyu validate's access.unreachable says the same thing as a violation.

Daylight. Not one window is needed to be green. koyu light <file> gives the 1/7 judgement per room, and koyu validate's daylight.ratio reports it as a violation.

How to call check and its flags is on koyu check; the validation surface is on koyu validate.