This page covers the failures most likely to occur during a Rowan autosearch run.
rowan-score requires a Rowan API key.
Fix:
cp .env.example .envThen set ROWAN_API_KEY in .env. The scorer loads .env from the repository
root.
Symptom in iteration JSON:
{
"score": null,
"error": "RDKit failed to parse SMILES",
"constraint_failures": ["invalid SMILES"]
}Fix:
- Check parentheses, ring closure numbers, charges, and aromatic atom casing.
- Prefer canonical SMILES from RDKit or a trusted drawing tool.
- Use
rowan-score --dry-runfor formatting checks before spending Rowan credits.
Symptom:
{
"score": null,
"error": "Could not extract metric ..."
}Fix:
- Open the latest
runs/<run_id>/iterations/NNNN.json. - Inspect
candidates[*].object_data. - Find the numeric value that matches the objective.
- Add its dot-path to
runs/<run_id>/config.jsonasmetric_path. - Rescore the candidate or score a fresh baseline iteration.
Example:
{
"metric_path": "solubilities.O.solubilities.0"
}Symptoms:
- Candidate
scorevalues may be numeric. satisfies_constraintsisfalse.constraint_failureslists the violated local descriptor limits.rowan-state statusdoes not treat them as best-so-far.
Fix:
- Propose smaller or less lipophilic modifications.
- Check whether the configured constraints reflect the project goal.
- Consider easing constraints only if they were arbitrary or exploratory.
- Do not chase a high score that is outside hard project constraints.
Symptom:
{
"score": null,
"error": "Rowan submit failed: ..."
}Fix:
- Confirm
ROWAN_API_KEYis valid. - Confirm
workflow_typemaps to an available Rowan SDK submitter. - Confirm required
workflow_paramsare present. - Reduce
--max-workersif failures look like rate limiting. - Retry only failed candidates when possible to avoid duplicate successful records.
--workflow-param values are parsed as JSON when possible. Lists and objects
must be quoted for the shell:
--workflow-param solvents='["water"]'
--workflow-param temperatures='[298.15]'
--workflow-param pocket='[[0,0,0],[12,12,12]]'Unquoted values are usually parsed as strings or numbers:
--workflow-param method=kingfisher
--workflow-param exhaustiveness=8If Rowan rejects a parameter, compare workflow_params in config.json with
the current Rowan SDK submitter signature.
The report uses constraint-aware best-so-far logic. It will not show a winner if no candidate has both:
- a numeric
score satisfies_constraints: true
Fix scoring errors or constraints first, then rerun:
uv run rowan-report --run <run_id>rowan-propose is a brainstorming helper. It uses simple RDKit transformations
and may emit candidates that are syntactically valid but strategically weak.
Fix:
- Treat output as suggestions, not an auto-submit list.
- Filter for chemistry that matches the objective.
- Check constraints locally through
rowan-score --dry-runor by estimating descriptor changes before scoring.
The run history is intended to be append-only. Avoid rewriting old iterations.
Acceptable cleanup:
- Remove an accidental duplicate candidate before further analysis.
- Fix a mistaken
decisionvalue. - Drop failed duplicates created by a retry, if the successful result already exists elsewhere.
When in doubt, append a new iteration and explain the correction in the
--rationale.