costroid-focus 0.1.0

FOCUS 1.3 Cost and Usage export primitives: typed records and JSON/CSV serialization for AI tool billing data.
Documentation

FOCUS 1.3 Cost and Usage export primitives for Costroid.

As of Milestone 6a, FocusRecord carries the full FOCUS 1.3 Cost and Usage column set so the official validator's conditional dependency checks resolve. Columns Costroid cannot derive from local data are emitted null where the spec permits; the few that a not-null cascade forces are populated with the spec-correct categorical value or, for billing-source identifiers with no local value, a clearly-non-billing placeholder (documented as a deviation).

Numeric columns serialize as genuine numbers in JSON and as decimal-pointed values in CSV (so the validator's DECIMAL/DOUBLE/FLOAT type checks pass even when every value in a column is whole).

As of Milestone 6b, pricing is represented per token: PricingUnit = "tokens", PricingQuantity is the token count, and the unit-price columns are per-token rates (the per-1M catalog rate ÷ 1_000_000). Cost is unchanged — cost = tokens × rate is invariant — only the representation changed. On rows with no priced SKU (SkuPriceId null), FOCUS 1.3 requires ConsumedQuantity / PricingQuantity / PricingUnit / PricingCategory to be null, so they are; the raw token count still travels on the always-populated x_ConsumedTokens custom column for the aggregation engine. One genuine validator-ruleset defect remains documented (the ListCost/ContractedCost = unit-price × quantity check, which the validator evaluates in zero-tolerance float64 even though Costroid's decimal arithmetic is exact); see scripts/focus_known_failures.txt.