Skip to content
Insights · Engineering

Which team did that member join?

Name the team that member joined: the slug, the role, and the state. Another team can grant a different role, and another organization does not list it.

Scroll
EngineeringOct 30, 202612 min readBy Salman Naqvi, Founder & CEO
Which team did that member join?

A client says the engineer is on the team, or says the person was never added. Tonight, three proofs, in an organization the agency or the client can open. Name the team that member joined: the team slug, the role, and the state. If the membership is still pending, write pending. Do not rewrite it as active because an email went out. Show a different team whose slug, or whose role for this person, is not this one. Show another client's organization that does not list this membership. If any of the three needs a laptop the client cannot open, you have not named the team. You have a login and a guess.

This is the team on one membership. It is not the milestone. Which milestone did that issue join? is a number, a title, and a state on an issue. A milestone can be open while this person is on no team, and a team slug is not a milestone number. It is not the label. Which label did that issue carry? is a name, a color, and a description. A label can say bug while the membership state is a different word. It is not the role already stored on an account. Name the role that account holds is the role on the account. An account role can exist before any team lists the person. It is not the balance a customer held, and it is not the text an audio file returned. Those are different objects, and they are not this slug.

None of what follows is a finding that this person should have been added, and none of it is legal advice. The fields below are one host's current description of a team and of a team membership, and the create example does not print the response body the schema promises. The counts below that are a 2014 study of other people's repositories. A percentage of personal projects is not a membership on this team. A paper that never opened the organization cannot name the role on the membership you opened tonight. They do tell you which numbers people mix up when they try to sound precise about a seat they have not opened.

GitHub's create-team example sends a name, a description, a permission, a notification setting, and a privacy. The name is Justice League. 14 characters. The description is A great team. 12 characters. 12 is not 14. permission is push, 4 characters. notification_setting is notifications_enabled, 21 characters. privacy is closed, 6 characters. The page's own slug rule says GitHub lowercases the name, replaces spaces with hyphens, and replaces special characters. Applied to Justice League, that rule yields justice-league, also 14 characters, and not the same string. The page does not print justice-league next to the example. The rule's own illustration is My TEam Näme becoming my-team-name. Both of those strings are 12 characters. The illustration changes case and replaces a character, and the length does not move. A length match is not an identity. The create response schema says id, slug, and members_count are required. The example does not print an id, a slug, or a members_count. A schema is not a membership (GitHub, REST API endpoints for teams).

The defaults are not the example, and the parameter list is not the body the example sends. For a team that is not nested, the default privacy is secret. secret is also 6 characters. 6 equals 6, and secret is not closed. The example sends closed. A child team's default is closed, which is what the example sends, and the example does not send a parent. Do not treat the example as the default because both words are six letters. notification_setting defaults to notifications_enabled, which is what the example sends. The other value is notifications_disabled, 22 characters. 22 is not 21. The difference is one character, and the page does not print that one. The check-permission sentence names five repository permissions: admin, push, maintain, triage, and pull. push is one of the five. The create parameter list above the example names name, description, maintainers, repo_names, privacy, notification_setting, parent_team_id, and parent_team_slug. Eight names. permission is in the example and not in that list of eight. The update section later marks permission as closing down. A field the example sends and the parameter list does not name is a field you copy only after you have read both. maintain, the repository permission, is 8 characters. maintainer, the team role below, is 10. 10 is not 8. The extra two letters are how a repository grant gets narrated as a team role.

The membership is a second object, and it is not the team. Add or update team membership defaults the role to member. The example body sends maintainer. member is not maintainer. The response is supposed to contain a state and a role. State is active or pending. Two names. Role is member or maintainer. Two names. The example does not print a state. If the person is not yet in the organization, the page says the membership stays pending until the invitation is accepted, and then it becomes active. pending is not active. The list of members includes child-team members, and each row says whether the membership was inherited. inherited true is not a direct add. The list filter accepts member, maintainer, or all. Three names. all is a filter. It is not a role you can read off the membership. per_page defaults to 30 and the maximum is 100. 30 is not 100. The pending-invitation endpoint, on the same reference, returns an organization-invitation role: direct_member, admin, billing_manager, hiring_manager, or reinstate. Five names. direct_member is 13 characters. Those five are not member and maintainer. admin on that invitation list is not admin in the five repository permissions, and it is not a team role. The version header the page names is 2026-03-10. 10 characters. It is not a team id, because the example never printed one (GitHub, REST API endpoints for team members).

The study people reach for when they want a share of real teams did not open this organization. Eirini Kalliamvakou, Georgios Gousios, Kelly Blincoe, and Leif Singer survey GitHub use and then measure repositories in a public dataset. They sent the survey to 1,000 users and received 240 responses. 240 divided by 1,000 is 0.24, which is the 24% they print. That quotient matches. 90 of the 240 said they use GitHub primarily for their own projects. 90 divided by 240 is 0.375, which is 37.5%. They print 38%. The page does not print 37.5. Thirty-four of 240 said they use repositories for experimentation, websites, or class projects. 34 divided by 240 is 0.1417, which rounds to the 14% they print. They also say about 10% use GitHub for storage. 10% of 240 is 24. The page does not print 24. A manual sample of 434 repositories is then labeled in Table 2: software development 275 (63.4%), experimental 53 (12.2%), storage 36 (8.3%), academic 31 (7.1%), web 25 (5.8%), no longer accessible 11 (2.5%), empty 3 (0.7%). Those seven counts add to 434. The seven printed percents add to 100.0. Both additions match. Storage in the table is 8.3%, not the survey's about 10%. 8.3 is not 10 (Kalliamvakou, Gousios, Blincoe, and Singer, The Promises and Perils of Mining GitHub).

The personal-project sentences do not pick one percentage. The peril title says two thirds of projects, and then 71.6% of repositories. Two thirds, rounded to one decimal, is 66.7, which the page does not print, and 71.6 is not 66.7. The body says 67% of projects have one committer, 72% of repositories have one committer, and the manual sample is 65% with one committer. 71.6 is not 72, 72 is not 67, and 67 is not 65. Later, pull requests are called non-existent in personal projects, and the parenthetical is 67% of projects, pointing back at that peril. 67 is not the 71.6 in the peril's own title. Of the 2.6 million projects they call collaborative, only 268,853 (10%) used a pull request at least once. The page prints 2.6 million and does not print 2,600,000. 10% of 2,600,000 is 260,000. 268,853 minus 260,000 is 8,853. 268,853 divided by 2,600,000 is 0.1034, which is 10.34%, not 10%. They say the remaining projects are 2.4 million. 2,600,000 minus 268,853 is 2,331,147. 2,331,147 is not 2,400,000. The difference is 68,853, which the page does not print. The median number of commits per project is 6, and the maximum they print is 427,650. 6 is not 427,650. The permission footer on the same PDF prints Copyright 2007 next to MSR 2014. 2007 is not 2014. A year in a footer is not a team slug, and 71.6% is not a role.

Do the three proofs on one real membership, in the organization that actually holds it. First, the binding. Copy the team slug, the username, the role, and the state. If state is pending, write pending. Do not rewrite it as active because a maintainer example exists. If the list says inherited, write inherited. Do not describe a child-team row as a direct add. Do not paste Justice League because a sample uses that name, and do not paste push because a sample sends that permission. Second, the other team. A different slug, or a different role for the same username, is not this membership. A paper's 67% is not that second team. If you cannot show a team that is not this one, you have a counter, not a record. Third, the other organization. A list that belongs to another client does not contain this slug. If the only roster is a spreadsheet on a laptop the client cannot open, write that. An organization you cannot name is the finding.

Three moves feel like the proof and are a second problem. Adding the person, or accepting the invitation for them, because the state was embarrassing, before you have copied the slug. A new membership gets a state. It does not tell you which team you were looking at if you have not copied the slug first. Quoting 71.6% because it looks precise, while the membership you were asked about is one row, and the 434 repositories that produced a table had not opened this organization. Asking a model which role it was. The model will pick a plausible word from member, maintainer, admin, and push. It will not open the membership. A milestone you have not kept, while the client is arguing about a due date, is which milestone did that issue join?. Opening that screen does not name the team.

The path is ordinary when an operator can open one client's organization without opening the next client's organization as the way to prove it. Gigbase is one agency workspace: projects, teams, and clients, distinct from the next workspace. The shape that matters here is one workspace you can point at, in an organization the client or the agency can open, distinct from the next workspace. That case is not a team-membership ledger. Nothing in that sentence is a headcount, a duration, or a result figure. If the only control on the screen changes every client's roster together, you do not have this proof. You have a directory.

There is a version of this afternoon where taking the work is the wrong purchase. The work is not sold under the agency's name. The client asked to meet the builders, and a hidden bench is the thing they said they did not buy. The room only has a slide, and the organization is not one you can open. The buyer only wants a template. Or the buyer wants a legal opinion about what a pending invitation promises. Those are not this proof. The terms on a white label software development partner page are the arrangement itself: the work stays in the client's organization, under the agency's name. The page is the offer. It does not name this team, and it does not turn 71.6% into a role.

When the person is real and the organization cannot name the team, the missing object is specific. A read, in an organization the agency or the client can open, that shows one slug, one role, and one state, shows a different team that is not that membership, and shows another client's organization without it. A white label software development partner that expects this will have put the repository and the team in the client's organization before the first seat, because a roster that lives on a laptop the client cannot open cannot be defended by the person whose name is on the invoice. One that can only forward a username is telling you who holds the membership. If the next slice is one capability, an AI integration sprint is the shape where the acceptance sentence can include the three proofs. If you do not yet know which organizations the current engagements already use, a two-week AI readiness assessment maps them. The findings are yours. They are not a promise that a paper's percentage applies, and they are not Justice League.

The balance a customer held, and the text an audio file returned, are different objects: which balance did that customer hold? and which text did that audio return?. Do not record either on this page. An ending balance is not a team slug. A duration is not a role.

Before you tell them the person is on the team, do the three proofs and write the state. Name the slug, the role, and the state, or write that the organization has no such membership. Show a different team that is not that one. Show another organization that does not hold it. Do not accept an invitation to avoid reading pending, and do not ask a model which of the role lists it was. A paper can tell you how skewed other people's repositories were, including the 71.6% that is not the 67% in the next paragraph. The binding is the membership you can defend.

Questions

Three records, in an organization the agency or the client can open. The team slug, the role, and the state, including pending if the invitation has not been accepted. A different team whose slug or role is not this one. Another client's organization that does not list this membership. An organization-invitation role is not a team role.

No. A percentage of personal projects in a public dataset is not the slug on this team. A membership you can defend is the slug, the role, and the state on this organization, or a written line that the person is not on the team. 71.6% is not the role maintainer, and 67% in the next paragraph is not 71.6%.

When the work is not sold under the agency's name, when the client asked to meet the builders, when the room only has a slide, when the buyer only wants a template, or when the buyer wants a legal opinion.

Find this useful? Tell Google to show you more of it.

Let's put AI to work in your business.

A 30-minute call. You bring the workflow or the roadmap — we'll tell you what's feasible, what it costs, and what we'd build first.

Book a call→