Communitygithub.com

curiositech/windags-skills

Choisir et appliquer une stratégie de versioning pour API HTTP qui ne casse pas les clients — versions épinglées à une date comme Stripe, l'en-tête Deprecation/Sunset (RFC 9745 + RFC 8594), approches par URI, en-tête ou type de média, et le motif de transformation de version. Basé sur l'architecture publiée par Stripe et les RFC de l'IETF.

Qu'est-ce que windags-skills ?

Cette compétence fournit un guide complet pour choisir et mettre en œuvre une stratégie de versioning d'API HTTP qui minimise l'impact des changements sur les clients. Elle s'appuie sur le modèle de Stripe (versions épinglées à une date) comme solution principale pour les API publiques à longue durée de vie, et détaille d'autres approches comme le versioning par segment d'URI, l'en-tête Accept, ou le paramètre de requête. La compétence couvre également l'utilisation des en-têtes Deprecation (RFC 9745) et Sunset (RFC 8594) pour communiquer les dépréciations aux clients, ainsi que le motif de transformation de version qui permet de maintenir un code propre tout en supportant plusieurs versions. Destinée aux développeurs et architectes, elle offre un arbre de décision, une comparaison de stratégies, des anti-patrons et des tests qualité pour garantir une évolution d'API sans douleur pour les consommateurs. Elle s'applique aux API RESTful internes et publiques, en privilégiant l'évolution par ajout et les signaux d'en-tête plutôt que les migrations lourdes de version.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/curiositech/windags-skills/tree/HEAD/skills/api-versioning-strategy

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Stratégie de versioning d'API

TL;DR : Les versions basées sur une date, épinglées par clé API (modèle de Stripe) battent /v1/, /v2/ pour les API publiques à longue durée de vie, car elles permettent de faire de petites modifications cassantes sans forcer les clients à migrer vers une nouvelle arborescence. Pour les API internes, l'évolution par ajout associée aux en-têtes Deprecation et Sunset (RFC 9745, RFC 8594) suffit généralement. Annoncez toujours, dépréciez toujours avec une date, ne retirez jamais sans préavis.


Accès rapide par problème

SymptômeSection
« Besoin de modifier un champ mais j'ai 100 000 clés API »Versions épinglées à une date
« Dois-je utiliser /v1/ ou Accept: application/vnd.foo.v2+json ? »Comparaison des stratégies
« Comment indiquer aux clients qu'un point d'accès va disparaître ? »Deprecation + Sunset
« Maintenir 6 versions dans le code nous tue »Transformateurs de version
« API interne — avons-nous vraiment besoin de versioning ? »Interne vs Public

Diagramme de décision

flowchart TD
  A[Besoins de modifier le comportement de l'API] --> B{Uniquement par ajout ?<br/>nouveau champ, nouveau point d'accès, nouveau paramètre optionnel}
  B -->|Oui| C[Publier simplement<br/>pas de versioning nécessaire]
  B -->|Non, cassant| D{API publique<br/>+ nombreux clients opaques ?}
  D -->|Non, interne/peu de clients| E[Coordonner la migration<br/>+ en-têtes Deprecation/Sunset]
  D -->|Oui, publique| F{Pouvez-vous fournir une couche<br/>compatible par requête ?}
  F -->|Oui, vous avez un transformateur| G[Version épinglée à une date<br/>Modèle Stripe]
  F -->|Non, profonde réécriture| H[Incrémentation du numéro de version majeure dans l'URI<br/>/v1 → /v2]
  E --> I[Définir Deprecation: @timestamp<br/>+ Sunset: HTTP-date<br/>+ Link: rel=deprecation]
  G --> I
  H --> I

1. Versions épinglées à une date (Modèle de Stripe)

Stripe a publié son architecture dans API versioning at Stripe :

La première fois qu'un utilisateur effectue une requête API, son compte est automatiquement épinglé à la version la plus récente disponible, et à partir de là, chaque appel API qu'il effectue se voit attribuer cette version de manière implicite.

Les versions sont des versions glissantes nommées avec la date de leur publication (par exemple, 2017-05-24).

Les propriétés clés :

PropriétéPourquoi ça marche
Version par défaut par compte (définie au premier appel)Les nouveaux clients sont automatiquement épinglés à la dernière version ; les clients existants ne sont pas cassés lors de la publication d'une modification
L'en-tête Stripe-Version écrase l'épingle par requêtePermet une migration progressive du client : le SDK peut adhérer à une nouvelle version avant que le compte ne le fasse
Noms basés sur une date (2024-04-10)Indique la récence ; pas de débat sur ce que signifie « v3 » ; permet un nombre arbitraire de petites modifications cassantes au lieu de les accumuler pour une grosse version « v3 »
Chemin de mise à niveau via le tableau de bordLe client peut prévisualiser la différence, puis mettre à niveau la version par défaut de son compte

C'est la seule approche qui passe à l'échelle pour les API publiques à très longue durée de vie (Stripe a des versions vieilles d'une décennie). Cela vous coûte en complexité interne (le motif transformateur de la §4) mais épargne à vos clients le cycle perpétuel de migration /v1/ → /v2/.


2. Comparaison des stratégies de versioning

StratégieOù se trouve la versionAvantageInconvénientIdéal pour
Segment d'URI (/v1/, /v2/)CheminCompatible cache (URL différente = entrée de cache différente) ; aucune configuration clientImpossible de faire de petites modifications ; force un fork de l'arborescence ; les URL ne sont plus des « identifiants de ressource stables » (selon Fielding)API internes, API publiques rarement modifiées
En-tête personnalisé (Stripe-Version: 2024-04-10)En-tête de requêteBeaucoup de versions peu coûteuses ; granularité par requêteImpossible de partager des URLs avec la version intégrée ; plus difficile à tester dans la barre d'adresse du navigateurAPI publiques à grande échelle
Type de média Accept (Accept: application/vnd.foo.v2+json)En-tête Accept standard« Conforme à la spécification » selon HTTP ; réutilise le mécanisme de négociation de contenuDifficile à configurer ; prise en charge variable par les outils ; débogage via curl verbeuxAPI hypermédia, conceptions véritablement REST
Paramètre de requête (?version=2)URLFacile à tester ; visible dans les journauxPollue l'URL ; sémantiquement incorrect (la version n'est pas une propriété de la ressource)Prototypage rapide uniquement
Pas de versioning, uniquement par ajoutn/aAucun surcoût ; aucune coordination clientImpossible de faire une modification cassante sans un nouveau point d'accèsMicroservices internes avec déploiement partagé

Choisissez en fonction de votre contrainte :

  • « Nous faisons de petites modifications cassantes fréquemment » → version basée sur une date via en-tête (Stripe)
  • « Nous faisons une grosse réécriture tous les 5 ans » → segment d'URI (/v1/, /v2/)
  • « Nous ne cassons jamais, nous ajoutons seulement » → pas de versioning + évolution par ajout

3. La paire d'en-têtes Deprecation/Sunset

Deux RFC de l'IETF couvrent le signal de cycle de vie :

En-tête Sunset — RFC 8594

La valeur Sunset est un horodatage au format HTTP-date, tel que défini dans la Section 7.1.1.1 de [RFC7231], et DEVRAIT être un horodatage dans le futur.

Sunset: Sat, 31 Dec 2026 23:59:59 GMT

Indique que « la ressource devrait devenir indisponible à un moment donné dans le futur. » Les clients DEVRAIENT traiter l'horodatage comme une indication, non comme un contrat ferme.

En-tête Deprecation — RFC 9745

Deprecation: @1735689599
Sunset: Sun, 31 Dec 2026 23:59:59 GMT
Link: <https://api.example.com/docs/migrate-v1-to-v2>; rel="deprecation"

La valeur Deprecation est un horodatage Unix (secondes, préfixé par @ conformément aux champs structurés). Il peut être dans le passé (« déjà déprécié ») ou dans le futur (« sera déprécié »). Les DOIT :

  • DOIT utiliser le format de date à champ structuré selon RFC 9651
  • Sunset NE DOIT PAS être antérieur à Deprecation — la spécification est explicite ; c'est une contrainte d'ordre temporel
  • DEVRAIT inclure un Link avec rel="deprecation" pointant vers la documentation de migration

Le fait d'envoyer Deprecation ne change pas le comportement de la ressource — c'est un signal, pas une dégradation. Les serveurs DEVRAIENT maintenir la ressource fonctionnelle jusqu'à la date Sunset (sauf urgence).

Calendrier recommandé

T+0      Première Deprecation : en-tête envoyé en production
T+30j    Annonce publique (changelog, email, documentation)
T+90j    Ajout de journaux de réponse / métriques sur l'utilisation du chemin déprécié
T+180j   Date Sunset fixée à 90 jours
T+270j   Date Sunset arrivée — le point d'accès renvoie 410 Gone avec un lien de migration

Pour les modifications cassantes mineures sur une API épinglée à une version majeure : 6 mois est la médiane. Pour les dépréciations complètes v1 → v2 : 12-24 mois.


4. Le motif de transformation de version

L'architecture interne de Stripe résout le problème « nous avons 50 versions en production » :

Le système utilise des classes de ressources API qui définissent les structures de réponse API actuelles, combinées à des modules de changement de version qui encapsulent les transformations incompatibles avec les versions antérieures. Lors du traitement des réponses, le système remonte dans le temps et applique chaque module de changement de version qu'il trouve jusqu'à atteindre la version cible.

La forme :

// resource : la représentation canonique (la plus récente)
const charge = {
  id: 'ch_123',
  amount: 1000,
  payment_method_details: { card: { brand: 'visa', last4: '4242' } },
}

// Chaque modification cassante est un module transformateur :
const v_2024_03_01 = {
  // Supprime le niveau 'card' sous payment_method_details, aplatit les champs
  apply(resource) {
    return {
      ...resource,
      card_brand: resource.payment_method_details?.card?.brand,
      card_last4: resource.payment_method_details?.card?.last4,
    }
  },
}

const v_2023_10_15 = {
  // Renomme 'amount' en 'amount_cents'
  apply(resource) {
    const { amount, ...rest } = resource
    return { ...rest, amount_cents: amount }
  },
}

// Pipeline : applique les transformateurs dans l'ordre chronologique inverse
// jusqu'à ce que la version demandée soit atteinte
function transform(resource, requestedVersion) {
  const chain = transformers.filter(t => t.date > requestedVersion)
  return chain.reduceRight((r, t) => t.apply(r), resource)
}

Les avantages :

  • Le code reste moderne — chaque point d'accès est écrit contre le dernier schéma ; pas de if (version < ...) éparpillé dans la logique métier.
  • Chaque modification cassante est un fichier — facile à relire, facile à tester isolément, facile à supprimer lorsque le dernier utilisateur la dépasse.
  • Télémétrie — vous pouvez compter combien de transformateurs se déclenchent par jour pour planifier les dépréciations en fonction de l'utilisation réelle.

Le coût : la construction du cadre de transformation. Cela vaut le coup si vous avez >3 modifications cassantes par an et >10 000 consommateurs API ; c'est excessif pour une API interne avec <50 clients.


5. API internes vs publiques

La dissymétrie est importante :

InternePublique
Déploiement coordonné possible ?Oui — remplacement atomiqueNon — les clients se déploient indépendamment
Évolution du schémaPar ajout + message SlackVersioning strict + email + tableaux de bord + billet de blog
Fenêtre de dépréciationJours à semaines6-24 mois
Nécessité du versioningSouvent aucun — juste les en-têtes DeprecationObligatoire
Meilleure stratégieÉvolution par ajout ; version URI seulement en cas de réécritureEn-têtes épinglés à une date (si l'échelle le justifie), URI pour les réécritures majeures

Le piège : les entreprises traitent toutes les API comme « publiques » et construisent une infrastructure de versioning lourde pour une API utilisée seulement par 3 services internes. Le piège inverse : une API interne divulguée a des consommateurs externes et vous ne pouvez pas réellement la casser.

Défense : faites de « publique » un tag binaire sur le service. Les services publics bénéficient de la cérémonie complète de versioning ; les services internes non, mais bénéficient d'une surveillance agressive de qui les appelle.


Anti-patrons

Anti-patronPourquoi ça fait malSolution
Passer de /v1/ à /v2/ pour une seule modification cassanteOblige les clients à tout migrer pour un seul champVersion basée sur une date OU évolution par ajout
Supprimer des points d'accès sans en-tête SunsetLes clients sont cassés sans avertissement ; les tickets de support explosentAssociez toujours la suppression à Deprecation 90+ jours avant
Envoyer Deprecation sans LinkLes clients savent que c'est déprécié mais pas quoi faireIncluez toujours Link: <doc-migration>; rel="deprecation"
Exemptions de version codées en dur par clientDevient impossible à maintenir ; on ne peut pas raisonner sur le comportementUtilisez le motif de transformation ; les « exemptions » deviennent des épingles de version
Versionner les API internes comme les publiquesSurcharge de processus sans bénéficeÉvolution par ajout + déploiements atomiques + Slack
Utiliser le semver (v1.2.3) sur les API RESTImplique un sens qui ne s'applique pas (qu'est-ce qu'un « correctif » pour un schéma JSON ?)Noms basés sur une date ou uniquement majeure (v1)
Date Sunset sans mise en applicationLe point d'accès vit éternellement, le code pourritRappel calendrier ; test CI qui échoue 7 jours avant la date Sunset pour forcer l'action

Novice / Expert / Calendrier

NoviceExpert
Première modification cassantePasse /v1 à /v2, copie-colle toute l'arborescenceEnvisage l'épingle à une date, évalue si le changement est vraiment cassant
Informer les clients de la dépréciationEnvoi en masse par emailEn-têtes Deprecation + Sunset + Link + email + bannière dans le tableau de bord
Maintenir 5 versions5 branches if/else dans chaque contrôleurModules transformateurs, code central uniquement le plus récent
Mise en application de la dépréciation« On s'en occupera »Date Sunset dans le CI ; le point d'accès devient 410 Gone à la date
Modification d'API interneMême cérémonie que pour une API publique — lenteÉvolution par ajout + déploiement atomique ; réserve les processus lourds pour le public

Test de calendrier : combien de temps faut-il entre « nous voulons supprimer le champ X » et « le champ X est supprimé en production » ? Une organisation experte a une réponse unique et reproductible (par exemple, 90 jours). Une organisation novice n'a pas de réponse car il n'y a pas de processus.


Tests qualité

Une modification de versioning est livrée lorsque :

  • Test : La suppression ou le renommage d'un champ visible de l'extérieur est conditionné par une annonce de dépréciation datant d'au moins N jours (où N est la fenêtre de dépréciation documentée).
  • Test : Chaque point d'accès déprécié envoie les en-têtes Deprecation: @<unix-ts> et Sunset: <HTTP-date>, vérifiés dans un test d'intégration.
  • Test : La valeur Sunset n'est jamais antérieure à la valeur Deprecation (selon le DOIT de la RFC 9745).
  • Test : Chaque annonce de dépréciation inclut un en-tête Link: <url-doc>; rel="deprecation" ET un document de migration publique qui existe à cette URL (vérifié par HEAD dans le CI).
  • Test : Les métriques d'utilisation par version existent — vous pouvez répondre à « combien de requêtes sur le chemin v2 hier ? » avant de supprimer v2.
  • Test (uniquement pour version épinglée) : Les nouvelles clés API utilisent par défaut la dernière version ; les clés existantes conservent leur épingle à travers les déploiements.
  • Manuel : Plan de mise en application de la dépréciation : un rappel calendrier, une vérification CI, ou un 410 Gone automatisé — quelque chose se déclenche lorsque la date arrive.

Pas dans cette compétence

  • Évolution de schéma GraphQL (utilisez graphql-schema-evolution)
  • Compatibilité filaire gRPC / Protobuf (utilisez protobuf-evolution-rules)
  • Versionnage de schéma de base de données (utilisez zero-downtime-database-migration)
  • Versionnage semver de bibliothèque / SDK (utilisez npm-package-versioning)
  • Évolution de schéma de flux d'événements (utilisez kafka-schema-registry-design)

Sources

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

curiositech/windags-skills

Expert in 2000s-era music visualization (Milkdrop, AVS, Geiss) and modern WebGL implementations. Specializes in Butterchurn integration, Web Audio API AnalyserNode FFT data, GLSL shaders for audio-reactive visuals, and psychedelic generative art. Activate on "Milkdrop", "music visualization", "WebGL visualizer", "Butterchurn", "audio reactive", "FFT visualization", "spectrum analyzer". NOT for simple bar charts/waveforms (use basic canvas), video editing, or non-audio visuals.

curiositech/windags-skills

Expert legal research agent for finding and scraping expungement data state by state. Knows authoritative sources, URL patterns, Firecrawl configuration, and 2026 legal landscape.

curiositech/windags-skills

Expert in 3D computer vision labeling tools, workflows, and AI-assisted annotation for LiDAR, point clouds, and sensor fusion. Covers SAM4D/Point-SAM, human-in-the-loop architectures, and vertical-specific training strategies. Activate on '3D labeling', 'point cloud annotation', 'LiDAR labeling', 'SAM 3D', 'SAM4D', 'sensor fusion annotation', '3D bounding box', 'semantic segmentation point cloud'. NOT for 2D image labeling (use clip-aware-embeddings), general ML training (use ml-engineer), video annotation without 3D (use computer-vision-pipeline), or VLM prompt engineering (use prompt-engineer).

curiositech/windags-skills

Implement WCAG 2.2 AA/AAA compliance with automated testing, keyboard navigation, screen reader support, and focus management. Activate on: accessibility audit, WCAG compliance, keyboard navigation, screen reader, aria attributes, axe-core, focus trap. NOT for: design-level accessibility review (use design-accessibility-auditor), color contrast only (use css-in-js-architect).

curiositech/windags-skills

Time-blind friendly planning, executive function support, and daily structure for ADHD brains. Specializes in realistic time estimation, dopamine-aware task design, and building systems that actually work for neurodivergent minds.

curiositech/windags-skills

Designs digital experiences for ADHD brains using neuroscience research and UX principles. Expert in reducing cognitive load, time blindness solutions, dopamine-driven engagement, and compassionate design patterns. Activate on 'ADHD design', 'cognitive load', 'accessibility', 'neurodivergent UX', 'time blindness', 'dopamine-driven', 'executive function'. NOT for general accessibility (WCAG only), neurotypical UX design, or simple UI styling without ADHD context.

curiositech/windags-skills

>- Apply crisis decision-making research to agent routing, uncertainty triage, and coordination failure analysis in time-pressured systems. Use when diagnosing handoff failures, analytical paralysis, or expert judgment under incomplete information. NOT for routine coding, simple CRUD design, or static single-agent tasks with complete information.

curiositech/windags-skills

Extend and modify the admin dashboard, developer portal, and operations console. Use when adding new admin tabs, metrics, monitoring features, or internal tools. Activates for dashboard development, analytics, user management, and internal tooling.

curiositech/windags-skills

Conversation patterns and interaction protocols for multi-agent systems. Covers request/response, pub/sub, blackboard, delegation chains, debate, critique, consensus, fan-out/fan-in, supervisor-worker, and peer negotiation. Deep analysis of AutoGen conversation patterns, CrewAI delegation, LangGraph state passing, and FIPA-ACL performatives. Teaches how to design what agents say to each other and in what order. Activate on: "agent conversation", "agent protocol", "multi-agent debate", "agent delegation", "supervisor worker pattern", "agent voting", "consensus protocol", "fan-out fan-in", "agent negotiation", "blackboard pattern", "agent dialogue", "conversation topology", "agent handoff". NOT for: wire format or serialization (use agent-interchange-formats), orchestration infrastructure (use agentic-infrastructure-2026), single agent behavior (use agentic-patterns).

curiositech/windags-skills

Meta-agent for creating new custom agents, skills, and MCP integrations. Expert in agent design, MCP development, skill architecture, and rapid prototyping. Activate on 'create agent', 'new skill', 'MCP server', 'custom tool', 'agent design'. NOT for using existing agents (invoke them directly), general coding (use language-specific skills), or infrastructure setup (use deployment-engineer).

curiositech/windags-skills

AI-powered calendar management and agent-based scheduling coordination. Covers calendar APIs (Google Calendar, CalDAV/iCal), AI scheduling assistants (Reclaim, Clockwise, Motion, Cal.com), building custom calendar agents with MCP, multi-calendar merging, timezone management, focus block protection, meeting fatigue detection, and agent-to-agent meeting negotiation protocols. Activate on: "calendar agent", "AI scheduling", "calendar coordination", "meeting scheduling", "calendar API", "focus time protection", "calendar optimization", "Google Calendar MCP", "Reclaim", "Clockwise", "Motion", "Cal.com", "smart scheduling", "calendar-aware agent", "timezone scheduling", "agent negotiation meetings". NOT for: manual calendar UI component design (use form-validation-architect), project management scheduling or Gantt charts (use project-management-guru-adhd), general time-tracking or pomodoro apps (use adhd-daily-planner for time-awareness), building the agent itself from scratch (use agent-creator).

curiositech/windags-skills

Build and adopt production AI agent infrastructure in 2026. Covers framework selection (LangGraph, CrewAI, AutoGen, MCP), orchestration patterns, evaluation, observability, memory systems, and tool use. Also covers the SOCIAL dimension: how to sell agent infrastructure internally, change management, measuring ROI, building trust in autonomous systems, and scaling adoption across teams. Activate on: "agent infrastructure", "agent framework comparison", "which agent framework", "sell AI tools internally", "agent adoption", "agent observability", "agent evaluation", "MCP architecture", "agentic mesh", "enterprise AI agents", "AI change management", "agent ROI". NOT for: building specific agents (use ai-engineer), designing agent behavior patterns (use agentic-patterns), prompt tuning (use prompt-engineer).

curiositech/windags-skills

Fundamental patterns for effective agentic behavior. Teaches decomposition, tool orchestration, error recovery, context management, quality self-assessment, and knowing when to stop. Model-agnostic principles that make any agent more effective regardless of domain. Activate on: "how should I structure this agent", "agentic workflow", "agent patterns", "multi-step task", "tool orchestration", "/agentic-patterns", "decompose this", "agent best practices", "chain of actions", "when should the agent stop", "agent loop design". NOT for: creating agent infrastructure (use agent-creator), building DAGs (use windags-architect), specific tool implementation.

curiositech/windags-skills

Automated discovery and matching of agent skills for dynamic task routing and capability assessment

curiositech/windags-skills

Cryptographic security for agentic systems — zero-trust agent networking, signed message envelopes (JWS/JWE), capability-based security (ocaps), Merkle tree audit trails, WASM sandboxing, and formal verification. Covers CLI dev tool security, mTLS between agents, permission boundaries (least privilege for AI agents), and supply chain security for skills/plugins. Activate on: "agent security", "zero trust agents", "secure agent communication", "capability-based security", "ocap", "signed messages between agents", "agent audit trail", "sandbox agent execution", "agent permissions", "mTLS agents", "cryptographic verification", "agent supply chain", "OWASP agentic", "prove agent did X", "tamper-proof agent logs". NOT for: application-level SAST scanning (use security-auditor), network firewall rules (use infrastructure), SOC2/HIPAA compliance (organizational), or prompt injection defense (use prompt-engineer).

curiositech/windags-skills

Data structures and serialization formats for agent-to-agent communication. Covers message envelopes, structured output schemas, capability declarations, task handoff payloads, error/retry signaling, and context windows as data structures. Deep comparison of A2A protocol, MCP, OpenAI function calling, and LangChain message types. Teaches when to use rigid schemas vs free-form with validation, typed vs untyped, streaming vs batch. Activate on: "agent message format", "agent communication schema", "agent-to-agent protocol", "A2A protocol", "MCP message format", "structured output for agents", "agent interop", "interchange format", "agent serialization", "task handoff format", "capability declaration". NOT for: what agents say to each other (use agent-conversation-protocols), orchestration topology (use multi-agent-coordination), building agent infrastructure (use agentic-infrastructure-2026).

curiositech/windags-skills

Logic-based agent programming language implementing BDI architecture for practical autonomous agent development

curiositech/windags-skills

>- Design AgentSpeak(L)-style BDI agents with context-guarded plans, selection functions, and intention stacks. Use for interruptible autonomy, agent policy, and multi-agent orchestration in dynamic environments. NOT for simple rule engines, static planners, or centralized workflows.

curiositech/windags-skills

Foundational concurrent computation model where actors communicate exclusively through asynchronous message passing

curiositech/windags-skills

license: Apache-2.0 NOT for unrelated tasks outside this domain.

Skills associés