Lesson 4.2Lesson 4.2 · Automated Code Checking
How Checking Works
Follow one rule through the engine - parse it, find the relevant model elements, read their properties, test the condition, and report pass, fail or the result that matters most: cannot determine
A green tick and a red cross are the easy answers. The verdict that decides whether a checker is honest is the third one.
It is tempting to imagine automated checking as a black box: model in, verdict out. But the box has a definite shape, and knowing its stages is what lets you read a report critically instead of trusting a colour. Every model-based check, however sophisticated, runs one rule at a time through the same short pipeline: it parses the encoded rule to know what to test, finds the model elements the rule applies to, extracts the properties the rule needs, tests the condition, and records a result. Run that pipeline over every rule and every element and you get a report.
The stage most people overlook is the result itself - and specifically the fact that there are three possible outcomes, not two. A check can pass, it can fail, or it can be unable to decide because the data it needed was missing, ambiguous or mis-classified. That third verdict, cannot determine, is not a failure of the tool; it is the tool being honest about the limits of the data it was given. A checker that quietly turns 'I could not find the width' into a silent pass is far more dangerous than one that flags the gap loudly. This lesson walks the pipeline stage by stage so you understand what actually happens inside a check - and why the cannot-determine result is the single most important thing an honest engine produces.
Parse -> Find -> Extract -> Test -> Report. Three verdicts: PASS / FAIL / CANNOT-DETERMINE. Read cannot-determine FIRST. Risk lives before the comparison, not in it.
Parse the rule, then find the elements it applies to
A check begins with an encoded rule - the machine-readable form built in Module 3. The first stage is to parse it: the engine reads the rule's structure and works out what it is actually asking. A rule like 'the clear width of a corridor in an assembly occupancy shall be at least 1.8 m' decomposes into parts the engine can act on: a scope (which elements it governs - corridors, and only in assembly occupancies), a property to inspect (clear width), a comparison (greater than or equal to), and a threshold (1.8 m). Parsing turns a statement into an executable test with named ingredients. If the rule is written in a structured rule language or a decision table, this stage is clean; if it was captured loosely, ambiguity here is the first place a check can go wrong.
The second stage is to find the relevant elements - to select, from the whole model, exactly the objects the rule governs. This is a query against the model's structure: return every element of type Corridor whose occupancy is Assembly. Everything downstream depends on this selection being right, and it is more fragile than it looks. If a corridor was authored as a generic region rather than typed as a Corridor, it will not be selected, and the rule will silently never test it - a false sense of safety. If occupancy is unset, the engine cannot tell whether the assembly condition applies. The scoping stage is where model quality and rule precision first meet: the rule can only check the elements it can find, and it can only find the elements the model correctly declares.
Together these two stages define the *population* of the check: what is being tested and against which elements. A good engine is transparent about both - it can tell you how many elements a rule matched, which is itself diagnostic. If a corridor-width rule matched zero elements in a building full of corridors, that is not a pass; it is a warning that the model is not carrying corridors as the rule expects. Reading how many elements a rule found, before reading how many passed, is one of the habits that separates a critical user from someone who trusts a colour.
Extract the properties, then test the condition
With the relevant elements selected, the engine moves to extract the properties the rule needs. For each corridor found, it reads the clear-width value; for a travel-distance rule, it may read or compute the path length to the nearest exit; for a coverage rule, it reads areas and the plot boundary. Extraction sounds trivial but carries real subtlety. Some properties are stored directly as data (a door's clear opening was entered by the modeller); some must be derived by the engine from geometry (the actual clear width between two walls, the length of an escape path around obstacles). Derived properties are more powerful and more error-prone: a small modelling quirk can change a computed distance. And every property carries units and assumptions that must match the rule - a width in millimetres tested against a threshold in metres, if mishandled, produces nonsense that looks like a confident verdict.
The fourth stage is to test the condition: apply the comparison the rule specified to the property value. Is 1.5 m greater than or equal to 1.8 m? No - so this corridor fails the rule. Is 2.1 m greater than or equal to 1.8 m? Yes - so this one passes. For a single numeric threshold this is a simple comparison; real rules can be compound (a width that depends on occupant load, a distance limit that changes with sprinkler protection), so the test may combine several extracted values through logic. The important thing is that this stage is genuinely mechanical and reliable *when the inputs are sound*: given the right elements and correct property values, the comparison is exactly the kind of thing computers do without error or fatigue.
This is the heart of why automated checking works for the codeable subset. The mechanical comparison that a tired human might mis-add or skip across two hundred corridors is run identically for every one. But notice where all the risk has moved: not into the comparison, which is trustworthy, but into the stages before it - did the engine find the right elements, and did it extract the right values with the right units and assumptions? The test is only as good as what feeds it, which is why the report must distinguish a genuine fail from a case where the engine could not get a trustworthy value at all.
Report - and the crucial third verdict
The final stage turns per-element results into a report a human can act on. For every rule and every element it governs, the engine records an outcome, and an honest engine records three possible outcomes, not two. Pass: the condition was tested on a trustworthy value and held. Fail: the condition was tested and did not hold - this corridor really is too narrow in the model. And cannot determine: the engine could not reach a trustworthy verdict, because the property was missing, the element was mis-classified, the units were ambiguous, the value fell outside what the rule anticipated, or the rule itself was not fully codeable.
The cannot-determine verdict is the single most important thing an honest checker produces, and the easiest to get wrong. The dangerous failure mode is a tool that collapses three outcomes into two - that treats 'I could not find a width' as a pass because it found nothing to flag. That silent pass is exactly how automated checking causes harm: it converts an unanswered question into false reassurance, and a designer or examiner reading a clean report never learns that a whole set of elements was never actually tested. A good report instead surfaces every cannot-determine as loudly as every fail, because both demand human attention - the fail to fix or justify, the cannot-determine to complete the data or accept that the rule needs a human.
Reading a report well, then, is a skill in itself. Do not read the pass count first; read the cannot-determine list and the matched-element counts, because those tell you how much of the rulebook was genuinely evaluated and how much quietly slipped through gaps in the model. A rule that matched zero elements, a property that was missing on half the doors, a derived distance the engine flagged as uncertain - these are not clean results, they are open questions. The competent stance is to treat the report as a structured to-do list of flags and unresolved questions that narrows a vast rulebook to what needs a human's eyes, not as a verdict on the building. The engine's honest 'I cannot tell' is worth more than a confident answer built on data it did not have - and a pass, remember, still describes only the data given and is never an approval.
Why the pipeline is powerful and where it stays fragile
Step back and the pipeline explains both the power and the fragility of automated checking in one picture. The power is concentrated in the test stage and its repetition: a clear comparison, run identically over every relevant element, tirelessly and in seconds. That is a genuine advance over a human tracing hundreds of elements by hand, and it is why the codeable, quantitative rules - widths, distances, slopes, areas, counts, the staples of development-control and life-safety scrutiny - are checked so well. Nothing about the comparison is fatigued, inconsistent or forgetful.
The fragility lives everywhere else. Parsing can misread a loosely written rule. Element-finding can miss objects the model failed to classify, so a rule silently tests nothing. Property extraction can read a wrong unit, or derive a distance that a modelling quirk distorted. And the codeability of the rule caps the whole thing: a pipeline can only ever run rules that reduce to a scope, a property, a comparison and a threshold - the judgement-laden and performance rules never enter it at all. The comparison is trustworthy; the inputs and the rule's very codeability are where error enters.
This is why the report's three verdicts matter so much, and why an honest engine is transparent about matched-element counts and cannot-determine cases: they expose the fragile stages instead of hiding them behind a confident colour. It is also why the human is not optional. Someone has to read the report critically - to ask whether a rule found the elements it should have, whether a pass rests on trustworthy values, whether the cannot-determines point to missing data or to rules that were never codeable - and someone accountable has to decide what the results mean for the design. The pipeline narrows a vast rulebook to a short, structured list of flags and open questions with real speed and consistency; it does not, and cannot, close them. The qualified professional of record and the approving authority do that, and the authoritative rule remains the actual code, not the encoded version the engine happened to run.
Five stages
How one rule is run
Parse the rule, find the relevant elements, extract the properties, test the condition, report the result. Every model-based check runs this pipeline. Modules 3.1, 4.1.
Three verdicts, not two
What a result can be
Pass, fail, and cannot determine. The third is honesty about missing or untrustworthy data; a tool that hides it as a silent pass is the dangerous one. Modules 5.2, 9.4.
Risk lives before the comparison
Where wrong verdicts come from
The test is reliable; element-finding and property extraction (types, units, derived values) are fragile. A rule matching zero elements is a warning, not a pass. Module 5.2.
The report is a to-do list, not a verdict
How to use the output
It narrows the rulebook to flags and open questions for a human; it does not certify the building or approve it. The professional and authority decide. Modules 7.2, 7.3.
Workshop — run one rule through the pipeline by hand
The pipeline is easiest to understand when you are the engine. In this workshop you will take one rule and a tiny model and execute all five stages yourself, deliberately building in a gap so you generate a genuine cannot-determine result and see why it matters.
Just a rule, a small element table and a notebook - you are the engine here, so no software is needed to understand the pipeline; the real tools come in lesson 4.4, and binding compliance always stays with the professional, the authority and the actual code.
Goal: internalise the five stages and the three verdicts Inputs: one quantitative rule + a small list of model elements + a notebook Time: ~45 minutes
- 1Write a small model as a table: five or six elements (say corridors and doors), each with a type and some properties - and deliberately leave one property missing and mis-type one element so it will not be selected.
- 2PARSE your chosen rule into four parts: scope (which elements), property (what to read), comparison, and threshold. Write them out explicitly.
- 3FIND and EXTRACT: select the elements the rule governs (note which your mis-typed element excludes), and read the property for each. Mark where a value is missing or ambiguous.
- 4TEST and REPORT: apply the comparison to each element and record pass, fail, or cannot-determine - giving cannot-determine to the missing-value and note how many elements the rule matched.
- 5Reflect in writing: what would have happened if your tool had reported the cannot-determines and the un-selected element as passes, how the matched-element count exposed the mis-typed one, and why cannot-determine is more honest than a silent pass - flagged as reasoning.
You’ll walk away with
A one-page trace: a tiny model table, one rule parsed into scope/property/comparison/threshold, the five stages executed by hand to a per-element report of pass/fail/cannot-determine, and a reflection on why the third verdict and the matched-element count are what keep a checker honest. Keep it for the data lessons in Module 5.
Three altitudes on the same idea
Read the band that fits you — or all three.
Knowing the pipeline lets you read a checking report like an engineer instead of trusting a colour. When you run a self-check, do not read the pass count first. Read how many elements each rule matched - a corridor-width rule that matched zero corridors in a corridor-filled building is a modelling warning, not a pass - and read the cannot-determine list as carefully as the failures, because both demand your attention: the fails to fix or justify, the cannot-determines to complete the data or accept that a rule needs judgement. Understand where risk lives: the comparison at the heart of the check is trustworthy, but element-finding and property extraction (right type, right units, derived distances) are where wrong verdicts are born. Treat the report as a structured to-do list that narrows the rulebook to what needs your eyes, never as a verdict on the building. A pass describes the data given, only the codeable rules were ever run, and the authority - not the engine - approves.
For interiors the pipeline's fragile stages are exactly the ones that decide whether your accessibility and egress checks mean anything. A door-width or ramp-slope rule can only test the doors and ramps the model correctly types and the properties it correctly carries - so a mis-classified opening or an unset clear width will not fail, it will quietly return cannot-determine or never be tested at all. That is why, when you run a check on a fit-out model, the cannot-determine results and the matched-element counts matter as much as the failures: they tell you which accessibility and fire rules were genuinely evaluated and which slipped through gaps in the data. Read the report as a set of flags and open questions to resolve, not as a clean bill of health. And keep the boundary: a passing width check is not proof that a route is usable or that the interior is genuinely accessible, and it is never an approval. Binding fire, egress and accessibility compliance stays with the qualified professionals, the authority and the code.
Learn the five stages and the three verdicts and you understand how automated checking actually works. Every model-based check runs one rule at a time: parse the encoded rule into a scope, a property, a comparison and a threshold; find the model elements the rule governs; extract the properties it needs (some stored, some derived from geometry); test the condition; and report the result. The insight to carry is that there are three outcomes, not two - pass, fail, and cannot determine - and that the third is the one that separates an honest engine from a dangerous one, because a tool that turns 'I could not find the width' into a silent pass manufactures false reassurance. Notice too where risk concentrates: the comparison is reliable, but finding the right elements and extracting correct values (types, units, derived distances) is fragile, and only codeable rules ever enter the pipeline at all. You are expected to explain the pipeline and why cannot-determine matters - not to build an engine.
“An automated check has two outcomes: it passes or it fails. If the report does not show a failure for a rule, the design satisfies that rule - a clean report means everything checked out.”
Do it yourself
No software needed — reason it through.
- 1List the five stages of the checking pipeline in order and say in one line what each does.
- 2What four parts does parsing break a rule into? Give the parts for 'corridor clear width shall be at least 1.8 m'.
- 3Why is finding the relevant elements fragile, and what does a rule matching zero elements actually tell you?
- 4Name the three possible verdicts and explain why cannot-determine is the most important one.
- 5Why should you read the cannot-determine list and matched-element counts before the pass count?
The one line to carry out
Peer-reviewed journals & authoritative standards
- 01Rule-based system — Wikipedia — Rule-based system, 2026.
- 02Business rules engine — Wikipedia — Business rules engine, 2026.
- 03Decision table — Wikipedia — Decision table, 2026.
- 04Data validation — Wikipedia — Data validation, 2026.
We have seen how a rule runs and that many end in cannot-determine. That raises the decisive question: which rules can this pipeline ever run at all, and which are beyond it? Next we draw the practical boundary between the checkable and the uncheckable.
The author
Amogh N P
Architect, interior designer, and creative polymath. Studio Matrx began in his notebooks — his vision of design made honest, useful, and open to everyone. Its Academy is written and taught in his memory, and free, forever.
More about Amogh →