Skip to content

709 cases · 487 automated · 222 manual

CaseAreaTitleKindCoverage
AC-893-01catalogue
P29.1 Commerce mode per workspace: English safety net (P23.0) shows zero diff for a workspace with commerce off.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Commerce mode per workspace (P29.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-mode.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-893

Expected English safety net (P23.0) shows zero diff for a workspace with commerce off.

OMNIZONE-893 · P29.1

Happy pathAutomated
AC-893-02catalogue
P29.1 Commerce mode per workspace: Turning commerce on for spacecraft shows the commerce tabs; turning off hides them with…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Commerce mode per workspace (P29.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-mode.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-893

Expected Turning commerce on for spacecraft shows the commerce tabs; turning off hides them with data intact.

OMNIZONE-893 · P29.1

Happy pathAutomated
AC-893-03catalogue
P29.1 Commerce mode per workspace: Role matrix + plan gate tests (403 plan_required when the plan lacks the group).

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Commerce mode per workspace (P29.1) on the seeded data
  3. Try the refused path described in the expected result (wrong role, other tenant, invalid input or missing setup)
  4. Run node --import tsx --test test/commerce-mode.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-893

Expected Role matrix + plan gate tests (403 plan_required when the plan lacks the group).

OMNIZONE-893 · P29.1

NegativeAutomated
AC-893-04catalogue
P29.1 Commerce mode per workspace: Side table org_commerce_settings (org_settings is at the 100-column cap): enabled, enabl…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Commerce mode per workspace (P29.1) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/commerce-mode.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-893

Expected Side table org_commerce_settings (org_settings is at the 100-column cap): enabled, enabled_at, default_store_channel_id. Off for every existing workspace (backfill explicit rows with enabled=0).

OMNIZONE-893 · P29.1

Edge caseAutomated
AC-893-05catalogue
P29.1 Commerce mode per workspace: New permission group commerce in shared/permissions.ts (pages: store, promotions, shippi…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Commerce mode per workspace (P29.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-mode.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-893

Expected New permission group commerce in shared/permissions.ts (pages: store, promotions, shipping, payments-online, online orders views) and plan entitlement in billing_plans.module_group_ids_json + BILLING_…

OMNIZONE-893 · P29.1

Happy pathAutomated
AC-893-06catalogue
P29.1 Commerce mode per workspace: Settings → Modules: 'Online store (e-commerce)' toggle, gated by plan; turning it off hi…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Commerce mode per workspace (P29.1) on the seeded data
  3. Try the refused path described in the expected result (wrong role, other tenant, invalid input or missing setup)
  4. Run node --import tsx --test test/commerce-mode.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-893

Expected Settings → Modules: 'Online store (e-commerce)' toggle, gated by plan; turning it off hides commerce UI but never deletes data.

OMNIZONE-893 · P29.1

NegativeAutomated
AC-893-07catalogue
P29.1 Commerce mode per workspace: Items form/detail: when commerce is off, keep today's simple item screens exactly (no ne…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Commerce mode per workspace (P29.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-mode.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-893

Expected Items form/detail: when commerce is off, keep today's simple item screens exactly (no new tabs/fields shown). When on, show the commerce tabs from #704/#744 (SEO, categories, attributes, media, channe…

OMNIZONE-893 · P29.1

Happy pathAutomated
AC-893-08catalogue
P29.1 Commerce mode per workspace: Expose commerceEnabled in bootstrap; one helper isCommerceEnabled(org) server + client.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Commerce mode per workspace (P29.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-mode.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-893

Expected Expose commerceEnabled in bootstrap; one helper isCommerceEnabled(org) server + client.

OMNIZONE-893 · P29.1

Happy pathAutomated
AC-894-01accounts
P30.1 Client address book: Existing invoices/PDFs unchanged (safety net); a client with 3 addresses can pick any on…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Client address book (P30.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shop-accounts.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-894

Expected Existing invoices/PDFs unchanged (safety net); a client with 3 addresses can pick any on a sales order.

OMNIZONE-894 · P30.1

Happy pathAutomated
AC-894-02accounts
P30.1 Client address book: Table client_addresses: label, kind (billing/shipping/both), contact_name, company, phon…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Client address book (P30.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shop-accounts.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-894

Expected Table client_addresses: label, kind (billing/shipping/both), contact_name, company, phone, email, line1, line2, city, region, postal_code, country_code, lat/lng, is_default_billing, is_default_shippin…

OMNIZONE-894 · P30.1

Happy pathAutomated
AC-894-03accounts
P30.1 Client address book: Backfill: each client's existing address text becomes one default billing+shipping addre…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Client address book (P30.1) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/shop-accounts.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-894

Expected Backfill: each client's existing address text becomes one default billing+shipping address (parsed best-effort, raw kept in line1) — clients.address column kept and mirrored from the default billing a…

OMNIZONE-894 · P30.1

Edge caseAutomated
AC-894-04accounts
P30.1 Client address book: Client detail → Addresses tab; client picker in documents can choose bill-to / ship-to a…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Client address book (P30.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shop-accounts.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-894

Expected Client detail → Addresses tab; client picker in documents can choose bill-to / ship-to address; public API /v1/clients includes addresses (additive).

OMNIZONE-894 · P30.1

Happy pathAutomated
AC-894-05accounts
P30.1 Client address book: Country list and address format per country come from jurisdiction data, not code.

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Client address book (P30.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shop-accounts.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-894

Expected Country list and address format per country come from jurisdiction data, not code.

OMNIZONE-894 · P30.1

Happy pathAutomated
AC-895-01channels
P29.2 Online store = a sales channel: A store channel appears in Channels with kind own_store; listing/publish/margin reports…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Online store = a sales channel (P29.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-store.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-895

Expected A store channel appears in Channels with kind own_store; listing/publish/margin reports work unchanged for it.

OMNIZONE-895 · P29.2

Happy pathAutomated
AC-895-02channels
P29.2 Online store = a sales channel: No new orders/listings tables were created — reuse sales_channels, channel_listings, cha…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Online store = a sales channel (P29.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-store.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-895

Expected No new orders/listings tables were created — reuse sales_channels, channel_listings, channel_orders.

OMNIZONE-895 · P29.2

Happy pathAutomated
AC-895-03channels
P29.2 Online store = a sales channel: Adapter contract tests (#707) pass for the omnizone adapter.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Online store = a sales channel (P29.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-store.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-895

Expected Adapter contract tests (#707) pass for the omnizone adapter.

OMNIZONE-895 · P29.2

Happy pathAutomated
AC-895-04channels
P29.2 Online store = a sales channel: Add platform omnizone to the channel adapter registry (functions/_lib/channels) as a loc…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Online store = a sales channel (P29.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-store.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-895

Expected Add platform omnizone to the channel adapter registry (functions/_lib/channels) as a local adapter: publish = mark channel_listings published; pull/import = no-op; orders arrive from checkout (P32.3)

OMNIZONE-895 · P29.2

Happy pathAutomated
AC-895-05channels
P29.2 Online store = a sales channel: Side table store_settings (1:1 with sales_channels where platform='omnizone'): store nam…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Online store = a sales channel (P29.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-store.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-895

Expected Side table store_settings (1:1 with sales_channels where platform='omnizone'): store name, default language, enabled languages, default + enabled currencies, prices include tax flag, stock location(s)

OMNIZONE-895 · P29.2

Happy pathAutomated
AC-895-06channels
P29.2 Online store = a sales channel: Channels page: 'Create online store' (only when commerce mode is on); a workspace may ha…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Online store = a sales channel (P29.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-store.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-895

Expected Channels page: 'Create online store' (only when commerce mode is on); a workspace may have more than one store (e.g. brands or countries). Store settings screen reuses settings form patterns.

OMNIZONE-895 · P29.2

Happy pathAutomated
AC-895-07channels
P29.2 Online store = a sales channel: Seeder: new workspaces get no store; spacecraft seed gets one in P37.5.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Online store = a sales channel (P29.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-store.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-895

Expected Seeder: new workspaces get no store; spacecraft seed gets one in P37.5.

OMNIZONE-895 · P29.2

Happy pathAutomated
AC-896-01storefront
P29.3 Category tree management: Tree of 3+ levels manageable; moving a parent moves its subtree; deleting a category wit…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Category tree management (P29.3) on the seeded data
  3. Carry out the flow the expected result describes
  4. Check the expected result and attach the evidence to OMNIZONE-896

Expected Tree of 3+ levels manageable; moving a parent moves its subtree; deleting a category with items asks to reassign.

OMNIZONE-896 · P29.3

Happy pathManual
AC-896-02storefront
P29.3 Category tree management: Export/import of categories round-trips (used by P36.8).

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Category tree management (P29.3) on the seeded data
  3. Carry out the flow the expected result describes
  4. Check the expected result and attach the evidence to OMNIZONE-896

Expected Export/import of categories round-trips (used by P36.8).

OMNIZONE-896 · P29.3

Happy pathManual
AC-896-03storefront
P29.3 Category tree management: Extend existing item_categories (0328): description_html, image_file_id, banner_file_id,…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Category tree management (P29.3) on the seeded data
  3. Carry out the flow the expected result describes
  4. Check the expected result and attach the evidence to OMNIZONE-896

Expected Extend existing item_categories (0328): description_html, image_file_id, banner_file_id, meta_title, meta_description, is_featured, show_in_menu, name_i18n/description_i18n per P27.5 convention. No se…

OMNIZONE-896 · P29.3

Happy pathManual
AC-896-04storefront
P29.3 Category tree management: Items → Categories page: tree with drag reorder/re-parent, create/edit drawer, active to…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Category tree management (P29.3) on the seeded data
  3. Carry out the flow the expected result describes
  4. Check the expected result and attach the evidence to OMNIZONE-896

Expected Items → Categories page: tree with drag reorder/re-parent, create/edit drawer, active toggle, item counts; CRUD API /api/item-categories with keyset listing.

OMNIZONE-896 · P29.3

Happy pathManual
AC-896-05storefront
P29.3 Category tree management: Item form: multi-select categories with primary flag (item_category_links); Items listin…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Category tree management (P29.3) on the seeded data
  3. Carry out the flow the expected result describes
  4. Check the expected result and attach the evidence to OMNIZONE-896

Expected Item form: multi-select categories with primary flag (item_category_links); Items listing filter by category (incl. descendants); bulk assign/remove categories from bulk actions.

OMNIZONE-896 · P29.3

Happy pathManual
AC-896-06storefront
P29.3 Category tree management: Channel imports (#708, #709) map platform categories into this tree (no duplicates by sl…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Category tree management (P29.3) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Check the expected result and attach the evidence to OMNIZONE-896

Expected Channel imports (#708, #709) map platform categories into this tree (no duplicates by slug/path).

OMNIZONE-896 · P29.3

Edge caseManual
AC-897-01catalogue
P29.4 Brands and tags as managed lookups (no free text): Existing items show the same brand/tag text as before (parity check); filters by brand/t…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Brands and tags as managed lookups (no free text) (P29.4) on the seeded data
  3. Carry out the flow the expected result describes
  4. Check the expected result and attach the evidence to OMNIZONE-897

Expected Existing items show the same brand/tag text as before (parity check); filters by brand/tag work in Items listing.

OMNIZONE-897 · P29.4

Happy pathManual
AC-897-02catalogue
P29.4 Brands and tags as managed lookups (no free text): Table brands (name, slug, logo_file_id, description_html, website, meta fields, name_i18…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Brands and tags as managed lookups (no free text) (P29.4) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Check the expected result and attach the evidence to OMNIZONE-897

Expected Table brands (name, slug, logo_file_id, description_html, website, meta fields, name_i18n, active); items.brand_id; backfill: create one brand per distinct existing items.brand text per workspace and…

OMNIZONE-897 · P29.4

Edge caseManual
AC-897-03catalogue
P29.4 Brands and tags as managed lookups (no free text): Tags lookup item_tags + links, backfilled from items.tags_json.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Brands and tags as managed lookups (no free text) (P29.4) on the seeded data
  3. Carry out the flow the expected result describes
  4. Check the expected result and attach the evidence to OMNIZONE-897

Expected Tags lookup item_tags + links, backfilled from items.tags_json.

OMNIZONE-897 · P29.4

Happy pathManual
AC-897-04catalogue
P29.4 Brands and tags as managed lookups (no free text): Settings → Catalogs gets Brands and Tags kinds (reuse catalogs/[kind] pattern); item for…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Brands and tags as managed lookups (no free text) (P29.4) on the seeded data
  3. Carry out the flow the expected result describes
  4. Check the expected result and attach the evidence to OMNIZONE-897

Expected Settings → Catalogs gets Brands and Tags kinds (reuse catalogs/[kind] pattern); item form uses pickers with inline create.

OMNIZONE-897 · P29.4

Happy pathManual
AC-898-01catalogue
P29.5 Variant matrix: Creating 3×4 colour/size matrix produces 12 items with correct attributes, unique SKUs,…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Variant matrix (P29.5) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/variant-matrix.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-898

Expected Creating 3×4 colour/size matrix produces 12 items with correct attributes, unique SKUs, and no stock or posting change on the parent.

OMNIZONE-898 · P29.5

Happy pathAutomated
AC-898-02catalogue
P29.5 Variant matrix: Woo/Shopify variation import (#708/#746) lands in the same structure.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Variant matrix (P29.5) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/variant-matrix.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-898

Expected Woo/Shopify variation import (#708/#746) lands in the same structure.

OMNIZONE-898 · P29.5

Happy pathAutomated
AC-898-03catalogue
P29.5 Variant matrix: Build on the #641 model (variant = real item with parent_item_id + variant_label). No se…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Variant matrix (P29.5) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/variant-matrix.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-898

Expected Build on the #641 model (variant = real item with parent_item_id + variant_label). No second variant system.

OMNIZONE-898 · P29.5

Happy pathAutomated
AC-898-04catalogue
P29.5 Variant matrix: On a parent item: pick variant-axis attributes (item_attributes.is_variant_axis) and val…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Variant matrix (P29.5) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/variant-matrix.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-898

Expected On a parent item: pick variant-axis attributes (item_attributes.is_variant_axis) and values → preview the cartesian matrix → create missing variants with generated SKU pattern (setting), inherit field…

OMNIZONE-898 · P29.5

Happy pathAutomated
AC-898-05catalogue
P29.5 Variant matrix: Variants grid: inline edit SKU, barcode, price/compare-at, cost, weight, stock (via exis…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Variant matrix (P29.5) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/variant-matrix.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-898

Expected Variants grid: inline edit SKU, barcode, price/compare-at, cost, weight, stock (via existing adjustment engine), active, image; disable combinations; add a value later creates only the new combination…

OMNIZONE-898 · P29.5

Happy pathAutomated
AC-898-06catalogue
P29.5 Variant matrix: variant_label derived from attribute values and kept in sync; POS variant picker (#641)…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Variant matrix (P29.5) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/variant-matrix.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-898

Expected variant_label derived from attribute values and kept in sync; POS variant picker (#641) and channel imports keep working.

OMNIZONE-898 · P29.5

Happy pathAutomated
AC-899-01catalogue
P29.7 Rich product content: XSS payloads in descriptions are stripped (tests); imported Woo/Shopify HTML renders saf…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Rich product content (P29.7) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/rich-product-content.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-899

Expected XSS payloads in descriptions are stripped (tests); imported Woo/Shopify HTML renders safely.

OMNIZONE-899 · P29.7

Happy pathAutomated
AC-899-02catalogue
P29.7 Rich product content: Rich-text editor for long_description (headings, lists, tables, links, images from item…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Rich product content (P29.7) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/rich-product-content.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-899

Expected Rich-text editor for long_description (headings, lists, tables, links, images from item media, embeds allow-list) stored as sanitized HTML; one shared sanitizer (server is authoritative; same allow-li…

OMNIZONE-899 · P29.7

Happy pathAutomated
AC-899-03catalogue
P29.7 Rich product content: Specifications block generated from attribute values (grouped, with units) plus free row…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Rich product content (P29.7) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/rich-product-content.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-899

Expected Specifications block generated from attribute values (grouped, with units) plus free rows; used by storefront and PDFs.

OMNIZONE-899 · P29.7

Happy pathAutomated
AC-899-04catalogue
P29.7 Rich product content: Short description stays plain text with length guidance; both translatable (P29.9).

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Rich product content (P29.7) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/rich-product-content.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-899

Expected Short description stays plain text with length guidance; both translatable (P29.9).

OMNIZONE-899 · P29.7

Happy pathAutomated
AC-900-01shipping
P30.2 Ship-to on sales documents: Converting quote→SO→invoice keeps the same ship-to; English PDF baselines unchanged for…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Ship-to on sales documents (P30.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/document-print.test.ts
  5. Run node --import tsx --test test/document-ship-to.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-900

Expected Converting quote→SO→invoice keeps the same ship-to; English PDF baselines unchanged for documents without ship-to.

OMNIZONE-900 · P30.2

Happy pathAutomated
AC-900-02shipping
P30.2 Ship-to on sales documents: Add bill_to_address_json and ship_to_address_json snapshots (plus ship_to_address_id) to…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Ship-to on sales documents (P30.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/document-print.test.ts
  5. Run node --import tsx --test test/document-ship-to.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-900

Expected Add bill_to_address_json and ship_to_address_json snapshots (plus ship_to_address_id) to sales_quotes, sales_orders, invoices; carried through quote→order→invoice conversion and channel order import.

OMNIZONE-900 · P30.2

Happy pathAutomated
AC-900-03shipping
P30.2 Ship-to on sales documents: Pick lists / packing slips / delivery documents print ship-to; delivery trips (field ops…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Ship-to on sales documents (P30.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/document-print.test.ts
  5. Run node --import tsx --test test/document-ship-to.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-900

Expected Pick lists / packing slips / delivery documents print ship-to; delivery trips (field ops) use ship-to as the stop address.

OMNIZONE-900 · P30.2

Happy pathAutomated
AC-900-04shipping
P30.2 Ship-to on sales documents: PDF templates show ship-to only when it differs from bill-to (no change for existing doc…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Ship-to on sales documents (P30.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/document-print.test.ts
  5. Run node --import tsx --test test/document-ship-to.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-900

Expected PDF templates show ship-to only when it differs from bill-to (no change for existing documents).

OMNIZONE-900 · P30.2

Happy pathAutomated
AC-901-01promotions
P31.2 Promotions and coupons: Migration additive/idempotent; schema validation rejects impossible conditions.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Promotions and coupons (P31.2) on the seeded data
  3. Try the refused path described in the expected result (wrong role, other tenant, invalid input or missing setup)
  4. Run node --import tsx --test test/promotions-schema.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-901

Expected Migration additive/idempotent; schema validation rejects impossible conditions.

OMNIZONE-901 · P31.2

NegativeAutomated
AC-901-02promotions
P31.2 Promotions and coupons: Tables promotions (name, kind automatic/code, reward: percent, fixed amount, fixed price…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Promotions and coupons (P31.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/promotions-schema.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-901

Expected Tables promotions (name, kind automatic/code, reward: percent, fixed amount, fixed price, free shipping, buy X get Y, tiered spend; conditions JSON validated by a shared schema: min subtotal/qty, item…

OMNIZONE-901 · P31.2

Happy pathAutomated
AC-901-03promotions
P31.2 Promotions and coupons: Names avoid collision with billing_coupons (platform SaaS) — document the difference in…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Promotions and coupons (P31.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/promotions-schema.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-901

Expected Names avoid collision with billing_coupons (platform SaaS) — document the difference in docs/COUPONS.md.

OMNIZONE-901 · P31.2

Happy pathAutomated
AC-901-04promotions
P31.2 Promotions and coupons: Backup schema + promote updated.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Promotions and coupons (P31.2) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/promotions-schema.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-901

Expected Backup schema + promote updated.

OMNIZONE-901 · P31.2

Happy pathAutomated
AC-902-01pricing
P31.8 Cross-sell, up-sell, related and frequently-bought-together: Manual links override automatic; FBT job runs within D1 limits on a 100k-line dataset.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Cross-sell, up-sell, related and frequently-bought-together (P31.8) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/item-recommendations.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-902

Expected Manual links override automatic; FBT job runs within D1 limits on a 100k-line dataset.

OMNIZONE-902 · P31.8

Edge caseAutomated
AC-902-02pricing
P31.8 Cross-sell, up-sell, related and frequently-bought-together: Item detail → Linked products: manage item_links kinds related, upsell, cross_sell, acce…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Cross-sell, up-sell, related and frequently-bought-together (P31.8) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/item-recommendations.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-902

Expected Item detail → Linked products: manage item_links kinds related, upsell, cross_sell, accessory (table exists from #745) with ordering.

OMNIZONE-902 · P31.8

Happy pathAutomated
AC-902-03pricing
P31.8 Cross-sell, up-sell, related and frequently-bought-together: Automatic fill rules per store (same category, same brand) when no manual links.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Cross-sell, up-sell, related and frequently-bought-together (P31.8) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/item-recommendations.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-902

Expected Automatic fill rules per store (same category, same brand) when no manual links.

OMNIZONE-902 · P31.8

Happy pathAutomated
AC-902-04pricing
P31.8 Cross-sell, up-sell, related and frequently-bought-together: Nightly job computes frequently-bought-together from invoiced sales lines (set-based, bo…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Cross-sell, up-sell, related and frequently-bought-together (P31.8) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/item-recommendations.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-902

Expected Nightly job computes frequently-bought-together from invoiced sales lines (set-based, bounded), stored as kind fbt with score.

OMNIZONE-902 · P31.8

Happy pathAutomated
AC-902-05pricing
P31.8 Cross-sell, up-sell, related and frequently-bought-together: Storefront API returns them per context (product page, cart).

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Cross-sell, up-sell, related and frequently-bought-together (P31.8) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/item-recommendations.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-902

Expected Storefront API returns them per context (product page, cart).

OMNIZONE-902 · P31.8

Happy pathAutomated
AC-903-01catalogue
P29.6 Product media: Product with 6 images + 1 uploaded video + 1 YouTube link renders in item detail; varian…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Product media (P29.6) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/product-media.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-903

Expected Product with 6 images + 1 uploaded video + 1 YouTube link renders in item detail; variant switch shows its images.

OMNIZONE-903 · P29.6

Happy pathAutomated
AC-903-02catalogue
P29.6 Product media: Channel image import (import-channel-images.ts) still works.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Product media (P29.6) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/product-media.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-903

Expected Channel image import (import-channel-images.ts) still works.

OMNIZONE-903 · P29.6

Happy pathAutomated
AC-903-03catalogue
P29.6 Product media: Extend item_images (0310) rather than a new table: media_kind (image / video / external_…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Product media (P29.6) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/product-media.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-903

Expected Extend item_images (0310) rather than a new table: media_kind (image / video / external_video), external_url (YouTube/Vimeo), poster_file_id, duration_s, variant_item_id (assign image to variant), alt…

OMNIZONE-903 · P29.6

Happy pathAutomated
AC-903-04catalogue
P29.6 Product media: Upload limits and accepted types are settings; storage counts against plan storage (bill…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Product media (P29.6) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/product-media.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-903

Expected Upload limits and accepted types are settings; storage counts against plan storage (billing-plan-limits).

OMNIZONE-903 · P29.6

Edge caseAutomated
AC-903-05catalogue
P29.6 Product media: Image derivatives via Cloudflare Image Resizing URLs (width set from a settings list, We…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Product media (P29.6) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/product-media.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-903

Expected Image derivatives via Cloudflare Image Resizing URLs (width set from a settings list, WebP/AVIF), used by back office thumbnails, POS tiles (#710) and the storefront.

OMNIZONE-903 · P29.6

Happy pathAutomated
AC-903-06catalogue
P29.6 Product media: Item media panel: drag reorder, set primary, assign to variants, add video by upload or…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Product media (P29.6) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/product-media.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-903

Expected Item media panel: drag reorder, set primary, assign to variants, add video by upload or URL with preview.

OMNIZONE-903 · P29.6

Happy pathAutomated
AC-904-01catalogue
P29.8 Slugs and redirects: Renaming a product keeps the old URL working via 301; duplicate slugs are rejected with…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Slugs and redirects (P29.8) on the seeded data
  3. Try the refused path described in the expected result (wrong role, other tenant, invalid input or missing setup)
  4. Run node --import tsx --test test/commerce-slugs.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-904

Expected Renaming a product keeps the old URL working via 301; duplicate slugs are rejected with a clear error.

OMNIZONE-904 · P29.8

NegativeAutomated
AC-904-02catalogue
P29.8 Slugs and redirects: One slug service for items, categories, brands and CMS pages (P35.4): unique per (org, s…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Slugs and redirects (P29.8) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/commerce-slugs.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-904

Expected One slug service for items, categories, brands and CMS pages (P35.4): unique per (org, store, entity kind, language); auto-generate from name (Unicode-safe, Arabic kept or transliterated per store set…

OMNIZONE-904 · P29.8

Edge caseAutomated
AC-904-03catalogue
P29.8 Slugs and redirects: Table commerce_redirects (from_path, to_path, status 301/302, hits); changing a slug wri…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Slugs and redirects (P29.8) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/commerce-slugs.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-904

Expected Table commerce_redirects (from_path, to_path, status 301/302, hits); changing a slug writes a redirect automatically; manual redirects UI under store settings.

OMNIZONE-904 · P29.8

Happy pathAutomated
AC-904-04catalogue
P29.8 Slugs and redirects: Backfill slugs for existing items/categories (items.slug from #745 is reused, not replac…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Slugs and redirects (P29.8) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/commerce-slugs.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-904

Expected Backfill slugs for existing items/categories (items.slug from #745 is reused, not replaced).

OMNIZONE-904 · P29.8

Edge caseAutomated
AC-905-01language
P29.9 Translations for catalogue content: An item with EN/FR/AR content shows the right language in item detail, export and API; n…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Translations for catalogue content (P29.9) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/catalogue-translations.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-905

Expected An item with EN/FR/AR content shows the right language in item detail, export and API; no data lost from translations_json (migration test).

OMNIZONE-905 · P29.9

Edge caseAutomated
AC-905-02language
P29.9 Translations for catalogue content: Move what #745 stored in items.translations_json into the P27.5 columns (name_i18n, shor…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Translations for catalogue content (P29.9) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/catalogue-translations.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-905

Expected Move what #745 stored in items.translations_json into the P27.5 columns (name_i18n, short/long description_i18n, meta_title_i18n, meta_description_i18n, slug per language via P29.8); keep translations…

OMNIZONE-905 · P29.9

Happy pathAutomated
AC-905-03language
P29.9 Translations for catalogue content: Language tabs on item, category and brand forms (enabled store languages only); 'Transla…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Translations for catalogue content (P29.9) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/catalogue-translations.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-905

Expected Language tabs on item, category and brand forms (enabled store languages only); 'Translate with AI' uses the P23.13 translation function when available.

OMNIZONE-905 · P29.9

Happy pathAutomated
AC-905-04language
P29.9 Translations for catalogue content: Channel imports fill translations (#830 contract).

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Translations for catalogue content (P29.9) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/catalogue-translations.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-905

Expected Channel imports fill translations (#830 contract).

OMNIZONE-905 · P29.9

Happy pathAutomated
AC-906-01accounts
P30.3 Shop customer accounts: Brute-force and enumeration protections tested; an account cannot read another account's…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Shop customer accounts (P30.3) on the seeded data
  3. Try the refused path described in the expected result (wrong role, other tenant, invalid input or missing setup)
  4. Run node --import tsx --test test/shop-accounts.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-906

Expected Brute-force and enumeration protections tested; an account cannot read another account's orders (tests).

OMNIZONE-906 · P30.3

NegativeAutomated
AC-906-02accounts
P30.3 Shop customer accounts: Table shop_accounts (store channel, email, password_hash via existing auth helpers, emai…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Shop customer accounts (P30.3) on the seeded data
  3. Try the refused path described in the expected result (wrong role, other tenant, invalid input or missing setup)
  4. Run node --import tsx --test test/shop-accounts.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-906

Expected Table shop_accounts (store channel, email, password_hash via existing auth helpers, email_verified_at, client_id, locale, marketing_consent + timestamp, status) and shop_sessions; never mixed with sta…

OMNIZONE-906 · P30.3

NegativeAutomated
AC-906-03accounts
P30.3 Shop customer accounts: Login by password or email one-time code (reuse loyalty-portal OTP/token code paths and…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Shop customer accounts (P30.3) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/shop-accounts.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-906

Expected Login by password or email one-time code (reuse loyalty-portal OTP/token code paths and rate limits, Turnstile on sign-up); password reset; email verification; lockout.

OMNIZONE-906 · P30.3

Edge caseAutomated
AC-906-04accounts
P30.3 Shop customer accounts: Account ↔ client link: one client per account (created on first order or sign-up per sto…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Shop customer accounts (P30.3) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shop-accounts.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-906

Expected Account ↔ client link: one client per account (created on first order or sign-up per store setting).

OMNIZONE-906 · P30.3

Happy pathAutomated
AC-906-05accounts
P30.3 Shop customer accounts: Storefront API endpoints for account (used by P35.9).

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Shop customer accounts (P30.3) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shop-accounts.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-906

Expected Storefront API endpoints for account (used by P35.9).

OMNIZONE-906 · P30.3

Happy pathAutomated
AC-907-01pricing
P31.1 Store prices: Golden tests in cents for each precedence step, VAT-inclusive lists not taxed twice (reg…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Store prices (P31.1) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/store-locales.test.ts
  5. Run node --import tsx --test test/store-prices.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-907

Expected Golden tests in cents for each precedence step, VAT-inclusive lists not taxed twice (regression of #343).

OMNIZONE-907 · P31.1

Edge caseAutomated
AC-907-02pricing
P31.1 Store prices: One function resolveStorePrices(store, customer, items) on top of existing resolvePrices…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Store prices (P31.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/store-locales.test.ts
  5. Run node --import tsx --test test/store-prices.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-907

Expected One function resolveStorePrices(store, customer, items) on top of existing resolvePrices: store channel price list → customer group price list → per-listing override → sale_price window → compare_at;…

OMNIZONE-907 · P31.1

Happy pathAutomated
AC-907-03pricing
P31.1 Store prices: Tax-inclusive/exclusive display per store using the existing VAT resolver; rounding rule…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Store prices (P31.1) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/store-locales.test.ts
  5. Run node --import tsx --test test/store-prices.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-907

Expected Tax-inclusive/exclusive display per store using the existing VAT resolver; rounding rules per currency.

OMNIZONE-907 · P31.1

Edge caseAutomated
AC-907-04pricing
P31.1 Store prices: Presentment currency: convert with exchange_rates for display; orders are charged in the…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Store prices (P31.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/store-locales.test.ts
  5. Run node --import tsx --test test/store-prices.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-907

Expected Presentment currency: convert with exchange_rates for display; orders are charged in the store's currency(ies) configured in store settings.

OMNIZONE-907 · P31.1

Happy pathAutomated
AC-908-01catalogue
P31.9 Bundles and kits: Selling 2 bundles of (1×A + 2×B) moves 2×A and 4×B; COGS correct; inventory↔G/L variance…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Bundles and kits (P31.9) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/item-bundles.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-908

Expected Selling 2 bundles of (1×A + 2×B) moves 2×A and 4×B; COGS correct; inventory↔G/L variance zero.

OMNIZONE-908 · P31.9

Happy pathAutomated
AC-908-02catalogue
P31.9 Bundles and kits: catalog_product_type bundle/grouped (exists): components stored as item_links kind bundl…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Bundles and kits (P31.9) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/item-bundles.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-908

Expected catalog_product_type bundle/grouped (exists): components stored as item_links kind bundle_component with qty_milli; price fixed or sum-of-components minus %, set on the bundle.

OMNIZONE-908 · P31.9

Happy pathAutomated
AC-908-03catalogue
P31.9 Bundles and kits: Availability = min over components; on delivery/POS sale, stock moves are posted for com…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Bundles and kits (P31.9) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/item-bundles.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-908

Expected Availability = min over components; on delivery/POS sale, stock moves are posted for components through the existing stock engine (bundle holds no stock); revenue allocation across components configur…

OMNIZONE-908 · P31.9

Happy pathAutomated
AC-908-04catalogue
P31.9 Bundles and kits: Grouped products = a parent page listing child items each added separately.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Bundles and kits (P31.9) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/item-bundles.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-908

Expected Grouped products = a parent page listing child items each added separately.

OMNIZONE-908 · P31.9

Happy pathAutomated
AC-909-01payments
P33.1 Payment provider framework: Mock provider passes contract tests incl. duplicate and out-of-order webhooks.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Payment provider framework (P33.1) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/payment-providers.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-909

Expected Mock provider passes contract tests incl. duplicate and out-of-order webhooks.

OMNIZONE-909 · P33.1

Edge caseAutomated
AC-909-02payments
P33.1 Payment provider framework: Tables store_payment_methods (store, provider, display name/i18n, credentials_ref via cr…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Payment provider framework (P33.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/payment-providers.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-909

Expected Tables store_payment_methods (store, provider, display name/i18n, credentials_ref via credential-crypto, mode test/live, countries, currencies, min/max amount, fee rules, sort, active) and payment_tra…

OMNIZONE-909 · P33.1

Happy pathAutomated
AC-909-03payments
P33.1 Payment provider framework: Adapter contract (createPayment → redirect/embedded, handleReturn, handleWebhook with si…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Payment provider framework (P33.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/payment-providers.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-909

Expected Adapter contract (createPayment → redirect/embedded, handleReturn, handleWebhook with signature verification, capture, refund, void) + mock provider + contract tests, mirroring the channel adapter pat…

OMNIZONE-909 · P33.1

Happy pathAutomated
AC-909-04payments
P33.1 Payment provider framework: Webhook endpoint per provider, idempotent by provider event id.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Payment provider framework (P33.1) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/payment-providers.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-909

Expected Webhook endpoint per provider, idempotent by provider event id.

OMNIZONE-909 · P33.1

Edge caseAutomated
AC-910-01shipping
P34.1 Shipping zones, methods and rates: Lebanon (by city), GCC and rest-of-world example zones configurable without code.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Shipping zones, methods and rates (P34.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shipping-rates.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-910

Expected Lebanon (by city), GCC and rest-of-world example zones configurable without code.

OMNIZONE-910 · P34.1

Happy pathAutomated
AC-910-02shipping
P34.1 Shipping zones, methods and rates: Tables shipping_zones (countries, regions, cities, postal patterns), shipping_methods (s…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Shipping zones, methods and rates (P34.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shipping-rates.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-910

Expected Tables shipping_zones (countries, regions, cities, postal patterns), shipping_methods (store, zone, kind: flat / weight table / subtotal table / free over threshold / local pickup / own fleet / carrie…

OMNIZONE-910 · P34.1

Happy pathAutomated
AC-910-03shipping
P34.1 Shipping zones, methods and rates: Shipping classes become a lookup (items.shipping_class backfilled) with per-class surcha…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Shipping zones, methods and rates (P34.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shipping-rates.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-910

Expected Shipping classes become a lookup (items.shipping_class backfilled) with per-class surcharges.

OMNIZONE-910 · P34.1

Happy pathAutomated
AC-910-04shipping
P34.1 Shipping zones, methods and rates: Settings → Store → Shipping screen.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Shipping zones, methods and rates (P34.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shipping-rates.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-910

Expected Settings → Store → Shipping screen.

OMNIZONE-910 · P34.1

Happy pathAutomated
AC-911-01shipping
P34.3 Shipments: Partial shipment of 2 of 3 lines leaves the order partially delivered; stock moves only…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Shipments (P34.3) on the seeded data
  3. Repeat it at the edge the expected result names (rerun, Arabic/RTL, mobile width, limit or fallback)
  4. Run node --import tsx --test test/shipments.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-911

Expected Partial shipment of 2 of 3 lines leaves the order partially delivered; stock moves only once.

OMNIZONE-911 · P34.3

Edge caseAutomated
AC-911-02shipping
P34.3 Shipments: Table shipments (sales order, carrier, service, tracking_no, label_file_id, status, cost…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Shipments (P34.3) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shipments.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-911

Expected Table shipments (sales order, carrier, service, tracking_no, label_file_id, status, cost_cents, shipped_at, delivered_at) linked to WMS pick_packages when WMS is used, or created by quick-ship for wor…

OMNIZONE-911 · P34.3

Happy pathAutomated
AC-911-03shipping
P34.3 Shipments: Dispatching a pick list (dispatchPickList) creates/updates shipments; delivery posts via…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Shipments (P34.3) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shipments.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-911

Expected Dispatching a pick list (dispatchPickList) creates/updates shipments; delivery posts via the existing delivery flow and applySalesOrderDeliveryRollup — no second stock path.

OMNIZONE-911 · P34.3

Happy pathAutomated
AC-911-04shipping
P34.3 Shipments: Shipments panel on sales order detail; shipments listing.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Shipments (P34.3) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/shipments.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-911

Expected Shipments panel on sales order detail; shipments listing.

OMNIZONE-911 · P34.3

Happy pathAutomated
AC-912-01domains
P35.1 Store hosting and domains: A store is reachable on its free domain and on a custom domain with valid SSL; the works…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Store hosting and domains (P35.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/store-hosting.test.ts
  5. Run node --import tsx --test test/store-public-link.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-912

Expected A store is reachable on its free domain and on a custom domain with valid SSL; the workspace app host is unaffected.

OMNIZONE-912 · P35.1

Happy pathAutomated
AC-912-02domains
P35.1 Store hosting and domains: Store host resolution in the Worker: platform setting for the store apex (not code) give…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Store hosting and domains (P35.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/store-hosting.test.ts
  5. Run node --import tsx --test test/store-public-link.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-912

Expected Store host resolution in the Worker: platform setting for the store apex (not code) gives each store a free {store-slug}.{store-apex}; custom domains via Cloudflare for SaaS custom hostnames (DNS veri…

OMNIZONE-912 · P35.1

Happy pathAutomated
AC-912-03domains
P35.1 Store hosting and domains: Never collides with workspace hosts ({slug}.omnizone.app) or admin; follow omnizone-work…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Store hosting and domains (P35.1) on the seeded data
  3. Try the refused path described in the expected result (wrong role, other tenant, invalid input or missing setup)
  4. Run node --import tsx --test test/store-hosting.test.ts
  5. Run node --import tsx --test test/store-public-link.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-912

Expected Never collides with workspace hosts ({slug}.omnizone.app) or admin; follow omnizone-workspace-domains.mdc (wildcard, no per-slug mass attach).

OMNIZONE-912 · P35.1

NegativeAutomated
AC-912-04domains
P35.1 Store hosting and domains: Store status: draft (password page), live, maintenance.

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Store hosting and domains (P35.1) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/store-hosting.test.ts
  5. Run node --import tsx --test test/store-public-link.test.ts
  6. Check the expected result and attach the evidence to OMNIZONE-912

Expected Store status: draft (password page), live, maintenance.

OMNIZONE-912 · P35.1

Happy pathAutomated
AC-913-01catalogue
P29.10 Catalogue readiness: Publishing 500 items in bulk is set-based (no N+1); unpublished items never appear in th…

Steps

  1. Open the Orionbelt store as a guest or one of the demo shopper personas (new, returning, vip, wholesale, international)
  2. Open Catalogue readiness (P29.10) on the seeded data
  3. Try the refused path described in the expected result (wrong role, other tenant, invalid input or missing setup)
  4. Run node --import tsx --test test/catalogue-readiness.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-913

Expected Publishing 500 items in bulk is set-based (no N+1); unpublished items never appear in the Storefront API.

OMNIZONE-913 · P29.10

NegativeAutomated
AC-913-02catalogue
P29.10 Catalogue readiness: Readiness checks per item per store (configurable list): price > 0, primary image, categ…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Catalogue readiness (P29.10) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/catalogue-readiness.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-913

Expected Readiness checks per item per store (configurable list): price > 0, primary image, category, short description, weight when requires_shipping, slug, stock or backorders, translations for store languag…

OMNIZONE-913 · P29.10

Happy pathAutomated
AC-913-03catalogue
P29.10 Catalogue readiness: Items listing: readiness column/filter for a selected store; bulk publish/unpublish → ch…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Catalogue readiness (P29.10) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/catalogue-readiness.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-913

Expected Items listing: readiness column/filter for a selected store; bulk publish/unpublish → channel_listings (published/draft) via the existing publish engine.

OMNIZONE-913 · P29.10

Happy pathAutomated
AC-913-04catalogue
P29.10 Catalogue readiness: Per-store overrides already in channel_listings (price_override_cents, stock_buffer_mill…

Steps

  1. Sign in to the Orionbelt workspace as the admin demo user
  2. Open Catalogue readiness (P29.10) on the seeded data
  3. Carry out the flow the expected result describes
  4. Run node --import tsx --test test/catalogue-readiness.test.ts
  5. Check the expected result and attach the evidence to OMNIZONE-913

Expected Per-store overrides already in channel_listings (price_override_cents, stock_buffer_milli) editable here.

OMNIZONE-913 · P29.10

Happy pathAutomated