Home › Use Cases › Check a mid-term SaaS add-on against the subscription's co-term clause and price schedule
Use caseUC0326
🧪 Use-case kit · runnable

Check a mid-term SaaS add-on against the subscription's co-term clause and price schedule

A small, forkable project that does one job end to end. Run once for real, and every figure on these pages captured from that run.

The business caseThe problem this solves

A customer buys more part-way through a subscription term — more seats, or a module they have never licensed — and the add-on has to be priced to the END OF THE EXISTING TERM so that everything they hold renews on one date. Four things have to hold at once on every line: the co-term date has to be the CURRENT term end and not the initial term's, which is also printed on the agreement and is exactly one term out on a subscription that has renewed; the start has to fall inside the current term; the unit price has to be the basis the agreement sets for THAT KIND of add-on, which is the protected price for an expansion and list-less-discount for a product the customer does not already run; and the proration factor has to be the remaining term over the whole term on the agreement's own day-count convention, truncated at the fourth place, from the date the add-on was actually made available. A deal desk does that by eye, at quarter end, against a term record and a price schedule, on every line of every order. Joining every add-on line to a term record by date, to a price schedule by SKU and price basis, and to a day-count convention by agreement, then reading the line's own narrative to decide which price basis applies and when the add-on actually went live — and doing the proration arithmetic in whole cents with one flooring.

Audience

A deal desk or revenue-operations reviewer who sees mid-term add-on orders before they are booked, and the finance team that inherits the renewal date if a co-term is wrong. Every number on these pages came from one real run of this code, not from a vendor page.

The inputThe actual mid-term add-on order forms

The corpus is 60 mid-term add-on order forms, 0.19 MB (json 3 · jsonl 1 · md 2 · txt 60). Because the shape of a co-term proration failure is not the arithmetic, it is the anchor. Six of the sixty orders take the co-term date from the INITIAL term end on a subscription that has renewed — a real date, printed on the document, exactly one term out — and four of those are flagged in the key as the named failure mode so it can be scored rather than asserted. Beside them sit nine orders where the seller coded the price basis wrong and seven where the narrative moves the date the add-on was made available, which are the only sixteen lines in the corpus that a lookup cannot settle. The other 254 are there because that is what an order run looks like: 226 of the 270 lines simply tie.

The corpus

  • The 60 mid-term add-on order formsgenerated from a fixed seed, so no real record, person or institution appears in it.
  • Where each came fromNowhere — all 60 order forms, data/subscriptions.json and the whole answer key are generated in-process by the file that sits beside them. Every customer, vendor, agreement number, order reference, SKU, item name, date, price, narrative and signature is invented. COTERM-2026 is invented too and is not an accounting standard, a revenue-recognition rule or anybody's subscription agreement. See data/SOURCES.md.

Swap this folder for your own material and the kit is pointed at your mid-term add-on order forms. That is the whole change — there is no database to migrate.

One mid-term add-on order form, as the model receives itAO-0001.txt · 1 of 60
MID-TERM ADD-ON ORDER FORM - CO-TERMINATION AND PRORATION CHECK

ORDER HEADER
  Order              AO-0001
  Agreement          MSA-3100-01
  Customer           Aldenmere Logistics Group
  Vendor             Quarrenden Systems
  Tenant region      Dedicated region
  Order date         2026-09-05
  Raised by          M. Hallberg, for Quarrenden Systems

SUBSCRIPTION TERM RECORD (the vendor's own record of the subscription this order attaches to)
  Initial term            2026-01-01 to 2026-12-31
  Current term            2026-01-01 to 2026-12-31
  Term now running        initial term
  Current term length     365 days, 12 months
  Co-termination          Clause 4: every mid-term add-on ends on the current term end date
  Day-count convention    Clause 6: actual days remaining over the days of the current term

PRICE SCHEDULE (Schedule 2, price book PB-2026-A, in force for the whole of the current term)
  Contracted discount off list, for a product not already licensed under this subscription: 8 pct
   SKU       Item                         Protected unit      List unit
   PLT-STD   Platform Standard seat              $252.68        $304.00
   PLT-ENT   Platform Enterprise seat            $308.20        $360.00
   ANL-PRO   Analytics Pro seat                  $199.84        $277.00
   WKF-AUT   Workflow Automation module          $348.48        $419.00
   SEC-ADV   Advanced Security module            $268.36        $308.00
   INT-HUB   Integration Hub connector           $207.08        $274.00
   SUP-PRM   Premium Support pack                $171.04        $237.00
   STO-EXP   Storage Expansion block             $223.96        $288.00

ADD-ON LINES
   #  SKU       Type        Qty   Unit price   Service start  Co-term end  Factor   Extended      Narrative

Abridged — the file continues.

The outcomeWhat a good result looks like

Every line of the order carries a verdict, the agreement term it rests on, the amount at issue to the cent and signed, and one row copied verbatim as evidence — and the order carries PASS or REPRICE with the lines named and the gap stated. On the published run the pure-code station reaches the right verdict on 260 of 270 lines and the right recommendation on 56 of 60 orders.

And when it cannot

⚠︎ THE ORDER-LEVEL NUMBER IS 5 OF 60 AND THAT IS NOT A TYPO. order_all_correct requires every one of the six graded fields on every line, and the arm returned a QUOTED ROW on 143 of the 270 lines that TIE, where the answer contract says the citation must be null. Every one of those quotes is locatable in the order form and every one scores zero. The station recomputes the verdict and the amount and deliberately does not repair the citation, because rewriting it would erase the evidence of the failure. Read the verdict and recommendation columns for what the product does and the all-correct column for what it costs to trust the reply as written.

Where it fitsWhat did work

Every line below is a measured result from this kit's own runs, with the figure that supports it. The headline above is not softened by any of them.

  • Your sellers code the add-on type correctly and your co-term arguments are about dates, prices and arithmetic. — the free column floor alone — evals/baseline.py --floor rules
    Every one of those is a comparison, a date test or two multiplications. The floor is 254 of 270 line verdicts and 44 of 60 orders for $0.00, no key and no network.
  • Your order narratives are written by people and say things like 'the customer's first licence of this' or 'access opened on the 21st'. — the paid call, rechecked
    That is the only place it separates: 15 of the 16 reading-required lines against the column floor's 0, exact two-sided p = 0.00006. Everything else it does, code already does.
  • Your term records already say which SKUs the customer holds. — the free column floor, and skip the model
    Then reading 1 is a lookup rather than a reading, and 9 of the 16 lines this kit pays for stop being questions. Read data/SOURCES.md's note on the entitlement construction before pricing this.

And where nothing here is good enough:

  • You want the reply itself to be the artefact — verdicts, amounts and quotes, as written, with no post-pass. — neither, yet
    The arm as answered reaches 118 of 270 line verdicts and 2 of 60 orders. The product is the reply PLUS src/recheck.py, and the gap between the two columns is the whole measurement.

At a glanceHow the whole thing runs

93%order recommendation correct rechecked pct
3,948 msp50, end to end

Run once, for real, on 2026-09-08. Every figure on these pages was captured from that run — nothing is written from intent.

14 steps, grouped by the question that sends you to them rather than by build order. Each tile carries the one figure that step is about, and opens the page behind it.

Should you use this?What you bring, where it stops, and when not to use it

Before you commit an afternoon to this, these are the answers that decide it. Each one is rendered from the record it lives in — and links the page that holds it in full.

What do I have to bring?Point data/corpus/ at your own exported order forms and data/subscriptions.json at your own term records and price schedules, keep the panel headings and the line columns, and every free floor, the engine, the station and the scorer run unchanged. The boundary is the ANSWER KEY, not the documents. Corpus lens →
When is this the wrong choice?Avoid: Paying for a reading you do not need — and paying it 60 times a quarter. That is the case against the best-fitting scenario (“Your sellers code the add-on type correctly and your co-term arguments are about dates, prices and arithmetic.”). 4 scenarios scored in all, each with its own. Eval lens →
Where does it stop working?An order form whose panels are not the six this parser knows. src/rules.py splits on the headings ORDER HEADER, SUBSCRIPTION TERM RECORD, PRICE SCHEDULE, ADD-ON LINES, SALES NOTES and SIGN-OFF, and reads the line rows with one fixed-column regular expression. 6 recorded failure modes, each from a run rather than a guess. Corpus lens →
What was never verified?A second scored run at the same tier. One run, one model; no repeat was bought, so nothing here separates a model's variance from a real difference. 5 items this kit says it could not check. Eval lens →
Can I run this on a model I control?The shipped adapter is one provider, one key, configured in .env; the Prompt lens states what swapping it costs. The published figures come from 1 model on the fast tier, reasoning disabled (THE PUBLISHED RUN). Prompt lens →
And if it fits — what do I stand up?4 artifacts with a stated home and a stated egress, and 4 decisions each with what you provision past its ceiling — plus what was not measured. That is the next page, not this one. step 14 — Run it in your environment →

Not asked of this kit — 2 questions: clone (a fresh clone of this kit runs with nothing fetched); judge (nothing here is graded by a model).

Last verified 2026-09-08 — r001-coterm-prorate. Every figure on these pages was captured from that run.

Run itHow this reaches your data

Every result on this page was produced by pure code over checked-in files, with no API key — which is why you can read the numbers before anyone spends anything.

Run this on your own data

  • The pipeline, its eval harness and the runs behind every numberdeployed inside your environment, on your own model endpoints, against your own documents.
  • The corpus above is the shape, not the limitit is a folder swap, and there is no database to migrate.

Talk to us →

Checked before this shipped — Clone and run python3 -m evals.baseline with no key, no network and nothing installed: all four floors score all 60 orders in a few seconds. python3 tools/build_corpus.py --check rebuilds the whole corpus in memory and compares bytes. python3 -m evals.check_labels re-derives the key independently. python3 -m src.app serves the board on 127.0.0.1:9326 with the committed run replayed off its result file.

A living map of modern AI — kept current every morning