Surprises connues
Ce fichier recense les points de confusion propres à ce dépôt qui ont causé des erreurs d'agent.
Critères d'ajout
N'ajoutez une entrée que si toutes ces conditions sont réunies :
- Elle est propre à ce dépôt (ce n'est pas un conseil générique).
- Elle a de fortes chances de se reproduire pour de futurs agents.
- Elle s'accompagne d'une atténuation concrète et applicable.
En cas de doute, demandez au développeur avant d'ajouter une entrée.
Modèle d'entrée
### [Short title]
- **Date:** YYYY-MM-DD
- **Observed by:** agent name or contributor
- **Context:** where/when it happened
- **What was surprising:** concrete unexpected behavior
- **Impact:** what went wrong or could go wrong
- **Mitigation:** exact step future agents should take
- **Status:** confirmed | superseded
Entrées
Les domaines de production des applications Vercel peuvent revenir à des déploiements Git master
- Date : 2026-04-28
- Observé par : Tommaso + Codex
- Contexte : Vérification des miroirs des applications Seedit et 5chan dans le répertoire d'applications de Bitsocial Web.
- Ce qui a surpris : Les projets Vercel
seeditet5chanavaientgitProviderOptions.createDeployments = "enabled", si bien que les pushes GitHub surmasterétaient promus vers les domaines de production, alors que la politique du dépôt attend des miroirs d'applications en production qu'ils ne servent que des artefacts de release. - Impact : Les badges de miroir vérifié du répertoire d'applications peuvent devenir faux, parce que les domaines de production servent le dernier commit de développement au lieu du ZIP de release GitHub dont le hash du fichier
index.htmlest enregistré dansabout/src/lib/apps-data.ts. - Atténuation : Avant d'ajouter ou de rafraîchir des métadonnées de vérification de miroir, inspectez le projet Vercel avec
vercel api /v9/projects/<project-id>et confirmez quegitProviderOptions.createDeployments = "disabled". Déployez le contenu du ZIP de release avecvercel deploy --prebuilt --prodet utilisezseedit-omega.vercel.appou5chan-omega.vercel.apppour les déploiements de développement. - Statut : confirmé
Portless 0.11 réutilise un état de proxy hérité si le lanceur ne force pas HTTPS
- Date : 2026-04-28
- Observé par : Tommaso + Codex
- Contexte : Migration du flux
yarn starthabituel de l'ancienne URL de proxyhttp://bitsocial.localhost:1355vershttps://bitsocial.localhost. - Ce qui a surpris : Même avec
portless@0.11.1installé, Portless réutilisait le proxy HTTP existant~/.portless/proxy.port = 1355et affichait l'ancienne URL en:1355. - Impact : Mettre à jour les versions de paquets et la documentation ne suffit pas :
yarn startpeut encore annoncer et utiliser l'ancienne URL quand un contributeur a un état Portless hérité en cours d'exécution. - Atténuation : Faites en sorte que les scripts de démarrage lancent explicitement le proxy HTTPS de Portless sur le port
443avant d'enregistrer les routes d'application, pour que le flux d'exécution s'éloigne de l'état1355persistant au lieu d'en hériter. - Statut : confirmé
Portless change l'URL locale canonique de l'application
- Date : 2026-03-18
- Observé par : Codex
- Contexte : Vérifications en navigateur et parcours de smoke test
- Ce qui a surpris : L'URL locale par défaut n'est pas le port Vite habituel. Le dépôt attend
https://bitsocial.localhostvia Portless, donc vérifierlocalhost:3000oulocalhost:5173peut atteindre la mauvaise application, voire rien du tout. - Impact : Les vérifications en navigateur peuvent échouer, ou valider la mauvaise cible, même quand le serveur de développement fonctionne correctement.
- Atténuation : Utilisez
https://bitsocial.localhosten premier. Ne le contournez avecPORTLESS=0 corepack yarn startque si vous avez explicitement besoin d'un port Vite direct. - Statut : confirmé
Les hooks Commitizen bloquent les commits non interactifs
- Date : 2026-03-18
- Observé par : Codex
- Contexte : Workflows de commit pilotés par un agent
- Ce qui a surpris :
git commitdéclenche Commitizen via Husky et attend une saisie sur un TTY interactif, ce qui fige les shells d'agent non interactifs. - Impact : Les agents peuvent rester bloqués indéfiniment sur ce qui devrait être un commit ordinaire.
- Atténuation : Utilisez
git commit --no-verify -m "message"pour les commits créés par un agent. Les humains peuvent toujours passer parcorepack yarn commitoucorepack yarn exec cz. - Statut : confirmé
Corepack est nécessaire pour éviter Yarn classic
- Date : 2026-03-19
- Observé par : Codex
- Contexte : Migration du gestionnaire de paquets vers Yarn 4
- Ce qui a surpris : La machine possède encore une installation globale de Yarn classic dans le
PATH, donc lancer simplementyarnpeut résoudre vers la v1 au lieu de la version Yarn 4 épinglée. - Impact : Les développeurs peuvent contourner sans le vouloir l'épinglage du gestionnaire de paquets du dépôt et obtenir un comportement d'installation ou un lockfile différents.
- Atténuation : Utilisez
corepack yarn ...pour les commandes shell, ou exécutez d'abordcorepack enablepour queyarnseul résolve vers la version Yarn 4 épinglée. - Statut : confirmé
Les noms d'application Portless figés entrent en collision entre les worktrees Bitsocial Web
- Date : 2026-03-30
- Observé par : Codex
- Contexte : Lancement de
yarn startdans un worktree Bitsocial Web alors qu'un autre worktree servait déjà via Portless - Ce qui a surpris : Utiliser le nom d'application Portless littéral
bitsocialdans chaque worktree fait entrer la route elle-même en collision, même quand les ports sous-jacents diffèrent : le second processus échoue parce quebitsocial.localhostest déjà enregistré. - Impact : Des branches Bitsocial Web parallèles peuvent se bloquer mutuellement, alors que Portless est justement censé leur permettre de coexister sans risque.
- Atténuation : Gardez le démarrage de Portless derrière
scripts/start-dev.mjs, qui utilise désormais une route*.bitsocial.localhostcadrée sur la branche en dehors du cas canonique, et bascule sur une route cadrée sur la branche quand le nom nubitsocial.localhostest déjà occupé. - Statut : confirmé
L'aperçu de la documentation codait en dur le port 3001
- Date : 2026-03-30
- Observé par : Codex
- Contexte : Exécution de
yarn starten parallèle d'autres dépôts et agents locaux - Ce qui a surpris : La commande de développement racine lançait l'espace de travail de documentation avec
docusaurus start --port 3001, si bien que toute la session de développement échouait dès qu'un autre processus occupait déjà3001, alors même que l'application principale utilisait déjà Portless. - Impact :
yarn startpouvait tuer le processus web juste après son démarrage et interrompre un travail local sans rapport, à cause d'une collision sur le port de la documentation. - Atténuation : Gardez le démarrage de la documentation derrière
yarn start:docs, qui utilise désormais Portless etscripts/start-docs.mjspour respecter un port libre injecté, ou se rabattre sur le prochain port disponible quand il est lancé directement. - Statut : confirmé
Le nom d'hôte Portless de la documentation était codé en dur
- Date : 2026-04-03
- Observé par : Codex
- Contexte : Lancement de
yarn startdans un worktree Bitsocial Web secondaire alors qu'un autre worktree servait déjà la documentation via Portless - Ce qui a surpris :
start:docsenregistrait encore le nom d'hôte littéraldocs.bitsocial.localhost, doncyarn startpouvait échouer alors que l'application about savait déjà éviter les collisions de route Portless pour son propre nom d'hôte. - Impact : Des worktrees parallèles ne pouvaient pas utiliser de façon fiable la commande de développement racine, parce que le processus de documentation s'arrêtait en premier et que
concurrentlytuait ensuite le reste de la session. - Atténuation : Gardez le démarrage de la documentation derrière
scripts/start-docs.mjs, qui dérive désormais le même nom d'hôte Portless cadré sur la branche que l'application about, et injecte cette URL publique partagée dans la cible du proxy de développement/docs. - Statut : confirmé
Les shells de worktree peuvent rater la version de Node épinglée par le dépôt
- Date : 2026-04-03
- Observé par : Codex
- Contexte : Lancement de
yarn startdans des worktrees Git comme.claude/worktrees/*ou dans des checkouts de worktrees voisins - Ce qui a surpris : Certains shells de worktree résolvaient
nodeetyarn nodevers le Node25.2.1de Homebrew alors que le dépôt épingle22.12.0dans.nvmrc, si bien queyarn startpouvait exécuter silencieusement les lanceurs de développement sur le mauvais runtime. - Impact : Le comportement du serveur de développement peut diverger entre le checkout principal et les worktrees, ce qui rend les bugs difficiles à reproduire et enfreint la chaîne d'outils Node 22 attendue par le dépôt.
- Atténuation : Gardez les lanceurs de développement derrière
scripts/start-dev.mjsetscripts/start-docs.mjs, qui se réexécutent désormais avec le binaire Node de.nvmrcquand le shell courant est sur la mauvaise version. La configuration du shell devrait tout de même privilégiernvm use. - Statut : confirmé
Les restes de docs-site/ peuvent masquer l'absence des sources de documentation après le refactor
- Date : 2026-04-01
- Observé par : Codex
- Contexte : Nettoyage du monorepo après la fusion, une fois le projet Docusaurus déplacé de
docs-site/versdocs/ - Ce qui a surpris : L'ancien dossier
docs-site/peut rester sur le disque avec des fichiers obsolètes mais importants commei18n/, même après le passage du dépôt suivi àdocs/. Le refactor semble alors dupliqué en local, et cela peut masquer le fait que les traductions de documentation suivies n'ont jamais été déplacées dansdocs/. - Impact : Les agents peuvent supprimer l'ancien dossier en le prenant pour un « déchet » et perdre par accident la seule copie locale des traductions de documentation, ou continuer à modifier des scripts qui pointent encore vers le chemin mort
docs-site/. - Atténuation : Traitez
docs/comme le seul projet de documentation canonique. Avant de supprimer des restes locaux dedocs-site/, restaurez les sources suivies commedocs/i18n/et mettez à jour les scripts et les hooks pour qu'ils cessent de référencerdocs-site. - Statut : confirmé
L'aperçu multi-locale de la documentation peut faire grimper la RAM pendant la vérification
- Date : 2026-04-01
- Observé par : Codex
- Contexte : Correction de l'i18n de la documentation, du routage des locales et du comportement de Pagefind avec
yarn start:docset Playwright - Ce qui a surpris : Le mode d'aperçu par défaut de la documentation effectue désormais un build multi-locale complet suivi d'une indexation Pagefind avant de servir les pages ; maintenir ce processus actif à côté de plusieurs sessions Playwright ou Chrome peut consommer beaucoup plus de RAM qu'une boucle de développement Vite ou Docusaurus mono-locale ordinaire.
- Impact : La machine peut se retrouver à court de mémoire, les sessions de navigateur peuvent planter, et des exécutions interrompues peuvent laisser derrière elles des serveurs de documentation obsolètes ou des navigateurs headless qui continuent de consommer de la mémoire.
- Atténuation : Pour le travail de documentation qui n'a pas besoin de vérifier les routes de locale ni Pagefind, préférez
DOCS_START_MODE=live yarn start:docs. N'utilisez l'aperçu multi-locale par défaut que lorsque vous devez valider des routes traduites ou Pagefind. Gardez une seule session Playwright, fermez les anciennes sessions de navigateur avant d'en ouvrir de nouvelles, et arrêtez le serveur de documentation après vérification si vous n'en avez plus besoin. - Statut : confirmé
translate-docs.py peut laisser les locales de documentation à moitié traduites ou avec des cibles de lien cassées
- Date : 2026-04-06
- Observé par : Codex
- Contexte : Correction des routes et du contenu localisés de la documentation, après que
yarn start:docsa servi des pages de détail en anglais ou n'a pas réussi à produire la sortie de locale - Ce qui a surpris : Le pipeline de traduction de la documentation cumulait deux modes de défaillance propres au dépôt :
scripts/translate-docs.pyn'extrayait qu'un petit sous-ensemble des messages deDocsHomequand les appelstr(...)prenaient des formes qu'il ne savait pas analyser, et le markdown traduit sousdocs/i18n/**pouvait contenir des slugs traduits automatiquement ou des artefactsZXQPLACEHOLDERà l'intérieur des cibles de lien. - Impact : Les pages d'accueil localisées peuvent retomber silencieusement sur l'anglais, les pages de détail localisées peuvent sembler non traduites, et un
yarn docs:buildcomplet peut échouer sur des liens de locale cassés alors même que la documentation source est valide. - Atténuation : Après avoir modifié les traductions de la documentation ou régénéré les fichiers de locale, lancez toujours
yarn docs:builddepuis la racine du dépôt, cherchezZXQPLACEHOLDERdans le markdown dedocs/i18n/**, et vérifiez que les liens traduits pointent encore vers des slugs de documentation canoniques comme/apps/5chan/plutôt que vers des chemins d'URL traduits. Si le texte deDocsHomea changé, confirmez quescripts/translate-docs.pyextrait toujours tous les messagesdocs.home.*. - Statut : confirmé
Les vérifications sans JS du site about doivent utiliser la route Portless, pas un aperçu SSR autonome
- Date : 2026-04-12
- Observé par : Codex
- Contexte : Vérification du support sans JS du site
about/depuis un worktree de branche - Ce qui a surpris : Un aperçu SSR autonome peut sembler en bonne santé alors que la vraie route Portless cadrée sur la branche sert encore la mauvaise coquille d'application ou un processus plus ancien. Dans ce dépôt, le contrat local réel est le nom d'hôte Portless issu de
yarn start, pas un serveur d'aperçu improvisé. - Impact : Les agents peuvent affirmer à tort que le support sans JS fonctionne, ou passer à côté de régressions qui n'apparaissent que sur
*.bitsocial.localhost. - Atténuation : Pour la vérification en navigateur de
about/, démarrez toujours le vrai serveur local avecyarn startouyarn start:about, et testez d'abord l'URL Portless cadrée sur la branche. Si un nom d'hôte Portless semble obsolète, inspectez et arrêtez l'ancien processus avant de retester. - Statut : confirmé
chain/ était invisible pour yarn build:verify et yarn doctor
- Date : 2026-07-05
- Observé par : Codex
- Contexte : Vérification d'un diff touchant uniquement chain/ après l'ajout au monorepo de l'espace de travail
chain/(application Vite autonome pourchain.bitsocial.net). - Ce qui a surpris :
scripts/verify-build.mjsne reconnaissait que les préfixes de cheminabout/,docs/etstats/; un diff limité à chain/ affichait donc « No targeted build checks matched the current diff » et ne lançait aucun build, alors même quebuild:chainexistait déjà dans lepackage.jsonracine. Par ailleurs,yarn doctorétait codé en dur surreact-doctor about -y, si bien que les changements React souschain/srcne recevaient aucune couverture React Doctor. - Impact : Les agents qui vérifiaient des changements sur chain devaient savoir qu'il fallait appeler
yarn build:chaindirectement au lieu de faire confiance àyarn build:verify, et les problèmes React danschain/src(effets, hooks, code mort) passaient inaperçus pouryarn doctor. - Atténuation :
scripts/verify-build.mjspossède désormais une branchechain/calquée sur celle deabout/, etdoctorainsi quedoctor:verboseexécutent maintenantreact-doctor --project about,chain -yen une seule invocation.doctor:scorereste limité àabout, parce que--scoren'affiche silencieusement rien quand il est combiné à--projectpour plus d'un projet ; utilisezyarn react-doctor --project about,chain --verbose -y(ou--json) si un score pour chain est nécessaire. - Statut : confirmé
Le P2P navigateur passe par des WebSockets sécurisés ; pkc-js refuse WebRTC et WebTransport par défaut
- Date : 2026-08-02
- Observé par : Claude
- Contexte : Rédaction du texte de la page d'accueil et de la documentation expliquant le fonctionnement du P2P navigateur de Bitsocial
- Ce qui a surpris :
@pkcprotocol/pkc-jsembarque un connection gater par défaut qui rejette les dials WebRTC et WebTransport dans le navigateur :dist/browser/helia/dial-transport-filter.jsexporteDENIED_DIAL_TRANSPORTS_BY_DEFAULT = ["webrtc", "webrtc-direct", "webtransport"]. Le commentaire de son code source en donne la raison : dans le navigateur, ces transports ajoutent des chemins d'établissement de connexion longs et souvent défaillants (STUN/ICE, rotation de certhash) qui ralentissent le chargement, alors que WebSocket est direct et fiable. Chaque pair actif du panneau d'état P2P du blog affiche « Secure WebSocket ». Le gater vit dansnode_modules, donc rien dans le dépôt n'en laisse deviner l'existence. - Impact : Il est très facile d'écrire un texte public techniquement plausible mais faux — par exemple en attribuant à l'arrivée de WebTransport dans la Baseline des navigateurs en mars 2026 le mérite d'avoir rendu possible le P2P navigateur de Bitsocial. Cette affirmation a été publiée sur la page d'accueil, dans le tableau comparatif et sur deux pages de documentation avant que le développeur ne la repère. Les affirmations erronées sur l'architecture, quand elles sont publiques, sont vérifiées précisément par le public de développeurs que le site vise.
- Atténuation : Ne déduisez jamais les transports utilisés par Bitsocial de ce que libp2p ou la plateforme navigateur prennent en charge en principe. Vérifiez la liste de refus actuelle dans
node_modules/@pkcprotocol/pkc-js/dist/browser/helia/dial-transport-filter.js, confirmez qu'aucune surcharge deconnectionGatern'existe sousabout/src/, et lisez les libellés de transport en direct dans le panneau « P2P status » du blog avant toute affirmation publique. Le changement amont qui a réellement débloqué la publication depuis le navigateur est la correction du seqno monotone de gossipsub dans@libp2p/gossipsub15.0.21 (mai 2026) ; pkc-js embarque actuellement la 16.0.4. - Statut : confirmé
Les liens relatifs ./page.md depuis une page de documentation non traduite cassent tous les builds localisés
- Date : 2026-08-02
- Observé par : Claude
- Contexte : Ajout d'une page en anglais uniquement,
docs/browser-p2p.md, qui pointait vers des pages existantes avec./peer-to-peer-protocol.mdet./apps/5chan.md - Ce qui a surpris : Chaque locale sous
docs/i18n/<lang>/docusaurus-plugin-content-docs/current/reproduit l'arborescence de la documentation. Une page absente de ces miroirs s'affiche quand même dans toutes les locales grâce au repli sur l'anglais, mais ses liens markdown relatifs ne se résolvent plus : Docusaurus produit/ar/browser-p2p/peer-to-peer-protocol.md/et fait échouer le build avec « Docusaurus found broken links! ». Point crucial :yarn build:verifyetyarn docs:build:verifyne construisent queenet passent sans rien signaler ; seul unyarn docs:buildcomplet fait apparaître le problème, et il s'interrompt sur la première locale par ordre alphabétique (ar). - Impact : Un changement de documentation peut passer toutes les vérifications locales rapides et casser malgré tout le build multi-locale de production. L'échec semble en plus sans rapport avec le changement, puisque l'erreur nomme un chemin de locale que l'auteur n'a jamais touché.
- Atténuation : Dans toute page de documentation qui n'est pas répliquée dans
docs/i18n/**, utilisez des liens relatifs à la racine (/peer-to-peer-protocol/,/apps/5chan/) plutôt que des liens.mdrelatifs ; Docusaurus les préfixe automatiquement avec la locale.docs/build-your-own-client.mden est l'exemple existant. Lancez unyarn docs:buildcomplet — et pas seulementbuild:verify— avant de livrer tout changement qui ajoute une page de documentation ou en référence une. - Statut : confirmé
update-translations.js doit être lancé depuis about/, et les exécutions concurrentes perdent des clés silencieusement
- Date : 2026-08-02
- Observé par : Claude
- Contexte : Application de 26 clés i18next traduites sur les 36 locales via le skill
translate - Ce qui a surpris : Deux pièges distincts dans le même script. D'abord,
scripts/update-translations.jsrésout sa cible commepath.join(process.cwd(), "public", "translations"), alors que ce dépôt garde les traductions dansabout/public/translations: lancer la commande documentée depuis la racine du dépôt échoue à chaque invocation avec « Translations directory not found », etdocs/agent-playbooks/translations.mdmontrenode scripts/update-translations.js ..., qui se lit comme une commande à exécuter à la racine. Ensuite, chaque invocation est un cycle lecture-modification-écriture sur les 36 fichiers de locale : deux invocations simultanées s'écrasent mutuellement et une clé disparaît sans la moindre erreur. Or le skilltranslatedemande explicitement de lancer jusqu'à 4 sous-agents en parallèle, dont chacun appellerait ce script. - Impact : La forme lancée depuis la racine du dépôt échoue bruyamment et gâche une passe complète. Le problème de concurrence, lui, échoue en silence : des clés disparaissent de locales arbitraires et le diff garde toute son apparence de plausibilité.
- Atténuation : Lancez-le sous la forme
cd about && node ../scripts/update-translations.js --key <key> --map <abs-path> --write. Ne laissez jamais des sous-agents traducteurs écrire des fichiers de locale en parallèle : faites-leur produire uniquement des fichiers JSON de dictionnaire, puis appliquez chaque clé en série depuis l'agent parent. Après application, vérifiez par script que chaque clé existe dans les 35 locales non anglaises et qu'aucune valeur n'est identique octet pour octet à la source anglaise. - Statut : confirmé