Earlier quoted context omitted.
The problem is that usually we don't write the WHY in the commits... We tend to always capture the WHAT in the form of prose. And for agents, this is just more noise, since all they need is just the diff to reconstruct the WHAT. I've never seen someone write decisions or the intent they started with in commit messages. Even the solutions today that auto-generate commit messages just summarise the diff. This was helpf…
> I've never seen someone write decisions or the intent they started with in commit messages You may not have seen enough good repos. The following is an example commit from freebsd https://cgit.freebsd.org/src/commit/?id=ac5ff2813027c385f903... A proper email is like an email. You have the first line as the subject and it may be enough to explain the intent of the diff. But sometimes it’s not enough and you add more…
Contextual commits – An open standard for capturing the why in Git history
11–20 of 39 posts
Re: Contextual commits – An open standard for capturing the why in Git history
#12> an open standard for capturing the WHY in git history Agentic coding keeps reinventing coding. That was my first thought. > And then it hit me - the commit body has always been there. Completely underutilised. Wait. What? This is the standard? > Here is an example of how a Contextual Commit looks: The format is key-value stuff. You can already use trailers for that. The syntax here doesn’t work with that stuff. If…
Trailers were not suitable for the use case. The scope in parentheses is doing real work. `rejected(oauth-library)` lets you do `git log --grep="rejected(auth"` to find every rejected auth decision across history. If you flatten it to a trailer token you either lose the scope or encode it awkwardly as `Rejected-auth-oauth-library: value`, which doesn't grep cleanly and doesn't parse naturally.
Re: Contextual commits – An open standard for capturing the why in Git history
#13It continually amazes me how averse people are to just explaining why a commit exists in the body of the commit. Is all this tagging actually easier to read than written prose? You don’t even have to write it anymore if the sight of your editor opening upon `git commit` causes some instinctual revulsion.
The problem is that usually we don't write the WHY in the commits... We tend to always capture the WHAT in the form of prose. And for agents, this is just more noise, since all they need is just the diff to reconstruct the WHAT. I've never seen someone write decisions or the intent they started with in commit messages. Even the solutions today that auto-generate commit messages just summarise the diff. This was helpf…
But also, if you look at large projects like Linux or FreeBSD, commits there explain why as well.
Re: Contextual commits – An open standard for capturing the why in Git history
#14Earlier quoted context omitted.
Trailers were not suitable for the use case. The scope in parentheses is doing real work. `rejected(oauth-library)` lets you do `git log --grep="rejected(auth"` to find every rejected auth decision across history. If you flatten it to a trailer token you either lose the scope or encode it awkwardly as `Rejected-auth-oauth-library: value`, which doesn't grep cleanly and doesn't parse naturally.
I think those are better suited to an issue tracker. As for changes that affected the source code, you can grep the patch in the git log too.
And there is a slight difference between what you capture in issue trackers and what happens in reality in coding sessions.
Re: Contextual commits – An open standard for capturing the why in Git history
#15> intent(auth): users need social login, starting with Google before GitHub and Apple Your 'intent' is 'users need social login'? That does not make sense. Your intent is 'Getting more users by lowering barriers to sign up', a business goal. That business goal might have hierarchical children – for example, Jira epics – such as 'offer social sign-in', or 'declutter landing page.' Also, the commit mentions 'Google bef…
By having a structured context of the key session discoveries, decisions, rejected items (if there were past commits with decisions that had been rejected, etc..) you achieve a type of contextual storage of the reason, thus after a month, when a team member wants to start working on a task that you have touched, and now forgot since you are doing ai-assisted coding and pr throughput is to sky right now, your collegue at least will know the rational behind the decission and working with his agent, the agent will produce more reliable code not introducing something for the sake of solving the task.
Re: Contextual commits – An open standard for capturing the why in Git history
#16Earlier quoted context omitted.
> I've never seen someone write decisions or the intent they started with in commit messages You may not have seen enough good repos. The following is an example commit from freebsd https://cgit.freebsd.org/src/commit/?id=ac5ff2813027c385f903... A proper email is like an email. You have the first line as the subject and it may be enough to explain the intent of the diff. But sometimes it’s not enough and you add more…
This looks very good. Thanks for sharing. I can only imagine how much discipline it takes to write these kinds of commits manually.
When you think of the patch as an unit of idea and the commit as the means to convey that idea, it takes the same amount of effort to write an email message.
BTW you do not have to write those for every single commit. You can always rebase interactively and create a final set of commits for sharing. No one cares about what’s in your local copy of the repo.
Re: Contextual commits – An open standard for capturing the why in Git history
#17> an open standard for capturing the WHY in git history Agentic coding keeps reinventing coding. That was my first thought. > And then it hit me - the commit body has always been there. Completely underutilised. Wait. What? This is the standard? > Here is an example of how a Contextual Commit looks: The format is key-value stuff. You can already use trailers for that. The syntax here doesn’t work with that stuff. If…
Trailers were not suitable for the use case. The scope in parentheses is doing real work. `rejected(oauth-library)` lets you do `git log --grep="rejected(auth"` to find every rejected auth decision across history. If you flatten it to a trailer token you either lose the scope or encode it awkwardly as `Rejected-auth-oauth-library: value`, which doesn't grep cleanly and doesn't parse naturally.
I'm 99% sure that grep won't find your commit because you rejected "oauth-library" and grepping for "auth" rejection. Given that LLM will make up category name, it will just get worse unless there is deterministic enforcement.
All of this really feels like people that never wrote code starting doing it via agents and started reinventing already solved issues.
Re: Contextual commits – An open standard for capturing the why in Git history
#18The example of using one library over another, especially if research has gone into which to choose, regularly involves say finding a good article that compares the alternatives.
I’ll say though that I usually include links to more notable references, I won’t usually commit refs to a libraries own docs and more obvious stuff; revealing and keeping references to resources found that went towards getting it done are what I keep and add to commit body.
Maybe there’s spaces for useful references to be added to the spec/conventions. Personally I usually show links like this after the body message.
Example of the commit body:
refs(oath-library):
www.something.com/picking-a-thing
Re: Contextual commits – An open standard for capturing the why in Git history
#19This gives product owners the ability to embellish as they wish and reduces the need of the dev to repeat themselves.
Re: Contextual commits – An open standard for capturing the why in Git history
#20Earlier quoted context omitted.
Trailers were not suitable for the use case. The scope in parentheses is doing real work. `rejected(oauth-library)` lets you do `git log --grep="rejected(auth"` to find every rejected auth decision across history. If you flatten it to a trailer token you either lose the scope or encode it awkwardly as `Rejected-auth-oauth-library: value`, which doesn't grep cleanly and doesn't parse naturally.
> The scope in parentheses is doing real work. `rejected(oauth-library)` lets you do `git log --grep="rejected(auth"` to find every rejected auth decision across history. I'm 99% sure that grep won't find your commit because you rejected "oauth-library" and grepping for "auth" rejection. Given that LLM will make up category name, it will just get worse unless there is deterministic enforcement. All of this really fee…