Cursor a tranché : Spokes est abandonné au profit de Continuity, une nouvelle architecture pensée pour lever les limites de scalabilité et de cohérence de son ancien système de stockage distribué fondé sur le consensus. Là où Spokes, né au début des années 2010, a servi de base à de nombreux services d’hébergement Git, Continuity s’appuie sur un principe emprunté à S3 : les journaux d’écriture anticipée (WAL, Write-Ahead Logs), qui stockent séquentiellement plusieurs objets dans un même fichier.
Sur cette base, Cursor a développé sa propre forge, baptisée Origin. Mi-août, l’entreprise a ouvert Origin en bêta aux abonnés de ses offres payantes. Pour l’instant, l’offre reste fonctionnellement proche de la concurrence, mais avec un catalogue d’intégrations très réduit, limité à Vercel, Depot et Buildkite. Cursor a bien travaillé les passerelles avec GitHub, mais tout n’est pas encore synchronisé, notamment les issues et les workflows CI. À court terme, la société promet aussi des connexions avec ses agents.
L’annonce intervient le jour même d’une nouvelle panne majeure de GitHub. Au pic, les taux d’erreur web et API ont approché 20 %, et même 50 % pour l’archivage et le téléchargement de fichiers. La cause : une saturation réseau sur des load balancers aux États-Unis, elle-même liée à une politique d’autoscaling mal configurée, qui a conduit un pod Istio à atteindre ses limites de concurrence. GitHub a d’ailleurs enchaîné plusieurs incidents importants ces dernières semaines, surtout sur le CI : le 9 juillet, un problème de provisionnement d’exécuteurs hébergés a empêché certains workloads d’en obtenir ; dix jours plus tard, l’expiration d’un certificat SSL a coupé la connectivité de certains runners ; début août, un déploiement de routine vers un service interne de traitement d’événements et de création de jobs a fait échouer jusqu’à 70 % des flux CI ; fin août, une saturation des écritures vers une base de données utilisée par les déclencheurs a provoqué une autre perturbation.
Cursor estime toutefois que le problème dépasse GitHub et touche plus largement Git, dans un contexte de montée en charge liée au développement agentique. C’est précisément pour répondre à ces contraintes que l’entreprise n’a pas seulement conçu Origin, mais aussi Continuity.
Le principal reproche adressé à Spokes est sa difficulté à passer à l’échelle. Git supporte mal la cohérence éventuelle : mieux vaut la maintenir en continu, mais cela impose une complexité très élevée. Au lancement, Cursor considérait que trois répliques par dépôt constituaient le meilleur compromis. Ce modèle ne tient plus aujourd’hui, car les dépôts ont grossi. Dès qu’on ajoute des répliques, la latence est tirée vers le haut par le serveur le plus lent du cluster. Le problème existe aussi dans l’autre sens : quand des agents travaillent sur un monorepo, ils opèrent souvent en dehors, créant une multitude de petits dépôts, donc autant de répliques à maintenir pour garantir une cohérence totale. Autre limite de Spokes : comme les dépôts sur disque restent la source de vérité pour le consensus, il faut savoir précisément où se trouve chaque copie, ce qui impose une table de routage externe.
Continuity supprime ces contraintes en éliminant à la fois le consensus et l’état. Le cœur du système est le WAL : chaque push y est enregistré comme un objet distinct. Le packfile Git est écrit sur disque puis téléversé sur S3. Un push ne devient visible qu’après préparation de la transaction de référence sur une copie locale du dépôt et enregistrement d’un pointeur vers l’entrée WAL dans le fichier d’index. Cursor affirme que ce mécanisme garantit des pushs linéarisables. Comme il suffit de synchroniser la transaction de référence avec un seul dépôt local, et non avec un quorum de répliques, le système peut ingérer les pushs à la vitesse du disque.
L’architecture évite aussi de suivre l’emplacement de chaque dépôt sur chaque serveur. La source de vérité reste le WAL, ce qui rend le système sans état, sans table de routage et sans base de données relationnelle. Si un dépôt n’est pas présent sur le disque local lors d’un accès, il est reconstruit à partir du WAL. Il n’y a pas non plus de consensus : n’importe quel serveur peut devenir principal. La synchronisation du WAL repose sur une opération atomique de comparaison-et-échange sur S3, ce qui permet, selon Cursor, à n’importe quelle instance d’un dépôt de recevoir un push en toute sécurité.
Pour la réplication, Continuity utilise un mécanisme optimiste fondé sur des paquets UDP de gossip dans le cluster. Chaque réplique connaît l’ETag de la dernière version de l’index WAL qu’elle a rattrapée ; les lectures sur une réplique passent par des requêtes GET conditionnelles avec l’ETag attendu. Le fait d’utiliser S3 comme source de vérité évite les problèmes si un paquet UDP est perdu ou arrive sur le mauvais serveur. Cursor affirme que le système passe à l’échelle dans les deux sens : chaque dépôt reçoit le bon nombre de répliques, et le débit des opérations Git en lecture seule — clone, fetch, etc. — augmente linéairement.
Le compactage est également optimisé : seul le nœud principal l’exécute, et le résultat s’applique à la fois au dépôt sur disque et au WAL. Comme toutes les répliques suivent le WAL, elles suivent aussi les événements de compactage. Côté performances, Cursor indique que le débit des pushs dépend de la latence de mise à jour du WAL : avec S3 Standard, le système tient 120 pushs par seconde ; avec Express One Zone, il monte à 300 pushs/s. Le facteur limitant reste la vitesse de compactage des données Git sur disque, et l’entreprise dit travailler sur de nouvelles méthodes d’organisation pour en réduire l’impact.