External CRC calibration: lab book

Parallax Pathology · Russell Parrish, analysis carried out with Claude (Anthropic) · 5 November 2026 · lab book for round 1 of the external CRC benchmark · published November 2026

Published as written at the time, apart from this header. File and folder names refer to the project record, available on request. Benchmark note · Claim ledger
Erratum (6 November 2026): Balanced accuracy at look 1 is 82.0% (82.05%); it appears here as 82.1%. Rounding only.

Summary. Trained on NCT-CRC-HE-100K and tested on CRC-VAL-HE-7K, the fixed measurements lost most accuracy in two classes. Looking at the images showed that half of the test debris tiles are rendered in a single violet hue that the training collection almost never shows, and the instrument read them as tumour. A label-free adjustment (flag violet-rendered tiles by colour alone; re-colour them by brightness rank onto the training collection's tissue colours; re-measure) was developed on the training set and the 1,800 development tiles, frozen, and run once on 5,380 sealed test tiles. Sealed accuracy rose from 85.7% to 87.0% and balanced accuracy from 76.7% to 82.1%; debris recall from 0.475 to 0.964. Stroma (0.35) was not addressed and appears to be a matter of class appearance, not rendering.

Entry 1 · Design and seal (17:31 UTC)

Development material: all 100,000 NCT tiles and the 1,800 CRC-VAL tiles already used for years. Sealed: the other 5,380 CRC-VAL tiles, whose aggregate unadjusted results (85.7%, per-class recall) had been seen and are disclosed. Rule: choose any adjustment on development material only; freeze; run once on the sealed tiles. PLAN.md, hashed.

Entry 2 · Where the measurements shift

Standardised mean difference of each field, development tiles minus NCT, per class (outputs/01_shift_smd.csv). The largest shifts are eosin-channel coarse texture, concentrated in debris (energy +2.2 SD, entropy −1.7 SD), with smaller tone and boundary shifts elsewhere. Median absolute shift per class: debris 0.22, mucus 0.24, adipose 0.17; lymphocytes 0.09, normal 0.10, stroma 0.10.

Entry 3 · What Ω says (NCT as the memory)

Reference built from NCT on the instrument's six reference axes; development tiles scored against it (outputs/02_omega.csv). Lymphocyte, tumour, stroma and normal tiles mostly fall nearest NCT debris or muscle (own class nearest: 4%, 13%, 14%, 20%). Development tiles sit further from memory than NCT does from itself (median Ωᶜ ratio up to 1.44). The axis driving the deviation is most often Γ (boundary permissiveness), which compares luminance and colour edges. First hypothesis: a colour or stain difference between collections.

Entry 4 · Colour and images: no global stain shift

Mean colour and corrected Macenko stain vectors per class (outputs/03_colour.csv): for lymphocytes, mucus, normal, stroma and tumour the collections match closely (stain vector components within about 0.03). Differences are class-specific: background (the known purple glass), debris (blue-shifted), muscle. The contact sheets show the reason for debris: about half of the development debris tiles are a vivid single violet hue.

Debris tiles, NCT above, development below
Debris. Top: NCT. Bottom: development tiles; several are rendered violet.
Stroma tiles, NCT above, development below
Stroma. Top: NCT. Bottom: development tiles, purpler and more spindle-cell, closer to muscle.

Entry 5 · The violet tiles are the debris failure

Label-free flag: mean Blue − mean Red > 15. Share flagged: NCT debris 2% in a 150-tile sample (2.6% in the later full scan, 294 of 11,512), development debris 50%, no other class above 2%. Development debris accuracy: normally rendered 85%, violet 1% (82 of 100 called tumour) (outputs/04_dev_tile_colour.csv). Sharpness differs little between collections, except tumour and adipose, which are somewhat softer in the test set.

Entry 6 · Adjustments tried and rejected

CandidateResult on development tilesDisposition
Corrected Macenko re-normalisation to an NCT-fitted target, all tilesGood on normally rendered tiles; on violet tiles washed out or failed (4 of 100 refused: too few stained pixels). A single-hue tile has no second stain to separate.Rejected
Per-collection feature standardisation (label-free)77.8% → 75.6% (z-score), 71.4% (median/IQR). The shift is class-specific, so whole-collection rescaling moves classes that were fine.Rejected
Per-channel quantile mapping of flagged tilesChannels decorrelate; yellow artefacts.Rejected on sight
Brightness-rank re-colouring of flagged tiles (B2)77.8% → 83.3%; debris 0.43 → 0.92; other classes unchanged. Published 58: 77.7% → 82.6%.Frozen
Violet debris tiles before and after re-colouring, with normally rendered debris
Top: violet development debris. Middle: the same tiles re-coloured by brightness rank onto NCT tissue colours. Bottom: normally rendered development debris for comparison.

Entry 7 · Freeze (17:47 UTC)

FROZEN_ADJUSTMENT.md and hashes. The gate fires on 363 NCT tiles (debris 294, muscle 60, background 9) and 103 development tiles (debris 100, background 3). Pre-declared readouts: 81 fields (primary), published 58 (secondary). The first sealed run stopped at worker start-up on an import error before reading any sealed tile; the import was fixed and logged, nothing else changed.

Entry 8 · Sealed result (run once)

5,380 sealed tilesAccuracy (95% tile-level)BalancedDebris recallStroma recall
Unadjusted, 81 fields (on record)85.7%76.7%0.4750.353
B2, 81 fields87.0% (86.0–87.8)82.1%0.9640.353
B2, published 5887.3% (86.4–88.2)82.0%0.8920.362

The gate flagged 75 sealed tiles (debris 69, background 5, stroma 1). Of 139 sealed debris tiles, 134 are now correct. On all 7,180 test tiles, B2 with 81 fields gives 86.0% (balanced 82.4%), against 83.7% (77.0%) unadjusted.

Entry 9 · Open