{"record":{"id":"e3845c58b0c849bc","repo":"twentyhq/twenty","slug":"workspacemember-object-not-found-in-workspace-meta","errorCode":null,"errorMessage":"workspaceMember object not found in workspace metadata.","messagePattern":"workspaceMember object not found in workspace metadata\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/twenty-apps/internal/twenty-partners/src/scripts/configure-partner-rls.ts","lineNumber":318,"sourceCode":"    apiKey,\n    `{ objects(paging:{first:100}) { edges { node { id nameSingular } } } }`,\n  );\n\n  const objectIdByName = new Map<string, string>(\n    objectsData.objects.edges.map((e) => [e.node.nameSingular, e.node.id]),\n  );\n\n  for (const name of ALL_TARGET_OBJECTS) {\n    if (!objectIdByName.has(name)) {\n      throw new Error(\n        `Object \"${name}\" not found in workspace metadata. ` +\n          `Has the app been installed and synced?`,\n      );\n    }\n  }\n\n  if (!objectIdByName.has('workspaceMember')) {\n    throw new Error('workspaceMember object not found in workspace metadata.');\n  }\n\n  const workspaceMemberId = objectIdByName.get('workspaceMember') as string;\n\n  const objectInfoByName = new Map<SimpleTargetObject, ObjectInfo>();\n\n  for (const name of SIMPLE_TARGET_OBJECTS) {\n    const objectId = objectIdByName.get(name) as string;\n    const partnerUserFieldMetadataId = await findFieldByName(\n      metadataUrl,\n      apiKey,\n      objectId,\n      name,\n      'partnerUser',\n    );\n    objectInfoByName.set(name, {\n      objectMetadataId: objectId,\n      partnerUserFieldMetadataId,","sourceCodeStart":300,"sourceCodeEnd":336,"githubUrl":"https://github.com/twentyhq/twenty/blob/1f5dd2bbd2a8da3419c8cfd52dd545c0024df1a6/packages/twenty-apps/internal/twenty-partners/src/scripts/configure-partner-rls.ts#L300-L336","documentation":"configure-partner-rls separately asserts that the workspaceMember object exists in metadata (beyond the app objects) because the RLS self-scope predicate references workspaceMember.id. It throws before resolving the workspaceMember id field. Same root cause as the app-object check: the workspace lacks the expected metadata.","triggerScenarios":"objects query result has no edge with nameSingular === 'workspaceMember'. Causes: workspace metadata incomplete/not synced; querying a workspace where the member object isn't exposed; metadata API version that doesn't surface workspaceMember.","commonSituations":"Metadata sync incomplete after install; wrong workspace; older server version that doesn't expose workspaceMember as a queryable object.","solutions":["Wait for / trigger a metadata sync and re-run rls:configure.","Confirm TWENTY_PARTNERS_API_URL/TWENTY_PARTNERS_API_KEY point at the correct workspace.","Verify the Twenty server version exposes workspaceMember in the metadata objects query.","If workspaceMember is intentionally hidden, revisit the self-scope predicate design before proceeding."],"exampleFix":"// before\nif (!objectIdByName.has('workspaceMember')) {\n  throw new Error('workspaceMember object not found in workspace metadata.');\n}\n\n// after — list all available objects to aid diagnosis\nif (!objectIdByName.has('workspaceMember')) {\n  const available = [...objectIdByName.keys()].join(', ');\n  throw new Error(\n    `workspaceMember object not found in workspace metadata. ` +\n    `Available objects: ${available}. Re-sync metadata then re-run rls:configure.`,\n  );\n}","handlingStrategy":"validation","validationCode":"const objects = await fetchObjectNames(metadataUrl, apiKey);\nif (!objects.includes('workspaceMember')) {\n  throw new Error('workspaceMember not in metadata; complete the install/sync then re-run rls:configure');\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Ensure metadata sync is complete before running rls:configure (workspaceMember must be present).","Confirm TWENTY_PARTNERS_API_URL/API_KEY target the correct workspace.","Verify the Twenty server version exposes workspaceMember as a queryable object.","Re-run rls:configure after sync (idempotent)."],"tags":["metadata","install","config","rls","partners"],"backgroundTag":null,"analyzedSha":"1f5dd2bbd2a8da3419c8cfd52dd545c0024df1a6","analyzedAt":"2026-08-12T15:37:27.593Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}