feat: decide what triggers a run #4

Merged
day01 merged %!d() commits from %!s() into %!s() 2026-08-06 07:22:01 +00:00
Owner

Nothing modelled workflow triggers: the forge decided when a run started and
the runner never asked. The control plane has to decide, so on: becomes part
of what a workflow says.

Deciding

An event states its kind, its branch and what it touched. A trigger admits it by
branch and by path. An exclusion always wins, which is what makes
paths-ignore mean what it says. A workflow that declares nothing is never
triggered — saying nothing is not saying everything. An event that touched no
path cannot satisfy a path filter.

Glob support is deliberately partial: literals, * within a segment and **
across segments. Character classes and the rest are refused when the workflow is
read, rather than matched by accident. An event this control plane cannot act on
is refused the same way.

Verification

cargo fmt --check, cargo clippy --workspace --all-targets --all-features -- -D warnings,
cargo test --workspace --all-targets --all-features, check-architecture.sh,
check-rust-loc.sh. Eight tests on the matching rules and three on reading on:
in each of its three shapes.

Next

The control plane's trigger path takes an event and only queues the runs whose
workflow admits it. Reading workflow files from a commit, and the forge event
feed that produces the events, are the two pieces after that.

Nothing modelled workflow triggers: the forge decided when a run started and the runner never asked. The control plane has to decide, so `on:` becomes part of what a workflow says. ## Deciding An event states its kind, its branch and what it touched. A trigger admits it by branch and by path. An exclusion always wins, which is what makes `paths-ignore` mean what it says. A workflow that declares nothing is never triggered — saying nothing is not saying everything. An event that touched no path cannot satisfy a path filter. Glob support is deliberately partial: literals, `*` within a segment and `**` across segments. Character classes and the rest are refused when the workflow is read, rather than matched by accident. An event this control plane cannot act on is refused the same way. ## Verification `cargo fmt --check`, `cargo clippy --workspace --all-targets --all-features -- -D warnings`, `cargo test --workspace --all-targets --all-features`, `check-architecture.sh`, `check-rust-loc.sh`. Eight tests on the matching rules and three on reading `on:` in each of its three shapes. ## Next The control plane's trigger path takes an event and only queues the runs whose workflow admits it. Reading workflow files from a commit, and the forge event feed that produces the events, are the two pieces after that.
day01 added 2 commits 2026-08-06 06:34:16 +00:00
		Nothing modelled workflow triggers, because the forge decided when to start a
run and the runner never asked. The control plane has to decide instead: an
event states its kind, its branch and what it touched, and a trigger admits it
by branch and path.

An exclusion always wins, a workflow that says nothing is never triggered, an
event that touched nothing cannot satisfy a path filter, and glob syntax this
compiler does not implement is refused rather than matched by accident.
	
		The reader dropped 'on:' because the forge decided when a run started. It now
becomes typed triggers: a single event, a list, or a mapping with branch and
path filters. An event this control plane cannot act on is refused when the
workflow is read, rather than read as a workflow that triggers on nothing.
	
day01 merged commit e7fbcebb81 into %!s() 2026-08-06 07:22:01 +00:00
day01 deleted branch feat/decide-what-triggers-a-run 2026-08-06 07:22:02 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: syncode/workflow#4