01must proveConfirmed | A rate is positive decimal text with no more than eight integer and ten fractional digits for a supported non-base currency on a valid date; numeric input is refused to preserve precision. ✓ A valid configuration completes the stated operation.✗ A conflicting configuration receives the stated refusal. | validation | api, service, database | test |
02must proveConfirmed | A unit has at most one rate for each currency and date, and a saved rate cannot change its unit, currency, date or source. | invariant | service, database | test |
03must proveConfirmed | Rate resolution returns the latest quote on or before the requested date, defaulting to the workspace’s current date, with source and pricing settings or no quote; Commerce uses the same database answer. | calculation | service, database | test |
04must proveConfirmed | Provider rates cannot be edited manually; deletion is permitted, so correction requires deletion followed by another fill. | policy | service | observed |
05must proveConfirmed | Provider filling makes one request outside the database transaction for missing quotes among selected provider currencies, skips existing dated quotes, reports unpriced currencies and stores quotes on the provider’s date. | calculation | service | test |
06must proveConfirmed | Filling refuses table-sourced or unsupported currencies and units without provider currencies, and writes nothing when the provider is unavailable or declines. | validation | service | test |
07must proveConfirmed | Conversion rounds half away from zero at the target currency’s precision, while reciprocal rates round half up to ten decimal places. | calculation | service | test |
08Confirmed | Rate lists order by unit, currency and descending date, support unit, currency and inclusive date filters, and provider filling requires rate-create permission. | policy | api, service | test |