{
  "attachments": [
    {
      "archivedAt": null,
      "bodyData": null,
      "createdAt": "2026-03-20T17:00:00.000Z",
      "creatorId": 4,
      "groupBySource": true,
      "iconUrl": "https://github.githubassets.com/favicons/favicon.svg",
      "id": 1,
      "issueId": 6,
      "linearId": "8f177414-7afd-4c82-b8f6-8e1f51b03c74",
      "metadata": {
        "baseRefName": "main",
        "headRefName": "be-445-migration-rollback",
        "headSha": "c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2",
        "mergeable": true,
        "merged": false,
        "number": 206,
        "provider": "github",
        "repository": "frostbyte/api",
        "reviewDecision": "changes_requested",
        "state": "open"
      },
      "sourceType": "github",
      "subtitle": "Open pull request · changes requested",
      "title": "frostbyte/api#206 · Add migration rollback tooling",
      "updatedAt": "2026-03-21T11:00:00.000Z",
      "url": "https://github.com/frostbyte/api/pull/206"
    }
  ],
  "comments": [
    {
      "body": "PR is up: frostbyte/api#206. Just finished the dry-run mode. Jordan can you review?",
      "createdAt": "2026-03-20T17:00:00Z",
      "editedAt": null,
      "id": 1,
      "issueId": 6,
      "linearId": "3fb71da2-4fd5-401b-8b84-3be3c9a25e1f",
      "parentId": null,
      "resolvedAt": null,
      "resolvedByUserId": null,
      "updatedAt": "2026-03-20T17:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-445#comment-1",
      "userId": 4
    },
    {
      "body": "Looks good but I left a few comments on the error handling. Fix those and we can merge.",
      "createdAt": "2026-03-21T09:00:00Z",
      "editedAt": null,
      "id": 2,
      "issueId": 6,
      "linearId": "06b8dbca-0c82-45d9-8d6f-212d012107f9",
      "parentId": null,
      "resolvedAt": null,
      "resolvedByUserId": null,
      "updatedAt": "2026-03-21T09:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-445#comment-2",
      "userId": 1
    },
    {
      "body": "Implementation is complete and the issue is marked Done for cycle reporting, but pull request #206 is still open with required changes. Keep the release blocked.",
      "createdAt": "2026-03-21T11:00:00Z",
      "editedAt": null,
      "id": 3,
      "issueId": 6,
      "linearId": "ff946fe0-09ad-4ae2-818c-2eb07b366b00",
      "parentId": null,
      "resolvedAt": null,
      "resolvedByUserId": null,
      "updatedAt": "2026-03-21T11:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-445#comment-3",
      "userId": 4
    }
  ],
  "customViews": [],
  "cycles": [
    {
      "completedAt": null,
      "completedScopeCount": 9,
      "createdAt": "2026-03-08T10:00:00Z",
      "description": "March sprint -- API hardening and migration tooling",
      "endsAt": "2026-03-22T23:59:59Z",
      "id": 1,
      "linearId": "4d5027f5-9f87-4c3b-83fb-ce657e7fabe6",
      "name": "Sprint 6",
      "number": 6,
      "progress": 100,
      "scopeCount": 9,
      "startsAt": "2026-03-09T00:00:00Z",
      "teamId": 1,
      "updatedAt": "2026-03-21T17:00:00Z"
    }
  ],
  "documents": [],
  "favorites": [],
  "initiativeProjects": [],
  "initiatives": [],
  "issueRelations": [],
  "issues": [
    {
      "archivedAt": null,
      "assigneeId": 2,
      "boardOrder": 1000,
      "branchName": "be-440-rate-limiting",
      "canceledAt": null,
      "completedAt": "2026-03-14T17:00:00Z",
      "createdAt": "2026-03-09T10:00:00Z",
      "creatorId": 1,
      "cycleId": 1,
      "description": "Implement token bucket rate limiter on all public API routes. PR: frostbyte/api#201",
      "descriptionData": null,
      "dueDate": null,
      "estimate": 5,
      "id": 1,
      "identifier": "BE-440",
      "labelIds": [
        2
      ],
      "linearId": "cf49e755-1a9c-4564-8416-14115ec0108c",
      "number": 440,
      "parentId": null,
      "previousIdentifiers": [],
      "priority": 2,
      "priorityLabel": "High",
      "projectId": null,
      "snoozedUntilAt": null,
      "sortOrder": 1000,
      "startedAt": "2026-03-10T09:00:00Z",
      "stateId": 5,
      "subIssueSortOrder": null,
      "teamId": 1,
      "title": "Add rate limiting middleware",
      "trashed": false,
      "updatedAt": "2026-03-14T17:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-440"
    },
    {
      "archivedAt": null,
      "assigneeId": 3,
      "boardOrder": 2000,
      "branchName": "be-441-pool-exhaustion",
      "canceledAt": null,
      "completedAt": "2026-03-13T16:00:00Z",
      "createdAt": "2026-03-09T11:00:00Z",
      "creatorId": 1,
      "cycleId": 1,
      "description": "Pool runs out of connections during traffic spikes. Need to add retry logic and increase max pool size. PR: frostbyte/api#202",
      "descriptionData": null,
      "dueDate": null,
      "estimate": 3,
      "id": 2,
      "identifier": "BE-441",
      "labelIds": [
        1
      ],
      "linearId": "f8fdac6e-60bf-4240-899e-1ac89ef02cd8",
      "number": 441,
      "parentId": null,
      "previousIdentifiers": [],
      "priority": 1,
      "priorityLabel": "Urgent",
      "projectId": null,
      "snoozedUntilAt": null,
      "sortOrder": 2000,
      "startedAt": "2026-03-10T10:00:00Z",
      "stateId": 5,
      "subIssueSortOrder": null,
      "teamId": 1,
      "title": "Fix connection pool exhaustion under load",
      "trashed": false,
      "updatedAt": "2026-03-13T16:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-441"
    },
    {
      "archivedAt": null,
      "assigneeId": 4,
      "boardOrder": 3000,
      "branchName": "be-442-dynamo-sessions",
      "canceledAt": null,
      "completedAt": "2026-03-18T15:00:00Z",
      "createdAt": "2026-03-09T14:00:00Z",
      "creatorId": 1,
      "cycleId": 1,
      "description": "Redis sessions don't survive restarts. Move to DynamoDB for persistence. PR: frostbyte/api#203",
      "descriptionData": null,
      "dueDate": null,
      "estimate": 8,
      "id": 3,
      "identifier": "BE-442",
      "labelIds": [
        2
      ],
      "linearId": "7d9c8480-5068-45e2-8bb5-d88708992245",
      "number": 442,
      "parentId": null,
      "previousIdentifiers": [],
      "priority": 2,
      "priorityLabel": "High",
      "projectId": null,
      "snoozedUntilAt": null,
      "sortOrder": 3000,
      "startedAt": "2026-03-10T09:00:00Z",
      "stateId": 5,
      "subIssueSortOrder": null,
      "teamId": 1,
      "title": "Migrate session store from Redis to DynamoDB",
      "trashed": false,
      "updatedAt": "2026-03-18T15:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-442"
    },
    {
      "archivedAt": null,
      "assigneeId": 2,
      "boardOrder": 4000,
      "branchName": "be-443-structured-logging",
      "canceledAt": null,
      "completedAt": "2026-03-17T14:00:00Z",
      "createdAt": "2026-03-14T10:00:00Z",
      "creatorId": 3,
      "cycleId": 1,
      "description": "Replace console.log with pino + correlation ID propagation. PR: frostbyte/api#204",
      "descriptionData": null,
      "dueDate": null,
      "estimate": 3,
      "id": 4,
      "identifier": "BE-443",
      "labelIds": [
        3
      ],
      "linearId": "48197d51-a6e3-4e75-8fa8-99de49647bcc",
      "number": 443,
      "parentId": null,
      "previousIdentifiers": [],
      "priority": 3,
      "priorityLabel": "Medium",
      "projectId": null,
      "snoozedUntilAt": null,
      "sortOrder": 4000,
      "startedAt": "2026-03-15T09:00:00Z",
      "stateId": 5,
      "subIssueSortOrder": null,
      "teamId": 1,
      "title": "Add structured logging with correlation IDs",
      "trashed": false,
      "updatedAt": "2026-03-17T14:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-443"
    },
    {
      "archivedAt": null,
      "assigneeId": 3,
      "boardOrder": 5000,
      "branchName": "be-444-webhook-retry",
      "canceledAt": null,
      "completedAt": "2026-03-19T16:00:00Z",
      "createdAt": "2026-03-13T11:00:00Z",
      "creatorId": 1,
      "cycleId": 1,
      "description": "Webhooks fail silently when the target is down. Add retry queue with exponential backoff. PR: frostbyte/api#205",
      "descriptionData": null,
      "dueDate": null,
      "estimate": 5,
      "id": 5,
      "identifier": "BE-444",
      "labelIds": [
        2
      ],
      "linearId": "5b43ef22-94ea-4dc8-8f0b-8ed227fd4a3f",
      "number": 444,
      "parentId": null,
      "previousIdentifiers": [],
      "priority": 2,
      "priorityLabel": "High",
      "projectId": null,
      "snoozedUntilAt": null,
      "sortOrder": 5000,
      "startedAt": "2026-03-14T09:00:00Z",
      "stateId": 5,
      "subIssueSortOrder": null,
      "teamId": 1,
      "title": "Implement webhook retry with exponential backoff",
      "trashed": false,
      "updatedAt": "2026-03-19T16:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-444"
    },
    {
      "archivedAt": null,
      "assigneeId": 4,
      "boardOrder": 6000,
      "branchName": "be-445-migration-rollback",
      "canceledAt": null,
      "completedAt": "2026-03-21T11:00:00Z",
      "createdAt": "2026-03-14T14:00:00Z",
      "creatorId": 1,
      "cycleId": 1,
      "description": "The implementation is complete, but frostbyte/api#206 remains open with requested changes. Do not close the release gate until the pull request is merged.",
      "descriptionData": null,
      "dueDate": "2026-03-21",
      "estimate": 8,
      "id": 6,
      "identifier": "BE-445",
      "labelIds": [
        2,
        4
      ],
      "linearId": "74b34e61-ec7c-4394-8b4a-0407c390421f",
      "number": 445,
      "parentId": null,
      "previousIdentifiers": [],
      "priority": 1,
      "priorityLabel": "Urgent",
      "projectId": null,
      "snoozedUntilAt": null,
      "sortOrder": 6000,
      "startedAt": "2026-03-15T09:00:00Z",
      "stateId": 5,
      "subIssueSortOrder": null,
      "teamId": 1,
      "title": "Add database migration rollback tooling",
      "trashed": false,
      "updatedAt": "2026-03-21T11:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-445"
    },
    {
      "archivedAt": null,
      "assigneeId": 2,
      "boardOrder": 7000,
      "branchName": "be-446-ts-upgrade",
      "canceledAt": null,
      "completedAt": "2026-03-19T17:00:00Z",
      "createdAt": "2026-03-18T10:00:00Z",
      "creatorId": 2,
      "cycleId": 1,
      "description": "TS 5.5 has better inference for generics we use heavily. PR: frostbyte/api#207",
      "descriptionData": null,
      "dueDate": null,
      "estimate": 2,
      "id": 7,
      "identifier": "BE-446",
      "labelIds": [
        3
      ],
      "linearId": "0da46a54-4253-4fdc-8733-4c4ab3875820",
      "number": 446,
      "parentId": null,
      "previousIdentifiers": [],
      "priority": 4,
      "priorityLabel": "Low",
      "projectId": null,
      "snoozedUntilAt": null,
      "sortOrder": 7000,
      "startedAt": "2026-03-19T09:00:00Z",
      "stateId": 5,
      "subIssueSortOrder": null,
      "teamId": 1,
      "title": "Upgrade TypeScript to 5.5",
      "trashed": false,
      "updatedAt": "2026-03-19T17:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-446"
    },
    {
      "archivedAt": null,
      "assigneeId": 3,
      "boardOrder": 8000,
      "branchName": "be-447-cron-tz",
      "canceledAt": null,
      "completedAt": "2026-03-21T16:00:00Z",
      "createdAt": "2026-03-19T14:00:00Z",
      "creatorId": 4,
      "cycleId": 1,
      "description": "Scheduled jobs fire at wrong times for non-UTC tenants. Need to normalize all cron expressions to tenant timezone. PR: frostbyte/api#208",
      "descriptionData": null,
      "dueDate": null,
      "estimate": 3,
      "id": 8,
      "identifier": "BE-447",
      "labelIds": [
        1
      ],
      "linearId": "00a8a517-7fb7-4db2-8552-593c5afb4304",
      "number": 447,
      "parentId": null,
      "previousIdentifiers": [],
      "priority": 2,
      "priorityLabel": "High",
      "projectId": null,
      "snoozedUntilAt": null,
      "sortOrder": 8000,
      "startedAt": "2026-03-20T09:00:00Z",
      "stateId": 5,
      "subIssueSortOrder": null,
      "teamId": 1,
      "title": "Fix timezone handling in cron scheduler",
      "trashed": false,
      "updatedAt": "2026-03-21T16:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-447"
    },
    {
      "archivedAt": null,
      "assigneeId": 4,
      "boardOrder": 9000,
      "branchName": "be-448-health-check",
      "canceledAt": null,
      "completedAt": "2026-03-21T12:00:00Z",
      "createdAt": "2026-03-19T15:00:00Z",
      "creatorId": 3,
      "cycleId": 1,
      "description": "Need /health endpoint that reports DB, Redis, and S3 connectivity. PR: frostbyte/api#209",
      "descriptionData": null,
      "dueDate": null,
      "estimate": 2,
      "id": 9,
      "identifier": "BE-448",
      "labelIds": [
        2
      ],
      "linearId": "43b48768-f1d5-4d4e-8d05-ffafd0e1632b",
      "number": 448,
      "parentId": null,
      "previousIdentifiers": [],
      "priority": 3,
      "priorityLabel": "Medium",
      "projectId": null,
      "snoozedUntilAt": null,
      "sortOrder": 9000,
      "startedAt": "2026-03-20T10:00:00Z",
      "stateId": 5,
      "subIssueSortOrder": null,
      "teamId": 1,
      "title": "Add health check endpoint with dependency status",
      "trashed": false,
      "updatedAt": "2026-03-21T12:00:00Z",
      "url": "https://linear.app/frostbyte/issue/BE-448"
    }
  ],
  "issueTemplates": [],
  "labels": [
    {
      "color": "#eb5757",
      "createdAt": "2024-06-01T10:00:00Z",
      "description": "Something isn't working",
      "id": 1,
      "isGroup": false,
      "linearId": "f7419c65-2953-47ce-8065-192a933e11c5",
      "name": "Bug",
      "parentId": null,
      "teamId": 1,
      "updatedAt": "2024-06-01T10:00:00Z"
    },
    {
      "color": "#4ea7fc",
      "createdAt": "2024-06-01T10:00:00Z",
      "description": "New functionality",
      "id": 2,
      "isGroup": false,
      "linearId": "22b21076-4b32-4436-88df-395ff0a06640",
      "name": "Feature",
      "parentId": null,
      "teamId": 1,
      "updatedAt": "2024-06-01T10:00:00Z"
    },
    {
      "color": "#f2994a",
      "createdAt": "2024-06-01T10:00:00Z",
      "description": "Technical debt",
      "id": 3,
      "isGroup": false,
      "linearId": "b3cdffc8-493d-400f-89ac-bd6f38a363ce",
      "name": "Tech Debt",
      "parentId": null,
      "teamId": 1,
      "updatedAt": "2024-06-01T10:00:00Z"
    },
    {
      "color": "#eb5757",
      "createdAt": "2024-06-01T10:00:00Z",
      "description": "Blocks other work",
      "id": 4,
      "isGroup": false,
      "linearId": "7eab2c28-37af-4eb4-8d21-303685c62f76",
      "name": "Blocking",
      "parentId": null,
      "teamId": 1,
      "updatedAt": "2024-06-01T10:00:00Z"
    }
  ],
  "notifications": [],
  "organization": [],
  "projects": [
    {
      "archivedAt": null,
      "canceledAt": null,
      "color": "#5e6ad2",
      "completedAt": null,
      "content": null,
      "createdAt": "2026-02-20T10:00:00Z",
      "description": "Rebuild the API layer with proper observability, resilience, and tooling",
      "icon": null,
      "id": 1,
      "leadId": 1,
      "linearId": "b285f137-ff85-4226-8368-24b2404e1705",
      "memberIds": [
        1,
        2,
        3,
        4
      ],
      "name": "API Platform v2",
      "progress": 80,
      "slugId": "api-platform-v2",
      "sortOrder": 1000,
      "startDate": "2026-03-01",
      "startedAt": "2026-03-01T00:00:00Z",
      "state": "started",
      "targetDate": "2026-04-15",
      "teamIds": [
        1
      ],
      "updatedAt": "2026-03-21T12:00:00Z",
      "url": "https://linear.app/frostbyte/project/api-platform-v2"
    }
  ],
  "roadmaps": [],
  "teams": [
    {
      "color": "#5e6ad2",
      "createdAt": "2024-06-01T10:00:00Z",
      "cycleCooldownTime": 0,
      "cycleDuration": 2,
      "cyclesEnabled": true,
      "cycleStartDay": 1,
      "defaultIssueEstimate": 0,
      "description": "Backend engineering team",
      "icon": null,
      "id": 1,
      "issueEstimationType": "fibonacci",
      "issueOrderingNoanswer": false,
      "key": "BE",
      "linearId": "b3b86557-4e58-43c6-89e2-caaa2351432f",
      "name": "Backend",
      "private": false,
      "timezone": "America/New_York",
      "triageEnabled": true,
      "updatedAt": "2024-06-01T10:00:00Z"
    }
  ],
  "users": [
    {
      "active": true,
      "admin": true,
      "avatarUrl": "https://avatars.example.com/jordan.png",
      "createdAt": "2024-06-01T09:00:00Z",
      "displayName": "Jordan",
      "email": "sample-user-1@example.test",
      "guest": false,
      "id": 1,
      "linearId": "a6db0e4d-99b4-490f-8359-559161637e6f",
      "name": "Jordan Rivera",
      "updatedAt": "2026-03-01T10:00:00Z"
    },
    {
      "active": true,
      "admin": false,
      "avatarUrl": "https://avatars.example.com/sam.png",
      "createdAt": "2024-06-15T09:00:00Z",
      "displayName": "Sam",
      "email": "sample-user-2@example.test",
      "guest": false,
      "id": 2,
      "linearId": "1a2c58a4-256f-4172-8854-86d16a16e4bc",
      "name": "Sam Okafor",
      "updatedAt": "2026-03-01T10:00:00Z"
    },
    {
      "active": true,
      "admin": false,
      "avatarUrl": "https://avatars.example.com/priya.png",
      "createdAt": "2024-07-01T09:00:00Z",
      "displayName": "Priya",
      "email": "sample-user-3@example.test",
      "guest": false,
      "id": 3,
      "linearId": "4f6c9510-bb2b-4417-83fa-eace37f2e26a",
      "name": "Priya Sharma",
      "updatedAt": "2026-03-01T10:00:00Z"
    },
    {
      "active": true,
      "admin": false,
      "avatarUrl": "https://avatars.example.com/luis.png",
      "createdAt": "2024-08-01T09:00:00Z",
      "displayName": "Luis",
      "email": "sample-user-4@example.test",
      "guest": false,
      "id": 4,
      "linearId": "48f9472c-5129-4d7b-8dca-3f276294c281",
      "name": "Luis Morales",
      "updatedAt": "2026-03-01T10:00:00Z"
    }
  ],
  "workflowStates": [
    {
      "color": "#bec2c8",
      "createdAt": "2024-06-01T10:00:00Z",
      "description": "Unstarted backlog issues",
      "id": 1,
      "linearId": "7f0f30c5-dd11-499f-8c31-88295c152d45",
      "name": "Backlog",
      "position": 0,
      "teamId": 1,
      "type": "backlog",
      "updatedAt": "2024-06-01T10:00:00Z"
    },
    {
      "color": "#e2e2e2",
      "createdAt": "2024-06-01T10:00:00Z",
      "description": "Ready to work on",
      "id": 2,
      "linearId": "721d803c-e2c8-4e24-850c-2a84758e84b6",
      "name": "Todo",
      "position": 1,
      "teamId": 1,
      "type": "unstarted",
      "updatedAt": "2024-06-01T10:00:00Z"
    },
    {
      "color": "#f2c94c",
      "createdAt": "2024-06-01T10:00:00Z",
      "description": "Actively being worked on",
      "id": 3,
      "linearId": "28d762cd-a9df-4de1-8034-50115afab447",
      "name": "In Progress",
      "position": 2,
      "teamId": 1,
      "type": "started",
      "updatedAt": "2024-06-01T10:00:00Z"
    },
    {
      "color": "#4ea7fc",
      "createdAt": "2024-06-01T10:00:00Z",
      "description": "In code review",
      "id": 4,
      "linearId": "17d5b5be-56d7-4abb-8bea-662192fdc424",
      "name": "In Review",
      "position": 3,
      "teamId": 1,
      "type": "started",
      "updatedAt": "2024-06-01T10:00:00Z"
    },
    {
      "color": "#5e6ad2",
      "createdAt": "2024-06-01T10:00:00Z",
      "description": "Completed",
      "id": 5,
      "linearId": "6a8d35e2-6907-4bc5-8db5-9d714935dc5f",
      "name": "Done",
      "position": 4,
      "teamId": 1,
      "type": "completed",
      "updatedAt": "2024-06-01T10:00:00Z"
    },
    {
      "color": "#95a2b3",
      "createdAt": "2024-06-01T10:00:00Z",
      "description": "Cancelled",
      "id": 6,
      "linearId": "a94df025-6aab-4679-8dee-b53eaa629813",
      "name": "Cancelled",
      "position": 5,
      "teamId": 1,
      "type": "cancelled",
      "updatedAt": "2024-06-01T10:00:00Z"
    }
  ]
}
