Menu
Nonconformance Data Model: Fields, Disposition, Quantity

Nonconformance Data Model: Fields, Disposition, Quantity

The record that a scrap code cannot replace: header, affected quantity, containment and disposition fields, plus the balance rule that stops double counting.
Nonconformance Data Model: Fields, Disposition, Quantity

Key takeaways

  • A scrap reason code says why one piece was lost. A nonconformance says a named requirement was not met, on a counted quantity, awaiting a named decision.
  • Disposition is the load bearing field, and it has six values, not two. Each one needs its own authority and its own closing record.
  • The quantity trap, worked below: one record on 480 units writes 492 units of disposition lines, and that 12 unit gap is where cost reports double count.
  • Where a defect is found sets what it costs. The same 480 units cost €4,080.00 at the machine, €6,816.00 at final inspection and €8,676.00 at the customer.
  • Worked below: one month on one line is 8.3% nonconforming by event count and 3.2% by affected quantity, from the same 34 rows, a gap of 5.1 points.

What a nonconformance record is, and what a scrap code is not

A nonconformance is where quality, production and maintenance start arguing. The same event costs three departments different money, and each of them counts it a different way.

Most plants have one record for this and believe they have two. They have a scrap reason code on a production transaction, and call it quality data.

Scrap reason codeNon­con­form­ance record
Why a piece was lostWhich require­ment was not met
Attached to a trans­actionA record with its own life
The piece is already goneThe material still exists
Closed the moment it is writtenOpen until some­body decides
One outcome onlySix possible out­comes
No approverA named approver per out­come

The last two rows are the whole difference. A scrap code has exactly one ending, and a nonconformance has six, five of which put material back into the plant.

So the scope answer is short. A nonconformance covers a defined requirement that was not met, on a defined quantity, awaiting a defined disposition, and a scrap code covers none of those three.

What breaks when a plant has only one of the two

You only haveWhat breaks
Scrap codesHeld material is invisible
Scrap codesNo record of a con­cession
Scrap codesRework costs van­ish
Non­con­form­ancesNo reason taxon­omy to group by
Non­con­form­ancesLosses never reach the stock ledger
Non­con­form­ancesSmall losses never get logged

A scrap only plant reports a clean quality number and has no idea what its inspectors released. In the monthly example below it sees 1.1% and never sees the other 2.1 points of quantity that was held, argued over and shipped.

A nonconformance only plant has the opposite problem: nobody raises a record for four bad housings, so small steady losses appear nowhere and the stock count drifts. You need both, joined on one field, specified at the end of the worked example.

What this page covers that our other pages do not

Our page on nonconformance vs defect owns the definition comparison, including why a defect is a narrower idea. The reason codes themselves belong to our scrap reason code taxonomy, and this page does not respecify a single one of them.

The inspection result data model owns the record that usually detects the nonconformance: the round, the typed answer and the tolerance it was judged against. When a machine caused the problem, the repair side is in the equipment failure record data model.

This page owns what none of those four specify: the header, the affected quantity, the containment action and the disposition decision. In other words, what the record carries between the moment somebody says stop and the moment the material leaves the hold area.

The nonconformance header

The header is one record per event, and an event is one requirement failing on one identifiable quantity of one item. Two requirements failing on the same pallet are two records.

FieldWhat it holdsM
nc_idNCR-2026-0412Yes
raised_at2026-04-12 14:20Yes
raised_byWho stopped itYes
item_idThe part numberYes
batch_idB-2026-0771If batched
work_order_idThe job that made itNo
asset_idMCH-04No
opera­tion_idWhere it was madeNo
require­ment_refDrawing, spec or clauseYes
require­ment_textWhat should have been trueYes
observed_textWhat was actually trueYes
defect_codeFrom the shared taxon­omyYes
detec­tion_pointSee the table belowYes
detec­tion_sourceInspec­tion, opera­tor, auditYes
inspec­tion_result_idThe reading that found itNo
sever­itySafety, regu­latory, fit, cos­meticYes
statusOpen, contained, dis­posi­tioned, closedYes
ownerWho must move it onYes
closed_atWhen the last unit left holdNo

A nonconformance without a require­ment_ref is an opinion. Storing the clause, the drawing revision or the characteristic number is what lets somebody later judge whether the call was right.

Keep defect_code separate from observed_text. The code is what you group by and the text is what a human reads, so collapsing them costs you one or the other.

Detection point is a field, not a note

Where a nonconformance was found is the most valuable field on the record, and it is usually buried in free text. Give it a controlled list of five or six values.

detection_pointWhat it means
incomingOn goods receipt, before use
in_processAt the machine that made it
next_opera­tionFound down­stream, same plant
finalAt final inspec­tion or pack
ware­houseIn stock, after put­away
cus­tomerAfter des­patch

Add origin_opera­tion_id beside it, the step believed to have created the condition. Detection point and origin are different facts, and the gap between them funds an inspection change.

The affected quantity record

The quantity is not a number on the header. It is a small table, because the affected quantity moves after the record opens.

FieldWhat it holdsM
nc_qty_idThe keyYes
nc_idParent recordYes
qty_value480Yes
uomPieces, kg, metresYes
qty_basisFound, sus­pect, con­firmedYes
loca­tion_idWhere these units sitYes
hold_statusOn hold, released, movedYes
as_of2026-04-12 16:05Yes
sourceInitial find or con­tain­mentYes
counted_byWho did the countYes

The field that surprises people is qty_basis. A quantity found, a quantity suspected and a quantity confirmed by a full sort are three different numbers, and reports that add them are wrong by construction.

The second surprise is that qty_value is not frozen when the record opens. In the worked example below it starts at 120 and ends at 480, and both figures are true at their own timestamp.

Give every row an as_of stamp and never update one in place, so a cost report rerun on Friday can still produce Monday's answer.

Containment, correction and corrective action

These three words are used interchangeably in most plants, and they are three different records with three different owners. Keeping them apart is a field level decision.

TermWhat it isRecord
Con­tain­mentProtect every­thing else, nowCon­tain­ment action
Cor­rec­tionDeal with the affected unitsDis­posi­tion
Cor­rec­tive actionStop it hap­pen­ing againA separate record

Containment is measured in hours and asks how far the problem reaches. Correction is measured in units and asks what happens to the material you have, while corrective action is measured in months and asks about the process.

FieldWhat it holdsM
con­tain­ment_idThe keyYes
nc_idParent recordYes
action_typeSegre­gate, stop ship­ment, sortYes
scope_loca­tionWIP, stock, transit, cus­tomerYes
qty_sweptUnits actually looked atYes
qty_foundSus­pect units addedYes
ownerOne named personYes
due_atHours, not daysYes
com­pleted_atWhen the sweep endedNo
verified_byWho checked it was doneYes
statusOpen, done, not appli­cableYes

qty_swept and qty_found must both exist. A sweep that looked at 168 units and found 168 suspect ones is a very different fact from a sweep that looked at 2,400 and found 168.

The sweep, worked

NCR‑2026‑0412 opened at final inspection on 120 units in one pallet, from batch B‑2026‑0771 of 4,800. The containment sweep ran the same afternoon across four locations.

Location sweptSus­pect found
WIP at the next opera­tion168
Finished goods156
In transit36
At the cus­tomer0
Added by con­tain­ment360

The rows add up: 168 plus 156 plus 36 plus 0 equals 360. The affected quantity moves from 120 to 120 plus 360 = 480, which is 10.0% of the 4,800 unit batch.

That is three quarters of the final affected quantity arriving after the record was opened. The zero at the customer is the fact that keeps this an internal problem.

What this page does not specify

This article specifies the record, not the investigation. There is no cause tree here and no eight discipline template, because those are a different model with a different lifetime.

The boundary is one field: corrective_action_id on the header, a pointer to a record this page does not define. For the method behind that record, see our guide to 8D problem solving.

Resist putting cause_code on the header. A cause is a conclusion that takes days, the header closes in hours, and a mandatory cause field on a fast record produces a controlled list of guesses.

Disposition, the load bearing field

Disposition is the decision that closes a nonconformance, and the field everything else supports. Six values cover a manufacturing plant, and each is a different contract.

Dis­posi­tionWho may author­ise
Use as isNamed approver for that require­ment
ReworkPro­duc­tion super­visor, quality con­firms
RepairEngi­neer­ing plus quality
RegradeQuality plus com­mer­cial
Return to sup­plierPur­chas­ing plus quality
ScrapQuality, plus finance above a value

The distinction plants get wrong is rework against repair. Rework brings the item back to the original requirement, repair makes it acceptable for use without meeting it.

So repair needs the same approval as use as is, and rework does not. A reworked part is conforming again, and a repaired part is a permanent departure that somebody must own in writing.

Dis­posi­tionWhat it needs to close
Use as isApprover, justi­fication, expiry
ReworkWork order, reinspec­tion result
RepairMethod, approver, per­manent mark
RegradeNew grade or part number, price
Return to sup­plierReturn note, sup­plier claim ref
ScrapStock move, cost centre, witness

The heaviest word in that table is expiry. A concession is granted for a stated quantity or a stated date, and one without a limit quietly becomes the new specification.

Dis­posi­tionEffect on the balance
Use as isTer­minal, released to stock
ReworkNot ter­minal, reopens
RepairTer­minal, released with a mark
RegradeTer­minal, moves part number
Return to sup­plierTer­minal, leaves the site
ScrapTer­minal, writes the ledger

Rework is the only one of the six that is not terminal. Everything hard about nonconformance quantities comes from that single row.

Concession and deviation are not the same word

TermWhen permis­sion is given
Con­ces­sionAfter the parts exist
Devia­tionBefore they are made

A concession is the paperwork behind a use as is disposition, and it always names a person. If the unmet requirement belongs to the customer, only the customer may approve.

A deviation is granted in advance and is not a nonconformance at all, because nothing was out of specification when the parts were made. Store the approver as an identity, never as a role, because six months later the question is who signed.

The disposition decision record

One nonconformance produces one or more disposition lines, each carrying a quantity. This is where the arithmetic lives.

FieldWhat it holdsM
dis­posi­tion_idThe keyYes
nc_idParent recordYes
dis­posi­tion_codeOne of the sixYes
qty300Yes
dis­posi­tion_seq1, then 2 if it failsYes
is_ter­minalYes on the final out­comeYes
parent_dis­posi­tion_idThe line it followedIf seq > 1
author­ised_byAn identity, not a roleYes
author­ised_at2026-04-14 09:30Yes
justi­ficationWhy this was accept­ableIf use as is
con­ces­sion_refCus­tomer or internal permitIf use as is
expires_atOr expires_after_qtyIf use as is
rework_wo_idThe job that does the workIf rework
reinspec­tion_idProof it con­forms nowIf rework
scrap_reason_codeFrom the shared taxon­omyIf scrap
stock_move_idThe ledger trans­actionIf scrap
cost_centreWho carries the lossYes

Three fields there are the ones nobody has: dis­posi­tion_seq, is_ter­minal and parent_dis­posi­tion_id. They exist for one reason, which is the next section.

The quantity trap, worked with numbers

Return to NCR‑2026‑0412 with its affected quantity settled at 480 units. On 14 April the material review board split it four ways.

Dis­posi­tion (seq 1)Units
Rework300
Scrap90
Use as is (con­ces­sion)72
Return to sup­plier18
Total480

Those reconcile: 300 plus 90 plus 72 plus 18 equals 480. Then the rework happened, and it did not all work.

Of the 300 reworked units, 288 passed reinspection and were released, and 12 failed and were scrapped. That second decision is a disposition line too, with dis­posi­tion_seq = 2 and its parent pointing at the rework line.

1. The balance equation

This is the only integrity check the record really needs. The sum of quantities on terminal disposition lines must equal the affected quantity.

Ter­minal lineUnits
Released after rework288
Scrapped after rework12
Scrapped directly90
Use as is72
Returned to sup­plier18
Total480

Check it: 288 plus 12 plus 90 plus 72 plus 18 equals 480, the affected quantity exactly. Now total every disposition line instead, terminal or not.

All linesUnits
Rework (seq 1)300
Scrap (seq 1)90
Use as is (seq 1)72
Return (seq 1)18
Scrap (seq 2)12
Total492

That total is 492, and 492 minus 480 equals 12. Only 480 pieces ever existed, so 12 have been counted twice, which is 2.5% of the record.

is_ter­minal is the field that stops it. Report quantities from terminal lines and the total is always the affected quantity, report cost from every line and each activity is paid for exactly once.

2. Where the cost report double counts

Take a scrap standard cost of €14.20 per unit and a rework cost of €3.75 per unit. The return to supplier is a supplier recovery, so it is excluded here.

The scrapped quantity is 90 plus 12 = 102, and the rework quantity stays 300 because all 300 were physically reworked. So the correct direct cost is 102 × 14.20 = €1,448.40 plus 300 × 3.75 = €1,125.00, which is €2,573.40.

VersionResult
Ter­minal lines, both activi­ties€2,573.40
Rework billed on 288 only€2,528.40
The 12 scrapped in two places€2,743.80

The middle row drops the rework labour on the 12 that failed: 12 × 3.75 = €45.00 understated. The bottom row charges those 12 units of material twice: 12 × 14.20 = €170.40 overstated.

Check both: 2,573.40 minus 2,528.40 equals 45.00, and 2,743.80 minus 2,573.40 equals 170.40. The spread between the two wrong answers is €215.40 on one record.

Detection point changes the cost, not the defect

The same defect on the same part costs different money depending only on where it was found. Take the same 480 units and assume, for a clean comparison, that all were scrapped at each point.

Every input below is an assumption you must replace with your own numbers.

InputValue
Mate­rial per unit€6.40
Con­ver­sion to opera­tion 30€2.10
Full con­ver­sion€7.80
Out­bound freight€1.10
Return freight€1.90
Fixed event cost at cus­tomer€420.00

Unit cost at the machine is 6.40 plus 2.10 = €8.50. At final inspection it is 6.40 plus 7.80 = €14.20, and at the customer it is 14.20 plus 1.10 plus 1.90 = €17.20.

Found atSumCost
The machine480 × 8.50€4,080.00
Final inspec­tion480 × 14.20€6,816.00
The cus­tomer480 × 17.20 + 420€8,676.00

Final inspection costs 1.67 times the machine, and the customer costs 2.13 times it. Moving the catch from the customer to the machine is worth €4,596.00 on this one event.

The gap between the machine and final inspection alone is €2,736.00, which is 6,816.00 minus 4,080.00. That is the number that pays for a gauge at operation 30, and it is computable only if detection point is a field.

Say what the customer figure leaves out, because that matters more than the figure. It contains no price concession, no lost order and no line stop charge, so treat it as a floor rather than an estimate.

The softest input is the €420.00: a containment visit, a sort at the customer, credit note administration. The real disposition on NCR‑2026‑0412 cost €2,573.40 against the €6,816.00 ceiling, so the board's work was worth €4,242.60.

Worked example: one month on one line

One machining cell, MCH‑04, September 2026. The line produced 58,400 units across 412 production lots.

34 nonconformance records were raised, covering 1,868 affected units. 27 were closed inside the month and 7 were still open on the last day, and 27 plus 7 equals 34.

1. The events are not the same size

Affected quan­tityEventsUnits
1 to 10 units21102
11 to 100 units8338
Over 100 units51,428
Total341,868

Both columns reconcile: 21 plus 8 plus 5 equals 34, and 102 plus 338 plus 1,428 equals 1,868.

The 21 smallest events are 61.8% of the event count and only 5.5% of the affected quantity. The 5 largest are 14.7% of the count and 76.4% of the quantity.

2. Where they were found

detection_pointEventsUnits
In process19402
Final inspec­tion111,241
Cus­tomer4225
Total341,868

Both columns add up again: 19 plus 11 plus 4 equals 34, and 402 plus 1,241 plus 225 equals 1,868. Final inspection is a third of the events and two thirds of the quantity, which is what a batch hold looks like.

3. What happened to the quantity

Ter­minal out­comeUnits
Released after rework719
Scrapped after rework23
Scrapped directly611
Use as is402
Returned to sup­plier78
Regraded35
Total1,868

They reconcile: 719 plus 23 plus 611 plus 402 plus 78 plus 35 equals 1,868. Total every line rather than the terminal ones and you get 1,891, because 742 units went to rework and 23 of them were dispositioned a second time.

The surplus is 1,891 minus 1,868 = 23 units, the same trap at monthly scale. Units actually scrapped are 611 plus 23 = 634, which is 1.1% of the 58,400 produced.

Here is the number a scrap only plant never sees. Released back into the flow are 719 plus 402 plus 35 = 1,156 units, which is 61.9% of everything the records touched.

Put the other way, 1,868 minus 634 = 1,234 units were held and then not scrapped. That is 2.1% of production, invisible to a scrap code, and it is where the inspection hours and the arguments actually go.

4. Two defensible rates from the same rows

Both definitions below are honest, both are in use, and both are computed from exactly the same 34 records.

Defi­nitionSumResult
By event count34 ÷ 4128.3%
By affected quan­tity1,868 ÷ 58,4003.2%

The gap is 5.1 percentage points, which is 8.3 minus 3.2. In counts, it is the 21 tiny events carrying 102 units between them against the 5 batch holds carrying 1,428.

Neither rate is wrong and a plant needs both. Event count tells you how often the process surprises somebody, and affected quantity tells you how much material it puts at risk.

The failure is publishing one of them as the nonconformance rate. Publish the numerator and the denominator beside every percentage, the same discipline our OEE calculation guide applies to availability.

Read the quantity rate next to first pass yield, because a plant low on both is finding its problems somewhere other than in this record.

5. How this joins to the scrap reason codes

FieldSits on
scrap_reason_codeThe dis­posi­tion line
nc_idThe scrap trans­action
stock_move_idThe dis­posi­tion line

A scrap disposition writes a stock transaction and carries a reason code from the same taxonomy the shop floor uses. A scrap transaction raised without a nonconformance leaves nc_id empty, which is legitimate for small losses.

The reconciliation is then one query. Scrap units carrying an nc_id must equal scrap units on terminal disposition lines, and any difference is a record closed without a ledger entry.

Do not build a second reason list inside the quality record: that list lives in our scrap reason code taxonomy. Batches are in the batch process data model and the maintenance tables in the CMMS data model.

Five questions to ask a vendor about nonconformance data

Ask for a demonstration in their system rather than a yes.

  1. Split one record four ways, then fail part of the rework. Show me the balance afterwards, and the field that stops those units being counted twice.
  2. Show me a use as is disposition. I want a named approver, a written justification and an expiry by date or by quantity, and the system refusing to close without them.
  3. Change the affected quantity after containment. Show me both quantities, both timestamps, and a cost report that still reproduces last week's answer.
  4. Export a year of records with detection point and origin operation. As rows, not a screenshot, with the disposition quantities on the same line.
  5. Take me from a scrap disposition to the stock ledger and back. Reason code, stock movement and nonconformance must reconcile without anyone retyping a number.

Before a shortlist, read what is a CMMS, statistical process control, downtime reason code design and the asset hierarchy data model.

How Fabrico helps

Fabrico is an OEE platform with a full CMMS built in, and the data foundation underneath an investigation. It is worth being exact about which half of this article it touches.

What Fabrico does today: machine history per asset, downtime and micro stop capture from PLC connections, IoT sensors and AI cameras, real time OEE context around the moment the event happened, parts consumed per work order, and MTTR and MTBF by machine.

Your team works from the iOS, Android or web app and scans a QR code on a machine or part to open the right card. The AI assistant answers questions about one machine or one failure in plain language, and analytics export to Excel.

Now the honest boundary, stated plainly. Fabrico has no root cause workflow: no cause tree, no auditor ready investigation dossier, and it does not force structured Problem, Cause and Remedy codes before a work order can be closed.

Fabrico also does not advertise a nonconformance record, a disposition workflow or a quality module. Treat everything in this article about headers, dispositions and quantity balances as a specification to test your shortlist against, not as a feature list.

Three more boundaries worth saying out loud. A work order in Fabrico is always created and confirmed by your team, failure forecasting is not a standard feature, and production planning and scheduling are not part of the product.

Want the machine side of your quality events measured instead of remembered? Book a 30 minute demo with a Fabrico consultant, no commitment, or contact us with your questions.

Frequently asked questions

What fields does a nonconformance record need?

A header with nc_id, raised_at, raised_by, item_id, batch_id, requirement_ref, requirement_text, observed_text, defect_code, detection_point, severity, status and owner. Then three child tables: affected quantity, containment action and disposition decision.

What is the difference between a nonconformance and a scrap reason code?

A scrap code says why one piece was lost and is closed the moment it is written. A nonconformance says a defined requirement was not met on a defined quantity, and it stays open until somebody with authority chooses a disposition.

What are the standard nonconformance dispositions?

Use as is, rework, repair, regrade, return to supplier and scrap. Use as is and repair both need a named approver with authority over the unmet requirement, and where that requirement is the customer's, only the customer can approve it.

How do you stop scrap and rework being double counted?

Give every disposition line a sequence number and an is_terminal flag, and report quantities only from terminal lines. In the example above 480 affected units produce 492 units of disposition lines, and the 12 unit surplus is the rework that later failed.

How is a nonconformance rate calculated?

Either events divided by production lots, or affected quantity divided by units produced. The month above gives 34 ÷ 412 = 8.3% by event and 1,868 ÷ 58,400 = 3.2% by quantity, so always publish which one you used.

Latest from our blog

Define Your Reliability Roadmap
Validate Your Potential ROI: Book a Live Demo
Define Your Reliability Roadmap
By clicking the Accept button, you are giving your consent to the use of cookies when accessing this website and utilizing our services. To learn more about how cookies are used and managed, please refer to our Privacy Policy and Cookies Declaration