Irving cell-blocking handoff — 2026-07-24

Goal and current state

This is the working context for the Irving PD-1/PD-L1 cell-blocking assay: how to run QC, which protocols are current, what was learned from the 2026-07-22 edge-free runs, what is planned next, and where the raw data, analysis code, reports, and prior conversations live.

Current decision:

  • Keep the edge-free geometry.
  • Gate each plate with one pooled Z′ from 6 positive and 6 negative inboard controls.
  • Require both replicate plates to pass for a run pair.
  • Keep Atezolizumab as an independent system-suitability reference.
  • Rerun two plates each for Runs 3, 5, and 7: six plates total. The plates are already prepared.
  • During Bio-Glo addition, process both Z′ columns first and reverse only their order across the replicate plates. Keep dose-response columns 3–10 in the same ascending order on both plates.

No protocol has been dispatched by the analysis/Codex work described here.

Authority order

Some older pages and notes disagree about Z′. Use this order:

  1. Current decision in this handoff: layout-aware pooled 6-positive + 6-negative Z′.
  2. Code: cell_blocking_analysis/cb_z.py and cell_blocking_analysis/cb_layout.py.
  3. Locked 2026-07-22 results: cell_blocking_analysis/extracted/production2_qc_locked.json.
  4. /Users/saahas/Downloads/context_update_july23.md.
  5. cell_blocking_analysis/analysis-for-cell-blocking.md and the rendered pages.

Older cloud/canonical views and some versions of qc-methods.html headline the legacy half-mean. Keep half-mean, raw pooled, top-half, and bottom-half Z′ as diagnostics only. Do not substitute half-mean when it rescues a plate that fails the pooled gate.

QC definition

Plate layout

Edge-free assay wells:

  • Perimeter: rows A/H and columns 1/12 are excluded from measurement.
  • Z′ controls: columns 2 and 11, rows B–G.
  • Atezolizumab reference dose response: row B, columns 3–10.
  • Candidate dose responses: rows C–G, columns 3–10.
  • In-well dose ladder: 100 / 3**k nM for k = 0…7.

Mirrored Z′ controls:

  • Positive: B2, C2, D2, E11, F11, G11.
  • Negative: B11, C11, D11, E2, F2, G2.

The positive/negative layout is not being swapped. Only the order of Bio-Glo addition to columns 2 and 11 is reversed between replicate plates.

Canonical pooled Z′

For the six positive values and six negative values:

Z′ = 1 − 3 × (sample_SD_positive + sample_SD_negative)
         / abs(mean_positive − mean_negative)
  • SD is sample SD (ddof=1; Python statistics.stdev).
  • Display with round-half-up to one decimal.
  • Pass when the displayed value is at least 0.4.
  • Score every plate independently.
  • A replicate pair passes only when both plates pass.

On the edge-free layout, “raw pooled,” “pooled minus corners,” and canonical pooled are identical: all controls are already inboard.

Reference suitability

Atezolizumab is a separate gate:

  • Read the row-B sample-format dose response, not a vertical titration column.
  • Expected EC50: 1.95 nM.
  • Acceptance band: ±0.5 log10, approximately 0.62–6.17 nM.
  • The plate must pass pooled Z′; an in-band Atezolizumab curve does not rescue failed plate QC.
  • Scientific reference: Sci Rep 2021, 11:5774, Fig. 1B, PMC7952408.

Avelumab was dropped as the reference because it has no same-format published potency and showed more run-to-run variability. The in-house 2.165 nM value is useful historical context, not the go-forward external anchor.

Response normalization and fits

  • Min–max normalize each sample row against the mirrored controls in its own plate half: (signal − negative_control_mean) / (positive_control_mean − negative_control_mean) × 100.
  • Do not cap values to 0–100.
  • EC50 is invariant to this affine normalization; Emax is not.
  • Show measured points as scatter and overlay a smooth 4PL fit.
  • The maintained analysis includes hook-aware fitting for high-dose turnover.
  • Candidate evidence is interpretable only from QC-passing individual plates.

Running QC on new BioTek exports

Expected filename convention:

run<run>_plate<plate>_task<task>.csv

Run the stand-alone edge-free comparison:

cd /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis
python3 analyze_edgefree_zprime.py /path/to/export-directory

For the 2026-07-22 data:

cd /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis
python3 analyze_edgefree_zprime.py \
  /Users/saahas/Downloads/pdl1_pt2_runs3-7_2026-07-22

The command prints canonical pooled, raw pooled, half-mean, top-half, bottom-half, per-plate gate, and per-run pair gate.

Run the focused layout/Z′ tests:

cd /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis
python3 -m unittest test_cb_z.py test_cb_layout.py

Verified on 2026-07-24: the command reproduces the locked Runs 3–7 results exactly and all five tests pass.

To rebuild every companion dashboard from committed raw inputs:

cd /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis
PYTHON=/Users/saahas/medra_robotics/.venv/bin/python ./build.sh

Outputs are written to dist/. They are derived and gitignored. build.sh runs the producers before the builders; do not reorder it because build_rerun_plan.py reads the generated dist/index.html.

2026-07-22 edge-free results

Raw exports: /Users/saahas/Downloads/pdl1_pt2_runs3-7_2026-07-22/.

RunPlate 1 pooled Z′Plate 2 pooled Z′Pair
3-0.7-0.3fail
40.70.7pass
50.5-0.1fail
60.50.5pass
70.30.6fail

Interpretation:

  • Run 3: both plates fail; positive controls are low/noisy, especially in the bottom half.
  • Run 5 plate 2 and Run 7 plate 1: both halves can pass independently, but the positive-control level shifts between halves. Pooled Z′ correctly treats that shift as plate-wide dispersion.
  • Runs 4 and 6 are complete passing pairs.
  • Run 5 plate 1 and Run 7 plate 2 remain valid passing evidence.
  • All six newly qualifying Atezolizumab reads were in the reference band.

The minimal recovery plan was Run 3 plates 1/2, Run 5 plate 2, and Run 7 plate 1. That has been superseded operationally by rerunning both prepared plates for Runs 3, 5, and 7: six plates total. Existing passing evidence is retained; the additional plates provide more confirmation.

Next run: six-plate design

Run the existing two-plate Part 1 protocol once for each of Runs 3, 5, and 7. No new cherry-pick maps or one-plate Part 1 variants are needed.

Use the shared two-plate Part 2 protocol three times. Its intended Bio-Glo orders are:

  • Order A / assay_plate_1: 2, 11, 3, 4, 5, 6, 7, 8, 9, 10.
  • Order B / assay_plate_2: 11, 2, 3, 4, 5, 6, 7, 8, 9, 10.

Suggested mapping to reduce confounding with Part 1’s plate-processing order:

RunPart 1 replicate 1Part 1 replicate 2
3Order AOrder B
5Order BOrder A
7Order AOrder B

For Run 5, this means loading Part 1 replicate 2 as Part 2 assay_plate_1 and Part 1 replicate 1 as Part 2 assay_plate_2. Record the physical barcodes and this mapping before renaming exports. The analysis must preserve both biological replicate identity and Bio-Glo order arm.

Primary endpoint remains pooled plate Z′. The A/B comparison is diagnostic:

  • Compare positive and negative control centers in columns 2 and 11.
  • Ask whether the first-added Z′ column consistently differs from the second-added column.
  • Do not claim an order effect from one pair alone.
  • Keep columns 3–10 in the same order on both plates so the only intended A/B factor is which Z′ column receives Bio-Glo first.

Current protocol state

Campaign:

a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2

Part 1

Canonical template, current v11:

https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/f34f8d4d-b040-44d6-8c0f-239bebf49764/edit

Existing behavior:

  • Two assay plates.
  • Six p10 single-channel reformat picks: Atezolizumab plus five candidates.
  • Small-volume cherry-pick dispense is below liquid surface.
  • Antibody-to-cell stamping uses fresh tips.
  • Every stamp mixes 20 µL × 3 cycles at speed 3, near-bottom.
  • Serial dilution mixes at every cascade step by executor behavior.
  • No explicit 0 nM sample point; column 10 is the lowest nonzero dose.

Run-specific Part 1 protocols, all current v3:

Exact cherry-pick wells:

  • Run 3: R1P3 A1, A2, H2, A3, D1.
  • Run 5: R1P3 B3, C3, E3; R1P1 A3, H3.
  • Run 7: R1P2 C1, E1, A1; R1P1 A1, A2.

Physical source-plate barcodes from the earlier inventory check:

  • R1P1: J179311.
  • R1P2: J179306.
  • R1P3: J179303.

Inventory caveats:

  • The earlier inventory API showed R1P3 D1 / Ab-0108 as empty. The protocol was intentionally left unchanged and 2026-07-22 produced Run 3 data, so inventory may have been stale or the plate may have been topped up. Verify the physical well before rerunning.
  • R1P1 carried internal catalog labels without a recovered catalog-to-ISO crosswalk; its picks were position-verified rather than identity-crosschecked. R1P2/R1P3 mappings independently matched.

Part 2

Shared two-plate protocol:

https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/ff8ad5a7-e9fd-4dce-b780-29b6520d05ff/edit

Live state checked 2026-07-24:

  • Version: v24.
  • Experiment: exp-51bd2066-f39b-4959-a11b-c64ad4ac7a7e.
  • Plate 1 order: 2,11,3,4,5,6,7,8,9,10.
  • Plate 2 order: 11,2,3,4,5,6,7,8,9,10.
  • Columns 1/12 are skipped: 80 target wells per plate.
  • Executable Bio-Glo volume: 100 µL per target.
  • Fresh tip per target column (reuse_tip=false).
  • Mix: 75 µL × 3 at speed 5.

Critical pre-dispatch caveat:

  • The validated v23 edit preserved identical mix geometry on the two plates.
  • A later v24 edit changed plate 2 to Near Bottom, z_adjustment=0; plate 1 remains Bottom, z_adjustment=2.
  • This introduces a second experimental difference besides Z′-column order. If the goal is to attribute differences specifically to order, make the two plates’ mix geometry identical before dispatch, or explicitly record that the experiment is factorial/confounded.
  • v23 passed both the production /validate-and-plan endpoint and a local end-to-end planner run (11 jobs). Revalidate v24 after resolving the geometry question.

The older “one plate” Part 2 protocol below only reads the plate; it does not perform the full Bio-Glo liquid handling and should not be mistaken for a full one-plate Part 2:

https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/a0e96865-31d0-49f1-b86a-d8ae31065fa4/edit

Historical protocol references

Useful for reconstructing how the canonical protocol evolved:

Always fetch the live protocol before acting; version numbers in chat are snapshots.

cd /Users/saahas/medra_robotics
medra-cloud-protospec auth status
SK=.claude/skills/cloud-protospec-fetch/cloud_api.sh
$SK /api/v1/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/protocols/<assay-id>

Data and code map

Analysis repository

The local branch is dirty and contains many relevant modified/untracked analysis files. Do not reset, checkout over, or clean it. Important additions include:

  • cell_blocking_analysis/analyze_edgefree_zprime.py
  • cell_blocking_analysis/build_campaign_report.py
  • cell_blocking_analysis/extend_production_report.py
  • cell_blocking_analysis/extracted/production2_qc_locked.json
  • cell_blocking_analysis/test_cb_layout.py
  • cell_blocking_analysis/test_cb_z.py

Raw and locked data

  • Raw 2026-07-22 Runs 3–7 BioTek exports: /Users/saahas/Downloads/pdl1_pt2_runs3-7_2026-07-22/
  • Zip of the same: /Users/saahas/Downloads/pdl1_pt2_runs3-7_2026-07-22.zip
  • Compact analysis summary: /Users/saahas/Downloads/cell-blocking-analysis-summary.json
  • Committed historical raw plate reads: /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/cbdata/
  • Workflow-to-plate provenance: /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/cbdata/manifest.json
  • Locked Runs 3–7 QC: /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/extracted/production2_qc_locked.json
  • Locked rerun schedule: /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/extracted/rerun_plan_locked.json
  • Locked triage decisions: /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/extracted/triage_locked.json
  • Antibody metadata: /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/extracted/antibodies.json
  • Historical plate-lineage analysis: /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/sources/plate-lineage_index.html
  • 2026-06-30 reference-control data: /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/sources/controls-2026-06-30/
  • Early assay-development exports: /Users/saahas/post_kinetics_data_analysis/assaydev/raw/

No newer six-plate rerun exports were found in /Users/saahas/Downloads when this handoff was written. Add them as a separate dated directory; do not overwrite the 2026-07-22 exports.

Maintained companion analysis

Start here:

  • /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/README.md
  • /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/analysis-for-cell-blocking.md
  • /Users/saahas/Downloads/context_update_july23.md — later corrections; read after the guide.
  • /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis/reference-control-evaluation.md

Core code:

  • cb_layout.py: exact standard and edge-free well geometry and normalization.
  • cb_z.py: pooled Z′, round-half-up display, and ≥0.4 gate.
  • analyze_edgefree_zprime.py: fast QC for a directory of named BioTek exports.
  • cb_full.py: layout-aware min–max analysis and plate QC.
  • cb_forensics_emit.py: pooled/half/corner/dead-row decomposition.
  • cb_pec50.py, cb_atezo_all.py, cb_atezo_rows.py: reference-potency analysis.
  • build_rerun_plan.py: locked rerun presentation.
  • build_campaign_report.py: standalone chronological report.
  • extend_production_report.py: appends refinement and Production #2 evidence to the production portal baseline.

The canonical overlapping pipeline remains:

  • /Users/saahas/post_kinetics_data_analysis/blockade/
  • /Users/saahas/post_kinetics_data_analysis/analyze_blockade.py
  • /Users/saahas/post_kinetics_data_analysis/enrich.py
  • /Users/saahas/post_kinetics_data_analysis/make_real_artifact.py

Where EC50, Z′, or tiering overlap, the canonical pipeline is the source of truth; the cell_blocking_analysis/ directory is the assay-development/QC/reference/rerun deep dive.

Reports and prior analysis

Current and production-like reports

Local portal/report artifacts:

  • Cached live report: /Users/saahas/post_kinetics_data_analysis/.context/rerun-plan-review-2026-07-23/cell-blocking-live.html
  • Production baseline: /Users/saahas/post_kinetics_data_analysis/.context/campaign-report-authoring/cell-blocking-analysis/production-base/cell-blocking-analysis.html
  • Production-derived candidate: /Users/saahas/post_kinetics_data_analysis/.context/campaign-report-authoring/cell-blocking-analysis/candidate/cell-blocking-analysis.html
  • Nidhi report reference: /Users/saahas/post_kinetics_data_analysis/.context/campaign-report-authoring/cell-blocking-analysis/reference/nidhi-cell-blocking.html

Nidhi’s analysis set

The current rerun-plan HTML was cached at:

/Users/saahas/post_kinetics_data_analysis/.context/rerun-plan-review-2026-07-23/rerun-plan-current.html

Prior conversation and decision provenance

  • Main July 21 Claude protocol session: /Users/saahas/.claude/projects/-Users-saahas-medra-robotics/2461d6fe-f036-427f-ae2a-da19b3ff7467.jsonl
  • Handoff snapshot produced during that session: /Users/saahas/.claude/file-history/2461d6fe-f036-427f-ae2a-da19b3ff7467/7965778a9e0a8dad@v2 This snapshot predates the final fresh-tip/mix edit; trust the transcript and live protocols.
  • Earlier July 20 edge-free protocol session: /Users/saahas/.claude/projects/-Users-saahas-medra-robotics/23a43abf-37bb-4bf9-83c1-aca59b64ece4.jsonl
  • July 22 run-data lookup session: /Users/saahas/.claude/projects/-Users-saahas-medra-robotics/7c3d875c-acb8-4a46-b08c-ac2ff6f53bef.jsonl
  • Saahas’s chronology/report notes: /Users/saahas/saah.as/garden/private/daily/2026-07-22.md

Report interpretation that should remain explicit

  • The 41 strong / 20 active / 10 weak / 1 inactive topline consists of provisional calls from QC-passing standard-layout evidence for all 72 candidates.
  • Edge-free confirmation is a different evidence layer. As of the 2026-07-22 report: 12/72 had two passing edge-free replicates, 22/72 had at least one, and 50/72 had none yet.
  • Those statements are not contradictory: “has a provisional call” and “has edge-free confirmation” answer different questions.
  • Do not rerun the entire original screen. Continue the edge-free confirmation schedule and recover failed edge-free plates.

Before the next dispatch

  1. Fetch the live Part 1 and Part 2 specs; do not trust cached version numbers.
  2. Resolve the v24 Part 2 plate-1/plate-2 mix-geometry asymmetry.
  3. Revalidate and plan the exact saved Part 2 version end-to-end.
  4. Verify R1P3 D1 physically contains Ab-0108.
  5. Record all six assay-plate barcodes and the Run/Part-1-replicate/Part-2-order mapping.
  6. Use the same Bio-Glo preparation/source for both Z′ columns and keep dispense-to-read timing fixed and recorded.
  7. After readout, save untouched raw exports in a new dated directory and run analyze_edgefree_zprime.py.
  8. Interpret candidate curves only after individual-plate pooled Z′ and Atezolizumab suitability are known.