A reviewer's comment reveals more work than the PR covers, and the courteous-looking reply is "I can extend it to those too if you prefer". That offer spends the one thing a reviewer has least of — a round-trip of attention — to authorise something you could already have finished and measured. Do the work, verify it, then report it; ask only when the answer changes what you build in a way you cannot cheaply undo. A finished patch with numbers is a smaller ask than a question. Use when a draft reply contains a conditional offer, a "whichever you prefer", or a request for permission to do something no one is blocking. Trigger terms: if you prefer, whichever you'd like, shall I, should I also, let me know if, worth fixing, I can extend, happy to, want me to.
A conditional offer feels like deference and reads like collaboration, so it survives every
pass of a draft. But it converts your machine time — which is abundant — into the
reviewer's attention, which in every house measured is the actual constraint on merging.
Worse, it arrives without the information that would let them answer well: "should I fix
the others?" is unanswerable until someone knows how many there are, whether one change
covers them, and whether the suite still passes. Doing the work produces that information
as a by-product, and then there is nothing left to ask.
The asymmetry is the whole point. A reviewer has judgement, context and merge rights; what
they lack is an hour of unattended compute. That is exactly what an offer withholds and a
finished patch supplies.
When to use
A draft reply contains "if you prefer", "whichever", "shall I", "want me to", "worth
doing?", or any sentence whose answer is a permission.
A review comment implies neighbouring work — more call sites, more tests, a second
component — and you are deciding whether to include it.
You are about to ask a maintainer to choose between two things you could try both of.
You have a hypothesis about scope and are tempted to socialise it instead of measuring it.
When NOT to use
The genuine questions — the cases where asking first is right, not avoidance:
⭐ The answer changes what you build and is expensive to undo: a public API shape, an
on-disk format, a new configuration key, which of two incompatible designs to pursue.
The work commits you to someone else's scope — a refactor across files they own, or a
ticket that is not yours to take.
A house rule requires discussion first (a KIP, "discuss in an issue before coding").
Then asking is the work; see discuss-in-issue-first.
The unknown is theirs, not yours: "did you intend this behaviour?" cannot be measured
from outside.
The work is large and the direction genuinely uncertain. Then ask with a measurement
attached, so the question costs them one read rather than one investigation.
The practice (checklist)
Grep the draft for permission-shaped sentences before anything else:
bash grep -inE "if you prefer|whichever|shall I|should I|let me know|worth (fixing|doing)|I can (extend|add|also)|want me to|happy to" DRAFT
For each hit, ask one question: could I answer this myself with machine time I
already have? If yes, it is a request for permission to work. Delete it and do the work.
Bound the work first, so "do it" stays cheap. Enumerate the sites before touching
any: a sweep, a grep, a count. If the enumeration comes back large enough to change the
PR's shape, that is a real question — and now it comes with a number.
Look for the one change that covers many sites. Neighbouring failures usually share a
cause; a guard inside a shared helper beats N copies of a guard, and it is a smaller diff
to review.
Verify each site individually AND the whole in order. Per-site green proves you fixed
what you claimed; the ordered full run proves you broke nothing. Report both counts.
Rewrite the reply as done-work: the number, what changed, the verification. Keep only
the questions that survived step 2 — and state those as constraints you hit, not as
choices you are handing over.
Rationalizations
Shortcut
Why it fails
"Asking is polite — it respects their ownership."
It respects the decision and spends the attention. In houses where 92% of PRs wait more than a month, a round-trip is the expensive currency and the decision is the cheap one.
"They might not want the extra scope in this PR."
Then they say so and you drop a commit — cheap, and the measurement stays useful. That is strictly better than them answering a question with no data in it.
"It might be wasted work."
An hour of unattended machine time against a review round-trip that can take days. And the "wasted" work still produced the count, which is the reply's best content.
"The offer shows I noticed the wider problem."
The fix shows it better, and the number shows it best. Noticing is not a contribution.
"I don't know if it's the same cause everywhere."
That is measurable. Run it; if the causes differ, that is the finding to report.
"It's a design decision and design decisions belong to maintainers."
Only when the design is actually open. Applying an existing helper to eight more call sites is not a design decision, it is typing.
RECEIPT
redis/redis#15636, 2026-08-13. A core developer reviewed a one-test fix and observed that
"many tests in this file won't work with --only", offering a fork: refactor all of them,
or fix the ones that bother us — then tagged a second maintainer for an opinion.
The drafted reply ended:
"@[reviewer] if the 8 above are worth fixing in this PR I can extend it to them, or keep
this one narrow and do them separately — whichever you prefer."
That sentence was cut with one line of feedback: "we don't ask before we've done it
ourselves and confirmed it works."
What doing it cost, in full:
one guard inside an existing helper — setup_slot_migration_with_delay populates on
the source and imports to the destination, so it structurally requires the range to be on
the source. One line there covered 3 of the 8 failing tests and all 33 of its call
sites.
five one-line calls in the tests that write to the source before reaching any helper.
total diff +47/-22, test-only, no production code.
What verifying it cost, and what it proved:
check
result
each of the 8 previously-failing tests, run alone
8/8 pass
the two tests the PR originally fixed, run alone
still pass
ordered full suite
104 assertions, 0 failures, 349 s — identical to the pristine baseline
⇒ The offer would have spent a round-trip in a repo whose median outside PR waits over a
month, to authorise work that took one guard, five lines, and an unattended hour. And the
reply it was replaced by is shorter: a count, a three-bullet description of the change,
and one genuinely open constraint that measurement could not resolve —
validateImportSlotRanges requires a single owner per range, so a split range cannot be
moved in one call, and no test needs that today.
⚠️ The surviving question is the shape to keep: it is stated as a limit of the
implementation, with the reason, and it is not handed over as a choice.
Lifecycle
Run the grep on every outward-facing draft — PR body, review reply, issue comment,
email. Permission-shaped sentences survive prose edits because they read as manners.
When a question survives, attach its measurement. "Should X also do Y?" plus "here is
what Y would touch and what it would cost" is one read instead of one investigation.
⚠️ A conditional offer inside a commit message or a PR body is the same defect — it
asks a reader to reply to a document. Put the finding in the text and the choice nowhere.
Report what the extra work found even if it is dropped. The count outlives the patch;
on this receipt the sweep incidentally produced the deterministic reproduction of a second
open issue.
1---2name: do-the-work-before-you-offer-it3description: A reviewer's comment reveals more work than the PR covers, and the courteous-looking reply is "I can extend it to those too if you prefer". That offer spends the one thing a reviewer has least of — a round-trip of attention — to authorise something you could already have finished and measured. Do the work, verify it, then report it; ask only when the answer changes what you build in a way you cannot cheaply undo. A finished patch with numbers is a smaller ask than a question. Use when a draft reply contains a conditional offer, a "whichever you prefer", or a request for permission to do something no one is blocking. Trigger terms: if you prefer, whichever you'd like, shall I, should I also, let me know if, worth fixing, I can extend, happy to, want me to.4---56# Do the work before you offer it78## Purpose910A conditional offer feels like deference and reads like collaboration, so it survives every11pass of a draft. But it converts your machine time — which is abundant — into the12reviewer's attention, which in every house measured is the actual constraint on merging.13Worse, it arrives without the information that would let them answer well: "should I fix14the others?" is unanswerable until someone knows how many there are, whether one change15covers them, and whether the suite still passes. Doing the work produces that information16as a by-product, and then there is nothing left to ask.1718The asymmetry is the whole point. A reviewer has judgement, context and merge rights; what19they lack is an hour of unattended compute. That is exactly what an offer withholds and a20finished patch supplies.2122## When to use2324- A draft reply contains "if you prefer", "whichever", "shall I", "want me to", "worth25 doing?", or any sentence whose answer is a permission.26- A review comment implies neighbouring work — more call sites, more tests, a second27 component — and you are deciding whether to include it.28- You are about to ask a maintainer to choose between two things you could try both of.29- You have a hypothesis about scope and are tempted to socialise it instead of measuring it.3031## When NOT to use3233**The genuine questions** — the cases where asking first is right, not avoidance:3435- ⭐ **The answer changes what you build and is expensive to undo**: a public API shape, an36 on-disk format, a new configuration key, which of two incompatible designs to pursue.37- **The work commits you to someone else's scope** — a refactor across files they own, or a38 ticket that is not yours to take.39- **A house rule requires discussion first** (a KIP, "discuss in an issue before coding").40 Then asking *is* the work; see `discuss-in-issue-first`.41- **The unknown is theirs, not yours**: "did you intend this behaviour?" cannot be measured42 from outside.43- **The work is large and the direction genuinely uncertain.** Then ask with a measurement44 attached, so the question costs them one read rather than one investigation.4546## The practice (checklist)4748- [ ] **Grep the draft for permission-shaped sentences** before anything else:49 ```bash50 grep -inE "if you prefer|whichever|shall I|should I|let me know|worth (fixing|doing)|I can (extend|add|also)|want me to|happy to" DRAFT51 ```52- [ ] **For each hit, ask one question**: *could I answer this myself with machine time I53 already have?* If yes, it is a request for permission to work. Delete it and do the work.54- [ ] **Bound the work first, so "do it" stays cheap.** Enumerate the sites before touching55 any: a sweep, a grep, a count. If the enumeration comes back large enough to change the56 PR's shape, that is a real question — and now it comes with a number.57- [ ] **Look for the one change that covers many sites.** Neighbouring failures usually share a58 cause; a guard inside a shared helper beats N copies of a guard, and it is a smaller diff59 to review.60- [ ] **Verify each site individually AND the whole in order.** Per-site green proves you fixed61 what you claimed; the ordered full run proves you broke nothing. Report both counts.62- [ ] **Rewrite the reply as done-work**: the number, what changed, the verification. Keep only63 the questions that survived step 2 — and state those as constraints you hit, not as64 choices you are handing over.6566## Rationalizations6768| Shortcut | Why it fails |69|---|---|70| "Asking is polite — it respects their ownership." | It respects the *decision* and spends the *attention*. In houses where 92% of PRs wait more than a month, a round-trip is the expensive currency and the decision is the cheap one. |71| "They might not want the extra scope in this PR." | Then they say so and you drop a commit — cheap, and the measurement stays useful. That is strictly better than them answering a question with no data in it. |72| "It might be wasted work." | An hour of unattended machine time against a review round-trip that can take days. And the "wasted" work still produced the count, which is the reply's best content. |73| "The offer shows I noticed the wider problem." | The fix shows it better, and the number shows it best. Noticing is not a contribution. |74| "I don't know if it's the same cause everywhere." | That is measurable. Run it; if the causes differ, *that* is the finding to report. |75| "It's a design decision and design decisions belong to maintainers." | Only when the design is actually open. Applying an existing helper to eight more call sites is not a design decision, it is typing. |7677## RECEIPT7879`redis/redis#15636`, 2026-08-13. A core developer reviewed a one-test fix and observed that80*"many tests in this file won't work with `--only`"*, offering a fork: refactor all of them,81or fix the ones that bother us — then tagged a second maintainer for an opinion.8283The drafted reply ended:8485> *"@[reviewer] if the 8 above are worth fixing in this PR I can extend it to them, or keep86> this one narrow and do them separately — whichever you prefer."*8788That sentence was cut with one line of feedback: **"we don't ask before we've done it89ourselves and confirmed it works."**9091What doing it cost, in full:9293- **one guard inside an existing helper** — `setup_slot_migration_with_delay` populates on94 the source and imports to the destination, so it structurally requires the range to be on95 the source. One line there covered **3 of the 8 failing tests and all 33 of its call96 sites**.97- **five one-line calls** in the tests that write to the source before reaching any helper.98- total diff `+47/-22`, test-only, no production code.99100What verifying it cost, and what it proved:101102| check | result |103|---|---|104| each of the 8 previously-failing tests, run alone | **8/8 pass** |105| the two tests the PR originally fixed, run alone | still pass |106| ordered full suite | **104 assertions, 0 failures, 349 s** — identical to the pristine baseline |107108⇒ The offer would have spent a round-trip in a repo whose median outside PR waits over a109month, to authorise work that took one guard, five lines, and an unattended hour. And the110reply it was replaced by is *shorter*: a count, a three-bullet description of the change,111and one genuinely open constraint that measurement could not resolve —112`validateImportSlotRanges` requires a single owner per range, so a split range cannot be113moved in one call, and no test needs that today.114115⚠️ The surviving question is the shape to keep: it is stated as a limit of the116implementation, with the reason, and it is not handed over as a choice.117118## Lifecycle119120- **Run the grep on every outward-facing draft** — PR body, review reply, issue comment,121 email. Permission-shaped sentences survive prose edits because they read as manners.122- **When a question survives, attach its measurement.** "Should X also do Y?" plus "here is123 what Y would touch and what it would cost" is one read instead of one investigation.124- ⚠️ **A conditional offer inside a *commit message* or a *PR body* is the same defect** — it125 asks a reader to reply to a document. Put the finding in the text and the choice nowhere.126- **Report what the extra work found even if it is dropped.** The count outlives the patch;127 on this receipt the sweep incidentally produced the deterministic reproduction of a second128 open issue.
Run npx skillmds@latest add serhiy-bzhezytskyy/do-the-work-before-you-offer-it in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
A reviewer's comment reveals more work than the PR covers, and the courteous-looking reply is "I can extend it to those too if you prefer". That offer spends the one thing a reviewer has least of — a round-trip of attention — to authorise something you could already have finished and measured. Do the work, verify it, then report it; ask only when the answer changes what you build in a way you cannot cheaply undo. A finished patch with numbers is a smaller ask than a question. Use when a draft reply contains a conditional offer, a "whichever you prefer", or a request for permission to do something no one is blocking. Trigger terms: if you prefer, whichever you'd like, shall I, should I also, let me know if, worth fixing, I can extend, happy to, want me to. It is listed under Docs & Writing on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
serhiy-bzhezytskyy (@serhiy-bzhezytskyy) published this skill. Their other Agent Skills are listed on their SkillMD profile.