Prove that the issue sits in the workflow state that the person named. The issue sits in the state that the person authorised, and that state belongs to the intended team.

Contract identity.
FactValue
Contract idlinear.issue.in_state
Version1.0.0
Hash95967bbb661df54d
Completion levelin_state
PublisherBuilt and signed by Provely.
CertificationProvisional
SkillLinear GraphQL API 0.1.0
Valid for provider API versionsfp_2026_09

What is the intent?

Get the issue into this workflow state of this team.

What is the subject and the action?

MemberValue
Subject typelinear.issue
Subject identityissue_id = $action.result.issueCreate.issue.id
Canonical effectwork.issue_create
Provider operationmutation issueCreate
Idempotencynone, retry is not safe

How does the evidence correlate with this operation?

StrategyAssuranceKeysRequired
resource_idstrongissue_id from $action.result.issueCreate.issue.idyes
fingerprintweakteam_id from $input.team_id; title from $input.titleno

Which evidence does the contract require?

Minimum evidence level E2. An independent channel is required. Minimum channels: 1.

ChannelLevelIndependenceVerifierDescription
issue_readbackE2provider readbackhttpRead the issue with its team, its workflow state, and its assignee. The http verifier returns the parsed GraphQL body. A path starts with $observed.<channel>.data, and $observed.<channel>.errors states a refusal.
issue_state_eventsE3provider eventwebhookThe Issue.update events of this issue that carry the workflow state identifier of the intent. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}.
issue_created_eventsE3provider eventwebhookThe Issue.create events for the intended title since the operation started. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}. A count above one shows a second issue, and the API has no idempotency key to stop it.

Which conditions must all hold for VERIFIED?

ConditionMeaningPathOperatorExpectedEvidence
issue_readback_carries_no_errorsThe answer carries no errors array. Linear answers the status code 200 for an operation that succeeded in part, so the status code states nothing.$observed.issue_readback.errorsabsentundefinedissue_readback
issue_presentThe provider holds the issue with the returned identifier.$observed.issue_readback.data.issue.ideq$action.result.issueCreate.issue.idissue_readback
issue_team_matchesThe issue belongs to the team that the intent named.$observed.issue_readback.data.issue.team.ideq$input.team_idissue_readback
issue_created_in_windowThe provider created the issue after the operation started.$observed.issue_readback.data.issue.createdAttime_after$operation.created_atissue_readback
workflow_state_belongs_to_the_teamThe workflow state of the issue belongs to the team of the intent. Each team has its own set of workflow states, so the runtime reads the team of the state and never pins an identifier.$observed.issue_readback.data.issue.state.team.ideq$input.team_idissue_readback
workflow_state_name_matchesThe workflow state of the issue carries the name that the person named. The identifier and the name must name one state.$observed.issue_readback.data.issue.state.nameeq$input.state_nameissue_readback
issue_in_the_promised_stateThe workflow state of the issue is the state of the intent. The type of the state alone separates nothing, because a team can hold more than one state of one type.$observed.issue_readback.data.issue.state.ideq$input.state_idissue_readback
issue_state_eventAt least one Issue.update event of this issue carries the workflow state identifier of the intent.$observed.issue_state_events.countgte1issue_state_events

Which conditions give CONTRADICTED?

ConditionClassReasonPathOperatorExpected
issue_on_wrong_teamwrong subjectThe issue belongs to a different team than the intent named.$observed.issue_readback.data.issue.team.idne$input.team_id
issue_title_differswrong subjectThe issue carries a different title than the intent named.$observed.issue_readback.data.issue.titlene$input.title
issue_predates_operationpre existing stateThe issue is older than the operation. It proves nothing.$observed.issue_readback.data.issue.createdAttime_before$operation.created_at
duplicate_issue_presentduplicate side effectLinear created more than one issue with this title since the operation started. Do not retry.$observed.issue_created_events.countgt1
workflow_state_of_another_teamwrong subjectThe workflow state of the issue belongs to another team than the intent named. Stop and ask a person.$observed.issue_readback.data.issue.state.team.idne$input.team_id

Which observed states map to a verdict before completion?

RuleMatchVerdictReason
issue_readback_refused$observed.issue_readback.errors exists undefinedUNVERIFIABLELinear answered the read with the status code 200 and an errors array. The answer is a refusal and it is no evidence.
issue_left_the_workflow($observed.issue_readback.data.issue.state.type in ["canceled","duplicate"]) and (not ($observed.issue_readback.data.issue.state.id eq "$input.state_id"))CONTRADICTEDA person or an agent moved the issue into a canceled state or a duplicate state. The issue can never reach the promised state. Ask a person.
authorised_state_carries_another_name($observed.issue_readback.data.issue.state.id eq "$input.state_id") and (not ($observed.issue_readback.data.issue.state.name eq "$input.state_name"))CONTRADICTEDThe identifier of the intent names a workflow state with another name than the person named. Ask a person.
issue_not_in_the_promised_state_yet$observed.issue_readback.data.issue.state.type in ["triage","backlog","unstarted"]PENDINGThe issue has not reached the promised workflow state. The runtime observes again.

How long does the runtime observe?

Timing memberValue
Initial delay1000 ms
Poll interval5000 ms
Backoffexponential factor 2, max 60000 ms
Maximum attempts40
Timeout604800000 ms
Stale read window20000 ms
On timeoutUNVERIFIABLE (evidence_unavailable_before_timeout), escalated to a person

Where do these rules come from?

  • linear.graphql#/mutations/issueUpdate: linear.graphql, retrieved 2026-09-09
  • linear.graphql#/inputs/IssueUpdateInput/fields/stateId: linear.graphql, retrieved 2026-09-09
  • linear.graphql#/types/Issue/fields/state: linear.graphql, retrieved 2026-09-09
  • linear.docs.states#workflow-states/a-workflow-state-belongs-to-one-team: linear.docs.states, retrieved 2026-09-09
  • linear.docs.issues#issues-in-the-linear-graphql-api/update-an-issue: linear.docs.issues, retrieved 2026-09-09
  • linear.docs.issues#issues-in-the-linear-graphql-api/error-handling: linear.docs.issues, retrieved 2026-09-09
  • linear.docs.issues#issues-in-the-linear-graphql-api/error-handling/p2: linear.docs.issues, retrieved 2026-09-09
  • linear.docs.issues#issues-in-the-linear-graphql-api/the-endpoint: linear.docs.issues, retrieved 2026-09-09
  • linear.graphql#/queries/issue: linear.graphql, retrieved 2026-09-09
  • linear.graphql#/types/Issue/fields/id: linear.graphql, retrieved 2026-09-09
  • linear.graphql#/types/IssuePayload/fields/issue: linear.graphql, retrieved 2026-09-09
  • linear.graphql#/types/Issue/fields/team: linear.graphql, retrieved 2026-09-09
  • linear.graphql#/inputs/IssueCreateInput/fields/teamId: linear.graphql, retrieved 2026-09-09
  • linear.graphql#/types/Issue/fields/createdAt: linear.graphql, retrieved 2026-09-09
  • linear.graphql#/types/WorkflowState/fields/team: linear.graphql, retrieved 2026-09-09
  • linear.graphql#/types/WorkflowState/fields/name: linear.graphql, retrieved 2026-09-09
  • linear.docs.states#workflow-states/the-name-and-the-position-of-a-workflow-state: linear.docs.states, retrieved 2026-09-09
  • linear.graphql#/types/WorkflowState/fields/id: linear.graphql, retrieved 2026-09-09
  • linear.events#/events/Issue.update: linear.events, retrieved 2026-09-09
  • linear.webhooks.graphql#/types/IssueWebhookPayload/fields/stateId: linear.webhooks.graphql, retrieved 2026-09-09
  • linear.docs.webhooks#linear-webhooks/the-fields-of-a-data-change-event: linear.docs.webhooks, retrieved 2026-09-09

Can linear.issue.in_state return VERIFIED from the action response alone?

No. The minimum evidence level is E2. The action response is E1. The completion conditions read issue_readback and issue_state_events.

What happens after the timeout?

The verdict is UNVERIFIABLE with the reason evidence_unavailable_before_timeout. The operation goes to a person for review.