LâIA a rendu la rĂ©daction de tests peu coĂ»teuse. Le plus difficile est dĂ©sormais de choisir ce qui mĂ©rite un oracle.
Votre IA rédige des tests. Ont-ils une quelconque utilité ?
Il ne s'agit pas d'une figure de style. C'est la question que Fabien Potencier a soulevée lorsqu'il a affirmé que les tests faibles constituent désormais un handicap. Les agents de codage modifient le code plus vite que n'importe quel relecteur humain ne peut suivre. La suite de tests est la garantie à chaque modification. Si elle ne prouve que que les mocks ont été appelés dans l'ordre, que await() s'est exécuté une seule fois, ou qu'un objet ressemblant à un DTO a été renvoyé, alors cette garantie n'est que du vent.
Sebastian Bergmann exprime la mĂȘme idĂ©e, mais avec d'autres termes. DerriĂšre chaque barre verte se cache un oracle de test : la procĂ©dure qui dĂ©termine la validitĂ© d'un rĂ©sultat. La rĂ©ussite d'un test ne signifie pas que le produit est correct. Elle signifie simplement que l'oracle que vous avez choisi â consciemment ou non â a Ă©tĂ© satisfait.
Cet article n'est pas un tutoriel PHPUnit. Ce n'est pas un exposé sur le TDD. Ce n'est pas une comparaison entre ReactPHP et Amp.
Il s'agit d'une prĂ©sentation subjective d'un petit projet connexe â nolife-tests (sous Darkwood content/) â qui utilise Darkwood Flow pour concrĂ©tiser une affirmation architecturale :
Les tùches représentent le comportement métier. Les pilotes sont des éléments de l'environnement d'exécution. Les suites applicatives devraient privilégier les premiÚres et ignorer les seconds.
Si, aprĂšs avoir lu cet article, vous ĂȘtes toujours fier de tous les tests rĂ©ussis de votre dĂ©pĂŽt, alors j'ai Ă©chouĂ©. Si, en revanche, vous en supprimez discrĂštement quelques-uns ou réécrivez leurs assertions, alors l'expĂ©rience a fonctionnĂ©.
L'économie s'est inversée
Avant l'arrivée des agents, les tests de qualité coûtaient cher. Leur rédaction prenait du temps, et personne ne voulait s'en charger. Les équipes les ont donc ignorés et ont accepté le risque.
Aujourd'hui, Ă©crire des tests est peu coĂ»teux. Les agents n'hĂ©sitent pas Ă inonder une requĂȘte de tests de couverture. Potencier souligne que l'ancien reproche â « les agents Ă©crivent des assertions et des mocks vides Ă tous les niveaux » â est largement dĂ©passĂ© avec les modĂšles actuels. Les agents peuvent Ă©galement complĂ©ter les suites de tests rĂ©elles : identifier les comportements non assertĂ©s, les identifier et gĂ©nĂ©rer une erreur justifiĂ©e.
Les tests sont donc résolus ?
Non.
Ce qui est devenu rare, c'est le jugement : quels comportements mĂ©ritent d'ĂȘtre assurĂ©s, quelles assertions survivent Ă une refactorisation, quels doublons masquent un dĂ©faut de conception, quelles barres vertes seraient encore validĂ©es si le sens du produit Ă©tait compromis.
Cette distinction constitue l'article tout entier.
Before AI â Cost of writing tests â« Cost of choosing oracles With coding agents â Cost of writing tests âȘ Cost of choosing oracles
Le volume sans discernement est une fausse assurance. La rapidité sans jugement est la garantie d'un confort illusoire qui s'avÚre inefficace tant pour la production que pour les agents.
à quoi ressemble un « test sans vie »
Je l'appelle tests sans vie : une suite de tests « verts » qui vérifie l'implémentation, l'ordre des appels et les mécanismes d'exécution, sans se soucier du fonctionnement métier. Les tests sont actifs dans l'intégration continue. L'assurance, elle, est morte.
Le dépÎt associé contient une suite de tests tests/Bad/ à vocation pédagogique. Exécutez-la :
cd nolife-tests composer install composer test:bad # green, low value composer test:good # behavioral oracles
Trois doublures. MĂȘme mĂ©thode de travail. Trois façons diffĂ©rentes de mentir.
1. Couplage de l'implĂ©mentation â simulations Ă tous les niveaux
Le test ImplementationCoupledTest construit un flux à partir de quatre instances simulées de JobInterface et vérifie qu'elles ont été appelées dans l'ordre avec des valeurs de retour prédéfinies. Il ne demande jamais la signification de l'extrait.
$fetch->expects($this->once())->method('__invoke')->with($request)->willReturn($raw); $parse->expects($this->once())->method('__invoke')->with($raw)->willReturn($parsed); $excerpt->expects($this->once())->method('__invoke')->with($parsed)->willReturn($draft); $validate->expects($this->once())->method('__invoke')->with($draft)->willReturn($result); $flow = (new Flow($fetch))->fn($parse)->fn($excerpt)->fn($validate); ($flow)(new Ip($request)); $flow->await(); $this->assertTrue(true); // Green. We never asserted meaning.
Remplacez la véritable fonction ParseJob par une implémentation défectueuse. Déployez une analyse HTML de piÚtre qualité. Cette suite reste fonctionnelle. Les simulations n'appellent jamais la fonction réelle.
Posez-vous la question du test de rĂ©sistance : Si une version dĂ©fectueuse de ParseJob Ă©tait dĂ©ployĂ©e, ce test resterait-il positif ? Oui. Lâassurance porte donc sur lâordre dâappel sous doubles, et non sur la fidĂ©litĂ© de lâextrait.
2. Couplage en temps rĂ©el â test du mobilier
RuntimeCoupledTest encapsule FiberDriver et compte les appels à await(). Cela prouve que l'encapsuleur de boucle d'événements a été utilisé. Cela ne prouve pas que l'extrait est fidÚle.
public function await(array &$stream): void { ++$this->counter->awaitCalls; $this->inner->await($stream); } // ... $this->assertSame(1, $counter->awaitCalls);
ReactPHP n'a pas besoin de vos tests d'application. Amp non plus. L'intĂ©gration continue de Flow peut entraĂźner la destruction de pilotes. Votre suite de tests ne devrait pas enregistrer le nombre de fois oĂč le pilote a consommĂ© sa bande passante.
L'association Fibre â Ampli invaliderait-elle ce test mĂȘme si l'extrait est correct ? Oui. C'est la dĂ©finition mĂȘme d'un test de mobilier.
-
Théùtre de couverture â forme sans signification
Le test CoverageTheaterTest vérifie que instanceof ExcerptResult, un titre non nul et un extrait de type chaßne de caractÚres. Un agent apprécie ce modÚle : couverture élevée, aucun oracle. Modifiez l'algorithme d'extrait pour qu'il renvoie « lorem ipsum » et l'intégration continue restera au vert.
$this->assertInstanceOf(ExcerptResult::class, $result); $this->assertNotNull($result->title); $this->assertIsString($result->excerpt); // Never asked: is the excerpt faithful to the document?
Bergmann reprend le raisonnement suivant : lâoracle a choisi la « forme ». La forme nâest pas la vĂ©ritĂ© du produit.
Flux en un seul diagramme : Tùches vs Conducteurs
Darkwood Flow n'est pas une bibliothĂšque DAG nĆuds/arĂȘtes. Le travail se dĂ©place sous forme de paquets d'informations (« Ip ») Ă travers une sĂ©quence composĂ©e de Jobs. La concurrence est gĂ©rĂ©e par la planification des paquets (« IpStrategy ») et un moteur d'exĂ©cution de coroutines configurable (« Driver »).
Business behavior â test this
scheduled by
Runtime furniture â do not pin in app tests
FiberDriver
AmpDriver
ReactDriver
⊠future runtime
DocumentRequest
FetchJob
ParseJob
ExcerptJob
ValidateJob
ExcerptResult
ConceptSignificationAppartient aux tests d'application ?TĂącheTransformer T1 â T2 (analyse, extraction, validation)Oui â oracles d'unitĂ©s et de flux de travailIPSupport immuable des donnĂ©es courantesIndirectement (paquets d'entrĂ©e/sortie)FluxĂtapes ordonnĂ©es composĂ©es avec fnEn tant qu'oracle de flux de travail, et non via des simulations d'ordre d'appelPiloteImplĂ©mentation de l'asynchronePas de fumĂ©e dans l'intĂ©gration continue de FlowPortLimite d'E/S (DocumentSource)Stub ici
L'architecture intÚgre déjà les enseignements tirés des tests. Le comportement métier est défini par les Jobs. L'environnement d'exécution est remplaçable. Si vos tests échouent lorsque vous changez de pilote, c'est qu'ils n'ont jamais testé le produit.
Dans le projet associé, le flux de travail est assemblé une seule fois :
return (new FlowFactory($driver))->create(static function () use ($source, $maxExcerptLength, $minExcerptLength) { yield new FetchJob($source); yield new ParseJob(); yield new ExcerptJob($maxExcerptLength); yield new ValidateJob($minExcerptLength); });
MĂȘme chaĂźne. Transmettez FiberDriver ou AmpDriver. Les tĂąches ne savent pas lequel.
php bin/excerpt.php fiber php bin/excerpt.php amp
MĂȘme titre. MĂȘme extrait. Mobilier diffĂ©rent.
LĂ oĂč vivent les entreprises : testez les emplois
ParseJob, ExcerptJob et ValidateJob sont des fonctions ordinaires. Aucun flux ni pilote n'est requis. C'est lĂ tout l'intĂ©rĂȘt.
JobBehaviorTest affirme une signification :
$parsed = (new ParseJob())(new RawDocument('doc://1', $html)); $this->assertSame('Hello Flow', $parsed->title); $this->assertSame('Jobs transform packets. Drivers schedule them.', $parsed->body);
$draft = (new ExcerptJob(40))(new ParsedDocument('doc://1', 'T', $longBody)); $this->assertSame('Jobs transform information packets intoâŠ', $draft->excerpt);
$this->expectException(\RuntimeException::class); $this->expectExceptionMessage('too short'); (new ValidateJob(20))(new ExcerptDraft('doc://1', 'T', 'too short'));
Ces tests resteraient valides mĂȘme si Flow disparaissait demain. Ils resteraient valides si vous exĂ©cutiez les tĂąches dans un worker Symfony Messenger, un script CLI ou un gestionnaire Framework X. Ils protĂšgent les transformations observables, et non l'infrastructure d'orchestration.
Voici la premiÚre moitié du modÚle mental :
Si vous pouvez tester unitairement une tùche sans construire de flux, vous avez trouvé le comportement métier.
Les flux de travail favorisent cette sĂ©paration. Lorsque les Ă©tapes sont nommĂ©es transformations avec des paquets typĂ©s, la question « que devons-nous affirmer ? » cesse d'ĂȘtre abstraite. On affirme la signification du paquet aprĂšs l'Ă©tape.
L'oracle du flux de travail
Les tĂąches unitaires sont nĂ©cessaires, mais pas suffisantes. La composition peut toujours ĂȘtre erronĂ©e : ordre incorrect, validation manquante, port jamais utilisĂ©.
WorkflowBehaviorTest exécute la chaßne complÚte à travers Flow et vérifie la fidélité par rapport à fixtures/article.html :
$result = FlowCollector::run($flow, new Ip(new DocumentRequest('fixture://article'))); $this->assertSame('Darkwood Flow Notes', $result->title); $this->assertStringContainsString('Jobs transform information packets', $result->excerpt); $this->assertStringContainsString('Drivers schedule', $result->excerpt); $this->assertLessThanOrEqual(121, mb_strlen($result->excerpt));
Un deuxiĂšme cas alimente un document minimal et s'attend Ă un Ă©chec de validation â et non Ă une vĂ©rification de forme conforme aux attentes.
Notez ce qui n'est pas affirmé : l'ordre des appels, le type de pilote, le nombre d'appels await(), les attentes simulées sur les tùches.
HonnĂȘtetĂ© concernant Ip
Ip::$data est en lecture seule. Flow ne modifie pas votre paquet d'origine ; chaque étape encapsule une nouvelle instance de Ip. Prétendre que le paquet d'entrée a changé est une erreur fréquente.
FlowCollector ajoute une tĂąche terminale qui stocke la charge utile finale â la mĂȘme honnĂȘtetĂ© que celle utilisĂ©e par les propres tests de Flow :
$flow->fn(static function (mixed $data) use ($box): mixed { $box->value = $data; return $data; }); ($flow)($ip); $flow->await(); return $box->value;
Liste de souhaits Flow optionnelle (non requise pour l'argument)Â : une fonction d'assistance run(Ip): mixed synchrone pour les tests. En attendant, collectez explicitement. N'inventez pas de mutations qui n'existent pas dans le modĂšle.
Remplacez l'environnement d'exécution. Conservez les tests.
Voici la conclusion de ce dĂ©pĂŽt â et de cet article.
MultiDriverBehaviorTest exécute des assertions identiques sous Fiber et Amp :
#[DataProvider('provideDrivers')] public function testSameExcerptUnderDifferentDrivers(DriverInterface $driver): void { $flow = (new ExcerptWorkflowFactory())->create($driver, $source, maxExcerptLength: 120); $result = FlowCollector::run($flow, new Ip(new DocumentRequest('fixture://article'))); $this->assertSame('Darkwood Flow Notes', $result->title); $this->assertStringContainsString('Jobs transform information packets', $result->excerpt); $this->assertStringEndsWith('âŠ', $result->excerpt); } public static function provideDrivers(): iterable { yield 'fiber' => [new FiberDriver()]; yield 'amp' => [new AmpDriver()]; }
Same behavioral oracle
FiberDriver
AmpDriver
Green
Green
await / driver spies
Red after swap
Si la modification de l'environnement d'exécution nécessite la réécriture des tests, ces derniers étaient liés à l'implémentation.
Cette phrase s'applique au-delà de Flow :
Si vous passez deâŠâŠet que votre suite dysfonctionne alors que la signification du produit reste inchangĂ©eâŠPHP sĂ©quentielVous testiez la pile d'appels, pas le rĂ©sultatReactPHPVous testiez des promesses / des bouclesAmpVous testiez les types Amp, pas les paquets de domaineCĂąblage du gestionnaire Framework XVous testiez l'adaptateur HTTPToute exĂ©cution futureMĂȘme diagnostic
Câest pourquoi un article comparant « ReactPHP et Amp » nâest pas pertinent pour les tests. Les performances, lâexpĂ©rience utilisateur et lâĂ©cosystĂšme sont essentiels au choix de lâenvironnement dâexĂ©cution. Ils ne devraient quasiment jamais servir de critĂšres dâĂ©valuation pour une application.
La conception de Flow rend l'expérimentation peu coûteuse : le pilote est injecté à la limite de l'usine. Les tùches restent portables. La suite logicielle reste stable.
Simulations sous agents
Les simulations ne sont pas mauvaises en soi. Ce sont les simulations non examinées, réalisées sous l'influence de la vitesse de l'agent, qui le sont.
La distinction entre stub et mock chez Bergmann prend tout son sens lorsqu'un agent peut générer cinquante objets d'attente par minute. Un stub au niveau d'un port remplace une limite d'E/S par une simulation contrÎlée et conserve les tùches réelles. Une chaßne factice remplace les collaborateurs par des objets d'attente et masque souvent le comportement que l'on souhaitait protéger.
Dans nolife-tests, le port est DocumentSource. La bonne suite de tests le simule :
$source = new InMemoryDocumentSource(['fixture://article' => $html]);
La tùche FetchJob est toujours en cours d'exécution. La tùche ParseJob est toujours en cours d'exécution. Le réseau, lui, ne fonctionne pas.
Contrairement Ă la simulation de FetchJob elle-mĂȘme : vous interrompez lâexĂ©cution du mappage URI â RawDocument. Vous invitez Ă©galement lâagent Ă simuler la tĂąche suivante, et la suivante, jusquâĂ ce quâil ne reste plus rien de rĂ©el â les « simulations Ă outrance » de Potencier, dĂ©sormais produites Ă la vitesse de la machine.
RÚgle empirique utilisée dans les compétences associées :
à faireà ne pas faireUtiliser DocumentSource comme stub / utiliser InMemoryDocumentSourceSimuler DriverInterface dans les tests d'applicationTest unitaire des transformations App\Job\*Vérification de l'ordre des appels simulés dans la chaßne de tùchesExécuter composer test:good comme CI requiseUtiliser composer test:bad comme assurance
Face à la multiplication des mocks, demandez-vous s'ils ne masquent pas un problÚme de conception. Si vous ne pouvez pas nommer un port, il se peut qu'il n'y en ait pas ; dans ce cas, le test invente une isolation que l'architecture n'a jamais justifiée.
Testez la décision en conditions réelles, ne générez pas la suite
La compĂ©tence pressure-test-decisions de Guillaume Moigneu est un protocole socratique pour les choix difficiles : cadrer la dĂ©cision, auditer les hypothĂšses, gĂ©nĂ©rer des options rĂ©elles, forcer la clĂŽture dans un enregistrement de conservation / dâexpĂ©rimentation / dâinformation-action.
Les agents ne doivent pas se contenter d'écrire des tests. Ils doivent analyser en profondeur la décision de test avant d'afficher davantage de barres vertes.
Le dĂ©pĂŽt associĂ© fournit cette compĂ©tence et y ajoute une spĂ©cialisation : pressure-test-testing-decisions. MĂȘme discipline ; le domaine consiste Ă conserver, réécrire, supprimer et expĂ©rimenter sur les tests, les mocks, les oracles et le couplage d'exĂ©cution.
npx skills add . --list # pressure-test-decisions # pressure-test-testing-decisions
Exemples de requĂȘtes pour ce dĂ©pĂŽt :
Use $pressure-test-testing-decisions on tests/Bad/ImplementationCoupledTest.php â should we keep, rewrite, or delete it?
Use $pressure-test-testing-decisions: stub DocumentSource or mock FetchJob?
Le vocabulaire technique correspond intentionnellement à l'article :
TermeSignificationOracleAssertion qui Ă©choue si le sens mĂ©tier est erronĂ©MobilierDĂ©tails d'exĂ©cution / pilote / commande d'appel qui ne concernent pas le produitThéùtre de couvertureVĂ©rifications de forme / null / instanceof qui restent vertes en cas de signification incorrecteRemplacement de piloteMĂȘme flux de travail sous Fibre vs Amp ; les tests en entreprise sont maintenus
Voici un résumé de la session tirée des exemples du dépÎt, qui se termine ainsi pour le test lié à l'implémentation :
ChampEntréeDécisionConserver à des fins éducativesBug produit qui resterait vertFonction ParseJob défectueuse / signification d'extrait incorrecteAction suivanteConfirmer que composer test:good est la tùche CI requise
VoilĂ le changement : de « gĂ©nĂ©rer des tests » à « dĂ©fendre la demande dâindemnisation ».
Le conseil de Potencier pour les nouveaux projets reste valable : laissez lâagent Ă©crire le test en premier et observez-le Ă©chouer pour la bonne raison. La couche de test de pression ajoute la question prĂ©alable : est-ce une bonne raison de sâen prĂ©occuper ?
Questions utiles à poser lors d'un barbecue, une à la fois :
-
Devrait-on mĂȘme tester cela ?
-
Quel comportement protĂ©geons-nous ? â Ce test Ă©chouerait-il pour une bonne raison ? â Cette assertion rĂ©siste-t-elle Ă une refactorisation ?
-
Protégeons-nous l'architecture ou l'implémentation ?
-
Ces maquettes masquent-elles un problĂšme de conception ?
-
Si nous remplacions la fibre par l'amplification, cela Ă©chouerait-il â et le devrait-il ?
-
Dans six mois : suite verte, produit dĂ©fectueux â quel test a menti ?
Que demander Ă un agent
Si vous ne deviez changer qu'une seule habitude aprĂšs avoir lu ceci, modifiez les instructions que vous donnez Ă l'agent.
Cahier des charges insuffisant
Ajoutez des tests unitaires pour le flux de travail d'extraction. Visez une couverture élevée.
Cahier des charges solide
Tester la nécessité d'un nouveau test. Si oui, écrire un oracle comportemental pour la signification des tùches ou des flux de travail. Simuler DocumentSource. Ne pas simuler les tùches. Ne pas effectuer d'assertions sur le pilote. Privilégier l'analyse de la fidélité des extraits avant toute modification d'implémentation.
Associer le brief aux suites du dépÎt :
furniture / theatre
Job meaning
composition meaning
runtime claim
Agent proposes a test
Pressure-test decision
Delete or park under Bad
JobBehaviorTest style
WorkflowBehaviorTest style
Prove it with MultiDriverBehaviorTest â same assertions
Le TDD fonctionne toujours. Priorisez l'analyse du comportement des tĂąches. Ne vous laissez jamais espionner par les pilotes. Renforcez les oracles, pas les pourcentages de couverture.
Les avertissements connexes de Bergmann s'inscrivent dans la mĂȘme perspective : les suites de tests lentes constituent un plafond de couverture pour les rĂ©viseurs LLM (les hypothĂšses abandonnĂ©es ne donnent lieu Ă aucun ticket) ; « plus rapide que la comprĂ©hension » signifie que les agents saisissent en quelques minutes ce que les humains mettent des heures Ă vĂ©rifier ; les tests non modifiĂ©s ne constituent que la moitiĂ© de la preuve â si une correction réécrit la suite, il faut diagnostiquer le couplage avant de se rĂ©jouir.
Limites honnĂȘtes
Ce document ne prouve pas tout. Nommer les limites permet de maintenir l'honnĂȘtetĂ© du dĂ©bat.
-
Aucun pilote de synchronisation n'est encore disponible dans Flow pour une commande run(Ip) en une seule ligne. FlowCollector est la solution de contournement explicite.
-
Les stubs aux ports restent utiles. L'abandon de tous les doublons n'est pas la revendication. L'abandon des chaĂźnes factices qui effacent les tĂąches l'est.
-
Les bibliothĂšques de pilotes nĂ©cessitent toujours des tests â dans le package Flow, pas dans chaque suite applicative. Il faut tester systĂ©matiquement chaque pilote dans l'intĂ©gration continue du produit uniquement si le produit est le pilote.
-
Les performances de l'amplificateur par rapport Ă la fibre n'ont pas Ă©tĂ© mesurĂ©es. L'important, c'est la pĂ©rennitĂ© des oracles, pas un point de repĂšre. Les stratĂ©gies de concurrence (comme MaxIpStrategy) doivent ĂȘtre dĂ©finies dans les contrats de Flow. Les tests d'application ne doivent prendre en compte la concurrence que lorsque celle-ci constitue le comportement du produit.
-
L'IA peut rĂ©diger de bons tests. Le risque rĂ©side dans le volume sans oracles â une fausse assurance due Ă la rapiditĂ© des agents â et non dans l'impossibilitĂ© d'en trouver de vĂ©ritables.
Ce que le prototype montre : un flux de travail lisible, deux environnements dâexĂ©cution, trois Ă©lĂ©ments verts inutiles, trois oracles comportementaux et des compĂ©tences qui mettent Ă lâĂ©preuve les principes de conservation/réécriture/suppression avant lâapparition de nouveaux fichiers PHPUnit.
Clonez-le. Cassez-le. Décidez.
Le dépÎt n'est pas une annexe. Il constitue le laboratoire de cet article.
composer install composer test:good # behavioral insurance composer test:bad # educational false insurance php bin/excerpt.php fiber php bin/excerpt.php amp
Ouvrez ensuite tests/Bad/ImplementationCoupledTest.php, interrompez volontairement le véritable ParseJob et observez quelles suites de tests le détectent. Cette expérience de dysfonctionnement du code est plus fructueuse qu'un simple rapport de couverture.
Explorez le répertoire skills/ et effectuez un test de résistance sur l'un de vos propres tests écologiques. Conservez le compte rendu de la décision. Supprimez tout ce qui ne fait que polir les meubles.
Conclusion
La plupart des tests unitaires dans les bases de code modifiĂ©es par des agents testent la mauvaise chose â non pas parce que PHPUnit est faible, mais parce que l'oracle a choisi l'implĂ©mentation et l'exĂ©cution plutĂŽt que le sens.
Flow dĂ©finit dĂ©jĂ la limite : les tĂąches transforment les paquets ; les pilotes les planifient. Les flux de travail rendent le comportement visible sous forme dâune chaĂźne de transformations nommĂ©es. Cette visibilitĂ© est un atout pour les tests si vous lâutilisez, mais un piĂšge si vous la masquez complĂštement.
L'IA a bouleversé l'économie. La rédaction des tests n'est plus le principal obstacle. Le véritable défi, c'est le choix d'experts fiables.
Une assurance qui résiste à un changement de conducteur est une assurance sur votre produit. Tout le reste n'est que du cirage.
Votre IA rédige des tests. Assurez-vous qu'ils soient pertinents.
Sources
â Sebastian Bergmann â Voir la vĂ©rité : tester les oracles â Sebastian Bergmann â L'intervention factice/de simulation â Sebastian Bergmann â Plus rapide que la comprĂ©hension â Sebastian Bergmann â La vitesse comme facteur de sĂ©curitĂ© â Sebastian Bergmann â Au-delĂ des meilleures pratiques
-
Guillaume Moigneu â pressure-test-decisions (Agent Skills)
-
Darkwood â Documentation Flow
-
DĂ©pĂŽt Github â Tests NoLife
đ« Fondateur de Hacker News - Nous devons repousser les limites
⥠Outils d'optimisation PHP : application partielle de fonctions, jetons et flux
đ€ Veille Darkwood - 2026-09-13
đ« Le crĂ©ateur de Hacker News - google.com/goto : la mise Ă jour anti-scraping de Google
đ€ Veille Darkwood - 2026-09-12
đ« Auteur sur arXiv - cs.LG : Quantification gĂ©nĂ©rale des changements de covariables et de concepts
đ€ Veille Darkwood - 2026-09-11
đ« Bluesky Creator - @martinfowler.com : NOUVEL ARTICLE
đ€ Veille Darkwood - 2026-09-10
đ« Bluesky Creator - @martinfowler.com : RĂ©flexions sur l'utilitĂ© de l'IA
đ« CrĂ©ateur de Hacker News - Muse â L'agent IA personnel de Meta
đ« GitHub Creator - Laravel: laravel/framework: v13.31.0
đ€ Veille Darkwood - 2026-09-09
đ« Bluesky Creator - @francoisz : StyleX rĂ©volutionne le CSS-in-JS
đ« Mistral, le crĂ©ateur de Hacker News, lĂšve 3 milliards d'euros
đ« GitHub Creator - doctrine: doctrine/orm: 3.7.0
đ€ Veille Darkwood - 2026-09-08
đ€ Veille Darkwood - 2026-09-07
đ Nolife Langage - Ne parlez pas de coĂ»t, mais d'investissement.
đ€ Veille Darkwood - 2026-09-06