Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
9151b69
refactor(skills)!: move skills to repo root so the repo is importable
bowen-bd Sep 1, 2026
88d846a
fix(mat-elasticity): default to relaxed-ion, split the two force thre…
bowen-mit Sep 2, 2026
6ca8899
test(mat-elasticity): pin the relax_deformed no-op bug and the Voigt …
bowen-mit Sep 2, 2026
45daaa6
feat(docker): ship the MCP servers as container images
bowen-bd Sep 3, 2026
bc2d414
fix(docker): make the image registry configurable, not hardcoded
bowen-bd Sep 3, 2026
1cb5075
fix(docker): install cmake for the packages with no aarch64 wheel
bowen-bd Sep 13, 2026
f955b41
fix(docker): hold stdin open in the smoke test until the server replies
bowen-bd Sep 13, 2026
b0953fd
fix(envs): pin mcp<2 -- every server uses the 1.x FastMCP API
bowen-bd Sep 13, 2026
e6ea91b
Merge fork/main into refactor/skills-at-repo-root
bowen-bd Sep 13, 2026
975b1c4
fix(docker): unbreak the three GPU image builds
bowen-bd Sep 13, 2026
f126c28
fix(docker): wait for the smoke-test reply instead of sleeping a fixe…
bowen-bd Sep 14, 2026
7872fd4
docs: correct the plugin install identifier
bowen-bd Sep 14, 2026
f5052ae
feat(docker): support Apptainer so the plugin works on HPC
bowen-bd Sep 14, 2026
0080f6e
fix(docker): make the Apptainer path survive a real HPC node
bowen-bd Sep 14, 2026
ad0d3e1
fix(docker): repair the four bugs the HPC retest exposed
bowen-bd Sep 14, 2026
b199f18
fix(release): sync the default image tag with VERSION
bowen-bd Sep 14, 2026
7ecf9b3
fix(docker): find the pre-built SIF instead of predicting its path
bowen-bd Sep 14, 2026
22308a0
fix(docker): let the pre-build reuse a SIF it already has
bowen-bd Sep 14, 2026
f22c9f9
feat(docker): build mace and fairchem for amd64 as well as arm64
bowen-bd Sep 14, 2026
50598fa
Merge origin/main into refactor/skills-at-repo-root
bowen-bd Sep 14, 2026
8edac08
fix(docker): recover from the mksquashfs thread limit, and let the im…
bowen-bd Sep 18, 2026
0031b69
feat(venv): add dual-arch uv projects to replace the conda environments
bowen-bd Sep 18, 2026
617d8b9
feat(venv): place every remaining environment in a uv project
bowen-bd Sep 18, 2026
324709e
feat(skills): run every skill script through a uv project
bowen-bd Sep 18, 2026
c0fbc05
feat(mat-elasticity): shear-modulus extrema, acoustic branches, modul…
bowen-mit Sep 3, 2026
595323c
fix: resolve DiffCSP++ and example paths instead of hardcoding one ma…
bowen-bd Sep 28, 2026
840248f
fix: drop machine-specific paths from skills, envs and examples
bowen-bd Sep 28, 2026
c6c6c3a
feat(venv): three uv projects on latest releases, repository as a pac…
bowen-bd Oct 5, 2026
36142ae
feat(venv): one launcher for skill commands and MCP servers
bowen-bd Oct 5, 2026
f9886c4
feat(mcp): call any MCP tool from the shell
bowen-bd Oct 5, 2026
39ced64
feat(docker): images from the uv locks, plugin servers through venv/run
bowen-bd Oct 5, 2026
0858c65
feat(skills): self-locating commands, uv environments, MCP fallback
bowen-bd Oct 5, 2026
0ef8c6d
feat(mlips): matgl 4.1 CHGNet by default, backend-agnostic MD observer
bowen-bd Oct 5, 2026
0f036bb
fix(nvalchemi): stream race in batch relax/MD, cell-aware convergence
bowen-bd Oct 5, 2026
490e011
Merge origin/main (publisher-access-guard location)
bowen-bd Oct 5, 2026
460939a
chore(release): 1.5.0, registry packages name the uv images
bowen-bd Oct 5, 2026
6e9c698
docs: setup guide for the uv runtime, 1.5.0 change log and plan
bowen-bd Oct 5, 2026
f5b48b6
docs(changes): answers for the Gemini agent (G4 failure strings)
bowen-bd Oct 5, 2026
e0c9e8d
docs(changes): second verification round, plugin findings, task G6
bowen-bd Oct 5, 2026
3287866
ci(images): build the uv images, smoke-test the cpu image
bowen-bd Oct 5, 2026
bf3a7d7
[G1] docs(rules): describe the uv runtime in agent instructions
bowen-bd Oct 5, 2026
b64ad89
[G2] docs: update user-facing documentation for the uv launcher runtime
bowen-bd Oct 5, 2026
408ef98
[G4] feat(tools): classify known platform limits in check_skill_commands
bowen-bd Oct 5, 2026
87d9235
[G3] ci: add uv-envs workflow and update build-images for uv runtime
bowen-bd Oct 5, 2026
c9fb5a3
[G5] docs(skill): update ml-mlip-nvalchemi for stream fix, inflight a…
bowen-bd Oct 5, 2026
b4c0401
docs: finalize 1.5.0 gemini progress log
bowen-bd Oct 5, 2026
524ea06
Merge release/1.5.0-gemini: docs, rules, CI, sweep classification (G1…
bowen-bd Oct 5, 2026
934a97e
fix(skills): example scripts answer --help instead of querying MP
bowen-bd Oct 5, 2026
37d22c0
ci(uv-envs): skip docs-only changes; record the first green CI run
bowen-bd Oct 5, 2026
c5500af
docs(changes): verification matrix, tester runs, upstream PR plan
bowen-bd Oct 5, 2026
36b3988
[G7] fix(skills): resolve undefined names across skill scripts and sm…
bowen-bd Oct 5, 2026
615c03d
[G8] fix(skills): audit and protect skill scripts for safe --help han…
bowen-bd Oct 5, 2026
db4cab4
Merge release/1.5.0-gemini: undefined names and --help audit (G7, G8)
bowen-bd Oct 5, 2026
606dec3
fix(venv): RHEL 8 and CentOS 7 hosts, old NVIDIA drivers (Engaging, d…
bowen-bd Oct 5, 2026
9b56660
docs(changes): desta and Engaging results in the verification matrix
bowen-bd Oct 5, 2026
4df628f
docs: no local paths, host names or personal projects in shipped files
bowen-bd Oct 5, 2026
b0d63a5
chore(release)!: 2.0.0 -- not backward compatible with 1.x
bowen-bd Oct 5, 2026
321d0ed
feat(venv): CUDA 12.6 torch for NVIDIA drivers older than 580
bowen-bd Oct 5, 2026
496dc33
fix(venv): torchvision from the same CUDA index as torch
bowen-bd Oct 5, 2026
4890813
[G9] fix: remove local environment and personal details from shipped …
bowen-bd Oct 5, 2026
a5a2178
Merge release/1.5.0-gemini: no local information in shipped files (G9)
bowen-bd Oct 5, 2026
203343f
fix: GPU selection under CUDA_VISIBLE_DEVICES, doctor on multi-GPU ho…
bowen-bd Oct 5, 2026
a680880
docs(changes): retest results on the A100 workstation and the HPC clu…
bowen-bd Oct 5, 2026
00df46f
docs(changes): A100 workstation round 3 results
bowen-bd Oct 5, 2026
c0fb9f2
docs(changes): 2.0.0 images built and published
bowen-bd Oct 5, 2026
36eae47
docs: HPC notes from the cluster run (Apptainer for extras, SIF clean…
bowen-bd Oct 5, 2026
e356af1
docs(changes): ready for upstream -- drop internal planning docs
bowen-bd Oct 5, 2026
ba043cf
chore(conda-envs): keep only the stacks still in use
bowen-bd Oct 5, 2026
1cc0b0d
feat(venv): uv projects for the generative stacks and React-OT
bowen-bd Oct 5, 2026
9d7a1df
feat(venv): ICEBERG on its own uv project, ported to ms-pred 2.1
bowen-bd Oct 5, 2026
57e5098
fix(chem-msms-predict): load ICEBERG checkpoints under torch 2.6
bowen-bd Oct 5, 2026
08fc3e3
fix(chem-msms-predict): sum same-m/z fragment peaks in the plot; real…
bowen-bd Oct 5, 2026
28fbeea
feat(venv): SelfConditionedDenoisingAtoms on its own uv project
bowen-bd Oct 5, 2026
92729d5
fix(ml-property-predict-scd): load checkpoints from the SCD checkout
bowen-bd Oct 5, 2026
5395828
fix(generative): find the ADiT checkout without PYTHONPATH; mount sou…
bowen-bd Oct 5, 2026
215769f
refactor(configure_mcp): every server starts through venv/run
bowen-bd Oct 5, 2026
c63d96a
docs: every stack on uv; conda only for LAMMPS and the arm64 image
bowen-bd Oct 5, 2026
bae08df
docs(verification): ICEBERG and SCD results on x86_64
bowen-bd Oct 5, 2026
dd2c756
fix(mattergen): run MatterGen from a source checkout
bowen-bd Oct 5, 2026
af6edb2
feat(images): build the generative image from the uv locks
bowen-bd Oct 5, 2026
e1be4fd
feat(mat-lammps-md): build and run LAMMPS on the uv environments
bowen-bd Oct 5, 2026
5523ed1
docs: no conda anywhere
bowen-bd Oct 5, 2026
72d056c
fix(tests): run the MCP server tests in their uv environments
bowen-bd Oct 5, 2026
48d744a
docs(tests): troubleshooting and CI notes for the uv environments
bowen-bd Oct 5, 2026
05ee42a
docs(changes): no conda in 2.0.0; MatterGen checkout, generative imag…
bowen-bd Oct 5, 2026
7a0817f
docs(skills): name the uv environments, not the 1.x conda ones
bowen-bd Oct 5, 2026
fee3006
ci: run the MCP servers' unit tests in their environments
bowen-bd Oct 5, 2026
fff3356
docs(changes): AmberTools is an external install
bowen-bd Oct 5, 2026
b3a796b
fix(tests): skip the local VASP run without VASP; SCINE lowercases op…
bowen-bd Oct 5, 2026
6cc04cc
fix(images): RDKit drawing in every image; CUDA libraries of each tor…
bowen-bd Oct 5, 2026
33a7323
docs(mat-lammps-md): Kokkos targets for Blackwell; MatGL build verifi…
bowen-bd Oct 5, 2026
6151b7b
fix(generative): fresh checkouts generate; ADiT gets OpenBabel; pytes…
bowen-bd Oct 5, 2026
5315e78
docs(verification): x86-A100 round 4 results
bowen-bd Oct 5, 2026
3b1c9db
fix: review and EL8 findings: OpenFF, Sella, MatGL device, container …
bowen-bd Oct 6, 2026
5f1b306
docs: research-stack glibc floors, amd64 generative image, review and…
bowen-bd Oct 6, 2026
ac1f9cc
fix(openmm): python-constraint from its git tag; the sweep shows why …
bowen-bd Oct 6, 2026
a146ade
fix(run): a stack with no image says how to run it natively anyway
bowen-bd Oct 6, 2026
f3855b9
fix: correct batch relaxation convergence and cell optimization
bowen-bd Oct 6, 2026
e80a3a6
fix: guard NValchemi 0.2 neighbor geometry allocations
bowen-bd Oct 6, 2026
15be445
fix: require explicit opt-in for experimental NValchemi batching
bowen-bd Oct 6, 2026
6adda72
docs(migration): batched NValchemi is opt-in
bowen-bd Oct 6, 2026
ee9f3b9
docs(verification): the draft NValchemi upstream issue
bowen-bd Oct 6, 2026
34f2d20
fix(images): unrelated venv/ changes no longer recompile the generati…
bowen-bd Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .agents/rules/coding-standards.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ These rules are universally applied across all aspects of this project. **You MU
10. **URL Validation**: After generating any URLs, always test whether the URL is valid by verifying it directly (e.g., curling).

## 2. Environment and Dependency Management
- **Environment Isolation**: You must use the appropriate isolated Conda environment depending on the module or skill being developed (see `@.agents/rules/mcp-environments.md`). The `base-agent` environment serves as the generic fallback for standard processing.
- **Dependency Versions**: Never globally force arbitrary PyTorch or library versions (e.g., do not globally demand `torch 2.9.1`). PyTorch and critical packages are rigorously managed per-environment by their respective `core_env.yaml` schemas in `conda-envs/*`.
- **Environment Isolation**: You must use the appropriate environment via the `venv/run` launcher depending on the task: a shared project (`cpu`, `mlip`, `fairchem`) or the research stack a skill declares in `metadata.venv` (see `.agents/rules/mcp-environments.md`). The `cpu` environment serves as the generic fallback for standard processing without torch.
- **Dependency Versions**: Dependencies are rigorously managed per uv project in `venv/<project>/pyproject.toml` and committed `uv.lock`. Never arbitrarily force or install package versions globally. Optional extras (`openmm`, `docking`, `pymol`, `void`, `transport`) handle system-dependent packages.
- **Failures**: NEVER implement fallback functions when package imports fail. Debug the root cause and fix the environment configuration.


Expand Down
115 changes: 77 additions & 38 deletions .agents/rules/mcp-environments.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,81 @@
trigger: always_on
---

# MCP Server Environment Rules

When running scripts or debugging code related to specific MCP servers, you MUST use the corresponding Conda environment defined in `mcp_config.json`.

For general development logic that cuts across tools, usually `base-agent` is sufficient, but when importing specific libraries that are isolated (like `atomate2`, `jobflow_remote`, `mace`, `fairchem`), you must use the correct environment.

## Installation Instructions

For detailed installation instructions, please refer to the `README.md` and `install.sh` located in each environment's directory under `conda-envs/<env_name>/`.

- **base-agent**: `conda-envs/base-agent/` (Core: pymatgen, ase, rdkit, packmol)
- **mace-agent**: `conda-envs/mace-agent/` (Core: mace-torch, pymatgen, ase)
- **matgl-agent**: `conda-envs/matgl-agent/` (Core: matgl, pymatgen, dgl)
- **fairchem-agent**: `conda-envs/fairchem-agent/` (Core: fairchem-core≥2.18, pymatgen, Python 3.12)
- **atomate2-agent**: `conda-envs/atomate2-agent/` (Core: atomate2, pymatgen)
- **adit-agent**: `conda-envs/adit-agent/` (Core: ADiT, lightning, hydra, PyG)
- **diffcsp-agent**: `conda-envs/diffcsp-agent/` (Core: DiffCSP++, hydra, PyG, pyxtal)
- **mattergen-agent**: `conda-envs/mattergen-agent/` (Core: MatterGen, PyG, lightning)
- **smol-agent**: `conda-envs/smol-agent/` (Core: smol, pymatgen)
- **drugdisc-agent**: `conda-envs/drugdisc-agent/` (Core: rdkit, autodock-vina, pdbfixer, meeko)
- **xrd-agent**: `conda-envs/xrd-agent/` (Core: DARA, pymatgen)
- **orca-agent**: `conda-envs/orca-agent/` (Core: scine_utilities, scine_readuct, ase). Requires `ORCA_BINARY_PATH` environment variable pointing to the ORCA binary. No MCP server, scripts only.
- **phasefield-agent**: `conda-envs/phasefield-agent/` (Core: fipy, scipy, numpy, imageio). No MCP server, scripts only.
- **calphad-agent**: `conda-envs/calphad-agent/` (Core: pycalphad, pymatgen). No MCP server, scripts only.
- **nmr-agent**: `conda-envs/nmr-agent/` (Core: nmrsim, nmrglue, pot). No MCP server, scripts only.
- **react-ot-agent**: `conda-envs/react-ot-agent/` (Core: PyTorch). No MCP server, scripts only.

| MCP Server | Conda Environment | Python Path |
# MCP Server and Environment Runtime Rules

AtomisticSkills runs all skill scripts and MCP servers through the unified launcher `venv/run`. The runtime uses three shared `uv` projects under `venv/` plus one pinned project per research stack, with pre-built container images as an automatic fallback when host requirements are not met.

## 1. Environments Overview

| Environment | Primary Packages | GPU | MCP Servers |
| :--- | :--- | :--- | :--- |
| `cpu` | ASE, pymatgen, RDKit, pycalphad, MDAnalysis (no torch) | No | `base`, `atomate2`, `drugdisc`, `smol` |
| `mlip` | PyTorch 2.14.1, MACE-torch 0.3.16, MatGL 4.1.0, nvalchemi-toolkit 0.2.0 | Yes | `mace`, `matgl` |
| `fairchem` | PyTorch 2.13.0, fairchem-core 2.23.0, nvalchemi-toolkit 0.2.0 | Yes | `fairchem` |

### Research Stacks

Pinned to the versions they were verified with, rather than tracking the latest releases:

| Environment | Used by | Platforms |
| :--- | :--- | :--- |
| matgl | `matgl-agent` | `<conda_base>/envs/matgl-agent/bin/python` |
| mace | `mace-agent` | `<conda_base>/envs/mace-agent/bin/python` |
| fairchem | `fairchem-agent` | `<conda_base>/envs/fairchem-agent/bin/python` |
| materials_tools | `base-agent` | `<conda_base>/envs/base-agent/bin/python` |
| atomate2 | `atomate2-agent` | `<conda_base>/envs/atomate2-agent/bin/python` |
| smol | `smol-agent` | `<conda_base>/envs/smol-agent/bin/python` |
| adit | `adit-agent` | `<conda_base>/envs/adit-agent/bin/python` |
| diffcsp | `diffcsp-agent` | `<conda_base>/envs/diffcsp-agent/bin/python` |
| mattergen | `mattergen-agent` | `<conda_base>/envs/mattergen-agent/bin/python` |
| drugdisc | `drugdisc-agent` | `<conda_base>/envs/drugdisc-agent/bin/python` |
| `adit`, `diffcsp`, `mattergen` | the generative MCP servers and skills | x86_64 natively with glibc ≥ 2.32 (CUDA 12.6 or 13 by driver); elsewhere the `generative` image |
| `msms` | `chem-msms-predict` (ICEBERG 2.1, CPU) | x86_64 only, glibc ≥ 2.31 and GCC 9's libstdc++ |
| `reactot` | `chem-react-ot` | x86_64 and aarch64 |
| `scd` | `ml-property-predict-scd` | x86_64 only, glibc ≥ 2.32 |

### Why Three Shared Environments?
1. **Package conflicts**: `mace-torch` pins `e3nn==0.4.4`, whereas `fairchem-core` requires `e3nn>=0.5`.
2. **PyTorch versions**: `fairchem-core` 2.23 requires `torch~=2.13`, while `mlip` runs PyTorch 2.14.1.
3. **NumPy constraints**: `nvalchemi-toolkit` 0.2 requires `numpy<2.4`, so GPU environments use NumPy 2.3.5 while `cpu` uses NumPy 2.5+.

### Optional Extras
Environments support optional extras specified as `<venv>+<extra>` (e.g., `cpu+openmm`, `cpu+docking`):
- `openmm`: OpenMM and PDBFixer (requires glibc ≥ 2.34).
- `pymol`: PyMOL open-source (x86_64 only).
- `docking`: AutoDock Vina (builds against Boost on aarch64).
- `void`: VOID guest docking (installed from git).
- `transport`: AMSET and BoltzTraP2 (requires git and cmake).

## 2. Server Runtime Mapping

| MCP Server | venv | Image | GPU | Description |
| :--- | :--- | :--- | :--- | :--- |
| `base` | `cpu` | `cpu` | No | Materials Project query, structure manipulation, literature |
| `atomate2` | `cpu` | `cpu` | No | Atomate2 and Jobflow calculation workflows |
| `drugdisc` | `cpu` | `cpu` | No | Small-molecule standardization, descriptors, fingerprints |
| `smol` | `cpu` | `cpu` | No | Cluster expansion and Monte Carlo simulations |
| `mace` | `mlip` | `mlip` | Yes | MACE foundation models (relax, MD, features) |
| `matgl` | `mlip` | `mlip` | Yes | MatGL models (CHGNet, TensorNet, M3GNet) |
| `fairchem` | `fairchem` | `fairchem` | Yes | FairChem models (UMA, eSEN) |
| `adit` | `adit` | `generative` | Yes | ADiT all-atom diffusion transformer |
| `diffcsp` | `diffcsp` | `generative` | Yes | DiffCSP++ crystal structure generation |
| `mattergen` | `mattergen` | `generative` | Yes | MatterGen generative diffusion model |

The generative servers run from their uv projects on x86_64 hosts with glibc ≥ 2.32 (PyG's wheels need it); elsewhere `venv/run` uses the `generative` container image (linux/amd64 and linux/arm64; on arm64 it compiles the PyG extensions from source, since PyG publishes no aarch64 wheels).

## 3. No Conda

Since 2.0.0 nothing runs from conda. Stacks that cannot share an environment get their own pinned uv project (the research stacks above); host builds use a uv extra (`mlip+lammps` provides what `mat-lammps-md` needs to compile LAMMPS against the `mlip` environment, `fairchem+lammps` the LAMMPS wheel and `fairchem-lammps`).

## 4. Runtime Selection and Launcher Backend

All skills and servers execute through the `venv/run` launcher:
- `venv/run <venv>[+<extra>] <command> [args...]`
- `venv/run --server <name>`
- `venv/run --setup` (prepares environments)
- `venv/run --doctor` (checks runtime status and diagnostics)

The runtime backend is controlled by `ATOMISTIC_RUNTIME` (or `~/.config/atomistic_skills.yaml`):
- `auto` (default): Uses native `uv` if the machine is Linux x86_64/aarch64 with compatible glibc (per `venv/platforms.tsv`) and a C compiler (`gcc`). Otherwise, automatically falls back to container images (`ghcr.io/learningmatter-mit/atomisticskills-<name>:2.0.0`).
- `uv`: Enforces host `uv` execution.
- `docker`, `podman`, `apptainer`, `singularity`: Enforces container execution with host paths mounted at identical locations.

## 5. Shell CLI Fallback for MCP Tools

When an MCP server is not connected via stdio, any MCP tool can be executed directly from the shell:
```bash
venv/run <venv> python -m src.mcp_server.cli <server> <tool> key=value ...
```
- Pass `--list` to view all available tools for a server.
- Multiple tool calls chained in one command share process memory (e.g., `load_model` followed by `relax_structure`).
42 changes: 36 additions & 6 deletions .agents/rules/release-standards.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,43 @@ Use [Semantic Versioning](https://semver.org/): `vMAJOR.MINOR.PATCH`

## Pre-Tag Checklist

1. Rebuild the doc site to get accurate public counts:
0. Bump the version and propagate it to every published manifest. `VERSION` at
the repository root is the single source; `.claude-plugin/plugin.json`,
`.claude-plugin/marketplace.json` and `server.json` are derived from it.
The tag must match `VERSION` exactly.
```bash
conda run -n base-agent python site/build_skills.py
venv/run cpu python tools/sync_version.py --set 1.x.y
venv/run cpu python tools/sync_version.py --check
```
2. Read counts from `site/skills_index.js` and git (source of truth):
> CI runs `--check` on every push, so a tag can never ship with the four
> files disagreeing.

If `docker/images.json` changed in this release, re-render the plugin's MCP
wiring as well, since the image tags follow the version:
```bash
python docker/render.py plugin-mcp
```

1. Verify derived files, platform locks, and migrations:
```bash
python docker/render.py servers --check
python docker/render.py plugin-mcp --check
venv/run cpu python tools/lock_platforms.py --check
venv/run cpu python tools/migrate_skill_commands.py --check
```

2. Run the test suites:
```bash
venv/run cpu python -m pytest tests/test_launcher.py tests/test_skill_runtime.py tests/test_uv_projects.py tests/test_images_and_manifests.py tests/test_tool_cli.py -q
```

3. Rebuild the doc site to get accurate public counts:
```bash
venv/run cpu python site/build_skills.py
```
4. Read counts from `site/skills_index.js` and git (source of truth):
```bash
# skills, tools, servers (= conda-env dirs) — from rebuilt index
# skills, tools, servers — from rebuilt index
python3 -c "
import re
content = open('site/skills_index.js').read()
Expand All @@ -37,8 +67,8 @@ Use [Semantic Versioning](https://semver.org/): `vMAJOR.MINOR.PATCH`
```

> **Note**: Workflows live as plain `*.md` files in `.agents/workflows/` (e.g. `drug-hit-finding-htvs.md`), **not** as `WORKFLOW.md`. Always use `ls .agents/workflows/*.md | wc -l` for the current count and `git ls-tree -r <tag> --name-only | grep "workflows/.*\.md" | wc -l` for the previous-tag count.
3. Ensure all pre-commit hooks pass on HEAD.
4. Confirm the MCP server does not expose built-in agent tools (e.g. `task_boundary`, `notify_user`).
5. Ensure all pre-commit hooks pass on HEAD.
6. Confirm the MCP server does not expose built-in agent tools (e.g. `task_boundary`, `notify_user`).

## Tag Message Format

Expand Down
Loading
Loading