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.