Back to changelog index

1.0.3

Jul 16, 2026 · 17 packages · 8 unique changes · 3 release entries

libsmodulesBreaking changes

This release affects the contracts, sharedLibs, solutions familyies.

Run contractspec connect adoption resolve --family contracts to see how it impacts your project.

Release summaries

  • billingos-data-fetching-admission-gate

    Add the BillingOS pre-engine admission gate (submitBillingMutation) — the single safe caller of the data-fetching engine's mutate(), fail-closed for every approval-gated and unknown BillingActionKind — and make InvoiceWorkspace QueryState-aware via the design-system DataViewList plus a pending-approval affordance.

    maintainer

    module.billing-os gains a submitBillingMutation admission gate (the only permitted engine.mutate caller) plus isEngineEligibleBillingAction and ENGINE_ELIGIBLE_BILLING_ACTION_KINDS, exported from the root and a new ./lib/submit-billing-mutation subpath, with types BillingMutationEngine, SubmitBillingMutationOutcome, and SubmitBillingMutationRequest. The gate is fail-closed: only read/draft_quote/draft_invoice reach the engine (optimistic + offline queue + auto-replay); all 11 approval-gated kinds and any unknown/future kind route to composeBillingOsCompanyOsReview with no optimistic write. New deps @lssm-tech/lib.contracts-runtime-core and @lssm-tech/lib.contracts-spec are used for engine/protocol types only — the pure billing libs gain no data-fetching dependency.

    integrator

    All changes are additive — existing imports resolve unchanged. To drive BillingOS mutations through the engine, call submitBillingMutation(request, engine) instead of engine.mutate directly; approval-gated actions return a pending_approval outcome (no optimistic write) routed to the operator inbox. InvoiceWorkspace accepts two new optional props: queryState (canonical QueryState; renders loading/error/offline/ stale/conflict/empty/auth-expired via the design-system DataViewList) and pendingApproval (a pending-approval affordance). The component remains I/O-free.

  • i18n-readiness-billing-formatting

    Make BillingOS money/number formatting locale-correct at every call site by removing the silent en-US fallback from formatCurrency and requiring a locale on PaymentCard.

    integrator

    formatCurrency(amount, currency, locale) now requires locale (no en-US default), and the PaymentCard organism requires a locale prop. Pass the active locale from useI18n() or the host i18n context at every call site.

    customer

    Invoices, quotes, and payment amounts now render with locale-correct currency, grouping, and symbol placement (for example 1 234,56 € in French instead of en-US formatting).

  • monorepo-i18n-readiness

    Make the monorepo i18n-ready. Each in-scope package now ships a public `./i18n` subpath with `createI18nFactory`-backed en/fr/es catalogs (real translations), consumed in React via `@lssm-tech/lib.design-system`'s `useI18n`/`LocaleProvider`. No public API removals; every change is additive. Blocking CI gates (hardcoded-string scan, en/fr/es parity, JSX-text/attribute Grit rules, no module-scope translation calls) enforce the contract repo-wide via a shrinking `unmigratedPackages` allowlist.

    maintainer

    Every migrated package gains a public `./i18n` subpath exporting `create<Pkg>I18n(locale?)`, `getDefault<Pkg>I18n()`, `reset<Pkg>I18nRegistry()`, a `<Pkg>MessageKey` type, and `<PKG>_I18N_KEYS` / `<PKG>_I18N_KEY_LIST`, backed by `defineTranslation` specs keyed `<pkg>.messages` with en/fr/es real translations. The canonical pattern is `createI18nFactory` from `@lssm-tech/lib.contracts-spec/translations` consumed in React via `useI18n` from `@lssm-tech/lib.design-system/i18n` (the app/bundle root mounts one `LocaleProvider` per render tree; modules and libs never mount it). M1 exception: libs that design-system depends on (presentation-runtime-react, contracts-runtime-client-react) resolve via their own factory inside the component to avoid a build cycle. The deprecated `@lssm-tech/lib.translation-runtime` is retained only for ICU/override/SSR edge cases. CI gates: `bun run i18n:ci` aggregates `lint:i18n` (no module-scope translation calls), `i18n:check-hardcoded` (DocBlock-aware scanner, shrinking `unmigratedPackages` allowlist with non-growth guard), and `i18n:check` (en/fr/es parity); Grit plugins enforce typography-wrapped JSX text and ban hardcoded `aria-label`/`placeholder`/`title`/`alt` literals.

    integrator

    All changes are additive — existing imports resolve unchanged. To consume translations from a migrated package in React, import `useI18n` from `@lssm-tech/lib.design-system/i18n` and call `t('<pkg-namespace>.<area>.<element>')`; the host app must mount a `<LocaleProvider>` once at the root with a `createRuntime` that aggregates the catalogs of every rendered package (see `LocaleProviderAdapter` in `apps/web-application-monolith` and `MobileI18nProvider` in `apps/mobile-monolith` for the verbatim pattern). For non-React emit (notification templates, surfaced error descriptions), call `create<Pkg>I18n(locale).t(...)` directly, threading `locale` from the caller. `data-exchange-client` now depends on `@lssm-tech/lib.design-system` at runtime (web + native both consume `useI18n`). `presentation-runtime-react`'s `WorkflowStepRenderer` accepts an optional `locale?` prop. ui-kit and examples packages remain string-agnostic (out of scope).

Deprecations

  • - `@lssm-tech/lib.translation-runtime` is retained only for ICU plurals/overrides/SSR edge cases. Prefer `createI18nFactory` from `@lssm-tech/lib.contracts-spec/translations` for all new code; consumers reaching for the runtime should justify the ICU/override/SSR need in the PR.

Migration guide

  • Pass an explicit locale to formatCurrency and PaymentCard

    Required

    formatCurrency and PaymentCard no longer fall back to en-US; supply the active locale so money formatting follows the user's locale.

    When: When calling formatCurrency or rendering PaymentCard from @lssm-tech/module.billing-os.

    1. Resolve the active locale via useI18n() (or the host i18n context) at the call site.
    2. Pass it as the third argument to formatCurrency(amount, currency, locale).
    3. Pass it as the required locale prop to <PaymentCard locale={locale} />.

Upgrade steps

  • Adopt locale-correct BillingOS formatting

    assisted

    Update call sites to pass the active locale and verify locale-correct money/number output.

    Packages: @lssm-tech/module.billing-os

    1. Replace formatCurrency(amount, currency) calls with the three-argument locale-aware form.
    2. Provide the locale prop wherever PaymentCard is rendered.
    3. Keep France-specific billing-france jurisdiction logic intact (it is not the same as locale).
  • Mount one LocaleProvider per app/bundle render tree

    assisted

    Apps and bundles must mount a single `<LocaleProvider>` at the client-tree root with a `createRuntime` factory that aggregates the catalogs of every migrated package they render. Modules and libs do NOT mount the provider — they consume `useI18n` from `@lssm-tech/lib.design-system/i18n` via React context.

    Packages: @lssm-tech/module.billing-os, @lssm-tech/lib.accessibility, @lssm-tech/lib.presentation-runtime-react, @lssm-tech/lib.contracts-runtime-client-react, @lssm-tech/lib.data-exchange-client, @lssm-tech/lib.example-shared-ui, @lssm-tech/module.workflow-orchestration, @lssm-tech/module.review-queue, @lssm-tech/module.companyos, @lssm-tech/module.agent-fleet, @lssm-tech/module.governance-suite, @lssm-tech/module.ai-chat, @lssm-tech/module.execution-console, @lssm-tech/module.communication-os, @lssm-tech/module.builder-workbench, @lssm-tech/module.auth-os

    1. Build a per-app/per-bundle aggregator that wraps `createI18nFactory(...).create(locale)` for each rendered package's catalogs (template: `createManagedCompanyOsTranslationRuntime` in `bundles/managed-companyos`).
    2. Mount `<LocaleProvider locale={locale} createRuntime={...}>` once at the root of the client tree (Next.js: per route group, see `LocaleProviderAdapter` in `apps/web-application-monolith`).
    3. Migrate React components to consume `useI18n().t(...)`; for `aria-label`/`placeholder`/ `title`/`alt` use the resolved `t('key')` (NOT a bare key string).
    4. For non-React emit paths, call `create<Pkg>I18n(locale).t(...)` directly, threading `locale` from the caller.
  • Route BillingOS mutations through submitBillingMutation

    assisted

    Use the admission gate as the single entry point for engine-driven BillingOS mutations, and pass a QueryState into InvoiceWorkspace for lifecycle rendering.

    Packages: @lssm-tech/module.billing-os

    1. Replace direct engine.mutate calls for BillingOS actions with submitBillingMutation(request, engine); handle the discriminated outcome ('mutated' vs 'pending_approval').
    2. Pass the host engine's QueryState to InvoiceWorkspace via the new queryState prop, and surface the pendingApproval affordance for approval-gated actions.

Unique release changes

  • - `@lssm-tech/lib.translation-runtime` is retained only for ICU plurals/overrides/SSR edge cases. Prefer `createI18nFactory` from `@lssm-tech/lib.contracts-spec/translations` for all new code; consumers reaching for the runtime should justify the ICU/override/SSR need in the PR.

    17 packages · 17 occurrences

  • - Apps and bundles must mount a single `<LocaleProvider>` at the client-tree root with a `createRuntime` factory that aggregates the catalogs of every migrated package they render. Modules and libs do NOT mount the provider — they consume `useI18n` from `@lssm-tech/lib.design-system/i18n` via React context.

    17 packages · 17 occurrences

  • - Make the monorepo i18n-ready. Each in-scope package now ships a public `./i18n` subpath with `createI18nFactory`-backed en/fr/es catalogs (real translations), consumed in React via `@lssm-tech/lib.design-system`'s `useI18n`/`LocaleProvider`. No public API removals; every change is additive. Blocking CI gates (hardcoded-string scan, en/fr/es parity, JSX-text/attribute Grit rules, no module-scope translation calls) enforce the contract repo-wide via a shrinking `unmigratedPackages` allowlist.

    17 packages · 17 occurrences

  • - Add the BillingOS pre-engine admission gate (submitBillingMutation) — the single safe caller of the data-fetching engine's mutate(), fail-closed for every approval-gated and unknown BillingActionKind — and make InvoiceWorkspace QueryState-aware via the design-system DataViewList plus a pending-approval affordance.

    1 packages · 1 occurrences

  • - formatCurrency and PaymentCard no longer fall back to en-US; supply the active locale so money formatting follows the user's locale.

    1 packages · 1 occurrences

  • - Make BillingOS money/number formatting locale-correct at every call site by removing the silent en-US fallback from formatCurrency and requiring a locale on PaymentCard.

    1 packages · 1 occurrences

  • - Update call sites to pass the active locale and verify locale-correct money/number output.

    1 packages · 1 occurrences

  • - Use the admission gate as the single entry point for engine-driven BillingOS mutations, and pass a QueryState into InvoiceWorkspace for lifecycle rendering.

    1 packages · 1 occurrences

Impacted packages

  • @lssm-tech/lib.accessibility

    Layer: libs · 3 changes

  • @lssm-tech/lib.contracts-runtime-client-react

    Layer: libs · 3 changes

  • @lssm-tech/lib.data-exchange-client

    Layer: libs · 3 changes

  • @lssm-tech/lib.design-system

    Layer: libs · 3 changes

  • @lssm-tech/lib.example-shared-ui

    Layer: libs · 3 changes

  • @lssm-tech/lib.presentation-runtime-react

    Layer: libs · 3 changes

  • @lssm-tech/module.agent-fleet

    Layer: modules · 3 changes

  • @lssm-tech/module.ai-chat

    Layer: modules · 3 changes

  • @lssm-tech/module.auth-os

    Layer: modules · 3 changes

  • @lssm-tech/module.billing-os

    Layer: modules · 2 changes

  • @lssm-tech/module.builder-workbench

    Layer: modules · 3 changes

  • @lssm-tech/module.communication-os

    Layer: modules · 3 changes

  • @lssm-tech/module.companyos

    Layer: modules · 3 changes

  • @lssm-tech/module.execution-console

    Layer: modules · 3 changes

  • @lssm-tech/module.governance-suite

    Layer: modules · 3 changes

  • @lssm-tech/module.review-queue

    Layer: modules · 3 changes

  • @lssm-tech/module.workflow-orchestration

    Layer: modules · 3 changes