De pagina van Evolu Relay op de lijst van de gebruiker
Negen punten uit echt gebruik met 0.4.0, alle negen gedaan. Twee ervan waren onderzoeksvragen en die staan onderaan. Evolu Relay 0.5.0 - Een tijdvenster van twee minuten voor nieuwe eigenaars, met een stopknop. De teller zit in het relay-proces en niet in de pagina: een teller in een tabblad dat je sluit, sluit de deur niet. policy.js kreeg learningUntil, isLearningOpen en expireLearning. - decideOwner kijkt naar isLearningOpen en niet naar het veld learning. De lus die een verlopen venster opruimt loopt elke twee seconden, en in dat gat zou een onbekende alsnog binnenkomen. - Zonder STATE_VERSION te verhogen, met een toets die dat verdedigt: een verhoging zou de allowlist van de draaiende installatie laten afwijzen en de deur sluiten voor eigenaars die er al in stonden. - Labels op een eigenaar-id, in een eigen labels.json met de agent als enige schrijver. Een label zegt niets over toegang, dus de relay hoeft het niet te weten; het is daardoor meteen opgeslagen en werkt ook als de relay omligt. - Geblokkeerde en geweigerde eigenaars in een kader, met een badge die zegt welke van de twee het is. De badge staat buiten het hover-blok, anders is dat onderscheid onzichtbaar tenzij je over de regel gaat. - Maatvoering gelijk aan Electrum Gate: 1760px, hetzelfde raster, icoon van 64 pixels, dezelfde kop, versienummer erachter. Uitleg uit de kaders, knoppen pas bij hover, geen voetregel. Electrum Gate 0.0.24 - Menu-item "About this app", in beide apps. - De statuswidget zei "Answering" met "answered in 7 ms, from inside the app" en zegt nu "Running" met de meting eronder. De nuance dat de controle van container naar container loopt is verplaatst naar een eigen kopje in die dialoog, waar er ruimte voor is; vier woorden waren te weinig. Toetsen en gereedschap - tests/test_relay_agent.py (nieuw, 65 toetsen) en tests/test_paginas_parsen.mjs (nieuw). Muteertests gedraaid op de beslissende regels. - Een dollarteken-toets in test_appstore_vorm.py. Het commentaar in drie bestanden beweerde al dat die test bestond; nu is dat waar. - Een toets dat er geen werkbestanden in een app-map staan. umbreld kopieert de hele map naar het apparaat en in de back-up. - tools/voorbeeldpagina.mjs maakt van een *.template een pagina die je in een browser kunt openen. Dat vond meteen twee echte opmaakfouten. De twee onderzoeksvragen - Een geweigerde eigenaar komt niet in de database: isOwnerAllowed zit in de WebSocket-upgrade, dus het is een 401 en een gesloten socket. Het gewenste gevolg treedt wel op, via de client: die is local-first en levert bij toelating de hele geschiedenis. Blokkeren werkt daarentegen pas bij de volgende verbinding, en dat staat als open punt. - De blobs zijn niet met een xpub te ontcijferen; een OwnerId komt daar niet uit. Met de SLIP-21-node van het apparaat kan het wel, maar die geeft volledige zeggenschap, dus dat hoort niet in een relay. Als plan-punt opgenomen bij de tool in HomeGit/Trezor. Nog niet uitgerold: de image 0.5.0 moet gebouwd en geduwd worden. De digest staat daarom niet in de compose, want een oude digest onder een nieuwe tag levert stil de oude relay. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,25 @@
|
||||
|
||||
## Volgende stap
|
||||
|
||||
- [ ] **De image 0.5.0 bouwen en duwen, en dan de digest in de compose zetten. Eigenaar: gebruiker.** Dit
|
||||
is de enige stap die 0.5.0 tegenhoudt, en hij kan niet op een laptop: er staat een wijziging in het
|
||||
relay-programma (het tijdvenster) en umbreld kan niet bij een image die alleen lokaal bestaat.
|
||||
|
||||
```
|
||||
sh tools/evolu-relay/build.sh
|
||||
docker login sc.kamenier-hamer.nl
|
||||
docker push sc.kamenier-hamer.nl/sysop/evolu-relay:0.5.0
|
||||
```
|
||||
|
||||
**De digest staat op dit moment níet in de compose**, en dat is met opzet: een oude digest onder een
|
||||
nieuwe tag levert stilzwijgend de oude relay, en dan werkt de timer niet zonder dat iets dat meldt.
|
||||
Ongepind faalt hard en zichtbaar. Zet de digest uit de push-uitvoer erachter zodra hij er is;
|
||||
`test_appstore_vorm.py` drukt de pinstatus af, dus de suite blijft het zeggen tot het gedaan is
|
||||
- [ ] **Daarna op het apparaat nakijken wat een browser moet bewijzen (30-08-2026).** De pagina is met
|
||||
nagemaakte gegevens bekeken en dat vond twee echte fouten, maar drie dingen kan alleen de app zelf
|
||||
zeggen: loopt de teller écht af en gaat de deur dan dicht, blijft een label na een herstart staan, en
|
||||
klopt het adres in het kader "Relay address" (dat gebruikt `window.location.hostname`, en achter de
|
||||
app-proxy is dat een ander adres dan op een laptop)
|
||||
- [x] **De kále Evolu-relay geprobeerd, en hij werkt (28-08-2026).** Trezor Suite op de desktop stuurde
|
||||
elf labels naar `docker.io/evoluhq/relay:latest` en die kwamen aan: de database in het volume groeide
|
||||
van 40960 naar 49152 bytes. **De protocolversie klopt**, en daarmee is de richting uit
|
||||
@@ -100,6 +119,91 @@ Wat er niet staat: iOS doet niets mee, en daardoor is de leeskant nooit gemeten.
|
||||
met de WebSocket-upgrade aan. De handshake-curl uit [PLAN.md](PLAN.md) §6a stap 3 geeft daar
|
||||
`101 Switching Protocols`, en de desktop synchroniseert eroverheen
|
||||
|
||||
## Fase 6 - De statuspagina op de lijst van de gebruiker (0.5.0)
|
||||
|
||||
**De lijst kwam op 30-08-2026, nadat de gebruiker met 0.4.0 gewerkt had.** Negen punten, en alle negen
|
||||
gedaan. Twee ervan waren onderzoeksvragen; die staan onderaan.
|
||||
|
||||
Waarom dit in één ronde kon: de pagina is een `*.template` en zit dus in de update-whitelist. Zodra hij in
|
||||
een eigen image zit (het plan **Eigenimage**) kost elke tweak een bouw plus een digest, en dán is dit
|
||||
duurder. Die volgorde stond als reden bij de vorige taak en is daarmee ingelost.
|
||||
|
||||
- [x] **Gelijkgetrokken met Electrum Gate.** Dezelfde `max-width: 1760px`, hetzelfde raster van twaalf
|
||||
kolommen, hetzelfde icoon van 64 pixels met terugval, dezelfde `t-h1` van 2rem, hetzelfde menu met
|
||||
drie punten, en het versienummer achter de tagline. De pagina leende dat ontwerp al maar op eigen maten
|
||||
- [x] **Een tijdvenster van twee minuten voor nieuwe eigenaars, met een stopknop.** **De teller zit in het
|
||||
relay-proces en niet in de pagina**, en dat is de kern van deze taak: een teller in een tabblad dat je
|
||||
sluit, sluit de deur niet. `policy.js` heeft er een veld `learningUntil` voor gekregen, plus
|
||||
`isLearningOpen` en `expireLearning`
|
||||
- [x] **`decideOwner` kijkt naar `isLearningOpen` en niet naar het veld `learning`.** Dat is geen
|
||||
netheid: de lus die het bestand opruimt loopt elke twee seconden, en in dat gat zou een onbekende
|
||||
alsnog binnenkomen. Muteertest gedaan: de juiste drie toetsen vielen om
|
||||
- [x] **Zonder `STATE_VERSION` te verhogen**, en met een toets die dat verdedigt. Een verhoging zou
|
||||
`normalizeState` het bestand van de draaiende installatie laten afwijzen, en dan schuift `store.js` de
|
||||
allowlist opzij en gaat de deur dicht voor eigenaars die er al in stonden
|
||||
- [x] **Geweigerde en geblokkeerde eigenaars in één kader.** Wat je ermee doet is hetzelfde: toelaten of
|
||||
vergeten. Welke van de twee een regel is, staat als badge op de regel, en die badge staat **buiten**
|
||||
het hover-blok. Dat was de eerste van de twee fouten die de voorbeeldweergave vond: erbinnen was het
|
||||
onderscheid onzichtbaar tenzij je over de regel ging, en dat is juist de informatie waarvoor de twee
|
||||
kaders zijn samengevoegd
|
||||
- [x] **De uitleggende regels eruit.** De koppen zeggen genoeg; wat er te weten valt staat in de nieuwe
|
||||
dialoog. Wat níet weggegooid is maar verplaatst: dat het adres met `http` moet beginnen en niet met
|
||||
`ws`, en wat de relay wel en niet kan zien
|
||||
- [x] **Knoppen alleen bij hover, per regel.** Met opacity en niet met `display: none`, zodat ze met de
|
||||
tab-toets bereikbaar blijven; `focus-within` maakt ze dan zichtbaar, en op een aanraakscherm staan ze
|
||||
altijd aan. Dit had één gevolg dat je niet ziet aankomen: onzichtbare knoppen houden hun ruimte, dus
|
||||
de kop "New owners" brak over twee regels en de waarde stond lager dan in de drie kaders ernaast.
|
||||
Opgelost met kortere knoptekst plus hetzelfde afbreekpunt van 1400px dat Gate gebruikt
|
||||
- [x] **Geen voetregel, en een menu-item "About this app" in plaats daarvan.** In **beide** apps, op verzoek
|
||||
van de gebruiker. Bij Gate staat daar bovendien wat de statuswidget wél en niet bewijst
|
||||
- [x] **Labels op een eigenaar-id, te onderhouden.** Hover een regel en klik **Label**: het veld komt in de
|
||||
plaats van de titel, Enter bewaart, Escape breekt af. **De labels staan in een eigen bestand
|
||||
`labels.json` met de agent als enige schrijver**, en niet in `owners.json`. Drie redenen: één schrijver
|
||||
per bestand blijft de afspraak, een label is meteen opgeslagen in plaats van na de volgende ronde van
|
||||
de relay, en labelen blijft werken als de relay omgevallen is. De relay hoeft dit niet te weten, want
|
||||
een label zegt niets over wie er binnen mag
|
||||
- [x] **De statuswidget van Electrum Gate verduidelijkt**, op de opmerking van de gebruiker dat die van
|
||||
Evolu Relay veel duidelijker is. Er stond "Answering" met "answered in 7 ms, from inside the app"; nu
|
||||
"Running" met de meting eronder, en de nuance staat onder een eigen kopje in de nieuwe dialoog
|
||||
|
||||
### Wat er aan toetsen bij kwam
|
||||
|
||||
De pagina's zijn samen bijna drieduizend regels en er stond geen enkele toets op. Dat blijft zo voor wat ze
|
||||
tonen, maar drie klassen fouten hoeven niet op het apparaat gevonden te worden:
|
||||
|
||||
- [x] **`tests/test_relay_agent.py`** (nieuw, 65 toetsen): de labels en het tijdvenster in de agent. Twee
|
||||
muteertests gedaan
|
||||
- [x] **`tests/test_paginas_parsen.mjs`** (nieuw): loopt de JavaScript van elke pagina, en loopt hij ook nog
|
||||
ná de invulling door umbreld. Muteertest gedaan met een echte syntaxfout
|
||||
- [x] **Een dollarteken-toets in `test_appstore_vorm.py`.** Dit is de valstrik van dit hele project, en het
|
||||
commentaar in drie bestanden beweerde al dat déze test hem dichthield terwijl dat niet zo was. Nu
|
||||
wel. Hij vond meteen twee valse positieven in de eigen opzet (een kaal dollarteken in een
|
||||
commentaarregel, en de exports van een afhankelijkheid), en die zijn in de toets opgelost en niet in
|
||||
de bestanden
|
||||
- [x] **Een toets dat er geen werkbestanden in een app-map staan.** umbreld kopieert de héle app-map naar
|
||||
het apparaat, dus een bewerkbestand van een icoon van 175 kB gaat mee in elke back-up. Die stond er
|
||||
op 30-08-2026
|
||||
- [x] **`tools/voorbeeldpagina.mjs`** (nieuw): maakt van een `*.template` een pagina die je in een browser
|
||||
kunt openen, met de variabelen ingevuld en nagemaakte gegevens erin. Geen toets en geen bewijs, maar
|
||||
het vond in één keer de twee fouten hierboven. Uitvoer komt in `voorbeeld/` en die map is gitignored
|
||||
|
||||
### De twee onderzoeksvragen
|
||||
|
||||
- [x] **"Komen geweigerde eigenaars toch met de hele blow aan instellingen in de database?" Nee.**
|
||||
`isOwnerAllowed` wordt in de WebSocket-**upgrade** aangeroepen; een weigering is een HTTP 401 en een
|
||||
gesloten socket, dus er wordt niets opgeslagen. **Maar het gewenste gevolg treedt wel op**: Evolu is
|
||||
local-first, de cliënt houdt alles zelf en probeert opnieuw, dus alsnog toelaten brengt de hele
|
||||
geschiedenis binnen. De redenering met bronregels staat in
|
||||
[Upstream-evolu-relay.md](../../../Referenties/Upstream-evolu-relay.md) §10, en daar staat ook de
|
||||
scherpe kant: **blokkeren werkt pas bij de volgende verbinding**, want voor een lopende verbinding
|
||||
wordt de vraag nooit opnieuw gesteld. Dat staat als open punt 10 in [OPEN.md](OPEN.md)
|
||||
- [x] **"Kunnen we de blobs ontcijferen met de xpub?" Nee, en de premisse klopt niet.** Een `OwnerId` wordt
|
||||
niet uit een xpub gemaakt: `OwnerId`, `OwnerEncryptionKey` en `OwnerWriteKey` komen alle drie met
|
||||
SLIP-21 uit één 32-byte node die het apparaat aflevert. Dat spoor loopt langs de seed en niet langs
|
||||
BIP32, dus uit een xpub is er niets te halen. **Met die node zelf kan het wél**, en `trezorlib` heeft
|
||||
er een functie voor. Waarom dat níet in deze app hoort, en waar het wél hoort, staat in §11 van
|
||||
hetzelfde document; het plan-punt staat in de repo `HomeGit/Trezor` bij **AdvancedUI**
|
||||
|
||||
## Fase 1 - De app-map
|
||||
|
||||
- [x] **`whatsnext-evolu-relay/` aangemaakt met `umbrel-app.yml` en `docker-compose.yml` (25-08-2026).**
|
||||
@@ -130,11 +234,8 @@ Wat er niet staat: iOS doet niets mee, en daardoor is de leeskant nooit gemeten.
|
||||
zie fase 4. **Let op dat dit één architectuur is** (amd64), want er is alleen amd64 geduwd. Voor de
|
||||
officiele store hoort er een multi-arch index-digest met arm64 in; dat staat bij **Publicatie-Relay**
|
||||
- [x] **De Postgres-pin is vervallen (28-08-2026):** die database zit niet meer in de app
|
||||
- [ ] **De statuspagina verbeteren, op een lijst van de gebruiker.** Hij gaat er eerst mee werken en komt
|
||||
dan met wat er beter moet (28-08-2026). Tot die lijst er is, is dit géén werk: de pagina doet wat hij
|
||||
moet doen. **Doe dit vóór het plan Eigenimage voor deze app**, want zolang de pagina een `*.template`
|
||||
is bereikt elke wijziging een installatie met een push plus versieverhoging; zit hij eenmaal in een
|
||||
image, dan kost elke tweak een bouw en een digest. **Eigenaar: gebruiker levert de lijst**
|
||||
- [x] **De statuspagina verbeteren, op een lijst van de gebruiker.** De lijst kwam op 30-08-2026 en is in
|
||||
één ronde uitgevoerd; zie fase 6 hieronder
|
||||
- [ ] **`python:3-alpine` en `nginx:alpine` pinnen op hun multi-arch index-digest.** Dat zijn de twee laatste
|
||||
ongepinde images van deze app, en ze staan als TODO in de compose. Met
|
||||
`docker buildx imagetools inspect` op de Umbrel. Electrum Gate heeft precies dezelfde twee openstaan,
|
||||
|
||||
Reference in New Issue
Block a user