← vigil: het hart van onze ontwikkeling

vigil

Onderhoud van een heel portfolio

Hier begon vigil: beveiligingslekken, PHP-, Symfony- en Node-versies waarvan de ondersteuning afloopt, en verouderde dependencies over alle projecten die we beheren. Het resultaat is één werklijst, geen stapel rapporten.

Hoe vigil daarnaast het geheugen en de poortwachter van de hele ontwikkeling is, leest u op de hoofdpagina over vigil.

Waarom het bestaat

Renovate en Dependabot kijken per repository, en daar zijn ze goed in. Wie tientallen klantsites beheert heeft een andere vraag: welke sites vragen aandacht, welke kunnen wachten, en waar loopt er iets af? Dat antwoord stond vroeger in een spreadsheet die altijd achterliep.

Beveiligingslekken

Uit dezelfde bronnen als composer audit en npm audit, over de volledige boom: de meeste lekken zitten niet in wat u zelf vroeg, maar in wat daaronder meekwam. Eén regel per package, niet per CVE, met de versie waarin het opgelost is.

Einde ondersteuning

Voor PHP, Symfony en Node. Dit is de enige bevinding met een datum in plaats van een versienummer, en dus de enige die vanzelf dringender wordt: eerst "alleen nog beveiligingsfixes", dan "minder dan een half jaar", dan kritiek.

Nu bij te werken

De nieuwste versie past binnen de constraint die er al staat. Eén composer update verder, vandaag te doen.

Te plannen

Er is een nieuwe major die de constraint bewust buitensluit. Dat is een beslissing, geen taak. Families worden samengevouwen: dertig regels symfony/x 6.4 → 7.4 zijn één afweging.

Hoe een scan verloopt

Elke maandagochtend, als deel van het ochtendrapport, en opnieuw na een gemergde update of wanneer een agent erom vraagt. vigil leest alleen de manifesten en komt nooit aan de code.
  1. Manifesten ophalen composer.lock, package.json en de lockfiles, rechtstreeks via de API van GitLab.
  2. Vergelijken Met Packagist en de npm-registry voor de nieuwste versies, met de advisory-databanken voor lekken, en met endoflife.date voor de runtimes.
  3. Bevindingen Gerangschikt naar wat ze van u vragen, niet naar hoe groot het versieverschil is.
  4. Werklijst Samen met uw eerdere besluiten: wat al uitgesteld of bewust aanvaard is, telt niet meer als openstaand werk.

Niets clonen, niets installeren

Dat is geen optimalisatie maar een grens. composer install en pnpm install voeren scripts van derden uit. Dat geregeld en zonder toezicht over tientallen repositories laten draaien is precies het supply-chain-scenario dat u wil vermijden.

De prijs is dat vigil versie-constraints benadert in plaats van ze op te lossen. Die benadering zit op één plek en is getest. Wat ze niet begrijpt, meldt ze als zodanig in plaats van het stil te laten passeren.

Wat er naar buiten gaat

Aan de registries vraagt vigil alleen naar pakketnamen: welke packages er bestaan en wat hun nieuwste versie is. Niet welk project ze gebruikt, en nooit code. De antwoorden worden enkele uren bewaard, zodat een scan van het hele portfolio niet honderden keren hetzelfde vraagt.

Een werklijst, geen rapport

Een rapport toont elke keer hetzelfde, en na een maand klikt u het weg. Een werklijst toont wat er nog van u verwacht wordt. Elke bevinding heeft daarom een staat. Per project vinkt u bevindingen aan en stelt u ze in één keer uit of aanvaardt u ze; met shift selecteert u een hele reeks.
De lijst Projecten in vigil: vier tegels (lekken, einde support, nu bij te werken, te plannen) en een tabel met per project de staat van security en onderhoud, het laatste reviewoordeel en wanneer het project laatst bekeken werd.
Het portfolio in één lijst: per project wat open staat, wat bij te werken is en wat de laatste review zei. Een demo met verzonnen gegevens.

Open

Werk dat op u wacht. Zolang u niets beslist, is het open.

Uitgesteld

"Ik weet het, maar niet deze maand." Komt vanzelf terug op de datum die u koos.

Bewust aanvaard

Bijvoorbeeld op een LTS blijven. Geldt voor één concreet verschil: verschijnt er een nieuwere major, dan hoort u het opnieuw.

Einde ondersteuning kan u niet aanvaarden, alleen uitstellen, en nooit tot voorbij de dag waarop de beveiligingsfixes stoppen. Die grens wordt afgedwongen, niet gehoopt.

Security in één oogopslag

Lekken en aflopende ondersteuning per project, samen met de controles die in CI draaien: secrets-detectie, statische analyse en de audits van elke merge request.
Het scherm Security in vigil: drie tegels bovenaan (lekken, einde support, uitgesteld of aanvaard), daaronder per project de beveiligingslekken en aflopende ondersteuning met de huidige en de nieuwe versie, en de controles uit CI.
Security per project: lekken en aflopende ondersteuning uit de scans, en daaronder de controles uit CI. Een demo met verzonnen gegevens.

Uit de scans

Lekken in de volledige dependency-boom en runtimes waarvan de ondersteuning afloopt, per project gegroepeerd. Elke regel zegt naar welke versie u moet, en in welk bestand dat staat.

Uit CI

vigil haalt de resultaten van die controles en van de poort zelf op bij GitLab, elk kwartier, alleen voor merge requests die bewogen. Faalt of waarschuwt er iets, dan staat de reden erbij, uit de log van de job, en komt het bovenaan het overzicht.

Het team aan het werk

vigil weet wat er moet gebeuren; het agentteam doet het. Ze praten in twee richtingen met elkaar.
De tijdlijn van een run in vigil, de flow nakijken: de review is klaar, de beslisstap is gedaan, de stap fixen is mislukt met de melding dat de tests faalden na de fix en knoppen om opnieuw te proberen of te stoppen, en de controle staat nog gepland. Per stap staan de duur en de kosten.
Een run met haar stappen: wat klaar is, wat misliep en wat nog volgt, met duur en kosten per stap. Een demo met verzonnen gegevens.

Flows als run

Eén knop op een project: "Start flow". Bijwerken maakt het updateplan en start een pipeline, waarin een agent de dependencies bijwerkt op een eigen branch en de tests draait. Nakijken kijkt een branch na die al gebouwd is: de reviewers kijken, u beslist in vigil over de bevindingen, het team fixt wat u "nu" noemt, en een controle sluit af. Elke flow loopt als run, met een tijdlijn en een plafond op de kosten.

vigil publiceert, een mens merget

Wat de agent achterlaat, behandelt vigil als onbetrouwbare invoer: alleen manifesten en lockfiles, alleen bronnen van bekende hosts. Klopt dat, dan publiceert vigil de update als bot. Mergen doet een mens.

Opvolging

Daarna blijft vigil de merge request volgen: klaar om te mergen, een conflict, of de pipeline die nog loopt. Is ze gemerged, dan scant vigil het project opnieuw. Per run staan de duur en de kosten erbij, en als iets misliep het foutlog.

Het scherm Team

Per project het laatste reviewoordeel, de recente reviews en bevindingen, en de runs met hun kosten. Zo ziet u ook welke projecten nog nooit een review kregen.

In de editor

vigil is ook een MCP-server. Een agent in Claude Code vraagt vanuit de projectmap wat er híer te doen valt, welke opdracht er loopt, welke eerdere reviews er zijn, of laat het project opnieuw scannen, voor hij aan het werk gaat. In Wisp stelt u vigil in als MCP-server.

Naar Toolbox

De stand van het portfolio en van de runners staat als statuskaart in Toolbox, en de projecten die vigil volgt, gaan mee naar de ideeën-inbox. Zo deelt een idee zich in bij een project dat echt bestaat.

Machinerie

Het team draait op eigen runners en machines, en ook die houdt vigil in het oog.

Runners

Elk kwartier kijkt vigil of de runners online zijn, en sinds wanneer er één wegviel. Een runner die stilvalt, staat bovenaan het overzicht en op de statuskaart.

Machines

Processor, geheugen, grafische kaart en schijven, met het verloop over een etmaal, de zwaarste processen en de lokale modellen die er draaien.

Geplande taken

Welke taken er op vaste tijden lopen, zoals het ochtendrapport en de controles van elk kwartier, en wanneer ze aan de beurt zijn.

Hoe het is opgebouwd

Een Symfony-applicatie met MySQL, in Docker, met een interface in Symfony UX. Een handvol keuzes verklaart het meeste van het gedrag.

Het draait intern, met opzet

Wat vigil bijhoudt, is welke live sites op welke versies draaien, en dus welke bekend kwetsbaar zijn. Dat is geen configuratie maar een aanvalskaart van het hele portfolio. Daarom staat vigil niet op het internet maar op een eigen machine in ons privénetwerk, en ook daar is inloggen verplicht: netwerkbeveiliging is geen authenticatie. Om dezelfde reden tonen we hier de werking, en niet de details van onze opstelling.

Eén rapportlaag voor alles

Het dashboard, het ochtendrapport op werkdagen, de statuskaart in Toolbox en de MCP-server bouwen hun uitkomst met dezelfde code. Berekenden ze elk hun eigen cijfers, dan was de mail de eerste die u niet meer vertrouwt.

Een interface die meegaat

Blokken die zichzelf bijwerken, beslissen in een lade naast de lijst, filters die in de link blijven staan en een werkcontext die alle schermen op één project zet. Met dezelfde thema's als Wisp, licht en donker, en bruikbaar op een iPad.

Geheimen versleuteld, niet in een configbestand

Toegangstokens staan versleuteld in de database. API-tokens voor de editor en de agents worden alleen als hash bewaard: u ziet de waarde één keer, en kwijt is kwijt.

Klaar voor meer dan één organisatie

Elke rij hangt aan een organisatie en elke zoekopdracht vraagt er één, terwijl er vandaag precies één bestaat. Achteraf multi-tenancy inbouwen betekent elke query nalopen, en één vergeten filter is de ergste bug die dit soort software kent.

Tests waar het telt

De gevoelige logica is gedekt door tests: versies vergelijken, constraints lezen, de vervalregels van besluiten, en wanneer een review een inhoud nog dekt. Elke fout daarin schuift een bevinding naar de verkeerde lijst, of laat iets door dat dicht hoorde te blijven.