From 8648d564ceaf6281213bdfbbb88f4cb9f55ebe33 Mon Sep 17 00:00:00 2001 From: j Date: Mon, 29 Jun 2026 08:53:02 +0700 Subject: [PATCH 1/2] fix(docs+qc): correct SEED-006 Met synthesis error and close expert-pack gaps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ALL 4 SEED-006 pilot variants inherit Met at position 9 from the mastoparan-X template (INWKGIAAMAKKLL). The prior synthesis guidance ("No Cys, no Met — standard Fmoc SPPS") was incorrect and would have caused the lab team to skip Nle substitution, receive oxidised batches, and miss activity. Changes: - docs/WET_LAB_HANDOFF.md: SEED-006 synthesis section rewritten — "No Met" (WRONG) replaced with Nle/M9Nle REQUIRED guidance, inert-atmosphere storage, HPLC purity at receipt - docs/ASSAY_PREREGISTRATION.md: SEED-006 Met-at-position-9 entry added to the pre-registered synthesis-risk block (parallel to the existing SEED-007 Met entry) - docs/EXPERT_REVIEW_PACK.md: Pipeline Limitations table updated — three new rows added: SEED-006 Met oxidation (all 4 variants, M9Nle REQUIRED), N-terminal X-Pro DKP_RISK (SEED-008, 244 Da, Nα-Ac REQUIRED, MS receipt check), short-peptide serum stability (6 pilots < 14 AA, model calibrated for 18–30 AA); stale AUROC values (0.8420) corrected to 0.7832 (expanded benchmark, CI₉₅: 0.72–0.84, n=191) - tests/test_presynth_qc.py: regression guard — test_seed006_all_pilots_have_met_at_position9 asserts MET×1 flag and Nle recommendation fire for all 4 SEED-006 pilot variants; prevents future edits from silently losing the Met detection on these sequences Tests: 1338 passed (unchanged count — all existing tests green) --- docs/ASSAY_PREREGISTRATION.md | 4 ++++ docs/EXPERT_REVIEW_PACK.md | 3 +++ docs/WET_LAB_HANDOFF.md | 9 ++++++++- tests/test_presynth_qc.py | 16 ++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/docs/ASSAY_PREREGISTRATION.md b/docs/ASSAY_PREREGISTRATION.md index b4800715..0024df53 100644 --- a/docs/ASSAY_PREREGISTRATION.md +++ b/docs/ASSAY_PREREGISTRATION.md @@ -141,6 +141,10 @@ TI = HC50 (µg/mL) / MIC (µg/mL) > > Families with known model limitations (score may underestimate actual stability): > - SEED-003 (11 AA, <15 AA calibration edge; model scores 0.35–0.38 likely underestimate actual t½) +> - SEED-006 (14 AA; **ALL 4 pilot variants contain Met at position 9** inherited from mastoparan-X +> template INWKGIAAMAKKLL — Nle (norleucine) substitution at position 9 ("M9Nle") REQUIRED +> on synthesis order to eliminate oxidation risk; HPLC purity mandatory at receipt; store +> lyophilized at −80 °C under inert atmosphere) > - SEED-007 (11 AA; same length as SEED-003; Met at position 6 in all 4 pilot variants — HPLC > purity mandatory at receipt; Nle substitution preferred for oxidation-resistant synthesis) > - SEED-008 (13 AA, model calibrated for 18–30 AA; Trp steric effect expected to improve t½). diff --git a/docs/EXPERT_REVIEW_PACK.md b/docs/EXPERT_REVIEW_PACK.md index f346f5b0..c600a072 100644 --- a/docs/EXPERT_REVIEW_PACK.md +++ b/docs/EXPERT_REVIEW_PACK.md @@ -276,9 +276,12 @@ The expert reviewer must be aware of these limitations: | SEED-008 high disagreement (0.41–0.44) | Boman index penalises Trp; activity_likeness more appropriate for Trp-rich sequences | | Serum stability model calibrated for 18–30 AA | SEED-003 (11 AA), SEED-007 (11 AA), and SEED-008 (13 AA) scores may underestimate actual stability (short-peptide steric/flexibility effects) | | Pro-rich serum stability not in model | SEED-009 model scores (0.572) expected to underestimate actual stability; Pro-X bond resistance is mechanistic | +| SEED-006 Met oxidation (ALL 4 pilot variants) | Met at position 9 in all SEED-006 pilot sequences (inherited from mastoparan-X template INWKGIAA**M**AKKLL); Met9→MetO disrupts helix hydrophobic face packing, typically 5–20× MIC loss; **Nle (norleucine) substitution at position 9 REQUIRED** in synthesis order ("M9Nle"); store at −80°C under inert atmosphere; HPLC purity mandatory at receipt — WET_LAB_HANDOFF.md SEED-006 synthesis note updated to reflect this; previously documented as "No Met" in error | | SEED-007 Met oxidation (all 4 pilot variants) | Met at position 6 in all SEED-007 pilot sequences; oxidised Met loses amphipathicity; Nle substitution or inert atmosphere storage required | | SEED-009_VAR_033 Met oxidation | VAR_033 (RRLPRPGYMPRP) has Met at position 9 — unique among SEED-009 variants; carries both MET×1 and PROLINE_RICH_INTRACELLULAR QC flags simultaneously; Nle substitution + HPLC purity mandatory at receipt | +| N-terminal X-Pro diketopiperazine (DKP_RISK) | N-terminal Phe-Pro in all 4 SEED-008 pilot sequences cyclises to cyclo(F-Pro) (DKP, MW≈244 Da) at physiological pH (t½ hours–days at 37°C); truncates peptide at position 3, likely abolishing activity; **Nα-acetylation REQUIRED** on synthesis order (zero extra cost); confirm identity by MS at receipt — MW−244 Da satellite >5% = reject batch (Smyth et al. 2000 J Peptide Res 55:105) | | N-terminal Q pyroglutamate cyclization (PYROGLUTAMATE_RISK) | N-terminal Gln (Q) spontaneously cyclises to pyroglutamic acid (pGlu) at pH 7.4 (t½ hours–days, 5–50× MIC loss); none of the 20 pilot candidates are affected (no Q-terminal sequences); E1 excluded (acid-catalysed at pH 2–4, negligible at physiological pH); Nα-acetylation is the zero-cost mitigation | +| Short-peptide serum stability (SHORT_PEPTIDE flag) | 6 pilot candidates are < 14 AA (SEED-007: 11 AA ×4, SEED-003: 11 AA ×2, SEED-009: 12 AA ×4); serum stability model calibrated for 18–30 AA — scores for short peptides may significantly underestimate actual t½; measure empirically (50% human serum, 37°C, 0/30/60/120 min HPLC time course) rather than relying on model; do not exclude candidates on serum score alone if <14 AA | | Novelty vs. 45 seeds only (pipeline) | Broad check vs 72-AMP DB done (PR #86); APD3 BLASTp still recommended before publication | | Conservative generation only | Near-seed variants; genuinely novel families not explored by de novo generation | | No structural prediction | No secondary structure, membrane interaction, or 3D modeling | diff --git a/docs/WET_LAB_HANDOFF.md b/docs/WET_LAB_HANDOFF.md index d1dbeadd..30fdf59b 100644 --- a/docs/WET_LAB_HANDOFF.md +++ b/docs/WET_LAB_HANDOFF.md @@ -149,7 +149,14 @@ It also activates G-proteins and has calmodulin-binding properties. - Hemolytic risk: moderate (assay at MIC/3 per QC guidance) **Synthesis guidance:** -- No Cys, no Met → standard Fmoc SPPS, standard storage +- **⚠️ ALL 4 SEED-006 pilots contain Met at position 9** (inherited from mastoparan-X template + INWKGIAA**M**AKKLL): INWKPIAAMAKKLV, IQWKGIAAMAKRLL, INWRGIAAMAKKFL, INFKGIALMAKKLL. + Met oxidation (Met→MetO) at position 9 replaces the hydrophobic side chain with a sulfinyl + group, disrupts helix hydrophobic face packing, and typically causes 5–20× MIC loss. + **Request Nle (norleucine) substitution at position 9** in the synthesis order — zero extra + cost at most SPPS suppliers. Specify "M9Nle" (norleucine at position 9). Store lyophilized + at −80°C under inert atmosphere. Mandatory HPLC purity check at receipt. +- No Cys → standard Fmoc SPPS otherwise - **C-terminal amidation strongly recommended**: SEED-006_VAR_xxx candidates end in LL (hydrophobic), neutral C-terminus. Request `CONH₂` to add +0.7 charge and improve serum stability - SEED-006 variants have 2–3 interior Lys → serum t½ estimated ~2–4 h diff --git a/tests/test_presynth_qc.py b/tests/test_presynth_qc.py index ccfc676f..2d693509 100644 --- a/tests/test_presynth_qc.py +++ b/tests/test_presynth_qc.py @@ -845,6 +845,22 @@ def test_seed009_var033_gets_met_and_proline_flags_simultaneously(self): assert "PROLINE_RICH" in flag_texts, "VAR_033 must carry PROLINE_RICH_INTRACELLULAR flag" assert qc.methionine_count == 1 + def test_seed006_all_pilots_have_met_at_position9(self): + # ALL 4 SEED-006 pilot variants inherit Met at position 9 from mastoparan-X. + # Regression guard for WET_LAB_HANDOFF correction in this PR (previously "No Met"). + seed006_pilots = [ + ("SEED-006_VAR_059", "INWKPIAAMAKKLV"), + ("SEED-006_VAR_071", "IQWKGIAAMAKRLL"), + ("SEED-006_VAR_062", "INWRGIAAMAKKFL"), + ("SEED-006_VAR_006", "INFKGIALMAKKLL"), + ] + for cid, seq in seed006_pilots: + qc = check_sequence(cid, seq) + assert qc.methionine_count == 1, f"{cid}: expected Met×1, got {qc.methionine_count}" + flag_texts = " ".join(qc.flags) + assert "MET" in flag_texts, f"{cid}: MET flag missing (synthesis guidance error)" + assert "Nle" in flag_texts, f"{cid}: Nle recommendation missing for Met oxidation" + # --------------------------------------------------------------------------- # LONG_PEPTIDE flag (> 30 AA) From cb4a2f6eea0780704a9f75d027af9b18951c698b Mon Sep 17 00:00:00 2001 From: j Date: Mon, 29 Jun 2026 09:00:30 +0700 Subject: [PATCH 2/2] fix(review): address all HIGH/MEDIUM/LOW issues from code review of PR #111 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes found during code review of fix/seed006-met-and-expert-pack-gaps: HIGH — arithmetic error: SHORT_PEPTIDE count "6 candidates" was wrong; parenthetical listed SEED-007 ×4 + SEED-003 ×2 + SEED-009 ×4 = 10, not 6. Corrected to "10 pilot candidates" in EXPERT_REVIEW_PACK.md. MEDIUM — ASSAY_PREREGISTRATION.md SEED-007 used "preferred" while the new SEED-006 entry used "REQUIRED" for the same Nle substitution risk. Aligned SEED-007 to "REQUIRED" for synthesis-protocol consistency. MEDIUM — test class mislocation: test_seed006_all_pilots_have_met_at_position9 was appended to TestProlineRichMediaFlag; moved to TestOxidationRisk alongside the other Met/Cys oxidation guards (test_met_triggers_oxidation_risk, etc.). MEDIUM — test name promised position-9 specificity but no assertion checked it. Added assert seq[8] == "M" per-sequence to guard against Met position drift. LOW — EXPERT_REVIEW_PACK.md SEED-006 limitation row said "store at −80°C"; corrected to "Store lyophilized at −80°C" to match WET_LAB_HANDOFF.md and ASSAY_PREREGISTRATION.md. Tests: 1338 passed (net count unchanged — 1 test moved, not added/removed). --- docs/ASSAY_PREREGISTRATION.md | 2 +- docs/EXPERT_REVIEW_PACK.md | 4 ++-- tests/test_presynth_qc.py | 33 +++++++++++++++++---------------- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/docs/ASSAY_PREREGISTRATION.md b/docs/ASSAY_PREREGISTRATION.md index 0024df53..7dab38d9 100644 --- a/docs/ASSAY_PREREGISTRATION.md +++ b/docs/ASSAY_PREREGISTRATION.md @@ -146,7 +146,7 @@ TI = HC50 (µg/mL) / MIC (µg/mL) > on synthesis order to eliminate oxidation risk; HPLC purity mandatory at receipt; store > lyophilized at −80 °C under inert atmosphere) > - SEED-007 (11 AA; same length as SEED-003; Met at position 6 in all 4 pilot variants — HPLC -> purity mandatory at receipt; Nle substitution preferred for oxidation-resistant synthesis) +> purity mandatory at receipt; **Nle substitution REQUIRED** for oxidation-resistant synthesis) > - SEED-008 (13 AA, model calibrated for 18–30 AA; Trp steric effect expected to improve t½). > **ALL 4 SEED-008 pilots carry F-Pro N-terminus: Nα-acetylation is REQUIRED on the synthesis > order** to prevent diketopiperazine (DKP) cyclization (cyclo(F-Pro), MW≈244 Da, t½ hours–days diff --git a/docs/EXPERT_REVIEW_PACK.md b/docs/EXPERT_REVIEW_PACK.md index c600a072..ad7b5a1d 100644 --- a/docs/EXPERT_REVIEW_PACK.md +++ b/docs/EXPERT_REVIEW_PACK.md @@ -276,12 +276,12 @@ The expert reviewer must be aware of these limitations: | SEED-008 high disagreement (0.41–0.44) | Boman index penalises Trp; activity_likeness more appropriate for Trp-rich sequences | | Serum stability model calibrated for 18–30 AA | SEED-003 (11 AA), SEED-007 (11 AA), and SEED-008 (13 AA) scores may underestimate actual stability (short-peptide steric/flexibility effects) | | Pro-rich serum stability not in model | SEED-009 model scores (0.572) expected to underestimate actual stability; Pro-X bond resistance is mechanistic | -| SEED-006 Met oxidation (ALL 4 pilot variants) | Met at position 9 in all SEED-006 pilot sequences (inherited from mastoparan-X template INWKGIAA**M**AKKLL); Met9→MetO disrupts helix hydrophobic face packing, typically 5–20× MIC loss; **Nle (norleucine) substitution at position 9 REQUIRED** in synthesis order ("M9Nle"); store at −80°C under inert atmosphere; HPLC purity mandatory at receipt — WET_LAB_HANDOFF.md SEED-006 synthesis note updated to reflect this; previously documented as "No Met" in error | +| SEED-006 Met oxidation (ALL 4 pilot variants) | Met at position 9 in all SEED-006 pilot sequences (inherited from mastoparan-X template INWKGIAA**M**AKKLL); Met9→MetO disrupts helix hydrophobic face packing, typically 5–20× MIC loss; **Nle (norleucine) substitution at position 9 REQUIRED** in synthesis order ("M9Nle"); Store lyophilized at −80°C under inert atmosphere; HPLC purity mandatory at receipt — WET_LAB_HANDOFF.md SEED-006 synthesis note updated to reflect this; previously documented as "No Met" in error | | SEED-007 Met oxidation (all 4 pilot variants) | Met at position 6 in all SEED-007 pilot sequences; oxidised Met loses amphipathicity; Nle substitution or inert atmosphere storage required | | SEED-009_VAR_033 Met oxidation | VAR_033 (RRLPRPGYMPRP) has Met at position 9 — unique among SEED-009 variants; carries both MET×1 and PROLINE_RICH_INTRACELLULAR QC flags simultaneously; Nle substitution + HPLC purity mandatory at receipt | | N-terminal X-Pro diketopiperazine (DKP_RISK) | N-terminal Phe-Pro in all 4 SEED-008 pilot sequences cyclises to cyclo(F-Pro) (DKP, MW≈244 Da) at physiological pH (t½ hours–days at 37°C); truncates peptide at position 3, likely abolishing activity; **Nα-acetylation REQUIRED** on synthesis order (zero extra cost); confirm identity by MS at receipt — MW−244 Da satellite >5% = reject batch (Smyth et al. 2000 J Peptide Res 55:105) | | N-terminal Q pyroglutamate cyclization (PYROGLUTAMATE_RISK) | N-terminal Gln (Q) spontaneously cyclises to pyroglutamic acid (pGlu) at pH 7.4 (t½ hours–days, 5–50× MIC loss); none of the 20 pilot candidates are affected (no Q-terminal sequences); E1 excluded (acid-catalysed at pH 2–4, negligible at physiological pH); Nα-acetylation is the zero-cost mitigation | -| Short-peptide serum stability (SHORT_PEPTIDE flag) | 6 pilot candidates are < 14 AA (SEED-007: 11 AA ×4, SEED-003: 11 AA ×2, SEED-009: 12 AA ×4); serum stability model calibrated for 18–30 AA — scores for short peptides may significantly underestimate actual t½; measure empirically (50% human serum, 37°C, 0/30/60/120 min HPLC time course) rather than relying on model; do not exclude candidates on serum score alone if <14 AA | +| Short-peptide serum stability (SHORT_PEPTIDE flag) | 10 pilot candidates are < 14 AA (SEED-007: 11 AA ×4, SEED-003: 11 AA ×2, SEED-009: 12 AA ×4); serum stability model calibrated for 18–30 AA — scores for short peptides may significantly underestimate actual t½; measure empirically (50% human serum, 37°C, 0/30/60/120 min HPLC time course) rather than relying on model; do not exclude candidates on serum score alone if <14 AA | | Novelty vs. 45 seeds only (pipeline) | Broad check vs 72-AMP DB done (PR #86); APD3 BLASTp still recommended before publication | | Conservative generation only | Near-seed variants; genuinely novel families not explored by de novo generation | | No structural prediction | No secondary structure, membrane interaction, or 3D modeling | diff --git a/tests/test_presynth_qc.py b/tests/test_presynth_qc.py index 2d693509..c4790929 100644 --- a/tests/test_presynth_qc.py +++ b/tests/test_presynth_qc.py @@ -106,6 +106,23 @@ def test_met_flag_in_flags_list(self): assert len(met_flags) == 1 assert "Nle" in met_flags[0], "Met flag must recommend Nle substitution (regression guard for PR #102)" + def test_seed006_all_pilots_have_met_at_position9(self): + # ALL 4 SEED-006 pilot variants inherit Met at position 9 from mastoparan-X. + # Regression guard for WET_LAB_HANDOFF correction in PR #111 (previously "No Met"). + seed006_pilots = [ + ("SEED-006_VAR_059", "INWKPIAAMAKKLV"), + ("SEED-006_VAR_071", "IQWKGIAAMAKRLL"), + ("SEED-006_VAR_062", "INWRGIAAMAKKFL"), + ("SEED-006_VAR_006", "INFKGIALMAKKLL"), + ] + for cid, seq in seed006_pilots: + assert seq[8] == "M", f"{cid}: Met expected at position 9 (index 8), found '{seq[8]}'" + qc = check_sequence(cid, seq) + assert qc.methionine_count == 1, f"{cid}: expected Met×1, got {qc.methionine_count}" + flag_texts = " ".join(qc.flags) + assert "MET" in flag_texts, f"{cid}: MET flag missing (synthesis guidance error)" + assert "Nle" in flag_texts, f"{cid}: Nle recommendation missing for Met oxidation" + # --------------------------------------------------------------------------- # Pyroglutamate risk @@ -845,22 +862,6 @@ def test_seed009_var033_gets_met_and_proline_flags_simultaneously(self): assert "PROLINE_RICH" in flag_texts, "VAR_033 must carry PROLINE_RICH_INTRACELLULAR flag" assert qc.methionine_count == 1 - def test_seed006_all_pilots_have_met_at_position9(self): - # ALL 4 SEED-006 pilot variants inherit Met at position 9 from mastoparan-X. - # Regression guard for WET_LAB_HANDOFF correction in this PR (previously "No Met"). - seed006_pilots = [ - ("SEED-006_VAR_059", "INWKPIAAMAKKLV"), - ("SEED-006_VAR_071", "IQWKGIAAMAKRLL"), - ("SEED-006_VAR_062", "INWRGIAAMAKKFL"), - ("SEED-006_VAR_006", "INFKGIALMAKKLL"), - ] - for cid, seq in seed006_pilots: - qc = check_sequence(cid, seq) - assert qc.methionine_count == 1, f"{cid}: expected Met×1, got {qc.methionine_count}" - flag_texts = " ".join(qc.flags) - assert "MET" in flag_texts, f"{cid}: MET flag missing (synthesis guidance error)" - assert "Nle" in flag_texts, f"{cid}: Nle recommendation missing for Met oxidation" - # --------------------------------------------------------------------------- # LONG_PEPTIDE flag (> 30 AA)