Skip to main content
Note 2026-10-26 (STA-806): open question 1 (pack home) is settled by 0370, a new package, @stackra/market-packs, not part of @stackra/settings. Open question 3 has the owner’s answer RV-4 (review round 2, X2-18): a record follows the pack of its legal entity (or its Market for a sale), and a shared process takes the strictest active pack, which 0385 proposes as a pack per rule subject. Open question 2 (who signs) is proposed in 0386. These ADRs are Proposed; this page’s own status is unchanged.
Proposed. When accepted, it adds a dated Note to 0203, 0242, 0210, 0189, 0343, 0220, 0268, 0192, 0186 and 0360 (the items listed in notes/handover/adr-hardcoding-findings.md). It reads with 0213 (settings cascade), 0331 (rules), 0153 (automations), 0270 (builder document kinds), 0356 (provider per Market) and 0359 (sandbox and live).

Context

The owner ruled on 2026-10-25 that every business answer is a default configuration, seeded as data and editable in each product’s admin. Several Stackra ADRs still carry business values: the plan ladder in 0242, tier names in 0203, country tax rules “in OS code” in 0220 and 0268, named privacy laws in 0189 and 0343, and a 100-recipient threshold in 0360. A mechanism that names a country or a price cannot serve a second market or a second product without a code change. Stackra already has the pieces: the settings cascade (0213), the rules engine (0331), the workflow engine (0153), the builder document kinds (0270) and provider choice per Market (0356).

Decision

  1. Code holds mechanism only. Engines, ports, drivers, studios and importers are code. Business behaviour is not: prices, plans, tiers, seat kinds, modules, fees, limits, trials, offers, policies and thresholds are data.
  2. Four homes for business behaviour.
    • Data: catalogue records and settings, edited in each product’s admin.
    • Rules: any decision with a condition is a rule set in @stackra/rules (0331). Return windows, deposits, cash on delivery, approvals, tips, service charges, discount permits and commissions are rule sets.
    • Workflows: any multi-step flow is a workflow template (0153).
    • Studios: screens, forms, dashboards, reports and print documents are builder documents (0270).
  3. Market packs. A country or legal area is a market pack: versioned data with effective dates that holds tax, e-invoicing, till fiscal rules, legal floors, carriers, payment and messaging providers, sign-in and verification methods, holidays, address format, currency and languages. Overlays (a free zone, an EU member state) extend a base pack. No Stackra package names a country. A driver may serve one country; choosing it is pack data through the Connection rule of 0356.
  4. Legal floors are pack data. A legal minimum or maximum (a withdrawal period, a reporting window, a retention period, a tax rate) is a floor in the pack. The settings resolver and the rules engine refuse a value past the floor and say which pack and law set it. Code holds the check, never the number.
  5. Settings layers. The cascade of 0213 decision 2 is read as four business layers: platform floor, product default, tenant, user. A narrower layer may only tighten a floor. Each key declares live or sandbox (0359 decisions 3 to 5).
  6. Plan catalogue. Each product’s tiers, seat kinds, modules, limits, trials and offers are records in a plan catalogue read by entitlements (0215) and billing (0358). A seat meter counts the principal kinds the catalogue names as seats. An ADR may name the kinds of limit; it never fixes their values.
  7. Seeds. A product’s defaults ship as its seed pack (0325 decision 7, 0190), loaded into the platform and into every new sandbox. Changing a default is a seed change and a data migration, not a release of code.
  8. Thresholds in floors. A platform safety threshold (for example the bulk-send size of 0360 decision 8) is a platform-floor setting. A tenant may make it stricter, never looser.
  9. Tests check shape, not values. A test may check that the seed matches its schema and respects the floors. It never asserts a business number copied from an ADR.

Consequences

  • A new country is a new pack and its drivers, not a code change. A new price or plan is an admin edit.
  • @stackra/settings needs a floor-aware resolver, and @stackra/rules needs to read pack floors.
  • A market-pack loader, a plan-catalogue model and a seed compiler need homes (see stackra-package-needs.md).
  • ADRs get shorter: they keep the mechanism and point to the seed for values.
  • Reviewers must refuse a pull request that adds a country branch, a price or a policy value to code.

Enforcement

planned — a lint rule that flags country codes, currency codes and tier names in package source outside packs and tests; a seed-schema test per product; a resolver test that a tenant value past a pack floor is refused with the pack and law named.

Open questions

  1. Pack home. Whether the market-pack loader is a new package or part of @stackra/settings is not decided.
  2. Pack authorship. Who signs a pack version (counsel, a local reviewer) before it goes live is not decided.
  3. Floor conflicts across packs. For a tenant active in two markets, which pack wins for a shared record (the strictest, or the pack of the record’s legal entity) is not decided.

Supersedes and sources

Supersedes: none. Adds Notes to 0203, 0242, 0210, 0189, 0343, 0220, 0268, 0192, 0186 and 0360. Sources: owner principle of 2026-10-25 (notes/handover/os/owner-answers.md, last section); notes/handover/adr-hardcoding-findings.md; notes/handover/config-model.md.