A merged pull request is a record. A suggestion you turned down is not. Neither is the feature that shrank from six weeks to two days, or the incident that did not happen because you refused something in March. As soon as the code is agent-written, "look at my commits" stops being an argument, and everything that replaces it is subtractive: what got rejected, what did not escape, what got smaller. None of it is recorded by default. This is how to record it without turning your job into bookkeeping.
Nobody kept a portfolio. The commit history was the portfolio, and it was produced for free by the act of doing the job.
That worked because writing the code and demonstrating you could write the code were the same motion. The artifact and the evidence were one object. Now the artifact is largely produced by something else, and what you contributed sits in the difference between what was produced and what shipped. Differences are not stored anywhere.
WHAT THE SYSTEM RECORDS
the commit that shipped · the ticket that closed · the review you approved
WHAT IT DOESN'T
the version you rejected, and why
the six weeks of work you argued down to two days
the thing you asked about that nobody had considered
the outage that therefore did not occur
The bottom line has no artifact at all. It is a counterfactual,
and counterfactuals need an argument rather than a link.
There is a second-order effect worth naming, because it decides how urgent this is. Reviewers are already noticing that shipped volume has stopped correlating with quality, and the institutional response is to reach for something else to count. If nobody supplies a better measure, they will settle on whatever is easiest to extract from the tooling, which will be worse than what it replaced. Supplying the better measure is partly your job now.
Not a list of everything good you did. Six shapes of evidence, each of which supports a specific claim about what you can be trusted with.
| Class | The artifact | Argues for |
|---|---|---|
| Rejections | Agent output you turned down, with the reason and the cost had you been wrong. | R2 · trusted to merge alone |
| Catches | Defects found before merge, with the class named, not just the instance. | R3 · trusted on others' work |
| Escapes owned | Something you approved that broke, and the specific thing you changed afterwards. | R3 · credibility |
| Constraints | A rule merged into the harness with the incident named. A rule deleted, with the reason. | R4 · trusted with the rules |
| Reductions | Work that got smaller or did not happen, with the before and after. | R5 · trusted with scope |
| Positions held | A correct call defended with evidence when someone senior disagreed. Or correctly abandoned. | All of them |
Escapes owned belongs in the packet, near the top. Every other packet the reviewer reads that week contains no failures at all, which they know is false. A specific approval that went wrong, followed by the specific thing you now check, is the cheapest credibility available and it makes the five claims around it readable as honest rather than curated.
Notice what is not on the list: features delivered, tickets closed, lines written, systems launched. Those are not worthless, but they no longer distinguish anybody, and a packet built on them reads as a report on how much the agent produced while you were nearby.
One line, written in the moment. The moment is not negotiable: nobody has ever successfully remembered these on a Sunday in November.
2026-03-04 #412 agent used a float for the refund amount; switched to
integer cents. wrong → silent rounding loss on every refund
2026-03-11 #418 agent retried the payment call on timeout; we fail fast
here by policy. wrong → duplicate charges
2026-03-12 — talked the export feature down from a scheduled pipeline
to a signed URL. 6 weeks → 2 days, no new infra
2026-03-19 #431 approved the cache change; it broke stale reads in prod.
now: any cache PR gets an explicit invalidation claim
Cost if wrong. Without it a rejection log is a list of preferences and reads like fussiness. With it, each line becomes an argument. Turning down a suggestion that would have cost nothing is housekeeping and does not belong in the file. Turning down one that would have double-charged customers is the entire job, and the difference between those two is exactly what a reviewer is trying to establish.
Write the rejection into the pull request, at the time. Then the record is dated by the version control system rather than by you.
A private log kept diligently all year and a private log written the week before review look identical on the page. That is a real problem and it is worth solving structurally rather than by asking people to trust you. A sentence in a pull request body from March is timestamped, public, and was written when you had nothing to gain from it.
## What the agent proposed, and what I did instead
- Proposed a retry with backoff on the charge call. Replaced with
fail-fast: this path is not idempotent, so a retry risks a double
charge. See CHARTER.md §payments.
- Proposed caching the tax lookup for 24h. Left uncached; rates
change intraday during the state transition window in April.
This costs nothing extra, because you already made both decisions. It also does a second job immediately: it is the most useful thing a reviewer can read, since it tells them where you deviated from the obvious path and why. Teams that adopt this as a norm find review gets faster, which is a better argument for adopting it than the promotion one.
With the durable record living in pull requests, your own file shrinks to a list of pointers plus the things that have no pull request: scope conversations, meetings where you talked something down, questions you asked that changed a plan. Those still need writing down by hand, and they are frequently the most valuable entries you have.
Most people read this in month eleven. Here is what can be recovered, and an honest estimate of how much.
# your merged PRs with bodies, to find the ones where you explained a choice
gh pr list --author "@me" --state merged --limit 200 \
--json number,title,body,mergedAt
# PRs you reviewed: where your catches live
gh search prs --reviewed-by "@me" --merged --merged-at ">2026-01-01"
# discussions you weighed into that were not yours
gh search prs --commenter "@me" --merged-at ">2026-01-01"
Archaeology recovers maybe a third, and reconstructed evidence is legitimate as long as it is labelled. "Reconstructed from PR history in October" is fine and honest. Presenting it as a log you kept all year is a small lie about exactly the trait you are claiming, which is a bad trade at any odds.
A packet that needs eight pages is a packet whose author could not identify the six things that mattered, which is itself a demonstration.
One pattern, repeated six times: a claim in the vocabulary of the ladder, the evidence, and the consequence. Nothing else.
CLAIM I am the last check on payment-path changes.
EVIDENCE PR #418, #431, #447 — three agent-proposed retries
rejected on the non-idempotent path, each with the
policy cited in the PR body.
CONSEQUENCE A retry on that path double-charges. We have shipped
none since March.
CLAIM I approved something that broke, and changed how I review.
EVIDENCE PR #431, incident 2026-03-19.
CONSEQUENCE Every cache change now needs an explicit invalidation
claim. Two caught since, #455 and #470.
Two obligations, and the second is the one that gets skipped.
And stop asking for impact denominated in shipped work. Volume now measures how fast somebody can drive a model, which is a real skill, an easily acquired one, and not the thing a promotion is supposed to be recognising.
If you start asking for rejection logs without warning, you will not select for judgment. You will select for people who happened to keep notes, and you will disproportionately miss the people least likely to self-promote, which is the failure mode every review process already has. Announce it a full cycle ahead, and put the pull request practice from §3 into the team's norms so the evidence accumulates for everyone by default rather than for the diligent only.
The structural fix is worth more than the request. When "what the agent proposed and what I did instead" is a standing section in the pull request template, every engineer produces this evidence as a byproduct of working, which is exactly the property the old commit history had and the thing we are trying to get back.
The last one is fatal and is usually introduced by a well-meaning process improvement.
Everything on this page works as evidence read by a human who can evaluate whether a specific refusal was wise. None of it works as a number on a dashboard. If someone proposes tracking rejections per engineer per sprint, the correct response is that you have just described a way to make the signal worthless within one quarter, and to offer the qualitative version instead.
Two habits. Everything else on this page is elaboration on these.
In a year that is roughly a hundred and twenty lines, most of them timestamped by a system you do not control, describing precisely the work that used to be invisible. It is also, separately from any promotion, the most useful document you will own: it is the only honest record of what you were actually deciding while the code was being written by something else.
Reviewing your own file after six months tells you something no performance cycle will. If the entries are all small, your judgment is not being exercised on anything that matters, and that is a fact about your role rather than about you. Finding that out in month six is worth considerably more than winning the promotion in month twelve.