How Zabel scores a product
Published in full so that anyone - a shopper, a nutritionist, a brand - can reproduce any score by hand. If you find an error in it, we want to hear about it.
Arithmetic, not opinion
The score is a fixed formula over the label's own numbers. A language model reads the pack and writes the explanation. It never decides the score, and nothing it wrote is published until a person promotes it.
Every threshold has a source
No number in this method is ours. Each one comes from ICMR-NIN, FSSAI, WHO or a published evaluation, and the source is stored beside the threshold rather than cited from memory.
No score without the data
If a required value is missing from the pack, there is no score - not a zero and not a guess at the middle. A confident wrong number is worse than none.
100 points, split four ways
Each component is scored independently and the four are added. Half the weight sits on the nutrients a regulator would put a warning on, because that is the thing most likely to matter to the person holding the pack.
Some things sit above the score rather than inside it. A banned additive, an allergen on your profile, or a pack that would carry a front-of-pack warning is shown first, whatever the total came to. One warning means the pack cannot be called better than fair; two mean it cannot be called better than poor. The total is never adjusted - only the word attached to it, and the app names the flags that did it.
A nutrient the label did not declare earns nothing and keeps its weight. Dropping the part and spreading its weight over the declared ones sounds fairer and rewards omission - a pack with 7 g of protein and no fibre line would outscore the same pack honest enough to print 0 g. Beverages are scored on their own weights, because on the solid ones a full-sugar cola collected points for containing no salt or fat.
One product, all the way through
A pack of masala instant noodles. The panel is a realistic Indian one rather than any particular brand's, and this same case is in the test suite with the numbers below as its expected answer - derived independently of the code, so that the engine and the method can be caught disagreeing.
19 + 7 + 2 + 2 - and the pack would carry HIGH IN SODIUM and HIGH IN SATURATED FAT
The four components are rounded to whole numbers together rather than one at a time, so a breakdown never adds to 29 under a headline of 30. That is the only thing between the figures above and the number in the app.
The five bands
Colour and word always travel together, so a band still reads when it is printed in grey or seen by someone who is colour blind. The band can be pulled down by a front-of-pack warning; it is never pushed up.
Change log
The method only changes with a new version number, and a score records the version that produced it - so a score you saw last month can still be explained next year. Correcting a misread panel re-scores that product; it does not rewrite the method.
Anyone can dispute one - a shopper who thinks a value was misread, or a brand that thinks a threshold was applied wrongly. Every reading in the app has a report button that needs no account, and a person works the queue.