01must proveProposed | A new product uses a supplied or name-derived configuration identity of at most 63 characters, starting with a lowercase letter and using lowercase letters, digits and single underscores without reserved words. ✓ The name Café Parking Permit (Annual) produces the readable Code cafe_parking_permit_annual.✗ A Code containing uppercase letters and a hyphen fails validation. | validation | api, service, database | test |
02must proveProposed | Name-derived identities receive no automatic suffix: a collision or a name yielding no valid identity requires the caller to supply one. | validation | service | test |
03must proveProposed | Within a workspace, product identities are unique across product kinds. | invariant | database | test |
04must proveProposed | Creation requires an active registered kind, an existing business unit in the workspace and a nonblank name. | validation | service, database | test |
05must proveProposed | The server discards a submitted pricing model and uses the kind’s model, which the database also requires. | invariant | api, database | test |
06must proveProposed | Creation fixes the product’s identity, kind and business unit, and both service and database reject later changes. | invariant | service, database | test |
07Proposed | Creation defaults to active and permits inactive, while ordinary creation and replacement requests cannot choose retired. | lifecycle | api | observed |
08must proveProposed | A sale window with both boundaries requires its opening instant to precede its closing instant. | validation | service, database | test |
09must proveProposed | Cancellation and restocking fees use nonnegative whole minor units of the business unit’s base currency. | validation | api, database | test |
10must proveProposed | Unsellable kinds reject fees and selling settings, while giver-priced kinds also reject quantity discounts and bundles. | validation | service | test |
11must proveProposed | Product creation commits its record, pricing, components and feature collections together or retains none of those writes. | invariant | service | test |
12must proveProposed | Products with older generated identities remain readable, referenceable and deletable, but replacement, retirement and reactivation fail. | lifecycle | database | test |
13must proveProposed | Products support no custom field values and reject requests containing them. | validation | api | test |
14must proveProposed | Product creation requires product create permission. | permission | api | test |
15Proposed | The console derives an editable Code from Name during creation, selects the list’s unit or the working unit, and returns to the list after successful creation. | policy | console | observed |