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:
- Current decision in this handoff: layout-aware pooled 6-positive + 6-negative Z′.
- Code:
cell_blocking_analysis/cb_z.pyandcell_blocking_analysis/cb_layout.py. - Locked 2026-07-22 results:
cell_blocking_analysis/extracted/production2_qc_locked.json. /Users/saahas/Downloads/context_update_july23.md.cell_blocking_analysis/analysis-for-cell-blocking.mdand 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**knM fork = 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; Pythonstatistics.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>.csvRun the stand-alone edge-free comparison:
cd /Users/saahas/post_kinetics_data_analysis/cell_blocking_analysis
python3 analyze_edgefree_zprime.py /path/to/export-directoryFor 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-22The 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.pyVerified 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.shOutputs 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/.
| Run | Plate 1 pooled Z′ | Plate 2 pooled Z′ | Pair |
|---|---|---|---|
| 3 | -0.7 | -0.3 | fail |
| 4 | 0.7 | 0.7 | pass |
| 5 | 0.5 | -0.1 | fail |
| 6 | 0.5 | 0.5 | pass |
| 7 | 0.3 | 0.6 | fail |
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:
| Run | Part 1 replicate 1 | Part 1 replicate 2 |
|---|---|---|
| 3 | Order A | Order B |
| 5 | Order B | Order A |
| 7 | Order A | Order 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:
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:
| Run | Link | Source plate(s) | Rows C–G |
|---|---|---|---|
| 3 | https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/305e13b7-ddb2-41bd-9208-71516cacbf8d/edit | R1P3 | 0140, 0076, 0063, 0088, 0108 |
| 4 | https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/8869de09-eefe-413c-8a9c-60801389792a/edit | R1P3 | 0105, 0067, 0107, 0055, 0161 |
| 5 | https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/7b60a485-952e-4b13-96cf-ed7e61972564/edit | R1P3 + R1P1 | 0130, 0158, 0165, 0099, 0062 |
| 6 | https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/f4df9a02-bd8b-4b7f-b664-552e5ec3ae4d/edit | R1P1 | 0091, 0060, 0096, 0169, 0056 |
| 7 | https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/a50df119-d5be-4f8a-88b0-0cd63b7488fe/edit | R1P2 + R1P1 | 0137, 0129, 0109, 0087, 0030 |
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:
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 remainsBottom, 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-planendpoint 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:
Historical protocol references
Useful for reconstructing how the canonical protocol evolved:
- Legacy Part 1 baseline: https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/0b2af600-9fd4-4f34-9d13-b46c7b2b6651/edit
- First inline-reformatting version: https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/fa780dfc-1b70-4d4a-9a9e-407c58ffdd31/edit
- Edge-free manual-prep version: https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/c226e692-009c-4fb2-a7e9-dfc6abd6932f/edit
- Edge-free single-channel-pick version: https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/13c6c20e-0b82-45a6-8d8c-36fbe8dc93b3/edit
- Split reformatting Part 1a: https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/edc5512a-ae0e-4b5f-9cc3-7eafd67fbe2c/edit
- Split Part 1b: https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/20876f50-5f78-45e5-a931-d173a2b5ce0f/edit
- Split Part 1b without PD-1 cell addition: https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/assays/349af482-0dc6-4db0-ab41-8a92521fe2c0/edit
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
- GitHub: https://github.com/medra-ai/post_kinetics_data_analysis/tree/nidhi/cell-blocking-analysis
- Local:
/Users/saahas/post_kinetics_data_analysis - Branch:
nidhi/cell-blocking-analysis
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.pycell_blocking_analysis/build_campaign_report.pycell_blocking_analysis/extend_production_report.pycell_blocking_analysis/extracted/production2_qc_locked.jsoncell_blocking_analysis/test_cb_layout.pycell_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
- Live campaign report; current visual/interaction baseline: https://medra-cloud.taila7a7a.ts.net/cloud/campaigns/a93834b6-e9c4-48e8-8a4a-916a1fb5f7c2/reports/cell-blocking-analysis
- S4 production-derived candidate with appended refinement/Production #2: https://s4.taila7a7a.ts.net/shared/saahas/antibody-triage/cell-blocking-analysis.html
- Cell-binding report used as the closer-to-production interaction reference: http://medra-internal-apps:8104/irving-report
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
- Main cell-blocking analysis: https://s4.taila7a7a.ts.net/shared/nidhi/antibody-triage/cell-blocking.html
- Rerun plan: https://s4.taila7a7a.ts.net/shared/nidhi/antibody-triage/rerun-plan.html
- Atezolizumab reference evaluation: https://s4.taila7a7a.ts.net/shared/nidhi/antibody-triage/reference-ec50.html
- QC method comparison: https://s4.taila7a7a.ts.net/shared/nidhi/antibody-triage/qc-methods.html
- Antibody triage/index: https://s4.taila7a7a.ts.net/shared/nidhi/antibody-triage/index.html
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@v2This 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
- Fetch the live Part 1 and Part 2 specs; do not trust cached version numbers.
- Resolve the v24 Part 2 plate-1/plate-2 mix-geometry asymmetry.
- Revalidate and plan the exact saved Part 2 version end-to-end.
- Verify R1P3 D1 physically contains Ab-0108.
- Record all six assay-plate barcodes and the Run/Part-1-replicate/Part-2-order mapping.
- Use the same Bio-Glo preparation/source for both Z′ columns and keep dispense-to-read timing fixed and recorded.
- After readout, save untouched raw exports in a new dated directory and run
analyze_edgefree_zprime.py. - Interpret candidate curves only after individual-plate pooled Z′ and Atezolizumab suitability are known.