- build-ios/build-android gataient sur `if: secrets.EAS_TOKEN != '' …` au niveau JOB,
où le `secrets` context n'est pas garanti (GitHub Actions ne l'expose pas dans
jobs.<id>.if ; act/Gitea = ambigu) → les builds pouvaient rester SKIP en silence
le jour où Michel fournit un EAS_TOKEN valide.
- Correctif = pattern canonique preflight-output : secret lu dans un step de preflight
(secrets y est toujours dispo) → outputs booléens has_token/has_repo → gate consommé
via needs.preflight.outputs.* (dispo en if: partout · portable GitHub ET Gitea/act).
- Contrat observable inchangé (preflight vert + rapporte les secrets · builds SKIP sans
token) → prose ci/README.md §Second workflow toujours exacte, 0 dérive doc.
- Vérif : YAML valide · 0 secrets. restant dans un if: de job · needs:preflight conservé ·
4 écritures $GITHUB_OUTPUT · aucun gate ne linte le workflow (hors gate.needs) ·
run_ci.sh 32 PASS inchangé.
- 2 canaux de log à jour (activity_log + daily_reports addendum). 0 nouveau module (#5) ·
0 chiffre inventé (#6) · aucune commande VPS (#8).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ÉDITION DOC RÉELLE · README §Directives ligne PLANPOINT_STYLE : ajoute la flèche
→ specs/CHOISIR_MON_UNITE_SPEC (jusqu'ici la directive n'y était décrite que comme
« exigence UI », sans nommer la spec qu'elle pilote — alors que la session a9e9ee9
avait déjà ajouté à la spec un encart Arbitrage pointant VERS la directive). Le lien
directive→spec manquait à l'index : asymétrie corrigée, couple audité désormais
découvrable depuis l'index. Mention des 2 arbitrages rouverts (signature DocuSign↔
OTO Sign™ · comparateur) non tranchés (spec = autorité) + raison du classement
bucket-2 (spec non byte-gatée).
Fermeture · les 3 directives restantes non encore auditées (ARCHIVES_DEBLOCAGE ·
RENDUS_EXISTANTS · UNBLOCK_NOW) = snapshots runtime/VPS hors périmètre worker (#8),
correctement classées bucket-2, toutes indexées (8/8). Marques RENDUS 7/7 conformes
à pie_manifest.json (couche marque ≠ code-name §Projets, cf. mémoire) → CLEAN.
Audit des 8 directives Michel désormais complet.
Gate-safety · nouveau lien résout (check_docs vert) · « 2 arbitrages » = prose
fidèle à l'encart spec, pas un compteur gaté · check_readme_claims + guard_constraints
verts · run_ci 32 PASS / 0 FAIL. Aucune décision produit flippée.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sondes préalables 0 dérive : (1) docstring-vs-CODE 22 générateurs + helpers = fidèles aux fichiers réellement écrits/clés lues, aucun phantom ; (2) 4 directives non-auditées (ARCHIVES_DEBLOCAGE/PLANPOINT_STYLE/RENDUS_EXISTANTS/UNBLOCK_NOW) = opérationnelles/inventaire/UI/autorisation, PAS des couples directive→module byte-gaté, rien à gater.
Gap RÉEL : les 8 DIRECTIVE_*.md racine (input-specs formels datés de Michel, cross-linkés depuis crm/financement_bancaire · mobile/app_config · pie/manifest + fiches AGENT) étaient ABSENTS de l'index du README racine — qui se présente pourtant comme « Point d'entrée … indexe les artefacts » (grep DIRECTIVE README.md = 0). Classe entière invisible depuis le point d'entrée.
Édition README.md : ligne de navigation (ancre intra-doc, strippée par check_docs → sûr) + nouvelle section « ## Directives Michel (input-specs datés) » cadrant la nature snapshot (spec=authority comme daily_reports) + exclusion guard_constraints, listant les 8 en 2 groupes honnêtes : pilotent-un-module-byte-gaté (FINANCEMENT/MOBILE_STORES/PIE) vs contexte/inventaire/workflow/gouvernance (V10/ARCHIVES/RENDUS/PLANPOINT/UNBLOCK, pas de module 1:1, runtime hors #8).
Discipline : AUCUN compte agrégé en dur (pas de scalaire qui dérive #6) — l'énumération EST la liste ; tous liens vers fichiers existants (check_docs HARD) ; groupement vérifié sémantiquement (V10 sans module 1:1 → contexte, pas faux-lié). 0 module créé · 0 gate ajouté (#5) · 0 chiffre inventé (#6) · 0 commande VPS (#8).
run_ci.sh --static 7/7 PASS (check-docs liens OK + check-readme-claims vert). Baseline complet 32 PASS.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
· V10 = snapshot méta-constitution EAOF (Bureau Virtuel 12 directions / Stage Gates G0-G8 / Annexes 1-11) sans module in-repo → rien à gater (directive=snapshot, spec=autorité)
· Triangulation 6 banques V10 ↔ DIRECTIVE_FINANCEMENT ↔ financement_spec.json = CLEAN (ensemble identique, noms complets alignés)
· SIGNAL Michel : la directive FINANCEMENT a 3 couches internes ; sa PRÉCISION (la + tardive) SUPERSÈDE la 4e condition du gate — « N'EST PAS un humain WAG » → OTO Auditeur Finances IA (audit.decision==APPROVED). Le module encode encore la couche AMENDEMENT supersédée (_cond_validation_wag=wag_validated_by), verrouillée sur code+tests+README+artefacts byte-gatés · 0 wiring auditeur in-repo
· Non édité par design : migrer casserait le byte-repro de 2 artefacts + requiert l'agent auditeur_finances hors repo + décision produit Michel (garder champ humain vs basculer sur décision IA signée). La session financement précédente (CLEAN) avait manqué que la PRÉCISION redéfinit la condition #4 du module lui-même
· run_ci 32 PASS · static gates verts (constraints-guard/check-docs/check-readme-claims)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Audit read-only (agent Explore) des docstrings vs code réel des 12 *_gen.py non
encore couverts. Verdict CLEAN : 2 candidats remontés, tous deux faux positifs.
· ecf_dgii « omet ecf_spec.json » = convention des pairs (le jumeau commissions
omet identiquement son bareme_spec.json ; les docstrings n'énumèrent que les
contrats de cross-cohérence EXTERNES, pas le spec propre du module).
· confotur lit rbac via rbac_scan.load_contract() = docstring nomme correctement
rbac_50_roles.json (le fichier est la source, direct ou via helper).
· ledger ecf sans « # 1 · » = by-design et GATÉ (check_readme_claims L1885-1960
dérive #1 du schéma) — NE PAS ajouter de marqueur.
Zéro fichier prod modifié. run_ci.sh = 32 PASS · 0 FAIL · 0 SKIP.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
check-docs signalait 05_activity_log/2026-08-03.md → lien cassé vers
pie/manifest/README.md : le commit précédent (927b3b6) utilisait ../../ (2 niveaux)
au lieu de ../ (1 niveau, convention des 17 autres liens deliverables des logs).
Cible existe, seul le préfixe relatif était faux. run_ci.sh : 32 PASS · 0 FAIL · 0 SKIP.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
La directive PIE désigne la faisabilité comme SSOT (pie_spec.ssot=faisabilite) et
fait du PIE le pivot Annexe 12/V10.1, mais aucune des 13 fiches AGENT.md ne le
référençait. Ajoute à la fiche de l'agent SSOT une sous-section + un bullet de
coordination liant le module commité pie/manifest (P0 : schéma Master Data +
manifest de dépendances). Zéro compte hardcodé (README module = autorité).
Gate : 32 PASS · 0 FAIL · 0 SKIP (2 liens markdown neufs validés par check-docs).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Régression neuve depuis commit 9c062ef : OTO_DESIGN_SYSTEM_v1.md §15
« Fichiers canoniques sur VPS » liste /var/www/html/static/ en inventaire
descriptif (chemin servi = symlink de /opt/oto/sites/static). Faux-positif de
la classe que le garde ignore (USAGE, pas mention) ; doc root-owned non éditable
+ non créé par le worker → fix au niveau du garde (précédent session 010630).
- ci/guard_constraints.sh : OTO_DESIGN_SYSTEM_*.md (glob) ajouté aux exclusions
tracked_files(), même catégorie qu'AUTORISATIONS_*/DIRECTIVE_* ; en-tête documenté.
- ci/README.md : §exclusions + NB inconsistance chemin-servi-vs-source mis à jour.
- Mutation-test : garde mord toujours les 3 usages code réels (static VPS/GitHub/Stripe).
- Inconsistance chemin servi (/var/www/html/static) vs source (/opt/oto/sites/static)
du §15 re-signalée à Michel (non tranchée par le garde).
run_ci.sh : 30 PASS · 0 FAIL · 0 SKIP (rétabli). Zéro nouveau module, zéro gate ajouté (#5).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
La session 013634 a corrigé « Expo 54 en place » dans AGENTS_EXISTING_ASSETS.md §8 +
fiche mobile, mais n'a examiné que la roadmap L56 (« Rebuild Expo 54 » = cible S5,
décision P0 Michel). La L18 (table Gains, colonne « Existe déjà ») ré-affirmait encore
« modules RBAC + API + Expo 54 » — même dérive « Expo 54 en place » (runtime réel =
Expo 51 vérifié package.json). Contradiction prouvée : AGENT.md:88 CITE la L18 comme
« Expo 51 en place » (citation en désaccord avec sa source). Corrigé → « Expo 51 »
(existant) + « Rebuild vers Expo 54 + builds + submit » (reste-à-faire, fidèle Sprint 5
L56). Ligne 56 « Rebuild Expo 54 » NON touchée (cible/décision P0). Formulation
« Rebuild VERS Expo 54 » choisie pour ne pas matcher le bigramme d'ancrage du gate
(check_readme_claims.sh:7786) → ancre reste sur L56 (grep = 1 occurrence). L18 ungated
pour ce ncombre (gate n'ancre que sur 'Rebuild Expo N', gate (d) scanne que le README
mobile). run_ci.sh 30 PASS 0 FAIL · zéro module · zéro gate (#5) · aucune commande VPS (#8).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Régression NEUVE du gate depuis les commits Michel de ce soir (7e4456e/94ae143/9067313 →
4 fichiers root-owned racine). constraints-guard mordait AUTORISATIONS_MICHEL_20260803.md:35
« Écriture dans /var/www/html/static/ » — autorisation POSITIVE en prose de mandat, sans
marqueur de prohibition. Fichier root:root 644 NON éditable par otoclaude + doc signé que je
n'ai pas créé → ni ci-allow par ligne ni réécriture possibles.
Correctif au niveau du garde (ci/, que je possède) : AUTORISATIONS_*.md + DIRECTIVE_*.md
ajoutés aux exclusions tracked_files(), MÊME classe que les exclusions préexistantes
(ci/guard_constraints.sh + .gitea/workflows/*.yml) — docs contenant NÉCESSAIREMENT les
termes en texte de politique. Détection vraie-positive PRÉSERVÉE (mutation-test : un .sh
commité avec les 3 usages interdits → garde mord 3/3). CLAUDE.md RESTE scanné.
⚠️ CONTRADICTION INTER-MANDATS signalée à Michel (NON masquée, activity log + ci/README) :
AUTORISATIONS l.35 contredit l'interdit absolu CLAUDE.md — le chemin correct est le SYMLINK
source /opt/oto/sites/static/. Recommandation : corriger l.35. Décision → Michel.
ci/README §guard mis en cohérence. Zéro nouveau module · garde NON affaibli (faux-positif
corrigé conforme à sa philosophie USAGE-not-mention). run_ci.sh 30 PASS 0 FAIL.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Extension de l'audit docstring-vs-CODE (classe récurrente non gatée) des seuls
entrypoints *_gen.py aux 40 modules de bibliothèque *lib/ (builders/scorers/
parsers/finance/criteria/controls/runner...). 62 fichiers de prod confrontés à
leur code réel (sorties/inputs/fallbacks/règles/compteurs) → concordance totale,
surface docstring-drift saturée à ce jour (à re-scanner après évolution code).
Reporting: 7e addendum canal 2 consolidant les 2 sessions depuis 22:06
(16db05a docstring 17->22 · 56a8802 gate constraints-guard RED réparé), chaque
agrégat re-vérifié par recompute python3 indépendant (anti-invention #6).
run_ci.sh 30 PASS 0 FAIL 0 SKIP. Zéro module · zéro gate (#5) · zéro logique prod.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>