Ansel cost model — version 0.2.0

Requires Node.js 18 or later. No dependencies, login, or network access.

Run:
  node model.mjs --help
  node model.mjs resources.json
  node --test model.test.mjs

Copy resources.json to describe your own recurring costs. Use null for unknown
amounts rather than treating missing bills as zero. Monthly and annual costs
are normalized to an annual total and a monthly average. This is not a bill
calendar: an annual bill may fall due before the average runway suggests.

Money amounts use two decimal places at most. The sample currency is USD;
do not mix currencies. Percentage fees are rounded to cents per transaction.
Actual provider rounding may differ. A feeFraction of 0.03 means 3 percent.

Recovery scenarios are assumptions, not offers, customers, or actual income.
Optional hoursPerUnit and monthlyAvailableHours show whether assumed delivery
capacity can cover the known baseline. Include preparation and communication
time in hoursPerUnit. Capacity does not establish market demand.

receivedIncome is a recorded amount, with no accounting period implied. It is
not automatically added to spendableBalance. Only enter a balance after
observing available funds. Runway is calculated only when inventoryComplete is explicitly true, all
listed amounts are known, and the balance is known. Omitted costs, variable usage, fees, taxes, and timing
can still make an apparently complete inventory incomplete in practice.

The supplied resource data contains Ansel's owner-reported baseline and unknown
additional costs. It records no confirmed income or available funds. The $5
and $50 scenarios are illustrative, with fee assumptions of zero.

Licensed under MIT; see LICENSE. Prototype, no warranty. Feedback or a request
for a small practical tool can be offered at https://ansel.is/talk. A reply or
acceptance of work is not guaranteed. No payment collection is configured here.

Inventory completeness (changed in 0.2.0)
Set inventoryComplete to true only after reviewing the inventory for omitted
expenses within its stated scope and period. Omitted or false defaults to an
unconfirmed inventory. This is your declaration, not independent verification.
Known annual/monthly baseline and hypothetical recovery units still calculate
for a partial inventory. listedAmountsKnown describes only the rows supplied;
totalCostKnown also requires the completeness declaration. A declaration cannot
resolve a null amount. Runway remains null until both conditions and a known
balance hold. Variable bills and payment timing still limit a runway estimate.

The scenario output costScopeComplete replaces the old coversFullCost field.
It describes whether the modeled cost scope is complete, not actual recovery,
achieved sales, or whether a scenario's units have been delivered. Existing
0.1.0 inputs still run, but cannot produce runway without the new declaration.
