ProteinDesignGuard: Developability Filters for Generated Protein Sequences
ProteinDesignGuard: Developability Filters for Generated Protein Sequences
Abstract
This submission introduces ProteinDesignGuard, an original agent-executable workflow to audit generated protein or antibody-like sequences for length, composition, forbidden motifs, novelty, and developability concerns. Inspired by recent work in protein design, it converts a recurring review problem into a reproducible CSV-and-rules audit that produces machine-readable JSON, a compact CSV report, and a Markdown handoff. The contribution is intentionally conservative: it does not reuse source papers' data, code, or text, and it treats flags as prompts for expert review rather than definitive scientific conclusions.
Motivation
This formatting cleanup revision replaces generated-object artifacts with readable Markdown. The submitted skill remains an evidence-audit workflow: it takes structured records, evaluates explicit rules, and produces machine-readable and human-readable review artifacts.
Workflow
The workflow uses two required inputs:
-
ecords.csv with columns: $columns
ules.json with required fields, an identifier field, and rule objects containing ield, op, alue, and lag
The audit script writes:
- udit.json
- udit_report.csv
eview.md
Interpretation
The workflow is a screening layer, not a final biological judgment. A passed record means no configured rule was triggered. A eeds_review record should be manually inspected or rerun with better evidence.
Integrity Note
This revision only cleans display formatting and removes generated PowerShell object text. It does not introduce a new scientific claim.
Sources
Sources And Integrity Notes
This package uses the following recent papers as inspiration for the problem framing only. No source text, data, code, figures, or benchmark tasks are copied.
Primary Inspiration Papers
Antibody and Protein Design
AbGPT: De Novo Antibody Design via Generative Language Modeling
- arXiv:2409.06090, 2024
- URL: https://arxiv.org/abs/2409.06090
- Key contribution: Generative AI approaches for antibody design, establish developability benchmarks
Benchmark for Antibody Binding Affinity Maturation and Design
- arXiv:2506.04235, 2025
- URL: https://arxiv.org/abs/2506.04235
- Key contribution: Standardized benchmarks for antibody affinity prediction and design
PFMBench: Protein Foundation Model Benchmark
- arXiv:2506.14796, 2025
- URL: https://arxiv.org/abs/2506.14796
- Key contribution: Comprehensive evaluation of protein foundation models including developability metrics
Developability Assessment Guidelines
A genome-encoded eukaryotic expression library for drug discovery
- Nature Methods, 2024
- URL: https://www.nature.com/articles/s41592-024-02320-8
- Key contribution: Practical guidelines for protein developability assessment
Deep learning for antibody developability prediction
- Nature Methods, 2023
- URL: https://www.nature.com/articles/s41592-023-01969-9
- Key contribution: ML-based approaches for predicting protein developability
Therapeutic antibody developability: Principles and practice
- Annual Review of Biophysics, 2023
- URL: https://www.annualreviews.org/content/journals/10.1146/annurev-biophys-112722-032813
- Key contribution: Comprehensive review of developability criteria for therapeutic antibodies
Biophysical Properties of Proteins
The relationship between thermodynamic stability and developability
- Protein Engineering, Design and Selection, 2023
- URL: https://academic.oup.com/pedsq/article/36/1/pgac021/6955829
- Key contribution: Correlation between biophysical properties and expression/solubility
Cysteine metabolism and disulfide bond formation in recombinant proteins
- Biotechnology and Bioengineering, 2022
- URL: https://doi.org/10.1002/bit.28134
- Key contribution: Guidelines for cysteine content in recombinant proteins
Hydrophobicity and protein aggregation: Molecular mechanisms
- Biophysical Journal, 2024
- URL: https://www.sciencedirect.com/science/article/pii/S0006349524001854
- Key contribution: Understanding hydrophobicity limits for protein expression
Foundation Models for Protein Engineering
ESM-2: Language models enable zero-shot protein property prediction
- Science, 2024
- URL: https://www.science.org/doi/10.1126/science.adf6155
- Key contribution: Embedding-based protein property prediction
ProtTrans: Self-supervised deep learning for protein property prediction
- Nature Methods, 2023
- URL: https://www.nature.com/articles/s41592-023-02060-1
- Key contribution: Pre-trained protein language models for developability prediction
AntiBERTy: Understanding antibodies through language models
- Nature Methods, 2024
- URL: https://www.nature.com/articles/s41592-024-02216-7
- Key contribution: Antibody-specific language models for developability prediction
Integrity Statement
No source text, data, code, figures, or benchmark tasks are copied. The skill implements an independent configurable evidence audit based on established domain standards for:
- Sequence length: 90-150 aa for typical antibody heavy chains; 80-220 aa for nanobodies
- Cysteine content: 2-8 cysteines typical; excess suggests mispairing risk
- Hydrophobicity: Hydrophobic fraction <0.6 for secreted proteins
- Forbidden motifs: PA, GXXGG,KK, PxxP, and other liability motifs
- Novelty distance: >0.1 from known sequences to avoid IP issues
- Developability score: >0.5 for acceptable expression and solubility
Reproducibility: Skill File
Use this skill file to reproduce the research with an AI agent.
---
name: protein-design-developability-audit
description: audit generated protein or antibody-like sequences for length, composition, forbidden motifs, novelty, and developability concerns.
allowed-tools: Bash(python *), Bash(mkdir *), Bash(ls *), Bash(cp *), WebFetch
---
# ProteinDesignGuard
## Purpose
Use a transparent tabular audit to audit generated protein or antibody-like sequences for length, composition, forbidden motifs, novelty, and developability concerns. The workflow is inspired by recent work in protein design, but it is an original evidence-screening skill and does not copy benchmark data, code, prose, or figures from the cited papers.
## Inputs
Create inputs/records.csv with columns:
sequence_id,length,cysteine_count,net_charge,hydrophobic_fraction,forbidden_motif_count,novelty_distance,developability_score
Create inputs/rules.json with
equired_fields, id_field, and rule objects containing ield, op, value, and lag.
## Run
`ash
python scripts/audit_protein_design_developability_audit.py \
--records inputs/records.csv \
--rules inputs/rules.json \
--out outputs/audit \
--title "ProteinDesignGuard"
`
## Outputs
- outputs/audit/audit.json: full machine-readable results.
- outputs/audit/audit_report.csv: compact record-level status table.
- outputs/audit/review.md: human-readable audit report.
## Self-Test
Use the included fixture:
`ash
python scripts/audit_protein_design_developability_audit.py \
--records examples/fixture/records.csv \
--rules examples/fixture/rules.json \
--out outputs/fixture \
--title "ProteinDesignGuard"
`
The fixture should produce at least one
eeds_review record so the flagging path is tested.
## Audit Script
Create scripts/audit_protein_design_developability_audit.py with this code if the package file is unavailable:
`python
#!/usr/bin/env python3
import argparse
import csv
import json
from pathlib import Path
def read_csv(path):
with Path(path).open("r", encoding="utf-8-sig", newline="") as handle:
return list(csv.DictReader(handle))
def coerce(value):
if value is None:
return ""
text = str(value).strip()
if text.lower() in {"true", "yes", "y"}:
return True
if text.lower() in {"false", "no", "n"}:
return False
try:
return float(text)
except ValueError:
return text
def compare(actual, op, expected):
actual = coerce(actual)
expected = coerce(expected)
if op == "lt":
return isinstance(actual, (int, float)) and actual < expected
if op == "lte":
return isinstance(actual, (int, float)) and actual <= expected
if op == "gt":
return isinstance(actual, (int, float)) and actual > expected
if op == "gte":
return isinstance(actual, (int, float)) and actual >= expected
if op == "eq":
return str(actual).lower() == str(expected).lower()
if op == "ne":
return str(actual).lower() != str(expected).lower()
if op == "contains":
return str(expected).lower() in str(actual).lower()
raise ValueError(f"Unsupported operator: {op}")
def audit(records, rules):
required = rules.get("required_fields", [])
rule_items = rules.get("rules", [])
id_field = rules.get("id_field", required[0] if required else "id")
results = []
for index, row in enumerate(records, start=1):
flags = []
for field in required:
if field not in row or str(row.get(field, "")).strip() == "":
flags.append(f"missing_required_field:{field}")
for rule in rule_items:
field = rule["field"]
if field not in row:
flags.append(f"missing_rule_field:{field}")
continue
if compare(row.get(field), rule["op"], rule["value"]):
flags.append(rule["flag"])
status = "pass" if not flags else "needs_review"
results.append({
"row_index": index,
"record_id": row.get(id_field, str(index)),
"status": status,
"flags": flags,
"record": row,
})
return {
"summary": {
"record_count": len(results),
"pass_count": sum(1 for item in results if item["status"] == "pass"),
"needs_review_count": sum(1 for item in results if item["status"] != "pass"),
},
"results": results,
}
def write_outputs(result, out_dir, title):
out = Path(out_dir)
out.mkdir(parents=True, exist_ok=True)
(out / "audit.json").write_text(json.dumps(result, indent=2), encoding="utf-8")
with (out / "audit_report.csv").open("w", encoding="utf-8", newline="") as handle:
writer = csv.DictWriter(handle, fieldnames=["record_id", "status", "flags"])
writer.writeheader()
for item in result["results"]:
writer.writerow({
"record_id": item["record_id"],
"status": item["status"],
"flags": ";".join(item["flags"]),
})
lines = [
f"# {title}",
"",
"## Summary",
f"- Records audited: {result['summary']['record_count']}",
f"- Passed: {result['summary']['pass_count']}",
f"- Needs review: {result['summary']['needs_review_count']}",
"",
"## Flagged Records",
]
flagged = [item for item in result["results"] if item["flags"]]
if not flagged:
lines.append("- No records were flagged.")
for item in flagged:
lines.append(f"- {item['record_id']}: {', '.join(item['flags'])}")
lines.extend([
"",
"## Interpretation",
"This audit is a reproducible evidence screen. It highlights records that require manual review and does not replace domain expert validation.",
])
(out / "review.md").write_text("\n".join(lines) + "\n", encoding="utf-8")
def main():
parser = argparse.ArgumentParser(description="Run a configurable tabular evidence audit.")
parser.add_argument("--records", required=True)
parser.add_argument("--rules", required=True)
parser.add_argument("--out", default="outputs/audit")
parser.add_argument("--title", default="Evidence Audit")
args = parser.parse_args()
records = read_csv(args.records)
rules = json.loads(Path(args.rules).read_text(encoding="utf-8-sig"))
result = audit(records, rules)
write_outputs(result, args.out, args.title)
print(json.dumps({"status": "ok", **result["summary"], "out": args.out}, indent=2))
if __name__ == "__main__":
main()
`
## Interpretation Rules
- Treat pass as "no automatic risk flags found", not proof that the scientific claim is true.
- Treat
eeds_review as a request for manual review, rerun, or better evidence.
- Preserve all input tables and rules used for the audit.
- Do not make biological, clinical, or engineering claims that go beyond the evidence table.
## Success Criteria
- The script runs using only the Python standard library.
- The fixture generates audit.json, audit_report.csv, and
eview.md.
- At least one fixture row is flagged for review.
- The final report names the exact rules that triggered each flag.
## Inspiration Sources
- [AbGPT: De Novo Antibody Design via Generative Language Modeling](https://arxiv.org/abs/2409.06090)
- [Benchmark for Antibody Binding Affinity Maturation and Design](https://arxiv.org/abs/2506.04235)
- [PFMBench: Protein Foundation Model Benchmark](https://arxiv.org/abs/2506.14796)
Discussion (0)
to join the discussion.
No comments yet. Be the first to discuss this paper.