Un Claude Skill que toma el nivel de un puesto, su geografía y un export de encuesta de compensación (Radford, Pave, Carta), y produce una recomendación estructurada de banda salarial por componente (base, equity, bonus / OTE) con percentil nombrado, citación de la encuesta-fuente y las notas de calibración que el recruiter lleva a la llamada de oferta. Reemplaza el malabarismo de pestañas y planillas del recruiter con un único documento que el hiring manager y el aprobador de finanzas pueden firmar. Publica el rango público (compatible con NYC LL 32-A, CO/CA/WA pay-transparency) como output separado.
Cuándo usarlo
Estás publicando un nuevo puesto y necesitas un rango público con fuente defendible (no el framing vago de industry standard, ni percentil 75 sin nombrar la encuesta o la geografía).
Estás preparando una oferta y necesitas la banda que el hiring manager pueda aprobar sin medio día de ida y vuelta con finanzas.
Estás auditando bandas de compensación existentes trimestralmente y quieres una comparación estructurada de “lo que pagamos” vs. “lo que dice la encuesta” por familia de puesto.
Cuándo NO usarlo
Decisiones unilaterales de compensación fuera de una cadena de aprobación. El skill produce una recomendación. La filosofía de compensación y la matriz de aprobación son propiedad de People Ops / Finanzas / Comité de Compensación. El skill los informa; no los reemplaza.
Equity comp en startups pre-Serie-B. El benchmarking de equity en etapas muy tempranas tiene más que ver con la cap table específica de la firma y la trayectoria de dilución que con datos de mercado. Los números de la encuesta no aplican ahí.
Generación de scripts de negociación. El skill emite una banda; no escribe el lenguaje de negociación. El lenguaje de negociación de compensación auto-generado se lee como frío y daña la candidate experience.
Decisiones de excepción específicas de candidato. “¿Podemos ofrecer 15% por encima de la banda para este candidato?” es una pregunta para el hiring manager y finanzas, no para el skill. El skill informa al exponer la banda; no aprueba excepciones.
Geografías donde la encuesta tiene datos finos. Las encuestas cubren bien EE.UU., UE y los principales mercados de APAC; los datos de mercados emergentes (LatAm, África, APAC más pequeño) son más finos. El skill marca las geografías de bajo-N en la salida.
Setup
Coloca el bundle. Pon apps/web/public/artifacts/compensation-benchmark-skill/SKILL.md en tu directorio de skills de Claude Code.
Configura la fuente de la encuesta. El skill lee exports de Radford, Pave, Carta o un CSV personalizado. El schema por fuente vive en references/1-survey-source-schemas.md. El skill no llama directamente a las APIs de las encuestas — los exports pasan por la ruta de acceso aprobada de tu compensation analyst.
Define la filosofía de compensación de la firma. ¿En qué percentil paga la firma (50, 60, 75)? ¿La suma de base+equity apunta a un percentil objetivo, o cada uno se calibra por separado? La filosofía vive en references/2-comp-philosophy-template.md y es el input contra el cual el skill calibra.
Configura el output de la cadena de aprobación. El skill emite el rango público como output separado (compatible con NYC LL 32-A, CO/CA/WA pay-transparency). Conecta ese output a tu paso de publicación de oferta (descripción de puesto en Greenhouse / Ashby), o cópialo a mano, según el proceso de tu equipo.
Dry-run sobre una oferta cerrada. Haz benchmark de un puesto que cerraste el trimestre pasado. Compara la banda del skill contra lo que la oferta fue en realidad. Si la divergencia es grande, o el export de la encuesta está fuera de ciclo, o el archivo de filosofía de la firma no coincide con cómo se están aprobando las ofertas en realidad.
Qué hace realmente el skill
Cinco pasos. El orden mantiene los lookups deterministas de la encuesta antes de la calibración impulsada por LLM, porque dejar que el modelo parafrasee los números de la encuesta introduce drift que el recruiter no puede auditar.
Validar la definición del puesto. Verificar que el nivel, la geografía y la función del puesto estén presentes y coincidan con valores en el export de la encuesta. Detener en campos faltantes o ambiguos (“Senior Engineer” sin un nivel en la escalera de la firma es ambiguo).
Buscar percentiles de la encuesta. Lookup determinista, no LLM. Para cada uno de base, equity (anualizado) y bonus / OTE, sacar los percentiles 25 / 50 / 60 / 75 / 90 del export para la celda (nivel, geografía, función) coincidente. Si la celda tiene menos respondientes que el umbral de tamaño de muestra documentado por la encuesta (varía por encuesta: Radford típicamente 5+, Pave típicamente 10+), marcar low-N y rehusarse a recomendar una banda basada en percentiles — hacer fallback a (nivel, función) más amplio sin geografía o a una geografía expandida (ej. “US-wide” en vez de “Bay Area”).
Calibrar contra la filosofía de la firma. Leer la filosofía de compensación de la firma. Aplicar el percentil objetivo a los números de la encuesta. La salida es una banda estructurada por componente:
Base: target_pct de la encuesta, con un rango de ±10% para absorber variación por nivel del candidato.
Equity: igual; convertir a valor en dólares al strike price actual de la firma para nuevos grants, documentar la matemática.
Bonus / OTE: target_pct sobre el OTE; dividir base/variable según el ratio de la firma para esa función.
Componer el rango público. Bajo NYC LL 32-A y los requisitos de pay-transparency de CO/CA/WA, la publicación pública necesita un rango de salario base. Default: “min del borde inferior de la banda al max del borde superior de la banda, expresado como un único rango salarial.” Si el puesto cruza estados de EE.UU. con distintos umbrales de transparencia, aplica el rango más amplio. El skill emite esto como output separado para uso directo en la JD.
Emitir el reporte de recomendación + registro de auditoría. El reporte tiene: bandas por componente con percentil citado y encuesta fuente, notas de calibración, advertencias de low-N o thin-data, y el rango público. El registro de auditoría es una línea JSONL: puesto, geografía, nivel, percentil objetivo, fuente de la encuesta, fecha del export de la encuesta, banda recomendada — para la auditoría de pay-equity de la firma más adelante en el año.
Realidad de costos
Por puesto evaluado, en Claude Sonnet 4.6:
Tokens de LLM — típicamente 5-8k de entrada (definición del puesto + filas del export de la encuesta + filosofía + instrucciones del skill) y 1-2k de salida (reporte estructurado). Aproximadamente $0,04-0,08 por puesto. Insignificante.
Costo de acceso a la encuesta — las suscripciones a las encuestas son el costo limitante (Radford, Pave, Carta van de $15K-$80K+ anuales según cobertura). El skill asume que el compensation analyst ya tiene acceso; no cambia esa matemática.
Tiempo del recruiter / compensation analyst — la ganancia. Componer a mano una recomendación de compensación lleva 30-90 minutos por puesto (lookup en encuesta + malabarismo de planilla + aplicación de filosofía + redacción de la nota de calibración). El skill toma 5-10 minutos incluyendo el sanity check del dry-run.
Tiempo de setup — 30 minutos una sola vez para el archivo de filosofía y la integración del export de encuesta. El archivo de filosofía rara vez se revisa; los exports de encuesta se refrescan trimestralmente.
Métrica de éxito
Trackea tres números, trimestralmente:
Tasa de aceptación de ofertas en 3 semanas — la compensación calibrada impulsa la aceptación. Por debajo de 60% en tu geografía estás pagando de menos; por encima de 90% puedes estar pagando de más. Ambas direcciones importan; el número correcto depende de la filosofía de compensación de la firma (las startups con alto equity aceptan base más bajo; las firmas mid-stage con alto base aceptan base más alto).
Tasa de edición de la banda post-skill — la proporción de bandas recomendadas por el skill que el hiring manager o finanzas editan antes de aprobar. Debería estar entre 10-25%. Por encima de 40% significa que el archivo de filosofía no refleja el comportamiento real de aprobación; por debajo de 5% significa que el panel está sellando con el visto bueno (el modo de falla contra el cual el skill está diseñado).
Drift de la auditoría de pay-equity — en la revisión anual de pay-equity, ¿las recomendaciones del skill correlacionan con dónde aterrizaron las ofertas reales? Si la auditoría revela brechas de equity que las recomendaciones del skill habrían cerrado, el skill está haciendo su trabajo; si la auditoría revela brechas que las recomendaciones del skill habrían ampliado, el archivo de filosofía o la calibración están sesgados.
vs alternativas
vs los reportes de Pave / Carta / Radford / Mercer directamente. Los reportes son los datos fuente; el skill los compone en una recomendación por puesto. Elige solo los reportes si tu compensation analyst vive en ellos y el recruiter solo consume “dime el percentil 75”. Elige el skill si el recruiter necesita la nota de calibración + rango público + registro de auditoría sin el analista en el loop para cada puesto.
vs estilo “qué debería pagar a un senior engineer en NYC” en ChatGPT. El chat genérico devuelve datos parafraseados de encuestas sin trail de auditoría y sin fuente fijada por versión — eso no es defendible al momento de la auditoría de pay-equity. El skill cita el export de la encuesta por nombre y fecha.
vs plantillas de planilla. Las plantillas están bien hasta que la filosofía de la firma cambia o el export de la encuesta se refresca; ahí cada plantilla guardada se vuelve obsoleta silenciosamente. El skill lee de fuentes actuales en cada corrida.
vs no hacer benchmarking. El default en muchas firmas más pequeñas. Modo de falla predecible: las brechas de pay-equity emergen en la auditoría anual, y al recruiter se le culpa por ofertas individuales que estaban dentro de la práctica normal de la firma. El benchmarking defendible es la intervención más barata contra esto.
Watch-outs
Staleness del export de encuesta.Guard: el skill lee la metadata fechada del export y advierte si el export tiene más de 6 meses. Los datos de encuesta cambian más rápido que anualmente; el refresh trimestral es el piso.
Mapeo geográfico erróneo.Guard: el skill empareja la geografía del puesto contra la taxonomía geográfica de la encuesta de forma explícita (“SF Bay Area” de Pave no es la misma celda que “San Francisco MSA” de Radford). Si el match es ambiguo, el skill se detiene y le pide al recruiter desambiguar en lugar de elegir un default.
Celda de bajo N.Guard: el skill se rehúsa a recomendar una banda basada en percentiles cuando la celda de la encuesta tiene menos respondientes que el umbral documentado por la encuesta. Hace fallback a una celda más amplia (función más amplia, geografía más amplia) y deja constancia del fallback.
Drift de comparación de equity.Guard: los valores de equity se anualizan y se convierten al strike price actual de la firma. La matemática de conversión está documentada en el reporte. El registro de auditoría guarda los valores crudos y convertidos para que auditorías futuras puedan re-derivar.
Rango público demasiado estrecho.Guard: si el rango público es tan estrecho que funciona como un único número, el skill advierte. Publicar “$140K-$145K” es una violación del espíritu (y posiblemente de la letra) de NYC LL 32-A, que requiere un rango de “buena fe”. El skill aplica un ancho mínimo de banda por geografía.
Propagación de sesgo a través de la compensación histórica.Guard: si el archivo de filosofía de la firma se calibra por “matchear lo que hemos pagado en esta banda antes”, el skill propaga las brechas de pago que existan en los datos históricos. El skill marca esto cuando el matching de filosofía sigue de cerca el pago histórico en lugar de los percentiles de la encuesta, y recomienda que el compensation analyst corra un check separado de pay-equity.
Stack
El bundle del skill vive en apps/web/public/artifacts/compensation-benchmark-skill/ y contiene:
SKILL.md — la definición del skill
references/1-survey-source-schemas.md — schemas de export por fuente (Radford, Pave, Carta, CSV personalizado)
references/2-comp-philosophy-template.md — archivo de filosofía por firma rellenable
Herramientas que el workflow asume que usas: Claude (el modelo), Ashby o Greenhouse (el ATS, para publicar el rango público).
---
name: compensation-benchmark
description: Take a role's level/geography/function plus a comp-survey export (Radford, Pave, Carta, or custom CSV), and produce a structured pay-band recommendation per component (base, equity, OTE) with cited percentiles, calibration against the firm's philosophy, and a public-facing range compliant with NYC LL 32-A and CO/CA/WA pay-transparency requirements. Never approves an offer; never auto-publishes.
---
# Compensation benchmark
## When to invoke
Use this skill when a recruiter or comp analyst needs a per-role pay band based on a survey export and the firm's comp philosophy. Take a role definition, a survey export, and the philosophy file as input and return a structured benchmark report plus a public-facing range.
Do NOT invoke this skill for:
- **Unilateral comp decisions outside the firm's approval matrix.** The skill recommends; People Ops / Finance / Comp Committee approve.
- **Equity at pre-Series-B startups.** Survey data is too thin and firm-cap-table-specific at that stage.
- **Negotiation-script generation.** Different workflow.
- **Approving exception bands** ("can we go 15% above?"). The skill informs; the hiring manager and finance approve.
## Inputs
- Required: `role_definition` — JSON with `level` (firm's ladder, e.g. `L5`), `geography` (e.g. `San Francisco MSA`), `function` (e.g. `software-engineering`).
- Required: `survey_export` — path to a survey export. Schema must match one in `references/1-survey-source-schemas.md`.
- Required: `philosophy` — path to the firm's compensation philosophy file. See `references/2-comp-philosophy-template.md`.
- Optional: `candidate_signal` — free-text note about the candidate (current comp, competing offers, etc.). Used in the calibration note, NOT to skew the recommended band.
## Reference files
- `references/1-survey-source-schemas.md` — per-source schemas with field mapping.
- `references/2-comp-philosophy-template.md` — fillable philosophy file.
## Method
Five steps.
### 1. Validate the role definition
Confirm `level`, `geography`, `function` are present and match values in the survey export. If `level` is on the firm's ladder but the survey uses a different ladder, look up the mapping in the philosophy file. If no mapping exists, halt and ask the user to add it.
If `geography` is ambiguous (e.g. "Bay Area" — does that include South Bay, East Bay, North Bay, the entire MSA?), halt and ask the user to specify against the survey's geography taxonomy.
### 2. Look up survey percentiles
Deterministic lookup — do NOT paraphrase the survey. For each of `base_salary`, `equity_annualized`, `ote` (or `bonus` if non-sales), pull the 25th / 50th / 60th / 75th / 90th percentiles for the matched (level, geography, function) cell.
Check the cell's sample size. If it's below the survey's documented threshold (Radford 5+, Pave 10+, Carta 15+ for equity, custom CSV per the schema's `min_sample_size` field), flag low-N. Fall back to a broader cell:
- First fallback: same level, same function, broader geography (e.g. US-wide).
- Second fallback: same level, same function, all geographies.
Document the fallback chain in the report. Do NOT silently fall back without surfacing.
### 3. Calibrate against firm philosophy
Read the philosophy file. The philosophy specifies the target percentile per component (e.g. base at 60th percentile, equity at 75th percentile, OTE at 50th percentile for sales).
For each component, compute:
- Recommended midpoint = survey's `target_percentile` for the cell
- Band width = midpoint × ±10% (default; configurable per component in the philosophy)
- Lower edge = midpoint × 0.9, upper edge = midpoint × 1.1
If the philosophy specifies a different band-width policy (e.g. wider band for senior roles where individual variance is larger), use that instead.
For equity: convert annualized survey value to dollar grant size at the firm's current strike price. Document the math in the report (`grant_value = annualized_value × vesting_period / strike_price`).
### 4. Compose the public-facing range
Compute the public-facing base salary range:
- Lower edge of public range = lower edge of base band
- Upper edge of public range = upper edge of base band
- Format: e.g. `$170,000-$210,000 USD per year`
Validate band width against the geography's pay-transparency requirements:
- NYC (LL 32-A): "good faith" range required; band narrower than ~15% width raises legal exposure.
- CO (Equal Pay for Equal Work Act): range required, no specific width threshold but functional good-faith requirement.
- CA (SB 1162): range required for postings if the role is to be performed in CA.
- WA (Pay Transparency Act): range required.
If the role straddles multiple jurisdictions, the broadest range applies. If the range is below 15% width, emit a warning (the band is at the edge of "good faith" — consider widening before publishing).
### 5. Emit the report + audit record
Write the report to stdout (or the calling environment's report destination). Append one JSONL line to `audit/<YYYY-MM>.jsonl` with: `role`, `geography`, `level`, `function`, `survey_source`, `survey_export_date`, `philosophy_version`, `target_percentiles`, `recommended_bands`, `public_range`, `low_n_flag`, `fallback_chain` (if any).
The audit record supports the firm's annual pay-equity audit. No PII; this is about the band, not about a specific candidate.
## Output format
```markdown
# Comp benchmark — {role} — {level} — {geography}
Generated: {ISO timestamp} · Skill v1.0 · Model: claude-sonnet-4-6
Survey: {Radford 2026-Q2 / Pave 2026-04 / etc.} · Philosophy: {firm-philosophy.json v3}
{LOW-N WARNING if any component fell back}
## Recommended bands
### Base salary (target: 60th percentile)
- Survey 60th percentile: $185,000
- Recommended band: $166,500 - $203,500
- Calibration note: Tight band (±10%); widen to ±15% for cross-level candidates.
### Equity (target: 75th percentile, 4-year vest)
- Survey 75th percentile annualized value: $90,000
- Total grant value: $360,000 over 4 years
- At firm strike $5.20: 69,231 shares
- Recommended band: 62,300 - 76,200 shares (±10%)
### Cash bonus (target: 50th percentile)
- Survey 50th percentile: $20,000 (annual target)
- Recommended band: $18,000 - $22,000
## Public-facing range (NYC LL 32-A / CO/CA/WA compliant)
`$166,500 - $203,500 USD per year, plus equity grant and target bonus`
Band width: 22% — within "good faith" thresholds.
## Provenance
- Survey: Radford Q2-2026 (export dated 2026-04-15)
- Survey cell sample size: 42 (above Radford's 5+ threshold)
- Philosophy: firm-philosophy.json v3 (updated 2026-01-10)
- Geography mapping: San Francisco MSA matched directly in Radford taxonomy
- Audit record: `audit/2026-05.jsonl` line {N}
## Calibration notes
- The candidate signal noted "competing offer at top of band from peer-tier company" — this is informational; the recommended band did NOT shift in response. If an exception is needed, escalate to the comp committee with the competing offer details.
- This role's geography has a pay-equity gap of -3.2% vs. firm-wide for the same level (per last quarterly audit); recommended band is at the firm's stated philosophy. Audit will surface whether the gap closes.
```
## Watch-outs
- **Survey-export staleness.** *Guard:* warns at >6 months on the export's dated metadata.
- **Geography mis-mapping.** *Guard:* halts on ambiguous geography rather than defaulting.
- **Low-N cell.** *Guard:* refuses to use a low-N cell; falls back with the chain documented.
- **Equity drift.** *Guard:* conversion math documented in the report; raw and converted values both stored in audit.
- **Public range too tight.** *Guard:* warns at <15% band width per pay-transparency-law functional thresholds.
- **Historical-pay bias propagation.** *Guard:* if philosophy is calibrated against historical pay rather than survey percentile, flag and recommend a separate pay-equity check.
# Survey source schemas
The compensation-benchmark skill reads survey exports in one of three supported formats: Radford, Pave, Carta. A custom CSV schema is also supported for in-house surveys or for sources not on this list.
## Radford
Radford ships exports as CSV or XLSX. The skill reads the CSV form (re-export from XLSX if needed).
### Required columns
| Column | Type | Notes |
|---|---|---|
| `level_radford` | string | Radford ladder code (e.g. `P4`). The philosophy file maps this to firm levels. |
| `function_radford` | string | Radford function code (e.g. `Software Engineering`). |
| `geography_radford` | string | Radford geography (e.g. `San Francisco MSA`). |
| `sample_size` | integer | Number of survey respondents in this cell. Skill requires ≥5. |
| `base_salary_p25` | number | 25th percentile base salary, USD. |
| `base_salary_p50` | number | 50th percentile. |
| `base_salary_p60` | number | 60th percentile. |
| `base_salary_p75` | number | 75th percentile. |
| `base_salary_p90` | number | 90th percentile. |
| `equity_annual_p25` | number | 25th percentile annualized equity value, USD. |
| `equity_annual_p50` | number | ... |
| `equity_annual_p60` | number | ... |
| `equity_annual_p75` | number | ... |
| `equity_annual_p90` | number | ... |
| `bonus_target_p50` | number | Target annual cash bonus, USD. (Radford reports target, not actual.) |
### Notes
- Radford's `level` codes (P1-P8 for IC, M1-M5 for management) need a firm-level mapping in the philosophy file. The mapping lives once, used everywhere.
- Geography taxonomy: Radford uses MSAs (e.g. `San Francisco MSA`, `New York MSA`) plus international country/city combos. The skill matches by exact string; "Bay Area" does not match `San Francisco MSA`.
- Sample size <5 → low-N flag. Radford itself suppresses cells below 3.
## Pave
Pave exports as CSV via the API or via UI download.
### Required columns
| Column | Type | Notes |
|---|---|---|
| `level_pave` | string | Pave's level normalization (e.g. `Senior IC`). |
| `function_pave` | string | Pave's function (e.g. `Engineering - Software`). |
| `location` | string | Pave's location string. |
| `n_employees` | integer | Number of employees in the cell. |
| `base_p25`, `base_p50`, `base_p75`, `base_p90` | number | Base salary percentiles. (Pave does not publish p60.) |
| `equity_p25`, `equity_p50`, `equity_p75`, `equity_p90` | number | Annualized equity in USD. |
| `total_comp_p50`, `total_comp_p75` | number | Total comp percentiles, useful for OTE calibration. |
### Notes
- Pave uses its own level normalization across firms; mapping to firm levels lives in the philosophy file.
- Pave's coverage is strongest for tech in the US and EU; APAC and emerging-market data is thinner.
- Sample size <10 → low-N flag (Pave's own threshold).
- `total_comp_p50` includes base + bonus + equity at the median. Useful for the public-range sanity check.
## Carta
Carta's compensation product exports in two flavors: cash-comp report (similar to Pave) and equity-comp report (cap-table-aware).
### Required columns (cash report)
| Column | Type | Notes |
|---|---|---|
| `role` | string | Carta's normalized role label. |
| `seniority` | string | `Junior`, `Mid`, `Senior`, `Staff`, `Principal`. |
| `location` | string | Carta's location string. |
| `n_companies`, `n_employees` | integer | Cell sample sizes (both required). |
| `base_p50`, `base_p75` | number | Base salary percentiles. |
| `total_cash_p50`, `total_cash_p75` | number | Base + bonus. |
### Required columns (equity report)
| Column | Type | Notes |
|---|---|---|
| `role` | string | Same as cash report. |
| `seniority` | string | Same. |
| `location` | string | Same. |
| `company_stage` | string | `Seed`, `Series A`, `Series B`, etc. |
| `equity_pct_p25`, `equity_pct_p50`, `equity_pct_p75`, `equity_pct_p90` | number | Equity as percentage of fully diluted shares outstanding. |
### Notes
- Carta's coverage is strongest for early-stage US startups. For mid-stage and public-company benchmarking, Radford or Pave are stronger.
- Equity reported as `equity_pct_p*` (percent of company), not dollar value. The skill converts using the firm's most recent valuation.
- Sample sizes <15 for equity → low-N flag (equity is more variance-heavy than cash).
## Custom CSV
For in-house surveys or sources not on the list above. The skill reads any CSV with the following minimum columns:
| Column | Type | Required | Notes |
|---|---|---|---|
| `level` | string | yes | Whatever ladder; must map to firm ladder via philosophy file. |
| `function` | string | yes | Whatever taxonomy; must match role definition. |
| `geography` | string | yes | Free-text or coded; must match exactly. |
| `sample_size` | integer | yes | Used for low-N flag. |
| `base_p50` | number | yes | Median base salary, USD. |
| `base_p25`, `base_p75`, `base_p90` | number | recommended | More percentiles enable wider band-targeting options. |
| `equity_value_p50` | number | for equity-bearing roles | Annualized equity value, USD. |
| `bonus_p50` or `ote_p50` | number | for sales / variable-comp roles | Target. |
| `min_sample_size` | integer | yes | The threshold below which the skill flags low-N. Set per-survey based on the survey methodology. |
### Notes
- Custom CSVs are useful for mid-cycle re-benchmarks against a peer cohort (your own team's data plus a few comparable firms) or for in-house comp-committee internal reviews.
- The `min_sample_size` field is critical — without it the skill cannot calibrate the low-N threshold and falls back to a conservative default (15).
## Adding a new survey source
To add a new source:
1. Document the source's export schema in this file with the same shape as the entries above.
2. Update the skill's source detector to recognize the new format (filename pattern, header pattern, or both).
3. Add the source's documented sample-size threshold.
4. If the source uses a different geography or level taxonomy, document the mapping in the philosophy file.
## Refresh cadence
Survey data shifts faster than yearly. The benchmark skill warns at >6 months on the export's dated metadata; that's the floor. Quarterly refresh is the operating norm for serious comp programs.
For Radford: Q1, Q2, Q3, Q4 standard cycles.
For Pave: monthly refresh available via API.
For Carta: quarterly equity reports, monthly cash updates available.
# Compensation philosophy file template
The compensation-benchmark skill calibrates survey data against the firm's compensation philosophy. This file is the philosophy. Copy the JSON below to `philosophy.json` (or wherever your skill config points), fill it in, and version it in git.
The philosophy is rarely revised — usually annually at most, often less. When it changes, every benchmark recommendation post-change uses the new philosophy. The skill captures the philosophy version in the audit record so future audits can reproduce the recommendation.
## JSON shape
```json
{
"philosophy_version": "2026.1",
"effective_from": "2026-01-10",
"approver": "Comp Committee minutes 2026-01-08",
"target_percentiles": {
"engineering": {
"base": 60,
"equity": 75,
"bonus_or_ote": 50
},
"sales": {
"base": 50,
"equity": 50,
"bonus_or_ote": 75
},
"go_to_market_other": {
"base": 60,
"equity": 60,
"bonus_or_ote": 60
},
"g_and_a": {
"base": 60,
"equity": 50,
"bonus_or_ote": 50
}
},
"band_widths_pct": {
"default": 10,
"by_level": {
"junior": 8,
"senior": 12,
"staff": 15,
"principal": 18,
"executive": 25
}
},
"level_mapping": {
"firm_to_radford": {
"L3": "P3",
"L4": "P4",
"L5": "P4",
"L6": "P5",
"L7": "P6",
"L8": "P7"
},
"firm_to_pave": {
"L3": "Mid IC",
"L4": "Senior IC",
"L5": "Senior IC",
"L6": "Staff IC",
"L7": "Principal IC",
"L8": "Senior Principal IC"
}
},
"geography_adjustments": {
"remote_us": 0,
"remote_intl": -15,
"san_francisco_msa": 0,
"new_york_msa": 0,
"seattle_msa": -3,
"austin_msa": -10,
"london": -8,
"toronto": -12,
"remote_latam": -35
},
"current_strike_price_usd": 5.20,
"vesting_period_years": 4,
"equity_grant_type": "RSU",
"exception_band": {
"max_above_top": 15,
"approval_required": "comp_committee"
},
"public_range_policy": {
"minimum_band_width_pct": 15,
"include_equity_target_dollar": true,
"include_bonus_target_dollar": true
},
"pay_equity_audit_cadence_months": 12,
"last_pay_equity_audit": "2026-02-15"
}
```
## Field-by-field
### `philosophy_version`, `effective_from`, `approver`
Versioning. The skill captures `philosophy_version` in the audit record so the recommendation is reproducible against a specific version of this file. `effective_from` is the date the philosophy applies to NEW recommendations — recommendations made before that date used the prior philosophy. `approver` cites the approval source (Comp Committee minutes, board resolution, etc.).
### `target_percentiles`
Per function family, the target percentile per component. The most common patterns:
- **Engineering**: 60th base, 75th equity (founder-friendly equity to attract IC talent), 50th bonus.
- **Sales**: 50th base, 50th equity, 75th OTE (the variable comp is the lever).
- **G&A**: 60th base across components (predictable, market-rate).
If the firm's strategy is "we pay top of market across the board," set everything to 75th. If the firm's strategy is "we pay base at market and over-index on equity," set base to 50th and equity to 75th-90th.
### `band_widths_pct`
The recommended band width as a percentage of the midpoint. Default 10% (recommended midpoint ±10%). Per-level overrides absorb the wider individual variance at senior levels.
If a single number is too rigid, the skill respects the per-level overrides.
### `level_mapping`
Mapping from the firm's internal ladder to each survey's ladder. The skill cannot infer this — it has to be specified per survey the firm uses. If a level mapping is missing, the skill halts and asks the user to add it.
This is the single most-edited part of the philosophy; it's also the most consequential, because the wrong mapping shifts every recommendation by a percentile-band.
### `geography_adjustments`
Per-geography multiplier. `0` means use the survey's value for that geography directly. `-15` means apply a 15% reduction (e.g. for `remote_intl`). The adjustments must be defensible — random adjustments here are how pay-equity gaps creep in.
If the firm has a published location-based pay policy, this section should match it line-for-line.
### `current_strike_price_usd`, `vesting_period_years`, `equity_grant_type`
Used for converting annualized survey equity values to grant size. Strike price is the most-recent 409A or option-grant strike. Vesting is typically 4 years. Grant type matters for tax framing but not for the band math.
### `exception_band`
When the skill is asked about a band-exception ("can we offer above the top?"), the philosophy says how high (`max_above_top: 15` means up to 15% above the top of the recommended band) and who approves. The skill itself does NOT approve exceptions; it surfaces the policy.
### `public_range_policy`
Compliance posture for NYC LL 32-A, CO/CA/WA pay-transparency requirements. `minimum_band_width_pct: 15` is the firm's "good faith" floor — the skill warns if a recommended band falls below this width.
### `pay_equity_audit_cadence_months`, `last_pay_equity_audit`
For the audit-record metadata. The skill notes the cadence and last audit so the recommendation can be flagged if the firm is overdue for an equity audit.
## When to revise the philosophy
- **Strategy shift** — the firm decides to over-index on equity vs. cash. Update target percentiles.
- **New geography** — opening a new region. Add to `geography_adjustments` based on local market data.
- **New survey added** — add a level mapping for the new survey.
- **Pay-equity audit findings** — if the audit surfaces gaps, the philosophy may need revision (band widths, geography adjustments).
Each revision bumps `philosophy_version`. Old audit records remain interpretable against their respective version.
## What the philosophy is NOT
- It is NOT a candidate-by-candidate negotiation guide.
- It is NOT a one-time setup; it evolves with the firm.
- It is NOT confidential to the recruiter — the philosophy should be visible to every hiring manager, ideally documented internally for transparency.