starforge-core, so the two cannot disagree
about what a method is.
Method ids
Two-part<framework>/<method>:
Lockfile: recipe.lock.json
sf new writes recipe.lock.json:
At submit the CLI handshakes with the server catalog. The lock must match the published recipe exactly.
Framework version matrix
One recipe can publish several framework versions at once (verl/grpo has 0.8.0 and 0.9.0). Entrypoint changes, parameter-path moves, and images are declared on the version, not as branches in adapter code:
- Entrypoint override: verl 0.9 dropped
main_ppo_syncfor a unifiedmain_ppo. - Parameter path override:
path_overrideswhen a hyperparameter moved in the config tree. - Runtime artifact: each version binds a
runtime_id, resolved from a framework default, the deployment registry, or--image. Prefer a digest in production. Slurm wants SIF/SQSH.
Custom recipe
Frameworks that are not in the catalog usecustom/custom. The platform runs train.sh in the experiment directory. It does not guess an entrypoint, and it does not fall back to custom after another adapter fails.
--image is required. Tags work; pin a digest in production. The registry must be on FORGE_ALLOWED_IMAGE_REGISTRIES.
The catalog custom recipe currently defaults to external observability, so those submits still need --observability-url. Logs follow stdout. Console curves need starforge.report in training code. Cookbook: Custom training. Image build: Custom images.
Config layers
Effective config is four layers, later wins:sf validate walks the same stack locally. Struct mode rejects unknown keys.