Cicatrices d'honneur

Chaque cicatrice est une erreur détectée, corrigée, et transformée en check permanent. Un agent qui a des cicatrices est un agent qui a appris.

50 cicatrices — filtre : backend

TuringMajeurdoctrine-bug
18 mai 2026

Erreur : RULE INSTEAD OF + VALUES (NEW.*) bypass le DEFAULT sequence quand le caller omet la PK. Sur VIEW simple SELECT * FROM <table>, les RULES sont superflues : PG 9.3+ rend la VIEW auto-updatable (is_insertable_into=YES) et propage les DEFAULTs nativement.

Check ajouté : Avant de poser des RULES sur VIEW : SELECT is_insertable_into FROM information_schema.views — si YES, ne PAS poser de RULES. Si RULE indispensable (VIEW JOIN/agrégat), utiliser COALESCE(NEW.<pk>, nextval(...)) explicite.

Cause racine : Méconnaissance des auto-updatable views PG 9.3+ : runbook v1 calquait le pattern RULES historique (PG <9.3) sans vérifier que la VIEW source-unique est déjà writable nativement. VALUES (NEW.*) est un bypass actif du DEFAULT.

TuringMajeurdeploy_pipeline_regression
18 mai 2026

Erreur : Après ./deploy palimex-v2 (preprod), IPX renvoie 404 sur toutes les images uploadées /static/hero/* /static/uploads/* — slider HP cassé (visible sur Tor / hard refresh, masqué par cache Firefox). Cause : tar.gz écrase .output/ y compris le symlink .output/public/static → /var/www/palimex-static, et la fonction generic deploy_remote_pm2_restart dans scripts/deploy/deploy.sh:171 passait une chaine vide comme 6e arg (STATIC_SYMLINK) au lieu de la valeur YAML.

Check ajouté : static_symlink modélisé dans schema YAML. Renseigné dans palimex deploy.yaml + deploy.preprod.yaml. Passé en arg dans scripts/deploy/deploy.sh pour les 2 variants pm2 (restart + reload). Helper reload patché.

Cause racine : Migration pipeline deploy-palimex_v2.sh vers scripts/deploy/deploy.sh YAML-driven sans intégrer static_symlink dans le schéma YAML. Le helper _deploy_lib.sh:406 accepte le param mais personne ne le lui passe.

TuringModéréimport
18 mai 2026

Erreur : Feature 2 dream importait synedre.ac_agent_call.call_agent (fonction inexistante) au lieu de invoke_agent. Crash uniquement en --apply, pas en --dry-run car lazy import

Check ajouté : Toujours valider lazy imports avant commit via python3 -c 'from X import Y'. Pour les façades subprocess, faire au moins 1 test --apply en sandbox sur 1 input avant commit

Cause racine : Lecture trop superficielle du grep ac_agent_call.py : 'call_agent' apparaissait dans la docstring mais la vraie fonction est 'def invoke_agent'. Test dry-run insuffisant pour valider lazy imports

TuringModéréConvention
17 mai 2026

Erreur : Doctrine automates non respectée sur premier write : un script cron qui plante doit (a) tracer en DB via AutomateLog, (b) passer par Entity façade, (c) propager le code d'erreur

Check ajouté : Wrapper run() dans with AutomateLog(name) as log; créer Entity facade dans synedre/ac_entities/; _main returns 1 if stats['errors']

Cause racine : Réflexe à acquérir : tout NEW cron script = template avec AutomateLog + Entity dès le premier commit, pas en post-QA

TuringModéréparsing
17 mai 2026

Erreur : Parser RETURNING dans Entity helpers : .strip() coupe les trailing tabs des colonnes NULL en fin de row. Decouverte travail #165 tache #167 sur ChantierSession.create() qui RETURNING * sur table avec colonnes nullable en queue (size_bytes, closed_at, closed_reason). psql -A -t -F tab rend les NULL comme tabs vides en fin -> "INSERT 0 1\nval1\tval2\tval3\t\t\t\n" -> ligne.strip() -> "val1\tval2\tval3" -> split par tab donne 3 cellules au lieu de 6 -> KeyError silencieux ou champ rate.

Check ajouté : Tout helper Entity qui parse un RETURNING avec colonnes nullable doit utiliser .rstrip("\n") au lieu de .strip(). Alternative : separator non-tab via psql -F$" intervalle US "\x1f" (byte non-printable) qui ne peut pas apparaitre dans une valeur. Verifier toute methode dans synedre/ac_entities/*.py qui appelle _run_sql_write avec RETURNING multi-col.

Cause racine : En PG psql mode -A -t -F\t (tab-separated, unaligned, tuples-only), les colonnes NULL en queue produisent des trailing tabs vides. Python .strip() considere \t comme whitespace et les enleve. Le bug n affecte que les RETURNING multi-colonnes avec NULL en queue ; un INSERT simple avec RETURNING id_xxx (1 colonne) n est pas affecte. Entity.create() de base.py utilise RETURNING id_{pk_strip} (1 colonne), donc pas impacte directement. Tout override de create() qui RETURNING * doit en tenir compte.

TuringMajeurConvention
17 mai 2026

Erreur : qa_run.py:_git_diff_on_paths utilise base='main' hardcodé. Sur branche preprod avec commits non poussés, main...HEAD est obsolète. Le diff envoyé aux agents QA ne reflète pas le travail en cours = verdict invalide. ## Post-mortem (daily-summary) Cas confirmé sur travail #161 : même symptôme que round-2 #160, prouve que le bug n'est pas un cas isolé mais un défaut structurel du helper — à traiter en P1 avant prochain QA loop.

Check ajouté : Avant qa_run : (a) git stash le working tree dirty OU (b) inclure tous les commits depuis le fork-point preprod-vs-main OU (c) git diff sur HEAD~N..HEAD avec N = nb commits du travail OU (d) accepter dirty + ajouter git status output au prompt agent.

Cause racine : Hypothèse implicite : le travail est commité+poussé vers main avant qa_run. Faux : les commits restent sur preprod jusqu'à ./ship.

TuringModéréConvention
17 mai 2026

Erreur : Module chantier (DB schemas + utils + API server) vit dans mothership/modules/chantier/ — le duplicate dans codemyshop/tenants/alexandrecarette/modules/chantier/ est un orphelin legacy. find_by glob retourne les 2 fichiers (chantier.ts homonymes) mais seul mothership est la source de vérité runtime. ## Post-mortem (daily-summary) Confusion possible aussi sur d'autres modules dupliqués nom-identiquement (agents, drill) : toujours résoudre le path complet via `find . -path '*/modules/<name>' -type d` avant édition.

Check ajouté : Avant tout édit sur un fichier nommé chantier.ts ou similaire ambigu : grep -l le même nom de table dans mothership/ ET codemyshop/. Si 2+ matches, **toujours préférer mothership/** pour les entities Synedre OS.

Cause racine : Glob find -name 'chantier.ts' liste les 2. Sans contexte doctrinal (Synedre OS = exclusif mothership cf feedback_hub_chantier_lives_on_mothership), Claude prend le premier match — qui est le faux.

TuringMajeurConvention
17 mai 2026

Erreur : Silent stale deploy : pm2 reload graceful Nuxt fork mode re-exec le script_path absolu cached. Si REMOTE_DIR du script deploy != PM2 cwd/script_path, tar.gz extrait au mauvais endroit jamais lu. Health 200 + smoke OK car ancien code répond. Observé sur codemyshop.com (Mar 24 servi 2026-05-17) + alexandrecarette.fr (May 15). Cause : rangement oss-archi-tenants-mothership 2026-05-16 bouge layout codemyshop/tenants/<X>/ mais runtime PM2 jamais resynced.

Check ajouté : Sentinelle post-deploy obligatoire dans deploy_remote_pm2_reload : après reload, comparer stat mtime pm2_env.pm_exec_path vs mtime tar.gz uploadé. Delta > 60s = silent stale. FAIL deploy exit 1 + proposer séquence symlink.

Cause racine : pm2 reload re-exec script_path absolu hardcoded au pm2 start initial. Pas de mécanisme natif détectant que source a bougé. deploy_remote_pm2_reload extrait au REMOTE_DIR canonical mais PM2 lit cwd legacy.

TuringModéréConvention
17 mai 2026

Erreur : Realign PM2 cwd post-rangement OSS via symlink legacy → canonical : zéro downtime, rollback instantané, préserve env vars cached par PM2.

Check ajouté : Réalignement runtime PM2 sur nouveau layout disque : (1) cp -n .env legacy → canonical (skip si tenant hérite app/.env racine), (2) mv legacy → legacy.STAMP backup, (3) ln -sf canonical → legacy_path, (4) pm2 reload <app>, (5) validation stat pm_exec_path mtime + HTTP 200 + smoke. Cleanup .legacy.STAMP J+7.

Cause racine : pm2 reload re-résoud script_path absolu à chaque exec. Si script_path est symlink, ln -sf retarget vers canonical sans toucher conf PM2. mv legacy → legacy.STAMP avant ln garantit rollback 2 commandes.

TuringModéréentity_array_serialize
17 mai 2026

Erreur : base.py:67 fait json.dumps(list) -> JSON '[a,b]' au lieu de PG ARRAY literal '{a,b}'. Insert ARRAY column crash ## Post-mortem (daily-summary) Bug touche toute colonne PG ARRAY (pas seulement `tags`) — toute future Entity utilisant Entity.base héritera du bug tant que `_esc(list)` n'est pas patché.

Check ajouté : Pour ARRAY column en INSERT via entity : formatter manuellement le PG literal '{"a","b"}' ou ajouter Entity.array_fields = (...) + override _esc avec ce hint

Cause racine : _esc generique sans introspection schema, ne distingue pas JSONB (json.dumps OK) de ARRAY (besoin {...})

TuringMajeurentity_parse
17 mai 2026

Erreur : Entity.find() ligne 215 base.py : 'for line in out.splitlines(): cells = line.split("\\t")' — assume 1 row = 1 ligne, mais TEXT columns multi-lignes décalent les cellules. Symptôme : champs renvoient None silencieusement, aucune exception

Check ajouté : Pour entity à TEXT longs : remplacer find() par row_to_json(t) + json.loads ligne par ligne (cf cicatrice #651). Workaround court-terme : update_direct(pk, fields) sans relire

Cause racine : Pattern psql -F\\t + Python splitlines+split — fragile dès qu'une colonne TEXT contient \\n. Entity.find()/find_one() touchés à grande échelle (toutes les entities)

TuringModéréshell_parse
17 mai 2026

Erreur : Parser psql -A séparateur custom + line.split() ne gère pas les newlines embarqués dans TEXT columns ## Post-mortem (daily-summary) Cas-limite découvert post-fix : le bug parsing Entity affecte aussi recommend_model_for() qui fallback sur opus-4.7 quand estimated_tokens=None — coût ×10 silencieux.

Check ajouté : Pour multi-row read avec colonnes TEXT longues : SELECT row_to_json(t) FROM (...) t -> 1 JSON par ligne, newlines escapés automatiquement. Ne JAMAIS faire psql -A + parse manuel quand TEXT description en jeu

Cause racine : Convention psql -A -F<sep> émet 1 row/line MAIS les TEXT columns conservent leurs '\\n' littéraux -> consommateur Python.split('\\n') compte les rows à l'envers

TuringMineurConvention
17 mai 2026

Erreur : Entity.create() de la base ajoute systematiquement date_add+date_upd dans INSERT, mais 2 tables (ps_ac_cicatrices, sy_tache_iteration) n ont que date_add. CicatriceEntity et IterationEntity doivent override create(). Egalement : _esc ne sait pas serialiser une liste Python en PG ARRAY litteral, donc tags / autres colonnes ARRAY exigent serialisation manuelle au format {tag1,tag2}.

Check ajouté : Override create() local dans CicatriceEntity et IterationEntity (pattern dupliqué). record_cicatrice serialize tags via {} litteral. A refactorer un jour : ajouter Entity.HAS_DATE_UPD = True/False et _esc list -> PG array.

Cause racine : Entity.fields whiteliste les colonnes mais pas de notion HAS_DATE_UPD ; et _esc dispatch type uniquement str/int/None/datetime, pas list/dict pour PG types complexes.

TuringModéréparsing
17 mai 2026

Erreur : ChantierEntity._select_full retournait [] pour les travaux dont next_action ou current_task contenait un saut de ligne. Symptome : /chantier --show self-improving-memory affichait 0 travail actif malgre 5 travaux en planning.

Check ajouté : Nouveau helper _run_sql_csv dans synedre/ac_entities/base.py utilise psql -A --csv -t et parse via csv module (RFC 4180, gere le quoting des newlines). _select_full bascule dessus.

Cause racine : _run_sql_read utilise psql -tA -F tab qui separe les rows par newline. Quand une cellule TEXT contient un newline interne, out.splitlines le coupe en plusieurs lignes ; chacune a moins de tab-cells que cols attendus ; _select_full filtre silencieusement via if len(cells) < len(col_list): continue.

TuringModéréConvention
29 avril 2026

Erreur : chore(headless): ac_invoice manifest — list routes API exposées (Phase 5 fix) (commit 935d506b)

Check ajouté : chore(headless): ac_invoice manifest — list routes API exposées (Phase 5 fix)

TuringModéréConvention
29 avril 2026

Erreur : Phase 5 — drift schéma siret + completed_at (commit 7ce275e2)

Check ajouté : Phase 5 — drift schéma siret + completed_at

TuringModéréConvention
28 avril 2026

Erreur : récap paiement complet (livraison + ref + code promo + remise) (commit 24b72dca)

Check ajouté : récap paiement complet (livraison + ref + code promo + remise)

TuringModéréConvention
27 avril 2026

Erreur : un employee staff ne débloque plus prix/panier sur le front (commit 70e9c7a4)

Check ajouté : un employee staff ne débloque plus prix/panier sur le front

TuringModéréConvention
27 avril 2026

Erreur : mirror PS native /img/c devient fail-loud (commit b4f397a3)

Check ajouté : mirror PS native /img/c devient fail-loud

TuringModéréConvention
27 avril 2026

Erreur : cover hub URL alignée sur PS native /img/c (DB-Only) (commit 67d06468)

Check ajouté : cover hub URL alignée sur PS native /img/c (DB-Only)

TuringModéréConvention
27 avril 2026

Erreur : pilier root FAQ plus hardcodée à [] (commit 80180f39)

Check ajouté : pilier root FAQ plus hardcodée à []

TuringModéréConvention
27 avril 2026

Erreur : pilier root aggregate plus hardcodé à 0 (commit d45363ef)

Check ajouté : pilier root aggregate plus hardcodé à 0

TuringModéréConvention
26 avril 2026

Erreur : --apply-llm safe par défaut (INSERT-only) (commit 3bc02345)

Check ajouté : --apply-llm safe par défaut (INSERT-only)

TuringModéréConvention
26 avril 2026

Erreur : tri Pertinence — NULL position en dernier (était premier) (commit c9a68b90)

Check ajouté : tri Pertinence — NULL position en dernier (était premier)

TuringModéréConvention
26 avril 2026

Erreur : tri Pertinence respecte position de la cat exacte (commit b4ee437f)

Check ajouté : tri Pertinence respecte position de la cat exacte

TuringModéréConvention
26 avril 2026

Erreur : consulter ps_alias pour mapper les fautes de frappe (commit 740877dc)

Check ajouté : consulter ps_alias pour mapper les fautes de frappe

TuringModéréConvention
26 avril 2026

Erreur : send mail en Node natif (pas de spawn Python) (commit 8d3679ae)

Check ajouté : send mail en Node natif (pas de spawn Python)

TuringModéréConvention
26 avril 2026

Erreur : défaut âge max 720h (30j) au lieu de 168h (7j) (commit b7ad17dd)

Check ajouté : défaut âge max 720h (30j) au lieu de 168h (7j)

TuringModéréConvention
26 avril 2026

Erreur : suffixe id_product au slug d'URL produit (commit 869616bf)

Check ajouté : suffixe id_product au slug d'URL produit

TuringModéréConvention
26 avril 2026

Erreur : URL produit fallback contexte cat parcourue (SMOKE) (commit a744e7b3)

Check ajouté : URL produit fallback contexte cat parcourue (SMOKE)

TuringModéréConvention
26 avril 2026

Erreur : skip tokens mono-caractère (résidu d'apostrophe) (commit 563b091e)

Check ajouté : skip tokens mono-caractère (résidu d'apostrophe)

TuringModéréConvention
26 avril 2026

Erreur : query-string `?fc=module` au lieu de pretty URL `/module/X/Y` (commit 37bf5e55)

Check ajouté : query-string `?fc=module` au lieu de pretty URL `/module/X/Y`

TuringModéréConvention
26 avril 2026

Erreur : orphan fallback + minimal clean si parent dedup trop agressif (commit 8d4654d6)

Check ajouté : orphan fallback + minimal clean si parent dedup trop agressif

TuringModéréConvention
26 avril 2026

Erreur : nbProducts compte ps_category_product (et non id_category_default) (commit 1cebe7b4)

Check ajouté : nbProducts compte ps_category_product (et non id_category_default)

TuringModéréConvention
26 avril 2026

Erreur : sanitize literals JSON dans tous les sql_escape LLM-driven (commit e8c0a0e9)

Check ajouté : sanitize literals JSON dans tous les sql_escape LLM-driven

TuringModéréConvention
26 avril 2026

Erreur : mirror category cover vers PS native /img/c (commit ca3c1426)

Check ajouté : mirror category cover vers PS native /img/c

TuringModéréConvention
26 avril 2026

Erreur : détection Nuxt PM2 + refacto Active Record (commit 1b02eb17)

Check ajouté : détection Nuxt PM2 + refacto Active Record

TuringModéréConvention
26 avril 2026

Erreur : exclude paires avec produits supprimés/inactifs (commit e7a327c1)

Check ajouté : exclude paires avec produits supprimés/inactifs

TuringModéréConvention
25 avril 2026

Erreur : graduated silo scoring (exact-name > partial) (commit 3001f998)

Check ajouté : graduated silo scoring (exact-name > partial)

TuringModéréConvention
25 avril 2026

Erreur : silo classifier — single-lang + ambiguity-aware (commit 3b44c927)

Check ajouté : silo classifier — single-lang + ambiguity-aware

TuringModéréConvention
25 avril 2026

Erreur : pillar = id_parent === 2, not just "has children" (commit 69bb852e)

Check ajouté : pillar = id_parent === 2, not just "has children"

TuringModéréConvention
25 avril 2026

Erreur : tie-breakers — hits then shallow-first (commit f6b296e4)

Check ajouté : tie-breakers — hits then shallow-first

TuringModéréConvention
25 avril 2026

Erreur : preserve pilier in internal URLs for category content (commit bc16a28d)

Check ajouté : preserve pilier in internal URLs for category content

TuringModéréConvention
25 avril 2026

Erreur : exclude product_id=0 (orphan legacy import lines) (commit abcc4b03)

Check ajouté : exclude product_id=0 (orphan legacy import lines)

TuringModéréConvention
25 avril 2026

Erreur : forceEmployee dans hub-auth + /hub/login (multi-tenant) (commit 8260047f)

Check ajouté : forceEmployee dans hub-auth + /hub/login (multi-tenant)

TuringModéréConvention
25 avril 2026

Erreur : non connecté → /hub/login avec redirect, plus la home publique (commit e81c6621)

Check ajouté : non connecté → /hub/login avec redirect, plus la home publique

TuringModéréConvention
25 avril 2026

Erreur : mode --repair-redirects-from + double redirect par produit (commit 19433b25)

Check ajouté : mode --repair-redirects-from + double redirect par produit

TuringModéréConvention
25 avril 2026

Erreur : feat(routing): URL produit /{path}/{slug}-{id} (suffixe id PrestaShop) (commit 29644706)

Check ajouté : feat(routing): URL produit /{path}/{slug}-{id} (suffixe id PrestaShop)

TuringModéréConvention
25 avril 2026

Erreur : cats — min_tokens=1, préserve chiffres, no dédup parent + anti-collision (commit 17042d2e)

Check ajouté : cats — min_tokens=1, préserve chiffres, no dédup parent + anti-collision

TuringModéréConvention
24 avril 2026

Erreur : aligne client_id seed 'smokevape-v2' → 'smokevapeshop-v2' (commit 865a45de)

Check ajouté : aligne client_id seed 'smokevape-v2' → 'smokevapeshop-v2'

Avis vérifiés

Nos clients parlent de nous

5.0 / 5

33 avis clients

Nous travaillons avec Alexandre depuis quelques mois et sommes ravis de son a

Nous travaillons avec Alexandre depuis quelques mois et sommes ravis de son accompagnement. Alexandre comprend parfaitement les enjeux et problématiques liés à notre activité et parvient, en réponse, à nous apporter des solutions techniques et fonctionnelles en respectant coûts et délais.

Office

MONOGRAM

Malt

La résolution de mes problèmes à été rapide et efficace, je recommande :)

La résolution de mes problèmes à été rapide et efficace, je recommande :).

Marine

MES-Distribution

Malt

Super

Super

Jl

Kaigan

Malt

Au Top

Au Top. tout simplement

Elite Cbd

Canna Elite Europe Ltd

Malt

Configuration d''un VPS et migration réalisée avec succès, bons conseils, dia

Configuration d'un VPS et migration réalisée avec succès, bons conseils, diagnostique rapide et efficace de nos problèmes. Je recommande.

Lorie

GRIIN outdoor

Malt

Toujours aussi clair et clairvoyant

Toujours aussi clair et clairvoyant... ;) Un plaisir de travailler avec Alexandre

Elite Cbd

Canna Elite Europe Ltd

Malt