docs: RECAP session 2026-08-25 + accès ssh banc .75

Point d'arrêt avant redémarrage machine. Consigne l'état du lot B app, le
bloqueur (lot plugin non déployé sur .75), le partage vérifié/non-vérifié,
et la question ouverte sur la fusion /energy/setup ↔ /energy/loads.

Note l'accès ssh au banc désormais documenté dans CLAUDE.md : il lève la
limite qui rendait le critère 7-1bis (non-reconstruction des adaptateurs)
invérifiable faute de journal.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Patrick Schurig 2026-08-25 14:31:58 +02:00
parent 7ca42973f2
commit bb77039c82
2 changed files with 107 additions and 0 deletions

View File

@ -3,6 +3,11 @@
---
# ssh banc .75
Accès banc `.75` : ssh etm@192.168.1.75 (clé déjà installée).
Ni root ni nymea n'existent. Journal : journalctl -u nymead.
---
## Mon rôle
Interface utilisateur Flutter du HEMS ETM-PowerSync.
Je communique **exclusivement via JSON-RPC nymea port 4444**.

102
RECAP.md
View File

@ -1,5 +1,107 @@
# RECAP — etm-powersync-app · reprise de session
> **Session 2026-08-25.** Branche **`feature/beta-add-config`**. Rien n'est poussé.
> La section « État au 2026-06-30 » plus bas reste valable pour tout ce qu'elle décrit.
---
## Session 2026-08-25 — ce qui a été fait
### Commits ajoutés
| Commit | Contenu |
|---|---|
| `7ca4297` | **Lot B app** — ordre de service des charges, locale, ossature i18n |
| `40ac3b2` | Fixtures : dump réel `GetLoadConfig` + schéma introspecté de `.75` |
### 1. Menus (demande initiale)
- « Rôles & appareils » et « Options développeur » → **section MODE INSTALLATEUR** uniquement.
- Groupes / Scènes / Médias / Garages → **masqués par défaut**. Le drawer lit désormais
`AppSettingsProvider.visibleScreens` (ces 4 écrans y étaient **déjà** à `visible: false` ;
le drawer les affichait en dur et ignorait le réglage).
- Garde de routeur `_isInstallerRoute` (`main.dart:41`) : `/settings/system*`,
`/settings/app/developer`, `/energy/setup`, `/energy/loads` → redirection vers `/` si le
mode installateur est verrouillé. Couvre l'URL directe, le deep-link et l'auto-lock 10 min.
- Liens SUPPORT corrigés : doc → `https://docs.etm-powersync.fr/`, Telegram →
`https://t.me/etm_powersync_support`, **Discord retiré** (commenté sur place).
### 2. Investigations rendues (constats factuels, pas de code)
- **Locale nymea** : gérée **PAR CONNEXION** (`o:locale` dans `Hello`,
`m_clientLocales`). Pas de forçage `LANG`/`LC_ALL` dans l'unité systemd. **Mais** sur 784
chaînes affichables de `.75`, l'allemand en change **1**, le français **0** : aucun
catalogue `.qm` fr n'est livré. Les `displayName` = identifiants anglais.
- **Frontière RPC / runtime de l'arbitre** : quasi rien ne sort. Seuls `degradedMode`
(notification `ChargingSchedulesChanged` **uniquement** — pas relisable par `Get`), les
deux ratios d'énergie, `chargingState` de l'EV et le plan de recharge franchissent.
Allocation, budget, verrous, paliers, `available`, motifs : **journal seulement**.
`SurplusContext` / `LoadContextTelemetry` n'ont aucune sérialisation sortante.
### 3. Lot B app — livré
- `models/load_config_entry.dart` — **vue en lecture** au-dessus de la map brute ; écriture
par `patched()` depuis la map d'origine, jamais de re-sérialisation.
- `services/load_priority.dart` — `groupByDomain` / `flattenToPayload` /
`applyDefaultDomainOrder` / miroir client de `validateSet()`.
- `providers/load_config_provider.dart` — séquence `pending → LoadConfigChanged →
confirmed|diverged`. Ne conclut jamais sur l'acquittement du RPC.
- `screens/energy/load_order_screen.dart` — route `/energy/loads`, gatée installateur.
- i18n : `flutter_localizations` + `intl` + `lib/l10n/app_fr.arb` + `l10n.yaml`.
Extension `context.l10n`. Français seul.
- `NymeaEnergy.GetLoadConfig` / `SetLoadConfig` deviennent **réels** (c'étaient des stubs).
- **Locale** envoyée à chaque `Hello`, demandée + retenue journalisées.
### 4. ⚠️ Piège désamorcé — à ne pas réintroduire
`EnergySetupProvider.persist()` appelait `setLoadConfig(buildLoadDescriptors())`, une
**reconstruction depuis le modèle typé**, et `_commit()` l'appelle à chaque changement d'UI.
Inoffensif tant que le RPC était un stub ; destructeur une fois réel (`SetLoadConfig`
remplace **tout l'ensemble** → la charge `chauffe-eau` de `.75` aurait été écrasée).
**Émission débranchée**, raison documentée sur place.
---
## ⛔ BLOQUEUR PRINCIPAL À LA REPRISE
**Le lot plugin `brief-plugin-lotB-telemetrie.md` n'est PAS déployé sur `.75`.**
Introspect au 2026-08-25 : toujours **19 méthodes / 13 notifications**.
```
GetLoadTelemetry : ABSENT
LoadTelemetryChanged : ABSENT
o:domain : ABSENT du schéma SetLoadConfig
```
Conséquence : critères **4 à 8** du brief lot B hors d'atteinte (domaine, télémétrie
vivante, fraîcheur, défaut/`ClearLoadFault`, code inconnu réel). Tant que ce lot n'est pas
sur la box, **il n'y a plus rien d'utile à faire côté app sur ce périmètre**.
## Vérifié / non vérifié (lot B app)
| Critère | Statut |
|---|---|
| §7-1 aller-retour neutre | ✅ **sur `.75` en vrai** — `SetLoadConfig` verbatim → relecture identique |
| §7-1bis non-rebuild ECS-412 | ⚠️ lecture de code seulement (`sameHardware()`), journal non consulté |
| §7-2 aplatissement réversible | ✅ **test unitaire seul** — `.75` n'a qu'une charge |
| §7-3 config non contiguë | ✅ **test unitaire seul** — fixture synthétique |
| §7-4 à §7-8 | ❌ bloqués (lot plugin) |
| §7-9 locale | ✅ protocole vérifié sur `.75` ; ⚠️ **chemin app jamais exécuté sur appareil** (adb refusé) |
| §7-10 analyze / tests / gating | ✅ 25 issues = ligne de base, 30/30 tests |
## Question ouverte à trancher
Le brief désignait « Rôles & appareils » (`/energy/setup`) comme écran cible, mais cet écran
est bâti sur le modèle **inverse** (il construit des `LoadDescriptor` depuis des `EmsRole`).
J'ai créé `/energy/loads` à côté et laissé `/energy/setup` intact. **Fusionner les deux est
une refonte, pas un câblage** — décision Patrick attendue.
## Nouveauté à exploiter à la reprise
`CLAUDE.md` documente désormais l'accès banc : `ssh etm@192.168.1.75` (clé installée),
journal via `journalctl -u nymead`. **Cela lève la limite qui rendait §7-1bis invérifiable**
— au prochain aller-retour neutre, lire le journal pour confirmer qu'aucune reconstruction
d'adaptateurs n'a lieu.
---
# RECAP — etm-powersync-app · reprise de session
> État au 2026-06-30. Branche **`feature/beta-add-config`** (9 commits au-dessus de `master`).
> **Rien n'est poussé** (push différé). **Aucun merge** vers master/silo.