Simpl-Resultat/docs/adr
le king fu d2ded515fd
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m43s
PR Check — Rust / rust (pull_request) Successful in 9m11s
fix(license): name key-entry errors, keep the edition off the activation token, flag revoked keys
Rust (license_commands.rs)
- LicenseError gains InvalidPrefix, InvalidSignature, Malformed and
  UnknownEdition. validate_with_key returns it (ExpiredSignature maps
  to LicenseExpired), and store_license, read_license and
  validate_license_key reject with the same JSON as the network
  commands. store_license_in and read_license_in take a directory, so
  the Storage mapping is tested at the source.
- D12: the edition comes from the license key alone.
  resolve_license_entitlements no longer takes the activation token,
  and current_entitlements reads only license.key
  (entitlements_from_dir). A token that had expired (2-year server
  lifetime) or came from another machine (restored data) used to drop
  a valid key to free, while a key copied without its token kept its
  edition. get_activation_status and persist_activation_token keep the
  strict token validation, and the key keeps its strict validation
  (CWE-613).

Front
- LicenseCard names the load error, and LicenseKeyForm (extracted so a
  static render reaches it) names a refused key, through
  parseLicenseError: no raw backend string reaches the card.
- D13: a license_revoked answer is recorded in LicenseContext for the
  whole session, because the card unmounts when the user leaves
  Settings > Users. Only a different key clears it. Card-level
  message, alert icon, Activate disabled through selectCanActivate.
- Machine counter n/limit, "Not activated", activating and
  deactivating labels, dates in fr-CA/en-CA, and "No expiry date"
  beyond 50 years (licenseExpiry.ts, for the 100-year keys of
  maximus-api#63).
- license.removeLicense and license.machines.activateError removed;
  the price authFailed message points to activating the machine.

Tests: 15 new Rust tests (resolution from a data directory, named
variants, the 100-year key of #363, a key without exp) replace 3
machine-binding tests; vitest covers the card and form renders, the
context revocation, the hook wiring and the locales.
test: reproduces #347 (an expired token of this machine resolved a
valid Base key to free on 5d549d6).

Docs: CHANGELOG FR/EN, guide section 12 and in-app docs,
architecture.md, ADR 0017 amendment for #347, qa-update-cycle.md,
api-contract-prices.md.

Fixes #347
Fixes #360
Refs #363

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 21:39:01 -04:00
..
0001-tauri-v2.md docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
0002-useReducer-vs-redux.md docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
0003-sqlx-migrations.md docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
0004-aes-256-gcm-encryption.md docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
0005-multi-profile-db.md docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
0006-oauth-tokens-keychain.md docs: ADR 0006 + changelog + architecture for OAuth keychain (#82) 2026-04-14 08:26:21 -04:00
0007-reports-hub-refactor.md docs: polish + changelog + ADR + legacy cleanup for reports refactor (#76) 2026-04-14 15:29:49 -04:00
0008-modified-dietz-pour-rendement.md docs(adr): add ADRs 0008-0010 (Modified Dietz, proxy price-fetching, FK RESTRICT) 2026-04-25 17:06:40 -04:00
0009-proxy-price-fetching-via-maximus-api.md docs(adr): add ADRs 0008-0010 (Modified Dietz, proxy price-fetching, FK RESTRICT) 2026-04-25 17:06:40 -04:00
0010-fk-restrict-balance-transfers.md docs(adr): add ADRs 0008-0010 (Modified Dietz, proxy price-fetching, FK RESTRICT) 2026-04-25 17:06:40 -04:00
0011-providers-best-effort-yahoo.md docs(prices): commit /v1/prices contract + ADR 0011 2026-04-27 08:06:03 -04:00
0012-balance-two-level-model.md docs(balance): ADR 0014 + reject 0012 + guide + changelog (#205) 2026-06-01 21:15:06 -04:00
0013-stocks-provider-evaluation.md docs(adr): 0013 — stocks provider evaluation, AV retained as bascule target (#196) 2026-05-09 12:40:08 +00:00
0014-balance-vehicule-attribut.md docs(balance): ADR 0014 + reject 0012 + guide + changelog (#205) 2026-06-01 21:15:06 -04:00
0015-balance-detail-par-titre.md docs(balance): ADR 0015 + guide + architecture + CHANGELOG for per-security detail (#218) 2026-06-06 14:17:03 -04:00
0016-persistance-etat-ui-par-profil.md docs(collapse): ADR 0016 per-profile UI state + guide, architecture, i18n 2026-07-18 14:43:24 -04:00
0017-feature-gating-par-tier.md fix(license): name key-entry errors, keep the edition off the activation token, flag revoked keys 2026-09-29 21:39:01 -04:00
0018-suppression-advisories-non-atteignables.md fix(deps): resolve the quick-xml advisories, unyank deep-link and spin 2026-08-15 11:51:46 -04:00
0019-format-import-persiste.md docs: architecture, ADR 0019, user guide and changelog for the import format 2026-08-14 11:13:25 -04:00