Menu
Inspection and Checklist Result Data Model

Inspection and Checklist Result Data Model

The reference data model for inspection and checklist results: template, round and result line, five result types, outcome codes and compliance math.
Inspection and Checklist Result Data Model

Key takeaways

  • An inspection result is three levels, not one: the template (what to check), the round (one dated run of it on one asset by one person) and the result line (one answer to one check).
  • A check is not always pass or fail. Five result types cover a plant: boolean, numeric reading, value inside limits, a choice from a fixed list, and free text.
  • A failed check does not raise a work order by itself. A person decides, and the link has to be stored in both directions or the audit trail is half missing.
  • Skipped, not applicable and missed are three states. Worked below: one round of 14 checks scores 100.0%, 71.4% or 91.7% depending only on which of the three you recognise.
  • Worked below: one month of rounds is 78.9% compliant counted by round and 83.5% counted by check line, a gap of 4.6 points carried by exactly 58 answered lines.

Three levels, not one

Every plant produces thousands of these records a month, and almost nobody specifies them. That is why they end up as free text nobody can query.

An inspection, an operator round and a preventive maintenance checklist are the same shape of record. They differ in who runs them and how often, not in how they should be modelled.

LevelWhat it isHow many
TemplateThe list of checks and their rulesOne, reused for years
Check defi­ni­tionOne line of the templateMany per template
RoundOne dated run, one asset, one personOne per occur­rence
Result lineOne answer to one checkOne per check per round

The template lives for years and changes rarely. The round lives for one shift, and the result lines it carries must never change again.

Most bad implementations collapse two of these into one. Each collapse destroys something specific.

Collapse thisAnd you lose
Template into the roundEvery round is a new list, so nothing com­pares
Round into the result lineNo record that the round hap­pened at all
Result line into the roundOne com­ment field, no per-check answers
Check defi­ni­tion into the resultLimits and units are retyped every time

The third collapse is the common one. A round stores a status and a free text note, and the fourteen individual answers exist only inside a sentence.

The fourth is the expensive one. If the tolerance lives on the answer rather than on the check, two operators can disagree about the limit and both records look valid.

What this page covers that the plan page does not

Our preventive maintenance plan data model owns the rule that decides when work falls due, the task list behind it and the four trigger types. It stops at the point where a job is raised.

This page owns the record produced when somebody actually walks the route: the round header, the typed answer to each individual check, and the arithmetic that turns those rows into a compliance number.

The repair side belongs elsewhere again. How a breakdown is coded after the fact is in our equipment failure record data model, and the surrounding tables are in the CMMS data model.

The checklist template

The template is the instruction set. One template serves every asset of the same class, which is why its checks name components rather than tags.

FieldWhat it holdsM
template_idTPL-OPR-STARTYes
nameStart of shift operator roundYes
version4Yes
version_valid_from2026-06-01Yes
applies_toasset_class or one assetYes
categoryOperator round, safety, statu­toryYes
estimated_minutes22No
required_quali­fi­ca­tionWho may sign itNo
asset_stateRunning, stopped, eitherYes
is_activeCan still be runYes

Two fields carry more weight than they look. version and version_valid_from are what let you answer the only question an auditor actually asks.

That question is what the instruction said on the day, not what it says now. Stamp the version onto every round at the moment it starts, and never edit a published version in place.

asset_state is the field plants add after their first argument. A vibration check on a running machine and a guard check on a stopped one cannot sit in the same round unless the template says which state it assumes.

The check definition

This is one line of the template, and it is where a checklist stops being paper. Every field here exists so that the answer does not have to carry it.

FieldWhat it holdsM
check_idCHK-07Yes
template_id / versionOwner of this lineYes
sequenceOrder on the routeYes
instruc­tionOne action, one objectYes
component_idWhat it is done toNo
result_typeOne of five, see belowYes
uomUnit, if numericIf numeric
lower_limit40If limits
upper_limit70If limits
target55No
decimals1If numeric
option_list_idFixed choices, if a choiceIf choice
on_failWhat the failure sets offYes
allows_naMay be answered Not app­li­ca­bleYes
allows_skipMay be skipped with a reasonYes
is_man­da­toryBlocks the round if emptyYes
photo_requiredEvidence attachedNo

allows_na and allows_skip are separate on purpose. A check that can legitimately not apply is a different thing from a check somebody could not reach today.

Set both to No on a statutory check and the round cannot be closed without a real answer. That is the only reliable way to stop a safety line being quietly waved through.

Typing the answer

A check is not always pass or fail. Forcing every question into two buttons is the single biggest loss of value in inspection data.

Result typeWhat it stores
BooleanPass or fail, nothing else
NumericA number plus its unit
In limitsA number judged against limits
ChoiceOne value from a fixed list
Free textWords, never a measurement

Boolean is right for a state that genuinely has two values: guard fitted, light on, leak present. Choice is right when the answer is a condition grade rather than a verdict.

A three point grade (Good, Worn, Replace) tells a planner something a pass never will. It is the cheapest upgrade available to an existing checklist.

Why a number stored as text is lost

Take bearing temperature on the main drive of FIL‑01, with a target of 55 °C and limits of 40 and 70 °C. The operator measures 66.0 °C.

Stored as In limits, that reading is inside tolerance and the check passes. It is also 11.0 °C above target and only 4.0 °C below the upper limit.

Stored as text, the row reads "OK" and both of those facts are gone forever. Nothing can recover them later, because the number was never written down.

Now put six identical fillers side by side on the same day. Five read between 54 and 57 °C and this one reads 66.0 °C, which is 9.0 °C above the highest of the other five.

All six pass. Only the typed version makes the outlier visible, and only the typed version can still be charted twelve months later.

Free text answerTyped reading
"runs a bit warm"66.0 °C
No limit check possibleIn limit, 4.0 below the top
Cannot be chartedA series you can trend
Cannot be com­paredSix machines on one axis
Cannot feed a con­di­tion ruleCan, see below

The same reading is what a condition based maintenance rule needs as its input. A checklist that answers in words cannot feed one at all.

Keep a free text note field beside every typed answer, because people see things no field anticipated. Just never let the note be the only place a value lives.

What typing actually costs

The cost is real and worth stating plainly. A boolean check needs one column on the result line, and a numeric check judged against limits needs six.

CostWhat it means
Six columns, not onevalue, uom, lower, upper, target, in_limit
A unit decision per check°C or °F, bar or kPa, fixed once
A decimals rule66 and 66.0 must not both exist
Limit changes need a versionOld rows keep the old limits
Entry is slower on the phoneA number takes longer than a tap

The fourth row is the one that bites eighteen months in. If limits are read live from the template, tightening a tolerance retroactively turns yesterday's passes into failures.

Copy lower_limit, upper_limit and uom onto the result line at the moment of answering. A result must be judgeable on its own, without joining back to a table that has moved on.

The round

The round is one dated execution: one template version, one asset, one person, one window of time. It is the row that proves the work happened.

FieldWhat it holdsM
round_idRND-2026-0912-CYes
template_id / versionStamped at startYes
asset_idPKG-2Yes
sched­uled_forShift or date it was dueYes
started_at2026-09-12 06:08Yes
com­pleted_at2026-09-12 06:30No
per­formed_byWho walked the routeYes
shift_idCYes
statusSched­uled, in progress, com­pleted, missedYes
work_order_idIf run from a PM jobNo
lines_required14Yes
lines_answered14Yes
signed_by / signed_atClosing signatureIf statu­tory

Keep sched­uled_for separate from started_at. Without it, a round due on the night shift and walked at ten the next morning looks perfectly on time.

A round that was never started still needs a row. A missing row is indistinguishable from a round nobody ever scheduled, which is how a whole shift disappears from a compliance report.

Performed and recorded are two different times

This is the field pair almost every home grown checklist misses, and it is the one that decides whether the data means anything.

FieldWhat it answers
per­formed_atWhen the check was actually done
recorded_atWhen the answer reached the system

Store one timestamp and you have given up the ability to tell the two apart. A whole round can then be filled in at the end of the shift from memory, and nothing in the data objects.

The gap between them is worth deriving and keeping: entry_lag_minutes. Small lags are normal, and a pattern of large ones is a finding about the process, not about one person.

The shape of the evidence is simple. A round of 14 checks whose result lines were all written inside 95 seconds averages 6.8 seconds per check, which is 95 divided by 14.

The same round genuinely walked in the estimated 22 minutes gives 1,320 seconds across 14 checks, or 94.3 seconds per check. Those two numbers describe very different mornings.

Neither number proves anything on its own, and that matters. It is a question to ask, not a verdict to issue, and the answer is often a broken route rather than a dishonest operator.

The result line

One row per check per round. This is the table that grows to millions of rows, and the one worth getting exactly right.

FieldWhat it holdsM
result_idThe keyYes
round_idParent roundYes
check_id / versionWhich check, which wordingYes
outcome_codePass, fail, na, skipped, missedYes
result_valueThe number or the choiceIf typed
result_uomCopied from the checkIf numeric
lower_limit / upper_limitCopied at answer timeIf limits
in_limitDerived, never typedIf limits
reason_codeWhy skipped or not app­li­ca­bleIf skipped
noteFree text beside the valueNo
photo_idEvidenceIf required
per­formed_atTime of the check itselfYes
recorded_atTime it was writtenYes
per­formed_byMay differ from the roundYes
work_order_idJob raised from this lineNo

in_limit must be derived from the value and the copied limits, never entered. A typed in_limit flag is an override that survives every later correction of the reading.

Result lines are evidence, so they are append only. A correction is a new row with a link to the one it supersedes, not an update in place.

Skipped, not applicable and missed

These are three different things and they are almost always stored as one. Each does something different to a compliance percentage, which is exactly why they get merged.

outcome_codeWhat it means
passAnswered, within rule
failAnswered, outside rule
naCannot apply today, by design
skippedCould not be done, reason given
missedNobody answered, no reason

The rule that follows from the table is short. Not applicable leaves the denominator, skipped stays in it as a closed line, and missed stays in it and counts against you.

Not applicable needs guarding, because it is the easiest outcome to abuse. Require a reason_code, allow it only where the check definition permits it, and report its rate per check every month.

One round, three scores

Take round RND‑2026‑0912‑C on line PKG‑2, a 14 check operator round. One line was genuinely forgotten.

OutcomeLines
pass9
fail1
na (skid out of service)2
skipped (no access)1
missed (left blank)1
Total14

The rows add up: 9 plus 1 plus 2 plus 1 plus 1 equals 14. Now score the same round three ways.

Scoring ruleSumResult
All three lumped and dropped10 ÷ 10100.0%
All three lumped as missed10 ÷ 1471.4%
Three states kept apart11 ÷ 1291.7%

The third line is the honest one: the two not applicable lines leave the denominator, and the skipped line counts as closed because it carries a reason. That leaves 11 of 12.

The spread is 28.6 points on a single round, which is 100.0 minus 71.4. Nothing about the plant changed between those three numbers.

The first rule is the dangerous one, because it reports 100.0% on a round with a forgotten check in it. If your inspection compliance never drops below the high nineties, check what the denominator is doing.

The out of limit rule

Every check definition needs a field that says what a failure sets off. Without it, a failed check is a row nobody is obliged to look at.

on_fail valueWhat happens
recordStored, visible on the round
flagListed for review by a super­visor
notifyPush or email to a named role
promptThe app offers to open a job
blockRound cannot be closed

Be honest about the limit of this field. A failed check does not turn into a work order on its own, and any model that pretends otherwise is selling you something.

A person looks at the reading, decides whether it is a fault or a bad measurement, and raises the job. The system's part is to make that decision unavoidable and to record who made it.

There is a good reason for the human step, beyond caution. A single out of limit reading is often a sensor, a thermometer held against the wrong surface, or a machine that has been running for four minutes instead of forty.

The link has to run both ways

One failed reading can end up producing more than one job, weeks apart. One job can be raised from three failed checks in the same round.

FieldSits on
work_order_idThe result line
source_result_idThe work order
source_round_idThe work order
linked_by / linked_atThe link itself

Store only the forward direction and you can ask which readings were acted on, but a technician opening the job cannot see the number that caused it. Store only the reverse and the opposite happens.

The direction you left out is always the one somebody needs. Because the relationship is many to many, the clean answer is a small link table holding both keys plus linked_by and linked_at.

That last pair is the audit trail. It records that a human being looked at an out of limit reading and made a call, which is the fact an auditor will ask you to evidence.

What happens to the job after that is a different model again, covered in the CMMS data model and, for the repair itself, the equipment failure record.

Worked example: one month of operator rounds

One packaging line, PKG‑2, September 2026. Template CHK‑07 has 14 checks and runs once per shift, three shifts a day, thirty days.

Scheduled rounds are 3 × 30 = 90. Scheduled check lines are 90 × 14 = 1,260.

1. What happened to the rounds

Round statusRounds
Com­pleted, all 14 lines closed71
Started, left part way9
Never started10
Sched­uled90

The rows reconcile: 71 plus 9 plus 10 equals 90. The ten that never started are 11.1% of the month, which is 10 divided by 90.

2. What happened to the check lines

The 71 completed rounds carry 71 × 14 = 994 answered lines. The 9 partial rounds carry 126 lines between them, of which 58 were answered and 68 were not.

The 10 rounds that never started contribute 10 × 14 = 140 unanswered lines. Total answered is 994 plus 58 = 1,052.

Check linesCount
Answered1,052
Un­answered (partial rounds)68
Un­answered (rounds never run)140
Sched­uled1,260

Those reconcile too: 1,052 plus 68 plus 140 equals 1,260. Now split the answered lines by outcome.

outcome_codeLines
pass961
fail27
na44
skipped20
Answered1,052

Again the rows add up: 961 plus 27 plus 44 plus 20 equals 1,052. The failure rate on answered lines is 27 ÷ 1,052 = 2.6%.

Of those 27 failures, the team raised 11 work orders and closed 16 on the spot with an adjustment or a top up. 11 plus 16 equals 27, and every one of the 11 carries the result line that caused it.

3. Compliance, two defensible ways

Both definitions below are honest and both are used in real plants. They are computed from exactly the same rows.

DefinitionSumResult
Rounds com­pleted71 ÷ 9078.9%
Check lines answered1,052 ÷ 1,26083.5%

The gap is 4.6 percentage points, which is 83.5 minus 78.9. In counts it is exactly the 58 lines answered inside the nine partial rounds.

You can prove that the gap is those 58 lines and nothing else. Score the partial rounds as if they had answered nothing, and the line based number becomes 994 ÷ 1,260 = 78.9%, identical to the round based one.

So 58 ÷ 1,260 = 4.6% of the month's check lines is the entire difference between the two headline figures. The definition moved the number, not the team.

Neither definition is wrong, and a plant needs both. Round completion tells you whether the route is being walked, and line completion tells you whether it is being walked properly.

Publish the numerator and the denominator beside every percentage, always. A compliance figure with no counts next to it cannot be checked, which is the same discipline our OEE calculation guide applies to availability.

Where these rounds sit against shifts, and how a due date maps onto a night shift that crosses midnight, is covered in the shift calendar data model. A round that changes hands mid task belongs on the shift handover checklist.

Five questions to ask a vendor about inspection data

Ask for a demonstration in their system rather than a yes. Each of these takes under five minutes to show.

  1. Show me one check answered as a number with limits. Then export twelve months of that one check as rows, not as a screenshot or a PDF.
  2. Edit a template that has history. Change a tolerance, then open a round from three months ago and tell me which limits it shows.
  3. What are your outcome codes? Show me not applicable, skipped and missed as three distinct values, and then show me the compliance formula that uses them.
  4. Do you store performed and recorded separately? Answer one check now, save it in ten minutes, and show me both timestamps on the row.
  5. Take me from an out of limit reading to a job and back. I want the job to show the number, and the reading to show the job, with who linked them and when.

Before a shortlist, read what is a CMMS and equipment maintenance software. For the assets these rounds are walked on, see the asset hierarchy data model.

How Fabrico helps

Fabrico is an OEE platform with a full CMMS built in, and part of this model is in the product today.

Preventive work runs from recurring templates with conditional tasks, on an annual plan view, with approval workflows, work shifts and allocation. Your team works from the iOS, Android or web app and scans a QR code on the machine or the part to open the right card.

Push, in-app and email notifications with smart rules carry the alert when something is due or late, and the audit log keeps the record of who did what. Analytics export to Excel, and the AI assistant answers questions about one machine's history in plain language.

Here is the honest boundary. Fabrico supports recurring templates and conditional tasks, and it does not advertise a typed inspection result with units, tolerances and a derived in-limit flag, so treat everything in this article about result typing, outcome codes and both-way links as a specification to test against your shortlist rather than a feature list.

Two more things Fabrico does not do: a failed check never opens a job on its own, because your team raises and confirms every work order, and failure forecasting is not a standard feature.

Want your inspection rounds stored as data instead of as sentences? Book a 30 minute demo with a Fabrico consultant, no commitment, or contact us with your questions.

Frequently asked questions

What fields does an inspection result record need?

result_id, round_id, check_id with its version, outcome_code, result_value, result_uom, the copied lower and upper limits, a derived in_limit flag, reason_code, note, photo_id, performed_at, recorded_at, performed_by and work_order_id.

What is the difference between a checklist template and a round?

The template is the list of checks and their rules, and it lives for years. The round is one dated run of that template on one asset by one person, and its result lines are evidence that must never be edited afterwards.

Should a failed inspection check create a work order?

No, a person should. The check definition carries an on_fail field that records, flags, notifies, prompts or blocks, and a human decides whether the reading is a fault or a bad measurement before any job is raised.

How do you store skipped and not applicable inspection results?

As separate outcome codes with a reason code, never as one value. Not applicable leaves the denominator, skipped stays in it as a closed line, and missed stays in it and counts against you.

How is inspection compliance calculated?

Either rounds completed divided by rounds scheduled, or check lines answered divided by check lines scheduled. In the example above the same month gives 71 ÷ 90 = 78.9% and 1,052 ÷ 1,260 = 83.5%, so always publish which one you used.

Последно от блога

Начертайте вашата пътна карта за надеждност
Изчислете потенциалната възвръщаемост: запазете час за демонстрация
Начертайте вашата пътна карта за надеждност
Като натиснете бутона Приемам, вие давате съгласието си за използването на `бисквитки`, докато ползвате до този уебсайт. За да научите повече за това как `бисквитките` се използват и управляват, моля, вижте нашата Политика за поверителност и Декларация за Бисквитките