KB Flooris Statamic - Statamic Update Procedures¶
Belangrijk
Tijdens deze update procedures kunnen er project-specifieke errors optreden. Deze verschillen per project en moeten per situatie worden opgelost. Gebruik debugging skills en documentatie om deze op te lossen.
Overzicht¶
Deze handleiding beschrijft het complete proces voor het updaten van Statamic/Laravel projecten binnen Flooris ("update
day"). Het proces bestaat uit drie fases — Discovery, Development en QA — en is gebaseerd op de uitgevoerde
update-runs voor:
- Ken Aerts Marketing en Communicatie (GB-1574)
- Trampolineingraven (TT-1523)
AI-first uitvoering
Fase 2 (Development) wordt AI-first uitgevoerd: een agent doorloopt de upgrade-stappen op een feature branch en stopt alleen bij expliciete stopmomenten — situaties die een mensbeslissing vereisen (bijv. een addon die niet bestaat in de doelversie). Fase 1 en Fase 3 zijn grotendeels mensenwerk.
Doel: de site na de update functioneel én SEO-technisch identiek laten werken, met bewijs daarvan in de ClickUp-taak.
Scope bepalen¶
Documenteer bij de start van de taak de eindsituatie in een scope-tabel:
| Onderdeel | Van | Naar |
|---|---|---|
| Statamic CMS | huidige versie | doelversie |
| Laravel | huidige versie | doelversie |
| PHP | vaststellen in Discovery | 8.x |
| NodeJS | huidig | laatste LTS |
| Frontend packages | huidig | laatste stabiele majors |
| Dependabot | open issues | 0 kritiek/hoog open |
Buiten scope: nieuwe features, redesign, contentwijzigingen.
Fase 1 — Discovery (max 2u)¶
Doel: voordat je begint weet je exact wat er in dit project zit en wat "goed" is na de update.
- Repo checken op openstaande/oude branches en PR's, rebasen of opruimen.
-
composer.json/package.jsoninventariseren: eerstepartij- en Statamic-addons — welke bestaan nog in de doelversie? Vul hiermee de scope-tabel aan (huidige PHP- en NodeJS-versie). - Forge- of Ploi-omgeving van dit project opzoeken en de link in de taak zetten.
- Docker-omgeving werkend krijgen conform Flooris standaard (PHP 8.4 container, database indien nodig), site draait lokaal.
- Integraties in kaart brengen (formulieren, mail, search, analytics, externe API's) en per stuk noteren hoe je het test.
- Cloudflare Turnstile controleren: staat de spamprotectie op de contactformulieren nog actief en zijn de site-/secret-keys nog geldig? Zie ook Veelgebruikte Addons.
- Nulmeting SEO: Screaming Frog crawl van productie draaien en exporteren (URL's, statuscodes, titles, meta descriptions, h1, canonicals, redirects). Export als bijlage aan de taak — dit bestand is het vergelijkingspunt voor elke stap in Fase 2 en Fase 3.
- Nulmeting Search Console: huidige indexeringsstatus, dekkingsfouten en Core Web Vitals noteren (screenshot of export).
- Sitemap en
robots.txtvan productie bewaren als referentie. - Uren en risico's bevestigen; bij afwijking > 25% eerst afstemmen met de projectverantwoordelijke.
Afgerond wanneer: nulmeting-exports als bijlage in de taak staan, PHP- en NodeJS-versie zijn ingevuld, en de scope-tabel is bevestigd of aangepast.
Fase 2 — Development (max 5u)¶
Uitvoering is AI-first. De agent doorloopt onderstaande stappen op een branch
feature/{task-id}-major-update-statamic-laravel en stopt bij elk gemarkeerd stopmoment om te rapporteren in de taak.
Shift AI skills
Laravel-upgrades draaien via de Shift AI skills. Shift dekt alleen Laravel — de Statamic-keten is eigen werk volgens de officiële upgrade guide.
Voorbereiding (mens, 15 min)¶
- Branch aanmaken vanaf
master/development. - Nulmeting-crawl uit Fase 1 lokaal beschikbaar als vergelijkingsbestand.
- Shift-plan/account geregeld.
-
/shift:analyze→/shift:run→/shift:reviewper major (bijv. 9 → 10 → 11 → 12). Eén Shift per commit, niet stapelen.
Stopmoment
Een Shift-issue dat review niet zelf oplost, of een package zonder compatibele versie — dit is een mensbeslissing.
- Per major de officiële upgrade guide toepassen: config, fieldsets, blueprints, tag-syntax, addon-API's.
- Na elke major lokaal
composer install+ build + Screaming Frog crawl tegen de nulmeting. Commit per major met de crawl-diff in de commit message. - Waar visuele regressie een risico is (grote frontend-dependency bumps, Statamic-addon met eigen views, Tailwind/CSS-major): een Playwright visual-compare draaien tussen productie en de lokale branch (zie Visuele regressiecontrole (Playwright) hieronder). De Screaming Frog-crawl vangt structuur/SEO, niet lay-out- of stylingbreuk — dit dekt dat gat.
Stopmoment
Een addon die niet bestaat in de doelversie. Vervangen, zelf bouwen of schrappen is een beslissing van de developer in overleg met de klant.
- Docker container en platform-eisen in
composer.json/package.jsonbijwerken naar PHP 8.4 en de doel-NodeJS-LTS. - Frontend packages naar laatste stabiele majors, build groen.
- Crawl opnieuw draaien — dit is de stap waar assets en glide-varianten vaak sneuvelen.
- Openstaande issues doorlopen en oplossen.
- Wat niet oplosbaar is: reden documenteren in de taak, niet stilzwijgend laten staan.
- Code styling (bijv.
/shift:refactor) over het hele project, in een aparte commit zodat de upgrade-diff schoon blijft. -
README.md,Features.mdenCHANGELOG.mdbijwerken volgens Flooris guidelines.
- Serveromgeving (Forge/Ploi): PHP-versie, cron, queue workers en deploy script controleren.
- Deployen naar test.
- PR-omschrijving afmaken: wat is gewijzigd t.o.v. productie en hoe te testen.
Afgerond wanneer: de site draait op test, de crawl-diff op test toont geen onverklaarde afwijkingen, en elk stopmoment waar de agent is gestopt heeft een expliciete beslissing in een comment.
Fase 3 — QA (max 6u)¶
QA gebeurt in twee ronden: lokaal door de developer, daarna op test door een tweede persoon. Bevindingen altijd als comment in de taak.
Dit ziet de crawl niet:
- Alle templates/pagetypes doorlopen: home, overzichten, detailpagina's, 404.
- Statamic CP: inloggen, content bewerken, publiceren, assets uploaden en uitsnijden.
- Formulieren daadwerkelijk versturen, inclusief mailafhandeling en spamprotectie (Cloudflare Turnstile: verschijnt de widget en blokkeert een test-bot-submission de verzending?).
- Afbeeldingen/glide-cache: alle varianten renderen correct.
- Externe integraties uit Discovery één voor één afvinken.
Dit is de kern bij een Statamic-update:
- Screaming Frog crawl op test met dezelfde instellingen als de nulmeting.
- Crawl vergelijken met de nulmeting: geen nieuwe 4xx/5xx, geen verdwenen URL's, titles/meta/h1/canonicals ongewijzigd.
- Sitemap.xml en robots.txt vergelijken met productie.
- Redirects steekproefsgewijs testen (minimaal 10 uit de oude crawl).
- Playwright visual-compare tegen productie draaien op test (zie Visuele regressiecontrole (Playwright)) en de side-by-side/diff-afbeeldingen als bijlage in de taak zetten.
- Onverklaarbare verschillen oplossen of expliciet accorderen in een comment.
- Screaming Frog crawl op productie binnen 24 uur na release, vergelijken met nulmeting.
- Search Console controleren op dag 1, dag 7 en dag 14: indexeringsfouten, dekkingsproblemen, Core Web Vitals.
- Monitoring en logs controleren op nieuwe errors.
Afgerond wanneer: de crawlvergelijking geen onverklaarde afwijkingen bevat en Search Console 14 dagen na livegang geen nieuwe fouten toont.
Visuele regressiecontrole (Playwright)¶
Screaming Frog dekt structuur en SEO-metadata, maar ziet geen lay-out- of stylingbreuk (bijv. een Tailwind-major die
class-namen wijzigt, of een addon die zijn eigen CSS anders uitlevert). Gebruik hiervoor een losse Playwright-suite die
dezelfde pagina's op productie en op de lokale/test-omgeving vergelijkt via full-page screenshots, pixel-diff en een
side-by-side-composite. Deze aanpak is voor het eerst toegepast in het TwinPharma-project
(tests/visual-compare/) en is herbruikbaar op andere Statamic-projecten.
Opzet¶
- Locatie: eigen map, bijv.
tests/visual-compare/, los van eventuele functionele Playwright/E2E-tests. - Vereisten: Node ≥ 20, de lokale/test-omgeving bereikbaar over HTTPS,
APP_KEYgezet, en — als statische pagecache aanstaat (STATAMIC_STATIC_CACHING_STRATEGY=full) — de cache geleegd vóórdat je vergelijkt, anders vergelijk je stale gecachte HTML. - Installatie (eenmalig):
yarn install npx playwright install --with-deps chromium - Configuratie:
playwright.config.tsmetfullyParallel: false,workers: 1(voorkomt race conditions tussen screenshots) en een vaste viewport (bijv. 1440×900 desktop). - Routeset: een representatieve steekproef van pagetypes × locales (home, een productdetail, een contentpagina, in
elke taal die het project ondersteunt) — geen volledige crawl. Basis-URL's van productie en lokaal/test zijn
overschrijfbaar via env vars (
PROD_BASE_URL,LOCAL_BASE_URL). - Per route: navigeer naar dezelfde route op beide omgevingen, maak een full-page screenshot, bouw met
pixelmatcheen diff-afbeelding en een side-by-side-compositie (prod | lokaal | diff), en log het percentage afwijkende pixels.
Ken de valkuilen
networkidle+ vaste wait-timer is flaky. Trage prod-CDN's of lazy-loaded content geven anders valse diffs. Wacht liever op een concrete DOM-marker.- Dynamische content vervuilt de diff. Datums, "laatst bijgewerkt"-teksten, cookie-consent-banners of
willekeurig getoonde gerelateerde content geven ruis zonder echte regressie. Mask deze elementen (Playwright's
mask-optie oppage.screenshot()) of sluit de cookiebanner expliciet vóór de screenshot. - Zonder een drempelwaarde faalt de test nooit. Laat het diff-percentage niet alleen loggen — vergelijk het
met een geconfigureerde
MAX_DIFF_RATIOen laat de test falen als die overschreden wordt, anders is dit een rapportagemiddel en geen kwaliteitspoort. - Productie is een referentiepunt, geen baseline. Bewuste contentwijzigingen tussen nulmeting en update-dag leveren een "verschil" op dat geen regressie is — beoordeel elke afwijking, verklaar 'm in een comment, en neem 'm niet blind als fail.
Resultaten¶
Bewaar per route minimaal de prod-, lokaal- en diff-afbeelding plus de side-by-side-compositie (bijv. onder
playwright-report/compare-output/, niet gecommit). Koppel de side-by-side- en diff-afbeeldingen als attachment aan
elke Playwright-test zodat ze in het HTML-testrapport zichtbaar zijn, en zet de belangrijkste afbeeldingen als
bijlage in de ClickUp-taak — dit is het visuele bewijsstuk naast de Screaming Frog-crawl-diff.
Wanneer inzetten¶
- Altijd: in Fase 3 (QA/SEO/techniek) op test, als aanvulling op de crawl-vergelijking, vóór livegang.
- Aanbevolen: in Fase 2, na een major met verhoogd stylingrisico (Tailwind/CSS-major, addon met eigen views, grote frontend-dependency bump) — niet per se na elke major, om doorlooptijd te sparen.
Klantcommunicatie¶
- Vooraf: mail naar de klant met domein, welke stack geüpdatet wordt, aantal uren, planning en vraag om akkoord. Afsluiten met een interne taakreferentie.
- Controleren of dit onder een SLA/overeenkomst valt; zo ja uren verrekenen, zo nee volledige uren rekenen.
- Statamic-licentie controleren en indien nodig laten bijwerken voor de doelversie.
- Na livegang: mail met wat er is bijgewerkt en het verzoek afwijkingen te melden.
- Alle communicatie terugkoppelen in de taak.
Definition of Done¶
- Alle drie de fases zijn afgevinkt en de bijbehorende bewijsstukken (crawl-exports, Playwright-screenshots) staan in de taak.
- Changes zijn gecommuniceerd via een comment: wat is er gewijzigd t.o.v. productie en hoe is er getest.
- Een tweede persoon heeft QA uitgevoerd op test en bevindingen vermeld in de taak.
- Pre- en post-release stappen staan in de PR en zijn afgevinkt.
- De klant heeft akkoord gegeven vóór livegang en is na livegang geïnformeerd.
- Uren zijn geschreven op de taak en de status is bijgewerkt.
Troubleshooting¶
FontAwesome authentication errors
Probleem: yarn install faalt met authenticatie errors.
**Oplossing:** Kopieer de `FONTAWESOME_NPM_AUTH_TOKEN` uit een ander project naar je `.env`.
Docker container start niet
Probleem: Docker compose geeft errors bij opstarten.
**Oplossing:**
```bash
docker compose down
docker system prune -a
docker compose up -d --build
```
Composer install faalt
Probleem: Dependencies kunnen niet geïnstalleerd worden.
**Oplossing:**
```bash
composer clear-cache
composer install --ignore-platform-reqs
```
Laravel- en Statamic-upgrade laten zich niet los committen
Probleem: Shift bumpt statamic/cms zelf al mee om compatibel te zijn met de nieuwe Laravel-major.
**Oplossing:** Dit is acceptabel — meld het expliciet in de taak en handel beide in één commit af in plaats van kunstmatig te splitsen.
Best Practices¶
Tips voor succesvolle updates
- Commit vaak: kleine, logische commits per component/major.
- Test tussentijds: crawl na elke major tegen de nulmeting, niet pas aan het einde.
- Documenteer stopmomenten: elke afwijking of beslissing als comment in de taak, niet stilzwijgend oplossen.
- Gebruik Git branches: werk nooit direct op
master/development. - Review code: check alle automatische wijzigingen van Shift.
- Backup: maak een backup voordat je major updates uitvoert.