# write_devlock_debugkit_rule_v1.1.ps1 — SAFE-WRITE + post-hook encodage param([switch]$Preview,[switch]$Write) function Write-NoBOM([string]$p,[string]$t){ $enc=[Text.UTF8Encoding]::new($false); [IO.File]::WriteAllText($p,$t,$enc) } function Ensure-Dir([string]$p){ if($p -and !(Test-Path $p)){ New-Item -ItemType Directory -Force -Path $p | Out-Null } } $registry = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Definition) $rulesDir = Join-Path $registry 'rules' $scriptsDir=Join-Path $registry 'scripts' Ensure-Dir $rulesDir $target = Join-Path $rulesDir 'DEVLOCK-DEBUGKIT-RULE_v1.0.txt' $now = Get-Date -Format 'yyyy-MM-ddTHH:mm:ssK' $txt = @" === DEV-LOCK + DEBUG-KIT — RULE v1.0 === File : DEVLOCK-DEBUGKIT-RULE_v1.0.txt Date : $now Format : TXT-ONLY (UTF-8 sans BOM, CRLF) Scope : Tous projets gouvernés (HUB, SEEDBOX) # OBJECTIF Garantir un traitement systématique et traçable de chaque bug remonté, sans dépendance à l'état du shell, et sans commits tant que la session n'est pas finalisée. Source de vérité = assertions dans [KB_GUARD_ASSERTS] (mode asserts-only). # INVARIANTS - TXT-ONLY ; SAFE-WRITE ; pas d'édition manuelle des fichiers gouvernance. - Gate asserts-only avant tout Write. - DEV-LOCK : aucun commit tant que la session est active. - Ingest pack obligatoire quand BootPack/KB changent. # DÉCLENCHEUR (OBLIGATOIRE) À CHAQUE bug remonté par l'utilisateur : → L'assistant déclenche DEBUG-KIT + passage en DEV-LOCK. # PROCÉDURE (7 ÉTAPES) 1) Nouveau shell → lancer le launcher : \\DS-918\chatgpt\ChatGPT-Gouvernance-Projets\_registry\bin\gov_profile_launcher_latest.cmd 2) F (Start Dev Session) — nom de session proposé : __. 3) 1 (Preview) — profil recommandé explicité (HUB/SEEDBOX). 4) L (Log DEV BUG) — champs fournis par l’assistant : - Résumé court : — <étiquette_bug> — #n - Composant/zone : - Détails : Tentative : # Modification : Jeu de test : Résultat observé : Extrait log/erreur : Hypothèse suivante : (À chaque tentative infructueuse, n++ et nouveau L.) 5) Tests/corrections libres (boucle) — commits interdits par DEV-LOCK. 6) X (Finalize Session) — export ingest pack (PENDING) + suggestions d’asserts. 7) Application auto des ASSERTS + clôture : - \\…\\bin\\apply_kb_guard_asserts_latest.cmd -Write - Launcher : 1 (Preview) → 4 (Validate asserts-only) → U (Release DevLock) → 2 (Write) - Export post-Write auto si BootPack/KB changent. # ARTEFACTS ET PERSISTANCE - DEV_LOCK.flag : bloque Write. - dev_sessions\_\ : session.meta + defects\bug_*.txt - ingest_outbox\ingest_\ : README_INGEST, sha256s, PENDING/DONE flags. - Aucune variable de shell n’est utilisée comme source de vérité. # INTERDITS / RISQUES - Pas d’édition manuelle de BootPack/KB/règles. - Pas de selftests comme seule couverture : asserts-only exigé. - Pas de commit tant que DEV-LOCK non relâché. # CHANGELOG v1.0 — 2025-10-20 — Création === END OF RULE === "@ Write-Host "== WRITE DEVLOCK-DEBUGKIT-RULE v1.0 ==" Write-Host "Target : $target" if(-not $Write){ Write-Host "Mode : Preview (aucune écriture)" exit 0 } # SAFE-WRITE (UTF-8 no BOM + CRLF normalisé par l'éditeur) $parent = Split-Path -Parent $target Ensure-Dir $parent $bak = $target + '.bak_' + (Get-Date -Format 'yyyyMMdd_HHmmss') if(Test-Path $target){ Copy-Item -LiteralPath $target -Destination $bak -Force } $tmp = $target + '.tmp' Write-NoBOM $tmp $txt $shaTmp = (Get-FileHash -Algorithm SHA256 -LiteralPath $tmp).Hash Move-Item -LiteralPath $tmp -Destination $target -Force $shaFinal = (Get-FileHash -Algorithm SHA256 -LiteralPath $target).Hash Write-Host "Backup : $bak" Write-Host ("SHA tmp/final: {0} / {1}" -f $shaTmp,$shaFinal) Write-Host "STATUS : WRITE-OK" # --- POST-HOOK ENCODAGE : vérifie & corrige si nécessaire, puis report Preview Rules --- $encGuard = Join-Path $scriptsDir 'text_encoding_guard_v1.2.ps1' if(Test-Path $encGuard){ Write-Host "ENCODING GUARD — fix ciblé" & 'powershell.exe' -NoProfile -ExecutionPolicy Bypass -File $encGuard -Files $target -Write 2>&1 | Out-Null Write-Host "ENCODING GUARD — scan Rules (preview)" & 'powershell.exe' -NoProfile -ExecutionPolicy Bypass -File $encGuard -Scope 'Rules' -Preview 2>&1 | Out-Null }else{ Write-Host "[WARN] text_encoding_guard_v1.2.ps1 introuvable — post-hook non appliqué." }