Skip to main content

Look up a diagnostic by symptom

Human-readable check output carries no diagnostic codes. All you get is file:line: message. When what you have in hand is that message — or nothing but a feeling that something is off — start here.

If you already have a code, the diagnostic code index is faster.

Get the code

--json prints the same diagnostics with their codes.

koyu check bad.muro --json
[
 {
  "code": "SUF01",
  "severity": "error",
  "message": "The ceiling height of /L1/a cannot be determined (neither the space's h: nor level L1's h: is there)",
  "line": 4,
  "file": "<absolute path>/noh.muro",
  "path": [
   "/L1/a"
  ]
 }
]

message is the body only — no position prefix. The position lives in line and file. The full reading procedure is on Reading a diagnostic.

There are only two severities. error means the composition does not stand (exit code 1); warning means it stands but is suspect (exit code 0, or 1 under --strict). Severity is an invariant property of the code and never varies by case.

1. check stops with an error

Message bodies can be searched for verbatim. Below are fragments of them.

What you seeCauseFixCode
Undefined grid line name: X1No grid, or it sits after the line that uses the grid referenceWrite grid X and grid Y before the first line that uses them → Common trapscomposition error
A region is given as two ranges, X?..X? and Y?..Y?Almost always the type (second positional argument) is missing, so the first half of the region is read as the typeWrite space <path> <type> X?..X? Y?..Y? in that order → Common trapscomposition error
has a region, but its level cannot be determinedThere is no level line. Writing /L1/ in the path does not declare a level.Write level L1 0 h:2400 slab:150 before the lines that use itSUF02
The ceiling height of … cannot be determinedNeither the space's h: nor the level's h: existsWrite h: on one of themSUF01
The spaces do not touch, so no boundary can be derivedThey meet only at a corner. Touching requires a shared edge with lengthExtend one rectangle so an edge is shared, or delete the boundary line → Common trapsBND04
There is more than one boundary segment; pick an edge with edge:N/E/S/WThe boundary to the exterior falls on several edges of the room's perimeterPick the edge on the opening with edge:. N=+Y / S=−Y / E=+X / W=−XOPN05, or SEG05 for seg
No boundary segment can hold the doorThat pair of spaces has no boundary segment at allCheck with koyu graph whether they really touchOPN04
Space regions overlap:A space with a region has a child space with a regionMake the parent a zoneCounted and uncounted divisionsGEO02
Regions within … overlap:Rectangles unioned with + inside one space overlap each otherSplit them so they do notGEO01
References an undefined space:A misspelled path, or the layer declaring that space is not importedFix the path or add the importREF01
Duplicate boundary:Two boundaries on the same pair of spacesMerge them into one, or give both an edge: limiting them to different edgesBND02
A wall boundary cannot be written to a space on a different levelA relation across storeys written as a wallUse type:stair / type:shaft / type:voidBND03
Openings overlapA door and a window sit too close on the same boundary segmentMove one with at:OPN02
The door width … exceeds the boundary segment lengthThe opening is longer than the wallNarrow it, or lengthen the wallOPN06
is written as a positive number:An interpreted attribute's value does not read as a number (h:24OO has letters in it)Fix the spellingATT01
A boundary type is wall / open / stair / shaft / void:A value outside the ledger on an attribute with a fixed vocabularyUse a word from the ledgerATT02
which is not in the ledger (check the spelling, or add a namespace…)An attribute key not in the ledger, with no namespace. nmae: does not pass silentlyFix the spelling, or add a namespace such as acme.note: if the value is only carriedATT03
daylight is either 1 … or 0Something other than 0 or 1 on daylight:Write daylight:1 or daylight:0DAY01
Duplicate uid:The same uid on two targetsReplace one with a fresh value from new_uidsIdentityUID03
A koyu 0.5 file uses a 1.0 word:A newer word (over, drop, set editing) in a file declaring an older versionRaise it to koyu 1.0VER04
One layer holds two opinions about …One layer holds two opinions about one attributeOverride from another layer → Lay measurements over the plancomposition error
No such target for over:The target of over was never composedFix the spelling, or place it after the layer that defines itcomposition error
Duplicate space path:Two layers define the same pathTurn one into an over, or split the pathscomposition error

2. check emits warnings only

The exit code stays 0 unless you pass --strict. Some of these mean nothing gets generated.

What you seeWhat it meansWhat to doCode
has no slab:, so not one floor is generated on this storeyNo floor is produced on that levelWrite slab:, as in level L1 0 h:2400 slab:150SUF03
There are no spaces beneath zone …The zone has no members; the path prefix does not line upFix either the zone path or the space pathsZON01
A space shares its path with a zoneBoth a space and a zone occupy the same pathSettle on one of themZON02
A door on a vertical boundary is not interpretedAn opening written on a stair, shaft or void boundary. It has no effect on passageDelete it. Passage is carried by the vertical boundary itselfVRT05
A door on an open boundary has no effect on passagetype:open is already passableDelete the opening, or make the boundary a wall againOPN03
cuts nothingThe drawn line matches the default adjacency line, or falls outside the allocationRedraw it, or delete itLIN03
The area spills outside the region ofAn area runs past its parent spaceShrink its extent → Counted and uncounted divisionsSEG02
No column stands for a column declarationThere is no floor at that grid crossing, or the space is semi-outdoor with no floor aboveRevisit the declared grid lines, or the extent with a floorCOL01

3. check is green and it is still wrong

There is no diagnostic here. check speaks only to whether what is written contradicts itself as data. Whether it works as a building is not its subject.

SymptomCauseTool to confirm with
A room cannot reach the outsideThe default between touching spaces is a wall with no door. Doors are never added automaticallykoyu doors / koyu graphCommon traps
No envelope at allNothing is derived against a space with no region (/out)envelope.gap from koyu validateCommon traps
An empty file is greenA composition with nothing written in it standsLook inside with koyu stats / koyu graph
A room you want in the area schedule is missingarea is an uncounted division. It appears in neither area nor room countCounted and uncounted divisions
The boundary count from check and boundaries in the canonical JSON disagreecheck counts the composed model; canonical JSON carries only what was writtenNot a contradiction → Common traps
An attribute has no effectAn unknown key is an error, but a misspelled value is carriedTrace the origin with koyu layers --attrs
Changing the type does not change the daylight verdictDaylight scope is decided by daylight:1, not by the typekoyu light

4. check says nothing — validate does

Architectural judgement comes back separately from koyu validate. It carries chapter.rule spellings, not check codes.

SymptomRule
Part of the perimeter faces nothingenvelope.gap
Window area falls short of 1/7 of the floordaylight.ratio
A window has no h:, so the window area is incompletedaylight.unknown
Stair treads are cramped, or riser and tread fall outside the usual bandstair.proportion
A ramp is steeper than declaredrun.slope
A vertical run has form but nothing connects the storeysrun.disconnected
A room cannot reach the exterioraccess.unreachable
A door opens only onto a voidaccess.voidonly
A column stands in a doorcolumn.blocksdoor
The building escapes the site shapesite.escape
Declared and derived site area disagreesite.area
Road frontage is too shortsite.frontage

Every rule is on Judgement — koyu validate.

5. The command itself fails

What you seeExit codeCause
Undeclared level: l2 (declared: L1 L2 R)2A wrong level name after -l. Case matters. Confirm with koyu levels
The Usage: koyu … line2Missing arguments. --help goes down the same path
Error: No level is defined with a stack trace1There is no level line at all. check can be green while drawing fails
Error: There is no space with a region on level R with a stack trace1No space on that level has a region
Cannot reach /out from /L1/nope1Unreachable. The same wording appears when the start or end path does not exist. Confirm the spelling with koyu graph

A problem with how you called it exits 2; a problem with the composition exits 1. The two are never mixed, so CI can treat them differently.