Validation Ledger & Master Bibliography¶
Every claim in this package that rests on a domain fact rather than a mechanism, with the source that would validate it and how strong that footing is today. Mechanism (loaders, gates, tests) is out of scope here — it is testable and tested. This ledger tracks the parts that a green test suite cannot verify.
Companion to docs/VALIDATION.md and paper/SUBMISSION.md. Sources marked
[verified 2026-07] were confirmed against the primary record this session.
Source-strength score¶
| Score | Label | Meaning |
|---|---|---|
| 5 | Locked | Primary human quantitative evidence, verifiable citation; a magnitude may be asserted. |
| 4 | Strong | Direct human study (or several converging) with a verifiable citation; direction solid, magnitude bounded. |
| 3 | Established mechanism | Textbook/consensus physiology, not in dispute; single or secondary citation, or deliberately shape-only (magnitude unlocked by policy). |
| 2 | Structural inference | Follows from food identity/composition; defensible, no primary citation attached yet. |
| 1 | Asserted / flagged | Stated in code or paper but explicitly unverified; source named but unconfirmed, or full-text pending. |
| 0 | Unsourced | No source. Must not bear weight until one is attached. |
The package's own rule holds here: empty beats fake. A 2 with an honest note
is worth more than a 5 asserted from memory.
Master bibliography¶
Primary literature — verified this session¶
- Poon T, Labonté M-È, Mulligan C, Ahmed M, Dickinson KM, L'Abbé MR. Comparison of nutrient profiling models for assessing the nutritional quality of foods: a validation study. Br J Nutr. 2018. PMID 30015603 · PMC6137431. Five regional models vs Ofcom reference across 15,342 foods; discordant classifications 5.3% FSANZ, 8.3% Nutri-Score, 22.0% EURO, 33.4% PAHO, 37.0% HCST. [verified 2026-07] — backs the JOSS Statement-of-Need statistic.
- Brown MJ, Ferruzzi MG, Nguyen ML, Cooper DA, Eldridge AL, Schwartz SJ, et al.
Carotenoid bioavailability is higher from salads ingested with full-fat than with
fat-reduced salad dressings. Am J Clin Nutr. 2004;80(2):396–403.
With fat-free dressing, carotenoid appearance in chylomicrons was
negligible; optimal absorption needed >6 g added fat. [verified 2026-07]
— backs the fat-vehicle gate (LAW-020) and the leafy-green
lipid_phase_present=Falsecalls. - Unlu NZ, Bohn T, Clinton SK, Schwartz SJ. Carotenoid absorption from salad and
salsa by humans is enhanced by the addition of avocado or avocado oil. J Nutr.
2005;135(3):431–436. PMID 15735074. Absorption gain "attributed primarily to
the lipids present in avocado." [verified 2026-07] — backs
avocado: lipid_phase_present=Trueon intrinsic lipid. - Kopec RE, et al. Avocado consumption enhances human postprandial provitamin A absorption and conversion. PMID 24899156. Supporting, intrinsic avocado lipid.
- Gaitán D, … Lönnerdal B, et al. Calcium and nonheme/heme iron absorption. J
Nutr. 2011;141(9):1652–1656. DOI 10.3945/jn.111.138651. Inhibition appears at
≥800–1000 mg single-dose; absent over a whole 4-day diet. [verified 2026-07]
— nuance for LAW-047 (calcium
NARROWS_BOUND, meal-level only).
LAW-026 colonic-energy pack (PMIDs in base_unit_colon_fermentation.skeleton.json)¶
- 38441170 — fibre ± protein fermentation → butyrate.
- 10702589 — fibre digesta → SCFA (in vitro).
- 33995299 — RS source + microbiome set butyrate; EV-041, the anti-overlock evidence.
- 40403748 — methanogenesis / SCFA / human ME. Full-text PENDING — the only in-pack route to promoting the energy magnitude to a lock.
- Candidate queue in
evidence_candidates_LAW026.json: 27786539, 35688319, 36638279, 39748438, 39909254, 40484608, 40817467, 41006931, and further stubs — triage status unverified.
Formal references (paper/paper.bib)¶
- dooley2018 FoodOn — DOI 10.1038/s41538-018-0032-6
- griffiths2024 OBO Foundry food ontology — DOI 10.3233/sw-233458
- wilkinson2016 FAIR principles — DOI 10.1038/sdata.2016.18
- barbieri2015 Code Biology — DOI 10.1007/978-3-319-14535-8
Named in-repo but not yet PMID-linked¶
Legacy citations embedded in law bound text, worth promoting to real refs:
Derman 1977 (tea/ascorbate iron, LAW-004/006), Rossander (orange juice iron),
FAO food energy factors (~8 kJ/g fibre ME), Livesey fermentable-fibre energy
synthesis (~1.5–2.5 kcal/g), SLAMENGHI carotenoid-modifier framework (LAW-020).
Berdanier Ch. 1 errata — five arithmetic errors in a cited secondary source¶
Berdanier CD, Berdanier LA, Zempleni J. Advanced Nutrition: Macronutrients, Micronutrients, and Metabolism. CRC Press, 2009. Ch. 1, pp. 1–19.
Extraction into simulation/energy_accounting.py surfaced five errors in the
printed chapter. They are recorded here rather than silently corrected in code,
because anyone else reading the same pages will hit them and because two of them
propagate into every efficiency figure the chapter reports. Corrected constants
ship in energy_accounting.py with the printed values retained alongside.
| id | Locator | Severity | As printed | Correct |
|---|---|---|---|---|
| ERR-ATP-01 | Table 1.3 p. 9; pp. 10–11 | High | 36 ATP/glucose (NADH=3, FADH2=2) | 30–32 ATP/glucose (P/O 2.5 and 1.5) |
| ERR-GLU-01 | p. 11, Table 1.4 | High | glucose = 294.8 kcal/mol | 669.9 kcal/mol (2802.7 kJ/mol) |
| ERR-TRIP-01 | p. 10 | Medium | C55H106O6 + 76.5 O2; RQ 0.719 | C51H98O6 + 72.5 O2; RQ 0.703 |
| ERR-PALM-01 | p. 9 | Low | C16H22O2 (does not balance on H) | C16H32O2; RQ 0.696 either way |
| ERR-KJ-01 | p. 17 | Low | 2000–2500 kcal = 8368–8577 kJ | 8368–10460 kJ |
ERR-GLU-01 is the instructive one. Berdanier's lipogenesis efficiency is
written as (7597 − glucose cost) / 7597, which returns a positive number only
because the glucose constant is 2.27× too low; substituting the correct heat of
combustion sends the expression negative, which is what exposed the framing itself
as wrong. Recast as product over substrate, de novo lipogenesis comes out ~80%
efficient — agreeing with McGuire & Beerman (4th ed., Ch. 7), who put the cost of
converting glucose to triglyceride at 20–25% of the original energy. It was
caught by cross-reading two textbooks; neither alone would have surfaced it.
Tripalmitin is C51H98O6, MW 807.32, CAS 555-44-2 (NIST WebBook); glucose heat of
combustion via CRC Handbook / Hess's law.
One claim in the extraction did not survive review. The note accompanying
these corrections asserted that the corrected model agrees with McGuire on both
storage routes. It does not. De novo lipogenesis agrees (80.5% computed vs 75–80%
reported). Preformed dietary fat does not: the 10-ATP Table 1.4 accounting gives
99.0%, while McGuire's ~5% cost implies ~95%. The two are measuring different
scopes — esterification alone versus whole-body handling including digestion,
chylomicron assembly and transport — so they are not in conflict, but they are not
interchangeable either. efficiency_preformed_fat_storage() carries the narrower
scope and says so.
- Now: 3 (established mechanism, secondary source, corrections verified against independent chemical references). Target: 3 — this is a textbook-errata record, not a magnitude claim, and does not need promotion.
- Action: none outstanding. If Ch. 1 figures are ever quoted directly in the paper or in product copy, quote the corrected column.
Validation TODO ledger¶
Ordered by risk. "Now" = current strength; "Target" = what closes the gap.
1 — JOSS discordance statistic — paper/paper.md:44¶
- Claim: 5–37% discordant classifications across five models on 15,342 foods.
- Status: deliberately uncited pending verification (
paper/SUBMISSION.md). - Now: 1. Source is verified (Poon 2018, PMID 30015603) → Target: 4.
- Action: add
poon2018topaper.bib, cite[@poon2018]inpaper.md, tick off item 1 inSUBMISSION.md. Numbers in the paper match the source exactly.
2 — Leafy-green fat gate — scripts/fill_packets.py LIPID_PHASE¶
- Claim:
spinach_raw / kale_raw / broccoli_steamed → lipid_phase_present=False. - The worry (retired): that trace ~0.4 g/100 g leaf lipid makes
Falsea confident false negative. Brown 2004 shows fat-free → negligible carotenoid in chylomicrons; the leaf's trace lipid is an order of magnitude below the >6 g threshold.Falseis biologically correct. - Now: 2 (structural) → Target: 4 once Brown 2004 is cited in the rationale.
- Action: attach Brown 2004 to the rationale strings. Fix the wording:
broccoli's
"no fat added and none intrinsic"overstates — brassica does carry trace lipid. Prefer"negligible intrinsic lipid, below the micellar-formation threshold; eaten alone".
3 — Intrinsic-lipid gate opens — scripts/fill_packets.py LIPID_PHASE¶
- Claim:
avocado / salmon_fillet / walnut_whole → lipid_phase_present=True. - avocado: validated — Unlu 2005 shows avocado's intrinsic lipid enhances carotenoid absorption. Now 2 → Target 4 (cite Unlu 2005).
- salmon: oily fish, intrinsic lipid ~8–12 g/100 g, far above threshold — structural, defensible. Now 2.
- walnut: intrinsic lipid ~65 g/100 g, but matrix-encapsulated (cell-bound;
see MATRIX
walnut_whole=intact). Whole vs ground nut releases lipid differently. Defensible but note the matrix caveat. Now 2. - Open question for LAW-020/045: does intrinsic lipid satisfy the same gate as added lipid? Evidence (avocado) says yes at the micellar step. Fine as modeled.
4 — matrix.integrity="partial" is inert — src/biology_as_code/audit/gates.py¶
- Finding:
"partial"is a valid schema enum value, but the matrix BOUND rules only fire ondestroyedandintact.oats_porridge_plainandwhole_wheat_bread(bothpartial) therefore get no bound adjustment. - Not a source gap — a design gap. Score N/A.
- Action (decide): either add a
partialbound rule (a source-backed direction), or document thatpartialis intentionally inert because its net direction is ambiguous. Leaving it silent invites a wrong assumption.
5 — LAW-045 semantic fit — src/biology_as_code/audit/gates.py law_refs¶
- Finding: the fat-vehicle gate cites LAW-020 and LAW-045. LAW-045's categorical closure is host-competence (apoB-48/MTP; abetalipoproteinemia), not meal lipid. On a meal-composition gate, LAW-020 is load-bearing; LAW-045 is a downstream export step that dietary lipid feeds as TAG substrate.
- Mechanism: 3 (textbook). CI invariant holds (both cards
gate.present=True). - Action: keep the citation but add a code note distinguishing the two choke points; no new source needed. Not a blocker.
6 — REFUTED fifth constitution state — code vs docs¶
- Finding:
ClaimAudit.constitution_statealready returnsREFUTED, andtests/test_claim_audit.pyalready enforces it (CONSTITUTION_STATESincludes it;test_refuted_is_not_collapsed_into_refuse). Only the docs still say "four states":docs/constitution.md,docs/claim-auditor.md("not one of the four states"),docs/cookbook/04-claim-audit.md. - Recommendation (mine): adopt
REFUTEDas the fifth state. "Evaluated and false" is epistemically distinct from REFUSE (declined). Folding it into REFUSE is the exact collapse this package exists to prevent, and leaving the code emitting a value absent from its own docs is latent drift. - Action (docs only): add
REFUTED— "mechanism walk completed and contradicted the claim" — toconstitution.md; update the two docs that say "four."
7 — LAW-026 energy magnitude — stays a soft band¶
- Policy (
LAW026_PROMOTION_DECISION.md, guarded bytest_law026_policy.py): band 1.5–2.5 kcal/g,locked: false, EV-041 forbids a point estimate. - Shape: 3. Magnitude: 1 (pending). Do not lock.
- Only route to a lock: full-text read of PMID 40403748 (needs journal access, not code). If read, update the decision doc first, then the tests.
8 — Calcium–iron bound — src/biology_as_code/audit/gates.py LAW-047¶
- Claim:
calcium_same_meal → NARROWS_BOUNDfor non-haem iron. - Nuance (Gaitán 2011): single-meal inhibition is real at ≥800 mg but attenuates to nil over a whole diet. The meal-level bound is correct; the whole-diet caveat belongs in the note. Now: 3.
- Action: cite Gaitán 2011 in the LAW-047 note; keep the rule.
9 — Iron modifier laws — LAW-004 / LAW-006¶
- Status: real named sources (Derman 1977, Rossander) live in the
boundtext but are not PMID-linked. Now: 3. - Action: promote to formal PMIDs in the law cards.
Scoreboard¶
| # | Item | Now | Target | Blocker |
|---|---|---|---|---|
| 1 | JOSS discordance stat | 1 | 4 | cite Poon 2018 |
| 2 | Leafy-green fat gate = False | 2 | 4 | cite Brown 2004; fix wording |
| 3 | Avocado intrinsic-lipid = True | 2 | 4 | cite Unlu 2005 |
| 3 | Salmon / walnut intrinsic = True | 2 | 3 | structural; matrix caveat |
| 4 | partial matrix inert |
— | — | design decision |
| 5 | LAW-045 gate co-citation | 3 | 3 | note only |
| 6 | REFUTED fifth state |
code done | — | docs reconcile |
| 7 | LAW-026 magnitude | 1 | 5 | full-text PMID 40403748 |
| 8 | Calcium–iron bound | 3 | 4 | cite Gaitán 2011 |
| 9 | Iron laws LAW-004/006 | 3 | 4 | attach PMIDs |
Fastest wins (sources already in hand): items 1, 2, 3, 8 — four citations close them. The one genuinely blocked item is 7, and it is blocked correctly: it needs a journal read, and the policy tests exist precisely to stop anyone "finishing" it without one.
Crowd-sourced contributions¶
This ledger is now fed by the crowd, not only the maintainers. A contribution is a
small JSON file under examples/contributions/, gated by
biology_as_code.contrib.validate_contribution and enforced in CI by
tests/test_contribution.py. The gate is fail-closed and maps onto the
source-strength scale above:
| Verdict | Ledger effect | Strength |
|---|---|---|
ACCEPTED |
a primary source resolves → the target's row can rise | provisional 3; review raises it as corroboration accrues |
NEEDS_SOURCE |
recorded, but bears no weight | 0 — Unsourced |
REFUSE |
rejected: malformed, missing target, or a magnitude with no evidence | — |
The rule of the ledger is the rule of the gate: empty beats fake. An unsourced
contribution is recorded OPEN and promotes nothing; a magnitude asserted without a
primary citation is refused outright.
This is also how the open items above get closed. The shipped example
contrib.evidence-unlu-2005-law020.json is exactly the citation item 3 is waiting
on; contrib.evidence-scfa-energy-law026.json is item 7 done honestly — proposed,
but NEEDS_SOURCE until the human ME study (PMID 40403748) is actually read, never
promoted early.
See contributing-data.md for the submission flow.