Files
oto-enterprise-os-dtp/05_activity_log/2026-08-12.md
T
Claude Code DTP Worker ee88d3698b [DTP-Worker 20260812_040034] cleanup #5 · suppression orphelin out_fresh/ (doublon d'artefacts échappant à tous les gates)
frontend/portails/out_fresh/ (workspace.json + MANIFEST.json) était tracké mais
commité par accident une seule fois (f954cc1, 2026-08-02, scratch « fresh rebuild ») :
byte-identique à out/, produit par RIEN (le générateur n'écrit que dans out/ via
_DEFAULT_OUT), référencé NULLE PART (git grep out_fresh = 0). Il échappait à
check_artifacts (find -type d -name out = match EXACT sur `out`, jamais `out_fresh`)
donc au balayage reverse-bijection → bombe de staleness silencieuse (rien ne le
régénère : dès que la source bouge, out/ se met à jour et out_fresh/ diverge en copie
stale non-possédée). Suppression (out/ intacte, régénère byte-identique). Occurrence
isolée → pas de gate (#5). Candidat is_filled() écarté au byte-level (non-défaut, #6).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-12 04:07:49 +00:00

4.7 KiB

Activity Log · 2026-08-12 · Claude Code DTP Worker

Session 20260812_040034 — CLEANUP #5 · suppression d'un orphelin out_fresh/ (doublon d'artefacts commité par accident, échappe à TOUS les gates)

État au démarrage. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (baseline verte). regression_run.json totals = 629 ran · 612 passés · 17 skippés · 0 échec (PASS). Séquence moteur V18 toujours intégralement bloquée en gouvernance (directive :90-91 « NE PAS coder avant l'audit » · D-06 approbation audit = gate d'entrée · #6) → aucun code moteur légitime. Dernier commit 031b5e7 = PNG DASHBOARD_LUXURY_MODELE_REFERENCE ajouté par Michel (référence design, hors production repo).

Chasse au défaut d'abord (2 axes) → 1 candidat écarté comme NON-DÉFAUT (refus de fabriquer · #6). Explore very-thorough sur les modules produit hors audit_4big/regression/publiciste (déjà balayés). Le seul candidat remonté « confirmé » — faisabilite/generator/genlib/model.py:104 is_filled() exigeant "{{" in text and "}}" in text pour classer un placeholder — a été réfuté au byte-level : le renderer (renderer.py:23-42) n'émet jamais que des placeholders {{...}} complets (deux accolades), brief_incomplete.json n'utilise aucune accolade pour marquer l'absence (il utilise _PLACEHOLDER_ABSENT : « tbd »/« todo »/… + champs omis), et aucune occurrence mono-accolade n'existe dans tout le module. Exiger les deux accolades est donc le choix conservateur correct (flaguer un }} isolé dans de la prose réelle serait un faux positif). L'Explore s'était sur-engagé sur un cas théorique inatteignable → non touché (verify-non-defects).

Vrai locus trouvé = un ORPHELIN ACCUMULÉ (violation #5 « JAMAIS accumuler doublons »), pas un bug. 05_deliverables_mvp/frontend/portails/out_fresh/ (2 fichiers : workspace.json + MANIFEST.json) est :

  • Tracké (git ls-files le confirme) — mais commité une seule fois, dans la session auto f954cc1 du 2026-08-02 (scratch-dir de comparaison « fresh rebuild » commité par accident).
  • Byte-identique à out/ (diff json.tool = IDENTICAL content).
  • Produit par rien : le générateur workspaces_gen.py écrit uniquement dans out/ (_DEFAULT_OUT = os.path.join(_HERE, "out") · -o défaut ./out) — jamais out_fresh.
  • Référencé nulle part : git grep out_fresh sur tout l'arbre tracké (hors le dossier lui-même) = ZÉRO (ni code, ni doc, ni CI, ni .gitignore, ni test).

Pourquoi c'est un vrai défaut et pas un artefact by-design (preuve qu'il échappe à tout gate). check_artifacts.sh découvre les cibles par find -type d -name out — un match exact sur out, donc out_fresh n'entre dans aucun gate de reproductibilité. C'est précisément pourquoi il a survécu au balayage reverse-bijection-artifact-sweep (qui ne vise que les répertoires out/). Conséquence : c'est une bombe à retardement de staleness — rien ne le régénère, donc dès que la source du générateur bouge, out/ se met à jour tandis que out_fresh/ diverge silencieusement en une copie stale, non-possédée et trompeuse (« laquelle fait autorité ? »). Dead weight ungated. C'est l'unique scratch-dir du genre dans tout le repo (find pour out_new/out_old/out_tmp/out_bak/out_fresh → seul out_fresh existe · occurrence isolée).

Fix = suppression (git rm -r out_fresh/). Sûr (réversible via l'historique git), et je ne l'ai pas créé (règle « avant de supprimer, regarde la cible » : contenu byte-identique à la copie autoritaire, aucun consommateur). La copie autoritaire out/ est intacte et se régénère BYTE-IDENTIQUE (rebuild -o /tmp vs out/ = identique, vérifié après suppression).

Pourquoi pas un nouveau gate (#5). Occurrence isolée (origine unique f954cc1, un seul module). Ajouter un gate « aucun répertoire out_* non-out » serait de la sur-ingénierie pour un événement-zéro. La discipline existante (générateur écrit dans out/ · .gitignore documente que out/ est commité) est le contrat ; l'orphelin était une déviation ponctuelle, corrigée à la source.

Vérif. ./run_ci.sh = 33 PASS · 0 FAIL · 0 SKIP (inchangé — rien ne dépendait de out_fresh/). 0 code moteur V18 (bloqué #6), 0 module de production touché (seul un doublon orphelin supprimé · char-class model.py laissée intacte car non-défaut), 0 artefact autoritaire modifié, 0 gate ajouté (#5), 0 commande VPS (#8), 0 API externe. Fichiers : - 05_deliverables_mvp/frontend/portails/out_fresh/{workspace,MANIFEST}.json (supprimés) + ce journal.