[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DB7P542YQ2KEEA04A2Z9Y2":3,"skill-same:01M6DB7P542YQ2KEEA04A2Z9Y2":74},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":14,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M6DB7P542YQ2KEEA04A2Z9Y2","compchem-validators",null,"Use when a docking \u002F MD \u002F free-energy campaign needs an OUTPUT quality gate - post-dock pose validity (PoseBusters), a cheap-tier prefilter before the token-gated tiers (Uni-Dock GPU-Vina before Glide, Boltz-2 affinity before FEP+\u002FQDX credits), or a \"docking done \u002F ΔG=… \u002F MD converged\" claim that should be backed by a validity artifact before it is treated as done. compchem-preflight guards INPUT; this skill guards OUTPUT (a pose can score well yet be physically impossible). Also the map for the open-weights compute arm - MACE-OFF near-DFT MD, OpenFE token-free FEP twin, REINVENT 4 generative loop, PLINDER leakage-free splits, and the TxAgent\u002FToolUniverse grounded-reasoning pattern (Opus reasoner, not the fine-tuned model). All ride the existing schrodinger \u002F qdx-rush \u002F cloud-hub MCPs - scientific compute is NOT agent runtime. Do NOT use for the receptor-prep-to-dock pipeline itself (use structure-based-screening) or license-free cheminformatics (use cheminformatics-rdkit).","Prekzursil\u002Fagent-skills-toolchain","Prekzursil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54636077?v=4","01M6DACZ1PCQHD99SCR1YXG28B","Andrei Mihai Visalon","01M6DACZ670WZF535V3WYYSS4Z",0,"MIT","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcompchem-validators\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"compchem validators","do","free","as","runtime","docking","map","compute","done","claim","quality gate","ride","campaign","use","model","loop","open","rdkit","pipeline","license","2026-11-10 10:12:30",false,"---\nname: compchem-validators\ndescription: Use when a docking \u002F MD \u002F free-energy campaign needs an OUTPUT quality gate - post-dock pose validity (PoseBusters), a cheap-tier prefilter before the token-gated tiers (Uni-Dock GPU-Vina before Glide, Boltz-2 affinity before FEP+\u002FQDX credits), or a \"docking done \u002F ΔG=… \u002F MD converged\" claim that should be backed by a validity artifact before it is treated as done. compchem-preflight guards INPUT; this skill guards OUTPUT (a pose can score well yet be physically impossible). Also the map for the open-weights compute arm - MACE-OFF near-DFT MD, OpenFE token-free FEP twin, REINVENT 4 generative loop, PLINDER leakage-free splits, and the TxAgent\u002FToolUniverse grounded-reasoning pattern (Opus reasoner, not the fine-tuned model). All ride the existing schrodinger \u002F qdx-rush \u002F cloud-hub MCPs - scientific compute is NOT agent runtime. Do NOT use for the receptor-prep-to-dock pipeline itself (use structure-based-screening) or license-free cheminformatics (use cheminformatics-rdkit).\n---\n\n# Compchem validators (guard the OUTPUT of a compchem run)\n\n`compchem-preflight` and [[structure-based-screening]] get you a *docked, rescored pose*.\nNothing then checks whether that pose is **physically real** or whether the expensive tier\nwas **worth spending**. This skill is the output-side quality layer — the domain expression\nof the owner's *quality-no-faking* creed.\n\n**Core principle:** a good docking *score* is not evidence of a good *pose*. Glide\u002FVina will\nhappily rank a ligand with overlapping atoms, snapped bonds, or a strained ring. Before any\n\"docking done \u002F ΔG = … \u002F MD converged\" claim is treated as done, it should carry a\n**validity artifact** — a PoseBusters pass, a redock RMSD, or an MD-convergence check.\n\nEvidence: MASTER-DECISION-QUEUE **E.4** (PoseBusters · Uni-Dock · Boltz-2 · MACE-OFF · OpenFE ·\nREINVENT 4 · PLINDER · TxAgent pattern) and COUNCIL-VERDICT **C5** (shadow-mode discipline) \u002F\n**C1.5** (domain gates are project-scoped, off-by-default globally).\n\n---\n\n## What ships here (two runnable helpers + a map)\n\n| File | What it does | Runs without heavy deps? |\n|------|--------------|--------------------------|\n| `posebusters.py` | `check_pose` \u002F `check_poses` pose validity **+** `compchem_claim_advisory` shadow claim-gate | Yes — real PoseBusters when installed, else a coarse geometry floor; the claim-gate is pure-Python |\n| `prefilters.py`  | `prefilter_rank` \u002F `prefilter_by_percentile` cheap-tier gating **+** `estimate_savings` funnel economics **+** `STAGE_MCP_ROUTES` | Yes — pure-Python + numpy |\n\nBoth are **fail-open** and **advisory** — they observe, rank, and recommend. Nothing blocks,\nnags, or raises.\n\n---\n\n## 1. Pose validity — `posebusters.py`\n\n```python\nfrom posebusters import check_pose, check_poses     # helpers in THIS skill dir\n\nr = check_pose(\"pose_0.sdf\", cond=\"dock\")           # or cond=\"redock\"\u002F\"mol\"\nprint(r.marker())          # POSEBUSTERS:PASS id=pose_0.sdf engine=posebusters ok\nif not r.valid:\n    print(r.failures)      # e.g. ['no_internal_clash', 'bond_lengths_in_range']\n```\n\n- **Authoritative path:** when the PyPI [`posebusters`](https:\u002F\u002Fgithub.com\u002Fmaabuu\u002Fposebusters)\n  package is importable, `check_pose` runs its full reference-distribution suite\n  (bond lengths\u002Fangles, aromatic-ring flatness, internal steric clash, protein-ligand volume\n  overlap, etc.) — the standard post-dock validity bench (PoseBusters, *Chem. Sci.* 2024).\n- **Fallback path (this host):** RDKit + PoseBusters are **not** installed under Python 3.14\n  (known py3.14 incompat). `check_pose` then degrades to `engine=\"geometry-fallback\"` — a\n  **coarse, honestly-labelled** floor (bond-length range + non-bonded heavy-atom clash + atoms\n  connected). It catches an *obviously* broken pose but is **not** the authoritative check;\n  install `posebusters` (in a py≤3.12 env) for that. The report says which engine ran — never\n  read a fallback pass as a PoseBusters pass.\n\n`PoseReport` fields: `valid`, `engine`, `checks`, `failures`, `summary`, `n_atoms`, `n_bonds`,\n`.marker()` (terminal-state string per AGENTS.md §4).\n\n---\n\n## 2. The SHADOW claim-gate — `compchem_claim_advisory`\n\nThe queue folds a compchem physical-validity gate into `claim_warning`: a \"docking done \u002F ΔG=… \u002F\nMD converged\" claim should fire a nudge **unless** a validity artifact is present. That gate\nlogic lives here as an importable **SHADOW-mode** helper (COUNCIL C5). It **observes + logs\nonly — never blocks, never nags, never raises.**\n\n```python\nfrom posebusters import compchem_claim_advisory\n\nadv = compchem_claim_advisory(\n    \"Docking done, dG = -9.2 kcal\u002Fmol\",\n    artifacts=[\"run1\u002Fmmgbsa-out.csv\"],   # optional on-disk artifacts\n)\nadv[\"would_fire\"]   # True  -> an ENFORCE gate WOULD flag this (no validity artifact)\nadv[\"blocked\"]      # False -> invariant: shadow NEVER blocks\nadv[\"advisory\"]     # human-readable nudge (or None)\n```\n\n- **`would_fire`** is True when a compchem result claim is present with **no co-located validity\n  artifact**. Evidence = a lexical marker (`posebusters`, `redock … rmsd`, `rmsd = …`,\n  convergence\u002Fblock-averaging) in the text, **or** an artifact file that actually **EXISTS**\n  (a `_pv.maegz` \u002F `mmgbsa*.csv` \u002F `-out.csv` \u002F `*posebusters*` — presence, not a mere mention).\n- Detection is **lexical + file-presence only** — same mechanism family as the existing\n  `ClaimWarningModule`. No trained critic, no vector-DB, no second runtime (anti-overfit gate).\n- Fires the log **only when a claim is actually seen** (keeps the fire-rate hypothesis honest).\n\n**Shadow sink (COUNCIL C5.iii):** would-have-fired events go to a **separate, bounded,\nauto-rotating** JSONL — `~\u002F.claude\u002Fgem-hunt-2026-07-12\u002Fshadow\u002Fcompchem-claim-gate.jsonl`\n(rotates at 512 KB; override dir with `$COMPCHEM_SHADOW_DIR`) — **not** the main ledger.\n\n**Anti-zombie contract (COUNCIL C5.i):** `posebusters.SHADOW_CONTRACT` carries the named\npromotion metric (shadow-precision vs the owner's claude-reflect corrections on compchem claims),\nthe promotion bar (≥0.80 over ≥20 fires, false-nag \u003C5 %), the owner, a 30-day graduation\ndeadline, and a falsifiable fire-rate hypothesis. It graduates OFF→SHADOW→ADVISE→ENFORCE only\nby hitting that bar, and auto-retires otherwise — it is never left in shadow limbo.\n\n**Wiring is deliberately NOT done here.** The `claim_warning` module is out of this skill's\nscope and is **project-scoped, off-by-default globally** by council decision (C1.5 — a compchem\ngate is irrelevant ~95 % of turns and must not occupy a universal slot). This file provides the\ncallable the gate *would* consume; the harness owner decides if\u002Fwhen to fold it in (as a branch\ninside `claim_warning`, wrapped in its own try\u002Fexcept per C1.2), enabled only under a\nscience-project settings profile.\n\n---\n\n## 3. Cheap-tier prefilter — `prefilters.py`\n\nThe expensive tiers (Glide SP\u002FXP tokens, FEP+\u002FQDX EXESS credits) are license\u002Fcredit-gated and\nserial. Spending them on candidates a **cheap GPU model** would have rejected is the waste. This\nmodule ranks candidates by a cheap score and picks the promotion set, and accounts for credits\nsaved. It is **decision-support, not a blocker** — it proposes; the orchestrator confirms.\n\n```python\nfrom prefilters import Candidate, prefilter_rank\n\ncands = [Candidate(f\"m{i}\", score=s, source=\"uni-dock\") for i, s in enumerate(vina_scores)]\nres = prefilter_rank(cands, top_frac=0.20, cost_expensive=1.0)   # keep the best 20%\nprint(res.marker())          # PREFILTER:OK stage=uni-dock->glide in=1000 promoted=200 ...\nprint(res.savings)           # {'n_rejected': 800, 'saved_frac': 0.8, ...}\npromote = [c.cid for c in res.promoted]\n```\n\nTwo prefilter stages (both \"cheap model gates expensive model\"):\n\n| Stage | Cheap tier | Gates (expensive) | Runtime (existing MCP) |\n|-------|-----------|-------------------|------------------------|\n| **A** | **Uni-Dock** GPU-Vina (MIT) | Glide SP\u002FXP (schrodinger tokens) | cloud-hub GPU sandbox (Modal\u002FRunPod) |\n| **B** | **Boltz-2** open weights (affinity) | FEP+ \u002F QDX EXESS (credits) | qdx-rush (Boltz fold+affinity) or cloud-hub GPU |\n\nSelectors (precedence `threshold` > `top_k` > `top_frac`; default `top_frac=0.25`):\n`prefilter_rank(..., top_k=, top_frac=, threshold=, direction=)` where\n`direction=\"lower_is_better\"` for docking\u002Faffinity **energies** (more negative = tighter),\n`\"higher_is_better\"` for a pIC50-style score. `prefilter_by_percentile(..., percentile=)`\ncuts on a data-driven percentile. **Unscored candidates (`score is None`) are held out as\n`res.unscored`, never silently dropped** — cheap-score them first, honestly surfaced.\n\n`estimate_savings` funnel: baseline = expensive tier on ALL; prefiltered = cheap-score all +\nexpensive only on the promoted set → `cost_saved`, `saved_frac`, `reduction_frac`.\n\n`STAGE_MCP_ROUTES` \u002F `recommend_route(stage)` map each stage to the MCP tool that runs its\ncompute — **this module never calls them** (scientific compute is not agent runtime).\n\n---\n\n## 4. The open-weights compute arm (the map — rides existing MCPs)\n\nThese are **compute**, delegated to existing MCPs; none is a new agent runtime. Adopt as the\ncampaign needs them:\n\n- **MACE-OFF** — near-DFT MLIP for MD via `openmm-ml` (quality tier above a classical force\n  field). Runs on cloud-hub GPU. *License-verify (MACE-OFF23 weights) before any commercial embed.*\n- **OpenFE** (MIT) — token-free FEP twin; run **alongside** FEP+\u002FQDX on the shortlist as an\n  independent second-model cross-check, not a replacement.\n- **Boltz-2** (open weights) — binding-affinity predictor ~1000× cheaper than FEP; the Stage-B\n  pre-FEP triage (via qdx-rush Boltz fold+affinity). Triage tier, not a substitute for FEP on\n  the final shortlist.\n- **REINVENT 4** — the missing **generative arm**; closes the generate→dock\u002Fscore→optimize loop\n  (feed the prefilter's promoted set + PoseBusters validity back as the scoring signal).\n- **PLINDER** — leakage-free protein-ligand train\u002Ftest splits; use to build honest benchmark sets\n  (feeds the planned 2.10 eval work) so a model isn't graded on data it effectively memorized.\n\n### TxAgent \u002F ToolUniverse grounded-reasoning pattern (Opus reasoner, NOT the fine-tuned model)\nTurn the raw `tooluniverse` one-shot tool calls into a **grounded reasoning loop**: **Opus is the\nreasoner** (plan → call a ToolUniverse tool → read the grounded result → decide next call →\nsynthesize with citations), NOT a deployed fine-tuned TxAgent-T1 model. This keeps every step\ngrounded in a real database call (ChEMBL\u002FOpenTargets\u002Ftooluniverse) while the reasoning stays with\nthe frontier model on the existing bus — no new model to host, no un-cited generation. Use it when\na target\u002Fmechanism question needs multiple grounded lookups chained into one answer.\n\n---\n\n## Consumption notes (read before importing)\n\n- **Name-collision:** this file is `posebusters.py`. Imported as the top-level module\n  `posebusters` (skill dir on `sys.path`), it **shadows** the PyPI package — so\n  `posebusters_available()` honestly returns False and `check_pose` uses the geometry floor. To\n  use the **authoritative** PoseBusters, run in an env where the package is installed (py≤3.12)\n  and either import these utilities under a distinct namespace (e.g. an `importlib` loader with a\n  non-`posebusters` module name) or call `posebusters.PoseBusters` directly. The guard\n  (`hasattr(pkg, \"PoseBusters\")`) makes this safe either way — it never mistakes the skill file\n  for the real package.\n- **Everything is fail-open and advisory.** No function blocks, nags, or raises on the caller;\n  a dependency-absent or bad-input path returns a structured \"couldn't verify\" result.\n- **Tested (this host, Python 3.14.6, numpy only):** 27 checks green — geometry-floor validity\n  (valid\u002Fclash\u002Fabsurd-bond\u002Funparsed\u002Ffile-path\u002Fbatch), the shadow claim-gate (fires without\n  evidence, silent with text\u002Fexisting-file evidence, ignores mentioned-but-missing artifacts,\n  never fires on non-claims, fail-open on bad input, bounded-rotating log written), and the\n  prefilter (top_k\u002Fthreshold\u002Ftop_frac\u002Fpercentile selection, savings math, unscored held out,\n  both directions, MCP routing map).\n\n## Related\n- [[structure-based-screening]] — the receptor-prep → dock → rescore → profile pipeline this guards.\n- [[schrodinger-maestro-driver]] — per-tool Schrodinger reference + security model.\n- [[qdx-rush]] — QDX\u002FEXESS GPU QM + Boltz fold+affinity (Stage-B compute).\n- [[cheminformatics-rdkit]] — license-free RDKit cheminformatics (no Schrodinger token).\n","# Compchem validators (guard the OUTPUT of a compchem run)\n\n`compchem-preflight` and [[structure-based-screening]] get you a *docked, rescored pose*.\nNothing then checks whether that pose is **physically real** or whether the expensive tier\nwas **worth spending**. This skill is the output-side quality layer — the domain expression\nof the owner's *quality-no-faking* creed.\n\n**Core principle:** a good docking *score* is not evidence of a good *pose*. Glide\u002FVina will\nhappily rank a ligand with overlapping atoms, snapped bonds, or a strained ring. Before any\n\"docking done \u002F ΔG = … \u002F MD converged\" claim is treated as done, it should carry a\n**validity artifact** — a PoseBusters pass, a redock RMSD, or an MD-convergence check.\n\nEvidence: MASTER-DECISION-QUEUE **E.4** (PoseBusters · Uni-Dock · Boltz-2 · MACE-OFF · OpenFE ·\nREINVENT 4 · PLINDER · TxAgent pattern) and COUNCIL-VERDICT **C5** (shadow-mode discipline) \u002F\n**C1.5** (domain gates are project-scoped, off-by-default globally).\n\n---\n\n## What ships here (two runnable helpers + a map)\n\n| File | What it does | Runs without heavy deps? |\n|------|--------------|--------------------------|\n| `posebusters.py` | `check_pose` \u002F `check_poses` pose validity **+** `compchem_claim_advisory` shadow claim-gate | Yes — real PoseBusters when installed, else a coarse geometry floor; the claim-gate is pure-Python |\n| `prefilters.py`  | `prefilter_rank` \u002F `prefilter_by_percentile` cheap-tier gating **+** `estimate_savings` funnel economics **+** `STAGE_MCP_ROUTES` | Yes — pure-Python + numpy |\n\nBoth are **fail-open** and **advisory** — they observe, rank, and recommend. Nothing blocks,\nnags, or raises.\n\n---\n\n## 1. Pose validity — `posebusters.py`\n\n```python\nfrom posebusters import check_pose, check_poses     # helpers in THIS skill dir\n\nr = check_pose(\"pose_0.sdf\", cond=\"dock\")           # or cond=\"redock\"\u002F\"mol\"\nprint(r.marker())          # POSEBUSTERS:PASS id=pose_0.sdf engine=posebusters ok\nif not r.valid:\n    print(r.failures)      # e.g. ['no_internal_clash', 'bond_lengths_in_range']\n```\n\n- **Authoritative path:** when the PyPI [`posebusters`](https:\u002F\u002Fgithub.com\u002Fmaabuu\u002Fposebusters)\n  package is importable, `check_pose` runs its full reference-distribution suite\n  (bond lengths\u002Fangles, aromatic-ring flatness, internal steric clash, protein-ligand volume\n  overlap, etc.) — the standard post-dock validity bench (PoseBusters, *Chem. Sci.* 2024).\n- **Fallback path (this host):** RDKit + PoseBusters are **not** installed under Python 3.14\n  (known py3.14 incompat). `check_pose` then degrades to `engine=\"geometry-fallback\"` — a\n  **coarse, honestly-labelled** floor (bond-length range + non-bonded heavy-atom clash + atoms\n  connected). It catches an *obviously* broken pose but is **not** the authoritative check;\n  install `posebusters` (in a py≤3.12 env) for that. The report says which engine ran — never\n  read a fallback pass as a PoseBusters pass.\n\n`PoseReport` fields: `valid`, `engine`, `checks`, `failures`, `summary`, `n_atoms`, `n_bonds`,\n`.marker()` (terminal-state string per AGENTS.md §4).\n\n---\n\n## 2. The SHADOW claim-gate — `compchem_claim_advisory`\n\nThe queue folds a compchem physical-validity gate into `claim_warning`: a \"docking done \u002F ΔG=… \u002F\nMD converged\" claim should fire a nudge **unless** a validity artifact is present. That gate\nlogic lives here as an importable **SHADOW-mode** helper (COUNCIL C5). It **observes + logs\nonly — never blocks, never nags, never raises.**\n\n```python\nfrom posebusters import compchem_claim_advisory\n\nadv = compchem_claim_advisory(\n    \"Docking done, dG = -9.2 kcal\u002Fmol\",\n    artifacts=[\"run1\u002Fmmgbsa-out.csv\"],   # optional on-disk artifacts\n)\nadv[\"would_fire\"]   # True  -> an ENFORCE gate WOULD flag this (no validity artifact)\nadv[\"blocked\"]      # False -> invariant: shadow NEVER blocks\nadv[\"advisory\"]     # human-readable nudge (or None)\n```\n\n- **`would_fire`** is True when a compchem result claim is present with **no co-located validity\n  artifact**. Evidence = a lexical marker (`posebusters`, `redock … rmsd`, `rmsd = …`,\n  convergence\u002Fblock-averaging) in the text, **or** an artifact file that actually **EXISTS**\n  (a `_pv.maegz` \u002F `mmgbsa*.csv` \u002F `-out.csv` \u002F `*posebusters*` — presence, not a mere mention).\n- Detection is **lexical + file-presence only** — same mechanism family as the existing\n  `ClaimWarningModule`. No trained critic, no vector-DB, no second runtime (anti-overfit gate).\n- Fires the log **only when a claim is actually seen** (keeps the fire-rate hypothesis honest).\n\n**Shadow sink (COUNCIL C5.iii):** would-have-fired events go to a **separate, bounded,\nauto-rotating** JSONL — `~\u002F.claude\u002Fgem-hunt-2026-07-12\u002Fshadow\u002Fcompchem-claim-gate.jsonl`\n(rotates at 512 KB; override dir with `$COMPCHEM_SHADOW_DIR`) — **not** the main ledger.\n\n**Anti-zombie contract (COUNCIL C5.i):** `posebusters.SHADOW_CONTRACT` carries the named\npromotion metric (shadow-precision vs the owner's claude-reflect corrections on compchem claims),\nthe promotion bar (≥0.80 over ≥20 fires, false-nag \u003C5 %), the owner, a 30-day graduation\ndeadline, and a falsifiable fire-rate hypothesis. It graduates OFF→SHADOW→ADVISE→ENFORCE only\nby hitting that bar, and auto-retires otherwise — it is never left in shadow limbo.\n\n**Wiring is deliberately NOT done here.** The `claim_warning` module is out of this skill's\nscope and is **project-scoped, off-by-default globally** by council decision (C1.5 — a compchem\ngate is irrelevant ~95 % of turns and must not occupy a universal slot). This file provides the\ncallable the gate *would* consume; the harness owner decides if\u002Fwhen to fold it in (as a branch\ninside `claim_warning`, wrapped in its own try\u002Fexcept per C1.2), enabled only under a\nscience-project settings profile.\n\n---\n\n## 3. Cheap-tier prefilter — `prefilters.py`\n\nThe expensive tiers (Glide SP\u002FXP tokens, FEP+\u002FQDX EXESS credits) are license\u002Fcredit-gated and\nserial. Spending them on candidates a **cheap GPU model** would have rejected is the waste. This\nmodule ranks candidates by a cheap score and picks the promotion set, and accounts for credits\nsaved. It is **decision-support, not a blocker** — it proposes; the orchestrator confirms.\n\n```python\nfrom prefilters import Candidate, prefilter_rank\n\ncands = [Candidate(f\"m{i}\", score=s, source=\"uni-dock\") for i, s in enumerate(vina_scores)]\nres = prefilter_rank(cands, top_frac=0.20, cost_expensive=1.0)   # keep the best 20%\nprint(res.marker())          # PREFILTER:OK stage=uni-dock->glide in=1000 promoted=200 ...\nprint(res.savings)           # {'n_rejected': 800, 'saved_frac': 0.8, ...}\npromote = [c.cid for c in res.promoted]\n```\n\nTwo prefilter stages (both \"cheap model gates expensive model\"):\n\n| Stage | Cheap tier | Gates (expensive) | Runtime (existing MCP) |\n|-------|-----------|-------------------|------------------------|\n| **A** | **Uni-Dock** GPU-Vina (MIT) | Glide SP\u002FXP (schrodinger tokens) | cloud-hub GPU sandbox (Modal\u002FRunPod) |\n| **B** | **Boltz-2** open weights (affinity) | FEP+ \u002F QDX EXESS (credits) | qdx-rush (Boltz fold+affinity) or cloud-hub GPU |\n\nSelectors (precedence `threshold` > `top_k` > `top_frac`; default `top_frac=0.25`):\n`prefilter_rank(..., top_k=, top_frac=, threshold=, direction=)` where\n`direction=\"lower_is_better\"` for docking\u002Faffinity **energies** (more negative = tighter),\n`\"higher_is_better\"` for a pIC50-style score. `prefilter_by_percentile(..., percentile=)`\ncuts on a data-driven percentile. **Unscored candidates (`score is None`) are held out as\n`res.unscored`, never silently dropped** — cheap-score them first, honestly surfaced.\n\n`estimate_savings` funnel: baseline = expensive tier on ALL; prefiltered = cheap-score all +\nexpensive only on the promoted set → `cost_saved`, `saved_frac`, `reduction_frac`.\n\n`STAGE_MCP_ROUTES` \u002F `recommend_route(stage)` map each stage to the MCP tool that runs its\ncompute — **this module never calls them** (scientific compute is not agent runtime).\n\n---\n\n## 4. The open-weights compute arm (the map — rides existing MCPs)\n\nThese are **compute**, delegated to existing MCPs; none is a new agent runtime. Adopt as the\ncampaign needs them:\n\n- **MACE-OFF** — near-DFT MLIP for MD via `openmm-ml` (quality tier above a classical force\n  field). Runs on cloud-hub GPU. *License-verify (MACE-OFF23 weights) before any commercial embed.*\n- **OpenFE** (MIT) — token-free FEP twin; run **alongside** FEP+\u002FQDX on the shortlist as an\n  independent second-model cross-check, not a replacement.\n- **Boltz-2** (open weights) — binding-affinity predictor ~1000× cheaper than FEP; the Stage-B\n  pre-FEP triage (via qdx-rush Boltz fold+affinity). Triage tier, not a substitute for FEP on\n  the final shortlist.\n- **REINVENT 4** — the missing **generative arm**; closes the generate→dock\u002Fscore→optimize loop\n  (feed the prefilter's promoted set + PoseBusters validity back as the scoring signal).\n- **PLINDER** — leakage-free protein-ligand train\u002Ftest splits; use to build honest benchmark sets\n  (feeds the planned 2.10 eval work) so a model isn't graded on data it effectively memorized.\n\n### TxAgent \u002F ToolUniverse grounded-reasoning pattern (Opus reasoner, NOT the fine-tuned model)\nTurn the raw `tooluniverse` one-shot tool calls into a **grounded reasoning loop**: **Opus is the\nreasoner** (plan → call a ToolUniverse tool → read the grounded result → decide next call →\nsynthesize with citations), NOT a deployed fine-tuned TxAgent-T1 model. This keeps every step\ngrounded in a real database call (ChEMBL\u002FOpenTargets\u002Ftooluniverse) while the reasoning stays with\nthe frontier model on the existing bus — no new model to host, no un-cited generation. Use it when\na target\u002Fmechanism question needs multiple grounded lookups chained into one answer.\n\n---\n\n## Consumption notes (read before importing)\n\n- **Name-collision:** this file is `posebusters.py`. Imported as the top-level module\n  `posebusters` (skill dir on `sys.path`), it **shadows** the PyPI package — so\n  `posebusters_available()` honestly returns False and `check_pose` uses the geometry floor. To\n  use the **authoritative** PoseBusters, run in an env where the package is installed (py≤3.12)\n  and either import these utilities under a distinct namespace (e.g. an `importlib` loader with a\n  non-`posebusters` module name) or call `posebusters.PoseBusters` directly. The guard\n  (`hasattr(pkg, \"PoseBusters\")`) makes this safe either way — it never mistakes the skill file\n  for the real package.\n- **Everything is fail-open and advisory.** No function blocks, nags, or raises on the caller;\n  a dependency-absent or bad-input path returns a structured \"couldn't verify\" result.\n- **Tested (this host, Python 3.14.6, numpy only):** 27 checks green — geometry-floor validity\n  (valid\u002Fclash\u002Fabsurd-bond\u002Funparsed\u002Ffile-path\u002Fbatch), the shadow claim-gate (fires without\n  evidence, silent with text\u002Fexisting-file evidence, ignores mentioned-but-missing artifacts,\n  never fires on non-claims, fail-open on bad input, bounded-rotating log written), and the\n  prefilter (top_k\u002Fthreshold\u002Ftop_frac\u002Fpercentile selection, savings math, unscored held out,\n  both directions, MCP routing map).\n\n## Related\n- [[structure-based-screening]] — the receptor-prep → dock → rescore → profile pipeline this guards.\n- [[schrodinger-maestro-driver]] — per-tool Schrodinger reference + security model.\n- [[qdx-rush]] — QDX\u002FEXESS GPU QM + Boltz fold+affinity (Stage-B compute).\n- [[cheminformatics-rdkit]] — license-free RDKit cheminformatics (no Schrodinger token).\n",{"name":5,"description":7},"main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Fskills\u002Fcompchem-validators","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill compchem-validators",{"tool":56,"command":57},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill compchem-validators",{"tool":59,"command":60},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill compchem-validators","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcompchem-validators\u002FSKILL.md",true,[64,70],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"posebusters.py","SCRIPT","脚本",20676,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcompchem-validators\u002Fposebusters.py",{"path":71,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":72,"sourceHtmlUrl":73},"prefilters.py",12636,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fcompchem-validators\u002Fprefilters.py",[75,96,123,150,164,180],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":39},"01M6DF7D7478R55P46REYH4QAC","clarify-requirements","Resolve genuine pre-execution ambiguity by scanning repo context, generating 1-6 grounded options, and asking 1-3 focused questions via AskUserQuestion. NOT for mid-task use (injection risk); NOT when the goal is already unambiguous; use to disambiguate vague prompts before any file edits.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fworkspace-hooks\u002Fskills\u002Fclarify-requirements\u002FSKILL.md",[],[82,83,84,85,86,87,88,89,90,32,91,92,93,94,95],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","context","repo","injection","execution","file",{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":107,"publishedAt":39},"01M6DF79CA4BHJS66J8EZDBPWJ","openmm-md","Run FREE, open-source, Windows-native GPU molecular dynamics via the openmm-md MCP (OpenMM + CUDA on the local NVIDIA GPU). Use for protein \u002F protein-ligand MD when you want a free stack or are on Windows without a Schrodinger license. Covers the full workflow (prepare, solvate, minimize, equilibrate, production, analyze, mmgbsa) AND an honest decision guide vs Schrodinger Desmond, including how to run Desmond legitimately on Linux or a cloud GPU with a real license. This is a deliberately LESSER free alternative and does NOT replace the schrodinger MCP tools. Do NOT use it to pick a free tool when a validated FEP+, WaterMap, IFD-MD, or Prime MM-GBSA result is actually required.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fmcp\u002Fopenmm-md-mcp\u002Fskill\u002Fopenmm-md\u002FSKILL.md",[102],{"categoryNo":103,"categoryName":104,"taxonomyType":105,"taxonomyTypeDesc":106},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[108,109,110,111,112,113,114,115,35,116,117,38,118,119,32,21,120,121,20,122],"openmm md","how","decision","pick","linux","analyze","tool","stack","NVIDIA","gpu","workflow","windows","molecular dynamics","local","MCP",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":135,"publishedAt":39},"01M6DF76C1MG85VEWP8VZCBNMN","visual-review","Take screenshots of web pages and UI using Playwright for visual review and iteration","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fvisual-review\u002FSKILL.md",[129,132],{"categoryNo":130,"categoryName":131,"taxonomyType":105,"taxonomyTypeDesc":106},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":133,"categoryName":134,"taxonomyType":105,"taxonomyTypeDesc":106},"01JBSEEDCAT000000000000008","测试与质量",[136,137,138,139,140,141,142,143,144,145,109,146,147,148,149],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","playwright","screenshots",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":39},"01M6DF73AQVCBZKEN0YXEX9FXP","status","Diagnostic status report — shows metaswarm installation state, project setup, and potential issues","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstatus\u002FSKILL.md",[],[152,157,158,159,160,161,162,163],"setup","report","project","installation","project setup","issues","state",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":171,"publishedAt":39},"01M6DF6X6C2XB0P6GX76P7TTYV","start","Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstart\u002FSKILL.md",[170],{"categoryNo":103,"categoryName":104,"taxonomyType":105,"taxonomyTypeDesc":106},[166,172,87,173,174,175,32,176,177,178,179],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":181,"name":157,"nameZh":6,"description":182,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":183,"categories":184,"keywords":185,"publishedAt":39},"01M6DF6QMJ9AJKFKHHKRT005PQ","Interactive project setup — detects your project, configures metaswarm, writes project-local files","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fsetup\u002FSKILL.md",[],[157,159,121,186,161,187],"files","interactive"]