[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSYTYQ0N51SVC6TTFFJWSX":3,"skill-same:01M6CSYTYQ0N51SVC6TTFFJWSX":86},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":14,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M6CSYTYQ0N51SVC6TTFFJWSX","reviewer:review",null,"Review qualité complète — PHPStan + Elegant Objects + code review + adversarial","atournayre\u002Fclaude-personas","atournayre","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F4262077?v=4","01M6CSSGYW0E0D0M3E2T6J9X2Z","Aurélien Tournayre","01M6CSSH3DENJF2XWZ41H0F43K",0,"MIT","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Freviewer\u002Fskills\u002Freview\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[24,25,5,26,27,28,29,30,31,32,33],"review","reviewer","code review","code","Bash","grep","read","edit","task","objects","2026-11-10 10:12:30",false,"---\nname: reviewer:review\ndescription: Review qualité complète — PHPStan + Elegant Objects + code review + adversarial\nmodel: sonnet\nallowed-tools: [Task, TaskCreate, TaskUpdate, TaskList, Bash, Read, Grep, Glob, Edit]\nversion: 1.0.0\nlicense: MIT\n---\n\n# Review Qualité Complète\n\nReview qualité complète du code implémenté : PHPStan, Elegant Objects, code review et analyse adversariale.\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n### 1. Créer les tâches de review\n\nUtiliser TaskCreate pour chaque tâche :\n\n```\nTaskCreate #1: Code Review — Simplicité\u002Fbugs\u002Fconventions\nTaskCreate #2: PHPStan — Résoudre erreurs niveau 9\nTaskCreate #3: Elegant Objects — Conformité principes\nTaskCreate #4: Consolider — Agréger résultats et décider\nTaskCreate #5: Examine — Adversarial review (edge cases, architecture)\n```\n\n- Utiliser `activeForm` pour chaque tâche (ex: \"Reviewing code quality\", \"Résolvant erreurs PHPStan\")\n- Les 3 premières tâches peuvent se lancer en parallèle\n- La tâche #4 dépend des 3 premières (`addBlockedBy`)\n- La tâche #5 dépend de #4 (`addBlockedBy`)\n\n### 2. Lancer les reviews en parallèle\n\nMarquer les 3 premières tâches en `in_progress`.\n\n#### Review 1 : Code Review\n\nLancer l'agent `reviewer\u002Fcode-reviewer` avec le focus sur :\n- Simplicité \u002F DRY \u002F Élégance\n- Bugs \u002F Correction fonctionnelle\n- Conventions du projet (CLAUDE.md)\n\n#### Review 2 : PHPStan\n\nLancer l'agent `reviewer\u002Fphpstan-error-resolver`.\n\n#### Review 3 : Elegant Objects\n\nLancer l'agent `reviewer\u002Felegant-objects-reviewer`.\n\n### 3. Consolider les résultats\n\nAgréger les résultats des 3 reviews.\n\nClassifier les issues :\n- **BLOQUANT** : PHPStan erreurs, bugs critiques, violations CLAUDE.md\n- **IMPORTANT** : Violations Elegant Objects majeures, code quality élevé\n- **MINEUR** : Recommandations, nitpicks\n\n### 4. Analyse adversariale (Examine)\n\nChallenge l'implémentation avec une perspective adversariale :\n\n**Questions à poser :**\n- **Edge cases** : Qu'arrive-t-il si input null\u002Fvide\u002Finvalide ?\n- **Limites** : Quelle est la taille maximale acceptable ? Le timeout ?\n- **Sécurité** : Injection possible ? Exposition de données sensibles ?\n- **Performance** : N+1 queries ? Boucles infinies possibles ?\n- **Concurrence** : Race conditions ? Deadlocks ?\n- **Rollback** : Comment annuler si ça échoue en prod ?\n- **Décisions d'architecture** : Pourquoi ce pattern ? Alternative meilleure ?\n\n**Output :**\n```\nExamine Results:\n\nEdge cases trouvés:\n- [cas] : [risque] → [suggestion]\n\nLimites détectées:\n- [limite] : [impact] → [mitigation]\n\nDécisions challengées:\n- [décision] : [alternative] → [trade-off]\n```\n\n### 5. Demander l'action utilisateur\n\n```\nQue souhaites-tu faire ?\n\n1. Fix now — Corriger toutes les issues maintenant\n2. Fix later — Noter pour plus tard et continuer\n3. Proceed — Continuer sans corrections (non recommandé)\n```\n\nAttendre la décision avant de continuer.\n\n### 6. Si \"Fix now\" choisi\n\n- Appliquer les corrections PHPStan en priorité (bloquent la CI)\n- Appliquer les corrections Elegant Objects\n- Relancer une review pour vérifier\n\n## Règles\n\n- **PHPStan erreurs = BLOQUANT** (font échouer la CI)\n- Confiance minimum 80% pour les issues code review\n- Respecter le choix utilisateur (ne pas forcer les corrections)\n- Ne JAMAIS créer de commits Git\n","# Review Qualité Complète\n\nReview qualité complète du code implémenté : PHPStan, Elegant Objects, code review et analyse adversariale.\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n### 1. Créer les tâches de review\n\nUtiliser TaskCreate pour chaque tâche :\n\n```\nTaskCreate #1: Code Review — Simplicité\u002Fbugs\u002Fconventions\nTaskCreate #2: PHPStan — Résoudre erreurs niveau 9\nTaskCreate #3: Elegant Objects — Conformité principes\nTaskCreate #4: Consolider — Agréger résultats et décider\nTaskCreate #5: Examine — Adversarial review (edge cases, architecture)\n```\n\n- Utiliser `activeForm` pour chaque tâche (ex: \"Reviewing code quality\", \"Résolvant erreurs PHPStan\")\n- Les 3 premières tâches peuvent se lancer en parallèle\n- La tâche #4 dépend des 3 premières (`addBlockedBy`)\n- La tâche #5 dépend de #4 (`addBlockedBy`)\n\n### 2. Lancer les reviews en parallèle\n\nMarquer les 3 premières tâches en `in_progress`.\n\n#### Review 1 : Code Review\n\nLancer l'agent `reviewer\u002Fcode-reviewer` avec le focus sur :\n- Simplicité \u002F DRY \u002F Élégance\n- Bugs \u002F Correction fonctionnelle\n- Conventions du projet (CLAUDE.md)\n\n#### Review 2 : PHPStan\n\nLancer l'agent `reviewer\u002Fphpstan-error-resolver`.\n\n#### Review 3 : Elegant Objects\n\nLancer l'agent `reviewer\u002Felegant-objects-reviewer`.\n\n### 3. Consolider les résultats\n\nAgréger les résultats des 3 reviews.\n\nClassifier les issues :\n- **BLOQUANT** : PHPStan erreurs, bugs critiques, violations CLAUDE.md\n- **IMPORTANT** : Violations Elegant Objects majeures, code quality élevé\n- **MINEUR** : Recommandations, nitpicks\n\n### 4. Analyse adversariale (Examine)\n\nChallenge l'implémentation avec une perspective adversariale :\n\n**Questions à poser :**\n- **Edge cases** : Qu'arrive-t-il si input null\u002Fvide\u002Finvalide ?\n- **Limites** : Quelle est la taille maximale acceptable ? Le timeout ?\n- **Sécurité** : Injection possible ? Exposition de données sensibles ?\n- **Performance** : N+1 queries ? Boucles infinies possibles ?\n- **Concurrence** : Race conditions ? Deadlocks ?\n- **Rollback** : Comment annuler si ça échoue en prod ?\n- **Décisions d'architecture** : Pourquoi ce pattern ? Alternative meilleure ?\n\n**Output :**\n```\nExamine Results:\n\nEdge cases trouvés:\n- [cas] : [risque] → [suggestion]\n\nLimites détectées:\n- [limite] : [impact] → [mitigation]\n\nDécisions challengées:\n- [décision] : [alternative] → [trade-off]\n```\n\n### 5. Demander l'action utilisateur\n\n```\nQue souhaites-tu faire ?\n\n1. Fix now — Corriger toutes les issues maintenant\n2. Fix later — Noter pour plus tard et continuer\n3. Proceed — Continuer sans corrections (non recommandé)\n```\n\nAttendre la décision avant de continuer.\n\n### 6. Si \"Fix now\" choisi\n\n- Appliquer les corrections PHPStan en priorité (bloquent la CI)\n- Appliquer les corrections Elegant Objects\n- Relancer une review pour vérifier\n\n## Règles\n\n- **PHPStan erreurs = BLOQUANT** (font échouer la CI)\n- Confiance minimum 80% pour les issues code review\n- Respecter le choix utilisateur (ne pas forcer les corrections)\n- Ne JAMAIS créer de commits Git\n",{"name":5,"model":39,"license":15,"version":40,"description":7,"allowed-tools":41},"sonnet","1.0.0",[42,43,44,45,28,46,47,48,49],"Task","TaskCreate","TaskUpdate","TaskList","Read","Grep","Glob","Edit","main","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","reviewer\u002Fskills\u002Freview","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas","https:\u002F\u002Fatournayre.github.io\u002Fclaude-personas\u002F","https:\u002F\u002Fgithub.com\u002Fatournayre","🔵, Back End Developer, @symfony  :heart:, @rectorphp :heart:,  \r\n:bug: fixer (creator sometimes 🤫), member of @afup","2026-03-02 23:42:20",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add atournayre\u002Fclaude-personas --skill \"reviewer:review\"",{"tool":64,"command":65},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill \"reviewer:review\"",{"tool":67,"command":68},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill \"reviewer:review\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Freviewer\u002Fskills\u002Freview\u002FSKILL.md",true,[72,78,82],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"ScientificFoundation.md","REFERENCE","参考文档",10136,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002FPersonal_AI_Infrastructure\u002FPacks\u002FIterativeDepth\u002Fsrc\u002FScientificFoundation.md",{"path":79,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":80,"sourceHtmlUrl":81},"TheLenses.md",6721,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002FPersonal_AI_Infrastructure\u002FPacks\u002FIterativeDepth\u002Fsrc\u002FTheLenses.md",{"path":83,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":84,"sourceHtmlUrl":85},"Workflows\u002FExplore.md",6434,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002FPersonal_AI_Infrastructure\u002FPacks\u002FIterativeDepth\u002Fsrc\u002FWorkflows\u002FExplore.md",[87,100,138,145,153,164],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":34},"01M6CSZPR0W1K1S9BX3247CZJ1","twig:make-component","Génère un Twig Component Symfony UX (classe PHP + template Twig)","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Ftwig\u002Fskills\u002Fmake-component\u002FSKILL.md",[],[94,95,30,31,96,97,29,98,99,28],"twig:make component","component","write","ux","template","php",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":120,"publishedAt":34},"01M6CSZKCYYT4EAW4CDSTS3TSH","tester:ui-test","Teste automatiquement une interface utilisateur dans Chrome : navigation, clics, validation visuelle, tests fonctionnels, responsive, comportement et debug. Génère un rapport détaillé avec screenshots et optionnellement un GIF du parcours.","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Ftester\u002Fskills\u002Fui-test\u002FSKILL.md",[106,109,112,115],{"categoryNo":107,"categoryName":108,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":110,"categoryName":111,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":113,"categoryName":114,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":116,"categoryName":117,"taxonomyType":118,"taxonomyTypeDesc":119},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[121,122,123,124,125,126,127,128,129,130,131,28,132,133,134,135,30,96,136,137],"test","ui","tester","ui test","tester:ui test","MCP","debug","create","update","validation","messages","plan","tool","page","find","javascript","chrome",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":34},"01M6CSZGQ8X9XNXRBYX0AA3CYE","symfony:voter","Genere un Voter de securite Symfony pour le controle d'acces granulaire","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fvoter\u002FSKILL.md",[],[140,28,29,30,96,31],{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":34},"01M6CSZEJ3BNHCNZT18SYFGDME","symfony:message","Genere un Message Symfony Messenger avec son Handler pour traitement asynchrone","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fmessage\u002FSKILL.md",[],[147,152,28,29,30,96,31],"message",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":162,"publishedAt":34},"01M6CSZBWSK9M6YMJX886BVWYF","symfony:mailer","Genere un email Symfony (TemplatedEmail ou Notification) avec template Twig","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fmailer\u002FSKILL.md",[159],{"categoryNo":160,"categoryName":161,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",[155,31,163,28,98,29,30,96],"email",{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":170,"publishedAt":34},"01M6CSZ9DXMYZ9HTRE8A324AWG","symfony:form","Genere un FormType Symfony avec contraintes de validation et options","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fform\u002FSKILL.md",[],[166,28,29,30,96,31,171,130],"options"]