Skip to content

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

CodeSeveritySummary
E_ACC_PLACEMENTerroraccTitle/accDescr used outside the plan level.
E_ARGCOUNTerrorComponent called with the wrong number of arguments.
E_ARITYerrorBuilt-in function called with the wrong number of arguments.
E_ASSIGN_UNDEFerrorAssignment to an undeclared name.
E_ATTACH_POS_RANGEerrorOpening attachment position is out of range.
E_ATTACH_WALL_REFerrorOpening attached to an unknown or ambiguous wall.
E_CALL_DEPTHerrorValue-function call stack too deep.
E_COLUMN_SIZEerrorColumn must have a positive size.
E_DIV_ZEROerrorDivision or modulo by zero.
E_DOMAINerrorMath domain error.
E_DOOR_WIDTHerrorDoor must have a positive width.
E_DUP_IDerrorDuplicate element id.
E_FURN_AGAINSTerrorInvalid against wall fixture placement.
E_FURN_ROOMerrorFurniture placed in an unknown room.
E_FURN_ROTATEerrorFurniture rotation must be a quarter-turn.
E_FURN_SIZEerrorFurniture must have a positive size.
E_IMPORT_BAD_SPECerrorMalformed import spec.
E_IMPORT_CONFLICTerrorImported name conflicts with an existing component.
E_IMPORT_CYCLEerrorCyclic import.
E_IMPORT_NOT_EXPORTEDerrorImported name is not exported by the module.
E_IMPORT_NOT_FOUNDerrorImport path could not be resolved.
E_IMPORT_PARSEerrorImported module has a parse error.
E_INDEXerrorArray index out of range.
E_INTENT_NO_DOORerrorThe plan has no modeled entrance, so reachable cannot hold.
E_INTENT_NO_WINDOWerrorA room the brief wants a window in has too few.
E_INTENT_NOT_ADJACENTerrorTwo rooms the brief wants adjacent share no interior door.
E_INTENT_ROOM_AREAerrorA named room's floor area is outside the brief's band.
E_INTENT_ROOM_COUNTerrorThe plan's room count does not match the brief.
E_INTENT_ROOM_MISSINGerrorA room the brief names is absent from the plan.
E_INTENT_TOTAL_AREAerrorThe plan's total floor area is outside the brief's band.
E_INTENT_UNREACHABLEerrorA room cannot be reached from the entrance through modeled doors.
E_JSON_KINDerrorUnknown element kind in plan JSON.
E_JSON_SCHEMAerrorPlan JSON does not match the schema.
E_LAYOUT_CYCLEerrorRelational room placement forms a cycle.
E_LAYOUT_REFerrorRelational placement references an unknown room.
E_OPENING_WIDTHerrorOpening must have a positive width.
E_PLACE_REFerrorFurniture placed in an unknown or non-absolute room.
E_PNG_DEPENDENCYerrorPNG/PDF export needs an optional dependency that is not installed.
E_RANGE_LIMITerrorRange too large.
E_RECURSIONerrorComponent recursion too deep.
E_REDEFerrorName already defined in this scope.
E_ROOM_SIZEerrorRoom must have a positive size.
E_STRIP_NESTerrorIllegal strip nesting.
E_STRIP_SIZEerrorRoom in a strip is missing a size.
E_TYPEerrorType mismatch.
E_UNKNOWN_COMPONENTerrorUnknown component.
E_UNKNOWN_FNerrorUnknown function.
E_UNKNOWN_REFerrorUnknown reference.
E_WALL_THICKNESSerrorWall must have a positive thickness.
E_WHILE_LIMITerrorwhile exceeded its iteration cap.
E_WINDOW_WIDTHerrorWindow must have a positive width.
W_ALIAS_MATCHwarningA room's use was inferred from an indirect alias, not stated.
W_BATH_VIA_BEDROOMwarningBathroom is reachable only through a bedroom.
W_BEDROOM_NO_WINDOWwarningBedroom has no window.
W_CIRCUITOUS_PATHwarningA room is reached by a very roundabout path.
W_DOOR_CLEARANCEwarningDoor is narrower than the minimum clear width.
W_DOOR_OFF_WALLwarningDoor does not lie on any wall.
W_DOORWAY_BLOCKEDwarningA doorway's landing is blocked.
W_DUP_ACC_METADATAwarningDuplicate accTitle/accDescr.
W_EMPTY_PLANwarningEmpty plan.
W_FIXTURE_FLOATINGwarningA plumbing/kitchen fixture is not against a wall.
W_FIXTURE_WRONG_ROOMwarningFixture sits outside its declared room.
W_FURN_CLEARANCEwarningA fixture's use-space is blocked.
W_FURNITURE_OVERLAPwarningTwo pieces of furniture overlap.
W_FURNITURE_WALL_COLLISIONwarningFurniture penetrates a wall.
W_HATCH_SCALEwarningHatch scale must be positive; using 1.
W_NO_ENTRANCEwarningThe plan has no exterior door.
W_OPENING_OFF_WALLwarningOpening does not lie on any wall.
W_PATH_TOO_NARROWwarningThe walk to a room squeezes below a passable width.
W_ROOM_DISCONNECTEDwarningRoom has no door — it can't be entered.
W_ROOM_NO_CLEAR_PATHwarningA room cannot be entered or crossed.
W_ROOM_NO_FIXTUREwarningBathroom or kitchen has no fixtures.
W_ROOM_NOT_ENCLOSEDwarningBathroom is not fully enclosed.
W_ROOM_OVERLAPwarningRooms overlap.
W_ROOM_TOO_SMALLwarningRoom is implausibly small.
W_ROOM_UNREACHABLEwarningRoom cannot be reached from the entrance.
W_SANITIZED_CONFIGwarningA disallowed config value was stripped.
W_SWING_OBSTRUCTEDwarningDoor swing is obstructed.
W_SWING_ROOM_NOT_ADJACENTwarningswing into <room> names a room the door does not border.
W_UNKNOWN_MATERIALwarningUnknown wall material; using the default hatch.
W_UNKNOWN_STYLE_KEYwarningUnknown style key.
W_UNKNOWN_THEME_KEYwarningUnknown theme key.
W_WINDOW_OFF_WALLwarningWindow does not lie on any wall.

E_ACC_PLACEMENT

erroraccTitle/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.

arch
component c() { accDescr "x" }   # error: only allowed at plan level

E_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.

arch
component bed(x, y) { … }
bed(300)        # error: expects 2 arguments

E_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.

arch
let x = abs(1, 2)   # error: abs expects 1 argument

E_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.

arch
x = 5           # error: declare with `let x = …` first

E_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.

arch
door on w1 at 150% width 900   # error: 150% is past the wall end

E_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).

arch
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.

arch
let f(n) = f(n + 1)   # error: never terminates

E_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.

arch
column at (0,0) size 0x300   # error: width is 0

E_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.

arch
let x = 10 / 0   # error

E_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.

arch
let x = sqrt(-1)   # error

E_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.

arch
door at (0,0) width 0   # error

E_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.

arch
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.

arch
furniture wc against wall w1 side left size 400x700   # error if w1 is unknown or multi-segment

E_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.

arch
furniture bed at (0,0) size 1500x2000 in bedrm   # error: no room id=bedrm

E_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.

arch
furniture wc at (0,0) size 400x700 rotate 45   # error: not a quarter-turn

E_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.

arch
furniture bed at (0,0) size 0x2000   # error

E_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").

arch
import "???" : a   # error

E_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.

arch
import "lib.arch": bed as lib_bed

E_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.

arch
# a.arch imports b.arch which imports a.arch  → error

E_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).

arch
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.

arch
import "lib/missing.arch": a   # error

E_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.

arch
# error originates in the imported file

E_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).

arch
let a = [1, 2]
let x = a[5]   # error

E_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).

arch
door on exterior at 50% width 900   # a front door

E_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.

arch
window on north at 40% width 1200   # light the bedroom

E_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.

arch
door on wall_hall_bath width 800   # connect the hall to the bathroom

E_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.

arch
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.

arch
# 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.

arch
room at (0,0) size 2000x2000 label "Bathroom" uses bath   # supply the missing room

E_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.

arch
# 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).

arch
door on wall_hall_store width 800   # connect the isolated room

E_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.

arch
{ "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.

arch
{ "rooms": [ { "x": 0, "y": 0, "width": "big", "height": 3000 } ] }   # error at /rooms/0/width: expected a number

E_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.

arch
room id=a right-of b size 100x100
room id=b left-of a size 100x100   # error: a ↔ b cycle

E_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.

arch
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.

arch
opening at (0,0) width 0   # error

E_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.

arch
furniture bed in bedrm centered size 1500x2000   # error: no room id=bedrm

E_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
arch preview plan.arch --install   # fetches @resvg/resvg-js, then renders the PNG

E_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.

arch
for i in 0..1000000 { … }   # error: range too large

E_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.

arch
component r(n) { r(n) }   # error: never terminates

E_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.

arch
let x = 1
let x = 2   # error: redefinition

E_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.

arch
room at (0,0) size 0x4000   # error: width is 0

E_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.

arch
component c() { strip right at (0,0) gap 0 { … } }   # error: nested strip

E_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>.

arch
strip right at (0,0) gap 100 { room size }   # error: no extent

E_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.

arch
room at (0,0) size "big" x 10   # error: size needs numbers

E_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).

arch
sofa(0, 0)   # error if no `component sofa` is in scope

E_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.

arch
let x = frobnicate(2)   # error

E_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.

arch
let x = y + 1   # error if `y` is undefined

E_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.

arch
wall exterior thickness 0 { (0,0) (1,0) }   # error

E_WHILE_LIMIT

errorwhile 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.

arch
let i = 0
while i < 1 { column at (0,0) size 1x1 }   # error: i never changes

E_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.

arch
window at (0,0) width 0   # error

W_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.

arch
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.

arch
door id=d_bath at (5200,4000) width 800 wall partition   # lint: bath only off the bedroom

W_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.

arch
room at (0,0) size 3000x4000 label "Bedroom"   # lint: no window

W_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.

arch
room id=bed at (0,0) size 3000x3000 label "Bed"   # only door is on the far side, forcing a long detour

W_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.

arch
door at (0,0) width 500 wall exterior   # lint: under 700 mm

W_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.

arch
door at (9999,9999) width 900   # warning: not on a wall

W_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.

arch
door at (6000,3000) width 800
furniture wc at (5800,3050) size 700x400   # lint: WC blocks the doorway

W_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).

arch
accTitle "A"
accTitle "B"   # warning: "A" is discarded

W_EMPTY_PLAN

warning — Empty plan.

Cause. The plan resolved to no drawable elements.

Fix. Add at least one element (wall, room, …).

arch
plan "Empty" { units mm }   # warning

W_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.

arch
furniture wc at (3000,3000) size 400x700   # lint: no wall behind it

W_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>.

arch
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.

arch
furniture stove at (0,0) size 600x600
furniture sofa at (0,650) size 2000x900   # lint: sofa blocks the stove front

W_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.

arch
furniture sofa at (300,300) size 2000x900
furniture bed  at (1000,500) size 1500x2000   # lint: overlaps the sofa

W_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>.

arch
furniture sofa at (350,2300) size 2000x900   # lint: crosses the partition at y3000

W_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.

arch
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.

arch
wall exterior thickness 200 { (0,0) (4000,0) (4000,3000) (0,3000) close }   # lint: no way in

W_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.

arch
opening at (9999,9999) width 1000   # warning: not on a wall

W_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.

arch
door at (4000,1500) width 600
furniture cabinet at (3600,300) size 700x1200   # lint: the way through squeezes below 700 mm

W_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.

arch
room id=r at (0,0) size 3000x3000   # lint: no door on its perimeter

W_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.

arch
furniture shower at (5000,3000) size 2000x2000   # lint: fills the bathroom against its only door

W_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.

arch
room at (4000,4000) size 3000x2000 label "Bath"   # lint: no fixtures inside

W_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).

arch
wall partition thickness 100 { (4000,0) (4000,4000) }   # lint: stops short, bath left open

W_ROOM_OVERLAP

warning — Rooms overlap.

Cause. Two room rectangles intersect.

Fix. Adjust positions/sizes if the overlap is unintended (it is allowed).

arch
room at (0,0) size 2000x2000
room at (1000,0) size 2000x2000   # warning

W_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.

arch
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.

arch
room at (5000,0) size 3000x3000 label "Store"   # lint: no path from the entrance

W_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:…)).

arch
theme { wall: "<script>" }   # warning: stripped

W_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.

arch
door at (4000,1500) width 900 swing in   # lint: leaf sweeps onto the bed

W_SWING_ROOM_NOT_ADJACENT

warningswing 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.

arch
door on w1 at 50% width 800 swing into faraway   # warning: not on this wall

W_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.

arch
wall exterior thickness 200 material marble { (0,0) (1,0) }   # warning

W_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).

arch
style room { nope: "#000" }   # warning

W_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).

arch
theme { nope: "#000" }   # warning

W_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.

arch
window at (9999,9999) width 1200   # warning: not on a wall