Trigger Nodes
15 trigger nodes including GitHub, Linear, and donmai.
Trigger nodes are the entry points of every workflow. Exactly one trigger appears at the root of each workflow; it receives an inbound event, normalizes it into a typed NormalizedEvent envelope, and emits that envelope to downstream nodes via its output port. The event type on each trigger determines which CloudEvent the workflow router matches against.
Trigger outputSchema is contractually tested per-trigger in backend.test.ts (WEFT M2 contract) - the shape you see documented here is enforced at test time, not just by convention.
GitHub triggers
github.push
Fires when a push is made to any branch (or a filtered branch set) in a connected GitHub repository.
Output fields
| Field | Type | Description |
|---|---|---|
ref | string | Full git ref (e.g. refs/heads/main) |
before | string | Previous HEAD SHA |
after | string | New HEAD SHA |
repository.fullName | string | owner/repo |
pusher.name | string | GitHub username of the pusher |
commits | array | Array of commit objects with id, message, author |
Filter config
| Field | Type | Description |
|---|---|---|
branches | string[] | Only match pushes to these branches |
ignoreBranches | string[] | Skip pushes to these branches |
github.pr.opened
Fires when a pull request is opened in a connected repository.
Output fields
| Field | Type | Description |
|---|---|---|
number | number | PR number |
title | string | PR title |
body | string | PR description |
headRef | string | Head branch name |
baseRef | string | Base branch name |
htmlUrl | string | GitHub PR URL |
author.login | string | PR author |
repository.fullName | string | owner/repo |
draft | boolean | Whether the PR is a draft |
github.pr.merged
Fires when a pull request is merged.
Output fields - same shape as github.pr.opened plus mergedAt (ISO timestamp) and mergedBy.login.
github.pr.review_submitted
Fires when a pull request review is submitted (approved, changes requested, or commented).
Output fields
| Field | Type | Description |
|---|---|---|
pullRequestNumber | number | PR number |
reviewState | string | approved, changes_requested, or commented |
reviewer.login | string | Reviewer's GitHub login |
body | string | Review comment body |
htmlUrl | string | Review URL |
github.check_run.completed
Fires when a GitHub Actions check run completes.
Output fields
| Field | Type | Description |
|---|---|---|
name | string | Check run name |
status | string | completed |
conclusion | string | success, failure, neutral, cancelled, skipped, timed_out, or action_required |
headSha | string | Commit SHA |
htmlUrl | string | Check run URL |
pullRequestNumbers | number[] | Associated PR numbers |
github_issues.issue.assigned
Fires when a GitHub Issue is assigned to a user. Requires the GitHub Issues integration to be enabled for your organization.
Output fields
| Field | Type | Description |
|---|---|---|
number | number | Issue number |
title | string | Issue title |
body | string | Issue body |
htmlUrl | string | Issue URL |
assignee.login | string | Newly assigned user |
repository.fullName | string | owner/repo |
github_issues.comment.created
Fires when a comment is created on a GitHub Issue.
Output fields
| Field | Type | Description |
|---|---|---|
issueNumber | number | Issue number |
body | string | Comment body |
author.login | string | Comment author |
htmlUrl | string | Comment URL |
Linear triggers
linear.issue.assigned
Fires when a Linear issue is assigned (or reassigned) to a user.
Output fields
| Field | Type | Description |
|---|---|---|
issueId | string | Linear issue UUID |
issueIdentifier | string | Human-readable ID (e.g. REN-1234) |
issueTitle | string | Issue title |
assigneeId | string | Assigned user UUID |
assigneeName | string | Assigned user display name |
teamId | string | Linear team UUID |
projectId | string | Linear project UUID (if present) |
linear.issue.status_changed
Fires when the status (state) of a Linear issue changes.
Output fields
| Field | Type | Description |
|---|---|---|
issueId | string | Linear issue UUID |
issueIdentifier | string | Human-readable ID |
fromState | string | Previous state name |
toState | string | New state name |
teamId | string | Linear team UUID |
linear.issue.labeled
Fires when a label is added to a Linear issue.
Output fields
| Field | Type | Description |
|---|---|---|
issueId | string | Linear issue UUID |
issueIdentifier | string | Human-readable ID |
labelId | string | Added label UUID |
labelName | string | Added label name |
linear.comment.created
Fires when a comment is created on a Linear issue.
Output fields
| Field | Type | Description |
|---|---|---|
issueId | string | Linear issue UUID |
issueIdentifier | string | Human-readable ID |
commentBody | string | Comment text |
authorId | string | Comment author UUID |
authorName | string | Comment author display name |
linear.agent_session.created
Fires when Linear emits an AgentSessionEvent with action=created. This is the primary entry point for SDLC automation - a user @-mentions your agent or delegates work from the Linear UI.
Output fields
| Field | Type | Required |
|---|---|---|
sessionId | string | yes |
issueId | string | yes |
issueIdentifier | string | yes |
issueTitle | string | yes |
issueStatus | string | yes |
commentBody | string | yes |
mentionedUserId | string | yes |
promptContext | string | yes |
matchedPrefix | string | no |
project | string | no |
plainBody | string | no |
matchedPrefix is populated when a bodyStartsWith filter matches. plainBody is commentBody with all @mention syntax stripped.
Filter config
| Field | Type | Description |
|---|---|---|
bodyStartsWith | string[] | Match sessions where the triggering comment starts with one of these prefixes. Populates matchedPrefix. Example: ["Research", "Backlog"] |
mentionsUser | string | Only match when a specific Linear user is @mentioned. Accepts username, display name, or UUID. |
project | string | Only match issues in this Linear project. |
CloudEvent type: com.linear.AgentSessionEvent.created
linear.agent_session.prompted
Fires when Linear emits an AgentSessionEvent with action=prompted - typically an @mention in an existing session thread (the "continue" signal).
If no workflow subscription matches a linear.agent_session.prompted event, it is silently dropped as af.skip. This is by design: @mentions in threads where no matching workflow is subscribed produce no side effects rather than an error. Monitor your subscription configuration if you expect prompted events to route.
Output fields - same shape as linear.agent_session.created. The promptContext field carries the new continuation prompt from Linear.
linear.agent_session.updated
Fires when a Linear AgentSession is updated (state transition or metadata change). Useful for reacting to session state changes, such as when a session moves to complete.
Output fields - same shape as linear.agent_session.created, plus previousState and newState string fields reflecting the AgentSession state transition.
Donmai trigger
agent.exit
Fires when a donmai agent session completes (exits). This is the re-entry point for workflows that dispatch an agent and then need to continue when that agent finishes.
Unlike other trigger nodes, agent.exit exposes two output ports that route based on the session outcome:
| Output port | When it fires |
|---|---|
success | Session completed successfully (com.agentfactory.session.completed) |
fail | Session failed or crashed (com.agentfactory.session.failed) |
success port fields
| Field | Type | Description |
|---|---|---|
sessionId | string | Completed session UUID |
profile | string | Agent profile (e.g. "developer") |
issueId | string | Linear issue ID this session targeted |
status | string | Final session status string |
branchName | string | Branch name produced by the session |
summary | string | Agent-provided completion summary |
costUsd | number | Total session cost in USD |
fail port fields
| Field | Type | Description |
|---|---|---|
sessionId | string | Session UUID |
profile | string | Agent profile |
issueId | string | Linear issue ID |
status | string | Final session status string |
errorMessage | string | Failure error message |
errorClassification | string | Failure classification (e.g. "timeout", "crash") |
retryAttempt | number | Retry attempt counter |
agent.exit is wired automatically by the SDLC templates at each stage boundary. In custom workflows, pair it with agent.dispatch or agent.invoke: the dispatcher fires and the agent.exit trigger re-enters the workflow when the session completes.
Related pages
- Agent Action Nodes - dispatching and managing agent sessions
- Linear Action Nodes - responding to issues and AgentSessions
- Expressions - using
{{ $trigger.data.* }}in downstream config - Linear Integration - connecting Linear and configuring OAuth scopes