What it does

CathodePilot works on real XtalOpt and GULP crystal-structure search runs.

  • Audit: deterministic checks that open the exact file and line. On our own data they found 14 items, including result files that look synthetic, compositions that aren't charge-balanced, and descriptor bounds that reach only 4 of 10 density bins.
  • Controlled experiment: random, plain Pareto, MOME and Nemotron-steered MOME, with the same seeds, budget and frozen mutation settings, 3 random seeds each, scored by CHGNet on an NVIDIA GPU.
  • Agent: NVIDIA Nemotron reads results only through tools, and every plan passes a validator before it runs.
  • Run Watch: a coworker for long runs. It detects stalls and failures for free, saves evidence, asks Nemotron for one action from a fixed list, asks the human before acting, checks the fix worked, remembers it, warns the next similar run, and writes a report. In our test on a stand-in process, a real CALL-E phone call asked for approval, the supervisor approved, and it stopped only the named job.
  • Shortlist: ranked leads, labelled as surrogate results for follow-up, not discoveries.

Hear the real phone approval

Recordings of real CALL-E calls placed by Run Watch on a stand-in process (the voice on the call is CALL-E's AI agent; in the later call the supervisor answered from a prepared script):

Why we built it

One of our overnight runs stopped at generation 35 and nobody knew until the next day. When we audited our own results, we found problems we hadn't seen. Research teams need a partner that checks the work and shows its evidence.

How we built it

Python, FastAPI and a plain JavaScript front end. NVIDIA Nemotron on Nebius Token Factory through its OpenAI-compatible API: Nemotron 3 Ultra for planning and diagnosis, Nano for short calls. CHGNet on an RTX 3050. pymatgen for duplicate detection. CALL-E for phone approval.

Every model call passes through one function with a disk cache, a token budget and a dollar limit.

Measured results

3 seeds each, 60 evaluations per run, mean ± sd:

Strategy MOQD score Cells filled Unique valid Duplicates
Random 14.08 ± 2.25 10.3 ± 2.1 32.3 ± 3.8 27.7 ± 3.8
Nemotron + MOME 12.77 ± 2.81 9.0 ± 1.7 29.7 ± 4.2 30.3 ± 4.2
MOME (ours) 12.62 ± 0.80 9.0 ± 1.0 25.0 ± 7.0 35.0 ± 7.0
Plain Pareto 7.71 ± 4.48 5.3 ± 2.3 11.0 ± 3.6 49.0 ± 3.6

MOME beat plain Pareto but did not beat random parent choice, and we report that. Nemotron steering filled the same number of cells as MOME alone with about 5 fewer duplicates, but with 3 seeds that is within the spread, so we don't claim it helped. The agent did react to evidence, moving from mostly strain to mostly permute on seed 0 as it saw strain produce duplicates. Its audit report also miscounted one item, which the deterministic checks caught, and that is why every number links to its source. Estimated model cost for all of this: about $0.24.

Challenges

Windows process trees: a venv's python.exe is a launcher, so an early version of "stop the stuck job" killed the run itself. We caught this on real processes. Adversarial review then found more: a false alarm could teach the watcher to stay silent, and a failed file read could look like progress. All of those now have tests.

What we learned

Report what the data says, even when your own method ties a random baseline. Duplicates were the largest waste.

What's next

Use a Materials Project hull for dopant search, watch runs on remote servers, try Run Watch on a full XtalOpt run, and validate leads with DFT.

Built before the submission period

The MOME extension of XtalOpt and the run data under data/runs are our team's earlier research. CathodePilot itself (audit, experiment harness, agent, Run Watch, app) was built during the submission period.

Feedback on Nebius Token Factory and NVIDIA tools

  • The OpenAI-compatible API made integration a small change. Nemotron 3 Ultra's tool calling worked first time, and planning calls took a few seconds.
  • Card onboarding was the hardest part. Stripe refused one card even with international payments on, the docs read as if a promo code needs no card while support says one is required, and I couldn't find a way to remove the card afterwards. A hard spending limit and a remove-card button would help students a lot.

Built With

  • call-e
  • chgnet
  • fastapi
  • gulp
  • javascript
  • nebius-token-factory
  • nvidia-nemotron
  • pymatgen
  • python
  • xtalopt
Share this project:

Updates

Submission history