subscription_terms_below_floor
The same route with a minute_rate_minor below the $0.05/min publishable floor (CANON 124) on a row carrying neither an explicit owner approval reference (the floor_approval_ref column) nor a pricing_memo_ref. It is the custom-path floor CHECK - the second enforcement point beneath rate_card._assert_publishable() (packages/domain/src/vocapable_domain/rate_card.py:181-204), which guards only the published card and can see no number agreed with one tenant. Note the unit: the constraint's literal is minor units per minute, the form the card publishes and a contract states, while plans.overage_rates["telephony_minutes"] is per second - getting the conversion wrong moves the floor by a factor of sixty. The conversion happens in one place - volume_pricing.minute_charge_exact_minor, which takes any per-minute rate; rate_card.per_second_rate_minor converts only published term rates when seeding the catalog column and can never carry a negotiated one (adr/0029 d3 as amended). Nothing was written. What an operator does: raise the rate to the floor, or attach the arithmetic - the pricing memo showing the published card, the volume math and a third-party comparable - and record the owner approval, which is what turns a sub-floor figure into the computed commitment outcome CANON 124 permits. P1 - built 2026-08-19.
Problem shape
Every non-2xx response is an RFC 9457 application/problem+json body. The type URI below is stable and machine-matchable, so branch on the final path segment (the code) and treat the status as redundant confirmation. See the error-handling guide.
{
"type": "https://docs.vocapable.com/errors/subscription_terms_below_floor",
"title": "…",
"status": 422,
"detail": "…",
"instance": "/v1/…"
}