npx skills add ...
npx skills add anthropics/claude-for-legal --skill renewal-tracker
npx skills add anthropics/claude-for-legal --skill renewal-tracker
Show contracts with cancel-by deadlines coming up and warn before notice windows close, working from a maintained renewal register. Use when the user asks "what's renewing soon", "what renewals are due", "did we miss a cancellation window", "add this to the renewal tracker", or on a scheduled basis. Receives handoffs from saas-msa-review.
Surfaces what's renewing and when you have to cancel by.
Read ~/.claude/plugins/config/claude-for-legal/commercial-legal/renewal-register.yaml (the config directory โ survives plugin updates).
Default mode: Mode 2 โ what's coming up in the next 90 days, grouped by urgency using half-open intervals so each deadline lands in exactly one band: ๐ด 0โ13 days, ๐ 14โ44 days, ๐ก 45โ89 days. Days 14, 45, and 90 are boundaries โ each belongs to exactly one band, not two.
--days N: Change the window.
--missed: Mode 4 โ cancel-by deadlines that passed without recorded cancellation.
If register is empty and the [CLM] is connected: Offer Mode 3 โ scan the [CLM] for active agreements with renewal dates and bulk-load.
Output includes recommended actions: who to ping (the business owner from each register entry), which ones have uncapped pricing (get leverage before window closes).
Nobody reads a contract twice. The renewal date is extracted once, at review time, and then it lives somewhere โ ideally somewhere that shouts at you 45 days before the cancel-by deadline, not 45 days after.
This skill maintains the renewal register and surfaces what's coming.
Lives at ~/.claude/plugins/config/claude-for-legal/commercial-legal/renewal-register.yaml (the config directory โ survives plugin updates). Each entry:
Notice transit time โ alert off send_by_effective, not cancel_by_effective. A 60-day window with a certified-mail requirement is really ~55 days. The tracker that alerts on the received-by date is the tracker that misses the deadline. Compute send_by_effective = cancel_by_effective - transit_buffer_days and fire alerts (the ๐ด / ๐ / ๐ก urgency bands in Mode 2) off send_by_effective. Mode 2's urgency column shows send_by_effective; a detail column surfaces cancel_by_effective, notice_method, and transit_buffer_days so the reader can see the delta and challenge the buffer.
Rolling renewals โ the register that doesn't roll forward is the register that's right once. Store initial_term_end for the record, but compute cancel_by_* from current_term_end. When a renewal fires (the cancel window passes and no notice was given), prompt:
This contract auto-renewed on [date]. Update the register: new
current_term_endis [date + renewal period], newcancel_by_effectiveis [computed], newsend_by_effectiveis [computed]. Confirm?
After year one, initial_term_end is wrong and only current_term_end produces a correct cancel-by date.
The register's cancel-by date must be the last BUSINESS DAY on which notice is effective, not the calendar date. A calendar date that falls on a weekend is the single most common way a renewal deadline gets missed. The register catches it.
When you compute (or ingest) a cancel-by date:
cancel_by_calendar = initial_term_end โ notice_period_days (or whatever the clause specifies). This is the raw arithmetic.cancel_by_calendar is the raw arithmetic; cancel_by_effective is the last business day on which notice is effective; cancel_by_roll_note records why they differ (e.g., "rolled back from Sunday 2026-11-01; verify against contract's business-day definition"). Every computed cancel_by_effective carries a cancel_by_provenance tag of [model calculation โ verify against the notice clause] so the verify flag travels with the date, not with the surrounding prose.cancel_by_effective. Mode 2 output shows cancel_by_effective in the urgency column and surfaces cancel_by_calendar and cancel_by_roll_note in a detail column where the roll-back happened, so the reader can see it and challenge it.A Mode 2 report that prints cancel_by: 2026-11-01 (a Sunday) with no weekday and no warning is a silently wrong effective deadline. The register is the place to catch it โ once, at ingest โ not later, when the window has already moved.
When saas-msa-review or vendor-agreement-review finds a renewal clause, it hands off a record. Append it to the register. If the counterparty already has an entry, ask whether this is a replacement (renewed agreement) or an additional agreement.
Default lookback window: next 90 days.
Urgency bands are half-open intervals โ a deadline lives in exactly one band. Use days-until-cancel-by (cancel_by_effective - today). Day 14, 45, and 90 each belong to exactly one band, not two; an off-by-one here puts the most-urgent items into the less-urgent bucket.
--horizon beyond 90)If the register has more than ~10 renewals in the window, or any time the user asks: offer the dashboard (see CLAUDE.md ## Outputs โ Dashboard offer for data-heavy outputs). Shape the offer for this output โ counts by urgency tier (๐ด / ๐ / ๐ก), a cancel-by timeline, and a sortable register with counterparty, renewal date, annual $, and owner.
If MCPs are connected and the register is empty or stale:
This is a one-time bulk load. After that, ingest happens at review time.
Tracking a renewal date is research. Acting on it โ sending a notice of non-renewal, letting an auto-renewal fire, or countersigning a renewal form โ is a consequential legal step.
Before proceeding to accept or decline a renewal (including sending a non-renewal notice or letting an auto-renewal run past the cancel-by date): Read ## Who's using this in ~/.claude/plugins/config/claude-for-legal/commercial-legal/CLAUDE.md. If the Role is Non-lawyer:
This step has legal consequences (you're either committing to another term or terminating the relationship). Have you reviewed this with an attorney? If yes, proceed. If no, here's a brief to bring to them:
[Generate a 1-page summary: counterparty, current term end and cancel-by date, renewal price mechanism, what happens if we do nothing, alternative vendors if we want to shop, and the three things to ask the attorney before the window closes.]
If you need to find an attorney, solicitor, barrister, or other authorised legal professional: contact your professional regulator (state bar in the US, SRA/Bar Standards Board in England & Wales, Law Society in Scotland/NI/Ireland/Canada/Australia, or your jurisdiction's equivalent) for a referral service.
Do not proceed past this gate without an explicit yes.
The renewal-watcher agent in this plugin runs this skill on a schedule (weekly by default) and posts the "coming up" report to the channel named in ~/.claude/plugins/config/claude-for-legal/commercial-legal/CLAUDE.md โ ## House style โ where work product goes. Mode 2 is the agent's primary output.
## Renewals โ next 90 days
### ๐ด Cancel-by deadline in 0โ13 days
| Counterparty | Cancel by | Renewal date | Annual $ | Owner | Notes |
|---|---|---|---|---|---|
| [name] | **[date]** | [date] | $[n] | [email] | [notes] |
### ๐ Cancel-by deadline in 14โ44 days
[same table]
### ๐ก Cancel-by deadline in 45โ89 days
[same table]
---
**Recommended actions:**
- [ ] [Counterparty] โ ping [business owner]: do we want to keep this?
- [ ] [Counterparty] โ pricing is uncapped; get a quote from an alternative before we lose leverage## Missed cancellation windows
The following agreements had cancel-by deadlines that have passed and no
cancellation was recorded:
| Counterparty | Cancel-by was | Renewal date | Status |
|---|---|---|---|
| [name] | [date] | [date] | Will auto-renew on [date] |
**Options:**
- Negotiate late cancellation (rarely works but worth asking)
- Accept the renewal, mark next year's cancel-by now
- Check the agreement for any other termination rights (for convenience, for cause)