Skip to content
Insights · Engineering

Who owns the file they changed?

Name the owner the base branch records for that file. A different file can name someone else, and another client's repository does not list this owner.

Scroll
EngineeringOct 20, 202613 min readBy Salman Naqvi, Founder & CEO
Who owns the file they changed?

A file changed, and the client is asking whose it is. Tonight, three proofs, in a repository the agency or the client can open. Name the owner the repository records for that file, on the branch the pull request would merge into. Show a different file whose recorded owner is not that person. Show another client's repository that does not list this owner. If any of the three needs the person who wrote the file, you have not shown the owner. You have a git blame and a hope.

This is the owner a file names. It is not the account that merged. Name who merged their change is that account, and whether a push with no approval was refused. A person who clicked merge is not the owner the file recorded, and an owner who never clicked merge is still the owner the file recorded. It is not the reading you do before a change ships. Read their change before it ships is whether you opened the diff. Opening a diff does not say who the file lists. It is not the check the merge required. Name the check the merge required is which status can block the merge. A green check is not an owner. It is not the access you handed over. What access to give a subcontractor is the grant. A grant can be write on the whole repository. Write on the repository is not ownership of one file.

None of what follows is a rate for this engagement, and none of it is legal advice. The rules below are one host's current description of a file that names owners. The correlations below that are two Windows releases, studied inside the company that built them. A host's syntax is not a finding that your contract assigns copyright. A Windows binary is not this client's repository. They do tell you which two ideas of last and which two ideas of half people collapse when they are asked whose file it is.

GitHub looks for a file named CODEOWNERS in three places, in this order: `.github/`, the root, then `docs/`. If more than one of those exists, it uses the first it finds. First is not last. The pattern rule is the other direction: the last matching pattern takes the most precedence. A `*` line that names two global owners, followed by a `*.js` line that names one owner, means a pull request that only touches JavaScript requests the JavaScript owner, not the two globals. The two globals are not added to the one. Last pattern is not the first file. A third last sits in the syntax: if you want two owners for the same pattern, they have to be on the same line. Split across two lines, the pattern matches only the last mentioned owner. Three uses of last, and only one of them drops a person. The file itself must be under 3 MB. A file over that limit is not loaded, so no owner is shown and no owner is requested. 3 MB is not 3 directories. Three directories are the search order. 3 MB is a size (GitHub, About code owners).

A request is not an approval, and a draft is not a missing owner. Code owners are requested when a pull request modifies code they own. They are not requested on a draft. Marking the draft ready notifies them. Converting a pull request back to a draft does not unsubscribe people who were already notified. Not requested is not unsubscribed, and neither is an empty file. When required reviews from code owners are on, an approval from any one owner on the line is enough. `@global-owner1` and `@global-owner2` on a `*.js` line means either may approve. Both are not required. Two names is not two approvals. The file has to be on the base branch of the pull request, or the request does not fire. A CODEOWNERS on the head branch, absent from the base, is a file you can open and still not the rule that will be used.

Forks, syntax, and a missing permission are three ways to have a line that does not bind. A pull request whose base is the upstream repository uses the upstream file. A pull request whose base is inside the fork uses the fork's file, and the request fires only if those owners were given write on the fork. Write on the upstream is not write on the fork. A line with invalid syntax is skipped. The rest of the file is not skipped. A user or a team without explicit write is not assigned, even when every member of the team already has write through some other path. Team write is not member write. An email address can name a user, except a managed user account. An email is not a team. Paths are case sensitive, including on a laptop whose disk is not. `docs/*` matches one level. `/docs/` matches that directory and what is nested under it. `docs/*` is not `/docs/`. A leading `!` does not negate a pattern. Brackets do not define a range. Those are gitignore rules the page says do not work here. An empty owner, as in a line that names `/apps/github` and then stops, clears that path. Cleared is not the same as inherited from `*`.

The study that measures whether ownership tracks failures is not this file format. Christian Bird, Nachiappan Nagappan, Brendan Murphy, Harald Gall, and Premkumar Devanbu reported it at ESEC/FSE 2011, on Windows Vista and Windows 7. A component, in their definition, is a compiled binary. A contributor is someone who committed to it. Ownership is the share of commits. Cindy, in the definition, makes 20 commits of 100 and has 20%. 20 of 100 is their example. It is not a threshold. A minor contributor is under 5%. A major contributor is at or above 5%. They tried thresholds from 2% to 10% and say the results were similar. 5 is not 2. 2 is not 10. 20% is not 5%. They count commits, not lines, and they cite a correlation above 0.9 between the two. Above 0.9 is not 5%. The company had 2,000+ developers. 2,000 is not 17, which is the engineer count on one library below. They only count failures the team deemed important enough to fix. Post-release failures are the first 6 months after release. Pre-release failures are the window before release. 6 months is not the pre-release window, and it is not a sprint (Bird, Nagappan, Murphy, Gall, and Devanbu, Don't Touch My Code!, ESEC/FSE 2011).

Their worked binary is abocomp.dll, and the metrics are a closed arithmetic you should not reopen. 918 commits. The top engineer made 379, which they call roughly 41%, and the ownership metric prints 0.41. 379 is not 918. Roughly 41% is their gloss. 0.41 is the metric. Do not replace either with a division you like better. Five engineers made at least 5%, which they print as at least 46 commits. Twelve made less than 5%, less than 46 commits. 12 plus 5 is 17, and 17 is the total they print. 46 is not 379. 5 engineers is not the 5% threshold. 12 minor contributors on one DLL is not the Minor metric of Windows. Branching and merging were not counted as changes. A merge you can name on name who merged their change is a different object from a commit they would have counted.

The correlations are four columns, and one cell is the exception they mark. Table 1 prints Spearman values for Vista pre-release, Vista post-release, Windows 7 pre-release, and Windows 7 post-release. Minor is 0.86, 0.70, 0.93, and 0.25. Total is 0.84, 0.70, 0.92, and 0.24. 0.93 is not 0.92. 0.86 is not 0.84. 0.70 appears on both rows for Vista post-release, so that tie is real and the others are not. Ownership is -0.49, -0.49, -0.29, and -0.02. Every correlation in the table is significant except Ownership against Windows 7 post-release failures, which is the -0.02. -0.49 is not -0.02. Major is 0.26, 0.29, -0.40, and -0.14. A negative Major on Windows 7 is not a negative Ownership on Vista. Two anonymized binaries make the same point without a coefficient: B.dll had eight times the pre-release failures of A.dll and twice the post-release failures. Eight is not two.

The regression table is where a parenthetical and a cell can both be printed and still not be the arithmetic you expect. The base model, size and churn and complexity, explains 26% and 29% of Vista pre-release and post-release failures. The prose then says 24% and 28% for Windows 7. Table 2 prints Windows 7 base as 24% and 18%. 28 is not 18. Use the table when you cite the cell, and do not correct the prose by silent substitution. Adding Minor lifts Vista pre-release from 26% to 46%, which the table marks +20, and post-release from 29% to 41%, marked +12. 26 plus 20 is 46. That one adds. Windows 7 pre-release goes from 24% to 68% when Total is added, and the table prints +35 beside 68%. 24 plus 35 is 59, which the table does not print. Do not replace 68 with 59. The same column then prints 70% (+46), 71% (+1), and 72% (+1). 72 is the largest cell. It is not Vista's 50%, which is Vista pre-release after Minor, Major, and Ownership. Windows 7 post-release stays near the base: 18, 21, 21, 22, 22. A +1 there is not the +46.

Minor contributors, in their dependency cut, are a Vista-only graph, because they could not get the Windows 7 debug files. In the observed graph, 52% of binaries had a minor contributor who was a major contributor to a binary the first one depended on. Random rewiring, preserving how major and how minor each person was, produced that pattern for 24% of binaries on average, and the maximum across 10,000 graphs was 32%. 52 is not 24. 24 is not 32. 10,000 is not 50, which is the number of random train-test splits in the later predictor. The conclusion says that when a component has a minor contributor, the same developer is a major contributor to a dependent component approximately half the time. Approximately half is their later phrase. 52% is the body's count of binaries. Do not swap them, and do not call 24 a half. Rewiring does E squared swaps, where E is the number of contribution edges. The paper does not print E. Do not invent it.

The predictor numbers are three layers, and the famous pair is not the table. Pinzger and colleagues, as Bird reports them, identified 90% of fault-prone binaries (recall) and 85% of the binaries they called fault-prone actually were (precision), on a prior Windows release. 90 and 85 are that sentence. Table 4, which is Bird's rerun, prints Vista pre-release on the full network as precision 90%, recall 91%, F-score 91%. 91 is not 85. 90 precision in the table is not 90 recall in the prose. Vista post-release on the full network is precision 75%, recall 82%, F 78%. Removing minor edges, the Major column, drops that to precision 44% and recall 58%. The prose says the reduced model identified only 58% and that around 44% of its fault-prone predictions were correct. 58 there is recall. 44 there is precision. They match that column. They do not match Pinzger's 90 and 85. Random guessing, in Pinzger's formulation, would be 50% on both. 50 is not 12, which is Windows 7 post-release precision on the full network, beside a recall of 66% and an F of 21%. 12 is not 66. 21 is not 50. The model was trained on two thirds of the binaries and tested on one third, fifty times. Two thirds is not fifty. Fifty is not 10,000.

Do the three proofs on one real file, in the repository the client can open. First, the line. On the base branch, name the pattern that matches the file and the owner that pattern records, after the later patterns have been applied. If `.github/CODEOWNERS` exists, do not also treat a root file as the rule. First location wins. If the file is over 3 MB, write that it was not loaded. Second, the other file. A path that a later pattern gives to someone else is not this owner. If every path resolves to the same person because the only line is `*`, write that, and do not describe it as per-file ownership. Third, the other repository. Another client's repository does not list this owner for this path. If both clients share one repository and one CODEOWNERS, you do not have the third proof. You have a shared tree, and that is the finding.

Three moves feel like the proof and are a second problem. Reading git blame and calling the last author the owner. Blame is a commit. The file is a rule. They can name different people, which is the reason both pages exist. Putting two owners on two lines and telling the client both will be requested. The page says the pattern then matches only the last mentioned owner. Asking a model who owns the file. The model will name a plausible engineer. It will not open the base branch. A person who was allowed to merge, while the file lists someone else, is name who merged their change. The merge does not rewrite the line.

The path is ordinary when an operator can open one client's project without opening the next client's tree to prove the boundary. Gigbase is a multi-tenant workspace in which projects are tied to clients and teams, with an admin who can see one agency's work. The shape that matters here is that split: one client's project is not the next client's. That case is not a CODEOWNERS file. Nothing in the description is a headcount, a duration, or a result figure. If the only control is a single shared repository with no owner line, you do not have this proof. You have a remote.

There is a version of this call where hiring the path is the wrong purchase. The work is not sold, so there is no client repository to open. The client has asked to meet the people who will write the code. A file of owners will not hide that. The criteria for choosing a firm, when you are still choosing, sit on the page for a top saas development company. That page is criteria. It does not rank anyone, including us. The room only has a slide. Or the buyer only wants a template of a CODEOWNERS file, with no repository to put it in. Or the buyer wants a legal opinion about copyright. Hire the lawyer. A white label software development partner is the wrong purchase for a blank.

When the change is real and the repository cannot name an owner, the missing object is specific. The line on the base branch, a second file that line does not assign to the same person, and a second client's repository that does not list them. A white label software development partner that expects this will put the repository where the client can read the line, before the first week is billed, because a blame on a laptop you do not hold is not an owner you can name. One that can only paste a username into chat is telling you who holds the file. Where the next slice is one capability and the acceptance sentence names the owner, an AI integration sprint is the shape that can require the three proofs as the definition of done. Where you are not sure which repository the current engagement commits to, a two-week AI readiness assessment maps the systems. The findings are yours. They are not 0.41, and they are not a rate.

A job still waiting in a queue, and the temperature one model call sent, are different objects: which job is still in the queue? and which temperature did that call use?. Do not record either on this page. A message id is not an owner. A sampling parameter is not a CODEOWNERS line.

Before you tell the client the file is someone's, do the three proofs and write the line. Name the owner the base branch records, or write that the file was not loaded. Show a different file with a different owner, or write that every path is the same `*`. Show another client's repository that does not list this owner. Do not treat the last author as the rule, and do not treat two lines as two requests. A Windows binary can tell you that minor contributors tracked failures inside one company. The line is the page you can defend.

Questions

Three records, in a repository the agency or the client can open. The owner the base branch records for that file, after later patterns are applied. A different file whose owner is not that person. Another client's repository that does not list this owner. If you cannot open the file, write that.

No. A commit is an author. A CODEOWNERS line is a rule, and the last matching pattern wins. The first of three file locations is the file GitHub loads, which is a different last. Two names on one line are both requested, and either approval can satisfy a required code-owner review. Two names is not two approvals.

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→