Changelog Migrated both admin and storefront apps to Houdini (houdini 1.5 + houdini-svelte 2.1) as the sole GraphQL client; every page's ops live in src/lib/houdini/<PageName>.ts and consume generated *Store classes from $houdini (Decided #119) Deleted the hand-rolled $lib/api.ts (admin) and server-side gql() helper in $lib/server/api.ts (storefront); the storefront's $lib/server/api.ts now exposes only an apiHeaders() builder for the BFF forwarder Page loaders standardized on +page.ts + load_<QueryName> (no more +page.server.ts for data loading); mutations use new <Op>Store().mutate(...); refetches use <QueryStore>.fetch() instead of invalidateAll() BFF /api/graphql is a CSRF-guarded forwarder that attaches the JWT from the session cookie server-side — JWT never reaches the browser (Decided #88) Added GitHub Actions CI (.github/workflows/check.yml) with five jobs — backend-lint (ruff), backend-resolver-check (AST guard against duplicate Strawberry resolvers), backend-tests (pytest against real PG 16 + Redis), admin-check (houdini generate + svelte-check, 0 errors), storefront-check (same) Backend cleanup landed during the ruff sweep: 10 F821 fixes, 3 B904 raise ... from, 2 B905 zip(strict=True), a real B023 bug in schedules.py (closure captured last iteration), and 44 E741 renames Phase 14 — Payment Lifecycle Rework Reworked payment processing to support configurable capture modes (authorize-only vs auth+capture) Added full payment lifecycle: authorize → capture → void → refund with per-transaction status and type tracking Automatic void/refund on order cancellation and refund transitions via state machine side effects Authorize.net FDS fraud filter detection: orders flagged as HeldForReview, admin fraud hold release Added modifyOrder mutation for editing authorized orders with automatic reauthorization Added adminCreateOrder mutation and admin UI for staff to create orders with saved card charging Saved payment methods now support B2B location scoping (location_id) Admin payments page now includes capture mode configuration (Authorize Only / Authorize + Capture) Added PaymentTransaction.type field (authorization, capture, charge, void, refund) Added Order.fraud_status and Order.fraud_details fields Updated order detail page with fraud hold banner, transaction actions (capture, void), and release button Added admin Create Order page with account/channel selection, line items, saved cards, and capture mode Phase 13 — Core Geocoding Service Added geographic data model (GeoUnion, Country, Region, County, City) with ISO standards Implemented IP geolocation, address geocoding, and address validation strategies Enriched RequestContext with IP and geo data Added admin UI for managing geographic data and geocoding settings Phase 12 — Tax Architecture Rework Rebuilt tax calculation engine using geographic data models Added support for granular sales tax, excise tax, and compound tax Tax jurisdiction lookup by ISO region, county, and city Added admin Tax management page Phase 11 — Documentation System Added MkDocs Material documentation site with developer, usage, and operations guides Added in-admin contextual help system (HelpDrawer + HelpTooltip components) Added structured, translatable help JSON files for all admin routes Added Cursor rule to enforce documentation updates alongside code changes Added GraphQL schema introspection script for auto-generated API reference Phase 10 — Multi-Currency & Checkout Pipeline Implemented multi-currency support: channel-level supported currencies, exchange rates, currency-aware price resolution Added dual-amount orders (transacted + base currency) Wired end-to-end checkout pipeline: promotions → shipping → tax → payment → order creation Integrated promotion engine with cart-level coupon application and per-line discount allocation Added cart pessimistic locking via SELECT FOR UPDATE during checkout Added Redpanda event publishing for order.created, order.status_changed, inventory.adjusted Added dedicated event consumer service in Docker Compose Phase 9 — Internationalization & Channel Commerce Mode Implemented channel-based commerce modes: B2B, B2C, hybrid Added multi-language support with JSONB translations on products, categories, brands, and CMS pages Added locale resolution middleware (X-Locale header, cookie, Accept-Language) Added LanguageSwitcher and CurrencySwitcher storefront components Implemented channel-scoped extension activation via ChannelExtension model Phase 8 — Payment & Shipping Extensions Built Authorize.Net CIM extension (PaymentProcessStrategy) Built gift card extension with virtual/physical cards, partial redemption, bulk generation Added UPS shipping rate extension Replaced inline SVG/emoji icons with Lucide icons across storefront and admin Added shipping carrier icon components (UPS, USPS, FedEx, OnTrac, freight) Added payment card brand icons (Visa, Mastercard, Amex, Discover) Phase 7 — Testing & Production Prep Set up pytest with real PostgreSQL test database Added test fixtures: event_bus, strategy_resolver, request contexts Wrote test suites for strategy resolver, pricing, cart/order flow, GraphQL API, RBAC, events, extensions Created production-ready multi-stage Dockerfiles Added CMS policy pages: contact, shipping, return, privacy, terms Fixed accessibility warnings in storefront and admin layouts Phase 6 — Admin Panel & Dashboard Built 20+ admin routes: orders, products, customers, pricing, promotions, inventory, shipping, tax, CMS, settings Implemented command palette (Cmd+K) with fuzzy search Added Customer 360 view Built collapsible sidebar navigation with Lucide icons Phase 5 — Core Commerce Modules Implemented all 14 strategy ABCs with default implementations Built promotion engine with condition/action pattern and CartIndex Built fulfillment module with by_order and by_box modes Built RMA module with line-level approval Built store credit, gift card, and net terms modules Built reporting and audit modules Phase 4 — Pricing & Inventory Implemented five-level pricing hierarchy Built price list management with scheduling and volume tiers Built inventory module with warehouses, stock levels, and reservations Implemented backorder support Phase 3 — Orders & Cart Built configurable order state machine Implemented cart with per-location support and session-based guest carts Built checkout mutation with initial pipeline Fixed SQLAlchemy identity map caching issues Phase 2 — Auth & Accounts Implemented BFF authentication pattern with httpOnly session cookies Built B2B account hierarchy: Account → Location → Employee → Address Implemented RBAC with role-based permissions Built customer group system Phase 1 — Products & Catalog Built product module with variants, categories, and brands Implemented Meilisearch integration for full-text search Built catalog visibility rules engine Phase 0 — Foundation Scaffolded monorepo: backend, admin, storefront, migrator Set up Docker Compose with PostgreSQL, Redis, Redpanda, Temporal, Meilisearch, MinIO Created FastAPI application factory with Strawberry GraphQL Created SvelteKit admin and storefront shells Set up Alembic migrations with initial schema Established Forge methodology artifacts: constitution, conventions, reconciliation Back to top