RevRec brainstorm · ASC scenarios · ASC 606 priority cards

21 — ASC 606 priority scenario cards (concrete)

Status: design cards — not yet automated tests
Parent catalog: 20-asc606-scenario-catalog.md
Template matches: 04-engine-scenarios.md

These deepen new / weak partial rows with numeric Given/When/Then.
Coverage tags: Engine / RevRec smoke from catalog.


Card conventions


A606-E-8 — Cumulative catch-up modification

Coverage today: new (no S0x; rare in smoke)
ASC: 606-10-55-129…133; 606-10-25-13(b)
Policy: mod.cumulative

Given: Contract C1, single PO (not a series of distinct services), TP=1,200
       Service 1 Jan–31 Dec; method=over-time input/% complete
       By 30 Jun: 50% complete → recognized 600, remaining allocated 600
When:  1 Jul approved mod changes scope/price; remaining goods not distinct
       New TP for contract = 1,800 (or remaining consideration remeasured per example)
Then:  Apply cumulative catch-up so total recognized to date reflects revised measure
       of progress × revised TP (catch-up in July)
       Past “schedule shape” may change; audit cites mod.cumulative + source event
Engine: NEW → add S09 (or promote as S03b)
Smoke:  none mapped — NEW case needed

A606-C-contract_existence_25_1 / A606-E-1 — Collectibility gate

Coverage: new
ASC: 606-10-25-1(e); Example 1

Given: Customer with significant credit risk; arrangement otherwise looks like a contract
When:  open_contract evaluated
Then:  If collectibility not probable → no Contract / no revenue; quarantine
       If probable → Contract opens; TP may still reflect implicit concession (E-2/E-3)
Engine: NEW → S10 collectibility fail / pass pair
Smoke:  none

A606-E-2 / E-3 — Implicit price concession

Coverage: partial (smoke credit-note themes only)
ASC: 606-10-55-99…105

Given: List price 12,000/year; history shows customer pays ~7,200 and entity accepts
When:  open_contract
Then:  TP = 7,200 (concession), not 12,000 with bad-debt later
       Schedule/allocation use 7,200
Engine: NEW → S11
Smoke:  tag:credit-note (weak) — mark needs dedicated case

A606-E-7 vs E-8 — Prospective services mod (baseline already S03)

Coverage: covered via S03 + prospective-modification smoke — card for contrast

Given: S02 through June: revenue 600, deferred 600 (TP 1,200 annual)
When:  1 Jul upgrade; remaining services distinct → mod.prospective
Then:  Recognized-to-date unchanged; remaining open schedule rebuilt for new remaining TP
       (S03 numbers)
Engine: S03
Smoke:  prospective-modification, simple-mod

A606-P05 / terminate — Cancellation mid-term

Coverage: partial (S05 todo; smoke termination)
ASC: mod/terminate policies; ADR 0005 default void remaining

Given: S02 after April: revenue 400, deferred 800
When:  terminate on 1 May; policy term.cancel.void_remaining; no penalty
Then:  Open schedule voided; deferred → 0; revenue stays 400 (no auto catch-up)
       Optional penalty invoice is separate billing / PO per policy
Engine: specify S05 with these numbers
Smoke:  tag:termination, prospective-modification terminations sheet

A606-P06 / E-18 — Multi-PO relative SSP

Coverage: partial (S06 later; smoke ssp)
ASC: 606-10-32-28…32

Given: Bundle: License (SSP 800) + Support 1yr (SSP 400); TP cash = 900
When:  open_contract multi-PO; ssp.relative
Then:  Allocated License 600, Support 300 (900 × 800/1200, 900 × 400/1200)
       Recognize each PO per its method
Engine: specify S06
Smoke:  listPriceSSP, tag:ssp, no-allocation-mod (contrast)

A606-P07 / VC constraint — Usage with constraint

Coverage: partial (S07 later; cb-metered)
ASC: 606-10-32-5, 32-11

Given: Pay-as-you-go usage; expected usage value 10,000; significant reversal risk if include all
When:  estimate TP / recognize usage
Then:  Include only amount probable not to reverse significantly (constraint)
       True-up when uncertainty resolves; no silent full expected value if constrained
Engine: specify S07
Smoke:  cb-metered (may not assert constraint — NEW asserts needed)

A606-P08 — Proportional / delivery

Coverage: partial
ASC: 606-10-25-27; measure progress

Given: PS PO allocated 30,000; progress by hours / delivery events
When:  record_delivery 40% complete in period P
Then:  Recognize 12,000 in P; remaining schedule reflects 60%
Engine: specify S08
Smoke:  service-delivery-ratable, tag:service-delivery

A606-C-rpo_50_13 / E-42 — RPO disclosure

Coverage: new
ASC: 606-10-50-13…14

Given: Portfolio of open POs with remaining allocated − satisfied = 2,400,000
When:  RPO report for period-end
Then:  Disclose aggregate remaining TP; time bands (e.g. ≤1y, 1–2y, >2y) or qualitative
       Practical expedient flags if used (≤1 year / right-to-invoice)
Engine: NEW → S12 reporting scenario
Smoke:  none

A606-C-material_right_55_41 / E-49 / E-51 — Material right (renewal / voucher)

Coverage: new
ASC: 606-10-55-41…45; Examples 49, 51

Given: Year-1 fee 1,200; renewal option at 50% off typical renewal (material right)
When:  open_contract
Then:  Allocate portion of TP to material-right PO; defer until exercise/expiry
       Not all cash = Year-1 SaaS PO
Engine: NEW → S13
Smoke:  none (gap-domain-material-rights noted in quarry)

A606-C-upfront_fees_55_50 / E-53 — Nonrefundable upfront fee

Coverage: new

Given: Setup fee 3,000 + annual SaaS 12,000; setup not a distinct PO (or is — two variants)
When:  open_contract
Then:  If not distinct → upfront included in TP / recognized over access period
       If distinct → separate PIT or over-time PO
Engine: NEW → S14a/S14b
Smoke:  none

A606-P02 — Contract asset (recognize before bill)

Coverage: partial (S01 note; smoke unbilled)
ASC: 606-10-45-3

Given: Annual ratable PO; no invoice yet; recognize month 1
When:  recognize(period)
Then:  Revenue ↑; contract asset / unbilled ↑ (not AR until unconditional)
       When invoice later: asset → AR / liability mechanics per identity
Engine: strengthen S01 balance-sheet labels
Smoke:  deferred-unbilled-by-item, tag:deferred-revenue

A606-P10 — PPA after hard lock

Coverage: partial
ADR 0005

Given: Period 2024-03 HARD_LOCKED; revenue posted
When:  Late source event would change Mar recognition
Then:  No silent rewrite of Mar; book PPA / catch-up in next open period with audit
Engine: NEW → S15
Smoke:  tag:ppa, simple-mod reopen path (related but not identical)

A606-P04 overflow — CN > unrecognized

Coverage: extend S04
ADR 0005 cn.overflow.reverse_recog

Given: After recognize YTD 900; deferred 300
When:  CN 500 with cn.refund_unrecog + overflow.reverse_recog
Then:  Deferred → 0; reverse recognized 200; AR/credit mechanics as billing
Engine: extend S04
Smoke:  creditnote-scenarios* (verify overflow explicitly — may be NEW assert)

A606-C-combine_contracts_25_9 — Combine contracts

Coverage: new

Given: Two CB subscriptions entered same time, interdependent pricing
When:  normalize/open
Then:  Policy combine_contracts → single Contract for allocation OR keep separate with documented rationale
Engine: NEW → S16
Smoke:  none

A606-C-principal_agent_55_36 — Principal vs agent

Coverage: new (gap-domain-principal-agent)

Given: Marketplace / pass-through charge
When:  open_contract / record_billing
Then:  If agent → recognize net; if principal → gross; tax/pass-through roles clear for AC
Engine: NEW → S17
Smoke:  none

A606-C-breakage_55_46 — Breakage

Coverage: new

Given: Prepaid credits / wallet unlikely fully used
When:  estimate breakage
Then:  Recognize breakage as TP when expected; constraint if refundable
Engine: NEW → S18
Smoke:  none

Smoke-only (keep; add engine later)

Id Title Smoke Engine action
A606-P11 Pause / resume pause-revenue NEW S19
A606-P12 Voided invoice voided-invoice NEW S20 (billing-only; no PO invent)

Summary — what to bake later

Already concrete in engine docs Specify next (from this file) New families
S01–S04 S05–S08 with numbers above S09–S20 (catch-up, collectibility, concession, RPO, material right, upfront, PPA, combine, PvA, breakage, pause, void invoice)

RevRec smoke covers prospective mod, ratable plans, SSP uploads, CN, deferred/unbilled, delivery, termination sheets, pause, void invoice — but does not replace ASC cards for collectibility, cumulative catch-up, material right, RPO, breakage, principal-agent.