Simpl-Resultat/docs
le king fu ed35570121
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m49s
PR Check — Rust / rust (pull_request) Successful in 3m21s
fix(license): drop an activation token that no longer stands for this machine
A data directory written by v0.15.0 or earlier can hold a valid key next
to the activation token of another license, typically a refunded hence
revoked one. The License card read "Activated", market prices were
refused, and "Activate" was never offered: the folder could not recover
without a manual file removal.

- Prices: a 403 license_revoked drops the refused token, and only while
  the file still holds it, so an activation that lands while the refused
  request is in flight keeps its new token (CWE-367). The key's revoked
  state is never written from this route. The token is read through
  ACTIVATION_FILE by the directory-based read_stored_activation_token_in,
  in fetch_price_in, testable without AppHandle.
- Machine list: list_activated_machines returns { machines,
  token_dropped }. A complete list that names this machine under neither
  identifier drops a token that activates this machine, when the OS id is
  readable and the token is the one on disk when the list was asked for.
  An error, a revoked key or a rate limit drops nothing.
  machines_from_verify counts the rows it skips, which the list still
  tolerates. This also gives "Activate" back to a machine deactivated from
  another computer.
- Front: the activation status is read again after every list load; a
  fixed log line (ACTIVATION_TOKEN_LOG) is written on token_dropped and on
  a price refused as revoked; the revoked-license price message invites to
  activate the machine again.
- Docs: architecture, ADR 0017 (#365 amendment), ADR 0020 (rule 4), user
  guide and in-app tips, changelogs.

Resolves #367

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 17:58:25 -04:00
..
adr fix(license): drop an activation token that no longer stands for this machine 2026-10-04 17:58:25 -04:00
archive docs: organize technical documentation into docs/ folder 2026-02-19 07:34:01 -05:00
analyse-onboarding-2026-09.md docs: add the onboarding analysis behind spec-onboarding-phase1 2026-09-30 21:21:14 -04:00
api-contract-prices.md feat(license): online revocation check — a revoked key falls back to Free (#365) 2026-10-02 14:45:34 -04:00
architecture.md fix(license): drop an activation token that no longer stands for this machine 2026-10-04 17:58:25 -04:00
audit-bilan-2026-05.md feat(balance): audit quick wins — terminology, optional symbol, movable snapshot date (#201) 2026-05-31 21:05:13 +00:00
guide-utilisateur.md fix(license): drop an activation token that no longer stands for this machine 2026-10-04 17:58:25 -04:00
qa-onboarding.html docs(onboarding): changelog, architecture, user guide and interactive QA checklist (#357) 2026-10-03 20:25:55 -04:00
qa-refonte-seed-categories-ipc.md test(categories): complete test coverage for migration flow (#123) 2026-04-21 19:25:13 -04:00
qa-update-cycle.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