For two months, every time a PR went up for review, I wrote down what I predicted would happen. Then I wrote down what actually happened.
The gap between those two columns is the most useful thing I've ever measured about myself. It cured a fear I'd had for eight years.
The problem
I'd been afraid of code reviews since my first job. Not mildly — physically. Shoulders tense, shallow breathing, the urge to refresh the page every 90 seconds. I'd preemptively defend my code in the PR description. I'd check the reviewer's GitHub profile to gauge how harsh they'd be. I'd re-read my diff at 2am looking for the thing they'd catch.
This is not a personality quirk. This is a miscalibrated prediction system. My brain had a model: "code review → humiliation." And every review that went fine, my brain filed as "got lucky this time." The model never updated.
A therapist called this prediction error — the gap between what you expect and what happens. CBT has a technique for it: the behavioral experiment. You don't argue with the fear. You measure it. You write the prediction down, in advance, with numbers. Then reality has to compete with the fear on paper, where reality wins.
The setup
Before every PR, I wrote three predictions:
- Outcome: approved / changes requested / rejected (forced to pick one)
- Comment count: how many comments I'd get
- Severity: how harsh the feedback would feel, 0-10
After the review resolved, I wrote the actual values for each. 60 PRs. 60 predictions. 60 realities.
The result
52 of 60 predictions were more negative than reality.
| Prediction | What I predicted | What happened |
|---|---|---|
| "Rejected, 8 comments, severity 8" | Approved, 2 comments, severity 2 | |
| "Changes requested, 12 comments, severity 7" | Approved, 0 comments, severity 0 | |
| "Rejected, 15 comments, severity 9" | Changes requested, 4 comments, severity 3 | |
| "They'll think I'm senior enough for this" | Approved with a compliment |
The comment count was the most miscalibrated. I predicted an average of 9.4 comments per review. The actual average was 2.1. My brain was multiplying feedback by ~4.5x.
The severity prediction was second worst: predicted average 7.2, actual 2.4.
Only 8 predictions were accurate or too optimistic. Of those 8, six were PRs where I already felt good about the code — meaning my fear system only misfires when I'm anxious, which is exactly when I trust it least. The fear is least reliable precisely when it's loudest.
Why this worked when "just stop worrying" didn't
I'd tried affirmations. "I'm a good developer." "Code reviews are collaborative." They did nothing, because the fear wasn't an opinion — it was a forecast. You can't argue with a forecast. You can only outforecast it.
The behavioral experiment worked because it did three things affirmations can't:
- It forced specificity. "They'll reject it" is unfalsifiable. "Rejected, 8 comments, severity 8" is a testable claim. Half the fear dissolved at step 1, just by being forced to write numbers.
- It created a track record. After 20 PRs, I had a dataset. After 40, the dataset was undeniable. The fear couldn't say "this time will be different" because I had 40 data points saying it wouldn't be.
- It separated the prediction from the outcome. This is the key CBT move. I stopped experiencing reviews as "am I good enough?" and started experiencing them as "let's see how wrong my forecast is this time." The second framing has no self-worth in it. It's just a measurement.
By PR #30, I stopped writing predictions before reviews — not because I gave up, but because I didn't need to. The model had updated. I'd open a review and feel... curiosity. "Huh, I thought this would get hammered. Let's see."
What I actually did differently
Three changes, in order of impact:
- I log predictions for anything I'm anxious about, not just code reviews. Demos, interviews, on-call shifts, performance reviews. The miscalibration is the same everywhere. The fix is the same everywhere.
- I read the last 5 entries before any new anxious event. Not for motivation — for calibration. "Last 5 times I felt this way, reality was 4x less severe than I predicted." This is a 30-second operation and it works.
- I stopped defending code preemptively in PR descriptions. This was a safety behavior — a behavior that reduces anxiety in the moment but prevents the disconfirmation that would cure it. Once I had the data, I didn't need the defense.
The tool
I built a free interactive prediction tracker (no signup, no backend, runs in your browser) because doing this in a spreadsheet was too much friction and I kept skipping it.
It's at https://473185670.github.io/cbt-toolkit/ — along with a thought record, a cognitive distortion detector, a core belief drill, and 18 other tools. All vanilla JavaScript, all private (your data stays in your browser, never sent anywhere).
The prediction tracker computes your miscalibration automatically: average predicted severity vs. actual, disconfirmation rate, and a trend line so you can watch the gap close over time. Watching that gap close is the whole point.
If you want to try the 60-PR experiment: it's about 45 seconds per entry. 60 entries took me maybe 45 minutes total over two months. That 45 minutes replaced eight years of dread.
If this resonated, I write about CBT × developer productivity. The complete toolkit with 22 free interactive tools is at https://473185670.github.io/cbt-toolkit/












