# Ground truth — the beverages (coffee + tea) corpus

This is the **answer key** for grading `corpora/beverages/` after ingest. The corpus's `raw/` is fed
to `citadel ingest`; this file is **not** — it lives under `.claude/skills/` (never inside or beside
the corpus `raw/`), so the ingest pipeline can never see it. The `verify-corpus` skill reads it to
grade the wiki the pipeline produced. (In the grep commands below, `$WIKI` is the sandbox wiki the
corpus was ingested into — substitute it for the literal `wiki/` when grading a sandbox build.)

The corpus is deliberately messy — facts repeat, contradict, hide in one place, vary in writing style,
and include invented people and one flat-out-false claim — so a clean pass exercises all three of the
project's guarantees: **stays organized**, **links keep working**, **honest provenance**.

> Some people/companies below are **fictional by design** (Caffè Aurora, Lina Marchetti, Cordwell
> Roastworks, Thornbury & Lin, Sir Edmund Thornbury, Mei Lin). They are *not* errors — the wiki should
> record them faithfully as the sources state them.

## The 14 raw files

| file | topic | register | gist |
| ---- | ----- | -------- | ---- |
| `raw/coffee-guide.md` | coffee | structured reference | species, origin, processing, roast, ratios, caffeine |
| `raw/espresso-and-cafe-culture.md` | coffee | prose essay | espresso mechanics; Lina Marchetti founds Caffè Aurora (1987) |
| `raw/cold-brew-notes.md` | coffee | lab notebook | cold-brew method; "cold brew higher caffeine"; half-life ~3 h; Cordwell Roastworks bean |
| `raw/coffee-health-faq.md` | coffee | FAQ | half-life ~5 h, 95 mg, robusta 2×, adenosine, pregnancy |
| `raw/aurora-coffee-blog.md` | coffee | brand blog | Caffè Aurora (1985); **the false "dark roast = caffeine-free" claim** |
| `raw/brewing-science-notes.md` | coffee | lab reference sheet | SCA Golden Cup 18–22% EY / 1.15–1.35% TDS; grind/time/temp; water GH/KH ~150 ppm; immersion vs percolation; espresso vs filter; Cordwell Roastworks lab |
| `raw/aurora-bulletin-2024.md` | coffee | dated brand bulletin (spring 2024) | Aurora lineup + prices; **planted false "coffee loses caffeine with age" claim**; 2 open questions |
| `raw/aurora-bulletin-2026.md` | coffee | dated brand bulletin (spring 2026) | superseding lineup/prices/roast; resolves a 2024 open Q + new one; **contradiction cluster vs science-notes/cold-brew** |
| `raw/tea-guide.md` | tea | structured reference | Camellia sinensis, oxidation, temps, caffeine (green 28 mg) |
| `raw/tea-history-and-trade.md` | tea | prose narrative | tea trade; Thornbury & Lin (1657); green tea ~50 mg |
| `raw/matcha-and-preparation.md` | tea | how-to | matcha prep; 60–70 mg; ceremonial vs culinary grade |
| `raw/tea-health-faq.md` | tea | FAQ | L-theanine; EGCG; tea-vs-coffee caffeine compare |
| `raw/thornbury-tea-blog.md` | tea | brand blog | Thornbury & Lin (1650); tea-vs-coffee rivalry |
| `raw/tea-processing-and-cultivars.md` | tea | enthusiast field notes | six classes incl. yellow + dark/heicha; sheng vs shou pu-erh; Yabukita / Da Hong Pao / Darjeeling flushes; shading → L-theanine/umami |

## A · Known facts that MUST appear in the wiki (cited to the right source)

Single-source facts (only one file states them — they must **survive** ingest, not be dropped):

| fact | source file | note |
| ---- | ----------- | ---- |
| Espresso pulled ~9 bar, ~25–30 s, ~18 g in → ~36 g out, crema; ~63 mg/shot | `espresso-and-cafe-culture.md` | espresso mechanics |
| Cold brew often **higher** caffeine than hot drip (ratio + long steep) | `cold-brew-notes.md` | the "easy to drop" fact — see §D |
| Matcha grades: ceremonial vs culinary | `matcha-and-preparation.md` | |
| Matcha ~60–70 mg (whole leaf consumed) | `matcha-and-preparation.md` | |
| **L-theanine** (calm-alert, ~unique to tea) | `tea-health-faq.md` | |
| Coffee 3–4 cups/day *associated with* lower type-2-diabetes / Parkinson's risk | `coffee-health-faq.md` | must stay an *association* |
| White tea contains caffeine (~30–55 mg) | `tea-guide.md` | |
| Caffè Aurora founder Lina Marchetti, Trieste | `espresso-and-cafe-culture.md` + `aurora-coffee-blog.md` | year contradicts (§C) |
| Thornbury & Lin (Edmund Thornbury, Mei Lin), London/Canton, traded tea **and** coffee | `tea-history-and-trade.md` + `thornbury-tea-blog.md` | year contradicts (§C) |

## B · Repetitions — must MERGE / co-cite, never duplicate one-page-per-file

| fact | files | expectation |
| ---- | ----- | ----------- |
| Robusta ≈ 2× the caffeine of Arabica | `coffee-guide.md` + `coffee-health-faq.md` | one statement, both cited (`[^s..]` ×2) |
| Drip coffee (8 oz) ≈ 95 mg | `coffee-guide.md` + `coffee-health-faq.md` | one statement, both cited |
| Green-tea brew temp 70–80 °C | `tea-guide.md` + `matcha-and-preparation.md` | merged |
| All true tea = *Camellia sinensis* | `tea-guide.md` + `matcha-and-preparation.md` (+ history) | merged |

Failure mode to catch: a `concepts/coffee-guide.md` AND a `concepts/coffee-health-faq.md` that each
restate the 95 mg / robusta facts in isolation = the pipeline made one-page-per-file instead of routing
by fit. (Page **names** are LLM-chosen and may differ — judge by content, not filename.)

## C · Contradictions — must surface as `> [!CONTRADICTION]` (or both conflicting values co-cited on one page)

| id | subject | source A | source B |
| -- | ------- | -------- | -------- |
| `green-tea-caffeine` | green-tea caffeine per cup | `tea-guide.md`: ~28 mg | `tea-history-and-trade.md`: ~50 mg |
| `half-life` | caffeine half-life | `coffee-health-faq.md`: ~5 h | `cold-brew-notes.md`: ~3 h |
| `aurora-year` | Caffè Aurora founding year | `espresso-and-cafe-culture.md`: 1987 | `aurora-coffee-blog.md`: 1985 |
| `thornbury-year` | first English tea import | `tea-history-and-trade.md`: 1657 | `thornbury-tea-blog.md`: 1650 |

A passing wiki surfaces these rather than silently picking one value. Catching all four is the
**stretch** goal; catching ≥2 and never *silently* overwriting is the **hard** goal. Report each as
caught / not-caught.

## D · The one blatantly false fact (single source → must stand, but flagged)

`aurora-coffee-blog.md` asserts: **"Aurora Midnight is a dark roast, and the roasting fire burns off
the caffeine, so Midnight is caffeine-free — the darker the roast, the less caffeine."** This is false
in reality, but it is the blog's own word and no other source makes the same Aurora-Midnight claim.

Required wiki behaviour (honest provenance):
1. The claim **appears**, cited to `aurora-coffee-blog.md` (`[^s..]`) — not silently dropped.
2. It is **not** presented as unqualified truth: ideally an `[^llm]` model-knowledge note questions it,
   or a `> [!CONTRADICTION]` ties it to `coffee-guide.md`'s "roast barely changes caffeine / dark roast
   is not decaffeinated."
3. It is **not** rewritten into the correct fact without attribution (that would be inventing/erasing).

`citadel lint` lists pages carrying `[^llm]` facts — a good signal this was handled.

## E · The subtle "must-not-be-dropped" fact

`cold-brew-notes.md` states cold brew often ends up **higher** in caffeine than hot drip (high
grounds-to-water ratio + long steep), against the "cold = less caffeine" assumption. It is mentioned
once, in a notebook among other detail — easy to lose. It **must be present** in the wiki.

## F · Cross-topic bridges (coffee ↔ tea)

- **Caffeine** is the strongest link: both topics give numbers (drip 95 mg vs black tea 47 mg; tea
  generally less than coffee). Expect either a shared caffeine `Concept` page cited by both topics, or
  dense cross-links between the coffee and tea caffeine material. The two topics must **not** end up as
  two disconnected islands.
- **Thornbury & Lin** traded tea **and** coffee → its page (likely `type: Organization`) should be
  reachable from both the tea trade material and a coffee-trade mention.

## G · Structural gates (hard pass/fail — pure code, no judgement)

- `citadel check` → **0 errors** (required fields, honest/defined citations, relative non-broken links).
- `citadel lint` → **OK** (no missing-type, no broken links, no fabricated sources, no `[[wikilinks]]`).
- Every factual sentence carries a `[^s..]` (raw) or `[^llm..]` (model) marker; every `[^s..]` resolves
  to a real `raw/` file.
- Pages routed by `type` into the right folder (`concepts/`, `organizations/`, `persons/`, …).

## H · Abbreviations (glossary + the undefined-abbreviation lint check)

The corpus seeds the abbreviation machinery on purpose:

- **Spelled out once → defined.** `TDS` (Total Dissolved Solids) and `EGCG` (epigallocatechin gallate)
  are each expanded **exactly once**, in parenthetical form, then used bare elsewhere (`TDS` in
  `cold-brew-notes.md` + `coffee-guide.md`; `EGCG` in `tea-guide.md` + `tea-health-faq.md`). The wiki
  should carry that expansion — inline (`Total Dissolved Solids (TDS)`) and/or as a `type:
  Abbreviation` glossary page — so `citadel lint` does **not** list TDS/EGCG as undefined, and they
  may appear in the generated `## Abbreviations` table in `index.md`.
- **Never spelled out in raw → defined honestly OR flagged.** `EY` (extraction yield) is used across
  the coffee brewing material (`cold-brew-notes.md` + `coffee-guide.md`) but **never** expanded in any
  raw file. Two honest outcomes are acceptable: (a) the wiki leaves it bare and `citadel lint`'s
  *Undefined abbreviations* check surfaces `EY`; or (b) — observed, and preferable — the agent creates a
  `type: Abbreviation` page that expands it (`EY — Extraction Yield`) and labels the expansion `[^llm]`,
  since that expansion is model knowledge, not from a raw file. Either way `citadel lint` should surface
  **at least one** undefined abbreviation (`EY` and/or `FAQ`); the build never fails on it (advisory).

This is what the user means by "abbreviations should appear, at least one spelled out once": TDS/EGCG
are the spelled-out-once ones (→ defined, ideally a glossary page); EY is never spelled out in raw, so
the pipeline must either flag it (lint) or define it with an honest `[^llm]` expansion — and never just
silently invent the expansion as if it came from the source.

## I · Deep-dive nerd facts that MUST survive — and they must be TRUE

The four enrichment files carry **real** preparation/processing/cultivar knowledge (the showcase is
also a public demo, so the wiki must actually teach the correct science, not vibes). Each fact below is
single-source unless noted — it must **survive** ingest, cited to its file, and carry the **true** value.
A 4–6 grep spot-check that the real numbers landed (flatten with `tr '\n' ' '` first if a scoped grep
misses on a wrap):

| true fact | source | grep hint |
| --------- | ------ | --------- |
| SCA Golden Cup: extraction **18–22%**, strength **1.15–1.35% TDS** | `brewing-science-notes.md` | `grep -rn "18-22\|1.15"` |
| SCA golden ratio ~**55 g/L** (≈ 1:16–1:18); brew temp ~**93 °C / 90.5–96 °C** | `brewing-science-notes.md` | `grep -rniE "55 ?g|1:1[678]|90.5-96|93"` |
| water target ~**150 ppm** TDS, GH/KH balance | `brewing-science-notes.md` | `grep -rn "150"` |
| **immersion vs percolation** distinction present | `brewing-science-notes.md` | `grep -rin "percolat\|immersion"` |
| six tea classes incl. **yellow** + **dark/heicha** (not just 5) | `tea-processing-and-cultivars.md` | `grep -rin "heicha\|yellow tea\|dark tea"` |
| **sheng vs shou** pu-erh; shou = **wo dui / wet piling**, **1973**, **45–60 days** | `tea-processing-and-cultivars.md` | `grep -rniE "sheng|shou|wet piling|1973"` |
| **Yabukita** ~**70%** of Japanese tea, registered **1953** | `tea-processing-and-cultivars.md` | `grep -rn "Yabukita\|1953"` |
| **Da Hong Pao** Wuyi **rock oolong / yancha**; **rock rhyme** (yan yun); Rou Gui / Shui Xian | `tea-processing-and-cultivars.md` | `grep -rin "Da Hong Pao\|rock rhyme\|yancha"` |
| **Darjeeling**: **muscatel = second flush**, not first | `tea-processing-and-cultivars.md` | `grep -rin "muscatel"` |
| shading (~**20–30 days**) → **L-theanine up, catechins down, umami**; tencha → matcha | `tea-processing-and-cultivars.md` + `matcha-and-preparation.md` | `grep -rin "shad\|umami\|tencha"` |

These MERGE cleanly with the existing corpus (green temp 70–80 °C, all *Camellia sinensis*, EGCG/catechins,
L-theanine, matcha 60–70 mg, China vs Assam variety) — a good build co-cites the new file alongside the
old one, it does not spin up a second isolated page. Also **entity/cross-link:** `Cordwell Roastworks`
now spans `cold-brew-notes.md` + `brewing-science-notes.md` (one `type: Organization`-ish page reachable
from both), just as Thornbury & Lin bridges tea and coffee in §F.

## J · Temporal supersession — the Aurora bulletin pair (2024 → 2026)

The two dated bulletins state Aurora's **own** facts that **evolve over time**. These are **dated
updates, NOT contradictions**: the wiki keeps the current (2026) value as the live fact and records the
2024 value as **dated / superseded** (e.g. "as of spring 2024 …", a history note, or struck through),
each cited to its own bulletin. It must **not** raise a `> [!CONTRADICTION]` between the two dates (they
do not conflict — they are two points in time) and must **not** silently drop the 2024 value.

| subject | 2024 (superseded) | 2026 (current / live) |
| ------- | ----------------- | --------------------- |
| Aurora Midnight 250 g price | €13.50 | **€16.00** |
| Aurora Midnight roast profile | near-black, oily dark roast | **full-city-plus** (pulled back, sweeter) |
| Harbour Blonde price | €12.00 | **€14.00** |
| Piazza Espresso price | €12.50 | **€14.50** |
| Dolce Decaf price | €13.00 | **€15.00** |
| seasonal single origin | Rift Valley (washed Kenyan) | **Wildflower Natural** (natural Ethiopian) |

Pass = the 2026 values are the live statement, each 2024 value still present but explicitly dated/superseded
(both cited to their bulletin). Fail modes: (a) a bare `> [!CONTRADICTION]` between the two prices/roasts
(they are two dates, not a conflict); (b) the 2024 values silently gone with no dated trace.
`grep -rn "13.50\|16.00" "$WIKI"` — both Midnight prices should appear, the older one marked as prior.

## K · The contradiction CLUSTER — 2026 bulletin vs. the science (source-vs-source)

Distinct from §J: the 2026 bulletin also makes brewing claims that **directly contradict other sources on
the same topic**, and **both sides are citable**. These SHOULD surface as `> [!CONTRADICTION]` (or both
values co-cited on one page), kept **attributed to Aurora**, never silently corrected and never silently
dropped.

| id | topic | Aurora 2026 (source A) | other source (source B) |
| -- | ----- | ---------------------- | ----------------------- |
| `filter-temp` | ideal filter / pour-over water temp | `aurora-bulletin-2026.md`: **80 °C** | `brewing-science-notes.md`: SCA **~90.5–96 °C** (93 °C) |
| `ideal-extraction` | target extraction yield | `aurora-bulletin-2026.md`: **~30%** | `brewing-science-notes.md`: SCA **18–22%** (>22% over-extracted) |
| `cold-brew-caffeine` | cold brew vs. hot caffeine | `aurora-bulletin-2026.md`: cold brew is **lowest** caffeine | `cold-brew-notes.md`: cold brew often **higher** than hot drip |

Target ≥2 of 3 surfaced (stretch 3/3); report each caught / not-caught. Note `cold-brew-caffeine`
re-attacks the very myth §E's fact busts — a wiki that lets Aurora's "lowest caffeine" quietly overwrite
`cold-brew-notes.md`'s "higher caffeine" fact fails **both** §E and §K. `grep -rin "CONTRADICTION" "$WIKI"
| grep -v index.md` should now show more callouts than the four §C ones.

## L · The second planted-false claim (2024 bulletin) — attributed, not corrected

Parallel to §D. `aurora-bulletin-2024.md` asserts, in marketing voice: **"Coffee starts losing its
caffeine the moment it leaves the roaster … a month-old bag simply does not wake you up the way a fresh
one does."** This is false in reality — caffeine is a stable molecule; staling loses aroma and CO₂, not
caffeine (see `coffee-guide.md`: "caffeine is a remarkably stable molecule"). Required behaviour:

1. The claim **appears**, cited to `aurora-bulletin-2024.md` — not silently dropped.
2. It is **not** presented as unqualified truth — ideally an `[^llm]` note pushes back, or a
   `> [!CONTRADICTION]` ties it to `coffee-guide.md`'s caffeine-stability line.
3. It is **not** silently rewritten into the correct fact without attribution.

So beverages now carries **two** attributed-false claims (§D dark-roast, §L caffeine-fades-with-age) — both
must stand as stated-and-questioned, neither quietly "fixed."

## M · Open points — the "still testing" threads

The bulletins seed open-point threads (Karpathy open-questions); expect them parsed into a page's
`## Open Points` and/or the generated `open-points/` index:

- **2024:** "still testing the **60-hour Midnight rest**" → **RESOLVED in 2026** ("the 60-hour rest won;
  now standard"). The wiki should show this as an open point later **closed/resolved**, not two live
  contradictory questions.
- **2024:** "still deciding on a **natural-process Ethiopian** for summer" → also resolved in 2026 (it
  "made the cut" as Wildflower Natural).
- **2026 (new, still open):** "still testing whether **lightly mineralised water** helps the Wildflower
  natural."

Pass = at least the Midnight-rest thread shows an open→resolved arc, and the 2026 mineralised-water
question reads as a live open point. Soft/probabilistic (open-point handling varies by run).

## N · New abbreviations (extends §H)

The enrichment adds more glossary / undefined-abbreviation material:

- **Spelled out once → defined.** `SCA` (Specialty Coffee Association), `GH` (general hardness), `KH`
  (carbonate hardness), and `PPO` (polyphenol oxidase) are each expanded **exactly once** — `SCA`/`GH`/`KH`
  in `brewing-science-notes.md`, `PPO` in `tea-processing-and-cultivars.md` — then used bare. The wiki
  should carry the expansion so `citadel lint` does **not** flag them undefined.
- `EY` stays **never** spelled out in any raw file: the enrichment writes "extraction yield" in full and
  never pairs it with the acronym, so §H's EY undefined-abbreviation expectation is **unchanged**.

## Retrieval battery — find the knowledge like a user (Tier 2)

The grader plays a user with a question: it runs each `query` **verbatim** through `citadel search`,
reads the top hits, and grades (a) the `expect` answer is present + correctly cited on a surfaced page
and (b) it was *findable* within the `find` band. Queries are frozen and answer-blind — phrased from
the question side, never containing the planted value or a verbatim wiki sentence (so they can't game
`search`'s substring bonus). `→§X` points at the lettered section whose grep settles a miss
(creation-vs-retrieval). Negatives say `NOT the live answer`: the tempting query must not surface the
forbidden thing as wiki-voice truth. Ranks are soft/reported; only *unfindable by search+index+tags* is
a hard floor.

| id | query | expect | find |
| -- | ----- | ------ | ---- |
| `rb-espresso` | how is espresso pulled and how much caffeine is in a shot | ~9 bar, ~25–30 s, ~18 g in → ~36 g out, crema, ~63 mg/shot; cited to `espresso-and-cafe-culture.md` →§A | rank≤2, 1 read |
| `rb-coldbrew` | does cold brew coffee have more or less caffeine than hot drip | cold brew is often **higher** in caffeine than hot drip (concentrated ratio + long steep); cited to `cold-brew-notes.md`. Any Aurora "cold brew is lowest" claim must be a `[!CONTRADICTION]`/co-cite, **NOT** the live answer →§E,§K | rank≤2, 1 read |
| `rb-midnight-price` | current price of an Aurora Midnight 250 g bag | live: **€16.00**, cited to `aurora-bulletin-2026.md`; the €13.50 spring-2024 price present only as dated/superseded (Change Log), **NOT** the live answer, no date-vs-date contradiction →§J | rank≤2, 1 read |
| `rb-darkroast` | is dark roast coffee caffeine free | the "dark roast burns off caffeine → caffeine-free" claim appears **attributed** to `aurora-coffee-blog.md`, questioned by an `[^llm]` note or a `[!CONTRADICTION]`; search must **NOT** surface "dark roast is caffeine-free" as unqualified wiki-voice truth →§D | rank≤3, ≤2 reads |
| `rb-aurora-founded` | when was Caffe Aurora founded | the founding year surfaces as a `[!CONTRADICTION]` — 1985 (`aurora-coffee-blog.md`) vs 1987 (`espresso-and-cafe-culture.md`), both cited, neither silently dropped →§C | rank≤2, 1 read |
| `rb-caffeine-fades` | does coffee lose its caffeine as it gets old | the "coffee loses caffeine with age" claim appears **attributed** to `aurora-bulletin-2024.md`, questioned (caffeine is stable — staling loses aroma, not caffeine); **NOT** stated as wiki-voice truth →§L | rank≤3, ≤2 reads |
| `rb-tds` | what does TDS stand for in coffee brewing | the expansion **Total Dissolved Solids** is carried (inline and/or a `type: Abbreviation` page) so lint does not flag TDS undefined →§H | rank≤4, ≤2 reads |
| `rb-goldencup` | SCA golden cup extraction strength and brew temperature target | extraction **18–22 %**, strength **1.15–1.35 % TDS**, brew temp ~**93 °C** (90.5–96); the true SCA values, cited to `brewing-science-notes.md` →§I | rank≤3, ≤2 reads |

## Stretch guarantees (model-discriminating) — separate tier, NEVER a pipeline gate

The 2026-07 model bench (sonnet 65/65 vs haiku 31/38) proved the judgment sections separate models,
but found two dimensions no guarantee tests (locator precision, cross-link density) and codified an
owner rule: a strong and a weak model both acing the grade means the test is saturated. These five
`st-*` checks make the bench's discriminative tier permanent. They **never hard-fail** verify-corpus
— report them as their own `stretch N/5` score line, each with its measured number, so models of
different strength never tie at the top.

| id | check | pass threshold (bench reference) |
| -- | ----- | -------------------------------- |
| `st-locator-resolves` | sample 10 `[^sN]` citations across mixed pages; each must resolve via `citadel raw <key> --locator "<loc>"` AND the returned span must contain the cited fact | ≤20% unresolvable or whole-file (sonnet 8 precise/1 vague/1 wrong; haiku 3/3/4 — four non-resolving, incl. an off-by-one `lines 1-114` on a 113-line file) |
| `st-no-falsehood-wiki-voice` | neither planted falsehood (§D dark-roast-caffeine-free, §L caffeine-fades-with-age) appears **unattributed** in any page's title, frontmatter `description`, body, or See-also gloss — §D/§L only check the hosting page's body | zero unattributed occurrences (haiku titled a page "Caffeine degradation in coffee" and glossed Midnight "naturally low-caffeine" in a See-also) |
| `st-k-cluster-colocated` | each §K divergence (`filter-temp`, `ideal-extraction`, `cold-brew-caffeine`) is **co-located**: a `> [!CONTRADICTION]` callout or both sides co-cited on one page — one side per page with no cross-reference is a miss | 3/3 co-located (sonnet 3/3, haiku 0/3; promotes §K's soft ≥2-of-3 into this tier) |
| `st-temporal-trace` | every §J superseded value leaves a dated trace **individually**: all four 2024 prices (incl. Midnight €13.50) + the 2024 near-black roast profile | 5/5 traced — `grep -rn "13.50" "$WIKI"` must hit (haiku silently dropped Midnight's €13.50 while keeping the Dolce arc) |
| `st-crosslink-density` | no entity-fragmentation: mean outbound wiki-links per content page (index/log excluded) and count of thin single-entity micro-pages (a named cultivar/subtype/variant carrying <2 independent cited facts) | ≥6 links/page AND ≤5 micro-pages (sonnet 8.4 links/page, ~3 micro; haiku 4.8, ~15) |

A stretch miss routes to the wiki-generation lane like any creation defect; it just never blocks the
pipeline pass.

## Scoring

**Hard gates** (must all hold): §G structural, §A single-source facts all present, §D claim present +
attributed (not silently corrected), §E subtle fact present, §F not two disconnected islands, §I deep-dive
nerd facts present **and true** (the real SCA/cultivar/processing values landed), §J supersession handled
(2026 values live, 2024 values dated-not-dropped, no false date-vs-date contradiction), §L second
false claim present + attributed (not silently corrected).

**Soft / probabilistic** (LLM-dependent — report, don't hard-fail on a single miss): §C contradiction
callouts (target ≥2 of 4, stretch 4/4), §K contradiction-cluster callouts (target ≥2 of 3, stretch 3/3),
§B merges being maximally tidy (incl. the new tea/coffee deep-dive pages co-citing, not fanning out),
§D and §L carrying an explicit `[^llm]` caveat, §M open-point open→resolved arc, §H + §N abbreviations
(TDS/EGCG/SCA/GH/KH/PPO carried in with their expansion and NOT flagged undefined; EY surfaced by lint's
undefined-abbreviations check). Report each soft check as caught/partial/missed so regressions are visible
across runs.

**Findability** (the Retrieval battery — report per row, don't hard-fail a soft rank miss): each row's
answer surfaces on a correct, correctly-cited page via `citadel search` within its `find` band, readable
in ≤2 reads; the negatives (`rb-midnight-price` €13.50, `rb-darkroast`, `rb-caffeine-fades`) must not
surface as the live answer. **Hard floor:** a row whose answer is unfindable by search *and* `index`
*and* `tags` is a hard miss. Route each miss into the improvement backlog — fact present-but-unranked →
*retrieval* defect (search-tooling lane); fact absent/mangled/mis-cited → *creation* defect
(wiki-generation lane).

**Stretch (model-discriminating — own score line, never gates the pass):** the five `st-*` guarantees
above, reported as `stretch N/5` with the measured numbers (locator tally, links/page, micro-page
count). A build passes on hard + soft + findability alone; the stretch line exists to separate model
strength — if a strong and a weak model both ace hard + soft AND stretch, the ground truth is
saturated (owner rule): file that as a finding and harden the guarantees instead of reporting a tie.
