# Scellement V19 ENGINE — v3 du 2026-06-12 (v1/v2 conservées, cf changelog)

## Objet

Preuve d'intégrité et d'antériorité du moteur de décision V19 (momentum
sectoriel paneuropéen + poche or, backtest + live), préalable au track
record forward démarrant juillet 2026. Le moteur étant déterministe,
ce scellé couvre TOUTES les sorties dérivables (4 profils de risque ×
paliers de capital × tout capital saisi).

## Artefacts (ce dossier)

| Fichier | Rôle |
|---|---|
| `v19_engine.manifest` | Liste des 14 fichiers du périmètre scellé (+ exclusions motivées) |
| `v19_engine.json` | Référence : SHA-256 par fichier + hash global |
| `v19_engine_20260612.tsq` | Requête d'horodatage RFC-3161 (digest SHA-512 du JSON) |
| `v19_engine_20260612.tsr` | **Jeton d'horodatage signé par la TSA** (freetsa.org) |
| `freetsa_cacert.pem` | Certificat CA de la TSA (vérification autonome) |

## Valeurs scellées (version COURANTE = v3)

- **Hash global V19 ENGINE (v3)** :
  `21a75f160f32d769b11f015be07db3de031543565ba713d395d76ab85d54187f`
- **Horodatage TSA v3** : `2026-06-12 14:42:10 GMT` (sériel `0x05939889`,
  jeton `v19_engine_v3_20260612.tsr`)
- **Moteur** : V19 (cf. `config/engine_version.json`, scellé)
- Historique v1 (`75fb79e64033…`) et v2 (`a6d6e691200d…`) : jetons CONSERVÉS
  — la chaîne des sceaux est l'audit trail.

## Vérification par un tiers (3 étapes, aucune confiance requise)

```bash
# 1. Le code actuel correspond-il à la référence scellée ?
python scripts/hash_part.py \
    --manifest config/hash_manifests/v19_engine.manifest \
    --zone "V19 ENGINE" --verify config/hash_manifests/v19_engine.json
# → [OK] = intègre ; code retour 3 = divergence détaillée fichier par fichier

# 2. La référence est-elle bien celle horodatée par la TSA ?
openssl ts -verify -data config/hash_manifests/v19_engine.json \
    -in config/hash_manifests/v19_engine_20260612.tsr \
    -CAfile config/hash_manifests/freetsa_cacert.pem
# → "Verification: OK" = ce JSON exact existait au moment du timestamp

# 3. Quand ?
openssl ts -reply -in config/hash_manifests/v19_engine_20260612.tsr -text
# → "Time stamp: Jun 11 23:20:49 2026 GMT", signé par la TSA, infalsifiable
```

## Scellé DATASET (ajouté 2026-06-12) — données d'entrée du backtest

Le code seul ne suffit pas : un sceptique peut arguer que les prix
historiques (PostgreSQL, mutable) ont été retouchés. D'où un second
scellé sur le DATASET exact consommé par le moteur :

| Fichier | Rôle |
|---|---|
| `v19_dataset_20260612.json` | Méta : requêtes SQL exactes, normalisation, hashes, comptes |
| `v19_dataset_20260612.tsq` / `.tsr` | Horodatage RFC-3161 (TSA : `2026-06-11 23:39:06 GMT`, sériel `0x058EAA5F`) |
| `data/v19_dataset_seal/yahoo_prices_1d_20260612.csv` | 1 107 443 barres 1d (export canonique, ordre de la requête moteur) |
| `data/v19_dataset_seal/prices_eur_gold_20260612.csv` | 3 026 barres or EUR (miroir prices_eur) |

- **Hash global dataset** :
  `518b9035dcc98f4e5b5f3db8c6d14c9482a00c0fdfff061f3eeba5011417f534`
- Runs alignés : `V14_2015-08_2026-06_11d8c2` (non-régression, données
  identiques) ; `4cf6cc` (référence — données au 2026-06-10 = préfixe strict).
- Vérification tierce : ré-exécuter les requêtes du JSON sur la base,
  normaliser (`repr(float(x))`, LF), recalculer SHA-256, comparer ; puis
  `openssl ts -verify -data v19_dataset_20260612.json -in v19_dataset_20260612.tsr -CAfile freetsa_cacert.pem`.

Triplet complet scellé = CODE (`v19_engine`) + CONFIG (incluse dans le
manifest moteur) + DONNÉES (`v19_dataset`) → le backtest est intégralement
reproductible et chaque maillon est horodaté indépendamment de l'opérateur.

## Règles de vie du scellé (chaîne versionnée)

1. Toute modification d'un fichier du manifest ⇒ ALERTE CRITIQUE +
   re-scellement **versionné** : nouveau JSON (`v19_engine.json` v2) +
   nouveau `.tsr` + entrée changelog ci-dessous. On n'écrase JAMAIS un
   `.tsr` antérieur — la chaîne des sceaux successifs EST l'audit trail.
2. Déplacement de code sans changement fonctionnel (refactor/optimisation) :
   autorisé, mais se prouve en rejouant le backtest de référence sur le
   nouveau code (mêmes trades = même fonction) avant re-scellement.
3. La couche UI/API (`api/routes/*`, `api/templates/*`, `notify.py`,
   `performance.py`, `custom_positions.py`) est HORS périmètre : son
   évolution n'invalide pas le scellé.

## Changelog des sceaux

| Version | Date | Hash global (12 prem.) | TSR | Motif |
|---|---|---|---|---|
| v1 | 2026-06-12 | `75fb79e64033` | `v19_engine_20260612.tsr` | Scellement initial pré-forward |
| v2 | 2026-06-12 | `a6d6e691200d` | `v19_engine_v2_20260612.tsr` | Options abonné « actions entières » (broker sans fractionnel, règle floor+min1-sous-cap validée A/B à sec) et « portefeuille compact » (tps=1, vol-target conservé) — `live_allocation.py` + `paper_trading.py`. Décisions backtest STRICTEMENT inchangées : non-régression 130/130 mois identiques à la réf `4cf6cc` re-validée post-modification. |
| v3 | 2026-06-12 | `21a75f160f32` | `v19_engine_v3_20260612.tsr` | Fix double-floor : le ledger abonné redevient FRACTIONNEL pour tous (retrait de l'arrondi de `paper_trading.py` — arrondir le ledger sur l'equity composée PUIS rebaser à l'affichage perdait une action par cascade, ex. BESI 3→0 au lieu de 1). L'arrondi entier vit en UNE étape au capital rebasé (couche affichage, floor + min1-sous-cap-et-budget). `live_allocation.whole_shares_qty` conservé (émissions directes). Non-régression 130/130 re-validée. |
