This page is generated from
docs/error-codes.md— edit it there.
ArchLang error codes
Every diagnostic carries a stable code. Look one up with arch explain <CODE> (e.g. arch explain E_ROOM_SIZE). Errors abort rendering; warnings do not.
51 errors · 32 warnings
| Code | Severity | Summary |
|---|---|---|
E_ACC_PLACEMENT | error | accTitle/accDescr used outside the plan level. |
E_ARGCOUNT | error | Component called with the wrong number of arguments. |
E_ARITY | error | Built-in function called with the wrong number of arguments. |
E_ASSIGN_UNDEF | error | Assignment to an undeclared name. |
E_ATTACH_POS_RANGE | error | Opening attachment position is out of range. |
E_ATTACH_WALL_REF | error | Opening attached to an unknown or ambiguous wall. |
E_CALL_DEPTH | error | Value-function call stack too deep. |
E_COLUMN_SIZE | error | Column must have a positive size. |
E_DIV_ZERO | error | Division or modulo by zero. |
E_DOMAIN | error | Math domain error. |
E_DOOR_WIDTH | error | Door must have a positive width. |
E_DUP_ID | error | Duplicate element id. |
E_FURN_AGAINST | error | Invalid against wall fixture placement. |
E_FURN_ROOM | error | Furniture placed in an unknown room. |
E_FURN_ROTATE | error | Furniture rotation must be a quarter-turn. |
E_FURN_SIZE | error | Furniture must have a positive size. |
E_IMPORT_BAD_SPEC | error | Malformed import spec. |
E_IMPORT_CONFLICT | error | Imported name conflicts with an existing component. |
E_IMPORT_CYCLE | error | Cyclic import. |
E_IMPORT_NOT_EXPORTED | error | Imported name is not exported by the module. |
E_IMPORT_NOT_FOUND | error | Import path could not be resolved. |
E_IMPORT_PARSE | error | Imported module has a parse error. |
E_INDEX | error | Array index out of range. |
E_INTENT_NO_DOOR | error | The plan has no modeled entrance, so reachable cannot hold. |
E_INTENT_NO_WINDOW | error | A room the brief wants a window in has too few. |
E_INTENT_NOT_ADJACENT | error | Two rooms the brief wants adjacent share no interior door. |
E_INTENT_ROOM_AREA | error | A named room's floor area is outside the brief's band. |
E_INTENT_ROOM_COUNT | error | The plan's room count does not match the brief. |
E_INTENT_ROOM_MISSING | error | A room the brief names is absent from the plan. |
E_INTENT_TOTAL_AREA | error | The plan's total floor area is outside the brief's band. |
E_INTENT_UNREACHABLE | error | A room cannot be reached from the entrance through modeled doors. |
E_JSON_KIND | error | Unknown element kind in plan JSON. |
E_JSON_SCHEMA | error | Plan JSON does not match the schema. |
E_LAYOUT_CYCLE | error | Relational room placement forms a cycle. |
E_LAYOUT_REF | error | Relational placement references an unknown room. |
E_OPENING_WIDTH | error | Opening must have a positive width. |
E_PLACE_REF | error | Furniture placed in an unknown or non-absolute room. |
E_PNG_DEPENDENCY | error | PNG/PDF export needs an optional dependency that is not installed. |
E_RANGE_LIMIT | error | Range too large. |
E_RECURSION | error | Component recursion too deep. |
E_REDEF | error | Name already defined in this scope. |
E_ROOM_SIZE | error | Room must have a positive size. |
E_STRIP_NEST | error | Illegal strip nesting. |
E_STRIP_SIZE | error | Room in a strip is missing a size. |
E_TYPE | error | Type mismatch. |
E_UNKNOWN_COMPONENT | error | Unknown component. |
E_UNKNOWN_FN | error | Unknown function. |
E_UNKNOWN_REF | error | Unknown reference. |
E_WALL_THICKNESS | error | Wall must have a positive thickness. |
E_WHILE_LIMIT | error | while exceeded its iteration cap. |
E_WINDOW_WIDTH | error | Window must have a positive width. |
W_ALIAS_MATCH | warning | A room's use was inferred from an indirect alias, not stated. |
W_BATH_VIA_BEDROOM | warning | Bathroom is reachable only through a bedroom. |
W_BEDROOM_NO_WINDOW | warning | Bedroom has no window. |
W_CIRCUITOUS_PATH | warning | A room is reached by a very roundabout path. |
W_DOOR_CLEARANCE | warning | Door is narrower than the minimum clear width. |
W_DOOR_OFF_WALL | warning | Door does not lie on any wall. |
W_DOORWAY_BLOCKED | warning | A doorway's landing is blocked. |
W_DUP_ACC_METADATA | warning | Duplicate accTitle/accDescr. |
W_EMPTY_PLAN | warning | Empty plan. |
W_FIXTURE_FLOATING | warning | A plumbing/kitchen fixture is not against a wall. |
W_FIXTURE_WRONG_ROOM | warning | Fixture sits outside its declared room. |
W_FURN_CLEARANCE | warning | A fixture's use-space is blocked. |
W_FURNITURE_OVERLAP | warning | Two pieces of furniture overlap. |
W_FURNITURE_WALL_COLLISION | warning | Furniture penetrates a wall. |
W_HATCH_SCALE | warning | Hatch scale must be positive; using 1. |
W_NO_ENTRANCE | warning | The plan has no exterior door. |
W_OPENING_OFF_WALL | warning | Opening does not lie on any wall. |
W_PATH_TOO_NARROW | warning | The walk to a room squeezes below a passable width. |
W_ROOM_DISCONNECTED | warning | Room has no door — it can't be entered. |
W_ROOM_NO_CLEAR_PATH | warning | A room cannot be entered or crossed. |
W_ROOM_NO_FIXTURE | warning | Bathroom or kitchen has no fixtures. |
W_ROOM_NOT_ENCLOSED | warning | Bathroom is not fully enclosed. |
W_ROOM_OVERLAP | warning | Rooms overlap. |
W_ROOM_TOO_SMALL | warning | Room is implausibly small. |
W_ROOM_UNREACHABLE | warning | Room cannot be reached from the entrance. |
W_SANITIZED_CONFIG | warning | A disallowed config value was stripped. |
W_SWING_OBSTRUCTED | warning | Door swing is obstructed. |
W_SWING_ROOM_NOT_ADJACENT | warning | swing into <room> names a room the door does not border. |
W_UNKNOWN_MATERIAL | warning | Unknown wall material; using the default hatch. |
W_UNKNOWN_STYLE_KEY | warning | Unknown style key. |
W_UNKNOWN_THEME_KEY | warning | Unknown theme key. |
W_WINDOW_OFF_WALL | warning | Window does not lie on any wall. |
E_ACC_PLACEMENT
error — accTitle/accDescr used outside the plan level.
Cause. An accTitle or accDescr accessibility-metadata statement appeared inside a component or a control-flow block. They describe the whole plan, so they are only legal as direct plan-level statements.
Fix. Move the accTitle/accDescr line up to the plan body, alongside units/north.
component c() { accDescr "x" } # error: only allowed at plan levelE_ARGCOUNT
error — Component called with the wrong number of arguments.
Cause. A component instance supplies more or fewer arguments than the component declares parameters.
Fix. Pass exactly one argument per declared parameter.
component bed(x, y) { … }
bed(300) # error: expects 2 argumentsE_ARITY
error — Built-in function called with the wrong number of arguments.
Cause. A built-in (e.g. abs, sqrt, len) was called with the wrong argument count.
Fix. Check the function's arity; most built-ins take one argument.
let x = abs(1, 2) # error: abs expects 1 argumentE_ASSIGN_UNDEF
error — Assignment to an undeclared name.
Cause. NAME = value was used for a name never introduced with let.
Fix. Declare it first with let, or fix a typo in the name.
x = 5 # error: declare with `let x = …` firstE_ATTACH_POS_RANGE
error — Opening attachment position is out of range.
Cause. The at <pos> of an attached opening is outside the host wall: a percentage outside 0–100%, or a millimetre distance outside 0 … wall length.
Fix. Use a percentage in 0–100%, a millimetre distance within the wall's run, or center.
door on w1 at 150% width 900 # error: 150% is past the wall endE_ATTACH_WALL_REF
error — Opening attached to an unknown or ambiguous wall.
Cause. A door/window/opening … on <wall> at <pos> names a wall id (or category) that no wall has, or one that matches more than one wall — so the compiler cannot pick the polyline to walk.
Fix. Reference an existing, unique wall id (add id= to the wall if needed).
door on w1 at 40% width 900 # error if no wall id=w1 (or several match)E_CALL_DEPTH
error — Value-function call stack too deep.
Cause. A value-function recurses (directly or mutually) beyond the call-depth limit.
Fix. Make the recursion terminate, or rewrite it iteratively with a bounded while.
let f(n) = f(n + 1) # error: never terminatesE_COLUMN_SIZE
error — Column must have a positive size.
Cause. A column's width or height evaluated to zero or a negative number.
Fix. Give the column a positive size W x H.
column at (0,0) size 0x300 # error: width is 0E_DIV_ZERO
error — Division or modulo by zero.
Cause. An expression divides (or takes a remainder) by a value that evaluates to zero.
Fix. Guard the divisor, or use a non-zero value.
let x = 10 / 0 # errorE_DOMAIN
error — Math domain error.
Cause. A built-in received an out-of-domain argument (e.g. sqrt of a negative number).
Fix. Pass a value within the function's domain.
let x = sqrt(-1) # errorE_DOOR_WIDTH
error — Door must have a positive width.
Cause. A door's width evaluated to zero or a negative number.
Fix. Give the door a positive width.
door at (0,0) width 0 # errorE_DUP_ID
error — Duplicate element id.
Cause. Two elements declare the same id=…; ids must be unique across the plan.
Fix. Rename one of them, or drop the explicit id to auto-generate a unique one.
room id=a at (0,0) size 1x1
room id=a at (1,0) size 1x1 # error: duplicate id "a"E_FURN_AGAINST
error — Invalid against wall fixture placement.
Cause. A wall-anchored fixture references an unknown wall, omits segment on a multi-segment wall, omits side, sits on a non-axis-aligned segment, has an out-of-range offset, or also sets rotate. The compiler will not guess which wall/side/segment was meant.
Fix. Name an existing wall id, add segment <n> for multi-segment walls, give side left|right, keep the segment axis-aligned, and drop any explicit rotate.
furniture wc against wall w1 side left size 400x700 # error if w1 is unknown or multi-segmentE_FURN_ROOM
error — Furniture placed in an unknown room.
Cause. A furniture item names a room with in <roomId>, but no room has that id.
Fix. Use the id of an existing room id=…, or drop the in clause.
furniture bed at (0,0) size 1500x2000 in bedrm # error: no room id=bedrmE_FURN_ROTATE
error — Furniture rotation must be a quarter-turn.
Cause. A furniture item's rotate is not one of 0, 90, 180, or 270 degrees.
Fix. Use a quarter-turn: rotate 0|90|180|270.
furniture wc at (0,0) size 400x700 rotate 45 # error: not a quarter-turnE_FURN_SIZE
error — Furniture must have a positive size.
Cause. A furniture item's width or height evaluated to zero or a negative number.
Fix. Give the item a positive size W x H.
furniture bed at (0,0) size 0x2000 # errorE_IMPORT_BAD_SPEC
error — Malformed import spec.
Cause. The string after import is not a recognizable module reference.
Fix. Use a relative path ("lib/x.arch") or a namespaced spec ("@scope/name:1.0.0").
import "???" : a # errorE_IMPORT_CONFLICT
error — Imported name conflicts with an existing component.
Cause. An imported component has the same name as one already defined or imported.
Fix. Rename with as, or remove the duplicate.
import "lib.arch": bed as lib_bedE_IMPORT_CYCLE
error — Cyclic import.
Cause. Modules import each other in a cycle, which cannot be resolved.
Fix. Break the cycle so module dependencies form a tree.
# a.arch imports b.arch which imports a.arch → errorE_IMPORT_NOT_EXPORTED
error — Imported name is not exported by the module.
Cause. The module has no component with the requested name.
Fix. Import a name the module actually defines (check its components).
import "lib.arch": nope # error if lib.arch has no `component nope`E_IMPORT_NOT_FOUND
error — Import path could not be resolved.
Cause. The World could not read the module at the given path.
Fix. Check the path (relative to the importing file) and that the file exists.
import "lib/missing.arch": a # errorE_IMPORT_PARSE
error — Imported module has a parse error.
Cause. The module referenced by import does not itself parse.
Fix. Fix the syntax error in the imported module.
# error originates in the imported fileE_INDEX
error — Array index out of range.
Cause. arr[i] used an index outside 0 .. len(arr) - 1.
Fix. Clamp or check the index against len(arr).
let a = [1, 2]
let x = a[5] # errorE_INTENT_NO_DOOR
error — The plan has no modeled entrance, so reachable cannot hold.
Cause. An intent asserts reachable: true, but the plan has no door connecting a room to the exterior — nothing is enterable, so no room is reachable.
Fix. Add an exterior entrance door on a perimeter wall. Advisory tier: reported and scored by validateIntent but does NOT fail ok (gate: false).
door on exterior at 50% width 900 # a front doorE_INTENT_NO_WINDOW
error — A room the brief wants a window in has too few.
Cause. An intent roomsInclude[].windows requires at least one window in a concept's room(s) (e.g. "give the bedroom a window"), but the plan places fewer than the required count.
Fix. Add a window on one of that room's walls. Gating tier: this failure DOES fail validateIntent's ok.
window on north at 40% width 1200 # light the bedroomE_INTENT_NOT_ADJACENT
error — Two rooms the brief wants adjacent share no interior door.
Cause. An intent adjacency edge names two concepts (e.g. hall ↔ bathroom) that are not joined by an interior door or cased opening in the plan's modeled connectivity.
Fix. Add a door (or opening) on the wall the two rooms share so they are directly connected. Advisory tier: this is scored and reported by validateIntent but does NOT fail ok (gate: false) — one-shot topology is what the loop tools address.
door on wall_hall_bath width 800 # connect the hall to the bathroomE_INTENT_ROOM_AREA
error — A named room's floor area is outside the brief's band.
Cause. An intent roomsInclude[].areaM2 gives a per-room area band (from a number in the brief, ±10% for "about N"), but the matched room's area falls outside it.
Fix. Resize the room so its floor area lands in the band. Gating tier: this failure fails validateIntent's ok. Assert a band only where the brief states a number — qualitative size words license none.
room at (0,0) size 4000x3000 label "Bedroom" # 12 m²E_INTENT_ROOM_COUNT
error — The plan's room count does not match the brief.
Cause. An intent rooms count (asserted only when the brief ENUMERATES its rooms) does not match the plan's room total. A single surplus room passes only when it is pure circulation (a hall/corridor) — policy B.
Fix. Add or remove rooms to reach the enumerated count. Gating tier: this failure fails validateIntent's ok.
# brief lists 4 rooms; the plan draws 5 (and the extra is a bedroom, not a hall)E_INTENT_ROOM_MISSING
error — A room the brief names is absent from the plan.
Cause. An intent roomsInclude[] concept (e.g. "bathroom") matched no room by label, room_type, or uses — the plan is missing a room the brief asked for.
Fix. Add a room whose label, uses, or type matches the concept. Gating tier: this failure fails validateIntent's ok.
room at (0,0) size 2000x2000 label "Bathroom" uses bath # supply the missing roomE_INTENT_TOTAL_AREA
error — The plan's total floor area is outside the brief's band.
Cause. An intent totalAreaM2 band (from a number in the brief, ±10% for "about N") does not contain the plan's total floor area.
Fix. Grow or shrink rooms so the total lands in the band. Gating tier: this failure fails validateIntent's ok. Assert a band only where the brief states a number.
# brief says "about 42 m²" (band 37.8–46.2); the plan totals 52 m²E_INTENT_UNREACHABLE
error — A room cannot be reached from the entrance through modeled doors.
Cause. An intent asserts reachable: true and the plan HAS an entrance, but one or more rooms are cut off — no chain of modeled doors reaches them from the exterior.
Fix. Add interior doors so every room connects back to the entrance. Advisory tier: reported and scored by validateIntent but does NOT fail ok (gate: false).
door on wall_hall_store width 800 # connect the isolated roomE_JSON_KIND
error — Unknown element kind in plan JSON.
Cause. An element in the JSON names a kind (or lives in an array) the builder does not recognize — e.g. an opening whose kind is not door, window, or opening.
Fix. Use one of the supported kinds: opening kind must be door | window | opening.
{ "openings": [ { "kind": "portal", "width": 900 } ] } # error at /openings/0/kind: unknown kind "portal"E_JSON_SCHEMA
error — Plan JSON does not match the schema.
Cause. A value passed to planFromJson has the wrong shape or type for its JSON path (e.g. a room missing a numeric width, a non-array rooms), or it uses a construct the JSON form cannot represent — scripting (let/for/if/component) and import are intentionally not supported.
Fix. Fix the value at the reported JSON path (the message names it, e.g. /rooms/0/width); express geometry as concrete numbers, and author scripting/imports in .arch source instead.
{ "rooms": [ { "x": 0, "y": 0, "width": "big", "height": 3000 } ] } # error at /rooms/0/width: expected a numberE_LAYOUT_CYCLE
error — Relational room placement forms a cycle.
Cause. Rooms placed with right-of/below/… reference each other in a loop, so no order resolves them.
Fix. Break the cycle by giving one of the rooms absolute at (x,y) coordinates.
room id=a right-of b size 100x100
room id=b left-of a size 100x100 # error: a ↔ b cycleE_LAYOUT_REF
error — Relational placement references an unknown room.
Cause. A right-of/below/… clause names a room id that does not exist in the plan.
Fix. Reference an existing room id, or fix the typo.
room id=k right-of ghost size 100x100 # error: no room "ghost"E_OPENING_WIDTH
error — Opening must have a positive width.
Cause. A cased opening's width evaluated to zero or a negative number.
Fix. Give the opening a positive width.
opening at (0,0) width 0 # errorE_PLACE_REF
error — Furniture placed in an unknown or non-absolute room.
Cause. A furniture … in <room> centered|anchor … names a room that does not exist, or one positioned relationally (right-of/…) whose box is not yet fixed when the fixture is placed.
Fix. Reference an existing room given absolute at (x,y) coordinates.
furniture bed in bedrm centered size 1500x2000 # error: no room id=bedrmE_PNG_DEPENDENCY
error — PNG/PDF export needs an optional dependency that is not installed.
Cause. Rendering to PNG needs @resvg/resvg-js (PDF needs pdfkit); the optional binary is absent in this environment (it is not bundled, to keep the core zero-dependency).
Fix. Install the optional dependency (npm install @resvg/resvg-js), or re-run with --install to fetch it automatically, or render to SVG/DXF (zero-dependency).
arch preview plan.arch --install # fetches @resvg/resvg-js, then renders the PNGE_RANGE_LIMIT
error — Range too large.
Cause. A lo..hi range would expand to more elements than the safety cap allows.
Fix. Use a smaller range, or restructure to avoid materializing it.
for i in 0..1000000 { … } # error: range too largeE_RECURSION
error — Component recursion too deep.
Cause. Component instantiation nested beyond the depth limit (usually unbounded self-instantiation).
Fix. Add a base case so the recursion terminates.
component r(n) { r(n) } # error: never terminatesE_REDEF
error — Name already defined in this scope.
Cause. A let re-declares a name already bound in the same scope.
Fix. Rename one binding, or use NAME = … to reassign instead of redeclaring.
let x = 1
let x = 2 # error: redefinitionE_ROOM_SIZE
error — Room must have a positive size.
Cause. A room's width or height evaluated to zero or a negative number.
Fix. Give the room a positive size W x H.
room at (0,0) size 0x4000 # error: width is 0E_STRIP_NEST
error — Illegal strip nesting.
Cause. A strip block appears inside a component, a control-flow block, or another strip. Strips place rooms and are only legal as direct plan-level statements.
Fix. Move the strip to the plan body, alongside the other elements.
component c() { strip right at (0,0) gap 0 { … } } # error: nested stripE_STRIP_SIZE
error — Room in a strip is missing a size.
Cause. A room inside a strip { … } gives no main-axis extent, or gives none while the strip supplies no cross-axis height/width for it to inherit — so its rectangle is undetermined.
Fix. Give the room a size <main> (main-axis extent) plus either a strip height/width or its own size <main>x<cross>.
strip right at (0,0) gap 100 { room size } # error: no extentE_TYPE
error — Type mismatch.
Cause. A value was used where another type was required (e.g. a string where a number is expected, or a non-array in for).
Fix. Convert or supply the expected type.
room at (0,0) size "big" x 10 # error: size needs numbersE_UNKNOWN_COMPONENT
error — Unknown component.
Cause. An instance calls a component name that is not defined or imported.
Fix. Define the component, import it, or fix the name (see the suggestion hint).
sofa(0, 0) # error if no `component sofa` is in scopeE_UNKNOWN_FN
error — Unknown function.
Cause. A call uses a name that is neither a built-in nor a value-function in scope.
Fix. Define it with let f(…) = …, or fix the name.
let x = frobnicate(2) # errorE_UNKNOWN_REF
error — Unknown reference.
Cause. An expression references a name that is not bound in scope.
Fix. Declare it with let, pass it as a parameter, or fix the typo.
let x = y + 1 # error if `y` is undefinedE_WALL_THICKNESS
error — Wall must have a positive thickness.
Cause. A wall's thickness evaluated to zero or a negative number.
Fix. Give the wall a positive thickness.
wall exterior thickness 0 { (0,0) (1,0) } # errorE_WHILE_LIMIT
error — while exceeded its iteration cap.
Cause. A while ran more times than the safety cap allows (usually a condition that never becomes false).
Fix. Ensure the loop body updates a binding so the condition eventually fails.
let i = 0
while i < 1 { column at (0,0) size 1x1 } # error: i never changesE_WINDOW_WIDTH
error — Window must have a positive width.
Cause. A window's width evaluated to zero or a negative number.
Fix. Give the window a positive width.
window at (0,0) width 0 # errorW_ALIAS_MATCH
warning — A room's use was inferred from an indirect alias, not stated.
Cause. A room has no authored uses, and its function was guessed from its label via a non-canonical alias (an indirect term like powder → WC, foyer → entry) rather than a direct word (wc, entrance). The guess is reasonable but the intent is implicit, so a reader (or agent) cannot tell the classification was assumed.
Fix. Add an explicit uses … to the room stating the inferred function — the machine-applicable fix inserts it for you. This pins the classification without changing the room's describe() type.
room at (0,0) size 2000x1500 label "Powder" # warning: WC inferred from the alias "powder"; add `uses wc`W_BATH_VIA_BEDROOM
warning — Bathroom is reachable only through a bedroom.
Cause. Every door path from the entrance to this bathroom/WC passes through a bedroom. That is fine for a private en-suite, but a dwelling's main bathroom should open off circulation (a hall or living space), not a bedroom.
Fix. Add a door connecting the bathroom to a hall/living space, or route circulation so it is not reached only via a bedroom.
door id=d_bath at (5200,4000) width 800 wall partition # lint: bath only off the bedroomW_BEDROOM_NO_WINDOW
warning — Bedroom has no window.
Cause. A room labelled as a bedroom has no window on its perimeter (natural light / egress).
Fix. Add a window on an exterior wall of the room.
room at (0,0) size 3000x4000 label "Bedroom" # lint: no windowW_CIRCUITOUS_PATH
warning — A room is reached by a very roundabout path.
Cause. The walking distance from the entrance to a room is many times its straight-line distance — the room is reachable but only by a circuitous route (e.g. all the way around the plan). A coarse circulation fact (ADR 0008); the default ratio is generous so a normal tucked-away room does not trip it.
Fix. Add a more direct connection — a door or a hall — so the room is not reached the long way round.
room id=bed at (0,0) size 3000x3000 label "Bed" # only door is on the far side, forcing a long detourW_DOOR_CLEARANCE
warning — Door is narrower than the minimum clear width.
Cause. A door's width is below the configured minimum passable width (default 700 mm).
Fix. Widen the door to at least the minimum clear width.
door at (0,0) width 500 wall exterior # lint: under 700 mmW_DOOR_OFF_WALL
warning — Door does not lie on any wall.
Cause. A door's position is not within tolerance of any wall segment, so it has no host.
Fix. Move the door onto a wall, or name its host with wall <id|category>. The diagnostic points at the nearest wall.
door at (9999,9999) width 900 # warning: not on a wallW_DOORWAY_BLOCKED
warning — A doorway's landing is blocked.
Cause. A piece of furniture/fixture sits in the clear landing space immediately on either side of a door opening, so you cannot pass through the doorway even when the leaf is open. This is the approach path, distinct from the leaf's swing arc (W_SWING_OBSTRUCTED).
Fix. Clear the space directly in front of and behind the door, or move the door.
door at (6000,3000) width 800
furniture wc at (5800,3050) size 700x400 # lint: WC blocks the doorwayW_DUP_ACC_METADATA
warning — Duplicate accTitle/accDescr.
Cause. A plan declares accTitle (or accDescr) more than once. Only one of each applies, so the last value silently wins.
Fix. Keep a single accTitle and a single accDescr; delete the extra line(s).
accTitle "A"
accTitle "B" # warning: "A" is discardedW_EMPTY_PLAN
warning — Empty plan.
Cause. The plan resolved to no drawable elements.
Fix. Add at least one element (wall, room, …).
plan "Empty" { units mm } # warningW_FIXTURE_FLOATING
warning — A plumbing/kitchen fixture is not against a wall.
Cause. A fixture that conventionally needs a wall behind it (WC, basin, shower, sink, counter, stove, fridge…) sits with no wall backing any edge — it appears to float in the middle of the room.
Fix. Move the fixture so one edge is against a wall (supply/waste/venting runs in the wall), or remove it.
furniture wc at (3000,3000) size 400x700 # lint: no wall behind itW_FIXTURE_WRONG_ROOM
warning — Fixture sits outside its declared room.
Cause. A furniture item declared in <roomId> has its centre outside that room's rectangle, so it is drawn in the wrong space.
Fix. Move the fixture inside the named room, or correct the in <roomId>.
furniture wc at (100,100) size 400x700 in bath # lint: centre is not inside "bath"W_FURN_CLEARANCE
warning — A fixture's use-space is blocked.
Cause. The activity clearance directly in front of a fixture (WC, basin, sink, counter, stove…) is intruded by a free-standing piece of furniture, so the fixture can't be used comfortably. Other plumbing/kitchen fixtures are ignored, so a compact bathroom/kitchen run does not trip this.
Fix. Leave the catalogued clearance clear in front of the fixture, or move the obstructing furniture.
furniture stove at (0,0) size 600x600
furniture sofa at (0,650) size 2000x900 # lint: sofa blocks the stove frontW_FURNITURE_OVERLAP
warning — Two pieces of furniture overlap.
Cause. Two furniture/fixture rectangles occupy the same floor area, so they would physically collide — usually a coordinate or size mistake.
Fix. Move or resize one so they no longer intersect; leave a walkway between them.
furniture sofa at (300,300) size 2000x900
furniture bed at (1000,500) size 1500x2000 # lint: overlaps the sofaW_FURNITURE_WALL_COLLISION
warning — Furniture penetrates a wall.
Cause. A furniture/fixture rectangle intrudes into a wall's solid (it crosses the wall's thickness band rather than sitting flush against its face), so it would physically pass through the wall — a coordinate or size mistake. A piece merely touching the wall face is fine.
Fix. Move or resize the piece so it sits fully inside the room (against the wall face, not through it), or anchor it with against wall <id>.
furniture sofa at (350,2300) size 2000x900 # lint: crosses the partition at y3000W_HATCH_SCALE
warning — Hatch scale must be positive; using 1.
Cause. A wall material scale evaluated to zero or a negative number.
Fix. Use a positive scale.
wall exterior thickness 200 material brick scale 0 { (0,0) (1,0) }W_NO_ENTRANCE
warning — The plan has no exterior door.
Cause. The plan has rooms and an exterior wall but no door hosted on an exterior wall, so the building cannot be entered.
Fix. Add a door on an exterior wall.
wall exterior thickness 200 { (0,0) (4000,0) (4000,3000) (0,3000) close } # lint: no way inW_OPENING_OFF_WALL
warning — Opening does not lie on any wall.
Cause. A cased opening's position is not within tolerance of any wall segment, so it has no host.
Fix. Move the opening onto a wall, or name its host with wall <id|category>. The diagnostic points at the nearest wall.
opening at (9999,9999) width 1000 # warning: not on a wallW_PATH_TOO_NARROW
warning — The walk to a room squeezes below a passable width.
Cause. The widest route from the entrance into a room (or between a key pair of rooms, e.g. bedroom→bath) has an unavoidable pinch narrower than the minimum passable clear width — a too-narrow door/opening, or furniture crowding the way. A coarse fact from the circulation nav grid (ADR 0008); the number is grid-quantised.
Fix. Widen the tightest door/opening on the route, or move the furniture pinching it, so the whole path clears the minimum width.
door at (4000,1500) width 600
furniture cabinet at (3600,300) size 700x1200 # lint: the way through squeezes below 700 mmW_ROOM_DISCONNECTED
warning — Room has no door — it can't be entered.
Cause. No door lies on any of the room's walls, so there is no way into the room.
Fix. Add a door on one of the room's walls.
room id=r at (0,0) size 3000x3000 # lint: no door on its perimeterW_ROOM_NO_CLEAR_PATH
warning — A room cannot be entered or crossed.
Cause. Furniture, fixtures, door swings and their clearances fill the room so densely that a person stepping through a door/opening has no clear floor path into the usable space — the room is technically reachable but physically blocked.
Fix. Open up the layout: move or shrink the furniture nearest the door so there is a continuous walkable strip from each entrance into the room.
furniture shower at (5000,3000) size 2000x2000 # lint: fills the bathroom against its only doorW_ROOM_NO_FIXTURE
warning — Bathroom or kitchen has no fixtures.
Cause. A room labelled as a bathroom or kitchen contains no plumbing/kitchen fixture (WC, basin, shower, sink, counter…), so it is drawn as an empty box.
Fix. Place the expected fixtures — e.g. import lib/fixtures.arch and add a wc, basin, shower, or kitchen_sink.
room at (4000,4000) size 3000x2000 label "Bath" # lint: no fixtures insideW_ROOM_NOT_ENCLOSED
warning — Bathroom is not fully enclosed.
Cause. A run of this bathroom/WC's perimeter is not backed by a wall, so it is open to the adjacent space — a privacy problem for a wet room (a partition that stops short is the usual cause).
Fix. Extend the partition so the room's perimeter is walled on all sides (a door/window in the wall is fine — only a missing wall counts).
wall partition thickness 100 { (4000,0) (4000,4000) } # lint: stops short, bath left openW_ROOM_OVERLAP
warning — Rooms overlap.
Cause. Two room rectangles intersect.
Fix. Adjust positions/sizes if the overlap is unintended (it is allowed).
room at (0,0) size 2000x2000
room at (1000,0) size 2000x2000 # warningW_ROOM_TOO_SMALL
warning — Room is implausibly small.
Cause. A room's floor area is below the configured minimum (default 4 m²).
Fix. Increase its size, or merge it into an adjacent space.
room at (0,0) size 1000x1000 label "Closet" # lint: 1 m²W_ROOM_UNREACHABLE
warning — Room cannot be reached from the entrance.
Cause. The building has an entrance, but this room has no door/opening path back to the exterior — it is sealed off from the circulation.
Fix. Add a door or cased opening linking it (directly or through a hall) to a space that reaches the entrance.
room at (5000,0) size 3000x3000 label "Store" # lint: no path from the entranceW_SANITIZED_CONFIG
warning — A disallowed config value was stripped.
Cause. A theme/style value contained markup or a data: URL and was blanked for safety.
Fix. Use a plain colour/string value (no <, >, or url(data:…)).
theme { wall: "<script>" } # warning: strippedW_SWING_OBSTRUCTED
warning — Door swing is obstructed.
Cause. The quarter-circle a door leaf sweeps overlaps a piece of furniture/fixture or another door's swing, so the door cannot open fully.
Fix. Move the door or the obstruction, flip the hinge/swing, or use a sliding door so the leaf clears.
door at (4000,1500) width 900 swing in # lint: leaf sweeps onto the bedW_SWING_ROOM_NOT_ADJACENT
warning — swing into <room> names a room the door does not border.
Cause. A door's swing into <room> points the leaf toward a room, but that room does not share the door's host wall (its box does not touch the wall within tolerance), so which side it means is undefined.
Fix. Point swing into at a room the door actually opens onto, or use explicit swing in|out. The door falls back to its default swing.
door on w1 at 50% width 800 swing into faraway # warning: not on this wallW_UNKNOWN_MATERIAL
warning — Unknown wall material; using the default hatch.
Cause. A wall material name is not one of the known hatches.
Fix. Use a known material (e.g. brick, concrete, insulation, tile) or omit it.
wall exterior thickness 200 material marble { (0,0) (1,0) } # warningW_UNKNOWN_STYLE_KEY
warning — Unknown style key.
Cause. A style <kind> { … } block uses a key not valid for that element kind.
Fix. Use a valid key (e.g. fill / stroke / label, depending on the kind).
style room { nope: "#000" } # warningW_UNKNOWN_THEME_KEY
warning — Unknown theme key.
Cause. A theme { … } block uses a key that is not a theme property or alias.
Fix. Use a known theme key (see the language reference / hover).
theme { nope: "#000" } # warningW_WINDOW_OFF_WALL
warning — Window does not lie on any wall.
Cause. A window's position is not within tolerance of any wall segment, so it has no host.
Fix. Move the window onto a wall, or name its host with wall <id|category>. The diagnostic points at the nearest wall.
window at (9999,9999) width 1200 # warning: not on a wall