Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6d1d69f255 | |||
| 12cfaaa2ed |
@@ -1,5 +1,53 @@
|
|||||||
# Activity Log · 2026-08-03 · Claude Code DTP Worker
|
# Activity Log · 2026-08-03 · Claude Code DTP Worker
|
||||||
|
|
||||||
|
## Session 083713 · Gate `constraints-guard` RED réparé — nouveau doc REFERENCE `OTO_DESIGN_SYSTEM_v1.md` (mention VPS, pas usage) + inconsistance chemin re-signalée à Michel
|
||||||
|
|
||||||
|
**Contexte.** `./run_ci.sh` au démarrage : **29 PASS · 1 FAIL** — régression NEUVE
|
||||||
|
(`constraints-guard`) apparue avec le commit `9c062ef` (« REFERENCE · OTO Design System
|
||||||
|
v1 »), qui a ajouté `OTO_DESIGN_SYSTEM_v1.md` à la racine. Toutes les autres dimensions
|
||||||
|
vertes ; arbre propre.
|
||||||
|
|
||||||
|
**Cause racine (faux-positif · classe identique à la session 010630).** Le §15 du doc
|
||||||
|
« **Fichiers canoniques sur VPS** » liste, en **inventaire** descriptif, deux emplacements
|
||||||
|
`/var/www/html/static/` <!-- ci-allow : citation de la cause, jamais un usage --> (assets concierge + scripts UI canoniques). Le garde (dont
|
||||||
|
l'en-tête déclare « détecte l'**USAGE**… PAS sa simple **mention** ») a mordu ces deux
|
||||||
|
lignes — mais ce sont des **mentions** d'emplacements *servis* par nginx
|
||||||
|
(`/var/www/html/static` = **SYMLINK** de `/opt/oto/sites/static`, cf. CLAUDE.md §VPS), pas
|
||||||
|
une **écriture exécutable**. L'usage réel vivrait dans un `.sh`/`.py`/`.yml` — toujours
|
||||||
|
scannés.
|
||||||
|
|
||||||
|
**Pourquoi PAS d'édition du doc fautif.** (1) Root-owned `root:root 644` — **non éditable**
|
||||||
|
par `otoclaude` (`-w` négatif) → l'escape `ci-allow` par ligne est **inapplicable**.
|
||||||
|
(2) Document **ajouté par un commit REFERENCE que je n'ai pas créé** → principe « surface,
|
||||||
|
don't overwrite ». Exactement la situation de la session 010630 (fichiers root-owned de
|
||||||
|
Michel).
|
||||||
|
|
||||||
|
**Correctif — au niveau du garde que je possède (`ci/`), 2+ solutions pesées.**
|
||||||
|
- *Option retenue* : ajout de `OTO_DESIGN_SYSTEM_*.md` (glob → survit à un futur `_v2`) aux
|
||||||
|
exclusions de `tracked_files()`, **même catégorie** que `AUTORISATIONS_*.md`/`DIRECTIVE_*.md`
|
||||||
|
(docs racine énumérant *nécessairement* des chemins VPS en tant que mention). En-tête du
|
||||||
|
garde + `ci/README.md` §exclusions mis en cohérence (raison + inventaire-vs-usage documentés).
|
||||||
|
- *Option écartée* : demander à Michel de rendre le doc éditable pour y poser des `ci-allow`
|
||||||
|
— plus lourd, casse à chaque re-push du doc ; le fix dans MON `ci/` est durable.
|
||||||
|
|
||||||
|
**Détection vraie-positive PRÉSERVÉE (mutation-test, [[guard-constraints-flags-usage-not-mention]]).**
|
||||||
|
Un `.sh` temporaire commité avec les 3 usages littéraux (écriture chemin statique VPS, URL
|
||||||
|
GitHub, appel Stripe) → le garde **mord les 3** (✗). Seule la prose de référence/gouvernance
|
||||||
|
`.md` est exclue ; `CLAUDE.md` (constitution) **reste scanné**. Aucun trou vers un usage
|
||||||
|
forbidden dans du code.
|
||||||
|
|
||||||
|
**⚠️ INCONSISTANCE RE-SIGNALÉE À MICHEL (non tranchée par le garde).** Le §15 liste le chemin
|
||||||
|
**servi** `/var/www/html/static/` <!-- ci-allow : citation de l'inconsistance signalée --> alors que le mandat (CLAUDE.md · Interdits absolus + §VPS)
|
||||||
|
préfère la **source** `/opt/oto/sites/static/` (le premier étant le symlink du second). Même
|
||||||
|
inconsistance chemin-servi-vs-source que la l.35 d'`AUTORISATIONS_*.md` déjà signalée le
|
||||||
|
010630. Documentée ici + `ci/README.md`, **pas masquée, pas tranchée** (décision archi → Michel).
|
||||||
|
|
||||||
|
**Vérifications.** `./run_ci.sh` → **30 PASS · 0 FAIL · 0 SKIP** (rétabli). Mes propres
|
||||||
|
mentions du chemin dans `ci/README.md` (description de l'exclusion) marquées `ci-allow`
|
||||||
|
(motif l.100 préexistant). **Zéro nouveau module · zéro gate ajouté (#5)** — le garde n'est
|
||||||
|
pas affaibli (mutation 3/3 RED sur usage code), corrigé d'un faux-positif conforme à sa
|
||||||
|
propre philosophie. Aucune commande touchant au VPS (#8) · aucun `git clean` <!-- ci-allow : mention de l'interdit absolu, jamais exécuté -->.
|
||||||
|
|
||||||
## Session 063711 · Sprint 5/8 · Canal 2 `daily_reports/` remis à jour (3 sessions manquantes depuis 040643)
|
## Session 063711 · Sprint 5/8 · Canal 2 `daily_reports/` remis à jour (3 sessions manquantes depuis 040643)
|
||||||
|
|
||||||
**Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **30 PASS · 0 FAIL · 0 SKIP**,
|
**Contexte + choix de tâche.** `./run_ci.sh` au démarrage : **30 PASS · 0 FAIL · 0 SKIP**,
|
||||||
|
|||||||
@@ -0,0 +1,140 @@
|
|||||||
|
# 💰 DIRECTIVE · Module Financement Bancaire COMPLET · 2026-08-03
|
||||||
|
|
||||||
|
## Exigence Michel (2026-08-03 · 05h AM voyage)
|
||||||
|
|
||||||
|
Le module Financement Bancaire actuel est trop simpliste. Michel demande un module COMPLET pour un vrai parcours bancaire immobilier RD.
|
||||||
|
|
||||||
|
## Composants OBLIGATOIRES
|
||||||
|
|
||||||
|
### 1. Section « Information de l'achat » (auto-remplie)
|
||||||
|
Résumé de la réservation en cours ·
|
||||||
|
- Projet · code + nom (P01 Coralis, P03 Nakua, etc.)
|
||||||
|
- Unité · référence + typologie + surface + orientation + étage + prix USD
|
||||||
|
- Plan de paiement · 20% résident / 30% étranger + solde bancable
|
||||||
|
- Apport déjà versé · dépôt de réservation + éventuels versements
|
||||||
|
- Solde à financer · calcul auto (prix - apport - autres versements)
|
||||||
|
- Statut Fideicomiso Ley 189-11 · constitué OUI/NON
|
||||||
|
- Statut CONFOTUR · exonération Ley 158-01 confirmée OUI/NON
|
||||||
|
|
||||||
|
### 2. Section « Choix de la banque partenaire »
|
||||||
|
Liste des banques dominicaines partenaires OTOV7 avec profils ·
|
||||||
|
- **Banreservas** · banque d'État · taux préférentiels résidents · durée jusqu'à 25 ans · LTV 80%
|
||||||
|
- **Banco Popular Dominicano** · réseau large · rapide · CONFOTUR-friendly · LTV 75-85%
|
||||||
|
- **BHD León** · haut de gamme · étrangers acceptés · biling · durée 30 ans
|
||||||
|
- **Banco Santa Cruz** · taux compétitifs · pré-qualif rapide
|
||||||
|
- **Scotiabank Republica Dominicana** · étrangers spécialistes · devise USD acceptée · LTV 70%
|
||||||
|
- **López de Haro** · niche haut de gamme
|
||||||
|
- Autre · à ajouter selon demande spécifique
|
||||||
|
|
||||||
|
Chaque banque doit afficher · taux min-max %, LTV%, durée max ans, spécialités (résidents / étrangers / CONFOTUR / devises acceptées), documents typiquement requis.
|
||||||
|
|
||||||
|
Le client choisit UNE banque en priorité (radio button). Possibilité d'ajouter des banques additionnelles en parallèle (multi-dossiers).
|
||||||
|
|
||||||
|
### 3. Section « Formulaires banque pré-remplis »
|
||||||
|
Pour chaque banque, générer automatiquement les formulaires officiels PDF de la banque, pré-remplis avec ·
|
||||||
|
- Données personnelles (nom, prénom, cédula/passeport, téléphone, courriel, adresse, statut marital, dépendants)
|
||||||
|
- Données financières client (revenu mensuel, autres crédits, épargne)
|
||||||
|
- Données achat (projet, unité, prix, apport)
|
||||||
|
- Données WAG vendeur (RNC, adresse, coordonnées)
|
||||||
|
|
||||||
|
**Formulaires typiques par banque** (à obtenir en vrai de chaque banque via démarche relationship manager) ·
|
||||||
|
- Solicitud de Préstamo Hipotecario
|
||||||
|
- Autorización de investigación creditica (DataCrédito)
|
||||||
|
- Declaración jurada de patrimonio
|
||||||
|
- Autorización débito automático quote-part
|
||||||
|
- Certificación de origen de fondos (pour étrangers)
|
||||||
|
|
||||||
|
Le client télécharge le PDF pré-rempli, le VÉRIFIE, le SIGNE, le RE-UPLOAD via l'interface. Un journal audit trace chaque signature.
|
||||||
|
|
||||||
|
### 4. Section « Exigences bancaires par banque »
|
||||||
|
Liste explicite des documents que la banque exige, cochée automatiquement au fur et à mesure des uploads.
|
||||||
|
|
||||||
|
Documents typiques (varient selon banque) ·
|
||||||
|
- **Client** · Cédula ou Passeport (2 côtés), Preuve d'adresse récente (<3 mois), 3 dernières fiches de paye ou déclarations ITBIS/DGII, États bancaires 6 derniers mois, Lettre employeur ou attestation profession libérale, Certification de solvabilité, Certification DataCrédito (délivré par banque)
|
||||||
|
- **Immobilier** · Promesa Irrévocable signée notariée, Fideicomiso Inmobiliario constitué, Titre définitif ou Certificado de Título (si disponible)
|
||||||
|
- **Étrangers uniquement** · Passeport valide 2 côtés, Visa/résidence si applicable, Lettre origine des fonds notariée (FinCEN GTO), Références bancaires internationales, Références commerciales/personnelles
|
||||||
|
|
||||||
|
Chaque item · statut (Non déposé / Déposé / Validé WAG / Envoyé banque), bouton Upload, prévisualisation, remplacement possible.
|
||||||
|
|
||||||
|
### 5. Section « Autorisations à signer »
|
||||||
|
Documents que le client doit signer AVANT que WAG envoie le dossier à la banque ·
|
||||||
|
- Autorisation de partage de données personnelles avec la banque (RGPD/Ley 172-13)
|
||||||
|
- Autorisation d'investigation DataCrédito
|
||||||
|
- Mandat WAG comme intermédiaire de financement
|
||||||
|
- Acknowledgment · risques de refus bancaire + politique annulation
|
||||||
|
|
||||||
|
Signature électronique OTO Sign™ (DocuSeal) sur chaque autorisation, horodatée + IP + hash.
|
||||||
|
|
||||||
|
### 6. Mention CRITIQUE affichée en permanence
|
||||||
|
|
||||||
|
En haut du module Financement Bancaire, bandeau rouge/or persistant ·
|
||||||
|
|
||||||
|
> ⚠ **AUCUN DOCUMENT N'EST TRANSMIS À LA BANQUE tant que ·**
|
||||||
|
> · **TOUS les documents exigés** ne sont pas déposés dans le portail
|
||||||
|
> · **TOUTES les autorisations** ne sont pas signées électroniquement
|
||||||
|
> · **Validation manuelle WAG** confirmée par le conseiller référent
|
||||||
|
>
|
||||||
|
> Le bouton « Envoyer à la banque » reste **désactivé** tant que ces 3 conditions ne sont pas remplies. Statut affiché en temps réel.
|
||||||
|
|
||||||
|
### 7. Statut envoi banque temps réel
|
||||||
|
Une fois toutes conditions remplies, le bouton « Envoyer à la banque » s'active. Après envoi ·
|
||||||
|
- Timestamp exact de l'envoi
|
||||||
|
- Confirmation email + WhatsApp au client
|
||||||
|
- Numéro de dossier banque attribué
|
||||||
|
- Timeline switch vers workflow suivi banque (Prequalifié → Dossier soumis → Analyse crédit → Offre reçue → Contrat signé → Décaissement)
|
||||||
|
|
||||||
|
### 8. Journal d'activité complet
|
||||||
|
Historique horodaté visible par le client ·
|
||||||
|
- Chaque document déposé (date + heure + IP)
|
||||||
|
- Chaque autorisation signée (date + heure + hash signature)
|
||||||
|
- Chaque interaction WAG (validation, remarque, demande complément)
|
||||||
|
- Chaque étape workflow avancée
|
||||||
|
|
||||||
|
## Architecture technique demandée
|
||||||
|
|
||||||
|
### Backend endpoints à créer/enrichir
|
||||||
|
- `GET /api/hypotheque/banques` (existe · enrichir avec profils complets)
|
||||||
|
- `POST /api/hypotheque/dossier` · créer un nouveau dossier
|
||||||
|
- `GET /api/hypotheque/dossier/{id}` · état complet du dossier
|
||||||
|
- `POST /api/hypotheque/dossier/{id}/document` · upload document exigé
|
||||||
|
- `POST /api/hypotheque/dossier/{id}/authorization` · signer autorisation
|
||||||
|
- `GET /api/hypotheque/dossier/{id}/form/{bank}/{form_type}.pdf` · télécharger formulaire pré-rempli
|
||||||
|
- `POST /api/hypotheque/dossier/{id}/submit` · envoyer à la banque (gate check TOUS docs + autorisations)
|
||||||
|
- `GET /api/hypotheque/dossier/{id}/journal` · historique activité
|
||||||
|
|
||||||
|
### Frontend refonte renderHypotheque
|
||||||
|
Layout accordéon 6 sections · Info achat / Choix banque / Formulaires / Exigences / Autorisations / Envoi
|
||||||
|
Bandeau alerte persistant en haut
|
||||||
|
Timeline visible en bas
|
||||||
|
Journal cliquable expandable
|
||||||
|
|
||||||
|
### Backend gate check
|
||||||
|
Fonction `can_submit_dossier(dossier_id) -> (bool, list_of_reasons)` qui vérifie ·
|
||||||
|
1. Tous les documents `is_required=True` de la banque choisie sont statut `Validé WAG` ou `Envoyé banque`
|
||||||
|
2. Toutes les autorisations sont signées (`signature_date NOT NULL`)
|
||||||
|
3. Un conseiller WAG a validé (`wag_validated_by NOT NULL`)
|
||||||
|
|
||||||
|
Si UNE de ces conditions manque, `submit_to_bank()` retourne 403 avec liste raisons détaillées.
|
||||||
|
|
||||||
|
## Estimation effort
|
||||||
|
|
||||||
|
- **Backend** · 5-8 endpoints + gate check + génération PDF formulaires · **3-5 jours**
|
||||||
|
- **Frontend** · refonte renderHypotheque 6 sections + upload UI + bandeau alerte + journal · **2-3 jours**
|
||||||
|
- **Templates PDF** · récupérer les vrais formulaires officiels de 6 banques (démarche relationship management) · **1-2 semaines**
|
||||||
|
- **Tests** · flow complet client + gate check + envoi simulé · **1-2 jours**
|
||||||
|
|
||||||
|
**Total · 3 semaines pour version complète production**
|
||||||
|
|
||||||
|
## Livrable MVP dès ce soir (agents Claude Code DTP)
|
||||||
|
|
||||||
|
**Phase 1 (P0 · MVP) · 4-6h autonome**
|
||||||
|
- Refonte renderHypotheque avec les 6 sections + bandeau alerte
|
||||||
|
- Bouton envoi désactivé + affichage raisons
|
||||||
|
- Upload documents basique (endpoint existant `/api/hypotheque/upload-doc`)
|
||||||
|
- Formulaires PDF templates génériques (placeholder texte pré-rempli)
|
||||||
|
|
||||||
|
**Phase 2 · vrais formulaires banques** · attend démarche externes Michel avec relationship managers
|
||||||
|
|
||||||
|
## Commit régulier
|
||||||
|
|
||||||
|
Chaque livraison majeure · commit Gitea `[Sprint 5 · Financement] description`. Michel voit progression au retour.
|
||||||
+9
-3
@@ -92,15 +92,21 @@ Escape hatch documenté : ajouter `ci-allow` sur une ligne pour l'exclure.
|
|||||||
**Exclusions de fichiers** (`tracked_files()`) — documents qui contiennent
|
**Exclusions de fichiers** (`tracked_files()`) — documents qui contiennent
|
||||||
*nécessairement* les termes interdits en tant que **texte de politique** (mention),
|
*nécessairement* les termes interdits en tant que **texte de politique** (mention),
|
||||||
jamais en usage exécutable : le garde lui-même (il énumère les termes), les workflows
|
jamais en usage exécutable : le garde lui-même (il énumère les termes), les workflows
|
||||||
CI (ils le référencent), et les **mandats signés de Michel à la racine**
|
CI (ils le référencent), les **mandats signés de Michel à la racine**
|
||||||
(`AUTORISATIONS_*.md`, `DIRECTIVE_*.md`) — prose de gouvernance listant règles ET
|
(`AUTORISATIONS_*.md`, `DIRECTIVE_*.md`) — prose de gouvernance listant règles ET
|
||||||
autorisations. L'usage *réel* d'un terme interdit vivrait dans un `.sh`/`.py`/`.yml`
|
autorisations —, et le **design system de référence** (`OTO_DESIGN_SYSTEM_*.md`,
|
||||||
|
root-owned, ajouté par commit `REFERENCE`) dont le §15 « Fichiers canoniques sur VPS »
|
||||||
|
est un **inventaire** d'emplacements servis (`/var/www/html/static/`, symlink de <!-- ci-allow : description de l'exclusion, jamais un usage -->
|
||||||
|
`/opt/oto/sites/static/`) — mention descriptive, pas une écriture. L'usage *réel* d'un
|
||||||
|
terme interdit vivrait dans un `.sh`/`.py`/`.yml`
|
||||||
(**toujours scannés**), donc aucune détection vraie-positive n'est perdue (mutation-test
|
(**toujours scannés**), donc aucune détection vraie-positive n'est perdue (mutation-test
|
||||||
à l'appui). **`CLAUDE.md` reste scanné** : sa prose d'interdits passe via les marqueurs
|
à l'appui). **`CLAUDE.md` reste scanné** : sa prose d'interdits passe via les marqueurs
|
||||||
de prohibition. NB · `AUTORISATIONS_*.md` l.35 « Écriture dans `/var/www/html/static/` » <!-- ci-allow : citation du mandat -->
|
de prohibition. NB · `AUTORISATIONS_*.md` l.35 « Écriture dans `/var/www/html/static/` » <!-- ci-allow : citation du mandat -->
|
||||||
**contredit** l'interdit absolu de CLAUDE.md (le chemin correct est le SYMLINK source
|
**contredit** l'interdit absolu de CLAUDE.md (le chemin correct est le SYMLINK source
|
||||||
`/opt/oto/sites/static/`) — contradiction inter-mandats **signalée à Michel** (à trancher
|
`/opt/oto/sites/static/`) — contradiction inter-mandats **signalée à Michel** (à trancher
|
||||||
par lui, pas masquée par le garde).
|
par lui, pas masquée par le garde). Même inconsistance chemin-**servi**-vs-**source** dans
|
||||||
|
`OTO_DESIGN_SYSTEM_v1.md` §15 (liste `/var/www/html/static/` au lieu de la source <!-- ci-allow : citation de l'inconsistance signalée, jamais un usage -->
|
||||||
|
`/opt/oto/sites/static/`) — **re-signalée à Michel**, non tranchée par le garde.
|
||||||
|
|
||||||
**Non-dérive documentée — `michel/otov7-platform` (CLAUDE.md #2) N'EST PAS une coquille
|
**Non-dérive documentée — `michel/otov7-platform` (CLAUDE.md #2) N'EST PAS une coquille
|
||||||
de `michel/oto-enterprise-os-dtp`, à ne PAS « corriger ».** Un audit doc-vs-réalité relève
|
de `michel/oto-enterprise-os-dtp`, à ne PAS « corriger ».** Un audit doc-vs-réalité relève
|
||||||
|
|||||||
+12
-1
@@ -46,12 +46,23 @@ ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; }
|
|||||||
# CONTREDIT l'interdit absolu de CLAUDE.md (le chemin correct est le SYMLINK
|
# CONTREDIT l'interdit absolu de CLAUDE.md (le chemin correct est le SYMLINK
|
||||||
# source /opt/oto/sites/static/). Contradiction inter-mandats signalée à
|
# source /opt/oto/sites/static/). Contradiction inter-mandats signalée à
|
||||||
# Michel (activity log 2026-08-03) — à trancher par lui, pas par le garde.
|
# Michel (activity log 2026-08-03) — à trancher par lui, pas par le garde.
|
||||||
|
# - le DESIGN SYSTEM de référence à la racine (OTO_DESIGN_SYSTEM_*.md) :
|
||||||
|
# document root-owned, ajouté par un commit REFERENCE (non créé par un agent
|
||||||
|
# worker, non éditable → escape ci-allow par ligne inapplicable). Son §15
|
||||||
|
# « Fichiers canoniques sur VPS » est un INVENTAIRE des emplacements servis
|
||||||
|
# (nginx sert /var/www/html/static, SYMLINK de /opt/oto/sites/static) — une
|
||||||
|
# mention descriptive, pas une écriture exécutable. Même raison que ci-dessus :
|
||||||
|
# l'usage réel vivrait dans du code (.sh/.py/.yml, toujours scanné). NB · ce
|
||||||
|
# §15 liste le chemin SERVI /var/www/html/static/ alors que le mandat préfère
|
||||||
|
# la SOURCE /opt/oto/sites/static/ — même inconsistance chemin-servi-vs-source
|
||||||
|
# que la l.35 d'AUTORISATIONS, re-signalée à Michel (activity log 2026-08-03).
|
||||||
tracked_files() {
|
tracked_files() {
|
||||||
git ls-files -- . \
|
git ls-files -- . \
|
||||||
':(exclude)ci/guard_constraints.sh' \
|
':(exclude)ci/guard_constraints.sh' \
|
||||||
':(exclude).gitea/workflows/*.yml' \
|
':(exclude).gitea/workflows/*.yml' \
|
||||||
':(exclude)AUTORISATIONS_*.md' \
|
':(exclude)AUTORISATIONS_*.md' \
|
||||||
':(exclude)DIRECTIVE_*.md'
|
':(exclude)DIRECTIVE_*.md' \
|
||||||
|
':(exclude)OTO_DESIGN_SYSTEM_*.md'
|
||||||
}
|
}
|
||||||
|
|
||||||
# scan_forbidden <label> <regex-terme>
|
# scan_forbidden <label> <regex-terme>
|
||||||
|
|||||||
Reference in New Issue
Block a user