ArvexiBuilders Blog

Modification Accounting: ASC 842's Hardest Problem

Lease modifications are the leading source of audit findings in ASC 842 compliance. Not initial measurement, not classification, not even CPI adjustments. Modifications. A tenant gives back 2 of 5 floors, renegotiates rent, extends the term, and pays a penalty to exit early. The accounting standard prescribes a decision tree for how to handle this. Most teams get it wrong.

We built the modification engine at Arvexi to handle every branch of that decision tree in 365 lines of pure calculation code with zero side effects.


The classification decision tree

ASC 842-10-25 defines a precise decision tree. The answers determine radically different accounting treatments. On a $50M headquarters lease where a tenant gives back 40% of the space, the difference between correct and incorrect penalty allocation can be $1.6M.

Classification
ASC 842 Modification Decision Tree
1
?
Does the modification grant a new right-of-use asset?
ASC 842-10-25-8(a)
Separate New Lease
Increase in Scope
Full Termination
Partial Termination
Remeasurement Only
Navigate step by step through ASC 842's classification logic · 5 possible outcomes · Click Start Over to try another path

The code is deliberately simple. The reasoning string is not just for logging; it becomes the accountingTreatment field stored on the modification record and surfaced in the audit trail:

export function testSeparateNewLease(
  input: SeparateNewLeaseTestInput
): SeparateNewLeaseTestResult {
  if (input.isNewRouAsset && input.isPricingCommensurate) {
    return {
      isSeparateNewLease: true,
      reasoning:
        `Modification qualifies as a separate new lease per ASC 842-10-25-8. ` +
        `(1) New right-of-use asset: ${input.description}. ` +
        `(2) Payment increase is commensurate with standalone price.`,
    };
  }
  // ...falls through to remeasurement
}

Partial termination: the hard case

PwC's guidance (Section 11) identifies partial termination penalty allocation as the number one mistake in practice. The penalty must never be expensed immediately. It must be allocated between terminated and retained portions using standalone selling prices. Most teams expense it to P&L on day one. Auditors catch it. Restatements follow.

SSP Allocation
Partial Termination Penalty Calculator
Adjust Parameters
Terminated Portion40%(2/5 floors)
Wind-Down Months6months
Retained Term120months
Termination Penalty$4,000,000
terminatedSSP = 0.40 × 6 = 2.4
retainedSSP = 0.60 × 120 = 72
totalSSP = 74.4
Termination Penalty
$4,000,000
Never expensed immediately — PwC Section 11
▼ SSP Allocation ▼
3.2%
96.8%
Terminated → P&L
$129,032
40% of asset × 6 months
Gain/loss calculation
Retained → Balance Sheet
$3,870,968
60% of asset × 120 months
Deferred into revised liability
Only 3.2% of the penalty hits P&L. The remaining $3,870,968 is deferred into the revised lease liability on the balance sheet.
Drag sliders to see how SSP allocation changes · Proportional bar shows the split · Numbers update in real time

The subtraction approach for penaltyToRetained ensures the two allocations sum exactly to the penalty amount, with no rounding leakage:

const terminatedSSP = toDecimal(terminatedPortion).mul(windDownMonths);
const retainedSSP = toDecimal(retainedPortion).mul(retainedTermMonths);
const totalSSP = terminatedSSP.add(retainedSSP);
 
const penaltyToTerminated = totalSSP.gt(ZERO)
  ? round2(terminationPenalty.mul(terminatedSSP.div(totalSSP)))
  : ZERO;
const penaltyToRetained = totalSSP.gt(ZERO)
  ? round2(terminationPenalty.sub(penaltyToTerminated))
  : terminationPenalty;

Every calculation uses decimal.js with round2 for two-decimal-place precision. We never use JavaScript floats for monetary values. A float multiplication on $4,000,000 can drift by cents. Over thousands of leases, cents become material.


Period locking

Modifications don't exist in a vacuum. A modification that lands in a locked period would corrupt closed financials. We enforce this with a four-state machine.

Period Integrity
Period Lock State Machine
OPENDefaultINPROGRESSClosingSOFTCLOSEReviewLOCKEDFinalclick to advanceWritableWritableRead-onlyRead-onlyController+ reopen (requires reason)
Allowed in OPEN
Post journal entries
Create modifications
Regenerate schedules
Import documents
Update lease records
Blocked in OPEN
No operations blocked
Click arrows to transition between states · Invalid transitions shake · LOCKED requires special reopen

The assertWritable() guard is called before any write operation. Reopening a locked period requires Controller-or-above role and a mandatory reason string. reopenedById, reopenedAt, and reopenReason create an audit trail. Before any period transitions to LOCKED, 11 validation checks run: 5 blocking (documents reviewed, JEs posted, subledger balanced, leases classified, schedules generated) and 6 warnings. The subledger balance check uses a $0.01 tolerance to absorb floating-point noise from aggregate Prisma sums without masking real imbalances.


Scenario comparison

Before committing a modification, users need to understand the impact. Our model_scenario tool runs the entire calculation pipeline in memory without persisting anything, completely read-only until the user commits.

What-If Analysis
Scenario Comparison
Give back floors 4–5, keep 1–3. $4M penalty SSP-allocated. Revised lease at $300K/mo.
Metric
Current
After Modification
Delta
Lease Liability
$42,000,000
$32,200,000
$9,800,000
ROU Asset
$38,000,000
$22,800,000
$15,200,000
Monthly Expense
$500,000
$300,000
$200,000
Remaining Term
120 mo
120 mo
Gain / (Loss)
$629,000
to P&L
Partial Termination: The $4M penalty is SSP-allocated: only $129K (3.2%) hits P&L. The remaining $3.87M is deferred into the revised liability. Combined with proportional derecognition, the net gain is $629,000.
Toggle between 3 scenarios · Numbers animate between states · Green = favorable, Red = unfavorable

The partial termination SSP allocation alone, if done manually in a spreadsheet, takes a senior accountant 2-4 hours per modification with a meaningful error rate. In our system it runs in under 100ms and produces an audit-ready narrative explaining exactly how the penalty was allocated and which ASC paragraphs govern the treatment.

The code is the spec. The spec is the code. The auditor reads the accountingTreatment field on the modification record and sees exactly what the system did and why.


See Lease Accounting to learn more about these capabilities.

Next: roll forwards that generate themselves, the AI agent that replaces a 2-person, 2-hour manual process.