# What does linear.issue.created prove?

> Prove that Linear holds this issue on the intended team. Version 1.0.0, certification Provisional.

Canonical: https://provely.sh/verify/linear/linear.issue.created  
Last reviewed: 2026-09-05  
Skill version: 0.1.0  
Certification: provisional  

**Prove that Linear holds this issue on the intended team. The record exists with the intended title. It does not prove the workflow state, and it does not prove the assignee.**

*Contract identity.*

| Fact | Value |
| --- | --- |
| Contract id | `linear.issue.created` |
| Version | `1.0.0` |
| Hash | `bf6f7d609cf356ab` |
| Completion level | `created` |
| Publisher | Built and signed by Provely. |
| Certification | Provisional |
| Skill | [Linear GraphQL API 0.1.0](/verify/linear) |
| Valid for provider API versions | `fp_2026_09` |

## What is the intent?

Create an issue with this title on this team.

## What is the subject and the action?

| Member | Value |
| --- | --- |
| Subject type | `linear.issue` |
| Subject identity | issue_id = `$action.result.issueCreate.issue.id` |
| Canonical effect | `work.issue_create` |
| Provider operation | `mutation issueCreate` |
| Idempotency | none, retry is not safe |

## How does the evidence correlate with this operation?

| Strategy | Assurance | Keys | Required |
| --- | --- | --- | --- |
| `resource_id` | strong | issue_id from `$action.result.issueCreate.issue.id` | yes |
| `fingerprint` | weak | team_id from `$input.team_id`; title from `$input.title` | no |

## Which evidence does the contract require?

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

| Channel | Level | Independence | Verifier | Description |
| --- | --- | --- | --- | --- |
| `issue_readback` | E2 | provider readback | `http` | Read 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_created_events` | E3 | provider event | `webhook` | The 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?

| Condition | Meaning | Path | Operator | Expected | Evidence |
| --- | --- | --- | --- | --- | --- |
| `issue_readback_carries_no_errors` | The 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.errors` | `absent` | `undefined` | `issue_readback` |
| `issue_present` | The provider holds the issue with the returned identifier. | `$observed.issue_readback.data.issue.id` | `eq` | `$action.result.issueCreate.issue.id` | `issue_readback` |
| `issue_team_matches` | The issue belongs to the team that the intent named. | `$observed.issue_readback.data.issue.team.id` | `eq` | `$input.team_id` | `issue_readback` |
| `issue_created_in_window` | The provider created the issue after the operation started. | `$observed.issue_readback.data.issue.createdAt` | `time_after` | `$operation.created_at` | `issue_readback` |
| `issue_title_matches` | The title of the issue equals the requested title. | `$observed.issue_readback.data.issue.title` | `eq` | `$input.title` | `issue_readback` |
| `issue_created_event` | At least one Issue.create event names the title of this issue. The duplicate guard reads the same channel, so a workspace with no webhook cannot verify and cannot miss a second issue either. | `$observed.issue_created_events.count` | `gte` | `1` | `issue_created_events` |

## Which conditions give CONTRADICTED?

| Condition | Class | Reason | Path | Operator | Expected |
| --- | --- | --- | --- | --- | --- |
| `issue_on_wrong_team` | wrong subject | The issue belongs to a different team than the intent named. | `$observed.issue_readback.data.issue.team.id` | `ne` | `$input.team_id` |
| `issue_title_differs` | wrong subject | The issue carries a different title than the intent named. | `$observed.issue_readback.data.issue.title` | `ne` | `$input.title` |
| `issue_predates_operation` | pre existing state | The issue is older than the operation. It proves nothing. | `$observed.issue_readback.data.issue.createdAt` | `time_before` | `$operation.created_at` |
| `duplicate_issue_present` | duplicate side effect | Linear created more than one issue with this title since the operation started. Do not retry. | `$observed.issue_created_events.count` | `gt` | `1` |

## Which observed states map to a verdict before completion?

| Rule | Match | Verdict | Reason |
| --- | --- | --- | --- |
| `issue_readback_refused` | `$observed.issue_readback.errors` exists `undefined` | UNVERIFIABLE | Linear answered the read with the status code 200 and an errors array. The answer is a refusal and it is no evidence. |

## How long does the runtime observe?

| Timing member | Value |
| --- | --- |
| Initial delay | 1000 ms |
| Poll interval | 5000 ms |
| Backoff | exponential factor 2, max 60000 ms |
| Maximum attempts | 40 |
| Timeout | 900000 ms |
| Stale read window | 20000 ms |
| On timeout | UNVERIFIABLE (`evidence_unavailable_before_timeout`), escalated to a person |

## Where do these rules come from?

- `linear.graphql#/mutations/issueCreate`: [linear.graphql](https://api.linear.app/graphql), retrieved 2026-09-09
- `linear.graphql#/types/IssuePayload/fields/issue`: [linear.graphql](https://api.linear.app/graphql), retrieved 2026-09-09
- `linear.docs.issues#issues-in-the-linear-graphql-api/create-an-issue`: [linear.docs.issues](https://linear.app/developers/graphql), retrieved 2026-09-09
- `linear.docs.versions#api-versions/no-version`: [linear.docs.versions](https://linear.app/developers/deprecations), retrieved 2026-09-09
- `linear.docs.issues#issues-in-the-linear-graphql-api/error-handling`: [linear.docs.issues](https://linear.app/developers/graphql), retrieved 2026-09-09
- `linear.docs.issues#issues-in-the-linear-graphql-api/error-handling/p2`: [linear.docs.issues](https://linear.app/developers/graphql), retrieved 2026-09-09
- `linear.docs.issues#issues-in-the-linear-graphql-api/the-endpoint`: [linear.docs.issues](https://linear.app/developers/graphql), retrieved 2026-09-09
- `linear.graphql#/queries/issue`: [linear.graphql](https://api.linear.app/graphql), retrieved 2026-09-09
- `linear.graphql#/types/Issue/fields/id`: [linear.graphql](https://api.linear.app/graphql), retrieved 2026-09-09
- `linear.graphql#/types/Issue/fields/team`: [linear.graphql](https://api.linear.app/graphql), retrieved 2026-09-09
- `linear.graphql#/inputs/IssueCreateInput/fields/teamId`: [linear.graphql](https://api.linear.app/graphql), retrieved 2026-09-09
- `linear.graphql#/types/Issue/fields/createdAt`: [linear.graphql](https://api.linear.app/graphql), retrieved 2026-09-09
- `linear.graphql#/types/Issue/fields/title`: [linear.graphql](https://api.linear.app/graphql), retrieved 2026-09-09
- `linear.graphql#/inputs/IssueCreateInput/fields/title`: [linear.graphql](https://api.linear.app/graphql), retrieved 2026-09-09
- `linear.events#/events/Issue.create`: [linear.events](https://linear.app/developers/webhooks), retrieved 2026-09-09
- `linear.docs.webhooks#linear-webhooks/the-fields-of-a-data-change-event`: [linear.docs.webhooks](https://linear.app/developers/webhooks), retrieved 2026-09-09
- `linear.webhooks.graphql#/types/IssueWebhookPayload/fields/title`: [linear.webhooks.graphql](https://studio.apollographql.com/public/Linear-Webhooks/variant/current/schema/reference/objects), retrieved 2026-09-09

### Can linear.issue.created 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_created_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.

## Read next

- [Read the Linear GraphQL API verification page](https://provely.sh/verify/linear)
- [Read the linear.issue.assigned contract](https://provely.sh/verify/linear/linear.issue.assigned)
- [Read the linear.issue.in_state contract](https://provely.sh/verify/linear/linear.issue.in_state)
- [Read what a completion contract contains](https://provely.sh/contracts)
- [Read what a receipt proves](https://provely.sh/docs/receipts)
