Compare two or more job offers as total-comp curves over four years — vesting cliffs, bonuses, 401(k) match, and the crossover year computed, not vibed. Use...
---
name: offer-comparison
description: "Compare two or more job offers as total-comp curves over four years — vesting cliffs, bonuses, 401(k) match, and the crossover year computed, not vibed. Use when asked to compare job offers, which offer pays more over time, model my equity vesting, or is the startup offer actually worth it. Produces a year-by-year and cumulative comp table per offer, the crossover analysis, and negotiation levers ranked by dollar impact."
homepage: https://mohitagw15856.github.io/pm-claude-skills/skill/offer-comparison.html
metadata:
{
"openclaw": { "emoji": "🧮" }
}
---
# Offer Comparison Skill
Offers are quoted as feelings — "the startup has more upside" — but they resolve to numbers with dates on them. This skill computes the curves: what each offer pays in each of the next four years, where the lines cross, and which lever in the weaker offer would actually move it.
## What This Skill Produces
- **The comp table** — per-year and cumulative totals per offer, from the script
- **The crossover analysis** — which offer leads when, and what assumption that ranking is hostage to
- **The risk translation** — private equity restated honestly rather than at face value
- **Negotiation levers** — ranked by dollar impact per unit of asking-awkwardness
## Required Inputs
Ask for these if not provided:
- **Per offer:** base, bonus %, equity grant value, vest years, cliff months, vest frequency, 401(k) match (% and cap), any promised refreshers
- **The user's horizon** — expecting to stay 2 years or 4 changes the answer, because cliffs do
- **Equity risk view** — public RSUs count at face; for private equity, agree a discount with the user (e.g. 50–75% haircut pre-Series B) and pass the discounted number to the script *labeled as such*
## Programmatic Helper
```bash
python3 scripts/offer_comparison.py offers.json
cat offers.json | python3 scripts/offer_comparison.py - --json
```
Input shape in the script docstring. The script computes vesting month-by-month (a 12-month cliff releases the accrued year), bonuses and match annually, and reports the cumulative leader and crossover year. **It values equity at exactly the number you give it** — the risk adjustment is your input, visible, never a hidden assumption.
## Framework: The Judgment Around the Math
- **The cliff vs the horizon** — an 18-month expected stay makes year-4 equity fiction; compare at the user's actual horizon, not the grant's
- **A risky dollar ≠ a salary dollar** — never compare private paper to cash 1:1; show the comparison at 2–3 discount levels if the user resists picking one
- **Refreshers are policy, not promise** — model them only if written down; otherwise mention them as upside outside the table
- **Levers, ranked:** base (compounds into bonus and match) → equity grant → signing bonus (one-time, easiest yes) → cliff/start-date adjustments
## Output Format
---
# Offer Comparison: [A] vs [B]
## The Curves
[Script output: per-year, cumulative, leader, crossover]
## What the Ranking Is Hostage To
[The 1–2 assumptions that flip the answer — usually the private-equity discount and the stay-horizon — each shown with the flipped result.]
## Negotiation Levers
| Lever | Applied to | Moves 4-yr total by | Ask difficulty |
|---|---|---|---|
*Educational model, not financial advice — verify with a licensed professional before acting on it.*
---
## Quality Checks
- [ ] Equity discount for private companies is explicit and the user agreed to it
- [ ] The comparison is shown at the user's stated horizon, not only at 4 years
- [ ] The hostage-assumptions section shows the flipped ranking, not just names the risk
- [ ] Levers carry dollar impacts computed from the actual offers
- [ ] The disclaimer line appears in the artifact
## Anti-Patterns
- [ ] Do not compare a risky equity dollar to a salary dollar 1:1 — the discount is the analysis
- [ ] Do not hide the vesting cliff inside annual averages — year 1 with a cliff is its own story
- [ ] Do not model unwritten refreshers as income
- [ ] Do not declare a winner without naming what assumption the win depends on
- [ ] Do not present the model's output without its assumptions attached
don't have the plugin yet? install it then click "run inline in claude" again.