{"record":{"id":"fec5ff47e6bbe9a0","repo":"TencentCloud/TencentDB-Agent-Memory","slug":"member-not-found","errorCode":"member_not_found","errorMessage":"member not found: ${teamId}/${userId}","messagePattern":"member not found: (.+?)/(.+?)","errorType":"error_code","errorClass":"MetadataError","httpStatus":null,"severity":"error","filePath":"MemoryCore/src/metadata/service/metadata-service.ts","lineNumber":1058,"sourceCode":"    teamId: string,\n    taskId: string,\n    agentId: string,\n    userId: string,\n  ): Promise<void> {\n    await this.assertTeamExists(teamId);\n    const task = await this.getTaskById(taskId);\n    if (!task) throw new MetadataError(\"task_not_found\", `task not found: ${taskId}`);\n    if (task.team_id !== teamId) {\n      throw new MetadataError(\"permission_denied\", `task ${taskId} not in team ${teamId}`);\n    }\n    const agent = await this.getAgentById(agentId);\n    if (!agent) throw new MetadataError(\"agent_not_found\", `agent not found: ${agentId}`);\n    // if (agent.team_id !== teamId) {\n    //   throw new MetadataError(\"agent_team_mismatch\", `agent ${agentId} not in team ${teamId}`);\n    // }\n    const member = await this.getTeamMember(teamId, userId);\n    if (!member || member.status !== \"active\") {\n      throw new MetadataError(\"member_not_found\", `member not found: ${teamId}/${userId}`);\n    }\n    // const links = await this.store.listTaskAgents(taskId, { limit: 1000, offset: 0 });\n    // if (!links.items.some((l) => l.agent_id === agentId)) {\n    //   throw new MetadataError(\"task_agent_not_linked\", `task ${taskId} not linked to agent ${agentId}`);\n    // }\n  }\n\n  // ============================================================\n  // Asset（仅主表）\n  // ============================================================\n  async createAsset(input: CreateAssetInput): Promise<AssetEntity> {\n    await this.assertTeamExists(input.team_id);\n    return this.store.createAsset(input);\n  }\n\n  async getAssetById(assetId: string): Promise<AssetEntity | null> {\n    return this.store.getAssetById(assetId);\n  }","sourceCodeStart":1040,"sourceCodeEnd":1076,"githubUrl":"https://github.com/TencentCloud/TencentDB-Agent-Memory/blob/3efcd317b84146d6a08518ac0f7ee7c8a8d200ec/MemoryCore/src/metadata/service/metadata-service.ts#L1040-L1076","documentation":"The final gate of the team assignment flow throws MetadataError 'member_not_found' with message 'member not found: <teamId>/<userId>' when getTeamMember(teamId, userId) returns null OR the member's status is not \"active\". So this error covers both a non-member and an inactive (e.g., suspended/pending/removed) user. All prior entity checks (team, task, agent) already passed.","triggerScenarios":"Calling the assignment method with a userId that never joined teamId, was removed from the team, or whose membership status is anything other than \"active\" (invited, suspended, disabled).","commonSituations":"Offboarded users whose accounts were deactivated but whose scheduled automation still acts under their identity; users invited but never accepting (pending status); passing a global user ID where a team-scoped membership ID is expected.","solutions":["Add the user to the team (or re-activate their membership) so getTeamMember returns an active member.","Check member.status — if it is pending/suspended, resolve the invitation or suspension first.","Run the operation under a userId that is an active member of teamId (e.g., a service account).","Pre-check with getTeamMember(teamId, userId) and surface a clear 'not an active member' message instead of relying on this error."],"exampleFix":"// before\nawait svc.assignTaskToAgent(teamId, taskId, agentId, userId); // member_not_found\n\n// after\nconst member = await svc.getTeamMember(teamId, userId);\nif (!member || member.status !== \"active\") {\n  await svc.addTeamMember(teamId, userId); // or reactivate/choose an active user\n}\nawait svc.assignTaskToAgent(teamId, taskId, agentId, userId);","handlingStrategy":"validation","validationCode":"const member = await metadataService.getTeamMember(teamId, userId);\nif (!member) throw new Error(`${userId} is not a member of ${teamId}`);\nif (member.status !== \"active\") throw new Error(`${userId} membership status is ${member.status}`);","typeGuard":"function isActiveMember(m: TeamMemberEntity | null): m is TeamMemberEntity & { status: \"active\" } {\n  return m !== null && m.status === \"active\";\n}","tryCatchPattern":"try {\n  await metadataService.assignTaskToAgent(teamId, taskId, agentId, userId);\n} catch (e) {\n  if (e instanceof MetadataError && e.code === \"member_not_found\") {\n    return res.status(403).json({ error: \"member_not_found\", teamId, userId });\n  }\n  throw e;\n}","preventionTips":["Verify membership and status === \"active\" before any team-scoped operation.","Deactivate offboarded users' automation credentials together with their membership.","Handle pending invitations: require accepted/active membership before assignments.","Run scheduled jobs under a dedicated service account that is always an active member."],"tags":["metadata","membership","team","authorization"],"backgroundTag":"member-not-active","analyzedSha":"3efcd317b84146d6a08518ac0f7ee7c8a8d200ec","analyzedAt":"2026-09-01T05:44:22.276Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}