== PIPELINE GUARD RESCUE / RÉCAP COMPLET == When: 2025-10-19T21:44:57 Area: guard + wrappers + steps KB Author: chatgpt-mentor (one-shot emit) A. Erreurs de parsing NowIso - Symptômes: "Une expression est attendue après («", "UnexpectedToken" sur (NowIso()), "yyyyMMdd_HHmmss(NowIso)". - Causes: appel parenthésé et sous-expression inconsistants; résidus "yyyyMMdd_HHmmss(" après patchs. - Correctif: function NowIso { (Get-Date).ToString('s') } et utilisation simple dans -f, sans "yyyyMMdd_HHmmss(" ni ()). - Statut: FIX (guard 1.2.7). B. Transmission d’arguments (Root/Preview/Execute) - Symptômes: "Root : -Root" (valeur collée), "-Preview-Root" concaténé, chemins vides/Null (Join-Path/Test-Path). - Causes: construction d’array d’args bancale (& @call), ordre/concat de switches. - Correctifs: - Construction robuste d’args (tableau ordonné), pas de concat. - Passer **seulement** -Root aux steps qui ne gèrent pas -Preview/-Execute. - Statut: FIX (guard 1.2.5+). C. Steps ne supportant pas -Preview/-Execute - Symptômes: * kb_bulk_ingest_v1.3.ps1 : "PositionalParameterNotFound -Preview" * kb_ascii_scrub_v1.0.ps1 : idem * kb_emit_bootpack_dual_v1.1.ps1 : idem * kb_acceptance_tests_v1.0.ps1 : "MaxKbBytes: cannot convert -Preview to Int32" * kb_quicklog_and_sync_v1.3.ps1 : ne prend pas -Preview en param. - Correctif: ne plus injecter -Preview/-Execute à ces scripts; leur passer uniquement -Root si requis. - Statut: FIX (guard 1.2.6+). D. Cache & sync - Symptôme: "[ERR] Script not found in cache". - Correctif: Robocopy + check avant exécution. - Statut: OK. E. Fichiers .cmd encodés avec BOM - Symptôme: "´╗┐@echo off" en tête. - Cause: UTF-8 avec BOM. - Correctif: réécriture **UTF-8 sans BOM**. - Statut: OK. F. Récursion wrapper (stack overflow) - Symptôme: "*** La récursivité de la commande dépasse les limites de la pile ***". - Cause: préview .cmd se ré-invoquant indirectement. - Correctif: appel direct PowerShell sur le cache, trace d’entrée, zéro auto-réentrée. - Statut: OK. G. Null/Empty Root - Symptômes: Join-Path / Test-Path "Empty/Null not allowed". - Cause: mauvais binding des args. - Correctif: passage propre de -Root (cf. B/C). - Statut: OK. H. Patches regex fragiles - Symptôme: "-ireplace … BadReplaceArgument". - Leçon: éviter les remplacements regex trop malins; préférer réécriture simple/atomique. - Statut: Doctrine "rustique" assumée. I. Acceptance: null deref sur pointer path - Symptôme: InvokeMethodOnNull (ToLower()) quand var Null. - Correctif: gardes Null avant comparaison. - Statut: OK (PASS). J. Manifest (emit_resume_manifest) - Symptômes: "Expression manquante après ','", bloc non fermé (Split-Path …). - Cause: bloc tapé à la main → coquilles. - Statut: Non bloquant (à reprendre plus tard si besoin). K. État validé (derniers runs) - KB size=14461 sha=01289cd5f289580cb63bda28ca8d5b43e079f914d23e6aa769a9fa6380f28442 entries=30 nonAscii=0 atHashtable=0 - PASTE size=14300 sha=c0e4072af714f24893106dd5f800f71a642e8add205820ad363c0d5550db951e entries=30 nonAscii=0 - BOOT size=637 sha=c79e58bfab903fcf8a070c24dcc6dceda3eed1faf76964c06cda061f82512b46 - PTR==PASTE: path=True sha=True entries=True size=True - Acceptance: PASS ; Quicklog OK ; Compare-Lite OK. L. Garde-fous "do-not-break-again" - Ne jamais réintroduire "yyyyMMdd_HHmmss(NowIso)" ni "(NowIso())". - Ne pas pousser -Preview/-Execute aux steps qui ne les prennent pas. - Conserver les .cmd en UTF-8 **sans** BOM. - Aucune auto-réentrée dans les wrappers. - Argument arrays simples, sans concat de switches. Fin de note.