You read a RIGHTS AND OPTION REGISTER SNAPSHOT for one property and extract structured fields from it. You return JSON and nothing else.
You are PROPOSING a worklist for a qualified person to read the agreement against. You never exercise, renew, lapse, file or release anything, and you are not a substitute for the executed option agreement or for a lawyer's reading of it. You are not watching this register: you are reading ONE snapshot of it, as it stood on the date it states.
RULES, in order of importance:
1. If the register does not state a field, return null for it. Do not infer it and do not use what you know about how options usually work.
2. `expiry_date` and `status` are decided ONLY by the COUNTING RULEBOOK given below, applied to the register's own values. Work through these four steps IN ORDER:
a. WHAT STARTS THE CLOCK. If the Clock Basis says grant_date, the clock starts on the grant date. If it says triggering_event, the clock starts on the date the Triggering Event section records the event as having OCCURRED. If that event has not occurred, the period has not started, no expiry can be counted, and the answer is 'not_determinable' -- it is NOT 'live'.
b. A CONTRADICTED DATE IS NOT SETTLED. Look at how many dated entries the Option Granted section carries.
- ONE entry: that is the grant date. Return it in option_granted_date. This is true whatever the Clock Basis says -- a triggering-event clock does not make a stated grant date disappear, it just does not count from it. NEVER return null for option_granted_date when the section states exactly one date.
- TWO entries that disagree: the grant date is not settled, so return null for option_granted_date. Do NOT pick the earlier entry, the later entry, or the one from the more official-looking source. Then: if the clock runs from the GRANT DATE, there is nothing to count from and the answer is 'not_determinable'; if the clock runs from a TRIGGERING EVENT that has occurred, the grant date is not an input at all, the disagreement changes nothing, and you carry on counting normally from the trigger date.
c. WHICH EXTENSIONS ACTUALLY COUNT. Only PERFECTED ones. An extension entry saying 'recorded: exercised' is a clerk's entry, not an act. A payment-controlled extension is perfected only when a payment reference AND a payment date are recorded against it. A notice-controlled extension is perfected only when notice was served on the GRANTOR OF RECORD -- the party named in the Rights Holder section. Service on an agent, a co-financier, an escrow agent or the grantee's own counsel does NOT perfect it, however customary that is.
d. ADD THE MONTHS AND COMPARE. Expiry = the clock start, plus the initial term, plus the length of each PERFECTED extension. Extensions run consecutively from the end of the period they extend, NEVER from the date they were exercised. Add the whole term in calendar months in one step from the clock start, keeping the same day of the month and falling back to the last day of a shorter month. Then compare against the register's own As Of date and the window the rulebook names.
3. THE REGISTER'S OWN STATUS LINE IS NEVER AN INPUT. `register_status` is what somebody last typed. Report it as stated and then ignore it. It is often wrong on this kind of record, in both directions, and it has no word at all for an option lapsing inside the window or for one the paperwork does not settle.
4. THE CLERK'S NOTE IS A FIELD TO COPY, NOT EVIDENCE ABOUT THE CLOCK. A note that sounds worried does not shorten a term and a note that sounds relaxed does not lengthen one. The count decides; the note is one person's remark and may disagree with it.
5. Copy titles, party names and the clerk's note verbatim. Return every date as an ISO date, YYYY-MM-DD, exactly as the register writes it.
6. Use the exact allowed value for a field that lists them.
7. Return every field named in the schema, even when the answer is null.
COUNTING RULEBOOK (the authority for `expiry_date` and `status`; this is an ILLUSTRATIVE rulebook shipped with this kit, not an agreement and not a standard form)
WHAT STARTS THE CLOCK
grant_date: the option period runs from the date the option was granted
triggering_event: the option period runs from the date the triggering event ACTUALLY OCCURRED. Until it occurs, the period has not started and no expiry can be counted -- the answer is not_determinable, and it is not 'live'
AN OPTION WHOSE CLOCK HAS NOT STARTED IS NOT AN OPTION WITH A LONG TIME LEFT. It is an option nobody can date, and the honest answer is that it cannot be determined from the register. Reading it as 'live' is the single most comfortable mistake on this shape of record, because it removes a row from the worklist and looks like good news.
A CONTRADICTED DATE
A CONTRADICTION BLOCKS ONLY THE DATE THE CLOCK ACTUALLY RUNS FROM. Where two entries on the register disagree about the grant date AND the clock runs from the grant date, the clock start is not settled: answer not_determinable, and do NOT pick the earlier entry, the later entry, or the one from the more official-looking source. Where the clock runs from a triggering event that has occurred, the grant date is not an input at all, and a disagreement about it does not block the count -- flagging that record is a FALSE ALARM.
WHAT PERFECTS AN EXTENSION
payment-controlled: a payment reference AND a payment date must both be recorded against the extension. An extension the register records as exercised, with no payment recorded, is NOT perfected
notice-controlled: notice must be served on the GRANTOR OF RECORD -- the rights holder named on the register. Service on an agent, a co-financier, an escrow party or the grantee's own counsel does NOT perfect the extension, however customary the practice
AN EXTENSION IS PERFECTED BY THE ACT THE AGREEMENT NAMES, NOT BY THE REGISTER RECORDING THAT IT WAS EXERCISED. 'recorded: exercised' is a clerk's entry. The payment and the notice are the acts. Where the register records an exercise the acts do not support, the extension does not stack and the option is shorter than the file believes it is -- which is the whole reason this kit exists.
HOW EXTENSIONS STACK
A perfected extension runs CONSECUTIVELY from the end of the period it extends, never from the date it was exercised. An extension exercised early does not shorten the option and one exercised late does not lengthen it. Expiry = clock start + the initial term + (the length of each PERFECTED extension). Only perfected extensions are added.
HOW MONTHS ARE ADDED
Months are added calendar-wise and never as 30-day blocks. 2025-01-31 plus one month is 2025-02-28; plus one more is 2025-03-28, not 2025-03-31 -- each addition is taken from the ORIGINAL start date and the whole term is added at once, so the clamping cannot compound. Counting in days instead moves an 18-month option by up to five days, which is the difference between 'live' and 'lapsing' on a 45-day window.
THE WINDOW
45 days. How far ahead 'lapsing' looks. 45 days is this kit's own number and is not a market convention: it was chosen because it is long enough that a payment or a notice can still be got out, and short enough that a worklist stays readable. A real desk would set it per property, per counterparty, or per what the exercise costs.
THE FOUR STATUSES
lapsed: expiry on or before the register's as-of date
lapsing: expiry after the as-of date and on or before as-of plus the window
live: expiry after as-of plus the window
not_determinable: no expiry can be counted from what the register states
WHAT IS NOT EVIDENCE
The register carries its own status line -- live or lapsed -- and it is NEVER an input to this count. It is what somebody last typed, and this kit's whole subject is the gap between that and the arithmetic. Note also what the line cannot express even when it is right: it has no word for 'lapsing inside the window' and no word for 'the paperwork does not settle it'. A status column with two values cannot carry a four-value answer.
The clerk's note is one person's remark on the file. A note that sounds relaxed does not add a day to the term and a note that sounds worried does not remove one. It is extracted, it is displayed, and it decides nothing.
Extract these fields:
- register_id (string) -- the rights register file identifier, verbatim
- property_title (string) -- the title of the optioned property ONLY -- the text inside the quotation marks, verbatim and without the quotation marks themselves. The register writes the form of the work after a double dash (for example: "A Title" -- stage play); the form is NOT part of the title and must not be returned
- rights_holder (string) -- the party that granted the option -- the GRANTOR OF RECORD, verbatim. This is the party a notice has to be served on for a notice-controlled extension to be perfected
- grantee (string) -- the party holding the option, verbatim
- register_as_of (string) -- the date this register snapshot is current as at, as an ISO date (YYYY-MM-DD). This is the 'today' the whole count is measured against -- it is NOT today's real date
- option_granted_date (string) -- the date the option was granted, as an ISO date (YYYY-MM-DD). Where the Option Granted section states exactly ONE date, return it -- always, whatever the Clock Basis says. ⚠︎ ONLY where the section carries TWO dated entries that DISAGREE about the same grant, return null: the register does not settle it, and you must not pick the earlier one, the later one, or the one from the more official-looking source
- clock_basis (enum) one of: grant_date, triggering_event -- what the agreement says starts the option clock, as the register's Clock Basis section states it
- trigger_status (enum) one of: not_applicable, occurred, not_occurred -- whether the triggering event has happened. 'not_applicable' when the clock runs from the grant date and there is no triggering event at all
- trigger_date (string) -- the date the triggering event actually occurred, as an ISO date (YYYY-MM-DD). null when there is no triggering event, or when there is one and it has not occurred
- initial_term_months (integer) -- the length of the initial option period in whole months, as a number
- extension_months_each (integer) -- the length in whole months of each extension the agreement grants, as a number. Every extension in a chain is the same length in this register's format
- extensions_recorded_taken (integer) -- how many extensions the register RECORDS as exercised -- count the extension entries whose 'recorded:' line says exercised. This is what the file claims; it is NOT what decides the expiry
- extensions_perfected (integer) -- how many of those extensions were actually PERFECTED under the rulebook -- a payment-controlled extension needs BOTH a payment reference and a payment date recorded against it; a notice-controlled extension needs notice served on the rights holder named on this register, and service on an agent, a co-financier, an escrow party or the grantee's own counsel does not count. An extension recorded as exercised whose act is missing or misdirected is NOT perfected
- register_status (enum) one of: live, lapsed -- the status the register itself carries in its Register Status section, copied verbatim. Report it as stated -- it is NOT what decides the answer
- clerk_note (string) -- the rights clerk's own free-text remark on the file, copied verbatim
- expiry_date (string) -- the date the option expires, counted under the rulebook: the clock start, plus the initial term, plus the length of each PERFECTED extension, in calendar months. Return null when no expiry can be counted. This date is nowhere on the register -- it is the count
- status (enum) one of: live, lapsing, lapsed, not_determinable -- the option's status against the register's own as-of date, from the counted expiry. 'lapsed' when the expiry is on or before the as-of date; 'lapsing' when it is after the as-of date and on or before as-of plus the window the rulebook names; 'live' when it is beyond that; 'not_determinable' when no expiry can be counted -- a triggering event that has not occurred, or two entries disagreeing about a grant date the clock runs from. Decide it STRICTLY from the count -- never from register_status and never from clerk_note
Return a JSON object with exactly these keys: register_id, property_title, rights_holder, grantee, register_as_of, option_granted_date, clock_basis, trigger_status, trigger_date, initial_term_months, extension_months_each, extensions_recorded_taken, extensions_perfected, register_status, clerk_note, expiry_date, status
Use null for any field the register does not state.
RIGHTS AND OPTION REGISTER
--------------------------
Register
--------
RGT-4807-JA
Property
--------
"The Ledger of Storms" -- unpublished novel
Rights Holder
-------------
Fenmarket Books Limited
Grantee
-------
Bright Quarry Media LLC
Register As Of
--------------
2026-08-14
Option Granted
--------------
2024-09-12 (option agreement, executed copy)
Clock Basis
-----------
triggering_event -- the option period runs from clearance of the underlying life-story consents
Triggering Event
----------------
clearance of the underlying life-story consents
occurred: 2025-04-21
Initial Option Period
---------------------
12 months
Extension One
-------------
12 months, perfected by payment
recorded: exercised 2025-11-01
payment: none recorded against this extension
Extension Two
-------------
12 months, perfected by notice
recorded: not exercised
Register Status
---------------
live
Clerk Note
----------
Clean file, nothing for the desk to do here as far as I can see.