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
- 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.
- 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).
- 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.
- 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.
- 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).
- 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.
- 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.
- 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.
- 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/settingsneeds a floor-aware resolver, and@stackra/rulesneeds 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
- Pack home. Whether the market-pack loader is a new package or part of
@stackra/settingsis not decided. - Pack authorship. Who signs a pack version (counsel, a local reviewer) before it goes live is not decided.
- 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.