[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSVC1ZW30DDFZ8VMEYAAK6":3,"skill-same:01M6CSVC1ZW30DDFZ8VMEYAAK6":143},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":104,"commitSha":105,"skillDirectory":106,"forksCount":14,"repositoryHtmlUrl":107,"repositoryHomepageUrl":6,"ownerHtmlUrl":108,"ownerBlogUrl":6,"ownerDescription":109,"updatedAt":110,"install":111,"resources":124},"01M6CSVC1ZW30DDFZ8VMEYAAK6","volontariapp-proto-contract-evolution",null,"Modifier un contrat Protobuf de proto-registry (champ, message, enum, RPC) sans casser la compatibilité wire, puis suivre la cascade proto-registry, PR automatique dans npm-packages, publication, consommateurs. À utiliser avant toute édition d'un .proto.","Volontariapp\u002Fmeta","Volontariapp","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F263673138?v=4","01M6CSQNQ3J4SKRWA512JQF5K7","VolontariApp","01M6CSQNV8T2M4PR5A22DKHY5T",0,"MIT","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-proto-contract-evolution\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"volontariapp proto contract evolution","evolution","npm","registry","sans","sync","yaml","playbook","github","message","packages","analyze","lint","code","workflows","rpc","ci","pr","grpc","protobuf","2026-11-10 10:12:30",false,"---\nname: volontariapp-proto-contract-evolution\ndescription: \"Modifier un contrat Protobuf de proto-registry (champ, message, enum, RPC) sans casser la compatibilité wire, puis suivre la cascade proto-registry, PR automatique dans npm-packages, publication, consommateurs. À utiliser avant toute édition d'un .proto.\"\ntype: Playbook\ntitle: Proto Contract Evolution\ntags: [grpc, protobuf, buf, stop-rule]\nstatus: stable\npaths:\n  - proto-registry\u002Fbuf.yaml\n  - proto-registry\u002Fbuf.gen.yaml\n  - \"proto-registry\u002F.github\u002Fworkflows\u002F**\"\n  - \"proto-registry\u002Fproto\u002F**\"\nmesh_keys:\n  - analyze_grpc\n  - proto-registry\n  - .proto\n  - contracts\ngenerated:\n  by: claude-code\u002Fclaude-opus-5-5\n  at: \"2026-10-06T08:22:12Z\"\nsources:\n  - id: buf\n    resource: proto-registry\u002Fbuf.yaml\n    title: \"buf.yaml (lint STANDARD, pas de section breaking)\"\n  - id: bufgen\n    resource: proto-registry\u002Fbuf.gen.yaml\n    title: buf.gen.yaml (ts_proto)\n  - id: proto-ci\n    resource: proto-registry\u002F.github\u002Fworkflows\n    title: sync-to-npm.yml et emergency-reset.yml\n  - id: proto-sync\n    resource: ci-tools\u002F.github\u002Fworkflows\u002Fproto-sync.yml\n    title: proto-sync.yml réutilisable (ci-tools)\n  - id: contrats\n    resource: docs\u002Fstockage-fichiers\u002F08-contrats-et-evolutions.md\n    title: \"Contrats et évolutions (numérotation, trou du champ 5)\"\nverified:\n  - by: claude-code\u002Fclaude-sonnet-5-5\n    at: \"2026-10-06T15:41:59Z\"\n    digest: 603980fa2fea4e5d\n  - by: claude-code\u002Fagent\n    at: \"2026-10-12T12:03:25Z\"\n    digest: 603980fa2fea4e5d\n  - by: \"human:victor\"\n    at: \"2026-10-19T08:45:16Z\"\n    digest: 935ad3f0ccce0f4e\n  - by: claude-code\u002Fagent\n    at: \"2026-10-30T10:33:27Z\"\n    digest: f8b99b4837ee3d04\n  - by: claude-code\u002Fagent\n    at: \"2026-11-08T11:15:19Z\"\n    digest: 102e056ce670c3c9\n---\n\n# Proto Contract Evolution & Cycle de Propagation gRPC\n\nDans Volontariapp, `proto-registry` est l'unique **Source de Vérité (SSOT)** de tous les contrats de communication inter-services synchrones (gRPC).\n\n---\n\n## 1. Avant de modifier un fichier `.proto`\n\n1. **Identifier les consommateurs gRPC en mémoire (MCP Server) :**\n   Ne fais pas de recherche plein texte manuelle. Utilise directement l'outil MCP `analyze_grpc` pour localiser en $\u003C 1\\text{ms}$ le contrat, les clients dans l'API Gateway et les contrôleurs dans les microservices :\n   ```json\n   analyze_grpc({ \"target\": \"SignUp\" })\n   analyze_grpc({ \"target\": \"UserService\" })\n   ```\n2. **Vérification de non-régression de compatibilité binaire :**\n   Exécute toujours `buf lint` et `buf breaking` par rapport au dernier commit de `main` :\n   ```bash\n   buf lint\n   buf breaking --against '.git#branch=main'\n   ```\n\n---\n\n## 2. Le Cycle de Propagation Automatique (proto-registry -> npm-packages)\n\n```mermaid\nflowchart TD\n    A[\"1. Modification dans proto-registry (.proto)\"] --> B[\"2. Validation locale (buf lint)\"]\n    B --> C[\"3. Merge sur main dans proto-registry\"]\n    C --> D[\"4. CI : sync-to-npm.yml appelle proto-sync.yml de ci-tools\"]\n    D --> E[\"5. Génération auto de PR dans npm-packages\\n(@volontariapp\u002Fcontracts & contracts-nest)\"]\n    E --> F[\"6. Publication de la version par la CI de npm-packages\"]\n    F --> G[\"7. Reprise : yarn up dans api-gateway & microservices\"]\n```\n\n> [!CAUTION]\n> ### 🛑 RÈGLE BLOQUANTE DU STOP IMMÉDIAT SUR PROTO-REGISTRY\n> - Dès que tu as fini de modifier un fichier `.proto` dans `proto-registry` : **TU T'ARRÊTES**.\n> - **INTERDICTION FORMELLE** d'aller toucher au code de `api-gateway` ou des microservices `ms-*` en avance.\n> - **Pourquoi ?** Parce que le code TypeScript n'est PAS compilé localement : il est généré automatiquement par la CI de `proto-registry` qui crée une Pull Request dans `npm-packages` !\n> - **Ce n'est qu'APRÈS** le merge de `proto-registry` sur `main`, la génération de la PR dans `npm-packages`, et la publication effective du nouveau `@volontariapp\u002Fcontracts` par la CI que tu as le droit de mettre à jour les microservices consommateurs via `yarn up`.\n\n---\n\n## 3. Gestion des Changements Compatibles vs Cassants\n\n- **Changements additifs (Rétrocompatibles) :**\n  - Ajout d'un nouveau champ optionnel avec un nouveau tag protobuf (ex: `string bio = 5;`).\n  - Ajout d'une nouvelle méthode `rpc`.\n  - Ces changements peuvent être déployés sans risque de rupture d'exécution.\n- **Changements cassants (Breaking Changes) :**\n  - Renommage ou suppression d'un champ existant.\n  - Changement de numéro de tag d'un champ.\n  - Changement de type d'un champ (ex: `int32` -> `string`).\n  - **Ordre de déploiement obligatoire :** Les consommateurs (API Gateway, MS) doivent d'abord cesser de lire\u002Fécrire le champ avant que celui-ci ne soit définitivement retiré de `proto-registry`.\n  - Pour toute suppression ou renommage, suivre impérativement le [Playbook de Dépréciation Protobuf](\u002Fvolontariapp-proto-contract-evolution\u002Freferences\u002Fdeprecation-playbook.md) (procédure séquentielle en 3 phases : `[deprecated = true]`, extinction des consommateurs, puis `reserved \u003Ctag>; reserved \"\u003Cnom>\";`).\n\n---\n\n## 4. Règles d'Or\n\n- [ ] **Ne JAMAIS renuméroter un tag existant** sous prétexte de \"nettoyer\" la numérotation des champs protobuf (cela corrompt la désérialisation binaire wire gRPC).\n- [ ] **Toujours vérifier `buf breaking`** avant de soumettre une modification de schéma.\n- [ ] **Respecter la cascade :** `proto-registry` $\\rightarrow$ PR dans `npm-packages` $\\rightarrow$ publication NPM $\\rightarrow$ microservices consommateurs.\n\n## 5. Faits vérifiés dans le code (2026-10-06)\n\n| Sujet | Réalité |\n| :--- | :--- |\n| CI de `proto-registry` | `sync-to-npm.yml` délègue à `proto-sync.yml` de `ci-tools`[^proto-sync] : sur PR, **`buf lint` uniquement** ; sur `main`, lint puis `buf generate` et PR « chore: sync proto typings » dans `npm-packages` (`contracts` et `contracts-nest`). **`buf breaking` n'est lancé nulle part en CI** : c'est à toi de le lancer avant de rendre la main. `emergency-reset.yml` régénère tout en cas de désynchronisation[^proto-ci]. |\n| `buf breaking` local | `buf.yaml` n'a pas de section `breaking` : catégorie par défaut `FILE`[^buf]. Elle ne détecte pas la réutilisation d'un numéro de champ supprimé sans `reserved`. |\n| Lint | `STANDARD` (dont `RPC_REQUEST_RESPONSE_UNIQUE` : un message de réponse par RPC, pas de réponse partagée) sauf `PACKAGE_VERSION_SUFFIX`, `FILE_LOWER_SNAKE_CASE`, `RPC_REQUEST_STANDARD_NAME`, `RPC_RESPONSE_STANDARD_NAME`[^buf]. Les enums suivent `STANDARD` : préfixe du type et valeur `_UNSPECIFIED = 0`. |\n| Génération | `ts_proto` vers `gen\u002Fts`, options `nestJs=true`, `outputClientImpl=false`, `useDate=false`, `addMetadata=true`, `importSuffix=.js`[^bufgen]. Ne jamais éditer `contracts\u002Fsrc` ni `contracts-nest\u002Fsrc` (sauf `grpc.helpers.ts`). |\n| Structure | Domaines `common`, `user`, `event`, `post`, `social`, `storage`, `ranking`. Un domaine = 5 fichiers : `\u003Cd>.proto` (entité), `.command.proto`, `.query.proto`, `.responses.proto`, `.services.proto`. Exception : `post\u002Fcomment*.proto` sans `comment.services.proto`, RPC exposés par `post.services.proto`. Un nouveau champ va dans le fichier du bon type. |\n| Dette connue | Aucun `reserved` dans le registre ; `CreateEventCommand` a un trou au champ 5 (ancien `location`) à réserver[^contrats]. |\n\n### Checklist avant de rendre la main\n\n```bash\ncd proto-registry\nbuf lint\nbuf breaking --against '.git#branch=main'\n```\n\nPuis `analyze_grpc({ \"target\": \"\u003CService ou Method>\", \"base\": \"main\" })` : liste handlers et clients, et ajoute la vérification wire-format avec les enums (renumérotation, suppression sans `reserved`).\n\n- Ajout de champ : numéro **explicite**, au-dessus du maximum actuel du message, jamais un numéro libéré.\n- Suppression : `reserved \u003Cn>;` et `reserved \"\u003Cnom>\";` dans le même commit.\n- Nouvel enum : préfixé, `\u003CTYPE>_UNSPECIFIED = 0`.\n\n[^proto-sync]: proto-sync.yml réutilisable (ci-tools)\n[^proto-ci]: sync-to-npm.yml et emergency-reset.yml\n[^buf]: buf.yaml (lint STANDARD, pas de section breaking)\n[^bufgen]: buf.gen.yaml (ts_proto)\n[^contrats]: Contrats et évolutions (numérotation, trou du champ 5)\n","# Proto Contract Evolution & Cycle de Propagation gRPC\n\nDans Volontariapp, `proto-registry` est l'unique **Source de Vérité (SSOT)** de tous les contrats de communication inter-services synchrones (gRPC).\n\n---\n\n## 1. Avant de modifier un fichier `.proto`\n\n1. **Identifier les consommateurs gRPC en mémoire (MCP Server) :**\n   Ne fais pas de recherche plein texte manuelle. Utilise directement l'outil MCP `analyze_grpc` pour localiser en $\u003C 1\\text{ms}$ le contrat, les clients dans l'API Gateway et les contrôleurs dans les microservices :\n   ```json\n   analyze_grpc({ \"target\": \"SignUp\" })\n   analyze_grpc({ \"target\": \"UserService\" })\n   ```\n2. **Vérification de non-régression de compatibilité binaire :**\n   Exécute toujours `buf lint` et `buf breaking` par rapport au dernier commit de `main` :\n   ```bash\n   buf lint\n   buf breaking --against '.git#branch=main'\n   ```\n\n---\n\n## 2. Le Cycle de Propagation Automatique (proto-registry -> npm-packages)\n\n```mermaid\nflowchart TD\n    A[\"1. Modification dans proto-registry (.proto)\"] --> B[\"2. Validation locale (buf lint)\"]\n    B --> C[\"3. Merge sur main dans proto-registry\"]\n    C --> D[\"4. CI : sync-to-npm.yml appelle proto-sync.yml de ci-tools\"]\n    D --> E[\"5. Génération auto de PR dans npm-packages\\n(@volontariapp\u002Fcontracts & contracts-nest)\"]\n    E --> F[\"6. Publication de la version par la CI de npm-packages\"]\n    F --> G[\"7. Reprise : yarn up dans api-gateway & microservices\"]\n```\n\n> [!CAUTION]\n> ### 🛑 RÈGLE BLOQUANTE DU STOP IMMÉDIAT SUR PROTO-REGISTRY\n> - Dès que tu as fini de modifier un fichier `.proto` dans `proto-registry` : **TU T'ARRÊTES**.\n> - **INTERDICTION FORMELLE** d'aller toucher au code de `api-gateway` ou des microservices `ms-*` en avance.\n> - **Pourquoi ?** Parce que le code TypeScript n'est PAS compilé localement : il est généré automatiquement par la CI de `proto-registry` qui crée une Pull Request dans `npm-packages` !\n> - **Ce n'est qu'APRÈS** le merge de `proto-registry` sur `main`, la génération de la PR dans `npm-packages`, et la publication effective du nouveau `@volontariapp\u002Fcontracts` par la CI que tu as le droit de mettre à jour les microservices consommateurs via `yarn up`.\n\n---\n\n## 3. Gestion des Changements Compatibles vs Cassants\n\n- **Changements additifs (Rétrocompatibles) :**\n  - Ajout d'un nouveau champ optionnel avec un nouveau tag protobuf (ex: `string bio = 5;`).\n  - Ajout d'une nouvelle méthode `rpc`.\n  - Ces changements peuvent être déployés sans risque de rupture d'exécution.\n- **Changements cassants (Breaking Changes) :**\n  - Renommage ou suppression d'un champ existant.\n  - Changement de numéro de tag d'un champ.\n  - Changement de type d'un champ (ex: `int32` -> `string`).\n  - **Ordre de déploiement obligatoire :** Les consommateurs (API Gateway, MS) doivent d'abord cesser de lire\u002Fécrire le champ avant que celui-ci ne soit définitivement retiré de `proto-registry`.\n  - Pour toute suppression ou renommage, suivre impérativement le [Playbook de Dépréciation Protobuf](\u002Fvolontariapp-proto-contract-evolution\u002Freferences\u002Fdeprecation-playbook.md) (procédure séquentielle en 3 phases : `[deprecated = true]`, extinction des consommateurs, puis `reserved \u003Ctag>; reserved \"\u003Cnom>\";`).\n\n---\n\n## 4. Règles d'Or\n\n- [ ] **Ne JAMAIS renuméroter un tag existant** sous prétexte de \"nettoyer\" la numérotation des champs protobuf (cela corrompt la désérialisation binaire wire gRPC).\n- [ ] **Toujours vérifier `buf breaking`** avant de soumettre une modification de schéma.\n- [ ] **Respecter la cascade :** `proto-registry` $\\rightarrow$ PR dans `npm-packages` $\\rightarrow$ publication NPM $\\rightarrow$ microservices consommateurs.\n\n## 5. Faits vérifiés dans le code (2026-10-06)\n\n| Sujet | Réalité |\n| :--- | :--- |\n| CI de `proto-registry` | `sync-to-npm.yml` délègue à `proto-sync.yml` de `ci-tools`[^proto-sync] : sur PR, **`buf lint` uniquement** ; sur `main`, lint puis `buf generate` et PR « chore: sync proto typings » dans `npm-packages` (`contracts` et `contracts-nest`). **`buf breaking` n'est lancé nulle part en CI** : c'est à toi de le lancer avant de rendre la main. `emergency-reset.yml` régénère tout en cas de désynchronisation[^proto-ci]. |\n| `buf breaking` local | `buf.yaml` n'a pas de section `breaking` : catégorie par défaut `FILE`[^buf]. Elle ne détecte pas la réutilisation d'un numéro de champ supprimé sans `reserved`. |\n| Lint | `STANDARD` (dont `RPC_REQUEST_RESPONSE_UNIQUE` : un message de réponse par RPC, pas de réponse partagée) sauf `PACKAGE_VERSION_SUFFIX`, `FILE_LOWER_SNAKE_CASE`, `RPC_REQUEST_STANDARD_NAME`, `RPC_RESPONSE_STANDARD_NAME`[^buf]. Les enums suivent `STANDARD` : préfixe du type et valeur `_UNSPECIFIED = 0`. |\n| Génération | `ts_proto` vers `gen\u002Fts`, options `nestJs=true`, `outputClientImpl=false`, `useDate=false`, `addMetadata=true`, `importSuffix=.js`[^bufgen]. Ne jamais éditer `contracts\u002Fsrc` ni `contracts-nest\u002Fsrc` (sauf `grpc.helpers.ts`). |\n| Structure | Domaines `common`, `user`, `event`, `post`, `social`, `storage`, `ranking`. Un domaine = 5 fichiers : `\u003Cd>.proto` (entité), `.command.proto`, `.query.proto`, `.responses.proto`, `.services.proto`. Exception : `post\u002Fcomment*.proto` sans `comment.services.proto`, RPC exposés par `post.services.proto`. Un nouveau champ va dans le fichier du bon type. |\n| Dette connue | Aucun `reserved` dans le registre ; `CreateEventCommand` a un trou au champ 5 (ancien `location`) à réserver[^contrats]. |\n\n### Checklist avant de rendre la main\n\n```bash\ncd proto-registry\nbuf lint\nbuf breaking --against '.git#branch=main'\n```\n\nPuis `analyze_grpc({ \"target\": \"\u003CService ou Method>\", \"base\": \"main\" })` : liste handlers et clients, et ajoute la vérification wire-format avec les enums (renumérotation, suppression sans `reserved`).\n\n- Ajout de champ : numéro **explicite**, au-dessus du maximum actuel du message, jamais un numéro libéré.\n- Suppression : `reserved \u003Cn>;` et `reserved \"\u003Cnom>\";` dans le même commit.\n- Nouvel enum : préfixé, `\u003CTYPE>_UNSPECIFIED = 0`.\n\n[^proto-sync]: proto-sync.yml réutilisable (ci-tools)\n[^proto-ci]: sync-to-npm.yml et emergency-reset.yml\n[^buf]: buf.yaml (lint STANDARD, pas de section breaking)\n[^bufgen]: buf.gen.yaml (ts_proto)\n[^contrats]: Contrats et évolutions (numérotation, trou du champ 5)\n",{"name":5,"tags":49,"type":52,"paths":53,"title":58,"status":59,"sources":60,"verified":78,"generated":96,"mesh_keys":99,"description":7},[42,43,50,51],"buf","stop-rule","Playbook",[54,55,56,57],"proto-registry\u002Fbuf.yaml","proto-registry\u002Fbuf.gen.yaml","proto-registry\u002F.github\u002Fworkflows\u002F**","proto-registry\u002Fproto\u002F**","Proto Contract Evolution","stable",[61,63,66,70,74],{"id":50,"title":62,"resource":54},"buf.yaml (lint STANDARD, pas de section breaking)",{"id":64,"title":65,"resource":55},"bufgen","buf.gen.yaml (ts_proto)",{"id":67,"title":68,"resource":69},"proto-ci","sync-to-npm.yml et emergency-reset.yml","proto-registry\u002F.github\u002Fworkflows",{"id":71,"title":72,"resource":73},"proto-sync","proto-sync.yml réutilisable (ci-tools)","ci-tools\u002F.github\u002Fworkflows\u002Fproto-sync.yml",{"id":75,"title":76,"resource":77},"contrats","Contrats et évolutions (numérotation, trou du champ 5)","docs\u002Fstockage-fichiers\u002F08-contrats-et-evolutions.md",[79,83,86,90,93],{"at":80,"by":81,"digest":82},"2026-10-06T15:41:59Z","claude-code\u002Fclaude-sonnet-5-5","603980fa2fea4e5d",{"at":84,"by":85,"digest":82},"2026-10-12T12:03:25Z","claude-code\u002Fagent",{"at":87,"by":88,"digest":89},"2026-10-19T08:45:16Z","human:victor","935ad3f0ccce0f4e",{"at":91,"by":85,"digest":92},"2026-10-30T10:33:27Z","f8b99b4837ee3d04",{"at":94,"by":85,"digest":95},"2026-11-08T11:15:19Z","102e056ce670c3c9",{"at":97,"by":98},"2026-10-06T08:22:12Z","claude-code\u002Fclaude-opus-5-5",[100,101,102,103],"analyze_grpc","proto-registry",".proto","contracts","main","6b8f03b57018fa66da4666071dc17c1577ff45e8",".agents\u002Fskills\u002Fvolontariapp-proto-contract-evolution","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta","https:\u002F\u002Fgithub.com\u002FVolontariapp","Volontariapp — Application Web\u002FMobile scalabelle construite sur une architecture microservices événementielle (Event-Driven Architecture), implémentant le Trans","2026-11-10 23:40:22",{"source":8,"skillName":5,"commands":112,"prompt":122,"zipAvailable":123},[113,116,119],{"tool":114,"command":115},"npx","npx skills add Volontariapp\u002Fmeta --skill volontariapp-proto-contract-evolution",{"tool":117,"command":118},"bunx","bunx skills add Volontariapp\u002Fmeta --skill volontariapp-proto-contract-evolution",{"tool":120,"command":121},"pnpm","pnpm dlx skills add Volontariapp\u002Fmeta --skill volontariapp-proto-contract-evolution","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-proto-contract-evolution\u002FSKILL.md",true,[125,131,135,139],{"path":126,"resourceType":127,"resourceTypeDesc":128,"sizeBytes":129,"sourceHtmlUrl":130},"index.md","REFERENCE","参考文档",946,"https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-proto-contract-evolution\u002Findex.md",{"path":132,"resourceType":127,"resourceTypeDesc":128,"sizeBytes":133,"sourceHtmlUrl":134},"log.md",2081,"https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-proto-contract-evolution\u002Flog.md",{"path":136,"resourceType":127,"resourceTypeDesc":128,"sizeBytes":137,"sourceHtmlUrl":138},"references\u002Fdeprecation-playbook.md",5511,"https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-proto-contract-evolution\u002Freferences\u002Fdeprecation-playbook.md",{"path":140,"resourceType":127,"resourceTypeDesc":128,"sizeBytes":141,"sourceHtmlUrl":142},"references\u002Flessons.md",2065,"https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-proto-contract-evolution\u002Freferences\u002Flessons.md",[144,167,194,219,239,257],{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":44},"01M6CSW3Y5ZHVBF5BX7S5BAVS0","volontariapp-user-account-deletion","Suppression de compte en deux temps (PENDING_DELETION): requestDeletionWithUserDeleted, finalizeDeletion, fan-out de user.deleted vers les domaines et gather ws. A utiliser pour tout changement de domain-user touchant la suppression, le statut ou le cycle de vie d'un user.","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-user-account-deletion\u002FSKILL.md",[],[151,152,153,154,155,156,157,158,159,37,160,161,26,162,163,164,165,166,34],"user","volontariapp user account deletion","account deletion","deletion","gather","en","sonnet","pending","de","claude-code","reference","user-account-deletion","src","cycle","domain","npm-packages",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":178,"publishedAt":44},"01M6CSV99ET2Z9W4W4DAK4CMQP","volontariapp-meta-scripts","Utiliser et faire evoluer la CLI Node de meta (setup, doctor, migrate, certs, repos, bump) et le manifeste repos.json, source unique des repos et unites du workspace.","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-meta-scripts\u002FSKILL.md",[173],{"categoryNo":174,"categoryName":175,"taxonomyType":176,"taxonomyTypeDesc":177},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[179,180,181,182,183,184,185,186,187,188,189,190,37,191,160,192,193],"Meta","volontariapp meta scripts","install","shell","json","workspace","node","bump","cli","doctor","draft","repos","migrate","setup","meta-scripts",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":198,"categories":199,"keywords":203,"publishedAt":44},"01M6CSTPHNTGE0WF5CPE8W7ZYQ","volontariapp-implement-async-event-flow","Guide pas-à-pas pour concevoir et implémenter un flux asynchrone complet (messaging -> outbox -> post-processors -> ws-service -> client).","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-implement-async-event-flow\u002FSKILL.md",[200],{"categoryNo":201,"categoryName":202,"taxonomyType":176,"taxonomyTypeDesc":177},"01JBSEEDCAT000000000000009","前端开发",[204,205,206,207,208,163,209,210,27,211,212,166,213,214,34,215,216,37,217,218],"implement","volontariapp implement async event flow","flow","async","event","mapping","flux","messaging","flows","shared","outbox","processor","architecture","runner","streams",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":223,"categories":224,"keywords":228,"publishedAt":44},"01M6CSRQHS0T9955M8CTA5BYJQ","research","Investigate a question against high-trust primary sources and capture the findings as a Markdown file in the repo. Use when the user wants a topic researched, docs or API facts gathered, or reading legwork delegated to a background agent.","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fplugins\u002Fmatt-pocock\u002Fskills\u002Fresearch\u002FSKILL.md",[225],{"categoryNo":226,"categoryName":227,"taxonomyType":176,"taxonomyTypeDesc":177},"01JBSEEDCAT000000000000021","资料检索与研究",[221,229,230,231,151,232,233,234,235,236,237,238],"investigate","trust","api","file","repo","markdown","docs","capture","use","question",{"skillNo":240,"name":241,"nameZh":6,"description":242,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":243,"categories":244,"keywords":248,"publishedAt":44},"01M6CSRMZ82M1YK96Z4SW1STTD","prototype","Build a throwaway prototype to answer a design question. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like.","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fplugins\u002Fmatt-pocock\u002Fskills\u002Fprototype\u002FSKILL.md",[245],{"categoryNo":246,"categoryName":247,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000032","设计师",[241,249,250,151,251,237,252,238,253,254,255,256],"build","check","ui","look","design","explore","model","state",{"skillNo":258,"name":259,"nameZh":6,"description":260,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":261,"categories":262,"keywords":263,"publishedAt":44},"01M6CSRAZC0EJAK565DMY17TC7","grilling","Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases.","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fplugins\u002Fmatt-pocock\u002Fskills\u002Fgrilling\u002FSKILL.md",[],[259,264,265,151,237,266,267,268,269],"decision","idea","grill","plan","thinking","test"]