v0.3.0
What's New in v0.3.0
Node Profiles & Task Placement
Tasks can now specify which nodes they should run on using label requirements:
Go SDK:
p.Task("train").
Requires("gpu").
Run("python train.py")Rust SDK:
p.task("train")
.requires(&["gpu"])
.run("python train.py");Nodes automatically expose labels for:
- OS:
darwin,linux,windows - Architecture:
arm64,amd64 - Docker:
docker(if docker is installed)
User-defined labels via:
# Environment variable
SYKLI_LABELS=gpu,team:ml sykli run
# CLI flag (daemon mode)
sykli daemon start --labels=gpu,team:mlPlacementError Diagnostics
When task placement fails, you get actionable hints:
✗ train failed: no nodes match requirements
Task requires: gpu
Available nodes: local
Nodes tried:
local → exited with code 1
Fix options:
• Add labels to a node: SYKLI_LABELS=gpu
Documentation
- ADR-018: TypeScript SDK design
- ADR-019: Schema-driven SDK code generation architecture
Full Changelog
New Features:
- Node profiles with auto-detected labels (OS, arch, docker)
- User-defined labels via
SYKLI_LABELSor--labels - Task
requires()method for node placement - NodeSelector with rich PlacementError diagnostics
Changed:
- Mesh executor uses NodeSelector for all task dispatch