186 lines
9.4 KiB
Markdown
186 lines
9.4 KiB
Markdown
# GeoIntel professionaliseringsaudit — 27 juli 2026
|
|
|
|
## Managementsamenvatting
|
|
|
|
GeoIntel is inhoudelijk veel sterker dan de eerste visuele indruk deed
|
|
vermoeden. De repository bevat een volwassen, documentatiegestuurde
|
|
GIS-architectuur, expliciete bron- en provenancecontracten, uitgebreide
|
|
kwaliteitscontrole en een product dat bewust geen resultaten fabriceert wanneer
|
|
brondata of modellen ontbreken. De grootste productrisico's zaten niet in de
|
|
GIS-kern, maar in de toegangservaring, de presentatie van de functiedichtheid
|
|
en de gegroeide frontend-stijllagen.
|
|
|
|
Deze pass professionaliseert de eerste gebruikerservaring en voegt een veilige
|
|
gastdemonstratie toe. Een bezoeker kan nu rechtstreeks vanaf de landingspagina
|
|
een tijdelijke demowerkruimte openen. Die sessie is server-side aan één
|
|
voorbeeldproject gebonden, heeft een kortere levensduur en kan geen
|
|
operatorwijzigingen uitvoeren. De interface toont in gastmodus alleen de kaart
|
|
en bestaand kwaliteitsbewijs.
|
|
|
|
## Wat al sterk was
|
|
|
|
- **Inhoudelijke geloofwaardigheid.** Officiële bronnen, meeteenheden, CRS,
|
|
dekking, beperkingen en provenance worden als productgegevens behandeld en
|
|
niet als decoratieve metadata.
|
|
- **Fail-closed gedrag.** Niet-geconfigureerde bronnen en modellen worden niet
|
|
stilzwijgend vervangen door fixtures of gesimuleerd succes.
|
|
- **Map-first productmodel.** Project, gebied, dataset, analyse en QA delen een
|
|
ruimtelijke context, wat veel sterker is dan een verzameling losse dashboards.
|
|
- **Operationele discipline.** De repository bevat releasegates, Unraid-assets,
|
|
migraties, herstelpaden, tests en expliciete scope-/beperkingsdocumentatie.
|
|
- **Bestaande demofundering.** Het idempotente demoworkflowcontract maakte een
|
|
gecontroleerde gastbeleving mogelijk zonder een tweede fictieve applicatie te
|
|
bouwen.
|
|
|
|
## Belangrijkste bevindingen
|
|
|
|
### P0 — Er ontbrak een toegankelijke productdemo
|
|
|
|
De oorspronkelijke ingang bood alleen een operatorlogin. Voor een recruiter,
|
|
stakeholder of eerste beoordelaar was daardoor niet zichtbaar wat het platform
|
|
kan zonder vooraf accounts of wachtwoorden uit te wisselen. Een onbegrensde
|
|
“login zonder wachtwoord” zou echter toegang tot operationele functies hebben
|
|
gegeven.
|
|
|
|
**Oplossing:** een config-gated `POST /api/v1/auth/guest`, een gesigneerde
|
|
gastrol met projectscope, server-side mutatieblokkering en een expliciete knop
|
|
**Als gast verkennen**. De demo wordt bij openen idempotent voorbereid.
|
|
|
|
### P1 — De landingspagina communiceerde de productwaarde onvoldoende snel
|
|
|
|
De informatie was aanwezig, maar de primaire actie, productbelofte,
|
|
betrouwbaarheidssignalen en demonstratiemogelijkheid concurreerden visueel met
|
|
elkaar. Op kleinere schermen voelde de ingang langer en minder doelgericht.
|
|
|
|
**Oplossing:** nieuwe hero- en loginhiërarchie, heldere keuze tussen operator en
|
|
gast, compactere capability-sectie, concreter vierstappenproces, betere mobiele
|
|
navigatie en begrijpelijke foutmeldingen in plaats van ruwe servicefouten.
|
|
|
|
### P1 — De workbench was voor een gast te breed en te technisch
|
|
|
|
De volledige operatornavigatie bevat projectbeheer, imports, AI-taken, exports
|
|
en geavanceerde analyses. Dat is gepast voor een beheerder, maar werkt tegen een
|
|
snelle demonstratie.
|
|
|
|
**Oplossing:** de gastrol ziet alleen **Kaart** en **Kwaliteit**, krijgt een
|
|
blijvende alleen-lezen contextbanner en ziet geen creatie-, import-, export-,
|
|
AI- of beheeracties. De backend blijft de autoritatieve grens.
|
|
|
|
### P1 — De visuele laag is historisch gegroeid
|
|
|
|
Vier opeenvolgende workbench-stijlbestanden bevatten samen 13.818 regels CSS:
|
|
`app.css`, `premium.css`, `atlas-workbench.css` en `atlas-premium-v2.css`. Over
|
|
de volledige actieve stijllaag zijn tientallen mediaqueries aanwezig. Dat
|
|
verhoogt de kans op cascadeconflicten, onverwachte responsive afwijkingen en
|
|
onnodig moeilijke toekomstige aanpassingen.
|
|
|
|
**Oplossing in deze pass:** een kleine, als laatste geladen
|
|
`professionalization.css` met gerichte correcties voor navigatierail, contextbalk,
|
|
werkruimtehoogte, gaststatus, truncation en responsive gedrag. De historische
|
|
lagen zijn bewust niet massaal herschreven zonder volledige visuele
|
|
regressiebaseline.
|
|
|
|
**Aanbevolen vervolgstap:** component voor component consolideren naar tokens,
|
|
layout primitives en één stylesheet per functioneel domein, telkens beschermd
|
|
door desktop-, ultrawide- en mobiele screenshots.
|
|
|
|
### P2 — Twee frontendcomponenten dragen te veel verantwoordelijkheid
|
|
|
|
`App.tsx` telt circa 1.400 regels en `MapWorkspace.tsx` circa 3.900 regels. Dat
|
|
is nog werkbaar, maar maakt layout-, permissie- en interactiewijzigingen
|
|
risicovoller dan nodig.
|
|
|
|
**Aanbevolen vervolgstap:** splits shell/navigatie, workspace-routing,
|
|
gastsessiecontext, kaartselectie, bronresolutie en analysepresentatie in
|
|
afzonderlijke domeincomponenten en hooks. Doe dit pas na de huidige
|
|
regressietests, zodat gedrag niet tegelijk met structuur wordt gewijzigd.
|
|
|
|
### P2 — Gastmodus is geen tenantisolatie
|
|
|
|
De sessie is cryptografisch gesigneerd, kort geldig, projectgebonden en
|
|
alleen-lezen. Toch blijft GeoIntel architecturaal een single-operatorproduct. De
|
|
gastrol is bedoeld voor een aparte demo-installatie, niet om operationele en
|
|
publieke gebruikers veilig in dezelfde datastore te mengen.
|
|
|
|
## Geleverde wijzigingen
|
|
|
|
| Domein | Professionalisering |
|
|
|---|---|
|
|
| Toegang | Nieuwe gastactie, wachtwoordzichtbaarheid, heldere operator/gastkeuze en bruikbare foutmeldingen |
|
|
| Sessies | Versie 2-sessietoken met expliciete `operator`/`guest`-rol, TTL en optionele projectscope |
|
|
| Backendgrens | Positieve read-allowlist, gastprojectfilter, cross-projectblokkering en mutatieblokkering met stabiele foutcodes |
|
|
| Demo | Canonieke demoworkflow wordt idempotent voorbereid bij gastlogin |
|
|
| Workbench | Gereduceerde gastnavigatie, alleen-lezen statusbanner en verborgen beheerfuncties |
|
|
| Kaart | Alleen-lezen variant zonder on-demand acquisitie of geavanceerde operatorcontrole |
|
|
| Layout | Rustigere desktop-shell, betere truncation, responsieve gaststatus en reduced-motion ondersteuning |
|
|
| Deployment | Gastvariabelen in Compose, Unraid-env, DockerMan-template en runtimevalidatie |
|
|
| Documentatie | API-contract, README, Unraid-instructies, beperkingen, TODO en uitvoeringslog bijgewerkt |
|
|
|
|
## Configuratie
|
|
|
|
Gasttoegang staat standaard ingeschakeld zodra de operator-login actief is.
|
|
Voor een afzonderlijke demo-installatie:
|
|
|
|
```env
|
|
GEOINTEL_AUTH_ENABLED=true
|
|
GEOINTEL_AUTH_USERNAME=operator
|
|
GEOINTEL_AUTH_PASSWORD_HASH=pbkdf2_sha256$...
|
|
GEOINTEL_AUTH_SESSION_SECRET=<minstens-32-willekeurige-tekens>
|
|
GEOINTEL_GUEST_ACCESS_ENABLED=true
|
|
GEOINTEL_GUEST_DISPLAY_NAME=Gast
|
|
GEOINTEL_GUEST_SESSION_TTL_SECONDS=7200
|
|
```
|
|
|
|
Zet `GEOINTEL_GUEST_ACCESS_ENABLED=false` om gasttoegang expliciet uit te schakelen.
|
|
Gebruik een afzonderlijke container, database en storage-root wanneer de demo
|
|
van buiten het vertrouwde LAN bereikbaar wordt. Plaats geen private, klant- of
|
|
operationele datasets in die omgeving.
|
|
|
|
## Validatie
|
|
|
|
De volgende controles zijn op 27 juli 2026 uitgevoerd:
|
|
|
|
| Controle | Resultaat |
|
|
|---|---|
|
|
| Gerichte backend auth-/gastbeveiligingstests | **Geslaagd — 6/6** |
|
|
| Python compile van `backend/app` en de nieuwe authtests | **Geslaagd** |
|
|
| Volledige frontend TypeScript-typecheck | **Geslaagd** |
|
|
| Gerichte frontend-interactiesmokes: gast/operator-login en beperkte bootstrap | **Geslaagd — 2/2** |
|
|
| CSS-syntax van de vernieuwde landing en professionaliseringslaag | **Geslaagd** |
|
|
| Compose YAML, Unraid XML en DockerMan-shellsyntax | **Geslaagd** |
|
|
| Whitespacecontrole op alle in deze pass gewijzigde bestanden | **Geslaagd** |
|
|
|
|
De gerichte backendtests draaiden met SQLite en een tijdelijke minimale
|
|
`geoalchemy2`-importstub buiten de repository, omdat de reviewcontainer de
|
|
PostGIS-runtimepackages niet bevatte. Daarmee zijn tokenvalidatie, cookies,
|
|
login/logout, gastscope, cross-projectblokkering en route-/mutatieblokkering
|
|
wel rechtstreeks getest; het is geen vervanging voor de bestaande volledige
|
|
PostgreSQL/PostGIS-integratiegate.
|
|
|
|
De nieuwe logincomponent en de beperkte workbench-bootstrap zijn aanvullend
|
|
rechtstreeks in JSDOM uitgevoerd via een tijdelijke TypeScript-loader buiten de
|
|
repository. Daarmee zijn de zichtbaarheid van gastacties, de `POST` naar de
|
|
gastendpoint, de operatorlogin en het uitschakelen van operator-only
|
|
bootstrapcalls interactief gecontroleerd.
|
|
|
|
De aangeleverde `node_modules` bevat alleen Windows-native Rollup- en
|
|
esbuildpakketten. Daardoor konden de normale Vitest-runner en de
|
|
Vite-productiebundel in deze Linux-reviewcontainer niet starten. Een schone
|
|
dependency-installatie was niet mogelijk doordat de beschikbare packageproxy
|
|
tijdens de controle 503-responses en time-outs gaf. De TypeScript-compiler voltooide wel zonder fouten. De
|
|
frontend-unit- en productiebuildgates moeten daarom na `npm ci` op Windows of
|
|
in de normale Linux CI-/Dockeromgeving nogmaals worden uitgevoerd.
|
|
|
|
## Aanbevolen roadmap
|
|
|
|
1. Leg visuele regressiesnapshots vast voor login, kaart, kwaliteit en alle
|
|
primaire workspaces op mobiel, desktop en ultrawide.
|
|
2. Consolideer de vier historische workbench-CSS-lagen incrementeel; verwijder
|
|
pas selectors nadat screenshots en interactietests gelijkwaardig zijn.
|
|
3. Splits `App.tsx` en `MapWorkspace.tsx` langs domeingrenzen, zonder API- of
|
|
analysegedrag te wijzigen.
|
|
4. Voeg een expliciete demo-reset/refreshstrategie en misbruiktelemetrie toe
|
|
wanneer de demo publiek wordt blootgesteld.
|
|
5. Bouw alleen bij echte multi-userbehoefte een afzonderlijk identiteits-,
|
|
autorisatie- en tenantmodel; breid gastmodus daar niet ad hoc voor uit.
|