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 agent writes the code, "look at my commits" stops being an argument. Everything that replaces it is subtractive: what got rejected, what did not escape, what got smaller. No system records any of it 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 doing the job produced it for free.
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 something else writes most of the artifact, and what you contributed sits in the difference between what it proposed and what shipped. Nothing stores that difference.
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 a reviewer can trust you 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, plus the specific thing you now check, is the cheapest credibility available. It also makes the five claims around it read 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. So 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 version control system dates the record, not 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 public, its date is not yours to set, and you wrote it when you had nothing to gain.
## 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, because it is the most useful thing a reviewer can read. That paragraph 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. The exception is everything with 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 in the file.
Most people read this in month eleven. Here is what archaeology recovers, 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 a label makes reconstructed evidence legitimate. "Reconstructed from PR history in October" is fine and honest. But presenting it as a log kept all year is a small lie about exactly the trait it claims. 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. That failure 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. That is a real skill, and an easily acquired one, but it is not what a promotion should 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. And every review process already has that failure mode. So announce it a full cycle ahead, and put the pull request practice from §3 into the team's norms. Then the evidence accumulates for everyone by default, rather than for the diligent only.
The structural fix is worth more than the request. Once "what the agent proposed and what I did instead" is a standing section in the template, every engineer produces this evidence as a byproduct of working. The old commit history had exactly that property, and it is the one worth getting back.
The last one is fatal, and a well-meaning process improvement usually introduces it.
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, say that the proposal makes the signal worthless within one quarter, and 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. They describe precisely the work that used to be invisible. Promotion aside, that file is also the most useful document you will own: the only honest record of what you were deciding while something else wrote the code.
Reviewing the file after six months tells you something no performance cycle will. If the entries are all small, the work is not exercising your judgment on anything that matters, and that is a fact about the job rather than about you. Finding that out in month six is worth considerably more than winning the promotion in month twelve.