Harness Engineering / Evidence of Judgment / the promotion case

The work that proves you're senior leaves no trace.

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.

who it's for · the engineer assembling a case, and the manager who has to read forty of them
time cost · about a minute a day, if it happens at the moment rather than in review season
what counts · defined by the Seniority Ladder. This page is about having it when asked
what it is not · a way to look busy. §7 is the list of ways this goes wrong
Leaves a trace
Merged code, closed tickets, shipped features. Abundant now, and therefore no longer discriminating.
Traceable only on purpose
Rejections, scope reductions, catches before merge. Real work, invisible unless written down within the hour.
The absence
The incident that never happened. Your best work produces nothing observable, which is why it needs an argument rather than a link.
0 The problem

Your evidence used to be a side effect of working

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.

where the evidence wentthe whole problem
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.

1 What counts

Six classes, and the rung each one argues for

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.

evidence classes, strongest first
ClassThe artifactArgues 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
The counterintuitive one

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.

2 15 seconds

The rejection log

One line, written in the moment. The moment is not negotiable: nobody has ever successfully remembered these on a Sunday in November.

rate one to three a week field cost if wrong
~/judgment.md · plain text, yours, portableone line each
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

The one field that matters

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.

Two practical rules

  • Keep it somewhere you own. A plain file in your own notes or a personal repo, not a company wiki you lose access to on your last day. The evidence should outlive the job, because the next conversation about your seniority may not be at this company.
  • One to three lines a week is the honest rate. If you are writing twenty, you are logging keystrokes rather than judgment, and the file will be useless because nobody reads a log that long. If you are writing zero for a month, that is a genuine finding about the month and worth sitting with.
3 Durable

The strongest version is not a log at all

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.

three lines at the bottom of a PR descriptionthe durable record
## 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.

Then the private log is just an index

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.

4 Salvage

Reconstructing a year you did not record

Most people read this in month eleven. Here is what archaeology recovers, and an honest estimate of how much.

starting points, if you use GitHubarchaeology
# 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"

Then, in descending order of yield

  1. Best Review comments the author acted on. A comment plus the commit that answered it is a documented catch, and the timestamps prove it happened before merge.
  2. Good Design documents where the final scope differs from the first draft. The diff between versions is a reduction you can point at, and version history usually survives.
  3. Good Incidents you were on. Look for what you changed afterwards, not for how fast the team resolved it.
  4. Underrated Ask two colleagues: "what is something I stopped from happening?" People remember your refusals far better than you do, because they experienced them and you have moved on.
  5. Lost Nearly every rejection that never reached a pull request. This is the bulk of it, and it is gone.
Say which it is

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.

5 One page

The packet: six claims, one page

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.

the shape of an entryclaim · evidence · consequence
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.

Four rules for the page

  • Lead with the escape. It buys the credibility that carries the other five.
  • No feature lists. If anyone staffed on the same project could have written that line, cut it.
  • Consequence in the domain, not the codebase. "Prevents duplicate charges" beats "improves correctness". The reader is deciding what to trust you with, not admiring the fix.
  • Link, do not paste. Six links they can check beats six paragraphs they have to believe.
6 The reader

If you are the one reading forty of these

Two obligations, and the second is the one that gets skipped.

Ask for different things

  • What did you turn down, and what would it have cost if you had been wrong?
  • What got smaller because you were in the room?
  • What did you approve that broke, and what do you check now that you did not check before?
  • Which rule in our harness exists because of you? Which one did you remove?

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.

The obligation that gets skipped

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.

7 Five ways

Five ways this turns into theatre

The last one is fatal, and a well-meaning process improvement usually introduces it.

  1. Inflation Logging every rejected autocomplete. Fifty entries of no consequence dilute four that mattered to zero, because the reader stops reading at entry six.
  2. Borrowed credit "I shipped forty pull requests" where the agent wrote them. Reviewers can tell, and the claim contaminates the true ones sitting next to it.
  3. The wall of links Thirty URLs and no claims. It asks the reader to do your synthesis. They will not, so they fall back on their prior impression of you.
  4. Dressed-up archaeology Reconstruction presented as a contemporaneous log. See §4: label it and it is fine, hide it and the packet misrepresents the exact trait under discussion.
  5. Rejections as a metric The moment somebody counts rejection rate, engineers manufacture rejections, and no dashboard can tell the manufactured ones from the real ones. Goodhart arrives here faster than almost anywhere else, because the supply costs nothing and never runs out.
Why the last one deserves a fight

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.

8 Today

The version that takes a minute a day

Two habits. Everything else on this page is elaboration on these.

  1. Habit one On the next pull request, add one sentence: the agent proposed X, I did Y, because Z. Repeat on every pull request where that sentence is not trivial.
  2. Habit two Keep one plain file. Add a line whenever you turn something down or talk something smaller, with the cost had you been wrong. One to three lines a week.

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.

The real reason to keep it

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.