# SCM MCP Protocol

This file is published to <a href="https://mcp.g3nretailstack.com/scm/PROTOCOL.md" target="_blank" rel="noopener noreferrer">https://mcp.g3nretailstack.com/scm/PROTOCOL.md</a>.


## Usage patterns (headless)
- Stack-wide SOPs & operations catalog: <a href="https://doc.g3nretailstack.com/story/operations.html" target="_blank" rel="noopener noreferrer">/story/operations.html</a>.
- Super-usecase scenarios + QA status: <a href="https://doc.g3nretailstack.com/story/super-usecases.html" target="_blank" rel="noopener noreferrer">/story/super-usecases.html</a>.
- This protocol stays contract-only; use the catalogs for workflow expectations.

## Base URL
- API Gateway: `https://api.g3nretailstack.com/scm`
- Health check: `GET /scm/stat` — requires `requireSession` (any authenticated user).

## Auth + tenancy
- Auth placement: header auth is canonical for org-scoped APIs; body auth is accepted for compatibility where documented. Exceptions: USM and UTL require body auth. See [/common/headers-identity.html](https://doc.g3nretailstack.com/common/headers-identity.html).
- Every tenant call requires `x-orgcode`.
- Auth is either:
  - `x-session-guid` (user session), OR
  - `x-api-key` (org-bound service account)
- Non-associated callers receive `404 not-found` (anti-enumeration).
- Optional cost attribution: provide `x-cccode` (or request field `cccode`).
- Request context (where required) must match header/body identity: `orgcode`, `logical_guid`, `channel_code`, `cccode`, `context_source`, and `roles` mismatches return `invalid-input`.
- `session_guid` is never emitted in responses; use `stats.session_fingerprint` for correlation.
- Facility context: `x-logical-guid` (required for operational actions; see OpenAPI per-path). `x-channel-code` (required where documented; see OpenAPI per-path).

## Roles
- Read: `scm_view`, `scm_order`, `scm_fulfillment`, `scm_returns`, `scm_credit`, `scm_discount_approve`, `scm_special_order_approve`, `scm_backorder_approve`, `finance_audit` (owner implied).
- Order write: `scm_order`.
- Discount approve: `scm_discount_approve`.
- Backorder approve: `scm_backorder_approve`.
- Special order approve: `scm_special_order_approve`.
- Returns: `scm_returns`.
- Credit: `scm_credit`.
- Fulfillment: `scm_fulfillment`.
- Tax admin: `scm_tax_admin`.
- Comment/inbox write: same as read roles.

## Surfaces
- Contract-only surface. Implemented and deployed; see `/scm/openapi.yaml` for the current surface definition.

## Endpoint inventory (OpenAPI parity)
The endpoints below are implemented and defined in `/scm/openapi.yaml`. Request/response schema names reference OpenAPI component schemas.

| Method | Path | Request schema | Response schema |
| --- | --- | --- | --- |
| POST | /appointment/book | (inline) | Envelope |
| POST | /appointment/cancel | (inline) | Envelope |
| POST | /appointment/complete | (inline) | Envelope |
| POST | /appointment/confirm | (inline) | Envelope |
| POST | /appointment/get | (inline) | Envelope |
| POST | /appointment/list | (inline) | Envelope |
| POST | /appointment/no-show | (inline) | Envelope |
| POST | /appointment/reschedule | (inline) | Envelope |
| POST | /appointment/start | (inline) | Envelope |
| POST | /backorder/approve | BackorderApproveRequest | BackorderEnvelope |
| POST | /backorder/cancel | BackorderCancelRequest | BackorderEnvelope |
| POST | /backorder/create | BackorderCreateRequest | BackorderEnvelope |
| POST | /backorder/expire | BackorderExpireRequest | BackorderEnvelope |
| POST | /backorder/fulfill | BackorderFulfillRequest | BackorderEnvelope |
| POST | /backorder/get | BackorderGetRequest | BackorderEnvelope |
| POST | /backorder/list | BackorderListRequest | BackorderListEnvelope |
| POST | /backorder/partial-fulfill | BackorderPartialFulfillRequest | BackorderEnvelope |
| POST | /backorder/promise | BackorderPromiseRequest | BackorderEnvelope |
| POST | /carrier/config/get | (inline) | Envelope |
| POST | /carrier/config/list | (inline) | Envelope |
| POST | /carrier/config/set | (inline) | Envelope |
| POST | /carrier/config/status/set | (inline) | Envelope |
| POST | /carrier/label/create | (inline) | Envelope |
| POST | /carrier/rate/quote | (inline) | Envelope |
| POST | /carrier/tracking/get | (inline) | Envelope |
| POST | /channel/policy/get | ChannelPolicyGetRequest | ChannelPolicyEnvelope |
| POST | /channel/policy/set | ChannelPolicySetRequest | ChannelPolicyEnvelope |
| POST | /checkout | (inline) | Envelope |
| POST | /comment | CommentAddRequest | CommentEnvelope |
| POST | /comment/get | CommentGetRequest | CommentEnvelope |
| POST | /comment/list | CommentListRequest | CommentListEnvelope |
| POST | /comment/report | CommentReportRequest | CommentReportEnvelope |
| POST | /comment/revise | CommentReviseRequest | CommentEnvelope |
| POST | /comment/status | CommentStatusRequest | CommentEnvelope |
| POST | /delivery-slot/get | (inline) | Envelope |
| POST | /delivery-slot/list | (inline) | Envelope |
| POST | /delivery-slot/set | (inline) | Envelope |
| POST | /delivery-slot/status/set | (inline) | Envelope |
| POST | /edi/get | EdiGetRequest | EdiEnvelope |
| POST | /edi/list | EdiListRequest | EdiListEnvelope |
| POST | /edi/record | EdiRecordRequest | EdiEnvelope |
| POST | /edi/status/set | EdiStatusSetRequest | EdiEnvelope |
| POST | /eligibility/check | (inline) | Envelope |
| POST | /fulfillment/shipment/cancel | ShipmentCancelRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/create | ShipmentCreateRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/deliver | ShipmentDeliverRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/delivery/complete | (inline) | ShipmentEnvelope |
| POST | /fulfillment/shipment/delivery/schedule | (inline) | ShipmentEnvelope |
| POST | /fulfillment/shipment/exception | ShipmentExceptionRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/exception/carrier-failure | ShipmentExceptionCarrierFailureRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/exception/damaged | ShipmentExceptionDamagedRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/exception/partial | ShipmentExceptionPartialRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/exception/resolve | ShipmentExceptionResolveRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/exception/short-pick | ShipmentExceptionShortPickRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/get | ShipmentGetRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/install/complete | (inline) | ShipmentEnvelope |
| POST | /fulfillment/shipment/install/schedule | (inline) | ShipmentEnvelope |
| POST | /fulfillment/shipment/list | ShipmentListRequest | ShipmentListEnvelope |
| POST | /fulfillment/shipment/pack | ShipmentPackRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/pick | ShipmentPickRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/pickup/complete | ShipmentPickupCompleteRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/pickup/no_show | ShipmentPickupNoShowRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/pickup/ready | ShipmentPickupReadyRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/ship | ShipmentShipRequest | ShipmentEnvelope |
| POST | /fulfillment/shipment/substitution/apply | ShipmentSubstitutionApplyRequest | ShipmentEnvelope |
| POST | /inbox/create | InboxCreateRequest | InboxEnvelope |
| POST | /inbox/get | InboxGetRequest | InboxEnvelope |
| POST | /inbox/list | InboxListRequest | InboxListEnvelope |
| POST | /inbox/state | InboxStateRequest | InboxEnvelope |
| POST | /inbox/status | InboxStatusRequest | InboxEnvelope |
| POST | /layaway/cancel | (inline) | Envelope |
| POST | /layaway/create | (inline) | Envelope |
| POST | /layaway/list | (inline) | Envelope |
| POST | /layaway/partial-pickup | (inline) | Envelope |
| POST | /layaway/payment | (inline) | Envelope |
| POST | /layaway/recall | (inline) | Envelope |
| POST | /order/cancel | OrderCancelRequest | OrderEnvelope |
| POST | /order/close | OrderCloseRequest | OrderEnvelope |
| POST | /order/create | OrderCreateRequest | OrderEnvelope |
| POST | /order/fulfill | OrderFulfillRequest | OrderEnvelope |
| POST | /order/get | OrderGetRequest | OrderEnvelope |
| POST | /order/line/cancel | OrderLineCancelRequest | OrderEnvelope |
| POST | /order/list | OrderListRequest | OrderListEnvelope |
| POST | /order/place | OrderPlaceRequest | OrderEnvelope |
| POST | /order/promise/allocate | OrderPromiseAllocateRequest | OrderEnvelope |
| POST | /order/promise/commit | OrderPromiseCommitRequest | OrderEnvelope |
| POST | /order/promise/commit-direct | OrderPromiseCommitRequest | OrderEnvelope |
| POST | /order/promise/quote | OrderPromiseQuoteRequest | PromiseQuoteEnvelope |
| POST | /order/promise/release | OrderPromiseReleaseRequest | OrderEnvelope |
| POST | /order/promise/reserve | OrderPromiseReserveRequest | OrderEnvelope |
| POST | /order/search | OrderSearchRequest | OrderListEnvelope |
| POST | /payment-gateway/get | (inline) | Envelope |
| POST | /payment-gateway/list | (inline) | Envelope |
| POST | /payment-gateway/set | (inline) | Envelope |
| POST | /payment-gateway/status/set | (inline) | Envelope |
| POST | /pos/audit/query | (inline) | Envelope |
| POST | /pos/audit/transaction | (inline) | Envelope |
| POST | /pos/cash/deposit | (inline) | Envelope |
| POST | /pos/cash/drawer | (inline) | Envelope |
| POST | /pos/cash/movements | (inline) | Envelope |
| POST | /pos/cash/paid-in | (inline) | Envelope |
| POST | /pos/cash/paid-out | (inline) | Envelope |
| POST | /pos/complete | (inline) | Envelope |
| POST | /pos/customer/attach | (inline) | Envelope |
| POST | /pos/customer/detach | (inline) | Envelope |
| POST | /pos/customer/search | (inline) | Envelope |
| POST | /pos/discount/line | (inline) | Envelope |
| POST | /pos/discount/line/remove | (inline) | Envelope |
| POST | /pos/discount/order | (inline) | Envelope |
| POST | /pos/discount/order/remove | (inline) | Envelope |
| POST | /pos/hold | (inline) | Envelope |
| POST | /pos/hold/list | (inline) | Envelope |
| POST | /pos/journal | (inline) | Envelope |
| POST | /pos/misc/add | (inline) | Envelope |
| POST | /pos/misc/remove | (inline) | Envelope |
| POST | /pos/post-void | (inline) | Envelope |
| POST | /pos/recall | (inline) | Envelope |
| POST | /pos/reprint | (inline) | Envelope |
| POST | /pos/return/process | (inline) | Envelope |
| POST | /pos/return/start | (inline) | Envelope |
| POST | /pos/scan | (inline) | Envelope |
| POST | /pos/search | (inline) | Envelope |
| POST | /pos/tax/classes | (inline) | Envelope |
| POST | /pos/tax/recalc | (inline) | Envelope |
| POST | /pos/till/report | (inline) | Envelope |
| POST | /pos/trade-in/add | (inline) | Envelope |
| POST | /pos/trade-in/remove | (inline) | Envelope |
| POST | /pos/void | (inline) | Envelope |
| POST | /quote/accept | QuoteAcceptRequest | QuoteEnvelope |
| POST | /quote/approve | QuoteApproveRequest | QuoteEnvelope |
| POST | /quote/convert | QuoteConvertRequest | OrderEnvelope |
| POST | /quote/create | QuoteCreateRequest | QuoteEnvelope |
| POST | /quote/expire | QuoteExpireRequest | QuoteEnvelope |
| POST | /quote/get | QuoteGetRequest | QuoteEnvelope |
| POST | /quote/list | QuoteListRequest | QuoteListEnvelope |
| POST | /quote/reject | QuoteRejectRequest | QuoteEnvelope |
| POST | /quote/send | QuoteSendRequest | QuoteEnvelope |
| POST | /receipt/generate | (inline) | Envelope |
| POST | /receipt/get | (inline) | Envelope |
| POST | /receipt/template/get | (inline) | Envelope |
| POST | /receipt/template/list | (inline) | Envelope |
| POST | /receipt/template/set | (inline) | Envelope |
| POST | /refund/issue | RefundRequest | RefundEnvelope |
| POST | /rental-agreement/activate | (inline) | RentalAgreementEnvelope |
| POST | /rental-agreement/close | (inline) | RentalAgreementEnvelope |
| POST | /rental-agreement/create | RentalAgreementDraft | RentalAgreementEnvelope |
| POST | /rental-agreement/extend | (inline) | RentalAgreementEnvelope |
| POST | /rental-agreement/get | (inline) | RentalAgreementEnvelope |
| POST | /rental-agreement/inspect | (inline) | RentalAgreementEnvelope |
| POST | /rental-agreement/list | (inline) | RentalAgreementListEnvelope |
| POST | /rental-agreement/return-receive | (inline) | RentalAgreementEnvelope |
| POST | /rental-agreement/return-request | (inline) | RentalAgreementEnvelope |
| POST | /return/authorize | ReturnAuthorizeRequest | ReturnEnvelope |
| POST | /return/get | ReturnGetRequest | ReturnEnvelope |
| POST | /return/inspect | ReturnInspectRequest | ReturnEnvelope |
| POST | /return/list | ReturnListRequest | ReturnListEnvelope |
| POST | /return/receive | ReturnReceiveRequest | ReturnEnvelope |
| POST | /return/request | ReturnRequest | ReturnEnvelope |
| POST | /return/resolve | ReturnResolveRequest | ReturnEnvelope |
| POST | /routing/plan/create | RoutingPlanCreateRequest | RoutingPlanEnvelope |
| POST | /routing/plan/get | RoutingPlanGetRequest | RoutingPlanEnvelope |
| POST | /routing/plan/list | RoutingPlanListRequest | RoutingPlanListEnvelope |
| POST | /routing/policy/get | RoutingPolicyGetRequest | RoutingPolicyEnvelope |
| POST | /routing/policy/list | RoutingPolicyListRequest | RoutingPolicyListEnvelope |
| POST | /routing/policy/set | RoutingPolicySetRequest | RoutingPolicyEnvelope |
| POST | /self-service/order/get | (inline) | Envelope |
| POST | /self-service/order/list | (inline) | Envelope |
| POST | /self-service/return/get | (inline) | Envelope |
| POST | /self-service/return/request | (inline) | Envelope |
| POST | /self-service/shipment/track | (inline) | Envelope |
| POST | /special-order/approve | SpecialOrderApproveRequest | SpecialOrderEnvelope |
| POST | /special-order/cancel | SpecialOrderCancelRequest | SpecialOrderEnvelope |
| POST | /special-order/create | SpecialOrderCreateRequest | SpecialOrderEnvelope |
| POST | /special-order/get | SpecialOrderGetRequest | SpecialOrderEnvelope |
| POST | /special-order/list | SpecialOrderListRequest | SpecialOrderListEnvelope |
| POST | /special-order/notify | (inline) | SpecialOrderEnvelope |
| POST | /special-order/pickup | (inline) | SpecialOrderEnvelope |
| POST | /special-order/status | (inline) | SpecialOrderEnvelope |
| POST | /special-order/submit | SpecialOrderSubmitRequest | SpecialOrderEnvelope |
| POST | /special-order/recalculate | SpecialOrderRecalculateRequest | SpecialOrderRecalculateEnvelope |
| POST | /layaway/recalculate | LayawayRecalculateRequest | LayawayRecalculateEnvelope |
| GET | /stat | — | Envelope |
| POST | /tax/finalize | TaxFinalizeRequest | TaxRecordEnvelope |
| POST | /tax/policy/get | TaxPolicyGetRequest | TaxPolicyEnvelope |
| POST | /tax/policy/list | TaxPolicyListRequest | TaxPolicyListEnvelope |
| POST | /tax/policy/set | TaxPolicySetRequest | TaxPolicyEnvelope |
| POST | /tax/quote | TaxQuoteRequest | TaxQuoteEnvelope |
| POST | /tender-policy/get | (inline) | Envelope |
| POST | /tender-policy/list | (inline) | Envelope |
| POST | /tender-policy/set | (inline) | Envelope |
| POST | /tender/capture | TenderCaptureRequest | TenderEnvelope |
| POST | /tender/get | TenderGetRequest | TenderEnvelope |
| POST | /tender/list | TenderListRequest | TenderListEnvelope |
| POST | /tender/settle | TenderSettleRequest | TenderEnvelope |
| POST | /tender/void | TenderVoidRequest | TenderEnvelope |
| POST | /till/close | (inline) | Envelope |
| POST | /till/get | (inline) | Envelope |
| POST | /till/list | (inline) | Envelope |
| POST | /till/open | (inline) | Envelope |
| POST | /warranty-claim/approve | (inline) | WarrantyClaimEnvelope |
| POST | /warranty-claim/file | (inline) | WarrantyClaimEnvelope |
| POST | /warranty-claim/get | (inline) | WarrantyClaimEnvelope |
| POST | /warranty-claim/list | (inline) | WarrantyClaimListEnvelope |
| POST | /warranty-claim/resolve | (inline) | WarrantyClaimEnvelope |
| POST | /warranty-config/get | (inline) | Envelope |
| POST | /warranty-config/set | (inline) | Envelope |

## Error tags
Common tags (see [/common/error-tags.html](https://doc.g3nretailstack.com/common/error-tags.html) for definitions): `validation-error`, `unauthorized`, `forbidden`, `not-found`, `expected-revision-required`, `conflict`, `invalid-state`, `throttled`, `internal-error`.

Tender-specific tags:
- `invalid-gateway` — `gateway_code` does not match any active payment gateway (400).
- `tender-amount-exceeds-maximum` — tender amount exceeds `max_amount_minor` defined in the active tender policy (400). Details include `max_amount_minor` and `actual_amount_minor`.
- `tender-amount-below-minimum` — tender amount below `min_amount_minor` defined in the active tender policy (400). Details include `min_amount_minor` and `actual_amount_minor`.

## Example envelopes
Success envelope (shape-only):
```json
{
  "success": true,
  "data": { "example": "see schema for fields" },
  "stats": { "service": "scm", "call": "scm_example", "timestamp_utc": "2026-01-01T00:00:00Z", "build": { "build_major": "MONDAY", "build_minor": "0000000000", "build_id": "MONDAY-0000000000" } }
}
```

Error envelope (shape-only):
```json
{
  "success": false,
  "error": {
    "error_code": "scm.validation_failed",
    "http_status": 400,
    "retryable": false,
    "major": { "tag": "validation-error", "message": { "en_US": "Invalid request." } }
  },
  "stats": { "service": "scm", "call": "scm_example", "timestamp_utc": "2026-01-01T00:00:00Z", "build": { "build_major": "MONDAY", "build_minor": "0000000000", "build_id": "MONDAY-0000000000" } }
}
```


## Idempotency & retries
- All **GET / list / resolve / search** calls are safe to retry with identical inputs (read-only, no side effects).
- **POST mutations** that accept `expected_revision` use optimistic concurrency: on `409 conflict` or `428 expected-revision-required`, re-read the record, obtain the current `revision`, and retry with the updated value.
- Creates are generally **not** idempotent. Prefer caller-provided `code` (where supported) and verify existence before retrying a failed create.
- Bulk or scheduled jobs that accept an `idempotency_key` will de-duplicate within the documented time window.

## Known pitfalls
- **Missing `expected_revision`**: most state-changing operations require it; omitting it returns `428` with the current revision in `error.details`.
- **Stale revision**: reading a record, waiting, then writing with an outdated `revision` triggers `409`. Always use the latest revision from the most recent read.
- **Pagination cursors**: `next_token` is opaque JSON. Do not modify, decode, or persist cursors across sessions — they may change format between deploys.
- **Anti-enumeration 404**: some org-scoped reads return `404` even when the record exists, if the caller is not associated with the org. Treat `404` as ambiguous; verify caller association before assuming "not found".
- **Order auto-transition on return**: `POST /return/request` with an `order_id` automatically transitions a `fulfilled` order to `returned`. The response includes `order_status`.

## OpenAPI
- Contract schema: <a href="https://doc.g3nretailstack.com/scm/openapi.yaml" target="_blank" rel="noopener noreferrer">https://doc.g3nretailstack.com/scm/openapi.yaml</a>
- OMS/DOM expansion surfaces include promise quotes + reserve/allocate/commit/release, routing policies/plans, and shipment exception + resolve + pickup no-show workflows.
- Tax/compliance surfaces include tax policy get/list/set, tax quote, and tax finalization.
- Wholesale credit terms: orders/quotes may include `payment_terms`; `order/place` enforces credit-hold and limit checks when terms are present.
- EDI adapters: `/scm/edi/record`, `/scm/edi/status/set`, `/scm/edi/get`, `/scm/edi/list`.
- Offline payment: `offline` is a first-class payment gateway provider. Create via `/scm/payment-gateway/set` with `provider: 'offline'`. Tender capture validates `gateway_code` against active gateways and enforces `max_amount_minor`/`min_amount_minor` from active tender policy rules.
- Comment/inbox list defaults: `status=current` / `status=inbox`; use `status=all` to include archived/doomed.

## POS Operations (2026-03-24)

POS-specific composite routes that orchestrate existing SCM services for point-of-sale workflows. All require `scm_pos_operator` or `scm_pos_admin` role.

### Scan & Search
- `POST /scm/pos/scan` — composite barcode→product→dept gating→price→stock. Direct DDB reads (<100ms). Resolves barcode, PLU, SKU, or code.
- `POST /scm/pos/search` — item lookup fallback (delegates to PVM).

### Discounts
- `POST /scm/pos/discount/line` — line-level discount (percent/amount). Profile enforcement: `max_discount_percent`, department overrides, below-cost check. Returns challenge on limit exceeded.
- `POST /scm/pos/discount/line/remove` — remove manual discount from line.
- `POST /scm/pos/discount/order` — order-level discount distributed proportionally across lines (penny allocation).
- `POST /scm/pos/discount/order/remove` — clear all manual discounts.

### Sale Completion
- `POST /scm/pos/complete` — complete sale: verify tender balance, ICS commit-direct (kit explosion), generate receipt number, emit `sale-completed` event, best-effort loyalty earn.

### Tax
- `POST /scm/pos/tax/recalc` — recalculate taxes for basket. Supports tax-inclusive (AU/UK/EU) and tax-exclusive (US/CA).
- `POST /scm/pos/tax/classes` — list tax classes per jurisdiction (for misc sale tax class selection).

### Hold/Recall
- `POST /scm/pos/hold` — park draft order → held status (station affinity, configurable max held).
- `POST /scm/pos/recall` — restore held → draft (cross-station requires `scm_pos_admin`).
- `POST /scm/pos/hold/list` — paginated held orders (station-filtered for cashiers).

### Customer
- `POST /scm/pos/customer/search` — CRM customer lookup (phone/email/name/code).
- `POST /scm/pos/customer/attach` — attach to order, re-resolve all line prices (customer-specific pricing, price list, tier), compute effective tenders (3-layer intersection), loyalty preview (uses real CRM policy, not simplified estimate), fraud hold check. Returns `409 fraud-hold-active` if customer has active fraud hold; set `acknowledge_fraud_hold: true` to proceed despite hold.
- `POST /scm/pos/customer/detach` — remove customer, revert to base pricing.

### Returns
- `POST /scm/pos/return/start` — receipt number lookup, show returnable lines (original qty − already returned).
- `POST /scm/pos/return/process` — auto-authorize, auto-receive, ICS restock (available/quarantine/damaged), refund issue.

### Audit
- `POST /scm/pos/audit/query` — query audit trail by time range + filters (station, actor, action, order). Requires `scm_pos_admin`.
- `POST /scm/pos/audit/transaction` — all audit records for a specific order (chronological timeline).


_Build MONDAY-1776194870 • 2026-04-14T19:27:50.000Z • [© 1999 Microhouse Systems Inc. All rights reserved.](https://doc.g3nretailstack.com/common/copyright-license.html)_
