{"record":{"id":"5cd2dfdf4c7f42cd","repo":"ruvnet/ruflo","slug":"no-active-claim-found-for-issue-input-issueid-b","errorCode":null,"errorMessage":"No active claim found for issue ${input.issueId} by ${input.claimantId}","messagePattern":"No active claim found for issue (.+?) by (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/claims/src/api/mcp-tools.ts","lineNumber":676,"sourceCode":"  // Simple implementation\n  for (const claim of claimStore.values()) {\n    if (claim.issueId === input.issueId && claim.claimantId === input.claimantId) {\n      claim.status = input.status;\n      claim.lastActivityAt = new Date().toISOString();\n      if (input.progress !== undefined) {\n        claim.metadata = { ...claim.metadata, progress: input.progress };\n      }\n      return {\n        issueId: input.issueId,\n        status: input.status,\n        progress: input.progress,\n        updatedAt: claim.lastActivityAt,\n        notes: input.notes,\n      };\n    }\n  }\n\n  throw new Error(`No active claim found for issue ${input.issueId} by ${input.claimantId}`);\n}\n\n/**\n * List unclaimed issues\n */\nasync function handleIssueListAvailable(\n  input: z.infer<typeof issueListAvailableSchema>,\n  context?: ToolContext\n): Promise<{\n  issues: Issue[];\n  total: number;\n  limit: number;\n  offset: number;\n}> {\n  initializeMockData();\n\n  if (context?.claimsService) {\n    const result = await context.claimsService.listAvailableIssues(input);","sourceCodeStart":658,"sourceCodeEnd":694,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/claims/src/api/mcp-tools.ts#L658-L694","documentation":"Thrown by the issue status-update handler in @claude-flow/claims when no claim in claimStore matches both input.issueId and input.claimantId with an active status. The handler iterates claims looking for the caller's active claim before applying status/progress/notes updates, and throws after the loop finds nothing.","triggerScenarios":"Calling the status-update tool before ever claiming the issue; calling it after the claim was released or expired; using a claimantId that differs from the one on the existing claim (including claimantType mismatch in the lookup); store restart losing the claim records.","commonSituations":"Worker restarts that resume progress reporting without re-claiming; agents whose claims were stolen mid-task still posting updates; inconsistent claimant id formatting between claim and update calls.","solutions":["(Re-)claim the issue with the same claimantId before sending status updates","Verify an active claim exists for (issueId, claimantId) before each update batch","If the claim was stolen or released, stop updating and restart the task lifecycle from claim","Use identical claimantId/claimantType values across claim and update calls (store them from the claim response)"],"exampleFix":"// before\nawait statusTool({ issueId, claimantId: 'agent-1', status: 'in_progress' }); // never claimed\n\n// after\nawait claimTool({ issueId, claimantId: 'agent-1', claimantType: 'agent' });\nawait statusTool({ issueId, claimantId: 'agent-1', status: 'in_progress' });","handlingStrategy":"validation","validationCode":"const claim = await getClaimTool({ issueId });\nif (!claim || claim.claimantId !== claimantId || claim.status !== 'active') {\n  await claimTool({ issueId, claimantId, claimantType });\n}\nawait statusTool({ issueId, claimantId, status, progress });","typeGuard":null,"tryCatchPattern":"try { await statusTool(input); } catch (e) { if (e instanceof Error && e.message.startsWith('No active claim found')) { await claimTool({ issueId: input.issueId, claimantId: input.claimantId, claimantType }); return statusTool(input); } throw e; }","preventionTips":["Send status updates only between claim and release in the task lifecycle","Reuse the claimantId/claimantType from the claim response verbatim","Re-claim after worker restarts before resuming updates"],"tags":["claims","mcp-tools","claim-lifecycle","status-update"],"backgroundTag":"entity-not-found","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}