1. Keep evidence and conditions together
A brightness value without a mode, measurement condition or edition is an incomplete fact. Store raw value, unit, source, edition and condition as one evidence record. A sustained measurement and a peak specification should occupy different fields. Normalize units only after checking that the quantities mean the same thing. The example below compares device weight in grams, where an exact unit conversion is straightforward. It deliberately does not treat different display brightness test windows as interchangeable measurements.
2. Return a state, not a convenient average
The resolver returns known, conflict or missing. It does not average disagreements into a plausible-looking fact. Real collections also need a source-quality policy and timestamp review: equal numbers from two copied pages do not establish independent evidence. The small tolerance below handles a unit-conversion rounding difference; it is a choice for this weight example, not a universal tolerance for product data. If identity or measurement conditions differ, split the records before reaching this function.
def grams(item):
factors = {'g': 1, 'kg': 1000}
if item['unit'] not in factors:
raise ValueError('unsupported unit')
return item['value'] * factors[item['unit']]
def resolve_weight(evidence, tolerance=0.5):
if not evidence:
return {'state':'missing', 'value':None}
values = [grams(x) for x in evidence]
if max(values)-min(values) > tolerance:
return {'state':'conflict', 'value':None, 'observations':values}
return {'state':'known', 'value':values[0], 'unit':'g'}
same = [{'value':.2,'unit':'kg'}, {'value':200,'unit':'g'}]
assert resolve_weight(same)['value'] == 200
assert resolve_weight([*same, {'value':220,'unit':'g'}])['state'] == 'conflict'
assert resolve_weight([])['value'] is None
print('compatible units resolve; contradictory evidence remains unresolved')
3. Gate scoring on comparable evidence
An unresolved field does not necessarily block every useful comparison, but it cannot justify a decisive factual claim. Separate whether a product identity is established from whether a particular dimension can be assessed. A score matrix needs an explicit missing value rather than zero. For weighted totals, use dimensions with valid scores for every option in that view, so one product is not rewarded merely because less evidence was available. Explain exclusions beside the total and keep the original evidence accessible for review.
4. Turn disagreement into a review queue
Persist the conflicting field, edition and source references for editorial review, without copying private user notes into the shared queue. Prefer a narrow manufacturer specification page when establishing identity and configuration, but do not assume any source is infallible. A report should distinguish an unresolved specification from different model preferences. Several models can agree on an incorrect shared input, so majority voting is not a substitute for evidence validation. Tests should cover unsupported units, mismatched editions, empty evidence and an explicitly valid zero.
