toga-ai 1.0.449 → 1.0.450

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,3 +10,4 @@
10
10
  | [Config-Driven Expedited Shipping Gating (Cart)](features/expedited-shipping-gating.md) | On the toga2-commerce **Cart** page, expedited shipping options (**"2nd Day EOB"** and **"Next Day Air"**) are only offered in the *Shipping Method* dropdown wh | toga2-commerce/src/pages/Cart/helpers/shippingOptionGates.ts, toga2-commerce/src/pages/Cart/viewModel/FIELDS/shared/shippingOptionGates.ts, toga2-commerce/src/pages/Cart/view/cartForm/CartForm.tsx, toga2-commerce/src/pages/Cart/CartPage.tsx |
11
11
  | [Multi-Tenant Resolution & Theming](features/multi-tenant-theming.md) | `toga2-commerce` serves multiple clients from one codebase. | src/themeConfig/themes.json, src/themeConfig/ThemeContext.tsx, src/themeConfig/types.ts, src/components/ThemeSwitcher/ThemeSwitcher.tsx, src/components/AuthLayout/AuthLayout.tsx, src/api/axiosInstance.ts, src/contexts/AuthContext.tsx, tailwind.config.js |
12
12
  | [AWS Amplify Build & Deploy (non-prod environments)](workflows/amplify-build-and-deploy.md) | How `toga2-commerce` (React + Vite, "commerce2-react") builds and deploys on **AWS Amplify**. | toga2-commerce/amplify.yml, toga2-commerce/.gitattributes, toga2-commerce/package.json, toga2-commerce/.github/workflows/sync-stage-environments.yml |
13
+ | [Cart e2e — Cypress conventions & harness (toga2-commerce)](workflows/cypress-testing.md) | The Cypress **e2e** convention set for `toga2-commerce`, and the first **active** e2e coverage for the **Cart** page (`cartV2.cy.ts`, slice 1 — 12 tests, verifi | toga2-commerce/cypress/e2e/cartPage/cartV2.cy.ts, toga2-commerce/cypress/fixtures/cart/fetchSingleUserAdmin.json, toga2-commerce/cypress/fixtures/cart/fetchLocations.json, toga2-commerce/cypress/fixtures/cart/fetchUserShippingMethods.json, toga2-commerce/cypress/support/commands.ts, toga2-commerce/cypress/support/e2e.ts, toga2-commerce/src/pages/Cart/CartPage.tsx, toga2-commerce/src/pages/Cart/view/cartForm/CartForm.tsx, toga2-commerce/src/pages/Cart/view/cartForm/CartFormSection.tsx, toga2-commerce/src/pages/Cart/view/cartTable/CartContentsTable.tsx, toga2-commerce/src/pages/Cart/view/cartTable/CartTableItem.tsx, toga2-commerce/src/components/Inputs/AdvancedInput.tsx, toga2-commerce/src/components/BaseButton/BaseButton.tsx |
@@ -6,8 +6,8 @@ project: TOGa Commerce
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-06-18
10
- owners: ["bala"]
9
+ updated: 2026-07-27
10
+ owners: ["bala", "tcox"]
11
11
  files:
12
12
  - src/pages/Cart/CartPage.tsx
13
13
  - src/pages/Cart/view/cartForm/CartForm.tsx
@@ -17,6 +17,7 @@ files:
17
17
  related:
18
18
  - 2.0/apps/toga2-commerce/features/cart-page-config-architecture.md
19
19
  - 2.0/apps/toga2-commerce/features/client-fields.md
20
+ - 2.0/apps/toga2-commerce/workflows/cypress-testing.md
20
21
  ---
21
22
 
22
23
  ## Summary
@@ -72,10 +73,18 @@ the message resolves to `undefined` and renders blank.
72
73
  - Adding the label to only some `CARTPAGE.ts` files leaves other client/role/language users with a
73
74
  blank message.
74
75
  - Do not use a toaster or `setError` (red) for this — product wants the sapphire info style.
76
+ - **Now pinned by e2e.** `cypress/e2e/cartPage/cartV2.cy.ts` covers both the auto-population
77
+ (order-for user + supervisor emails, protected rows unremovable) and the case-insensitive
78
+ duplicate block surfacing the *"This email has already been added"* banner. These are exactly
79
+ the parity behaviors the config-cart refactor spike silently lost, so keep the spec green when
80
+ touching this flow (see [cypress-testing](../workflows/cypress-testing.md)).
75
81
 
76
82
  ## Change history
83
+ - 2026-07-27 — No behavior change. This duplicate-prevention UX (email auto-population +
84
+ case-insensitive duplicate banner) is now covered by cart e2e slice 1 (`cartV2.cy.ts`); linked
85
+ the [cypress-testing](../workflows/cypress-testing.md) workflow doc. (tcox)
77
86
  - 2026-06-18 — Initial: case-insensitive de-dupe in both cart stores, sapphire `InfoBanner` message in
78
87
  CartForm, `duplicateEmailAddressError` label added to all CARTPAGE.ts variants (bala)
79
88
 
80
89
  ## Related docs
81
- None yet.
90
+ - [cypress-testing](../workflows/cypress-testing.md) — e2e coverage that pins this behavior.
@@ -6,8 +6,8 @@ project: TOGa Commerce
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-06-24
10
- owners: ["apeterson"]
9
+ updated: 2026-07-27
10
+ owners: ["apeterson", "tcox"]
11
11
  files:
12
12
  - src/pages/Cart/CartPage.tsx
13
13
  - src/pages/Cart/view/cartForm/CartForm.tsx
@@ -22,6 +22,7 @@ related:
22
22
  - 2.0/apps/toga2-commerce/architecture.md
23
23
  - 2.0/apps/toga2-commerce/features/client-fields.md
24
24
  - 2.0/apps/toga2-commerce/features/cart-notification-emails.md
25
+ - 2.0/apps/toga2-commerce/workflows/cypress-testing.md
25
26
  - 2.0/apps/toga25-supply/features/client-configurable-fields.md
26
27
  ---
27
28
 
@@ -140,10 +141,18 @@ behavior (email seeding, duplicate-email validation, edit-order cost-center/addr
140
141
  ### Phases
141
142
 
142
143
  **Phase 0 — Branch + safety net.** Branch `feature/cart-config-driven-form` off `_production`.
143
- **Pin a behavior oracle:** no tests cover the cart today, so first document both flows from the
144
- running app (sections shown, fields, buttons, validation messages, email auto-population, edit-order
145
- original address) and add RTL smoke tests rendering the cart for one tenant/role in **cart** and
146
- **edit-order** mode — these guard against the "renders nothing" failure the spike hit. **Inventory
144
+ **Pin a behavior oracle:** cart **e2e slice 1 now exists** and *is* part of this oracle —
145
+ `cypress/e2e/cartPage/cartV2.cy.ts` (12 tests, COMPASS / COMPASSCANADA admin; QUAD skipped; see
146
+ [cypress-testing](../workflows/cypress-testing.md)). It pins seeded-items rendering, quantity /
147
+ removal + subtotal, checkout enable/disable gating, clear- and empty-cart states, and — critically
148
+ — the two behaviors the prior spike silently dropped: **notification-email auto-population**
149
+ (user + supervisor rows, protected rows unremovable) and **case-insensitive duplicate-email
150
+ surfacing**. Still **uncovered** and to be added before/with the refactor: **bundle scenarios**
151
+ (blocked on stale Cypress bundle seeds), **expedited-shipping gating + guardrail modal**,
152
+ **edit-order mode**, and **QUAD**. The repo has no RTL/unit runner (Cypress only), so extend the
153
+ e2e specs — not RTL — to cover both **cart** and **edit-order** modes, and document any remaining
154
+ flows from the running app (edit-order original address). These guard against the "renders nothing"
155
+ failure the spike hit. **Inventory
147
156
  the hardcoded client branches (C6):** grep `src/pages/Cart` for `clientSlug`/client-name comparisons
148
157
  and per-client conditionals (start with `DuplicateKitGuardrail` and the order-for
149
158
  cost-center/manager/email seeding) — this list is the C6 work-list for Phases 3–4.
@@ -276,6 +285,12 @@ extension** of toga2.5's philosophy, not a literal copy.
276
285
  edit-order mode?
277
286
 
278
287
  ## Change history
288
+ - 2026-07-27 — Phase 0 oracle is now partly real: cart e2e slice 1 (`cartV2.cy.ts`, 12 tests)
289
+ landed and pins the exact parity behaviors the prior spike lost (notification-email
290
+ auto-population, duplicate-email surfacing) plus render/gating/clear/empty flows. Corrected the
291
+ "no tests / add RTL smoke tests" note — the repo is Cypress-only; listed what slice 1 covers and
292
+ what remains (bundle, expedited gating, edit-order, QUAD). See the new
293
+ [cypress-testing](../workflows/cypress-testing.md) workflow doc. (tcox)
279
294
  - 2026-06-24 — Initial: documented the current `_production` Cart architecture (field-level config
280
295
  via `CartFormSection`, hardcoded section layout in `CartForm`, dual `EditCart`/`EditOrder` forms +
281
296
  dispatcher VM, prop-drilling), its gotchas (config-key drift, hardcoded union `defaultValues` with
@@ -6,7 +6,7 @@ project: TOGa Commerce
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-06-30
9
+ updated: 2026-07-27
10
10
  owners: [tcox]
11
11
  files:
12
12
  - toga2-commerce/src/pages/Cart/helpers/shippingOptionGates.ts
@@ -16,6 +16,7 @@ files:
16
16
  related:
17
17
  - ../../../../clients/compass-usa/profile.md
18
18
  - ../../../../clients/compass-canada/profile.md
19
+ - 2.0/apps/toga2-commerce/workflows/cypress-testing.md
19
20
  ---
20
21
 
21
22
  ## Summary
@@ -92,11 +93,20 @@ behavior is expressed in config, not in code branches.
92
93
  for the computer category (consistent with the existing `checkCartContainsComputerKit`
93
94
  detector). Fine today, but a miss if a `COMPUTERS` item ever lives only in a nested child
94
95
  bundle.
95
- - **No automated test was added.** The repo has no unit-test runner (Cypress only). Verified
96
- via `tsc -b` (clean, twice) and an independent maker≠checker code review. ESLint could not
97
- run locally (missing `eslint-plugin-react-compiler` — environment issue).
96
+ - **Still no automated test for the gating itself.** The repo has no unit-test runner (Cypress
97
+ only). The gating shipped verified via `tsc -b` (clean, twice) and an independent maker≠checker
98
+ code review. ESLint could not run locally (missing `eslint-plugin-react-compiler` — environment
99
+ issue). **A cart Cypress e2e harness now exists** (see
100
+ [cypress-testing](../workflows/cypress-testing.md)) and a gating spec is now feasible: the
101
+ `cart/fetchUserShippingMethods.json` fixture already carries the gated option names
102
+ (**Next Day Air**, **2nd Day EOB**) with no `c_cost`. This gating + guardrail-modal scenario is
103
+ on that doc's slice-2 work-list.
98
104
 
99
105
  ## Change history
106
+ - 2026-07-27 — No behavior change. Noted that a cart Cypress e2e harness now exists and a
107
+ gating + guardrail-modal spec is feasible (the `cart/fetchUserShippingMethods.json` fixture
108
+ already ships the gated names with no `c_cost`); it is on the slice-2 work-list. Linked
109
+ [cypress-testing](../workflows/cypress-testing.md). (tcox)
100
110
  - 2026-06-30 — Built config-driven expedited-shipping gating: expedited methods shown only
101
111
  when the cart holds a COMPUTERS-category computer kit, with auto-reset to Standard Ground
102
112
  otherwise; tenant opt-in via `optionGates` (no client-slug branching). Code review fixed 3
@@ -0,0 +1,209 @@
1
+ ---
2
+ title: Cart e2e — Cypress conventions & harness (toga2-commerce)
3
+ framework: "2.0"
4
+ repo: toga2-commerce
5
+ project: TOGa Commerce
6
+ client: shared
7
+ type: workflow
8
+ status: active
9
+ updated: 2026-07-27
10
+ owners: [tcox]
11
+ files:
12
+ - toga2-commerce/cypress/e2e/cartPage/cartV2.cy.ts
13
+ - toga2-commerce/cypress/fixtures/cart/fetchSingleUserAdmin.json
14
+ - toga2-commerce/cypress/fixtures/cart/fetchLocations.json
15
+ - toga2-commerce/cypress/fixtures/cart/fetchUserShippingMethods.json
16
+ - toga2-commerce/cypress/support/commands.ts
17
+ - toga2-commerce/cypress/support/e2e.ts
18
+ - toga2-commerce/src/pages/Cart/CartPage.tsx
19
+ - toga2-commerce/src/pages/Cart/view/cartForm/CartForm.tsx
20
+ - toga2-commerce/src/pages/Cart/view/cartForm/CartFormSection.tsx
21
+ - toga2-commerce/src/pages/Cart/view/cartTable/CartContentsTable.tsx
22
+ - toga2-commerce/src/pages/Cart/view/cartTable/CartTableItem.tsx
23
+ - toga2-commerce/src/components/Inputs/AdvancedInput.tsx
24
+ - toga2-commerce/src/components/BaseButton/BaseButton.tsx
25
+ related:
26
+ - 2.0/apps/toga2-commerce/features/cart-page-config-architecture.md
27
+ - 2.0/apps/toga2-commerce/features/cart-notification-emails.md
28
+ - 2.0/apps/toga2-commerce/features/expedited-shipping-gating.md
29
+ - 2.0/apps/toga2-commerce/features/cart-bundle-submission-and-identity.md
30
+ - 2.0/apps/toga25-supply/workflows/cypress-testing.md
31
+ ---
32
+
33
+ ## What it is
34
+
35
+ The Cypress **e2e** convention set for `toga2-commerce`, and the first **active** e2e coverage
36
+ for the **Cart** page (`cartV2.cy.ts`, slice 1 — 12 tests, verified green by the developer in
37
+ the live app). Read this doc before adding any new spec here. It doubles as the **Phase 0
38
+ behavior oracle** for the planned config-driven cart refactor (see
39
+ [cart-page-config-architecture](../features/cart-page-config-architecture.md)): the cart specs
40
+ pin the exact parity behaviors the prior refactor spike silently lost (notification-email
41
+ auto-population, duplicate-email error surfacing), so the refactor can restructure the DOM and
42
+ still prove behavior parity.
43
+
44
+ This is the toga2-commerce sibling of
45
+ [toga25-supply's Cypress harness](../../toga25-supply/workflows/cypress-testing.md); the
46
+ patterns differ because toga2-commerce is **e2e-only** (no component-test project) and is
47
+ tenant/host-driven.
48
+
49
+ ## V2-only convention (V1 is dead)
50
+
51
+ Only the **V2** specs are active: `homePageContentV2`, `itemViewPageV2`, `headerV2`, `footerV2`,
52
+ `getSupportV2`, and now `cartV2`. **Every V1 spec was bulk-commented-out on 2026-03-05**
53
+ (commit `e48c968d`, *"Comment out failing and unreliably passing Cypress tests"*) and is stale —
54
+ do not resurrect a V1 spec; write a V2 replacement. The old fully-commented
55
+ `cypress/e2e/cartPage/cart.cy.ts` was **deleted** this session (it violated the no-commented-code
56
+ standard and was actually an *"add items from filter page"* flow, not a cart-page spec) and is
57
+ superseded by `cartV2.cy.ts`.
58
+
59
+ ## The V2 spec pattern
60
+
61
+ - `import { tenant } from '../../support/e2e';` and build **per-tenant data maps** keyed by
62
+ tenant.
63
+ - `beforeEach` sets `cy.viewport(1920, 1080)` then `switch (tenant)` → the login command:
64
+ - `cy.compassAdminLogin(tenant, assortmentsStatus, bundlesStatus, path)` for COMPASS /
65
+ COMPASSCANADA admin;
66
+ - `cy.quadLogin(status, path)` for QUAD.
67
+ - The login command performs the `cy.visit(path)` itself and seeds `zu-user`, `fields-key`,
68
+ `current-client-id`, `synced=false`, and tokens via `onBeforeLoad` (never paste real token
69
+ values into a spec — the command handles auth seeding).
70
+ - **Intercept exact URLs** — `https://api.beta.togahub.com/v2/...`. V2 replaced V1's
71
+ `**/`-wildcard intercepts; keep new intercepts exact so an unstubbed call surfaces instead of
72
+ matching a wildcard.
73
+ - Select elements with `cy.getDataTestId(id)` — the helper takes **only** the id string (not a
74
+ selector), and `defaultCommandTimeout` is **8s**.
75
+
76
+ ### Distinguishing the order-for single-user fetch
77
+
78
+ When an admin selects the "order for" user, the app fires a single-user fetch that must be
79
+ stubbed separately from the login-user stubs. It is distinguished by its **field set** — it
80
+ requests `c_erpEntityId`. Intercept it with a regex lookahead so it does not collide with the
81
+ login user request:
82
+
83
+ ```
84
+ /\/v2\/users\/[^?]+\?(?=.*c_erpEntityId)/
85
+ ```
86
+
87
+ ## Seeding the cart (localStorage + rehydrate)
88
+
89
+ Seed commands live in `cypress/support/commands.ts`:
90
+
91
+ - **`seedCart` / `seedSalesQuote`** — 3 standalone Compass items, subtotal **531.31**. These
92
+ match the **current** `CartItems` store shape and are what `cartV2.cy.ts` uses.
93
+ - **`seedCartBundle` / `seedSalesQuoteBundle`** — ⚠ write the **LEGACY** bundle shape with a
94
+ top-level `uuid` field. The current `CartBundles` contract (`src/pages/Cart/types.ts`) is
95
+ **`bundleZuCartUuid` + `bundleProgressContents` with NO top-level `uuid`** (the
96
+ `bundleUuid`/`bundleZuCartUuid` identity contract — see
97
+ [cart-bundle-submission-and-identity](../features/cart-bundle-submission-and-identity.md)).
98
+ **These bundle seeds must be rebuilt to the current shape before any bundle e2e scenario.**
99
+ - **All four seeds only write `localStorage`.** A spec **must `cy.visit('/cart')` AFTER seeding**
100
+ so the zustand `persist` stores rehydrate — in-app navigation does **not** re-hydrate them.
101
+
102
+ **Cart seeding contract** (which keys to seed for which mode):
103
+
104
+ - **Fresh cart:** `zu-cart` + `zu-user` + `fields-key`.
105
+ - **Edit-order:** additionally `in-edit-mode-zu`, `edit-order-uuid-zu`, `zu-cart-sales-quote`,
106
+ `synced="true"`, and visit `/cart?uuid=<orderUuid>`.
107
+
108
+ ## Cart-page specifics (what to assert)
109
+
110
+ The cart page fires **no order-submit API**. **"Proceed to Checkout"** only navigates to
111
+ `/order-details?type=cart` (or `?uuid=<salesOrder>&type=editOrder` in edit mode); the actual
112
+ submission lives in **OrderDetails**. So a cart spec asserts **navigation** plus the
113
+ progressively-built **`zu-cart-sales-quote`** payload — not a submit request.
114
+
115
+ ## data-testid instrumentation (behavior-anchored selectors)
116
+
117
+ The cart UI was instrumented with `data-testid` attributes so specs anchor on **behavior**, not
118
+ DOM structure, and survive the planned config-driven refactor's DOM restructuring. Naming scheme
119
+ (across `CartPage.tsx`, `CartForm.tsx`, `CartFormSection.tsx`, `CartContentsTable.tsx`,
120
+ `CartTableItem.tsx`):
121
+
122
+ - Actions: `proceed-to-checkout-button`, `clear-cart-button`,
123
+ `cart-item-delete-button-{uuid}`, `edit-order-cancel-button`, `edit-order-add-items-button`,
124
+ `add-new-address-button`, `edit-address-button`, `edit-original-address-button`,
125
+ `add-notification-email-button`, `remove-notification-email-button`.
126
+ - Empty state: `empty-cart-message`, `empty-cart-start-shopping-button`, `empty-cart-support-link`.
127
+ - Inputs: `select-address-input`, `shipping-method-input`, `cost-center-input`,
128
+ `special-instructions-input`, `notification-email-input`, `notification-email-checkbox`.
129
+ - Rows / banners / text: `notification-email-row-{email}`, `duplicate-email-banner`,
130
+ `cart-form-errors-text`, `invalid-address-text`.
131
+ - Config-driven field ids: `cart-form-input-{valueKey}`, `cart-form-display-{valueKey}`,
132
+ `label-button-{valueKey}`, `input-button-{valueKey}`.
133
+ - Shared **`AdvancedInput`** gained: `advanced-input-{valueKey}`, `advanced-input-field-{valueKey}`,
134
+ `advanced-input-toggle-{valueKey}`, `advanced-input-clear-{valueKey}`,
135
+ `advanced-input-option-{optionUuid}`.
136
+
137
+ `BaseButton` / `BaseText` / `BaseInput` / `InfoBanner` already accepted a `dataTestId` prop;
138
+ `IncrementDecrement` already ships `increment-quantity-button` / `decrement-quantity-button` /
139
+ `quantity`.
140
+
141
+ ## What slice 1 covers (`cartV2.cy.ts`)
142
+
143
+ 12 tests for **COMPASS / COMPASSCANADA admin** (**QUAD** is an explicit, visible `skip`
144
+ placeholder):
145
+
146
+ - Seeded-items render smoke (items, part numbers, prices, summary + all form sections, checkout
147
+ button rendered twice).
148
+ - Quantity increment → subtotal update; item removal → subtotal update.
149
+ - Checkout **disabled** while the form is incomplete; **enabled** once an address is picked
150
+ (shipping method defaults from the seeded quote; cost center auto-seeds from the user's
151
+ `c_erpEntityId`).
152
+ - Clear-cart → empty state; the empty-cart state (message / start-shopping / support link).
153
+ - Order-for user selection → notification-email auto-population (user + supervisor emails,
154
+ protected rows have no remove button); email add (checkbox selected); **case-insensitive
155
+ duplicate blocked** with the sapphire info banner (*"This email has already been added"* — see
156
+ [cart-notification-emails](../features/cart-notification-emails.md)); invalid email rejected;
157
+ an added email is removable.
158
+
159
+ ### Not yet covered — slice 2 work-list
160
+
161
+ - **Bundle scenarios** — blocked on the stale bundle seeds (rebuild `seedCartBundle` /
162
+ `seedSalesQuoteBundle` first, above).
163
+ - **Expedited-shipping gating + guardrail modal** — the `cart/fetchUserShippingMethods.json`
164
+ fixture already carries the gated option names (**Next Day Air**, **2nd Day EOB**) with no
165
+ `c_cost`, ready for a gating spec (see
166
+ [expedited-shipping-gating](../features/expedited-shipping-gating.md)).
167
+ - **Edit-order mode.**
168
+ - **QUAD tenant** (currently the visible skip placeholder).
169
+
170
+ ## Running the specs
171
+
172
+ - The **only** npm script is `"cypress": "cypress open"` — interactive. There is **no headless
173
+ script and no CI wiring**; `.github/workflows` never runs Cypress. Specs are validated by
174
+ running them locally / interactively.
175
+ - The **dev server must run separately** first: `npm run compass` | `npm run compasscanada` |
176
+ `npm run quad`.
177
+ - **Windows invocation:** `$env:TENANT="compass"; npm run cypress` — `cross-env` is **not**
178
+ installed, so set the env var in the shell.
179
+ - Requires **hosts-file entries** `127.0.0.1 compass|compasscanada|quad.togacommerce` (present on
180
+ this machine but **undocumented in the README** — a new dev must add them).
181
+
182
+ ## Gotchas
183
+
184
+ - **`BaseButton` never sets the native `disabled` attribute (test-critical).**
185
+ `src/components/BaseButton/BaseButton.tsx` sets `aria-disabled="true"|"false"` and suppresses
186
+ `onClick` inside `handleClick` — it deliberately leaves the element enabled so a disabled button
187
+ (e.g. **Proceed to Checkout**) still receives mouse events and its `BaseTooltip` (*"Please
188
+ complete all required fields to proceed."*) works. Cypress assertions **MUST** use
189
+ `.should('have.attr', 'aria-disabled', 'true'|'false')`, **never** `.should('be.disabled')` —
190
+ `be.disabled` times out even though the button is visually/functionally disabled. (This cost the
191
+ only 2 first-run failures.)
192
+ - **Seed → then `cy.visit('/cart')`.** The persist stores rehydrate on load only; seeding
193
+ `localStorage` and navigating in-app leaves the stores stale (see seeding section).
194
+ - **Bundle seeds are on the legacy shape** — do not write a bundle spec against them until they
195
+ are rebuilt to the `bundleZuCartUuid` + `bundleProgressContents` contract.
196
+ - **ESLint fails repo-wide in a fresh checkout** because `.eslintrc.cjs` references
197
+ `eslint-plugin-react-compiler`, which is not installed; `npm install --save-dev
198
+ eslint-plugin-react-compiler` fixes it. This is a local-environment issue, not a spec problem.
199
+
200
+ ## Change history
201
+ - 2026-07-27 — Added the first active Cart-page e2e coverage (`cartV2.cy.ts`, 12 tests, COMPASS /
202
+ COMPASSCANADA admin; QUAD skipped) and documented the toga2-commerce V2 e2e conventions:
203
+ V2-only (V1 bulk-commented 2026-03-05, dead V1 cart spec deleted), the tenant-login/seed/
204
+ rehydrate contract, the order-for `c_erpEntityId` regex-lookahead intercept, the cart's
205
+ "navigate-not-submit" checkout, the `data-testid` instrumentation scheme, the **`BaseButton`
206
+ `aria-disabled` (never native `disabled`)** test-critical gotcha, the legacy bundle-seed
207
+ blocker, and the interactive-only runner. Slice 1 pins the refactor's Phase 0 parity oracle
208
+ (email auto-population, duplicate-email surfacing). (tcox)
209
+ </content>
@@ -28,7 +28,7 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
28
28
  - **talos** (TOGa IQ) — 7 doc(s) → [2.0/apps/talos/INDEX.md](2.0/apps/talos/INDEX.md)
29
29
  - **voice-to-voice** (TOGa Voice) — 4 doc(s) → [2.0/apps/voice-to-voice/INDEX.md](2.0/apps/voice-to-voice/INDEX.md)
30
30
  - **ai-bdr** (AI-BDR) — 8 doc(s) → [2.0/apps/ai-bdr/INDEX.md](2.0/apps/ai-bdr/INDEX.md)
31
- - **toga2-commerce** (TOGa Commerce) — 9 doc(s) → [2.0/apps/toga2-commerce/INDEX.md](2.0/apps/toga2-commerce/INDEX.md)
31
+ - **toga2-commerce** (TOGa Commerce) — 10 doc(s) → [2.0/apps/toga2-commerce/INDEX.md](2.0/apps/toga2-commerce/INDEX.md)
32
32
  - **toga25-supply** (TOGa 2.5 Supply) — 11 doc(s) → [2.0/apps/toga25-supply/INDEX.md](2.0/apps/toga25-supply/INDEX.md)
33
33
  - **toga-blox** (TOGa Blox) — 8 doc(s) → [2.0/apps/toga-blox/INDEX.md](2.0/apps/toga-blox/INDEX.md)
34
34
  - **bdr** (BDR) — 0 doc(s) → [2.0/apps/bdr/INDEX.md](2.0/apps/bdr/INDEX.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.449",
3
+ "version": "1.0.450",
4
4
  "description": "TOGA Technology Team Claude Knowledge System — shared AI coding harness with skills, knowledge base CLI, and project installer for Claude Code.",
5
5
  "keywords": [
6
6
  "claude",