42 grants (RSUs and options, 4-year vest, 1-year cliff), 2022–2025. Every month-end, cumulative expense is recomputed from scratch out of tranche states — vested, active, forfeited — and the incremental engine must match it to the cent under both attribution methods. Synthetic, seeded data.
Same ledger, two attribution methods. Graded treats every vesting tranche as its own award and front-loads: in 2024 it books $0.58M against straight-line's $0.61M. Both must converge to grant-date fair value at full vesting — check 2 proves they do, award by award. The August 2025 dip is the RIF: forfeitures at actuals (ASU 2016-09 election), reversed in the month they happen, not smoothed by an estimate.
Grant #0 — 60,000 options struck at $8.40 in March 2022 — went underwater in the June 2023 down round and stayed there. Repriced March 2025 to $5.45. ASC 718's rule is unforgiving in a specific way: the original $298K grant-date fair value is never reversed — an underwater option still cost what it cost — and the modification adds incremental fair value of $41K (new award minus old award, both valued at the modification date), recognized over the remaining vesting period.
The check: the modified award's lifetime expense can never exceed original FV + incremental FV. The board asks "what did the repricing cost?" — the answer is $41K, not the headline value of the new options.
| Grant | Granted | Shares | Strike | FV/share | Total FV | Status |
|---|---|---|---|---|---|---|
| #0 OPTION | 2022-03 | 60,000 | $8.40 | $4.97 | $339K | active |
| #18 RSU | 2023-02 | 40,000 | — | $6.99 | $280K | active |
| #16 RSU | 2022-12 | 40,000 | — | $6.85 | $274K | departed |
| #3 RSU | 2022-02 | 40,000 | — | $6.11 | $244K | active |
| #33 RSU | 2024-07 | 40,000 | — | $4.63 | $185K | active |
| #30 RSU | 2024-04 | 40,000 | — | $4.36 | $174K | active |
| #20 OPTION | 2023-04 | 40,000 | $7.17 | $4.26 | $170K | active |
| #14 RSU | 2022-10 | 20,000 | — | $6.71 | $134K | active |
Option fair values are Black-Scholes at grant (vol 55%–62% by year, expected term 6 years, strike = 409A FMV at grant). Validation bounds every option FV between intrinsic value and the share price — the classic smell test for a mis-wired pricing input.
Synthetic, seeded data
(random.seed(718)). Generator, engines, and checks:
github.com/Lumimama/finance/stock-compensation.