---
name: offer-prep
description: Produce an offer-prep brief the recruiter takes into the offer call. Reads the candidate's interview record, the role's internal comp band, and any competing-offer signal, then drafts a recommended offer composition with rationale, anticipated negotiation, and escalation flags. Replaces ad-hoc "we'll figure it out when we get there" offer prep.
---
# Offer prep
## When to invoke
Invoke before the recruiter opens the offer conversation with a candidate, once the hiring manager has signed off "yes, we want to make an offer to this person." Typical use cases: senior+ IC roles, all manager+ roles, any role where the band has more than 15% spread between the floor and ceiling, any role where a competing offer signal has surfaced in the loop.
Do NOT invoke this skill for:
- **Auto-extending offers.** The output is a brief for a human to review and decide on, not a draft to send. The recruiter and hiring manager (and where required, the comp committee) approve before any number reaches the candidate.
- **Customer-facing or candidate-facing comms about competing offers.** This skill reasons about competing-offer signal internally. It does not draft messages to send to the candidate that reference, validate, or counter a competing offer — that is a recruiter judgment call.
- **Replacing the comp committee.** For any recommendation that lands above the published band, outside posted-pay-range jurisdictions, or that creates a new internal-equity exception, the brief sets `escalation: comp-committee` and stops. It does not pre-decide what the committee should approve.
## Inputs
- Required: `candidate_context` — path to or pasted contents of the candidate's interview record (Ashby/Greenhouse/Lever export, debrief notes, scorecards, recruiter-screen and hiring-manager-screen notes).
- Required: `role` — role title, level, and team, plus a path to the comp band for that level (see `references/1-comp-band-template.md`).
- Required: `comp_band` — the role's internal salary range, equity range, bonus structure, signing-bonus policy, and any geographic adjustment table.
- Optional: `market_data` — Levels.fyi, Pave, or Carta benchmarks for the role + level + geo. If omitted, the brief uses only the internal band and flags "market context not loaded."
- Optional: `competing_offers` — what the candidate has said about other processes (see `references/2-competing-offer-evidence.md`). Free-form OK, but the brief downgrades unverified claims (see Watch-outs).
- Optional: `posted_range` — the salary range posted on the job ad, if any. Required for jurisdictions with pay-disclosure laws (see Watch-outs).
## Reference files
Always read the following from `references/` before generating the brief. Without them, the recommendation is a guess.
- `references/1-comp-band-template.md` — the template for documenting a role's internal comp band. Replace the template's contents with your real bands per role + level. The skill's recommendation is bounded by this file.
- `references/2-competing-offer-evidence.md` — the format for capturing what the candidate has actually said about other offers, what is verified vs. claimed, and what the recruiter has done to validate it.
- `references/3-escalation-criteria.md` — the rules for when the brief sets `escalation: comp-committee` instead of recommending a number.
## Method
Run these six sub-tasks in order. Do not parallelize — the comp-band check in step 1 gates whether steps 2-5 produce a recommendation at all.
### 1. Pull the comp band first
Load `comp_band` for the role + level + geo before reading anything else about the candidate. Why first: it bounds the entire recommendation. If the candidate's signal points outside the band, the brief sets `escalation: comp-committee` immediately rather than fitting a story to a predetermined number. Reading the candidate first creates anchoring bias toward whatever the candidate said they wanted.
Output of this step: the floor, midpoint, and ceiling for base, bonus target, equity, and signing — plus any geographic adjustment factor.
### 2. Read the interview signal
From the candidate's interview record, extract:
- Level signal — did the loop calibrate the candidate at the role's level, above, or below? Cite the debrief.
- Stated motivations — what the candidate said matters about the role, compensation, team, location, growth. Cite the recruiter-screen and hiring-manager-screen notes.
- Risk signals — anything in the loop that suggests the offer needs to address a specific concern (commute, equity-vs-cash preference, role scope ambiguity, manager-fit anxiety).
If the loop did not calibrate level (e.g. mixed signal, fewer than 4 interviewers), surface that as a blocker rather than guessing a midpoint.
### 3. Factor competing offers explicitly
If `competing_offers` is provided, classify each:
- **Verified** — recruiter has seen the offer letter or has direct third-party confirmation. Treat as a real anchor.
- **Claimed-credible** — candidate stated specifics (company, role, comp numbers) that match the candidate's seniority and the named company's known band. Treat as soft anchor; flag for verification.
- **Claimed-unverified** — candidate mentioned "I have other things going on" or named a company without specifics. Do not anchor against this. Surface it but recommend ignoring for sizing purposes.
Why factor explicitly: the failure mode is recruiters letting unverified claims drive comp escalation. The brief makes the verification status visible in the rationale so the comp committee (or recruiter+HM) decides how much weight to give it.
### 4. Recommend offer composition
Using the band (step 1), the level signal (step 2), and the competing-offer weight (step 3):
- Place base within the band — typically band-midpoint for at-level candidates, above-midpoint for top-of-band loop calibration, at-floor only with explicit rationale.
- Place equity — bias toward the company's standard grant for the level unless the loop or competing offer justifies a stretch.
- Place signing — only if there's a specific reason (relocation, leaving unvested equity behind, bridging a comp gap that base can't close without breaking internal equity).
- Compute total Year-1 cash, Year-1 plus equity-grant-divided-by-vest, and equity at the company's most-recent 409a or last-round price.
### 5. Draft anticipated negotiation and closing
For each likely candidate pushback (drawn from interview signal + competing offers), write:
- The likely push (specific, citing the source).
- The recommended response (what the recruiter says).
- The walk-away threshold (what number or term the team will not exceed).
For the closing strategy: what to lead with for this candidate, what to address proactively, what timing pressure to apply or relieve, what role the hiring manager should play in the call.
### 6. Set escalation flag and "needs comp-committee review" fallback
Run the recommendation through `references/3-escalation-criteria.md`. If any criterion fires, set `escalation: comp-committee` in the output, list the criteria that fired, and stop. Do not soften the recommendation to avoid escalation.
Why a fallback rather than a forced recommendation: forcing a within-band number when the candidate signal is genuinely above-band trains the team to ignore the brief. The escalation path is the trustworthy behavior.
## Output format
```markdown
# Offer prep — <Candidate name> for <Role>, <Level>
escalation: <none | comp-committee>
escalation-reasons: <empty | bulleted list of triggered criteria>
## Recommended offer
- Base: $<X> (band: $<floor>–$<ceiling>, midpoint $<mid>)
- Bonus target: <Y>%
- Equity: <Z> RSUs / options, <vest> vest
- Signing: $<W> (reason: <relocation | unvested-equity-bridge | none>)
- Start date: <target>
- Year 1 cash: $<X + bonus-at-target + signing>
- Year 1 + equity-annualized: $<above + equity/vest-years>
## Why this composition
- Level calibration: <at-level | above | below>, source: <debrief link>
- Stated motivations: <bulleted, with source notes>
- Competing-offer weight: <none | verified | claimed-credible | claimed-unverified>
## Anticipated negotiation
- Likely push: <specific>
- Source: <interview note or competing-offer record>
- Recommended response: <specific>
- Walk-away: <number or term>
## Closing strategy
- Lead with: <what to emphasize>
- Address proactively: <concerns from loop>
- Timing: <pressure to apply or relieve, with reason>
- Hiring manager role: <what they do on the call>
## Open questions for the team
- <Anything the brief cannot resolve>
## Pay-disclosure compliance
- Posted range: $<floor>–$<ceiling> (jurisdiction: <state/country>)
- Recommendation within posted range: <yes | NO — escalate>
```
## Watch-outs
- **Pay-equity drift.** Repeated above-midpoint offers for one demographic pattern (e.g. external hires vs. internal promotes, one gender, one region) accumulate into pay-equity exposure even when each individual offer is defensible. Guard: the brief includes a `pay-equity-check` block that lists the last five offers at the same level + geo and their band-position. If the new recommendation would extend a pattern, the brief sets `escalation: comp-committee` regardless of size.
- **Jurisdictional pay-disclosure laws.** In states/countries with posted-pay-range laws (CA, CO, NY, WA, IL, etc.), the offer must fall within the posted range. Guard: the `posted_range` input is required for those jurisdictions; if missing, the brief refuses to produce a number and instead asks the recruiter to confirm the posted range.
- **Unverified competing-offer claims.** Candidates sometimes inflate or invent competing offers. Guard: every competing-offer entry is classified verified / claimed-credible / claimed-unverified per step 3, and the rationale section makes the classification visible so the team decides how much weight to give it. Unverified claims never drive a recommendation outside the band.
- **Protected-class proxies.** Negotiation strategy must not consider candidate demographics, current-employer pay history (illegal to ask in many jurisdictions), or proxies for either. Guard: the method reads only the interview record, the comp band, and the explicit `competing_offers` input — it does not request or accept current-salary or demographic fields.
- **Don't auto-extend.** The brief produces a recommendation. Humans approve and extend. Guard: the output never includes recipient email, signature, or send-ready offer-letter language.
# Comp band — TEMPLATE
> Replace this template's contents with your real comp bands per role + level
> + geo. The offer-prep skill reads this on every run; without your real
> bands, the recommendation is unbounded and the escalation logic in
> `3-escalation-criteria.md` cannot fire correctly.
## How to use
One file per role family (e.g. `eng-comp-band.md`, `gtm-comp-band.md`, `product-comp-band.md`) lives in your private fork of the references directory. The skill loads the relevant file based on the `role` input. Each file follows the structure below.
## Role family: REPLACE_ME (e.g. Engineering)
### Level matrix
| Level | Title pattern | Band midpoint base | Equity tier |
|---------|---------------------------|--------------------|-------------|
| L3 | Software Engineer | $REPLACE | T1 |
| L4 | Senior Software Engineer | $REPLACE | T2 |
| L5 | Staff Software Engineer | $REPLACE | T3 |
| L6 | Principal | $REPLACE | T4 |
| M4 | Engineering Manager | $REPLACE | T2 |
| M5 | Senior Engineering Manager | $REPLACE | T3 |
### Per-level bands
For each level, document floor / midpoint / ceiling. The skill uses these as hard bounds. Above-ceiling recommendations trigger `escalation: comp-committee`.
#### L4 — Senior Software Engineer (example)
| Component | Floor | Midpoint | Ceiling |
|-----------------|--------------|--------------|--------------|
| Base | $REPLACE | $REPLACE | $REPLACE |
| Bonus target | REPLACE % | REPLACE % | REPLACE % |
| Equity (RSUs) | REPLACE | REPLACE | REPLACE |
| Signing maximum | $REPLACE | — | $REPLACE |
Vest schedule: REPLACE (e.g. 4-year, 25/25/25/25, 1-year cliff).
Equity priced at: REPLACE (e.g. last-round preferred, current 409a).
#### L5 — Staff Software Engineer
(repeat structure)
### Geographic adjustment table
| Geo | Adjustment factor |
|---------------------|-------------------|
| US Tier 1 (SF/NYC) | 1.00 |
| US Tier 2 | REPLACE |
| US Tier 3 / remote | REPLACE |
| EU Tier 1 (London) | REPLACE |
| EU Tier 2 | REPLACE |
| LATAM remote | REPLACE |
Apply the factor to base. Bonus target and equity are typically NOT geo-adjusted — confirm with your comp framework.
### Signing-bonus policy
When signing is allowed, and the maximum:
- Relocation bridging: up to $REPLACE, repayable on REPLACE schedule.
- Unvested-equity bridging: up to estimated value of REPLACE months of unvested grant at prior employer. Requires documentation.
- Pure comp-gap closing without one of the above reasons: NOT ALLOWED.
### Internal-equity guardrail
If the recommendation would place the candidate above any current employee at the same level + geo by more than REPLACE %, the brief sets `escalation: comp-committee` regardless of band position.
### Last reviewed
REPLACE_DATE — refresh whenever bands change so the brief's recommendation is bounded by current numbers.
# Competing-offer evidence — TEMPLATE
> Capture what the candidate has actually said about other offers, what the
> recruiter has done to validate it, and the resulting verification class.
> The offer-prep skill reads this format and assigns weight per the rules
> in `SKILL.md` step 3.
## Why this matters
Recruiters routinely let unverified competing-offer claims drive comp escalation. That trains candidates to claim more and trains the team to spend above-band on signal that may not exist. This template forces the classification to be explicit so the comp committee or recruiter+HM decides how much weight to give each entry.
## Format
One block per claimed competing offer.
### Competing offer — REPLACE_COMPANY_NAME
- **Source of claim**: where the candidate raised it (recruiter screen on REPLACE_DATE, debrief, post-loop email, etc.)
- **Specifics provided**:
- Company: REPLACE (or "not disclosed")
- Role: REPLACE (or "not disclosed")
- Stage of process: REPLACE (e.g. "verbal offer", "final round", "early")
- Comp numbers cited: REPLACE (base, equity, signing — or "not disclosed")
- Decision deadline cited: REPLACE
- **Verification attempted**:
- Offer letter seen: yes / no
- Third-party confirmation (e.g. mutual contact): yes / no, with detail
- Sense-check against the named company's known band: matches / above / below
- **Verification class** (pick one):
- `verified` — offer letter seen or direct third-party confirmation
- `claimed-credible` — specifics match seniority and named company's known band
- `claimed-unverified` — vague mention, no specifics, no validation possible
- **Weight assigned by skill**: derived from class above. The skill never upgrades a class — only the recruiter can mark something as `verified` after seeing the document.
## Multiple offers
If the candidate has multiple competing offers, repeat the block per offer. The skill will use the highest-weighted entry as the anchor. Two `claimed-credible` offers do not aggregate into a `verified` anchor — they remain `claimed-credible` individually.
## What NOT to capture here
- Current-salary numbers from the candidate's existing employer. Asking for these is illegal in many US states and several EU jurisdictions. The brief does not use current-salary anchoring under any circumstance.
- Demographic information about the candidate.
- Information from background-check or reference-call sources — those belong in their own pipeline, not in offer-prep evidence.
## Last reviewed
REPLACE_DATE
# Escalation criteria — TEMPLATE
> The offer-prep skill runs the proposed recommendation through these
> criteria as the last step. If any fire, the brief sets
> `escalation: comp-committee`, lists the triggered criteria, and stops.
> Do not soften a recommendation to avoid escalation — that defeats the
> purpose of the rule.
## Hard escalation triggers
Any single trigger sets `escalation: comp-committee`.
1. **Above-band base.** Recommended base exceeds the level's ceiling in `1-comp-band-template.md`.
2. **Above-band equity.** Recommended equity grant exceeds the level's equity ceiling, or stretches more than REPLACE % above the standard grant for the level.
3. **Above-policy signing.** Recommended signing exceeds the maximum in the signing-bonus policy, or falls outside the allowed reasons (relocation, unvested-equity bridging).
4. **Internal-equity breach.** Recommendation would place the new hire more than REPLACE % above any current employee at the same level + geo (per the internal-equity guardrail).
5. **Outside posted pay range.** Recommendation falls outside the `posted_range` for any jurisdiction with pay-disclosure laws (CA, CO, NY, WA, IL, and others — confirm with your legal team on a current basis).
6. **Pay-equity pattern risk.** The new recommendation would extend a pattern of above-midpoint offers within one demographic dimension over the last REPLACE offers at the same level + geo.
## Soft triggers — flag but do not block
These do not force comp-committee escalation, but the brief surfaces them in `escalation-reasons` for visibility.
- Loop calibration disagreement — the level signal from the debrief is split (e.g. 2 hire-at-level, 2 hire-above-level). The brief recommends band-midpoint and flags the split.
- Competing-offer claim is `claimed-credible` and would push the recommendation above midpoint. The brief surfaces the offer's verification status and asks the team to validate before relying on it.
- Candidate stated motivations include "comp is my top priority" plus the recommendation is at or below midpoint. The brief flags the acceptance-rate risk.
## What "comp-committee review" means in this template
Replace this section with your team's actual escalation path. Typical shape:
- Submit the brief plus the triggered criteria to the comp committee (named members: REPLACE).
- Committee SLA: REPLACE business days.
- Committee may approve as-recommended, approve with modifications, or decline (in which case the recruiter returns to the candidate with the in-band offer or a "we cannot proceed" message).
- Committee decisions are logged in REPLACE (e.g. an Ashby comment, a Notion log) for pay-equity audit purposes.
## Last reviewed
REPLACE_DATE