@ContextVM-org
Key Findings
1. CEP-8 Payment Waiving vs. Top-Up Alignment
Currently, chat.complete hardcodes a balance check inside the tool handler and throws a raw Error("insufficient balance"). Per design/billing.md:
chat.complete is a waived capability: resolvePrice handles authorization. If funded (balanceUsd >= floor), it returns waivePrice(). Output is capped by balance and usage is debited post-generation. If unfunded, resolvePrice returns rejectPrice("insufficient balance") (-32000 RPC rejection).
balance.topup is a priced capability: resolvePrice returns quotePrice(sats) emitting a CEP-8 -32042 Payment Required Lightning invoice. Paid invoices credit the USD ledger.
2. Free Model Output Capping Bug
In pricing.ts (computeOutputCap), when rates.outputPerToken <= 0 (free model), omitting explicit user/model max tokens causes cap to evaluate to Infinity. Because Number.isFinite(Infinity) is false, it falls back to { maxTokens: 1 }, abruptly terminating free streams after a single token.
@ContextVM-org
Key Findings
1. CEP-8 Payment Waiving vs. Top-Up Alignment
Currently,
chat.completehardcodes a balance check inside the tool handler and throws a rawError("insufficient balance"). Perdesign/billing.md:chat.completeis a waived capability:resolvePricehandles authorization. If funded (balanceUsd >= floor), it returnswaivePrice(). Output is capped by balance and usage is debited post-generation. If unfunded,resolvePricereturnsrejectPrice("insufficient balance")(-32000RPC rejection).balance.topupis a priced capability:resolvePricereturnsquotePrice(sats)emitting a CEP-8-32042 Payment RequiredLightning invoice. Paid invoices credit the USD ledger.2. Free Model Output Capping Bug
In
pricing.ts(computeOutputCap), whenrates.outputPerToken <= 0(free model), omitting explicit user/model max tokens causescapto evaluate toInfinity. BecauseNumber.isFinite(Infinity)isfalse, it falls back to{ maxTokens: 1 }, abruptly terminating free streams after a single token.