Exact usage pricing with verified catalog migration audits, multi-customer mixed-bill replay and per-customer release policies.
moon update
moon test --target all --deny-warn
moon run cmd/demo --target wasmlet plan = @jieheng.compile_plan(
id="api", version="2026-09", metric="requests",
unit="request", currency="USD",
tiers=[
{ up_to: Some("1000"), unit_price: "0" },
{ up_to: None, unit_price: "0.001" },
],
)
let calculation = @jieheng.rate(plan, {
customer: "acme", metric: "requests", period: "2026-09", quantity: "1501",
})
let settlement = @jieheng.settle(calculation, scale=2, rounding=HalfEven)
// calculation.total == "0.501"; settlement.amount == "0.50"
// settlement.delta == "-0.001"moon update
moon fmt
moon info
moon check --target all --deny-warn
moon test --target all --deny-warnpub(all) struct Bill {
customer : String
period : String
currency : String
items : Array[BillEvidence]
totals : BillTotals
} derive(Eq, Debug)pub(all) enum BillEvidence {
MeteredCharge(Charge)
PackageCharge(PackageEvidence)
} derive(Eq, Debug)pub(all) struct BillQuota {
request : BudgetRequest
variable_metric : String
bill : Bill
first_unaffordable : Bill?
} derive(Eq, Debug)pub struct Catalog {
// private fields
}pub(all) struct CatalogMigration {
starts_on : String
ends_before : String
spans : Array[MigrationSpan]
} derive(Eq, Debug)pub(all) struct CatalogReplay {
currency : String
rows : Array[CatalogReplayRow]
baseline_exact : String
candidate_exact : String
baseline_settled : String
candidate_settled : String
exact_delta : String
settled_delta : String
increased : Int
decreased : Int
unchanged : Int
max_increase : String
max_increase_index : Int?
} derive(Eq, Debug)pub(all) struct Charge {
calculation : Calculation
minimum : String
zero_usage : ZeroUsageMinimum
top_up : String
total : String
settlement : Settlement
} derive(Eq, Debug)pub(all) struct ChargeInput {
plan : Plan
usage : Usage
minimum : String
zero_usage : ZeroUsageMinimum
}pub(all) struct CohortComparison {
rows : Array[Comparison]
baseline_exact : String
candidate_exact : String
baseline_settled : String
candidate_settled : String
exact_delta : String
settled_delta : String
} derive(Eq, Debug)pub(all) struct MigrationSpan {
metric : String
starts_on : String
ends_before : String
baseline_entry : Int?
candidate_entry : Int?
changes : Array[CatalogChange]
} derive(Eq, Debug)pub(all) struct PackageEvidence {
plan_id : String
plan_version : String
currency : String
unit : String
usage : Usage
package_size : String
package_price : String
packages : String
unused_units : String
total : String
settlement : Settlement
} derive(Eq, Debug)pub struct PackagePlan {
// private fields
}pub struct Plan {
// private fields
}pub(all) struct QuotaQuote {
request : BudgetRequest
evidence : Evidence
first_unaffordable : Evidence?
} derive(Eq, Debug)pub struct Schedule {
// private fields
}fn analyze_prices(baseline : Plan, candidate : Plan, limit : String) -> PriceAnalysis raise PricingErrortest {
let a = @jieheng.compile_plan(
id="api",
version="v1",
metric="calls",
unit="call",
currency="USD",
tiers=[{ up_to: None, unit_price: "1", }],
)
let r = @jieheng.analyze_prices(a, a, "999999999999999999999999999999")
inspect(r.spans.length(), content="1")
inspect(r.maximum_delta, content="0")
}fn audit_catalog_migration(before : Catalog, after : Catalog, starts_on : String, ends_before : String) -> CatalogMigration raise PricingErrortest {
let p = @jieheng.compile_package(
id="sms",
version="v1",
metric="messages",
unit="message",
currency="USD",
package_size="1000",
package_price="0.85",
)
let c = @jieheng.compile_catalog([
{ starts_on: "2026-10-01", ends_before: None, tariff: PackageTariff(p), },
])
let r = @jieheng.audit_catalog_migration(c, c, "2026-10-01", "2026-11-01")
inspect(r.spans[0].changes.length(), content="0")
}fn catalog_gaps(catalog : Catalog, starts_on : String, ends_before : String) -> Array[CatalogGap] raise PricingErrorfn check_replay_policy(before : Catalog, after : Catalog, cases : ArrayView[CatalogReplayCase], report : CatalogReplay, policy : ReplayPolicy, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn compare_bills(before : ArrayView[BillItem], after : ArrayView[BillItem], scale~ : Int, rounding~ : Rounding) -> BillComparison raise PricingErrortest {
let p = @jieheng.compile_package(
id="sms",
version="v1",
metric="messages",
unit="message",
currency="USD",
package_size="1000",
package_price="0.85",
)
let items : Array[@jieheng.BillItem] = [
Packaged(p, {
customer: "acme",
metric: "messages",
period: "October",
quantity: "2501",
}),
]
let c = @jieheng.compare_bills(items[:], items[:], scale=2, rounding=HalfEven)
inspect(c.exact_delta, content="0")
}fn compare_cohort(baseline : Plan, candidate : Plan, usages : ArrayView[Usage], scale~ : Int, rounding~ : Rounding) -> CohortComparison raise PricingErrortest {
let plan = @jieheng.compile_plan(
id="api",
version="v1",
metric="calls",
unit="call",
currency="USD",
tiers=[{ up_to: None, unit_price: "0.004", }],
)
let report = @jieheng.compare_cohort(
plan,
plan,
[{ customer: "acme", metric: "calls", period: "2026-10", quantity: "1", }],
scale=2,
rounding=HalfEven,
)
inspect(report.baseline_exact, content="0.004")
inspect(report.baseline_settled, content="0")
}fn compare_plans(baseline : Plan, candidate : Plan, usage : Usage, scale~ : Int, rounding~ : Rounding) -> Comparison raise PricingErrortest {
let before = @jieheng.compile_plan(
id="api",
version="v1",
metric="calls",
unit="call",
currency="USD",
tiers=[{ up_to: None, unit_price: "0.004", }],
)
let after = @jieheng.compile_plan(
id="api",
version="v2",
metric="calls",
unit="call",
currency="USD",
tiers=[{ up_to: None, unit_price: "0.006", }],
)
let report = @jieheng.compare_plans(
before,
after,
{ customer: "acme", metric: "calls", period: "2026-10", quantity: "1", },
scale=2,
rounding=HalfEven,
)
inspect(report.exact_delta, content="0.002")
inspect(report.settled_delta, content="0.01")
}fn compile_package(id~ : String, version~ : String, metric~ : String, unit~ : String, currency~ : String, package_size~ : String, package_price~ : String) -> PackagePlan raise PricingErrorfn compile_plan(id~ : String, version~ : String, metric~ : String, unit~ : String, currency~ : String, tiers~ : ArrayView[Tier], mode? : PricingMode) -> Plan raise PricingErrorfn quote_bill_quota(input : BillQuotaInput, scale~ : Int, rounding~ : Rounding) -> BillQuota raise PricingErrortest {
let p = @jieheng.compile_package(
id="sms",
version="v1",
metric="messages",
unit="message",
currency="USD",
package_size="1000",
package_price="0.85",
)
let input : @jieheng.BillQuotaInput = {
fixed: [],
variable: PackageTariff(p),
request: {
customer: "acme",
period: "October",
budget: "3",
limit: "10000",
},
}
let q = @jieheng.quote_bill_quota(input, scale=2, rounding=HalfEven)
inspect(q.bill.totals.amount, content="2.55")
}fn quote_budget(plan : Plan, request : BudgetRequest, scale~ : Int, rounding~ : Rounding) -> BudgetQuote raise PricingErrortest {
let p = @jieheng.compile_plan(
id="api",
version="v1",
metric="calls",
unit="call",
currency="USD",
tiers=[{ up_to: None, unit_price: "0.006", }],
)
let q = @jieheng.quote_budget(
p,
{ customer: "acme", period: "2026-10", budget: "0.01", limit: "100", },
scale=2,
rounding=HalfEven,
)
inspect(q.evidence.calculation.usage.quantity, content="2")
inspect(q.evidence.settlement.amount, content="0.01")
}fn quote_quota(plan : Plan, request : BudgetRequest, scale~ : Int, rounding~ : Rounding) -> QuotaQuote raise PricingErrortest {
let p = @jieheng.compile_plan(
id="api",
version="v1",
metric="calls",
unit="call",
currency="USD",
mode=Volume,
tiers=[
{ up_to: Some("5"), unit_price: "10", },
{ up_to: Some("10"), unit_price: "1", },
{ up_to: None, unit_price: "20", },
],
)
let r = @jieheng.quote_quota(
p,
{ customer: "acme", period: "2026-10", budget: "12", limit: "20", },
scale=2,
rounding=HalfEven,
)
inspect(r.evidence.calculation.usage.quantity, content="1")
inspect(r.first_unaffordable.unwrap().calculation.usage.quantity, content="2")
}test {
let plan = @jieheng.compile_plan(
id="api",
version="v1",
metric="requests",
unit="request",
currency="USD",
tiers=[
{ up_to: Some("1000"), unit_price: "0", },
{ up_to: None, unit_price: "0.001", },
],
)
let result = @jieheng.rate(plan, {
customer: "acme",
metric: "requests",
period: "2026-09",
quantity: "1001",
})
inspect(result.total, content="0.001")
}fn rate_bill(items : ArrayView[BillItem], scale~ : Int, rounding~ : Rounding) -> Bill raise PricingErrortest {
let p = @jieheng.compile_package(
id="sms",
version="v1",
metric="messages",
unit="message",
currency="USD",
package_size="1000",
package_price="0.85",
)
let b = @jieheng.rate_bill(
[
Packaged(p, {
customer: "acme",
metric: "messages",
period: "2026-10",
quantity: "2501",
}),
],
scale=2,
rounding=HalfEven,
)
inspect(b.totals.amount, content="2.55")
}fn rate_catalog(catalog : Catalog, on : String, usages : ArrayView[Usage], scale~ : Int, rounding~ : Rounding) -> CatalogBill raise PricingErrortest {
let p = @jieheng.compile_package(
id="sms",
version="v1",
metric="messages",
unit="message",
currency="USD",
package_size="1000",
package_price="0.85",
)
let c = @jieheng.compile_catalog([
{ starts_on: "2026-10-01", ends_before: None, tariff: PackageTariff(p), },
])
let r = @jieheng.rate_catalog(
c,
"2026-10-22",
[
{
customer: "acme",
metric: "messages",
period: "October",
quantity: "2501",
},
],
scale=2,
rounding=HalfEven,
)
inspect(r.bill.totals.amount, content="2.55")
}fn rate_charge(plan : Plan, usage : Usage, minimum~ : String, zero_usage~ : ZeroUsageMinimum, scale~ : Int, rounding~ : Rounding) -> Charge raise PricingErrortest {
let p = @jieheng.compile_plan(
id="api",
version="v1",
metric="calls",
unit="call",
currency="USD",
tiers=[{ up_to: None, unit_price: "0.004", }],
)
let c = @jieheng.rate_charge(
p,
{ customer: "acme", metric: "calls", period: "2026-10", quantity: "1", },
minimum="0.005",
zero_usage=Charge,
scale=2,
rounding=HalfEven,
)
inspect(c.top_up, content="0.001")
inspect(c.total, content="0.005")
inspect(c.settlement.amount, content="0.00")
}fn rate_invoice(items : ArrayView[ChargeInput], scale~ : Int, rounding~ : Rounding) -> Invoice raise PricingErrortest {
let p = @jieheng.compile_plan(
id="api",
version="v1",
metric="calls",
unit="call",
currency="USD",
tiers=[{ up_to: None, unit_price: "0.006", }],
)
let bill = @jieheng.rate_invoice(
[
{
plan: p,
usage: {
customer: "acme",
metric: "calls",
period: "2026-10",
quantity: "1",
},
minimum: "0",
zero_usage: Waive,
},
],
scale=2,
rounding=HalfEven,
)
inspect(bill.total, content="0.006")
inspect(bill.amount, content="0.01")
}fn rate_packages(plan : PackagePlan, usage : Usage, scale~ : Int, rounding~ : Rounding) -> PackageEvidence raise PricingErrortest {
let p = @jieheng.compile_package(
id="seats",
version="v1",
metric="users",
unit="user",
currency="USD",
package_size="5",
package_price="10",
)
let e = @jieheng.rate_packages(
p,
{ customer: "acme", metric: "users", period: "2026-10", quantity: "6", },
scale=2,
rounding=HalfEven,
)
inspect(e.packages, content="2")
inspect(e.unused_units, content="4")
inspect(e.settlement.amount, content="20.00")
}fn rate_scheduled(schedule : Schedule, on : String, usage : Usage, scale~ : Int, rounding~ : Rounding) -> ScheduledEvidence raise PricingErrortest {
let p = @jieheng.compile_plan(
id="api",
version="v1",
metric="calls",
unit="call",
currency="USD",
tiers=[{ up_to: None, unit_price: "1", }],
)
let s = @jieheng.compile_schedule([
{ starts_on: "2026-10-01", ends_before: None, plan: p, },
])
let e = @jieheng.rate_scheduled(
s,
"2026-10-22",
{ customer: "acme", metric: "calls", period: "October", quantity: "2", },
scale=2,
rounding=HalfEven,
)
inspect(e.evidence.settlement.amount, content="2.00")
}fn render_bill_markdown(items : ArrayView[BillItem], bill : Bill, scale~ : Int, rounding~ : Rounding) -> String raise PricingErrorfn replay_catalogs(before : Catalog, after : Catalog, cases : ArrayView[CatalogReplayCase], scale~ : Int, rounding~ : Rounding) -> CatalogReplay raise PricingErrortest {
let p = @jieheng.compile_package(
id="sms",
version="v1",
metric="messages",
unit="message",
currency="USD",
package_size="10",
package_price="1",
)
let c = @jieheng.compile_catalog([
{ starts_on: "2026-01-01", ends_before: None, tariff: PackageTariff(p), },
])
let cases : Array[@jieheng.CatalogReplayCase] = [
{
on: "2026-10-22",
usages: [
{
customer: "acme",
metric: "messages",
period: "October",
quantity: "11",
},
],
},
]
let r = @jieheng.replay_catalogs(c, c, cases[:], scale=2, rounding=HalfEven)
inspect(r.unchanged, content="1")
}fn settle(calculation : Calculation, scale~ : Int, rounding~ : Rounding) -> Settlement raise PricingErrorfn verify_analysis(baseline : Plan, candidate : Plan, limit : String, report : PriceAnalysis) -> Unit raise PricingErrorfn verify_bill(items : ArrayView[BillItem], bill : Bill, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_bill_comparison(before : ArrayView[BillItem], after : ArrayView[BillItem], report : BillComparison, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_bill_quota(input : BillQuotaInput, report : BillQuota, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_budget(plan : Plan, request : BudgetRequest, quote : BudgetQuote, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_calculation(plan : Plan, usage : Usage, calculation : Calculation) -> Unit raise PricingErrorfn verify_catalog(catalog : Catalog, on : String, usages : ArrayView[Usage], record : CatalogBill, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_catalog_migration(before : Catalog, after : Catalog, starts_on : String, ends_before : String, report : CatalogMigration) -> Unit raise PricingErrorfn verify_catalog_replay(before : Catalog, after : Catalog, cases : ArrayView[CatalogReplayCase], report : CatalogReplay, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_charge(plan : Plan, usage : Usage, charge : Charge, minimum~ : String, zero_usage~ : ZeroUsageMinimum, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_cohort(baseline : Plan, candidate : Plan, usages : ArrayView[Usage], report : CohortComparison, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_comparison(baseline : Plan, candidate : Plan, usage : Usage, report : Comparison, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_evidence(plan : Plan, usage : Usage, evidence : Evidence, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_invoice(items : ArrayView[ChargeInput], invoice : Invoice, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_packages(plan : PackagePlan, usage : Usage, record : PackageEvidence, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_quota(plan : Plan, request : BudgetRequest, quote : QuotaQuote, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_scheduled(schedule : Schedule, on : String, usage : Usage, record : ScheduledEvidence, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorfn verify_settlement(calculation : Calculation, settlement : Settlement, scale~ : Int, rounding~ : Rounding) -> Unit raise PricingErrorInstall
Download zipExact usage pricing with verified catalog migration audits, multi-customer mixed-bill replay and per-customer release policies.