# Changelog of French Company Enricher — SIREN to Full Legal Dossier (`dr1ms/french-company-enricher`) Actor

- **URL**: https://apify.com/dr1ms/french-company-enricher/changelog.md
- **Full Actor documentation**: https://apify.com/dr1ms/french-company-enricher.md

## Changelog

Toutes les modifications notables de cet Actor sont documentées ici.
Format : [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/).

### \[0.3.5] — 2026-04-20

#### Corrigé (critique)

- **Bug proxy wiring** : `proxyConfiguration` de l'input était parsée mais jamais appliquée au client httpx. Impact : tier premium/full en cloud Apify se voyait bloqué au firewall INPI (`ConnectError`) même avec proxy activé. Fix : client httpx dédié pour INPI, routé via proxy si configuré.
- Séparation des clients HTTP : `public_client` (DINUM/BODACC/VIES, en direct) et `inpi_http_client` (INPI, via proxy si configuré). Évite de brûler des crédits proxy pour des APIs publiques non protégées.

#### Documentation

- README : section proxy avec warning explicite sur le blocage firewall INPI depuis les IPs datacenter Apify.
- Input schema : `proxyConfiguration.prefill` par défaut à Residential FR pour activer le comportement correct immédiatement.

### \[0.3.3] — 2026-04-20

#### Robustesse cloud

- **INPI login : retry sur 5xx/timeouts** (3 tentatives, backoff 5s/10s/20s). Seuls 401/403 = fatal (credentials invalides). Nouvelle exception `INPITransientError` pour distinguer auth-fail vs service-down.
- **DINUM : concurrence réduite à 3** (vs 5) + 5 retries avec backoff exponentiel capé à 30s. L'IP sortante Apify étant partagée, le rate-limit 429 est fréquent en cold start.
- **Nouvelles exceptions DINUM** : `DinumRateLimitError` et `DinumUnavailableError` pour que le pipeline émette un item d'erreur explicite (`error: "DINUM_RATE_LIMITED"` ou `"DINUM_UNAVAILABLE"`) au lieu de silencieusement dropper la query.
- **Pipeline** : `INPITransientError` (INPI temporairement down) n'interrompt plus le run entier — warning + dossier DINUM-only retourné, comportement cohérent avec un tier dégradé.

#### Tests

- +8 tests DINUM (retries, rate limit, 5xx, timeouts mixés) — `tests/test_dinum_mocked.py`.
- +4 tests INPI (retry 5xx, transient persistent, timeout, 401 fail-fast) — `tests/test_inpi_mocked.py`.

#### Corrigé

- Bug : `RESOLUTION_FAILED` ne s'incrémentait pas dans `itemsPushed` alors que l'item était pushé.

### \[0.3] — 2026-04-18

#### Ajouté

- **Version initiale de l'Actor** avec les 4 tiers basic / standard / premium / full.

#### Tests locaux

- 51 tests unitaires (`tests/test_main.py`) : resolver, utils, merger, config.
- 10 tests d'intégration INPI (`tests/test_inpi_mocked.py`) avec respx : token lifecycle, 401 re-login, 404, PDF download, /diff, /diff/count.
- 8 tests end-to-end (`tests/run_local.py`) couvrant les 8 scénarios du plan de test (SIREN basic/standard/premium, cache hit, nom libre, SIREN invalide, multi-SIREN fan-out, monitoring).

#### Corrections détectées en test local

- `Actor.on(Event.PERSIST_STATE, ...)` : l'Apify SDK v2 exige les enums `crawlee.events.Event` (via `from apify.events import Event`), pas les strings.
- DINUM `/search` : le param `include=` ne peut être utilisé qu'avec `minimal=True`. Appel sans `include` pour les recherches par SIREN (schéma complet par défaut), avec `minimal=True&include=score,...` pour les recherches par nom libre (score Lucene nécessaire pour la désambiguïsation).
- `ambiguityThreshold` : passage d'un seuil absolu à un ratio top/second (en %). Le score DINUM est un score Lucene non normalisé.
- Support des 4 formes d'input : SIREN, SIRET, nom libre, URL annuaire/pappers.
- Résolution async avec sémaphores par source (DINUM 5, BODACC 10, INPI 10, VIES 5).
- Mode monitoring via `/diff` INPI + watchlist + diff par rapport à la version précédente.
- Cache KV store avec TTL par source (DINUM 1j, BODACC 1j, INPI 7j, PDFs 365j).
- Persistence d'état pour reprise après migration.
- Pay-Per-Event pour facturation granulaire.
- Tests unitaires (résolution, parsing, merge, config).

#### Documenté

- Warnings explicites pour les données RNE obsolètes (> 365 jours).
- Matrice de 20+ labels DINUM (Bio, Qualiopi, RGE, ESS, société à mission, convention collective, etc.).
- Timeline BODACC complète avec parsing des JSON internes.
- Graphe dirigeants personne morale (commissaires aux comptes, holdings).
- Liste des élus pour les collectivités territoriales.
- Validation TVA via VIES UE.
