# Taken - Testclient > Prioriteit: **A** | Afhankelijk van: – > > **Nieuw en meteen actief op 09-09-2026.** Het masterplan werd dezelfde dag geschreven en op verzoek van > de gebruiker direct gepromoveerd. Nummer 003, onder de bestaande 005: tier A was leeg en dit is nu de > lopende focus, dus de bovenkant van de reeks klopt weer. > > **Waarom dit plan er is:** vier beweringen over Evolu Relay rusten op redenering uit de broncode in > plaats van op een proef, waaronder dat blokkeren pas bij de volgende verbinding werkt. Zonder een cliënt > die geen hardware nodig heeft, blijft dat zo. ## Volgende stap - [ ] **De cliënt met de relay laten praten.** De samenstelling werkt lokaal; wat nog niet geprobeerd is, is `transports` met `createOwnerWebSocketTransport` erin. **Hiervoor is het adres van de relay nodig**, en dat komt van de gebruiker en gaat niet in de repo; zie [OPEN.md](OPEN.md) punt 6 ## Fase 1 - de samenstelling (af) - [x] **`@evolu/common` 8.7.0 en `@evolu/nodejs` 3.1.0 geïnstalleerd in `tools/relay-client/` (09-09-2026)** - [x] **Vastgesteld dat `@evolu/nodejs` géén cliënt bevat**, alleen de relay plus losse bouwstenen. De afhankelijkheden voor `createEvolu` worden daarom zelf samengesteld in `src/evolu-node.js`; zie [PLAN.md](PLAN.md) §4e voor de vier valstrikken die dat kostte - [x] **Bewezen dat het werkt zonder relay (09-09-2026):** een eigenaar aanmaken, een Evolu-instantie met `transports: []`, een rij met een `Uint8Array`-kolom wegschrijven en teruglezen. De bytes komen er ongeschonden uit en het proces sluit schoon af, zonder defect en zonder te blijven hangen ## Fase 2 - de opdrachtregel - [ ] Een eigenaar aanmaken en bewaren: mnemonic plus database in een eigen map, in een pad dat gitignored is. Het `OwnerId` wordt afgedrukt, de mnemonic niet - [ ] Een register van eigenaars: aanmaken, opsommen, teruglezen, weggooien - [ ] Verbinden met de relay via `createOwnerWebSocketTransport`, met het adres uit een instelling - [ ] Een blob schrijven met een instelbare omvang, en teruglezen - [ ] De losse WebSocket-poging die de HTTP-statuscode wél te zien krijgt; zie [OPEN.md](OPEN.md) punt 1 ## Fase 3 - het bedieningsvlak - [ ] De HTTP-server met de pagina, in de stijl van de twee statuspagina's - [ ] De lijst met eigenaars, met per eigenaar de toestand en de knoppen uit [PLAN.md](PLAN.md) §4b - [ ] Het log, met tijdstip per gebeurtenis ## Fase 4 - de proeven De zes proeven staan in [PLAN.md](PLAN.md) §4c. Ze zijn handwerk en hebben een draaiende relay nodig, dus ze komen na fase 2 en kunnen deels vóór fase 3. - [ ] Onbekende eigenaar met het venster dicht: 401, en een regel in de weigerlijst - [ ] Toelaten en opnieuw verbinden: komt de hele geschiedenis alsnog binnen - [ ] Blokkeren tijdens een lopende verbinding: blijft hij schrijven tot de volgende verbinding - [ ] Het venster van twee minuten met de pagina dicht - [ ] Eén blob boven `RELAY_MAX_WRITE_BYTES`, en meerdere kleinere die samen groter zijn - [ ] Twee eigenaars tegelijk verbonden - [ ] **De uitkomsten terugschrijven** naar §10 van [Upstream-evolu-relay.md](../../../Referenties/Upstream-evolu-relay.md) en naar open punt 10 van het plan **Umbrelapp**. Dit is de opbrengst van het hele plan; zonder deze stap blijft het gereedschap zonder resultaat ## Fase 5 - de toetsen Wat automatisch kan is klein, en [PLAN.md](PLAN.md) §7 zegt waarom. - [ ] Het register: aanmaken, teruglezen, een naam die al bestaat, een half aangelegde map - [ ] Een vaste mnemonic met een vast verwacht `OwnerId`. Dit is de toets die omvalt als Evolu onder ons iets anders gaat doen - [ ] Het lezen van de opdrachtregel - [ ] De nieuwe toetsen mutatie-testen, zoals `HomeGit/CLAUDE.md` voorschrijft