Migrating to v0.50.2

Two breaking changes. The first affects a machine whose agent.yaml carries name or coordinators; the second affects a pipelines.yaml whose on: carries a trigger key with no body.

Enrolled agent configuration refuses to startSection anchor link

Before: sparkwing-runner agent accepted an agent.yaml that set name or coordinators, entered enrolled mode, and polled its coordinators. The controller refuses that credential on both the claim route and the offer route, so the agent claimed nothing and logged an error on every slot.

After: the agent refuses that configuration, prints one message naming the state, and exits non-zero:

enrolled execution is not available; remove name and coordinators from
agent.yaml to run in claim mode, or pass --allow-enrolled-preview to start
the unfinished enrolled path

What to do: remove name and coordinators from agent.yaml. What remains is claim mode, which executes work. Set holder_prefix to the name you want in the dashboard; labels, max_concurrent, contribution, local_admission and local_reserve keep their meaning. sparkwing cluster runners add writes that shape for you.

Why: a machine in enrolled mode ran a supervised loop that could never claim work. Failing at startup, once, says so; polling and logging an error every slot did not.

Edge cases: --allow-enrolled-preview starts the unfinished enrolled path unchanged, for the developers of that path. sparkwing fleet agents enroll still prints a coordinators membership, so a config merged from its output needs that flag until enrolled execution ships.

A trigger key with no value is refusedSection anchor link

Before: a trigger key under on: with nothing after it, such as pre_commit: on its own line, parsed, yielded no trigger, and installed no hook. Nothing reported it, so a repository that meant to run on every commit ran on none and read as configured.

After: the parse is refused, naming the key and the line it sits on.

What to do: give every trigger a body. A trigger with no options takes an empty mapping:

on:
  pre_commit: {}
  push:
    branches: [main]

on: itself may still be empty; it is a key carrying no value that is refused, not an absent one.

Why: the empty key had exactly the shape of a configured trigger and none of the behaviour, and it failed silently at the one moment a reader would have believed it.