Versie 1.0.92
Wat is er nieuw
Elke wijziging aan Hero Assessments krijgt een eigen versienummer. Het nummer staat onderaan elke pagina; hieronder staat per versie wat er is veranderd.
Medewerkers en beheerders kunnen na het inloggen op deze pagina een wens of bug melden.
Versiegeschiedenis
Versie 1.0.92
Op een laptopscherm past de pagina van een deelnemer weer in het venster, en de tijdlijn en Recente activiteit tonen het advies bij een geweigerd adres voluit
Details
Wie de pagina van een deelnemer opende op een laptop van 1280 breed, moest naar rechts schuiven, zag de knop Genereer concept buiten de kaart staan en las testnamen half onder een label (ticket 48061). In de kaarten AI-samenvatting en Deellinks staan de keuzelijsten, het veld Voor wie en de knoppen Genereer concept en Maak deellink nu onder elkaar zodra de kaart smal is, zoals in de rechterkolom van de pagina; in een brede kaart staan ze naast elkaar, zoals voorheen. Zo blijft alles binnen de kaart en in beeld. In de kaart Tests staan de labels, zoals Niet gestart en Afgerond, onder de naam van de test in plaats van ernaast, en op een laptopscherm staan er drie testkaartjes op een rij in plaats van vijf; vijf naast elkaar pas op een breder scherm. In de tijdlijn van de deelnemer en in Recente activiteit op het dashboard loopt een lange regel door op de volgende regel in plaats van af te breken met puntjes, zodat het advies bij een adres dat mail weigert (controleer het e-mailadres en nodig opnieuw uit) voluit te lezen is. Op een telefoon stonden de velden al onder elkaar; daar staan nu ook de labels onder de naam van de test en lopen lange regels in de tijdlijn door.
Versie 1.0.91
Weigert een adres mail definitief, dan vraagt de tijdlijn van de deelnemer het adres te controleren en gaan er geen automatische herinneringen meer naar die deelnemer; E-mail bezorgd staat niet meer in Recente activiteit, wel in de tijdlijn en in het Auditlog met het filter E-mail
Details
Drie standaarden voor wat beheer ziet van de bezorging van mail (ticket 43575).
Weigert de ontvangende server een mail aan de kandidaat definitief, of verstuurt SendGrid zo'n mail niet omdat het adres eerder weigerde, ongeldig is, zich afmeldde of spam meldde, dan staat in de tijdlijn van de deelnemer bij E-mail mislukt: Het adres bestaat niet of weigert mail; controleer het e-mailadres en nodig opnieuw uit. In het Auditlog staat dat advies achter de reden van de weigering. Gaat het om een mail aan iemand anders dan de kandidaat, zoals het bericht aan de uitnodiger, dan staat er: Het adres van de ontvanger weigert mail; deze mail was voor iemand anders dan de deelnemer, dus de uitnodiging en de herinneringen veranderen niet. Bij een tijdelijke weigering, zoals een server die de mail voorlopig blokkeert, en bij een storing bij het versturen blijft de zin met probeer het later opnieuw.
Na zo'n definitieve weigering of na een spammelding van een mail aan de kandidaat stuurt de app geen automatische herinnering meer naar die deelnemer, ook niet voor een andere openstaande uitnodiging, en ook niet als een latere mail wel aankomt. De uitnodiging blijft staan en de weigering of de spammelding staat in de tijdlijn; bij een spammelding staat erbij dat er geen automatische herinneringen meer gaan. Een tijdelijke weigering stopt de herinneringen niet.
E-mail bezorgd staat niet meer in Recente activiteit op het dashboard en niet in de standaardweergave van het Auditlog, zodat de andere acties daar in beeld blijven. In de tijdlijn van de deelnemer en in het Auditlog met het filter E-mail staat zij er nog.
Versie 1.0.90
Achter de schermen: de instelling van het AI-model blijft bewaard bij een wijziging van de instellingen van de server; voor gebruikers verandert er niets.
Details
De keuze van het AI-model voor de samenvatting en het model waarop de app terugvalt, staan nu ook in het bestand met de instellingen van de server. Zo kan een latere wijziging van die instellingen ze niet per ongeluk weghalen. De app en de samenvatting werken zoals voorheen.
Versie 1.0.89
Achter de schermen: een proef van de app tegen de testdatabase schrijft mail naar een bestand in plaats van hem te versturen; voor gebruikers verandert er niets.
Details
Bij de controle van een nieuwe versie, op een proef van de app met testgegevens, slaat de app een mail niet meer over, maar bewaart zij elk bericht als bestand, zodat ook de inhoud van een mail, zoals het bericht aan de uitnodiger, vóór de release te controleren is. Dat geldt alleen in zo'n proef op een eigen machine; de echte app verstuurt mail zoals altijd. Daarnaast gebruikt de AI-samenvatting zonder eigen instelling van het model voortaan Claude Fable 5.2, met Claude Opus 5.5 als terugval.
Versie 1.0.88
Op telefoonmaat blijven de status en het selectievakje van een uitnodiging heel, en op bureaublad breken gewone namen en adressen niet meer af
Details
Herstel na de merge-lezing van pull request 149 (ticket 46977). In de kaart op telefoonmaat breken nu alleen naam en adres, de tests en de functietitel af waar een waarde niet op de regel past; de status breekt niet meer midden in het woord en het selectievakje krimpt niet meer, want beide krimpen nooit (shrink-0, de status ook whitespace-nowrap). In de tabel op bureaublad staan naam en adres en de functietitel in een binnenste blok met een grootste breedte (max-w-xs en max-w-56, met break-words), zodat alleen een woord dat langer is dan dat blok afbreekt en gewone namen en adressen heel blijven, ook in een krappe tabel. Het blok met naam en adres heeft in de kaart en in de tabel een eigen testhaak. Met twee tests in src/app/(admin)/admin/invites/invites-table.test.tsx, rood op main en op de vorige kop.
Versie 1.0.87
Op telefoonmaat blijft de lijst Uitnodigingen binnen het scherm, ook bij een lang mailadres of een lange functietitel
Details
Op telefoonmaat werd de kaartenlijst van Uitnodigingen breder dan het scherm zodra een kaart een lange waarde zonder spatie droeg, zoals een lang mailadres (ticket 46977; gezien in de meting van de verificatieskill 1.31 met de testdatabase: 418 in plaats van 412 beeldpunten). De kaart laat nu elke lange waarde afbreken waar het nodig is (wrap-anywhere), en het vak met het selectievakje en de naam en het vak met naam en adres mogen krimpen (min-w-0). In de tabel op desktop breken de cel met naam en adres en de cel met de functietitel op dezelfde manier af. Met een test in src/app/(admin)/admin/invites/invites-table.test.tsx, rood op main.
Versie 1.0.86
Op Analyse blijft het label 300 volwaardig onder de balk van Normgroep bouwen binnen zijn kaart
Details
Het label van de marker op 100 procent stond half buiten de balk en liep over de rechterrand van de kaart (ticket 37940). Het streepje van een marker staat nu midden op zijn positie en het label schuift met de positie mee: bij 0 procent begint het bij het streepje, bij 100 procent eindigt het erbij, ertussen naar verhouding. Alleen de balk op Analyse heeft markers; de balken op Mijn tests, het overzicht van de kandidaat en Deelnemers veranderen niet. Met vier tests in src/components/ui/progress.test.tsx, waarvan drie rood op main.
Versie 1.0.85
De bezorgstatus meldt een foute handtekening over alle servers samen hooguit één keer per kalenderuur, en een verstuurde mail krijgt in de tijdlijn en de bezorging één verzendmoment
Details
Twee punten uit de hulplezingen van pull request 99 (ticket 34457, punt 2 en 3); geen migratie, geen scherm verandert.
De melding aan de agent over een handtekening die niet klopt bij de webhook van SendGrid ging hooguit één keer per uur per proces, met een nieuw kenmerk per melding, dus met meer dan één replica van de dienst meldde elke replica apart. De melding draagt nu een ontdubbelsleutel per kalenderuur (sendgrid-webhook-geweigerd:<jjjj-mm-ddThh>, UTC) en noemt het venster; de meldroute van AgentMail ontdubbelt op dat id, zodat alle replica's samen hooguit één melding per kalenderuur (UTC) geven zolang de eerste melding in de map van de agent staat (een afgehandelde melding telt mee, een verwijderde niet); rond een uurgrens kunnen twee replica's elk nog één melding geven. De lokale demping per proces blijft als eerste poort. De melder kent daarvoor het veld ontdubbeling op een storingsmelding: het id wordt storing:<sleutel> in plaats van storing:<kenmerk>; het geheugen van het proces blijft op het kenmerk werken.
De verzending van een mail krijgt één moment, dat vlak vóór de aanroep van de provider: de regel in email_log draagt het als created_at en de auditregel email.send als createdAt. Eerder zette de database allebei op het moment van schrijven, na het antwoord van SendGrid en na elkaar, zodat bij een trage provider of database een bezorging uit dezelfde seconde in de tijdlijn vóór "E-mail verstuurd" kon staan. Nu hangen de tijdlijn en de ondergrens van de bezorging (nooit vóór die regel plus één seconde, SendGrid stempelt in hele seconden) aan de verzending zelf. Een mislukte of overgeslagen verzending krijgt hetzelfde moment van de poging; de tests zetten de klok vast via options.nu van sendEmail.
Tests eerst: vijf nieuwe tests en één aangescherpte waren rood op de basis en zijn groen met de code (email-custom-args.test.ts, sendgrid-webhook.test.ts, agentmelding.test.ts). De feature map noemt de drie functies die het raakt.
Versie 1.0.84
De test van de startscripts bewijst ook dat het stopscript de luisteraar zelf stopt, faalt duidelijker als de luisteraar al weg is en leest de marker nooit half
Details
Ticket 34514, pull request 108: vier kleine punten uit de hulplezingen van 1.0.83 (ticket 34351, pull request 107), alleen testcode. In de test van de start- en stopscripts van de verificatie gaat het startproces eerst hard weg, zodat alleen de stop van de luisteraar zelf telt (het startproces gaf het stopsignaal anders al door en geen toets beschermde die stop); geeft de test het sein terwijl de luisteraar al weg is, dan zeggen de toetsen op de uitkomst wat er misging in plaats van een foutcode; de proefluisteraar schrijft zijn marker via een tijdelijke naam en een rename, zodat de test hem nooit half leest. De telling van de slaapbeurten blijft bewust aan de twee sleeps van stop-lokaal.sh hangen (een wijziging aan dat script valt onder de skilltoets); het commentaar in de test benoemt het. In het scherm verandert niets.
Versie 1.0.83
De test van de startscripts wacht op een sein in plaats van op de klok en vraagt de pagina met een tijdgrens, en de sessietest bootst de databasefout na zoals gemeten
Details
Ticket 34351, pull request 107: drie punten uit de hulplezingen van 1.0.82 (ticket 34209, pull request 106). In de test van de start- en stopscripts van de verificatie sluit de luisteraar die het stopsignaal volgt nu op een sein van de test, terwijl het script op hem wacht, in plaats van twee seconden later; elke vraag aan de proefluisteraar heeft een tijdgrens, zodat een luisteraar die hangt de test niet laat wachten; een nieuwe test bewijst die grens met een luisteraar die verbindt maar niet antwoordt. De test van de sessie bootst een databasefout zonder rij na met dezelfde gemeten fout als de nagebootste database (een helper in fake-db.ts, die FakeQuery ook gebruikt). In het scherm verandert niets.
Versie 1.0.82
De tests bootsen de database preciezer na bij het enkelvoud, en de test van de startscripts hangt minder van tijd af
Details
Ticket 34209, pull request 106: twee punten van de eerste hulplezing van 1.0.81. De nagebootste database van de tests geeft bij single met nul rijen of meer dan één nu dezelfde fout als de echte database (de code PGRST116, de tekst van de server en het aantal rijen) en voert een schrijfactie dan niet uit, zoals de echte database haar terugdraait; met maybeSingle blijft een schrijfactie met select staan, zoals de echte client die fout pas achteraf maakt. De test van de start- en stopscripts van de verificatie laat de koppige luisteraar het stopsignaal negeren in plaats van er acht seconden over te doen, zodat het deel dat op een luisteraar wacht die niet afsluit, niet meer van seconden afhangt. In het scherm verandert niets.
Versie 1.0.81
Bij een storing tijdens Verlengen zegt het kenmerk in het logboek nu welke stap misging, en de tests bootsen de database preciezer na
Details
Ticket 34103, pull request 105: de laatste punten van de vier hulplezingen van 1.0.80. Verlengen leest de deelnemer op drie momenten (vóór het verlengen, opnieuw na een update zonder rij, en terug na een tweede verlenging die niets veranderde) en meldde elke leesfout met dezelfde stap; nu heten de twee latere lezingen opnieuw-lezen en teruglezen, en de tweede verlenging na een inkorting tweede-termijn, zodat het team een kenmerk sneller plaatst. De nagebootste database van de tests geeft bij een schrijfactie zonder select geen rij meer terug, ook niet met single of maybeSingle, zoals de echte database, en telt voor de standaardrelatie elke tabel die de fixture of de test gaf, niet de lege lijst die een query aanmaakte; daardoor vangen de tests een fout die tot nu toe kon overleven. De functiekaart zegt bij een leesfout in de teruglezing dat opnieuw Verlengen de termijn laat staan of alleen optilt. In het scherm verandert niets.
Versie 1.0.80
Verlengen zet de bewaartermijn alleen omhoog en weigert een medewerker en een geanonimiseerde deelnemer, de deellinks volgen na een afronding de termijn zoals zij dan staat, en een nieuwe deellink houdt een kortere einddatum die intussen gezet is
Details
Drukte het beheer op Verlengen terwijl een nieuwe uitnodiging of een afronding de bewaartermijn net had verhoogd, dan schreef de knop de eerder gelezen, lagere termijn terug en ging die verhoging verloren. Vanaf nu zet Verlengen de termijn alleen omhoog, in één stap met de reden en het moment; stond zij intussen al later, dan blijft zij staan, zegt het paneel dat en noemt de auditregel de termijn zoals zij staat. De knop weigert nu ook op de server een medewerker (die heeft geen bewaartermijn) en een geanonimiseerde deelnemer, met een eigen zin; het paneel toonde de knop daar al niet. Na een afronding gaan de deellinks van de kandidaat mee tot de ingekorte termijn, maar nu pas na een laatste blik op de termijn: verlengde het beheer haar intussen met de hand, dan blijven de deellinks staan, en ging zij intussen omhoog door een nieuwe uitnodiging, dan gaan zij tot die hogere termijn. Een deellink die wordt gemaakt terwijl de termijn twee keer achter elkaar wordt ingekort, houdt het kortste einde en het paneel noemt dat einde. Kan de app na een inkorting niet nakijken of intussen een uitnodiging open ging, dan krijgt de agent van de app daar nu een melding met een kenmerk van, net als bij een mislukte terugzetting van de termijn (ticket 34012).
Versie 1.0.79
Verlengen maakt de bewaartermijn nooit korter, de lijst met deellinks toont het echte einde, en een link die tijdens een afronding ontstaat of vernieuwd wordt valt nooit buiten de termijn
Details
De knop Verlengen onder Deelnemer zette de bewaartermijn op vandaag plus de ingestelde dagen, ook als de termijn al later lag: dan werd zij korter, tegen de zin op het paneel in. Vanaf nu blijft een termijn die al later ligt staan en legt de knop alleen de reden vast; het scherm zegt dat. De lijst met deellinks toont per link het moment waarop zij echt ophoudt: haar einddatum of, als die eerder valt, het einde van de bewaartermijn van de deelnemer; en na dat einde opent de deellink het rapport ook niet meer, ook niet in de uren voordat de nachtelijke opruiming de deellinks wist. Een deellink die wordt gemaakt terwijl de afronding van de kandidaat de termijn inkort, wordt alsnog op de termijn begrensd; wordt de link van een afgeronde uitnodiging tijdens die inkorting vernieuwd, dan loopt de termijn tot die link; en gaat een nieuwe uitnodiging tijdens de inkorting open, dan blijven de deellinks staan. Een termijn die beheer met de hand verlengde, wordt nooit ingekort, maar gaat wel omhoog als een nieuwe link erbuiten zou vallen, en na een afronding tot vier weken (de ingestelde dagen) na die afronding als zij eerder zou eindigen. Kan de termijn na zo'n nieuwe uitnodiging niet worden teruggezet, dan krijgt de agent van de app daar een melding van.
Versie 1.0.78
Een nieuwe deellink loopt nooit langer dan de bewaartermijn van de deelnemer, en na een afronding kort de bewaartermijn nooit onder de link van de afgeronde uitnodiging
Details
Een deellink uit het beheer was tot negentig dagen geldig, terwijl de gegevens van een kandidaat na de bewaartermijn worden geanonimiseerd en zijn deellinks dan verdwijnen: zo'n link verviel eerder dan het scherm zei. Vanaf nu loopt een nieuwe deellink nooit langer dan de bewaartermijn van de deelnemer: de gekozen dagen worden bij het maken begrensd op die termijn en het paneel noemt na het maken de einddatum, met de toevoeging als de termijn de link inkortte. Voor een deelnemer van wie de termijn al verstreken is komt er geen deellink (verleng de termijn eerst), en voor een geanonimiseerde deelnemer ook niet. Kort de afronding van de laatste test de bewaartermijn in (sinds de vorige versie tot vier weken na de afronding), dan gaan de deellinks van de deelnemer die verder reikten mee tot die termijn, ook oudere; de termijn zelf wordt daarbij nooit korter dan de link van de afgeronde uitnodiging, die de rapportmail en de bedankmail tot veertien dagen vernieuwen (dat telt bij een instelling onder de veertien dagen) (ticket 33831).
Versie 1.0.77
Na een afronding loopt de bewaartermijn van een kandidaat zonder andere open uitnodiging vier weken na de afronding, zoals de privacyverklaring belooft
Details
Na de afronding van de laatste test loopt de bewaartermijn van een kandidaat tot vier weken (de ingestelde dagen) na die afronding, zoals de privacyverklaring zegt. Dat geldt alleen als de kandidaat geen andere open uitnodiging heeft (verstuurd of geopend zonder afronddatum, ook met een verlopen link) en beheer de termijn niet met de hand heeft verlengd; een uitnodiging die intussen open gaat, krijgt haar eigen termijn terug. De termijn wordt nooit korter dan de laatste afronding plus de ingestelde dagen, en voor al het andere blijft de regel dat een termijn nooit wordt ingekort. Tot deze versie liep de termijn na een uitnodiging door tot de verloopdatum van de uitnodigingslink plus de ingestelde dagen, ook na een vroege afronding (ticket 29431, stap 1).
Versie 1.0.76
Een fout na het lezen van een bericht van SendGrid blijft een storing met kenmerk, ook als de verbinding intussen is weggevallen
Details
Herstel uit de tweede hulplezing van pull request 99 (ticket 33645). De route die de bezorgstatus ontvangt, telt alleen een verbinding die wegvalt terwijl het bericht binnenkomt als een afgebroken verzoek; een fout daarna blijft een storing met een kenmerk en een melding, ook als de verbinding intussen weg is. De getallen over de leesvragen op Wat is er nieuw bij 1.0.74 zijn gecorrigeerd: vóór 1.0.74 kostte een gebeurtenis twee tot drie leesvragen (honderd bezorgde mails tweehonderd), sinds 1.0.74 één per honderd mails en één per deelnemer in het bericht.
Versie 1.0.75
Een bezorgstatus van SendGrid staat in de tijdlijn nooit vóór de verzending, een verbinding die wegvalt tijdens het lezen is geen storing, en een onbruikbare sleutel geeft een verdwaald verzoek alleen 401
Details
Herstel uit de hulplezing van pull request 99 (ticket 33645). In de tijdlijn van een deelnemer en in het auditlog staat een gebeurtenis van SendGrid uit dezelfde seconde als de verzending (SendGrid rondt de tijdstempel af op hele seconden) nu één seconde na de verzending en nooit na het moment van verwerken; een tijdstempel die geen datum kan zijn telt als afwezig in plaats van de hele verwerking te laten mislukken, en een id in hoofdletters vindt de regel ook. De route die de bezorgstatus ontvangt, behandelt een verbinding die wegvalt terwijl het bericht binnenkomt als een afgebroken verzoek (503 zonder melding; de doorgever biedt het opnieuw aan), toetst een onbruikbare sleutel pas na de koppen en de tijdstempel, zodat een verdwaald verzoek alleen 401 krijgt, en telt een sleutel met alleen scheidingstekens als onbruikbaar.
Versie 1.0.74
De bezorgstatus van SendGrid leest per bericht gebundeld, slaat een afgebroken verzoek over, meldt een foute handtekening hooguit één keer per uur, weigert een oude tijdstempel en een onbruikbare sleutel, en zet een gebeurtenis op haar eigen moment in de tijdlijn
Details
Vervolg op 1.0.72 en 1.0.73 (ticket 33645: de K-punten van de hulplezingen van pull request 98, ticket 32551). De route die de bezorgstatus van SendGrid ontvangt, doet per bericht één leesvraag per honderd mails en één per deelnemer in het bericht in plaats van twee tot drie per gebeurtenis, zodat een bericht met veel gebeurtenissen minder leesvragen kost; een bericht waarvan de doorgever al heeft opgegeven, wordt overgeslagen en komt later opnieuw. Een handtekening die niet klopt wekt de agent hooguit één keer per uur in plaats van bij elk bericht; een sleutel op de dienst die gezet is maar onbruikbaar geeft nu een storing met een kenmerk en een melding, zodat SendGrid het bericht opnieuw aanbiedt tot de sleutel klopt; een tijdstempel verder dan 72 uur van nu wordt geweigerd; de body wordt na de toets van de koppen in delen gelezen met een teller. In de tijdlijn van een deelnemer en in het auditlog staat een gebeurtenis van SendGrid nu op het moment waarop zij gebeurde, ook als SendGrid haar tot 24 uur later opnieuw aanbood.
Versie 1.0.73
Een herinnering die SendGrid aannam en daarna weigerde telt mee voor het maximum van twee, en de bezorgstatus bewaart de tekst van de ontvangende server niet in het auditlog
Details
Herstel uit de hulplezing van pull request 98 (ticket 32551, stroom B5 van 28810). Zonder dit kreeg een adres dat SendGrid na een weigering of spammelding op zijn lijst zette elke tussentijd opnieuw een herinnering, zonder einde, en verlengde elke herinnering de bewaartermijn van de kandidaat; nu telt elke herinnering die SendGrid aannam mee, ook als zij daarna geweigerd of niet verstuurd is, en een verzendfout niet. De tekst van de ontvangende server, vaak met het adres van de kandidaat, staat alleen nog bij de mail zelf, die met de deelnemer wordt gewist, en niet meer in het auditlog, dat de anonimisering niet raakt. Een bericht dat SendGrid opnieuw aanbiedt terwijl het eerste nog loopt, en een herhaald bericht over een mail zonder deelnemer (aan het team of aan een nieuwe beheerder), geven geen dubbele regel meer.
Versie 1.0.72
De tijdlijn van een deelnemer toont of een mail is bezorgd, geweigerd, geblokkeerd, niet verstuurd of als spam gemeld, en een geweigerde mail telt als mislukt
Details
SendGrid meldt de bezorgstatus van elke mail aan de app zodra die bekend is (ticket 32551, stroom B5 van 28810; Kaders-regel 42, triggers in plaats van timers): de tijdlijn van de deelnemer, het auditlog (met de groep E-mail in het filter) en Recente activiteit op het dashboard krijgen een regel van SendGrid met de reden in gewone taal (zoals ongeldig adres of postvak niet beschikbaar), en een mail die de ontvanger weigerde of blokkeerde of die SendGrid niet verstuurde, staat in de tijdlijn van de deelnemer als mislukt; is dat de uitnodigingsmail, dan slaan de herinneringen op een schema die uitnodiging over. De meldingen komen via de Hero-brede doorgever van AgentMail op het gedeelde SendGrid-account van Hero; tot die is aangesloten (ticket 33429) komen er nog geen regels van SendGrid binnen.
Versie 1.0.71
De pagina Je uitkomst wordt berekend scoort op het herstelmoment ook als de klok een milliseconde achterloopt, en de dienst stopt met wachten zodra de browser de aanroep afbreekt
Details
Herstel na hulplezing 2 van pull request 97 (ticket 32551, stroom B4 van 28810; AKKOORD NA HERSTEL op 34caf21). N4: de toets na de wachttijd rekent met de marge van een seconde (een timer van Node gaat tot een milliseconde te vroeg af), zodat het zelfherstel niet naar de volgende aanroep schuift; met een test waarin de klok bij die toets een milliseconde achterloopt. N5: de changelog van 1.0.68 en de kaart zeggen precies wat de code doet (het signaal komt bij de laatste test van een uitnodiging na de afronding, hooguit vijf aanroepen in totaal, ruim een halve minuut, een herstart van de dienst bij een uitrol, en de laatste lezing komt na de 25 seconden). K11: de route geeft het signaal van het verzoek door; breekt de browser af, dan houdt de aanroep op met wachten, blijft een zelfherstel dat nog niet begon uit, loopt een lopend zelfherstel af en blijft de laatste lezing achterwege. K12: de laatste lezing getoetst op een nagebootste database die filtert. K13: het signaal voor een test zonder uitnodiging getoetst met de echte scoring. K14: de lijm in de component getoetst met de hooks van React nagebootst (het effect start en stopt het wachten, de router laadt opnieuw, de tekst slaat om, de afhankelijkheden zonder de stand verlopen). K15: de route is altijd dynamisch, getoetst. K16: precies vijf seconden ruimte getoetst. K17: de timer van de twee minuten direct na stop geteld. Eigen mutaties M53 tot en met M65 erbij.
Versie 1.0.70
De pagina Je uitkomst wordt berekend wacht via een route, zodat Opnieuw laden en Uitloggen niet achter het wachten in de rij staan, en zegt na twee minuten op tijd dat het langer duurt
Details
Herstel na de hulplezing van pull request 97 (ticket 32551, stroom B4 van 28810; NIET AKKOORD op 18439a7). B1: de wachtende aanroep is een route (GET /resultaat/:attemptId/wacht) in plaats van een server action, want Next zet de server actions en het opnieuw laden van één browser achter elkaar in één wachtrij; de pagina roept de route aan met fetch en breekt haar af met een AbortController, na dertig seconden zonder antwoord en zodra de component verdwijnt. B2: de twee minuten lopen op een eigen timer, los van de aanroepen, en de lus gaat na klaar, storing of een mislukte aanroep na tien seconden verder zolang de pagina staat. N1: één eindmoment per aanroep, vastgelegd vóór de lezing van de poging, zodat de lezing en het zelfherstel in de 25 seconden meetellen. N2: de changelog van 1.0.68 zegt precies wat de code doet. N3: tests met het echte zelfherstel en de echte scoring op de nagebootste database (twee aanroepen tegelijk, de volgorde van het signaal, een afronding die gooit), en voor een lopende of verlopen poging en een andere fout dan een databasefout. K1: storing zonder kenmerk in het antwoord (de foutgrens van de pagina logt haar eigen kenmerk). K2: een laatste lezing van de status aan het eind van een aanroep. K3: geen zelfherstel vóór het herstelmoment en niet zonder vijf seconden ruimte in de aanroep. K6: een id dat geen tekst is geeft direct klaar. K7: een marge van een seconde op het herstelmoment. K8 en K9: nieuwe namen (uitkomst-wachten, startWachten, wachtViaRoute, wachtOpUitkomst in src/lib), de opmerkingen bij de signalen, het zelfherstel en de scoring, en de lus met start en stop buiten de component. K10: de kaart.
Versie 1.0.69
De pagina Je uitkomst wordt berekend blijft wachten als zij na het opnieuw laden toch nog staat
Details
Tussenstand na de eigen lezing van pull request 97 (ticket 32551, stroom B4 van 28810): de lus laadt bij klaar, storing en een mislukte aanroep opnieuw en gaat na tien seconden verder zolang de pagina staat; toont de pagina de uitkomst of de foutgrens, dan stopt het wachten vanzelf. Twee tests erbij voor mutaties die eerst overleefden: de toegang vraagt het inlevermoment zelf op (alleen de gevraagde kolommen komen terug) en de lus geeft gestopt in plaats van verlopen als de component tijdens de pauze verdween. De kaart (docs/feature-map.md) voor pull request 97: Resultaat na afname, Wekkers in de dienst, Verwerking na afronding en de regel Laatste verificatie van de vier andere blokken die een geraakt bestand noemen. De hulplezing op Claude Opus 5.5 (NIET AKKOORD: de wachtende aanroep als server action staat in de wachtrij van de router, de tekst na twee minuten op een eigen timer, één eindmoment per aanroep, de changelog, tests met het echte zelfherstel) wordt in het volgende commit hersteld.
Versie 1.0.68
De resultaatpagina toont je uitkomst zodra de scoring klaar is, zonder elke vijf seconden opnieuw te laden
Details
Tot nu toe laadde de pagina Je uitkomst wordt berekend zichzelf elke vijf seconden opnieuw, hooguit twee minuten (24 keer), en zag een kandidaat zijn uitkomst gemiddeld tweeënhalve seconde na de scoring. Nu wacht de pagina in de dienst op de scoring: zij roept een route aan die hooguit 25 seconden wacht op het signaal dat de scoring geeft zodra zij de poging op gescoord heeft gezet en, bij de laatste test van een uitnodiging, de uitnodiging heeft afgerond, en de pagina laadt dan direct opnieuw; zonder signaal roept zij de route opnieuw aan: zonder storing hooguit vijf aanroepen in twee minuten. Staat de poging ruim een halve minuut na het inleveren nog zonder score, dan scoort diezelfde aanroep haar alsnog, zoals de pagina al deed bij het laden, als er in die aanroep nog minstens vijf seconden over zijn (anders doet de volgende aanroep dat direct); daarna wacht zij op de wekker of de taak en leest zij aan het eind nog één keer de stand. Na twee minuten zonder uitkomst zegt de pagina zoals voorheen dat het langer duurt dan verwacht en dat de antwoorden bewaard zijn, ook als een aanroep nog loopt; de knop Opnieuw laden blijft. Krijgt de pagina geen antwoord (de verbinding weg, een herstart van de dienst bij een uitrol, een storing in de dienst, geen antwoord binnen dertig seconden), dan laadt zij opnieuw en probeert zij, als zij dan nog staat, na tien seconden verder (ticket 32551, stroom B4 van 28810; Kaders-regel 42, triggers in plaats van timers).
Versie 1.0.67
Een storing die het team al drie keer in tien minuten zag, komt niet via een omweg alsnog binnen, en een melding over het inleveren of scoren van een test noemt dat als bron
Details
Herstel na hulplezing 2 van pull request 96 (ticket 32551, stroom B6 van 28810; AKKOORD op ac74f5b met vijf kleine punten). K1: een mislukte melding of een 429 kort een langere stilte die al staat niet in (Math.max). K2: een kenmerk dat per event of per venster gedempt is, telt als gemeld, zodat de laag erboven (request.error na een LaadStoring) het niet alsnog stuurt. K3: het inleveren of scoren van een poging meldt met de bron inleveren, want die weg loopt vanuit een verzoek, een wekker en de taak. K4: het commentaar bij server.start, de kaart en .env.example noemen de stand stand-onbekend en de ene waarschuwing bij een adres, sleutel of stand die niet deugt. K5: de changelog van 1.0.64 zegt precies wat de melding draagt en dat bij een reeks storingen van dezelfde soort hooguit drie meldingen per tien minuten gaan. Eigen mutaties M67 tot en met M70 erbij.
Versie 1.0.66
Het team krijgt ook een melding bij een mail die niet verstuurd kon worden en bij een onderdeel dat niet afgerond of gescoord kon worden, een storing in een verzoek wacht niet meer op de melding, en een melding noemt van een fout alleen de naam en de code
Details
Herstel na de hulplezing van pull request 96 (ticket 32551, stroom B6 van 28810; AKKOORD NA HERSTEL op 5f5877c). N2: ook een mislukte verzending (email.failed, ook bij niveau warn, met de reden van de provider gemaskeerd), een mislukte stap bij het afronden van een onderdeel (section.mark_failed, section.finalize_query_failed, section.submit_failed) en een mislukte scoring (attempt.score_failed) gaan met hun kenmerk naar de agent; de onderdeelwekker meldt via dezelfde stap. N3: onRequestError wacht niet meer op de melder (een hangende meldserver hield anders het antwoord van de gebruiker tot twintig seconden vast; op Railway draait een blijvende Node-server), en na een mislukte poging (geen antwoord, netwerk- of serverfout) zwijgt de melder een minuut. K4: van een fout gaan alleen de naam en de code mee, nooit haar tekst (een databasetekst kan invoer herhalen), en een veld met een fouttekst of een persoonsveld blijft uit de melding; alleen een fout die als tekst komt gaat gemaskeerd en ingekort mee. K9: hooguit drie meldingen van hetzelfde event per tien minuten. K10: een klok die terugloopt opent een nieuw venster. K11: een onbekende waarde van AGENTMELDING_STAND telt als uit, met één waarschuwing. K5 en K7: de melder volgt geen doorverwijzing en annuleert de inhoud van een antwoord dat hij niet leest. K2 en K3: de testomgeving zet de melder en het taalmodel uit, zodat een test nooit echt belt. K6: het proefscript weigert een adres met inlog en noemt zijn uitkomsten precies. K12 en K13: de kaart en het commentaar noemen dat een fout in de proxy niet gemeld wordt en welke vorm de sleutel heeft. K1: tests voor het wachten bij de start, het gedeelde geheugen over twee kopieën van de module, een 403, de bovengrens van Retry-After, de buitenste vangst, twee gelijktijdige meldingen, de venstergrens en de ondergrens van de sleutel. Eigen mutaties M47 tot en met M64 erbij.
Versie 1.0.65
Een melding aan het team over een storing in een verzoek noemt nooit het persoonlijke token uit de link van een uitnodiging of een deellink, en bij een mislukte wekker de naam van de wekker
Details
Herstel na de eigen lezing van pull request 96 (ticket 32551, stroom B6 van 28810): het pad van een verzoek gaat zonder query en zonder tokensegment in de logregel request.error en in de melding aan de agent (maskeerPad in src/instrumentation.ts: het token van een uitnodiging of een deellink wordt [verborgen], een id en een routewoord blijven), de melding van een mislukte wekker noemt de wekker onder het veld wekker, de kaart zegt dat bij Persoonsgegevens, en de nagebootste melder in negen testbestanden heeft de vorm van vi.fn met een functietype (lint zonder waarschuwingen). Eigen mutaties 46 van 46 gevangen (M43 tot en met M46 voor het pad en de wekker).
Versie 1.0.64
Bij een storing krijgt het team van Hero Assessments direct een melding met het kenmerk, ook bij een mislukte wekker, taak of start van de dienst
Details
Tot nu toe zag het team een storing pas bij de volgende lezing van het logboek. Nu meldt de app elke storing met een kenmerk direct bij haar agent: de vaste zin of de foutpagina met een kenmerk, een fout die de server zelf vangt, een mislukte wekker of herlading van de wekkers, een mislukte taak van de cron-dienst of een mislukte poging in die taak, en een ongeldige omgeving bij de start. De melding draagt hetzelfde kenmerk als het scherm, zodat de beheerder die een kenmerk doorgeeft weet dat het team het al heeft (bij een reeks storingen van dezelfde soort gaan hooguit drie meldingen per tien minuten; de rest staat in het logboek). Per kenmerk gaat één melding; zij noemt het event, het kenmerk, de versie, het moment, id's en van een fout alleen de naam en de code, nooit persoonsgegevens of een sleutel. Zonder meldroute of meldsleutel, met de noodrem AGENTMELDING_STAND=uit en op een lokaal adres blijft de app stil; de logregel server.start noemt de stand. Een proefmelding kan met scripts/dev/agentmelding-proef.mjs (ticket 32551, stroom B6 van 28810).
Versie 1.0.63
Storing met kenmerk voor de lijsten Uitnodigingen, Auditlog en Wensen en bugs bij een databasefout, een deellink met een andere vorm dan een echte link meteen ongeldig zonder databasevraag, en geen lege melding meer bij ?reden=constructor op de inlogpagina (ticket 30029)
Details
Wat een lezer merkt: kan de database de lijst Uitnodigingen, het Auditlog of Wensen en bugs niet laden, dan toont het beheer de foutpagina met een kenmerk in plaats van een lege lijst (Uitnodigingen) of de melding dat migratie 0005 of 0009 niet is uitgevoerd (Auditlog, Wensen en bugs); die melding blijft alleen als de tabel echt ontbreekt. Een deellink met een andere vorm dan een echte link (getypt, afgebroken of verzonnen) krijgt de melding Deze deellink is niet (meer) geldig en bij de PDF het antwoord 404 zonder databasevraag, dus ook als de database niet antwoordt; tot deze versie ging zo'n link vanaf twintig tekens naar de database. De inlogpagina toont geen lege melding meer bij een reden in het adres die een ingebouwde naam is, zoals ?reden=constructor; een andere onbekende reden gaf al geen melding (ticket 30029, vervolg van 29968).
Versie 1.0.62
Een uitnodigingslink met een andere vorm dan een echte link krijgt meteen de pagina ongeldig, de beheerpagina's Uitnodigingen, Auditlog, Wensen en bugs, Nieuwe uitnodiging en Deelnemer verdragen een herhaalde zoekparameter, en de logregel van Deelnemers noemt bij meer storingen per deel de soort
Details
Wat een lezer merkt: opent iemand een uitnodigingslink die niet de vorm van een echte link heeft (getypt, afgebroken of verzonnen), dan ziet hij meteen de pagina Deze uitnodiging is niet (meer) geldig; de app vraagt de database er niet meer naar en schrijft er geen logregel over, ook niet bij het accepteren. De beheerpagina's Uitnodigingen, Auditlog en Wensen en bugs nemen bij een herhaalde zoekparameter in het adres (zoals ?q=a&q=b) de eerste waarde; tot deze versie gaf zo'n adres op die pagina's de foutpagina van het beheer (de zoekopdracht), een lege lijst (het filter op Uitnodigingen en Auditlog) of de hele lijst met een gekozen filter in beeld (de soort en de status op Wensen en bugs), en de pagina's Nieuwe uitnodiging en Deelnemer namen een herhaalde parameter als lijst (de standaardkeuze van het functieprofiel, de weergave van het rapport). In het logboek noemt de regel van de lijst Deelnemers bij twee of meer storingen tegelijk per ander mislukt deel de soort: een databasefout (met haar foutcode als de database er een gaf), of een afwijzing met haar melding; op het scherm blijft het één kenmerk (ticket 29968, vervolg van 29881).
Versie 1.0.61
De lijst Deelnemers staat in pagina's van vijftig met Vorige en Volgende, een gelijktijdige tweede start van een test gaat naar de lopende test, en een databasefout bij het openen van een uitnodiging, bij het laden van een test of bij twee lezingen van Deelnemers tegelijk geeft één storing met één kenmerk
Details
Wat een lezer merkt: de pagina Deelnemers toont de gevonden deelnemers per vijftig, met boven en onder de tabel de telling (1 tot 50 van n deelnemers) en de knoppen Vorige en Volgende, die de zoekopdracht en de filters meenemen; Toepassen begint weer op pagina 1, en een paginanummer voorbij de laatste geeft de laatste pagina. Start een kandidaat of een medewerker dezelfde test gelijktijdig twee keer (een tweede tabblad, of een klik vóór de pagina klaar is), dan komt de tweede start in de lopende test in plaats van terug op het overzicht of Mijn tests. Antwoordt de database niet terwijl een kandidaat zijn uitnodiging opent of accepteert (de uitnodiging lezen, de toestemming, de achtergrond of de sessie vastleggen) of terwijl een testpagina de verlopen onderdelen leest, dan ziet de kandidaat de foutpagina met een kenmerk en opent hij de link of de pagina opnieuw; tot deze versie zag hij bij een leesfout de pagina Deze uitnodiging is niet (meer) geldig (zonder logregel), kwam hij bij een fout op de toestemming of de achtergrond gewoon op zijn overzicht terwijl die niet waren vastgelegd, landde hij bij een fout op de sessie op de pagina ongeldig omdat de cookie een sessiehash droeg die niet in de database stond, en ging de testpagina bij een fout op de verlopen onderdelen zonder logregel door naar de vragen van het verlopen onderdeel, waar de verstreken tijd alsnog werd afgehandeld. Falen bij Deelnemers twee lezingen tegelijk, dan staat er één kenmerk in het logboek en op het scherm (het logboek noemt de andere delen); tot deze versie kreeg elke lezing van de deelnemers, de pogingen of de uitnodigingen die faalde een eigen kenmerk, waarvan er één op het scherm kwam, en kreeg een storing op de telling van de tests naast een andere storing geen logregel. De export van Deelnemers is ongewijzigd. Ticket 29881 (vervolg van 29810).
Versie 1.0.60
Een databasefout bij het testoverzicht, Mijn tests, het starten van een test of het starten van een onderdeel is een storing met een kenmerk, en de lijst Deelnemers leest alle deelnemers, pogingen en uitnodigingen in pagina's
Details
Wat een lezer merkt: antwoordt de database niet terwijl een kandidaat zijn testoverzicht opent of op Start deze test klikt, een medewerker Mijn tests opent, of een onderdeel van een test start, dan ziet hij de foutpagina met een kenmerk van acht tekens dat ook in het logboek staat. Eerder toonde het overzicht dan geen voornaam of geen tests, of alle tests als niet begonnen (0 van n afgerond, alleen de eerste te starten), gaf Start deze test bij een latere test de melding Rond eerst de vorige test af of begon de eerste test gewoon, toonde Mijn tests geen tests of elke test opnieuw te starten, kwam de kandidaat bij het starten van een onderdeel zonder melding terug op de startpagina van dat onderdeel, en bracht een mislukte start hem op de foutpagina met alleen het kenmerk van Next, zonder eigen regel in het logboek. De lijst Deelnemers in het beheer leest de deelnemers, de pogingen en de uitnodigingen nu in pagina's, zodat ook een lange lijst volledig is (eerder las zij hoogstens duizend deelnemers, en ontbrak wat de database per verzoek niet meer gaf stil: een deelnemer zonder regel, nul afgeronde tests, geen functieprofiel); de nieuwste deelnemer staat bovenaan en het functieprofiel is dat van de nieuwste uitnodiging met een functieprofiel, zoals eerder. Een gelijktijdige tweede start van hetzelfde onderdeel blijft stil doorgaan, en een tweede klik op Start deze test die de eerste net kruist gaat terug naar het overzicht of Mijn tests, waar de gestarte test klaarstaat; elke andere fout bij het schrijven van de stand van een onderdeel is nu een storing met een kenmerk. Een test die niet (meer) bestaat blijft een doorverwijzing naar het overzicht. Ticket 29810, vervolg van 29574.
Versie 1.0.59
Afwijzingen van de PDF's en exports zijn leesbare zinnen in plaats van JSON, de knop Nog een uitnodiging brengt het formulier terug, een databasefout bij de lijst Deelnemers, de sessie van een kandidaat, het starten van een test of onderdeel of de deelnemer bij een medewerkersaccount is een storing met een kenmerk, en de export van de analyse geeft bij zo'n fout 503 in plaats van 500
Details
Wat een lezer merkt: opent u een PDF of een export met een link die niet mag of niet kan (geen beheerdersrol, een deelnemer of functieprofiel dat niet bestaat, een rapport zonder resultaten, een deellink die niet meer geldig is, een ongeldige test of versie in het adres, geen afnames voor die test en versie, of een export die te groot is), dan toont de browser nu een leesbare Nederlandse zin in plaats van een stukje JSON. In het beheer brengt de knop Nog een uitnodiging na het aanmaken van een uitnodiging het lege formulier terug; eerder bleef de pagina Uitnodiging aangemaakt staan. Antwoordt de database niet, dan is dat nu ook een storing met een kenmerk van acht tekens (op de foutpagina, of als tekst bij een export) bij de lijst Deelnemers en haar export (eerder een lege lijst, nul tests of ontbrekende functieprofielen), bij de sessie van een kandidaat (het testoverzicht, Start deze test, het eigen rapport en zijn PDF; eerder een doorverwijzing naar de pagina voor een ongeldige link), bij het starten van een onderdeel of van een test als medewerker (eerder een doorverwijzing alsof het onderdeel of de test niet bestond) en bij het lezen of aanmaken van de deelnemer bij een medewerkersaccount (eerder liep een storing bij het lezen door naar het aanmaken, dat op de unieke sleutel van het account afketste met een fout die alleen het kenmerk van Next zelf droeg en geen eigen logregel). De export van de analyse geeft bij een databasefout in haar lader nu status 503 met het kenmerk van die lader, waar eerder 500 stond.
Versie 1.0.58
Een databasefout bij het laden van het rapport, een deellink, de vergelijking of de aanmelding, en bij het opslaan van een antwoord, is nu een storing met een kenmerk: geen leeg rapport, geen ongeldige deellink, geen uitloggen en geen Controleer je verbinding meer
Details
Wat een lezer merkt: antwoordt de database niet, dan toont de app een storing met een kenmerk van acht tekens in plaats van iets wat op een lege stand lijkt. Het eigen rapport, het resultaat na een test en de deelpagina tonen bij een storing van het rapport of de deellink de foutpagina met het kenmerk in plaats van Je rapport is er nog niet, Resultaat nog niet beschikbaar of Deze deellink is niet (meer) geldig; de PDF's (het eigen rapport, een deellink, het rapport in het beheer) en de vergelijking als CSV geven bij zo'n storing status 503 als tekst met de vaste zin en het kenmerk, waar eerder een doorverwijzing, 404 of een vergelijking zonder kandidaten stond. Kan de aanmelding van een beheerder of medewerker niet worden gecontroleerd, dan geven de PDF's van het eigen rapport en het beheer en de exports (deelnemers, vergelijking, analyse) ook 503 in plaats van 403 of een doorverwijzing, en toont een pagina het algemene vangnet met het kenmerk; zo'n beheerder of medewerker wordt niet meer uitgelogd met de melding dat er geen profiel is (de sessie van een kandidaat via zijn link telt een databasefout nog als geen sessie; dat volgt). De pagina Deelnemer blijft bij een storing van het rapport staan en toont in de sectie van het rapport, bij het ontwikkelplan en in het paneel AI-samenvatting de zin met het kenmerk; de vergelijking van kandidaten toont de foutpagina in plaats van een vergelijking zonder kandidaten; het ontwikkelplan, een deellink maken, de rapportmail en het AI-concept melden de zin met het kenmerk van de lader. In de test zegt de opslagmelding bij een storing aan onze kant Niet opgeslagen door een storing bij Hero (kenmerk ...) met de vraag het kenmerk door te geven, en bij een afgewezen antwoord dat de pagina vernieuwd moet worden; Controleer je verbinding blijft alleen bij een weggevallen verbinding, ook in het venster Nog niet alles beantwoord vóór het afronden. Onderdeel afronden met een onderdeel-id dat geen uuid is (een vervalst verzoek) werkt geen onderdeel bij en meldt geen storing meer.
Versie 1.0.57
De vaste zin met een kenmerk heeft nu op elke plek die haar gebruikt dezelfde staart, en een PDF, de export van de analyse, het ontwikkelplan, een nieuwe wens of bug en de statusknoppen van Wensen en bugs geven die zin met een kenmerk; de tabel Uitnodigingen en het formulier Nieuwe uitnodiging melden een mislukte mail eerlijk, en een uitnodiging zonder tests blijft niet achter
Details
Wat een lezer merkt: de vaste zin met een kenmerk heeft nu op elke plek die haar gebruikt dezelfde staart (probeer het later opnieuw of geef dit kenmerk door aan het team van Hero Assessments), ook waar eerder maar een van de twee stond; alleen de melding van de test zelf bij een mislukte afronding houdt haar eigen zin. Mislukt het maken van een PDF (het eigen rapport, een deellink, het rapport in het beheer) of de export van de analyse, dan toont de browser die zin met het kenmerk in plaats van een regel in JSON zonder kenmerk. De rapportpagina toont bij een keuze in het ontwikkelplan die niet door de toets komt een vaste zin per reden en bij een storing de zin met het kenmerk; tekst uit het adres komt niet meer op het scherm. Een nieuwe wens of bug die niet opgeslagen kan worden, meldt dat met een kenmerk. De pagina Wensen en bugs toont na Inplannen, Afhandelen of Heropenen bij de melding zelf dat de status is gewijzigd (zolang de melding in de lijst staat) of de storing met kenmerk. Het formulier Nieuwe uitnodiging noemt bij een uitnodigingsmail die de provider weigerde de zin met het kenmerk; mislukt het koppelen van de tests, dan blijft er geen uitnodiging zonder tests achter en geen kandidaat die alleen daarvoor was aangemaakt en geen andere uitnodiging heeft. In de tabel Uitnodigingen meldt Nieuwe link alleen "per e-mail verstuurd" als de mail echt weg is: weigert de provider, dan een waarschuwing met de zin met het kenmerk, en zonder mailprovider of bij een overgeslagen mail de vraag de link zelf te delen; Herinneren meldt mislukte verzendingen als waarschuwing met het aantal en de reden (een reden met kenmerk gaat voor), zegt erbij dat de oude link niet meer werkt als die vóór de mislukte verzending al was vernieuwd, en meldt niet langer "0 herinnering(en) verstuurd" als succes. Onder de motorkap: de rapport-klaar-melding aan een kandidaat (zonder knop in de app) meldt een databasefout met een kenmerk in plaats van "Geen afgeronde uitnodiging gevonden".
Versie 1.0.56
Het paneel AI-samenvatting zegt na Genereren wat er gebeurde (een nieuw concept, een concept dat er al was, of een al goedgekeurde tekst), en na een vernieuwde link reikt de bewaartermijn van een kandidaat minstens tot de geldigheid van die link
Details
Wat een lezer merkt: klikte u op Genereer concept terwijl er al een concept met dezelfde invoer was (of het automatische concept na de afronding net liep), dan zei het paneel toch Concept gemaakt; nu zegt het dat het concept er al was en hieronder staat, of dat de tekst al goedgekeurd is en een nieuw concept pas komt als de invoer verandert (een nieuwe afgeronde test of een ander functieprofiel). Een nieuwe link voor een open uitnodiging (de knop Nieuwe link, een uitnodigingsmail, een herinnering) verlengt de bewaartermijn van de kandidaat zoals een nieuwe uitnodiging dat doet (de nieuwe verloopdatum plus de ingestelde dagen); een nieuwe link na een afronding (de rapportmail, de bedankmail) laat de termijn alleen tot de verloopdatum van die link reiken, zodat de termijn na een afronding niet met elke mail groeit. In beide gevallen nooit korter dan de termijn die er al stond, en nooit bij een handmatig verlengde deelnemer; zo werkt een link nooit langer dan de gegevens bewaard blijven. Onder de motorkap: twee indexen in de database (migratie 0015, apart toe te passen) die een dubbel concept tegenhouden (bij een botsing hergebruikt de app de rij die er al is) en de taak voor vastgelopen pogingen sneller laten lezen.
Versie 1.0.55
Op de pagina Uitnodigingen blijft de melding na het intrekken staan als de gefilterde lijst leeg raakt, staat de knop Kopieer nieuwe link alleen nog bij een rij die open is, en tellen de selectie en de bulkknoppen alleen de open rijen
Details
Wat een lezer merkt: trok u onder het filter Open de laatste rij in, dan verdween de melding samen met de tabel; nu blijft zij staan boven de lege lijst, tot de volgende handeling (een ander filter, ook Filters wissen, begint schoon). Een rij die in dezelfde sessie een nieuwe link kreeg, hield de knop Kopieer nieuwe link ook als die link niet meer werkte; de knop staat nu alleen zolang de rij open is, dus niet meer na het intrekken (ook in bulk, ook door een ander), na een herinnering met een mailprovider (die vernieuwt de link, ook als de verzending daarna mislukt) of als de link verliep. De telling van de selectie en de knoppen Herinneren en Intrekken boven de tabel tellen alleen de geselecteerde rijen die nu open zijn. De reden bij een overgeslagen rij noemt ook een rij die met haar deelnemer verwijderd is. Onder de motorkap: de stand van de tabel (de selectie, de nieuwe links per rij en de melding) als zuivere overgangen met tests, de tabel rendert ook de lege lijst, de rapport-klaar-melding (nog zonder knop in de app) kiest de afgeronde uitnodiging met dezelfde statuslijst als de vernieuwing van de link en zegt bij een ingetrokken enige afronding dat een ingetrokken uitnodiging geen nieuwe link en geen rapportmail krijgt, de nagebootste database van de tests sorteert tijdstippen op hun moment, en de tests draaien in UTC (ticket 28464).
Versie 1.0.54
Een storing in de database bij het openen van een deelnemer, een functieprofiel, een test of een uitslag toont nu de foutpagina met een kenmerk in plaats van Pagina niet gevonden
Details
Antwoordde de database even niet bij het openen van een deelnemer, een functieprofiel, een test of een uitslag, dan leek het alsof die niet bestond, of toonde de pagina te weinig: een deelnemer zonder uitnodigingen of tests, een functieprofiel met nul uitnodigingen (en dan zonder de waarschuwing bij Verwijderen) of een test zonder onderdelen of zonder vragen. Nu toont de app dan de foutpagina met een kenmerk en de knop Opnieuw proberen; Pagina niet gevonden blijft voor wat echt niet bestaat. Rondt een kandidaat een onderdeel af terwijl de database niet antwoordt, dan verschijnt de melding met een kenmerk en de knop Opnieuw afronden, in plaats van de startpagina. Lukt het opslaan van een antwoord door zo'n storing niet, dan probeert de test het eerst drie keer opnieuw. De knop op de foutpagina van de kandidaat heeft nu dezelfde kleur als op de andere foutpagina's.
Versie 1.0.53
Is de tijd van een onderdeel om terwijl de kandidaat de test niet meer open heeft, dan zendt de app dat onderdeel nu zelf in en levert zij de test in als het het laatste onderdeel was; een test die bij het inleveren bleef hangen, wordt een minuut later alsnog verwerkt
Details
Liep de tijd van een onderdeel af terwijl de kandidaat de test had verlaten, dan bleef het onderdeel openstaan tot hij terugkwam. Nu zendt de app het zelf in, met het moment waarop de tijd om was als inzendmoment, en levert zij de test in als dat het laatste onderdeel was. Dat gebeurt op werkdagen tussen 08:00 en 16:45 (vrijdag tot 16:30) direct en anders bij het begin van de volgende werkdag, omdat de bedankmail aan de kandidaat en het bericht aan de uitnodiger dan meegaan. Valt het inleveren of verwerken van een test door een storing om, dan probeert de app het een minuut later zelf opnieuw, zonder dat de kandidaat iets hoeft te doen.
Versie 1.0.52
De bewaartermijn van een kandidaat wordt door een nieuwe uitnodiging of een afronding nooit meer ingekort, wie een test meer dan een week na het inleveren alsnog laat afronden, krijgt geen bedankmail meer, een verlopen laatste onderdeel brengt de kandidaat direct bij zijn uitkomst, het verslag van de taak voor vastgelopen pogingen noemt tests zonder inlevermoment en tests die intussen al gescoord waren apart, en een AI-concept dat twee keer tegelijk gevraagd wordt, ontstaat maar één keer
Details
Een afronding of een nieuwe uitnodiging kort de bewaartermijn van een kandidaat niet meer in: de termijn schuift alleen nog later, en een termijn die beheer met de hand verlengde, blijft staan. Wie een test meer dan een week na het inleveren alsnog laat afronden (door zijn uitkomst, zijn testoverzicht of de testpagina te openen), krijgt geen bedankmail meer; het bericht aan de uitnodiger en het AI-concept voor beheer gaan wel. Een verlopen onderdeel krijgt de deadline als inzendmoment, en was het het laatste open onderdeel, dan gaat de kandidaat direct naar zijn uitkomst in plaats van de test te zien. De taak voor vastgelopen pogingen (zodra de taakdienst op de server aanstaat) scoort een test zonder inlevermoment niet meer, maar noemt haar apart in haar verslag, zodat beheer die gegevensfout ziet; alleen een bezoek van de kandidaat aan zijn uitkomst of zijn testoverzicht scoort zo'n test nog. Datzelfde verslag noemt ook tests die intussen al door een ander gescoord waren apart, en de taak kijkt bij tests die in uitvoering bleven alleen naar tests met een inzending van de laatste week, zodat zij niet steeds meer oude tests naleest. Wie onder AI-samenvatting op Genereer concept klikt terwijl het automatische concept nog gemaakt wordt, krijgt geen tweede concept meer: de app wacht op dat concept en toont het.
Versie 1.0.51
Een storing bij het opslaan, verwijderen, mailen of genereren in het beheer toont nu een vaste melding met een kenmerk van acht tekens in plaats van de tekst van de database, de mailprovider of het AI-model; de reden staat met hetzelfde kenmerk in het logboek, en op de pagina van een deelnemer tonen een mislukt AI-concept en een mislukte e-mail zo'n kenmerk in plaats van de foutmelding
Details
Ticket 28091, les 4.27: een scherm toont nooit de tekst van de server, de database of een dienst, ook niet achter een beheerdersrol.
- Nieuwe helper src/lib/storing.ts: meldStoring (kenmerk, logregel op niveau error met de velden van de aanroeper, de echte fout en het kenmerk, en de vaste zin voor het scherm), logStoring, nieuwKenmerk, foutTekst, storingsZin, logboekZin en veiligeStoringstekst (een rij-id als kenmerk voor fouten die via de database op een scherm komen).
- De 31 plekken die een databasetekst teruggaven: uitnodiging aanmaken (kandidaat, uitnodiging, koppeling van de tests), functieprofielen (opslaan, verwijderen), deelnemers (verwijderen, verlengen), instellingen (bewaartermijnen, domein toevoegen en verwijderen), beheerders (opzoeken, rol bijwerken, aanmelddienst, profiel aanmaken, tellen), normgroepen (test laden, groepen laden, vorige deactiveren, opslaan, deactiveren), deellinks (maken, intrekken; de actie zet geen voorvoegsel meer), AI-teksten (concept opslaan, goedkeuren, afwijzen) en de statuswijziging van een melding.
- Een mislukte generatie: registreerMislukteGeneratie bewaart de modeltekst in het concept (status failed) en geeft het scherm de vaste zin met de eerste acht tekens van het id van dat concept, of een willekeurig kenmerk als ook het bewaren mislukt; de logregel ai.generate_failed draagt summaryId en kenmerk.
- Een mislukte verzending: sendEmail geeft de vaste zin met het kenmerk (de kop van het id van de regel in email_log, of een willekeurig kenmerk) en het veld kenmerk terug; de tekst van de provider staat alleen in email_log en in de logregel email.failed met emailLogId en kenmerk. De melding na het toevoegen van een beheerder noemt dat kenmerk (admins.email_failed met profileId en kenmerk).
- De laders van de pagina Deelnemer: een mislukt concept en een mislukte e-mail krijgen op het scherm de vaste zin met het rij-id als kenmerk in plaats van de bewaarde foutmelding (toAiSummaryRow, nu in src/lib/ai/repository.ts en ook de rij van getSummary, en veiligeEmailRij in queries.ts).
- Na de hulplezing: de vaste zin voor een fout die via een rij op het scherm komt vraagt de beheerder het kenmerk door te geven aan het team van Hero Assessments, zoals de foutpagina van het beheer; de logregel draagt de code van de fout als het veld foutcode (zoals PGRST116) als zij er een heeft; de logregels van het aanmaken van een kandidaat, het opzoeken van een profiel en de aanmelddienst dragen het id van de handelende beheerder.
- Tests: src/lib/__tests__/servertekst.test.ts (33 tests over alle plekken, ook de lader van de pagina Deelnemer en getSummary: de databasetekst staat nooit in de uitkomst en wel in één logregel met hetzelfde kenmerk, zonder mailadres; het kenmerk uit een rij-id is in de tests een echt uuid) en src/lib/__tests__/storing.test.ts (10, met de code van de fout); src/lib/__tests__/norm-groups.test.ts toetst het laden van de groepen, het deactiveren van de vorige en het opslaan met de logregel (drie tests), en de herinneringstest volgt de nieuwe zin.
Versie 1.0.50
Intrekken van één uitnodiging onder Uitnodigingen meldt nu of het gelukt is, en de melding na het intrekken van een selectie noemt ook de rijen die intussen afgerond, verlopen of al ingetrokken waren
Details
Onder Beheer, Uitnodigingen gaf de knop Intrekken per rij geen melding: bij een storing zag je niets, en bij een rij die intussen was afgerond, verlopen of al ingetrokken veranderde er stil niets. Nu staat boven de tabel een melding, zoals bij een selectie: Uitnodiging ingetrokken, een uitleg als de rij niet (meer) in te trekken was (de lijst toont dan de huidige status), of bij een storing een vaste zin met een kenmerk dat de beheerder kan doorgeven. De melding na het intrekken van een selectie noemt naast het aantal ingetrokken uitnodigingen ook hoeveel geselecteerde rijen zijn overgeslagen en waarom.
Versie 1.0.49
Een onbekend adres, of een test, deelnemer of functieprofiel die er niet (meer) is, toont nu een Nederlandse pagina Pagina niet gevonden in de huisstijl met een link terug, in plaats van de Engelse standaardpagina
Details
Tot nu toe zag je bij een adres dat niet bestaat, en bij een test, resultaat, deelnemer of functieprofiel dat niet (meer) bestaat, de Engelse standaardpagina van Next (404: This page could not be found). Nu zie je een Nederlandse pagina in de huisstijl: bij een onbekend adres met de kop en de voettekst van Hero Assessments, een korte uitleg en een link naar de startpagina (ben je uitgenodigd als kandidaat, gebruik dan de persoonlijke link uit je e-mail); op de kandidaatkant binnen het kader met het logo, met een link naar je testoverzicht (naar Mijn tests voor een aangemelde medewerker, en naar de startpagina als je zonder je persoonlijke link binnenkomt); in het beheer binnen de beheerschil, met een link naar het dashboard (ook bij een verkeerd adres onder Beheer). Bij een onbekend adres buiten het beheer heet het tabblad Pagina niet gevonden.
Versie 1.0.48
Een late afronding krijgt als afronddatum het moment waarop de kandidaat de laatste test inleverde, de bedankmail en het bericht aan de uitnodiger gaan vóór de AI-samenvatting, en de taak voor vastgelopen pogingen levert ook een test in die met alle onderdelen ingezonden bleef staan
Details
Rondde de app een uitnodiging pas later af dan de kandidaat zijn laatste test inleverde (bij een later bezoek aan de testpagina, de resultaatpagina of het testoverzicht, of, zodra de taakdienst op de server aan staat, door de taak voor vastgelopen pogingen, tot een week later), dan kreeg de uitnodiging het moment van die late afronding als afronddatum. Daardoor schoven het aantal afgeronde uitnodigingen en de doorlooptijd op het dashboard en de pagina Analyse op. Nu is de afronddatum het moment waarop de kandidaat de laatste test inleverde; de bewaartermijn van de kandidaat blijft lopen vanaf het moment van de afronding zelf. Na de afronding gaan de bedankmail aan de kandidaat en het bericht aan de uitnodiger nu uit vóór de AI-samenvatting wordt gemaakt, zodat de kandidaat zijn bedankmail direct krijgt en de mails van de taak voor vastgelopen pogingen binnen de werktijden blijven, ook als de AI-stap minuten duurt. De taak voor vastgelopen pogingen (zodra de taakdienst op de server aan staat) pakt ook een test op die met alle onderdelen ingezonden op in uitvoering bleef staan omdat het inleveren omviel: zij levert haar in op het moment van het laatste onderdeel en scoort haar; en een ingeleverde test zonder bekend inlevermoment scoort zij nu, in plaats van die over te slaan. Een test die de app zelf inlevert bij het laden van de testpagina krijgt eveneens het moment van het laatste onderdeel als inlevermoment.
Versie 1.0.47
Intrekken raakt alleen een uitnodiging die nog open is en meldt bij een selectie een storing met een kenmerk, een herinnering maakt geen nieuwe link meer voor een uitnodiging die net is afgerond of geanonimiseerd, en een onmogelijke doorlooptijd telt niet mee in de mediaan
Details
Tot nu kon Intrekken, ook voor een selectie van meerdere uitnodigingen, een uitnodiging intrekken die al afgerond was maar waarvan een oude vernieuwing van de link de status had teruggezet naar verstuurd, en ook een verlopen uitnodiging vanaf een verouderde pagina. Nu raakt Intrekken precies de uitnodigingen waarbij de lijst de knop en het selectievakje toont: verstuurd of geopend, zonder afronddatum en met een geldige link; een andere uitnodiging blijft zoals zij is en krijgt geen regel in de auditlog. Mislukt het intrekken van een selectie door een storing, dan toont de lijst een vaste melding met een kenmerk in plaats van de tekst van de storing. Een handmatige herinnering maakte een nieuwe link, ook als de kandidaat in diezelfde seconden afrondde of de nachtelijke anonimisering de uitnodiging net had verwerkt; nu gaat de herinnering dan niet uit en blijft de uitnodiging ongemoeid, en dat geldt ook voor de herinneringen op een schema, die nog in de stand droog staan en nog geen link hebben gemaakt. Op het dashboard en de pagina Analyse telt een doorlooptijd onder nul, uit een oude uitnodiging waarvan de openingsdatum na de afronding is gezet, niet meer mee in de mediane doorlooptijd.
Versie 1.0.46
Bij een storing ziet ook een kandidaat een Nederlandse melding met een kenmerk en de knop Opnieuw proberen, een storing in de basis van de app of op een andere pagina toont een Nederlandse pagina met een kenmerk in plaats van een Engelse standaardpagina, en de melding in het beheer heeft de opmaak van de andere beheerpagina's
Details
Tot nu toonde de app een kandidaat bij een storing op zijn pagina's (het overzicht, de test, het resultaat, het rapport) een Engelse standaardpagina, en ook een storing in de basis van de app, in het beheermenu zelf of op een andere pagina zonder eigen foutpagina (zoals Inloggen of een deellink) kwam zo op het scherm. Nu ziet de kandidaat een melding in de toon van zijn eigen pagina's, met een kenmerk en de knop Opnieuw proberen, binnen het kader met het logo; een storing in de basis van de app of op zo'n andere pagina toont een Nederlandse pagina met een kenmerk en dezelfde knop Opnieuw proberen. De melding in het beheer heeft nu de paginakop en de rode melding van de andere beheerpagina's; de teksten en het kenmerk veranderen niet. De tekst van de storing zelf komt nergens op het scherm; een storing op de server staat met het kenmerk in het logboek, zodat het team de fout terugvindt.
Versie 1.0.45
Een ingeleverde test die bij het berekenen van de uitkomst vastliep, wordt alsnog gescoord, ook zonder bezoek van de kandidaat; de knop Onderdeel afronden meldt een storing met een kenmerk en de resultaatpagina zegt na twee minuten wat je kunt doen
Details
Leverde een kandidaat een test in en viel het berekenen van de uitkomst om, dan bleef die test op ingeleverd staan. Alleen een bezoek aan de resultaatpagina van precies die test zette het weer in gang; een vastgelopen pilottest of een tweede test van dezelfde uitnodiging bleef hangen, en daarmee ook de afronding, de bedankmail en het bericht aan de uitnodiger. Nu zet de app zo'n test ook vanaf het testoverzicht en vanaf de resultaatpagina van elke andere test van dezelfde uitnodiging weer in gang, en daarnaast, zodra de taakdienst op de server aan staat, op werkdagen overdag elk uur vanzelf, ook als de kandidaat niet terugkomt; een test die langer dan een week vastzat, laat zij staan. Valt het berekenen om direct na het inleveren, dan komt de kandidaat gewoon op de resultaatpagina, die de uitkomst alsnog ophaalt. Mislukt het afronden van een onderdeel door een storing, dan ziet de kandidaat een melding met een kort kenmerk en de knop Opnieuw afronden; zijn antwoorden blijven tot het opnieuw afronden dicht, zodat niets verloren gaat. Blijft de uitslag langer dan twee minuten uit, dan zegt de resultaatpagina dat het langer duurt dan verwacht en dat de antwoorden bewaard zijn, en de knop Opnieuw laden laat zien dat hij bezig is.
Versie 1.0.44
Een afgeronde uitnodiging telt overal als afgerond, ook als een oude vernieuwing van de link haar status terugzette; Nieuwe link maakt geen link meer voor een uitnodiging die net geanonimiseerd is en meldt een storing met een kenmerk
Details
De tegel Open uitnodigingen, de automatische en handmatige herinneringen, de uitnodigingsmail en de pagina van de kandidaat keken alleen naar de status van een uitnodiging. Was een uitnodiging afgerond en kreeg zij daarna in een oude versie een nieuwe link, dan stond haar status weer op verstuurd en telde zij daar als open: zij telde mee in de tegel, kon een herinnering of een uitnodigingsmail krijgen, en de kandidaat zag haar als een nieuwe uitnodiging in plaats van als afgerond. Nu telt overal de afronddatum, net als in de lijst sinds een eerdere versie; een ingetrokken uitnodiging blijft ingetrokken. Maakt een beheerder een nieuwe link op het moment dat de nachtelijke opschoning diezelfde uitnodiging anonimiseert, dan komt er geen nieuwe link en meldt de pagina dat de uitnodiging geen nieuwe link kan krijgen. Lukt een nieuwe link niet door een storing, dan ziet de beheerder een korte melding met een kenmerk, zodat de oorzaak in het logboek is terug te vinden.
Versie 1.0.43
De automatische herinneringen bekijken alle openstaande uitnodigingen, ook als de database per verzoek minder rijen teruggeeft dan verwacht
Details
De selectie van herinneringen las de openstaande uitnodigingen in pagina's van vijfhonderd en stopte zodra een pagina korter was. Gaf de database per verzoek minder terug, dan bleven latere uitnodigingen stil buiten beeld: die kandidaten kregen geen herinnering, en een kandidaat kon er te vroeg een krijgen, omdat een herinnering op een uitnodiging buiten beeld de tussentijd niet meer tegenhield. Nu leest de selectie door tot de telling klopt, net als de analyse en de normering sinds de vorige versie, en houdt zij de oudste uitnodiging voorop. De lezer merkt hier niets van; de herinneringen staan nog in de stand droog.
Versie 1.0.42
De itemanalyse en de normering lezen alle afnames en antwoorden, ook als de database per verzoek minder rijen teruggeeft dan verwacht
Details
De analyse van de vragen, het bouwen van een normgroep en het herscoren na een normgroep lazen de afnames en antwoorden in pagina's van duizend en stopten zodra een pagina korter was. Gaf de database per verzoek minder terug, dan telden de analyse en de normgroep stil te weinig afnames mee en werd niet elke afname herscoord. Nu lezen zij door tot de telling klopt, net als de cijfers van de funnel sinds een eerdere versie. De lezer merkt hier niets van.
Versie 1.0.41
Het logboek bewaart bij een storing geen zoektermen meer: de logregel noemt het pad zonder de zoekopdracht
Details
Bij een storing schreef de app het volledige adres van de pagina in het logboek, ook een zoekterm uit het zoekveld van Uitnodigingen of Deelnemers. Nu staat alleen het pad zonder de zoekopdracht in de logregel. De lezer merkt hier niets van.
Versie 1.0.40
Een beheerder die op een beheerpagina een storing treft, ziet een Nederlandse melding met een kenmerk en de knop Opnieuw proberen; het menu blijft staan
Details
Tot nu toonde de app bij een storing op het dashboard of de analysepagina een Engelse standaardpagina zonder menu. Nu staat er een vaste Nederlandse zin met een kenmerk en de knop Opnieuw proberen, die de pagina opnieuw laadt. De tekst van de storing zelf komt niet op het scherm en staat met hetzelfde kenmerk in het logboek, zodat het team de fout terugvindt.
Versie 1.0.39
Een kandidaat die bij het afronden een storing treft, kan opnieuw afronden en komt niet meer vast te zitten; de resultaatpagina zegt dat de uitkomst wordt berekend en ververst zichzelf een paar minuten lang
Details
Tot nu toe kon een storing op het laatste onderdeel een kandidaat stil laten vastlopen: de test leek afgerond, maar werd nooit nagekeken, en de resultaatpagina bleef zeggen dat het resultaat nog niet beschikbaar was. Nu ziet de kandidaat bij zo'n storing de melding met Opnieuw afronden; een poging waarvan alle onderdelen zijn ingezonden, rondt de app bij het volgende bezoek aan de test alsnog af; een ingeleverde poging die te lang zonder uitslag staat, kijkt de resultaatpagina alsnog na; en een afgeronde reeks tests waarvan de afronding niet werd vastgelegd, wordt alsnog afgerond, zodat de bedankmail en het bericht aan de uitnodiger alsnog uitgaan.
Versie 1.0.38
Een afgeronde uitnodiging blijft Afgerond in de lijst en op de deelnemerpagina, ook na de bewaartermijn, en een nieuwe link kan alleen voor een uitnodiging die nog niet is afgerond
Details
In de uitnodigingenlijst stond een afgeronde uitnodiging na de nachtelijke anonimisering als Verlopen en op de deelnemerpagina met het Engelse woord expired; nu toont de app Afgerond zodra de kandidaat alles heeft afgerond, ongeacht wat de anonimisering met de status deed, en het filter Afgerond vindt haar ook. De knop Nieuwe link staat alleen nog bij een verstuurde, geopende of verlopen uitnodiging die niet is afgerond en niet is geanonimiseerd; wie haar op een verouderde pagina toch gebruikt, krijgt de melding dat er geen nieuwe link kan. De deelnemerpagina toont de status van een uitnodiging met dezelfde woorden als de lijst (Verstuurd, Geopend, Afgerond, Verlopen, Ingetrokken).
Versie 1.0.37
De kaart Afgehaakt telt een kandidaat die begon maar niet afrondde ook na de bewaartermijn mee, en de cijfers op de analysepagina en het dashboard kloppen ook boven duizend uitnodigingen
Details
Op de analysepagina telde Afgehaakt een kandidaat die de test opende maar niet afrondde alleen tot de nachtelijke anonimisering na de bewaartermijn; daarna viel hij stil uit de telling. Nu telt elke geopende uitnodiging die zonder afronding verliep mee, ongeacht de status; ook een geopende uitnodiging die werd ingetrokken of een nieuwe link kreeg, telt mee zodra haar link verlopen is. De cijfers op de analysepagina (Uitnodigingen met het aantal geopend, Afgerond, Afgehaakt en de mediane doorlooptijd) en het afrondingspercentage met de doorlooptijd op het dashboard lezen de uitnodigingen nu in pagina's, zodat ze ook boven duizend uitnodigingen kloppen.
Versie 1.0.36
Een kandidaat die het laatste onderdeel twee keer tegelijk inzendt, krijgt één bedankmail en de uitnodiger één bericht
Details
Zendt een kandidaat het laatste onderdeel van een test twee keer tegelijk in (op twee tabbladen tegelijk, of opnieuw na een foutmelding terwijl de eerste inzending nog liep), dan rondde de app de poging en de uitnodiging twee keer af: twee keer scoren, twee bedankmails waarvan de tweede de link uit de eerste ongeldig maakte, en sinds versie 1.0.34 ook twee berichten aan de uitnodiger. Voortaan telt alleen de inzending die de poging op ingeleverd en de uitnodiging op afgerond zet; de andere gaat naar de resultaatpagina. Voor een kandidaat die gewoon één keer inzendt verandert er niets.
Versie 1.0.35
Een kandidaat die alle tests heeft afgerond, telt ook na de bewaartermijn mee als afgerond
Details
Op de beheerpagina (Afgerond in 30 dagen en het afrondingspercentage) en op de analysepagina (Afgerond) telt een kandidaat die alle tests heeft afgerond ook na de bewaartermijn als afgerond. Tot nu toe viel zo'n kandidaat na de nachtelijke anonimisering uit deze cijfers, zodat ze te laag stonden. De doorlooptijd en het aantal afhakers veranderen niet.
Versie 1.0.34
De uitnodiger krijgt een bericht zodra een kandidaat alle tests heeft afgerond, met de link naar de deelnemer en het rapport
Details
Zodra een kandidaat alle tests van een uitnodiging afrondt, krijgt de beheerder die de uitnodiging stuurde een intern bericht: wat er gebeurd is, waarom die het krijgt en wat die nu kan doen, met de link naar de deelnemerpagina in het beheer, waar het rapport staat. Bevatte de uitnodiging alleen pilottests, dan zegt het bericht dat die geen uitslag geven en dat deze uitnodiging geen nieuw rapport oplevert. Het bericht gaat alleen naar een beheerder met een e-mailadres van Hero en niet over een deelnemer van wie de gegevens al gewist zijn; zonder e-mailkoppeling slaat de app het over. De contactpersoon onderaan het bericht is instelbaar; zonder instelling is dat het team van Hero Assessments.
Versie 1.0.33
De automatische herinnering gaat alleen naar kandidaten die de app zelf mailde, wacht na een nieuwe link eerst drie dagen en stopt bij een verzendfout
Details
Een uitnodiging waarvan beheer de link met de hand deelde (of een vervolgmeting zonder mail) krijgt geen automatische herinnering, want die zou de gedeelde link ongeldig maken. Na een nieuwe link van beheer wacht de taak eerst de tussentijd van drie dagen. De tussentijd geldt per kandidaat, en per run gaat er hooguit één herinnering per kandidaat. Mislukt een verzending nadat de link al vernieuwd was, dan stopt de run en wacht de rest op de volgende, zodat niet elk uur alle links opnieuw vernieuwd worden. Verder leest de selectie in pagina's, komt een mislukte registratie van het herinneringsmoment in het logboek, geldt een taaksleutel korter dan 32 tekens als niet ingericht, eist het aanroepscript een beveiligd adres, deelt de cron-dienst de sleutel van de app en bouwt zij alleen bij een wijziging aan het script.
Versie 1.0.32
Kandidaten die een uitnodiging niet openen of een test niet afronden krijgen automatisch een herinnering, alleen op werkdagen binnen kantoortijd (eerst in een proefstand die alleen telt)
Details
Een kandidaat die drie dagen na de uitnodiging de link niet heeft geopend, of zeven dagen na de uitnodiging wel is begonnen maar niet heeft afgerond, krijgt dezelfde herinneringsmail als de handmatige herinnering, met een verse persoonlijke link. Hooguit twee herinneringen per uitnodiging, minstens drie dagen na de vorige, en alleen op werkdagen tussen 08:00 en 16:45 (op vrijdag tot 16:30), nooit in het weekend of op een feestdag. De herinneringen beginnen in een proefstand die alleen telt en in het logboek schrijft; de echte verzending gaat later aan, na een proefperiode.
Versie 1.0.31
De uitleg bij oudere versies op Wat is er nieuw noemt geen interne werksessie meer
Details
De uitleg bij de versies 1.0.6 tot en met 1.0.14 eindigde met een interne verwijzing naar een werksessie (een lang adres zonder spaties), die op telefoonmaat de pagina breder maakte dan het scherm. Die regel is weg. De versiehook laat zo'n verwijzing voortaan uit de uitleg, en een test bewaakt dat samenvatting en uitleg geen interne verwijzingen bevatten.
Versie 1.0.30
De zelfcontrole van de app is verder verbeterd (verificatieskill 0.3)
Details
De controle die de app bij elke wijziging op zichzelf doet, vult haar verslag nu grotendeels zelf in (omgeving, versie, telling naast de nulmeting, antwoordtijden, fouten in het logboek), bewaart het bewijs veiliger (geen namen, hostnamen of paden van de machine, geen verlies van eerder bewijs) en beschrijft preciezer hoe een storing wordt nagespeeld.
Voor gebruikers verandert er niets.
Versie 1.0.29
De uitleg bij versie 1.0.7 en 1.0.9 noemt geen persoon meer
Details
De twee regels zeggen nu alleen wat er veranderde: de Site URL en de afzender van de mails van het gedeelde Supabase-project.
Versie 1.0.28
De zelfcontrole van de app is verbeterd (verificatieskill 0.2)
Details
De controle die de app bij elke wijziging op zichzelf doet, is verbeterd: zij levert nu ook bewijs als een controle halverwege stopt, maakt op een telefoon een extra afbeelding van de bovenkant van het scherm, houdt de lokale proefversie binnen de eigen omgeving en bewaart het bewijs op één vaste plek. De werkwijze bij een storing is aangescherpt en de beschrijving van eerdere versies is in gewone taal gezet.
Voor gebruikers verandert er niets.
Versie 1.0.27
Onderhoud: het bouwgereedschap en de koppeling met het taalmodel bijgewerkt
Details
De gereedschappen waarmee de app automatisch wordt gebouwd en getest zijn bijgewerkt naar de nieuwste versies, net als de koppeling met het taalmodel dat de conceptsamenvattingen voor beheer schrijft. Alles is opnieuw getest.
Voor gebruikers verandert er niets.
Versie 1.0.26
De app controleert zichzelf bij elke wijziging
Details
Bij elke wijziging start de app zichzelf, loopt zij de belangrijkste schermen door, meet zij of alles werkt en bewaart zij het bewijs (metingen en schermafbeeldingen) voordat de wijziging live gaat. Een storing wordt voortaan eerst nagespeeld. Daarvoor is een overzicht van alle functies van de app gemaakt.
Voor gebruikers verandert er niets.
Versie 1.0.25
Afhankelijkheden bijgewerkt: Next.js 16.4.3, Anthropic SDK 1.2, eslint 10, vitest 5 en de Node-typen op 22
Details
Next.js 16.4.2 naar 16.4.3 en eslint-config-next 16.4.3: onderhoud, geen zichtbare wijziging voor gebruikers.
Anthropic SDK 0.135 naar 1.2.0 (API-versie 2026-10-21): de SDK stuurt de sleutel sinds 1.0 standaard als Authorization-kop; de app blijft hem als x-api-key sturen, zodat de connector van usage hem blijft lezen en de aanroep op de draad gelijk blijft. Een test legt dat vast.
Ontwikkel- en testgereedschap: eslint 9 naar 10, vitest 4 naar 5 en @types/node 20 naar 22, gelijk aan de Node-versie van CI en Railway; dependabot stelt voor @types/node geen majorsprong meer voor.
Vervangt de losse dependabot-voorstellen #38 tot en met #42.
Versie 1.0.24
Leesrecht per tabel in plaats van standaardrechten voor ingelogde gebruikers (migratie 0014)
Details
Beveiliging van de database: de standaardregel uit de eerste migratie, die elke nieuwe tabel of view in het schema automatisch leesrecht voor ingelogde gebruikers gaf, is ingetrokken; elke bestaande tabel krijgt het leesrecht nu expliciet. Voor gebruikers verandert er niets: de rijbeveiliging per tabel blijft en de app toont in Instellingen of de migratie staat.
Een nieuwe tabel of view krijgt haar rechten voortaan bewust in haar eigen migratie; de beveiligingsscan toetst dat bij elke run.
Versie 1.0.23
Pilottests: strengere tests op de afscherming, kopjes afgekapt bij het afnemen en de pilotvlag standaard droog
Details
De tests controleren nu ook dat elke afscherming van een pilottest de pilotvlag echt uit de database leest, en dat de resultaatpagina en het overzicht van de genodigde bij een pilottest alleen een bedankje tonen.
Een antwoord wordt precies opgeslagen zoals de deelnemer het gaf; een test legt dat nu vast.
Eigen kopjes en een eigen hulpregel bij meest en minst worden bij het afnemen afgekapt op dezelfde grens als de inhoudscontrole.
Het script voor de pilotvlag toont standaard alleen en zet de vlag pas met --apply; kan de auditregel daarna niet geschreven worden, dan zet het script de vlag terug en stopt het met een fout.
Een test legt vast dat ingelogde gebruikers na alle migraties geen testcontent of uitslagen kunnen lezen, dus ook geen pilottest.
Elke aanroep van de AI-samenvatting stuurt de naam van de app mee, zodat de verbruiksteller van Hero het gebruik per app telt.
Afhankelijkheden: de ontwikkel- en testgereedschappen vite en vitest zijn bijgewerkt via npm audit fix (#33, zonder eigen versienummer; de app zelf verandert daardoor niet).
Versie 1.0.22
Capaciteitentest als onderzoeksinstrument: telt niet mee in de functiematch en is geen bron voor een selectieoordeel
Details
De eigen capaciteitentest blijft beschikbaar als onderzoeksinstrument; zolang betrouwbaarheid, validiteit en normering niet zijn onderzocht, is de uitkomst geen bron voor een selectieoordeel.
Rapport en pdf: het hoofdstuk capaciteiten begint in beide varianten met de sectie Onderzoeksinstrument, met uitleg voor de kandidaat en een strengere uitleg voor de recruiter; de intro, de gesprekstip, de leeswijzer (nu ook in de pdf voor de kandidaat), de verantwoording en de onzekerheidsnoot krijgen dezelfde zin.
Samenvatting: het percentage goed staat alleen nog voor de recruiter als gespreksstof over tempo en werkwijze; niet meer als sterk punt, risico of kruisverband, niet in de profielregel of de kopregel, en niet als aandachtspunt voor de kandidaat, omdat dat een kiesbaar ontwikkelpunt zou worden.
Zolang de test een onderzoeksinstrument is, toont het recruiterrapport geen IQ-indicatie en geen niveau-indicatie; sten en percentiel blijven bij een normgroep staan. De scorer bewaart de indicaties, zodat ze zonder herscoren terugkomen zodra die regel vervalt.
Functiematch: de capaciteitentest telt niet mee in score en indicatie; een functieprofiel heeft geen minimum en geen gewicht meer voor capaciteiten, een eerder ingesteld minimum telt niet mee (zichtbaar als niet-toetsbaar criterium met uitleg) en vervalt bij opslaan. De vergelijking van kandidaten op een functieprofiel en de CSV ervan tonen de kolom capaciteiten niet meer.
AI-samenvatting: de regels krijgen de afspraak dat de capaciteitentest geen oordeel over geschiktheid en geen match-indicatie onderbouwt (nieuwe promptversie). Een eerder goedgekeurde samenvatting van een oudere promptversie komt niet meer in rapport en pdf; daar staat een vaste noot met het advies een nieuw concept te maken en goed te keuren. Een ouder concept is niet meer goed te keuren; het AI-paneel toont dat bij de promptversie.
Alle teksten en de regel zelf staan in één bron; tests en de e2e-controle aangevuld.
Beheer: de exportknoppen bij deelnemers en bij de vergelijking van een functieprofiel zijn gewone links, zodat één klik één bestand en één auditregel geeft (eerder al live via #31).
Versie 1.0.21
Export op vraagniveau: per test en contentversie de antwoorden per afname en vraag als CSV, met een vaste code per deelnemer
Details
Beheerders downloaden in de itemanalyse per test en contentversie een CSV met één rij per afname en meetellende vraag: het onbewerkte antwoord, de waarde na omkering, de sleutelwaarde uit de content (bij meest en minst van beide keuzes), de antwoordtijd en het aantal wijzigingen.
Per afname staan de soort deelnemer, de ronde, de contentversie, de status, de duur en de getallen voor antwoordstijl (mediane antwoordtijd met de bestaande grens voor te snel, aandeel uitersten, langste reeks gelijke antwoorden, aandeel gunstigste kant) en voor de instemming met positief en omgekeerd geformuleerde stellingen, als getallen zonder oordeel.
De deelnemer staat alleen met een vaste code (migratie 0013), zonder naam, e-mailadres, id, tijdstip of vrije tekst.
Alleen voor beheerders; elke download schrijft eerst een regel in het auditlog en zonder die regel gaat er geen bestand weg; boven 200.000 rijen weigert de export.
Werkt voor alle testsoorten, ook de bestaande; de rekenregels zijn pure functies met dezelfde hulpfuncties als de rekenkern en de itemanalyse.
De bestaande tests, scores, rapporten en exports veranderen niet.
Controle in productie met de fictieve controletest en een met de hand afgeleide verwachting.
Bijgewerkte afhankelijkheden, onder meer Next.js 16.4.2 (de beveiligingsupdate voor drie adviezen op Next.js 16.0.0 tot en met 16.4.0); die update ging op 23 oktober 2026 zonder eigen versienummer live.
Versie 1.0.20
Schaalprofiel: een nieuwe testsoort die per schaal het gemiddelde en de spreiding berekent, met losse vragen en dilemma's apart
Details
Een nieuwe testsoort berekent per schaal het gemiddelde na omkering en de spreiding, alleen als genoeg vragen zijn beantwoord (standaard 75 procent, naar boven afgerond; korte schalen alleen volledig).
Losse vragen en dilemma's krijgen elk een eigen waarde en tellen niet mee in een schaal.
Schalen, omkering, minimum en sleutelwaarden zijn instellingen in de inhoud van de test; de uitkomst heeft geen totaal, geen grenzen en geen labels.
De testsoort is alleen als pilot te gebruiken en komt niet in uitslagen of rapporten (migratie 0012).
De scoring-engine gaat naar 2.3.0; de bestaande tests en hun uitslagen veranderen niet.
De itemanalyse in beheer toont ook dilemma's en schalen van één vraag.
Scripts: een fictieve controletest en een alleen-lezen controle van de uitkomst.
Versie 1.0.19
Antwoordvormen: stellingen met vijf of zes opties, een keuze tussen twee polen en eigen kopjes bij meest en minst
Details
Een stelling kan vijf of zes antwoordopties hebben, en een nieuwe vraagvorm laat kiezen tussen twee uitspraken met vier opties ertussen.
Bij een keuze tussen meest en minst passend zijn de kopjes per vraag in te stellen.
De inhoudscontrole, de controle bij het opslaan van antwoorden, de itemanalyse, de sneltoetsen en de opmaak op computer en telefoon ondersteunen de nieuwe vormen, ook bij oefenvragen.
De rekenregels en uitslagen van de bestaande tests veranderen niet: zij blijven op vijf punten, en de inhoudscontrole bewaakt dat.
Scripts: een fictieve controletest voor de antwoordvormen en een e2e-controle op computer en telefoon.
Versie 1.0.18
Pilottests: alleen via een uitnodiging, zonder uitslag voor de deelnemer en buiten rapport, functiematch, vergelijking en AI
Details
Een test kan als pilot gemarkeerd worden (kolom is_pilot, migratie 0011).
Een pilottest staat niet in Mijn tests en is niet door een medewerker te starten, maar wel te kiezen bij een nieuwe uitnodiging (niet standaard aangevinkt, met het label Pilot in beheer).
De deelnemer krijgt van een pilottest geen uitslag: niet op de resultaatpagina, in het overzicht, het rapport, de pdf, de deellink of de bedankmail, maar een bedankje met de uitleg dat het een pilot is.
Pilotuitslagen blijven buiten samenvattingsregels, functiematch, vergelijkingen en de AI-samenvatting; een vervolgmeting neemt geen pilottest over.
Scripts: de pilotvlag zetten met controle en audit, een fictieve controletest aanmaken en opruimen, en een e2e-controle voor de pilotflow.
Versie 1.0.17
Geen railway.json meer: de Railway-instellingen staan sinds de apply van 9 oktober 2026 alleen in .railway/railway.ts (spoor B, PR 2 van 2)
Details
Spoor B van de Railway-migratie (ticket 3086) is op 9 oktober 2026 toegepast:
de instellingen van de dienst web (bouwer NIXPACKS, npm run build, npm run
start, healthcheck op / met 120 s, herstart bij een fout met 3 pogingen) staan
op Railway onder de partial web, gelijk aan .railway/railway.ts, en een
controledeploy slaagde. railway.json is daarmee overbodig en gaat weg; Railway
leest het vanaf 1 december 2026 toch niet meer. Verder doet .railway/**/*.ts
mee in de typecheck (punt N1 van de review van PR #15), noemt paspoort.json
de kluisvariabele ASSESSMENT__RAILWAY_PROJECTTOKEN (alleen de naam) en de
werkwijze met het projecttoken per opdracht, en beschrijven CLAUDE.md,
README.md, OVERDRACHT.md en docs/overdracht-2026-09-12.md plan en apply. Aan
de werking van de app verandert niets.
Versie 1.0.16
Railway-instellingen als code in .railway/railway.ts, naast railway.json tot de omzetting is gecontroleerd
Details
De instellingen van de dienst op Railway (bouwer, bouw- en startopdracht,
healthcheck en herstartregel) staan nu ook als code in .railway/railway.ts,
samen met de bron, het eigen domein en de namen van de omgevingsvariabelen
(zonder waarden). Railway stopt op 1 december 2026 met het lezen van
railway.json; dat bestand blijft staan tot de nieuwe instellingen op Railway
zijn toegepast en gecontroleerd (spoor B van de Railway-migratie, eerste van
twee stappen). Aan de werking van de app verandert niets.
Versie 1.0.15
Next 16.3.8 en npm audit fix tegen de kritieke kwetsbaarheid in next/og en de hoge meldingen
Details
De CI-stap npm audit faalde sinds 5 oktober 2026 op een kritieke
kwetsbaarheid in next 16.2.0 tot 16.3.5 (RCE in next/og ImageResponse,
GHSA-vcvr-r3jv-pc5j) en op hoge meldingen in brace-expansion, sharp,
source-map-js en braces. Next en eslint-config-next gaan naar 16.3.8 (de
laatste patch van 16.3; geen sprong naar 16.4) en npm audit fix werkt de
overige afhankelijkheden bij. Alleen braces blijft over: daarvoor bestaat
geen gepatchte versie en het zit uitsluitend in de lintketen
(eslint-config-next), niet in de app zelf. Aan de werking van de app
verandert niets.
Versie 1.0.14
Beheerders toevoegen en verwijderen op de instellingenpagina, met een e-mail met uitleg aan de nieuwe beheerder
Details
Op /admin/settings (Accounts en beheerders) maakt een beheerder een collega
beheerder op e-mailadres of met "Beheerder maken" bij een bestaand account;
"Beheerdersrol intrekken" zet de rol terug naar medewerker (niet voor jezelf,
niet voor de laatste beheerder; alleen toegestane domeinen). Zonder account
wordt het aangemaakt in Supabase Auth (bevestigd, willekeurig wachtwoord);
inloggen via Microsoft of "Wachtwoord vergeten". Nieuwe beheerders krijgen
een e-mail (soort admin_added); auditacties account.admin_add en
account.admin_remove. Logica in src/lib/admin/admins.ts met unit tests.
Versie 1.0.13
Normering per opleidingsniveau, kwaliteitscontroles, niveau-indicatie en IQ-indicatie
Details
Een normgroep bewaart nu ook de statistiek per opleidingsniveau (mbo, hbo, wo), de kwaliteitscontroles (oplopende gemiddelden met effectgrootte, KR-20 per onderdeel, verschillen naar geslacht en leeftijd) en of de niveau-indicatie aan mag (100 afnames per niveau en alle controles in orde). De scorer bewaart bij een volwaardige normgroep een IQ-indicatie (100 plus 15 keer z, met marge uit de betrouwbaarheid en de referentiegroep) en, zodra die aan staat, de niveau-indicatie met het percentiel binnen elk niveau. Alleen de recruitervariant van het rapport toont ze, met marge, referentiegroep en de nuance dat de groepen overlappen; de AI-samenvatting mag een IQ-indicatie alleen zo noemen. Het analysepaneel toont de aantallen per niveau, de kwaliteitscontroles als stoplicht en de status van de niveau-indicatie. Antwoorden voor de betrouwbaarheid worden in pagina's geladen.
Versie 1.0.12
Itemanalyse per contentversie en per itemsoort voor alle vijf tests
Details
De analysepagina berekent nu per test en per contentversie de betrouwbaarheid (KR-20 of alfa, standaardmeetfout, inter-itemcorrelatie) en per item de p-waarde, item-restcorrelatie, afleider en responstijd, ook voor situaties en gedwongen keuzeblokken (DISC, teamspeler) die eerder geen statistiek kregen. De berekening is een zuivere module met synthetische tests; de loader laadt afnames en antwoorden in pagina's van duizend rijen, zodat grotere aantallen afnames niet stilzwijgend worden afgekapt. Technische handleiding paragraaf 5 en de statusregels zijn bijgewerkt.
Versie 1.0.11
Contentversie 3 met twaalf moeilijke items, moeilijkheidsniveau 6 en 24 items per onderdeel
Details
Per onderdeel vier extra scorende items op de posities 23 tot en met 26 (twee op moeilijkheid 5, twee op het nieuwe niveau 6): numeriek gecombineerde regels, verbaal analogieën met abstracte relaties en syllogismen met een dubbele ontkenning en een verborgen premisse, abstract reeksen en matrices met drie regels tegelijk. Tijdslimieten 14, 12 en 14 minuten voor 24 vragen; placeholdernormen voor versie 3; de items van versie 2 blijven ongewijzigd en lopende afnames blijven op versie 2. Contracttest voor versie 3 (herberekende numerieke sleutels, balans, tijdslimieten, normen), renderscript voor de visuele controle van abstracte items, logboek in itemontwikkeling.md.
Versie 1.0.10
Opleidingsvraag met mbo apart en vraag of Nederlands de moedertaal is
Details
De optionele achtergrondvragen bij de uitnodiging onderscheiden nu vmbo of mavo, mbo, havo of vwo, hbo, wo en anders (mbo stond samen met havo en vwo) en vragen of Nederlands de moedertaal is, omdat het verbale onderdeel taalgevoelig is. De normering kan daarmee per opleidingsniveau referentiegroepen opbouwen (educationLevelOf). Privacyverklaring (versie 2026-09b), DPIA en verwerkingsregister zijn aangevuld; eerder opgeslagen antwoorden blijven staan.
Versie 1.0.9
Afzender van de auth-mails is "Hero" via welcometoreply@hero.eu
Details
De projectbrede SMTP-afzender van het gedeelde Supabase-project staat op "Hero" via welcometoreply@hero.eu (geverifieerde afzender in het SendGrid-account), zodat de auth-mails van alle Hero-apps een neutrale afzender hebben.
Versie 1.0.8
Site URL van het gedeelde Supabase-project blijft saleshero.heroapps.nl
Details
Hero Assessments geeft bij wachtwoord vergeten en Microsoft-login altijd een eigen redirect_to mee en heeft de projectbrede Site URL niet nodig; die is teruggezet op https://saleshero.heroapps.nl zodat de andere Hero-apps niets merken. De SMTP-afzender blijft "Hero Assessments" via assessment@hero.eu.
Versie 1.0.7
Site URL en mailafzender van het gedeelde Supabase-project op assessment.heroapp.nl en assessment@hero.eu
Details
De projectbrede Site URL staat nu op https://assessment.heroapp.nl en de SMTP-afzender op "Hero Assessments" via assessment@hero.eu (SendGrid). README en overdracht beschrijven de nieuwe stand, het effect op de andere Hero-apps en de valkuil dat een PATCH met alleen smtp_admin_email de hele SMTP-configuratie wist.
Versie 1.0.6
Supabase-project is gedeeld met andere Hero-apps; werkelijke inrichting van Microsoft-login vastgelegd
Details
Alleen de redirect-URL's zijn toegevoegd; de provider Azure gebruikt de bestaande app-registratie SalesHero met de claims email en xms_edov. Site URL, SMTP en mailsjablonen blijven projectbreed. Migraties 0008 tot en met 0010 zijn toegepast.
Versie 1.0.5
Strikte tooluitvoer zodat Fable 5.1 lijsten als lijsten levert; diagnosescript ai-raw
Details
De AI-tool staat op strict (constrained decoding). Zonder die dwang leverde Fable 5.1 de sterke punten, aandachtspunten, kruisverbanden en interviewvragen als losse tekst, waardoor elke automatische samenvatting eerst mislukte en pas via Opus 5 slaagde. Lengtebeperkingen kent strict niet: die staan nu als hint in de beschrijving, zod bewaakt ze en te lange lijsten worden ingekort.
Nieuw: railway run npx tsx scripts/dev/ai-raw.ts toont de ruwe tooluitvoer van een model zonder validatie.
De test van de versiehook krijgt zestig seconden, omdat echte git-processen onder belasting boven de standaardlimiet uitkomen.
Versie 1.0.4
Script om een beheerder aan te maken of te promoveren
Details
scripts/dev/create-admin.ts ontbrak in de repository terwijl de overdracht ernaar verwees. Nieuw account: willekeurig wachtwoord dat eenmalig wordt getoond; bestaand account (ook via Microsoft): rol naar beheerder. De overdracht noemt het script nog één keer.
Versie 1.0.3
Vervolgstappen na de laatste test lopen buiten het antwoord; AI-lijsten als tekst omgezet; Microsoft-login schakelbaar
Details
De AI-samenvatting en de bedankmail lopen na het antwoord aan de kandidaat (after van next/server), zodat de laatste test niet minuten op "Bezig..." blijft hangen.
Fable 5.1 levert lijsten in de tooluitvoer soms als JSON-tekst; de AI-client zet die om voordat het schema valideert, zodat het eerste model niet meer onnodig faalt.
De knop "Inloggen met Microsoft" en de route /auth/microsoft staan alleen aan met MICROSOFT_LOGIN_ENABLED=1, zodat de knop pas verschijnt als Supabase en Entra ID zijn ingesteld.
Samengevoegd en gedeployd: normgroepen voor de capaciteitentest, teamspeler contentversie 5, versienummer met changelog en het melden van wensen en bugs, Microsoft-login met wachtwoord vergeten en een accountpagina.
Versie 1.0.2
Versienummer, changelog, git-hooks en meldingen in README en overdracht
Details
Uitleg van de automatische ophoging (prepare-script, post-commit-hook, overslaan, amend, merge-conflicten in de versiebestanden) en van het melden en opvolgen van wensen en bugs, plus de nog toe te passen migratie 0009 in de overdracht.
Versie 1.0.1
Versienummer in de voettekst, changelog en automatische ophoging per commit
Details
Versie 1.0.0 in package.json, tijdens de build gelezen via src/lib/version.ts en als link naar /changelog in de voettekst van de kandidaat-, medewerker- en beheerpagina's. De post-commit-hook in .githooks (actief via het prepare-script, core.hooksPath) laat scripts/version/bump.mjs het patchnummer ophogen, een regel aan changelog.json toevoegen en beide met git commit --amend --only aan de commit toevoegen. Merges, cherry-picks en rebase-stappen worden overgeslagen, een amend behoudt de versie, en met de markering "skip version" tussen rechte haken slaat een commit de ophoging over. Pagina /changelog toont de versiegeschiedenis met inklapbare details en, voor ingelogde medewerkers en beheerders, het meldformulier voor wensen en bugs.
Versie 1.0.0
Eerste genummerde versie van Hero Assessments
Details
Vijf tests: capaciteitentest, gedragsstijl (DISC), drijfveren, De Ideale Teamspeler en Working Genius. Kandidaten krijgen een persoonlijke uitnodigingslink; medewerkers loggen in en maken de tests via Mijn tests.
Rapporten voor deelnemer en recruiter, online en als PDF, met vergelijking tussen meetrondes, een ontwikkelplan en deellinks voor hiring managers.
AI-samenvattingen (integratief, gespreksleidraad en voorbereiding) die een beheerder eerst goedkeurt.
Beheer van uitnodigingen, deelnemers, functieprofielen, analyse, auditlog en instellingen; automatische anonimisering na de bewaartermijn.
Eerder vandaag: de AI-laag werkt weer op de huidige modellen, e-mail gaat via SendGrid vanaf assessment@hero.eu en de app draait op het eigen domein assessment.heroapp.nl.
Medewerkers en beheerders kunnen een wens of bug melden; het beheer volgt de meldingen op onder Wensen en bugs.