---
id: ADR-MBR-STR-006
title: Describe the Two-Step Offering Save and Its Gap
product_area: membership
module: structure
revision: 1
status: proposed
design_intent: proposed
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
decision: >-
  The documented offering process saves an Accounting product before its Membership extension; the examined
  Membership implementation neither compensates a refused extension nor detects the remaining product.
constrains:
  - WF-MBR-STR-004
  - SVC-MBR-STR-configuration
  - SVC-MBR-STR-structure
  - DOM-MBR-STR-004
origin: >-
  D-2 (Andrew, 2026-10-18: the console saves the product through Accounting first, then the package) fixes the
  order; the absence of compensation is observed and proposed here: services-
  membership:docs/migrations/packages-as-products/README.md#What could not be done here
alternatives:
  - option: Compose product and extension saves in one Membership transaction.
    why_not: >-
      The product-write port exists, but no examined caller composes and exposes this workflow; adoption still
      requires implementation and product direction.
  - option: Remove the product automatically after extension failure.
    why_not: >-
      An automatic cross-service removal would require an Accounting-compatible compensation policy that
      protects products already priced or referenced.
consequences:
  - An incomplete offering can retain an Accounting product without membership effect.
  - No examined background process identifies that incomplete pair.
  - Deleting a package extension also retains the base product.
supersedes: []
evidence:
  - >-
    services-membership at 5994c270: modules/structure/ports/accounting-products.ts (saveProduct,
    retireProduct with no caller); modules/configuration/services/configuration/configuration-records.ts
    (packageResource)
---

# Describe the Two-Step Offering Save and Its Gap

## Context

The recorded product-first sequence defines save order, while the permitted console scope contains no offering editor implementing it. The local API performs only the extension step.

## Decision

This record preserves the documented order and describes the observed absence of compensation. The choice of an atomic workflow or detection remains with Product and Architecture.

## Alternatives Considered

Compose product and extension saves in one Membership transaction. The product-write port exists, but no examined caller composes and exposes this workflow; adoption still requires implementation and product direction. Remove the product automatically after extension failure. An automatic cross-service removal would require an Accounting-compatible compensation policy that protects products already priced or referenced.

## Consequences

An incomplete offering can retain an Accounting product without membership effect. No examined background process identifies that incomplete pair. Deleting a package extension also retains the base product.
