Skip to content

v0.3.0

Choose a tag to compare

@yairfalse yairfalse released this 09 Jan 23:53
· 432 commits to main since this release

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:ml

PlacementError 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_LABELS or --labels
  • Task requires() method for node placement
  • NodeSelector with rich PlacementError diagnostics

Changed:

  • Mesh executor uses NodeSelector for all task dispatch