Guide 8 · design codes
Rule pack format
A guide for councils, estate developers, body corporates, consultants and anyone who wants a set of planning or design rules checked against a Plotlay project. Version 1, 14 October 2026.
Reference only. Rules are simplified from published sources and may be out of date or incomplete. Verify with the current code and your council, certifier or relevant authority before relying on them.
What a pack is
A rule pack is a list of checks Plotlay runs against a drawn project: a setback, a height, a site coverage, a fence height, a door width. Each check reports one of:
| Result | Meaning |
|---|---|
| PASS | Meets the rule. |
| WARN | Passes but is close to the limit (inside its warn band), or is just outside it but within the rule's tolerance. |
| FAIL | Does not meet the rule. |
| UNKNOWN | Not measured yet, or depends on a fact nobody has entered. UNKNOWN is never a pass. |
Plotlay ships packs for the Australian states, New Zealand, England, Ireland, the US, Canada and accessibility. Anyone can write their own as JSON, YAML or CSV and import it into a project (Design codes, Import a pack), or have an AI agent connected to Plotlay build one from a document.
A project keeps a copy of each pack it uses, at its version. A later check gives the same answer until someone chooses a newer version.
A small example
{
"id": "seaview-estate",
"name": "Seaview Estate design guidelines",
"kind": "template",
"jurisdiction": "Seaview Estate",
"version": "2026.1",
"published": "2026-03-01",
"source": "Seaview Estate Design Guidelines, March 2026",
"source_url": "https://example.org/seaview-guidelines.pdf",
"disclaimer": "The developer's design approval is still needed.",
"rules": [
{ "id": "front-setback", "title": "House front setback", "ref": "4.1",
"each": "dwellings", "metric": "front_setback_mm", "op": ">=", "limit": 6000, "unit": "mm",
"tolerance": 200, "note": "Porches may sit 1.5 m forward of the building line." },
{ "id": "fence", "title": "Front fence height", "ref": "6.2",
"each": "fences", "where": { "front": true }, "metric": "height_mm", "op": "<=", "limit": 1200, "unit": "mm" },
{ "id": "colours", "title": "Roof and wall colours", "ref": "5.3",
"each": "site", "op": "check", "note": "From the approved palette only." }
]
}
Pack fields
| Field | Required | What it is |
|---|---|---|
id |
yes for sharing | Short id: lower case letters, digits and dashes. The same id at a new version is an update. |
name |
yes | What the pack is. |
kind |
no | code (a design code or council document), template (your own checks, not an official code), practice (common practice). Reports say when a pack is a template. |
jurisdiction |
yes for sharing | NSW, VIC, NZ, GB-ENG, US, or your own name for it. |
version |
yes for sharing | Any text: 2026.1, 3. Projects pin to it. |
published |
no | The date of the source document. |
instrument, instrument_version |
no | The document and the version or amendment the rules come from. |
source, source_url |
yes for sharing | The document and a link to it. |
disclaimer |
no | Shown with the pack and on reports. Plotlay adds the reference-only line. |
short |
no | A short name put before each clause reference on reports (R-Codes 5.1.2). |
params |
no | Facts a person enters per project, below. |
indicative |
no | true for guidance only (building code notes, accessibility basics). |
rules |
yes | The checks. |
Rule fields
| Field | What it is |
|---|---|
id |
Short id, unique in the pack. |
title |
Plain words: "House front setback". |
ref |
The clause, standard or table: cl 3.10(3), Table B, B2-1. |
source_url |
A link to the clause, if the source has one. Otherwise the pack's link is used. |
each |
What the rule applies to: site, dwellings, structures, fences, rooms, openings, driveways, crossovers, trees, roofs, earthworks. |
where |
Which of those: { "role": "outbuilding" }, { "room_type": "bedroom" }, { "kind": "door" }, { "front": true }, { "status": "proposed" }, { "layer": "Stage 2" }. A list means any of. |
metric |
What is measured (the table below). |
op |
<= < >= > == != between (limit [min, max]) in (limit [a, b]) exists check. |
limit |
The figure, in unit. Leave it out (or null) in a template still to be filled in: the rule reports UNKNOWN. |
limit_from |
A limit that depends on a project fact or a site figure (below). |
applies_if |
The rule applies only in some cases (below). |
unit |
mm, m², %, °, or none. Lengths are millimetres. |
warn_within |
A pass this close to the limit is WARN. |
warn_within_pct |
The same, as a percentage of the limit. |
tolerance |
A value this far outside the limit is WARN, not FAIL: 6000 with tolerance 200 accepts 5800. |
note |
What the rule says in plain words, its exceptions, and anything the check simplifies. |
op: "check" is for what a drawing can't measure (overlooking, overshadowing, materials, waterproofing). It is listed once, as UNKNOWN, for someone to check by hand. Put the figures in the note.
What can be measured
each |
Metrics |
|---|---|
site |
site_area_m2, lot_width_mm (the street frontage), coverage_pct (roofed area as % of the site), roofed_m2, soft_m2, soft_pct, landscaped_pct, pos_m2, pos_largest_m2, pos_min_dim_mm (private open space marked on the plan), car_spaces (a project fact) |
dwellings |
front_setback_mm, min_side_setback_mm, rear_setback_mm, floor_area_m2 (footprint), and the project facts building_height_mm, wall_height_mm, storeys, gfa_m2 |
structures |
carports, verandahs, sheds and pergolas (role: carport, verandah, outbuilding): floor_area_m2, post_height_mm, roof_height_mm, roof_pitch_deg, front_setback_mm, min_side_setback_mm, width_mm, length_mm, boundary_length_mm, forward_of_building_line, attached |
fences |
height_mm, length_mm, front |
rooms |
floor_area_m2, min_dim_mm, ceiling_height_mm (when measured or set), room_type (bedroom, bathroom, wc, laundry, kitchen, living, study, hall, garage, storage, other), wet |
openings |
doors and windows: kind (door or window), width_mm (as drawn), clear_width_mm (set in the Inspector), height_mm, sill_mm, room, external |
driveways |
width_mm, width_at_boundary_mm, gradient_pct, centreline_angle_deg |
trees, roofs, earthworks |
see list_rule_packs on the connector |
Only a height someone measured or entered counts: drawing defaults never pass a rule.
Facts the drawing doesn't hold: params and limit_from
Declare what a person must enter for the project:
"params": [
{ "id": "wa_r_code", "label": "R-Code density", "type": "select", "options": ["R20", "R30", "R40"] },
{ "id": "zoning_front_setback_mm", "label": "Front setback in your zoning code", "type": "number", "unit": "mm", "help": "From your local zoning code" }
]
Then a rule's limit can come from it:
- A table by a choice:
"limit_from": { "param": "wa_r_code", "values": { "R20": 6000, "R30": 4000 } } - Bands by a number or a site figure:
"limit_from": { "metric": "site.site_area_m2", "bands": [[300, 3000], [900, 4500], [null, 6500]] }(up to and including 300 m²: 3000; up to 900: 4500; more: 6500) - The figure itself, for a template where the number comes from a local code:
"limit_from": { "param": "zoning_front_setback_mm" }
applies_if limits a rule to some cases: { "param": "nsw_zone", "in": ["R1", "R2"] }, { "metric": "site.site_area_m2", "between": [450, 100000] }, { "param": "storeys", "op": ">=", "value": 2 }.
Until a fact is entered, its rules report UNKNOWN and say which fact they need. The common facts building_height_mm, wall_height_mm, storeys, gfa_m2 and car_spaces are shared by every pack.
YAML
The same fields:
id: seaview-estate
name: Seaview Estate design guidelines
version: "2026.1"
source_url: https://example.org/seaview-guidelines.pdf
rules:
- id: front-setback
title: House front setback
ref: "4.1"
each: dwellings
metric: front_setback_mm
op: ">="
limit: 6000
unit: mm
tolerance: 200
Quote operators (">=") and versions ("2026.1").
CSV
One rule per row. Pack details go on # key: value lines above the header:
# id: seaview-estate
# name: Seaview Estate design guidelines
# version: 2026.1
# source_url: https://example.org/seaview-guidelines.pdf
id,title,ref,each,where,metric,op,limit,unit,tolerance,note
front-setback,House front setback,4.1,dwellings,,front_setback_mm,>=,6000,mm,200,
fence,Front fence height,6.2,fences,front=true,height_mm,<=,1200,mm,,
colours,Roof and wall colours,5.3,site,,,check,,,,From the approved palette only.
where: role=outbuilding;status=proposed. limit: 3000, 2..10 for between, a|b for in. limit_from, applies_if and params: JSON in the cell, with quotes doubled.
Versions and updates
- A project copies the pack at its version when it is chosen. Checks use that copy.
- Importing the same id at the same version replaces it. A new version is only used when someone chooses it (the app asks; the connector takes
upgrade: true). The version used before is kept in the pack's history. - A pack saved to a library is never changed: a change is a new version.
- Every compliance report lists the packs and versions it used.
Rules an AI agent enters
An agent connected to Plotlay can build a pack from a document it has read (create_rule_pack, update_rule_pack, import_rules). Each rule it enters is marked "needs review" until a person confirms it in the app (Design codes, Rules, Confirm). Until then, reports say: "Includes rules entered by an AI agent and not yet reviewed."
Good practice for authors
- Cite a clause in
refand a link insource_urlfor every rule. - Never guess a number. If a figure depends on something you can't settle, use
limit_fromwith a param, orop: "check"with the figures in the note. - Say in the note what the check simplifies (an average of neighbours' setbacks, a formula, an exception).
- Give each version a date, and say which amendment of the source it reflects.