All bugs
highRaces & ordering

Server 404s on an issue it created a moment earlier

Pre-existing issues update fine. The bug only shows up on the create-then-edit path, and the UI quietly reverts to Backlog with no error.

ExampleApps PR #8 · linearFound 2026-06-12Full report in Replay QA

What the recording showed

POST /api/issues → 201 {id:"i1781307989927"}, then PATCH /api/issues/i1781307989927 → 404 for that same id. A control PATCH /api/issues/i4 returned 200.

Actual

The PATCH /api/issues/i1781307989927 request (body {"status":"todo"}) returns HTTP 404 with body {"error":"not found"}, even though the create call POST /api/issues returned 201 with response body {"id":"i1781307989927","status":"backlog"}. The Status combobox reverts to 'Backlog', the issue is not triaged, and it still renders in the Inbox after the failure.

Expected

Selecting a new Status for the newly-created issue should persist: the backend PATCH should succeed, the issue's status should become Todo, and the issue should leave the Inbox triage list, exactly as it does for pre-existing issues.

Session replay

Chronology of events

1
The app at 0:06.00:06.0
0:06.0

In the ENG-149 detail dialog (ENG-149 was just created via the New issue dialog; the create call POST /api/issues returned 201 with id i1781307989927), the user opens the 'Status' dropdown and clicks the 'Todo' option to triage the issue out of the Inbox. The Status field still reads 'Backlog' at the moment of selection. This click fires the status-update PATCH request. User interaction.

3 evidence probes (UserInteractions, InspectElement, NetworkRequest)
UserInteractions {"mode":"interactions","type":"click","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b"}
→ # User Interactions

**Filter:** click only
**Showing 1–8 of 8 interactions**

| # | Time | Type | Detail | Point |
|---|------|------|--------|-------|
| 0 | 25778ms | click | Click at (119, 138) | Point:4 |
| 1 | 85756ms | click | Click at (1207, 31) | Point:5 |
| 2 | 104538ms | click | Click at (768, 344) | Point:6 |
| 3 | 155755ms | click | Click at (772, 89) | Point:7 |
| 4 | 172477ms | click | Click at (650, 338) | Point:8 |
| 5 | 219503ms | click | Click at (810, 165) | Point:9 |
| 6 | 222786ms | click | Click at (772, 164) | Point:10 |
| 7 | 234791ms | click | Click at (650, 338) | Point:11 |

## Next Steps

- Use DescribePoint with a point reference to inspect the code at a specific interaction
- Use Evaluate with a point reference for ad-hoc value inspection at that moment
- Use `type: 'click'` or `type: 'keypress'` to filter by interaction type
InspectElement {"point":"Point:8","element":"[role=\"option\"]","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b"}
→ Element:1 is `<div role="option" aria-labelledby="radix-_r_16_" aria-selected="false" data-state="checked" tabindex="-1" data-slot="select-item" class="relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 [&amp;_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2" data-radix-collection-item=""></div>`.
Element:1 is rendered by React component DetailBody at Point:15:
Relevant code: https://deploy-preview-8--blamy-broken-linear-linear.netlify.app/src/components/issue-detail.tsx line 71 column 8
No elements are obstructing the center point of this element.

Element:1 has 155px width and 28px height.
Margin: top 0px right 0px bottom 0px left 0px.
Padding: top 4px right 32px bottom 4px left 6px.

Distances to its parent element:
- Top is aligned with parent boundary
- Right is aligned with parent boundary
- Bottom overflows parent by 140.00px
- Left is aligned with parent boundary

### Parent Element:6

Element:6 is `<div data-radix-select-viewport="" role="presentation" data-position="item-aligned" class="data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)"…
NetworkRequest {"mode":"detail","urlFilter":"/api/issues","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b","requestIndex":2}
→ A POST network request with ID 1819.46 was made to https://deploy-preview-8--blamy-broken-linear-linear.netlify.app/api/issues:
<request_summary>
The response had status 201 ().
</request_summary>
Initiated at Point:3 @ 104543.00ms
Events:
  request @ 104543ms
  request-body @ 104543ms
  response @ 104765ms
  response-body @ 104766ms
  request-done @ 104766ms
Request headers:
<requestHeaders>
sec-ch-ua: 
content-type: application/json
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/108.0.5359.0 Safari/537.36
sec-ch-ua-platform: 
</requestHeaders>
Response headers:
<responseHeaders>
x-nf-request-id: 01KTZ3NQT4CV09JMB9P26W4JB9
date: Fri, 12 Jun 2026 23:46:29 GMT
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
netlify-vary: query
server: Netlify
age: 0
cache-status: "Netlify Durable"; fwd=bypass, "Netlify Edge"; fwd=miss
content-type: application/json
cache-control: no-cache
</responseHeaders>

The request body was
:
<requestBody>
{"title":"QA triage test issue","description":null,"priority":0,"teamId":"eng","projectId":null,"labelIds":[]}
</requestBody>

The response body was
:
<responseBody>
{"id":"i1781307989927","identifier":"ENG-149","title":"QA triage test issue","description":null,"teamId":"eng","projectId":null,"status":"backlog","priority":0,"assigneeId":null,"labelIds":[],"createdAt":"2026-06-12T23:46:29.927Z","updatedAt":"2026-06-12T23:46:29.9…
2
The app at 0:06.10:06.1
0:06.1

After the selection, the Status combobox of ENG-149 still shows 'Backlog' (highlighted) instead of 'Todo' — the change did not apply. The update failed because PATCH /api/issues/i1781307989927 returned HTTP 404 {"error":"not found"}. The issue was not deleted: immediately after the 404 the Inbox DOM still lists ENG-149 (alongside ENG-148 and ENG-145), confirmed by evaluating the rendered issue rows.

2 evidence probes (NetworkRequest, Evaluate)
NetworkRequest {"mode":"detail","urlFilter":"i1781307989927","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b","requestIndex":0}
→ A PATCH network request with ID 1819.72 was made to https://deploy-preview-8--blamy-broken-linear-linear.netlify.app/api/issues/i1781307989927:
<request_summary>
The response had status 404 ().
</request_summary>
Initiated at Point:2 @ 172479.00ms
Events:
  request @ 172479ms
  request-body @ 172479ms
  response @ 172582ms
  response-body @ 172582ms
  request-done @ 172632ms
Request headers:
<requestHeaders>
sec-ch-ua: 
content-type: application/json
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/108.0.5359.0 Safari/537.36
sec-ch-ua-platform: 
</requestHeaders>
Response headers:
<responseHeaders>
x-nf-request-id: 01KTZ3QT33JMP004CQFNAFR71E
date: Fri, 12 Jun 2026 23:47:37 GMT
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
netlify-vary: query
server: Netlify
age: 0
cache-status: "Netlify Durable"; fwd=bypass, "Netlify Edge"; fwd=method
content-type: application/json
cache-control: no-cache
</responseHeaders>

The request body was
:
<requestBody>
{"status":"todo"}
</requestBody>

The response body was
:
<responseBody>
{"error":"not found"}
</responseBody>
Evaluate {"point":"Point:13","expression":"(() => { const rows = Array.from(document.querySelectorAll('main button')).map(b=>b.textContent).filter(t=>/ENG-|DES-|OPS-/.test(t)); return JSON.stringify(rows); })()","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b"}
→ "[\"ENG-149QA triage test issueBacklog\",\"ENG-148QA exploration test issueBacklog\",\"ENG-145Ship push notification opt-inBacklog\"]"

Steps to reproduce

1

Open the Linear app and click 'Inbox' in the sidebar (the 'Triage new issues' view).

2

Click 'New issue', type a title (e.g. 'QA triage test issue') and click 'Create issue'. The issue is created as ENG-149 with status Backlog and appears in the Inbox.

3

Click the new ENG-149 row to open its detail dialog.

4

Open the 'Status' dropdown and select 'Todo' to triage it.

5

Observe the Status snaps back to 'Backlog' and the issue stays in the Inbox.

Root cause

The backend returns HTTP 404 with body {"error":"not found"} for PATCH /api/issues/i1781307989927 (request body {"status":"todo"}), even though the same backend created that exact issue: the create call POST /api/issues returned 201 with response body {"id":"i1781307989927","identifier":"ENG-149","status":"backlog"}. The issue was not removed by any delete (cross-run or otherwise): immediately after the 404 the Inbox still renders ENG-149. In the same session, PATCH /api/issues/i4 on a pre-existing issue returns 200 and updates its status to 'todo', so the update endpoint itself works. The 404 'not found' for an id the server itself issued directly contradicts the server's own create (201) response and the observable application state — a server-side defect that makes newly-created issues un-updatable and therefore un-triageable.

3 evidence probes (NetworkRequest)
NetworkRequest {"mode":"detail","urlFilter":"/api/issues","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b","requestIndex":2}
→ A POST network request with ID 1819.46 was made to https://deploy-preview-8--blamy-broken-linear-linear.netlify.app/api/issues:
<request_summary>
The response had status 201 ().
</request_summary>
Initiated at Point:3 @ 104543.00ms
Events:
  request @ 104543ms
  request-body @ 104543ms
  response @ 104765ms
  response-body @ 104766ms
  request-done @ 104766ms
Request headers:
<requestHeaders>
sec-ch-ua: 
content-type: application/json
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/108.0.5359.0 Safari/537.36
sec-ch-ua-platform: 
</requestHeaders>
Response headers:
<responseHeaders>
x-nf-request-id: 01KTZ3NQT4CV09JMB9P26W4JB9
date: Fri, 12 Jun 2026 23:46:29 GMT
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
netlify-vary: query
server: Netlify
age: 0
cache-status: "Netlify Durable"; fwd=bypass, "Netlify Edge"; fwd=miss
content-type: application/json
cache-control: no-cache
</responseHeaders>

The request body was
:
<requestBody>
{"title":"QA triage test issue","description":null,"priority":0,"teamId":"eng","projectId":null,"labelIds":[]}
</requestBody>

The response body was
:
<responseBody>
{"id":"i1781307989927","identifier":"ENG-149","title":"QA triage test issue","description":null,"teamId":"eng","projectId":null,"status":"backlog","priority":0,"assigneeId":null,"labelIds":[],"createdAt":"2026-06-12T23:46:29.927Z","updatedAt":"2026-06-12T23:46:29.9…
NetworkRequest {"mode":"detail","urlFilter":"i1781307989927","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b","requestIndex":0}
→ A PATCH network request with ID 1819.72 was made to https://deploy-preview-8--blamy-broken-linear-linear.netlify.app/api/issues/i1781307989927:
<request_summary>
The response had status 404 ().
</request_summary>
Initiated at Point:2 @ 172479.00ms
Events:
  request @ 172479ms
  request-body @ 172479ms
  response @ 172582ms
  response-body @ 172582ms
  request-done @ 172632ms
Request headers:
<requestHeaders>
sec-ch-ua: 
content-type: application/json
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/108.0.5359.0 Safari/537.36
sec-ch-ua-platform: 
</requestHeaders>
Response headers:
<responseHeaders>
x-nf-request-id: 01KTZ3QT33JMP004CQFNAFR71E
date: Fri, 12 Jun 2026 23:47:37 GMT
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
netlify-vary: query
server: Netlify
age: 0
cache-status: "Netlify Durable"; fwd=bypass, "Netlify Edge"; fwd=method
content-type: application/json
cache-control: no-cache
</responseHeaders>

The request body was
:
<requestBody>
{"status":"todo"}
</requestBody>

The response body was
:
<responseBody>
{"error":"not found"}
</responseBody>
NetworkRequest {"mode":"detail","urlFilter":"i4","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b","requestIndex":0}
→ A PATCH network request with ID 1819.106 was made to https://deploy-preview-8--blamy-broken-linear-linear.netlify.app/api/issues/i4:
<request_summary>
The response had status 200 ().
</request_summary>
Initiated at Point:19 @ 234792.00ms
Events:
  request @ 234792ms
  request-body @ 234792ms
  response @ 234889ms
  response-body @ 234889ms
  request-done @ 234890ms
Request headers:
<requestHeaders>
sec-ch-ua: 
content-type: application/json
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/108.0.5359.0 Safari/537.36
sec-ch-ua-platform: 
</requestHeaders>
Response headers:
<responseHeaders>
x-nf-request-id: 01KTZ3SPYBZ6RWKNEBVZAXB4E4
date: Fri, 12 Jun 2026 23:48:40 GMT
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
netlify-vary: query
server: Netlify
age: 0
cache-status: "Netlify Durable"; fwd=bypass, "Netlify Edge"; fwd=method
content-type: application/json
cache-control: no-cache
</responseHeaders>

The request body was
:
<requestBody>
{"status":"todo"}
</requestBody>

The response body was
:
<responseBody>
{"id":"i4","identifier":"ENG-145","title":"Ship push notification opt-in","description":null,"teamId":"eng","projectId":"mobile","status":"todo","priority":4,"assigneeId":null,"labelIds":["feature"],"createdAt":"2026-06-04T10:00:00.000Z","updatedAt":"2026-06-12T23:48:40.052Z"}
</responseBody>

Root cause → actual behavior

1

The user selects 'Todo' for the newly-created ENG-149 (created via POST /api/issues which returned 201 with id i1781307989927), which issues PATCH /api/issues/i1781307989927 with body {"status":"todo"} to persist the triage.

2 evidence probes (InspectElement, NetworkRequest)
InspectElement {"point":"Point:8","element":"[role=\"option\"]","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b"}
→ Element:1 is `<div role="option" aria-labelledby="radix-_r_16_" aria-selected="false" data-state="checked" tabindex="-1" data-slot="select-item" class="relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&amp;_svg]:pointer-events-none [&amp;_svg]:shrink-0 [&amp;_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2" data-radix-collection-item=""></div>`.
Element:1 is rendered by React component DetailBody at Point:15:
Relevant code: https://deploy-preview-8--blamy-broken-linear-linear.netlify.app/src/components/issue-detail.tsx line 71 column 8
No elements are obstructing the center point of this element.

Element:1 has 155px width and 28px height.
Margin: top 0px right 0px bottom 0px left 0px.
Padding: top 4px right 32px bottom 4px left 6px.

Distances to its parent element:
- Top is aligned with parent boundary
- Right is aligned with parent boundary
- Bottom overflows parent by 140.00px
- Left is aligned with parent boundary

### Parent Element:6

Element:6 is `<div data-radix-select-viewport="" role="presentation" data-position="item-aligned" class="data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)"…
NetworkRequest {"mode":"detail","urlFilter":"/api/issues","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b","requestIndex":2}
→ A POST network request with ID 1819.46 was made to https://deploy-preview-8--blamy-broken-linear-linear.netlify.app/api/issues:
<request_summary>
The response had status 201 ().
</request_summary>
Initiated at Point:3 @ 104543.00ms
Events:
  request @ 104543ms
  request-body @ 104543ms
  response @ 104765ms
  response-body @ 104766ms
  request-done @ 104766ms
Request headers:
<requestHeaders>
sec-ch-ua: 
content-type: application/json
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/108.0.5359.0 Safari/537.36
sec-ch-ua-platform: 
</requestHeaders>
Response headers:
<responseHeaders>
x-nf-request-id: 01KTZ3NQT4CV09JMB9P26W4JB9
date: Fri, 12 Jun 2026 23:46:29 GMT
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
netlify-vary: query
server: Netlify
age: 0
cache-status: "Netlify Durable"; fwd=bypass, "Netlify Edge"; fwd=miss
content-type: application/json
cache-control: no-cache
</responseHeaders>

The request body was
:
<requestBody>
{"title":"QA triage test issue","description":null,"priority":0,"teamId":"eng","projectId":null,"labelIds":[]}
</requestBody>

The response body was
:
<responseBody>
{"id":"i1781307989927","identifier":"ENG-149","title":"QA triage test issue","description":null,"teamId":"eng","projectId":null,"status":"backlog","priority":0,"assigneeId":null,"labelIds":[],"createdAt":"2026-06-12T23:46:29.927Z","updatedAt":"2026-06-12T23:46:29.9…
2

The server returns 404 {"error":"not found"}, so the client mutation fails and the optimistic status reverts to 'Backlog'; the issue is never triaged. It is not a deletion — ENG-149 still renders in the Inbox immediately after the 404 — and a PATCH on the pre-existing issue i4 succeeds with 200 in the same session, confirming the endpoint works and the failure is specific to the newly-created issue.

3 evidence probes (NetworkRequest, Evaluate)
NetworkRequest {"mode":"detail","urlFilter":"i1781307989927","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b","requestIndex":0}
→ A PATCH network request with ID 1819.72 was made to https://deploy-preview-8--blamy-broken-linear-linear.netlify.app/api/issues/i1781307989927:
<request_summary>
The response had status 404 ().
</request_summary>
Initiated at Point:2 @ 172479.00ms
Events:
  request @ 172479ms
  request-body @ 172479ms
  response @ 172582ms
  response-body @ 172582ms
  request-done @ 172632ms
Request headers:
<requestHeaders>
sec-ch-ua: 
content-type: application/json
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/108.0.5359.0 Safari/537.36
sec-ch-ua-platform: 
</requestHeaders>
Response headers:
<responseHeaders>
x-nf-request-id: 01KTZ3QT33JMP004CQFNAFR71E
date: Fri, 12 Jun 2026 23:47:37 GMT
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
netlify-vary: query
server: Netlify
age: 0
cache-status: "Netlify Durable"; fwd=bypass, "Netlify Edge"; fwd=method
content-type: application/json
cache-control: no-cache
</responseHeaders>

The request body was
:
<requestBody>
{"status":"todo"}
</requestBody>

The response body was
:
<responseBody>
{"error":"not found"}
</responseBody>
Evaluate {"point":"Point:13","expression":"(() => { const rows = Array.from(document.querySelectorAll('main button')).map(b=>b.textContent).filter(t=>/ENG-|DES-|OPS-/.test(t)); return JSON.stringify(rows); })()","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b"}
→ "[\"ENG-149QA triage test issueBacklog\",\"ENG-148QA exploration test issueBacklog\",\"ENG-145Ship push notification opt-inBacklog\"]"
NetworkRequest {"mode":"detail","urlFilter":"i4","recordingId":"da16766b-cf7c-46a3-b977-21e1df270a9b","requestIndex":0}
→ A PATCH network request with ID 1819.106 was made to https://deploy-preview-8--blamy-broken-linear-linear.netlify.app/api/issues/i4:
<request_summary>
The response had status 200 ().
</request_summary>
Initiated at Point:19 @ 234792.00ms
Events:
  request @ 234792ms
  request-body @ 234792ms
  response @ 234889ms
  response-body @ 234889ms
  request-done @ 234890ms
Request headers:
<requestHeaders>
sec-ch-ua: 
content-type: application/json
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/108.0.5359.0 Safari/537.36
sec-ch-ua-platform: 
</requestHeaders>
Response headers:
<responseHeaders>
x-nf-request-id: 01KTZ3SPYBZ6RWKNEBVZAXB4E4
date: Fri, 12 Jun 2026 23:48:40 GMT
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
netlify-vary: query
server: Netlify
age: 0
cache-status: "Netlify Durable"; fwd=bypass, "Netlify Edge"; fwd=method
content-type: application/json
cache-control: no-cache
</responseHeaders>

The request body was
:
<requestBody>
{"status":"todo"}
</requestBody>

The response body was
:
<responseBody>
{"id":"i4","identifier":"ENG-145","title":"Ship push notification opt-in","description":null,"teamId":"eng","projectId":"mobile","status":"todo","priority":4,"assigneeId":null,"labelIds":["feature"],"createdAt":"2026-06-04T10:00:00.000Z","updatedAt":"2026-06-12T23:48:40.052Z"}
</responseBody>

Is your app hiding bugs like this?

Replay QA explores every build, records what it finds, and writes the root cause.