Changelog

Changements techniques dans l’infrastructure Sodimo

Dépôt
Catégorie

Audit de périmètre manuel + accounts-playbook promu + nouvelle section /leger/ + schéma de release étendu

Quatre passes d'hygiène sur le manuel interne et le fil de releases. Aucun chapitre n'est supprimé du site destiné à Sodimo — la classification de périmètre est une décision côté publication, non une modification de contenu. Une nouvelle section /leger/ explique l'externalisation sur le site lui-même. Le schéma de release étendu prépare un rendu propre en deux couches : les lignes de release produit (image harness signée, nouveau quadlet, nouveau chapitre LP) d'un côté, les lignes de release tenant (ce qui a réellement été déployé sur le Framework Desktop, quand, contre quel digest harness) de l'autre.

Added
  • Champ scope: sodimo | leger | both dans le schéma du manuel, renseigné rétroactivement sur l'ensemble des 40 chapitres anglais. Décomptes : 17 scope:sodimo (spécifiques à la mission — entreprise, données, réseau, CRM, launchpad, registre de dépôts, décisions ouvertes, agent d'usage informatique), 9 scope:leger (patterns réutilisables — principe boîte noire, trois principes de conception, vault, bibliothèque de skills, registre the-repos, quatre chapitres employee-guide sur CF Pages / coffre de comptes / rotation de clés / SSH), 14 scope:both (patterns partagés avec un chapitre spécifique à Sodimo — partie infrastructure, architecture hybride, Cloudflare, mail, harness, accounts playbook, OpenWebUI, référence quadlet, partie couche IA, pile LLM, outils MCP, Paperclip, annex decisions, section employee-guide)
  • src/content/manual/en/36-accounts-playbook.md — la colonne vertébrale de comptes Google → GitHub → Cloudflare → Tailscale → leger.run, promue depuis DRAFT-baseline-accounts-playbook.md en chapitre ordonné à la position 360
  • Nouvelle section /leger/ de premier niveau dans src/pages/leger/index.astro avec le fichier compagnon src/content/leger/en/overview.md. Une page qui explique la coupure d'externalisation en termes internes Sodimo : décomptes de champ scope, les trois familles d'artefacts (templates de référence / runbooks / checklist-policies), les candidats à la reclassification signalés (38-vault, 34-mail), et le tableau d'état du pipeline. Entrée de navigation ajoutée entre /mcp-tools/ et les actions du site
  • Schéma de release étendu avec les champs scope: product | tenant | both, harness_digest (sha256), harness_digest_prev, image_digest_set (clé trimestrielle comme images-2026-Q2-a), surface, product_release_id, tenant_slug. Une entrée de release peut désormais s'auto-décrire quant à la couche à laquelle elle appartient
Changed
  • Renumérotation des chapitres dans le bloc 36–39 afin que accounts-playbook se retrouve en position 36 et que les chapitres OpenWebUI / vault / quadlet-reference décalent d'un rang : 36-openwebui.md37-openwebui.md, 37-vault.md38-vault.md, 38-quadlet-reference.md39-quadlet-reference.md. Valeurs d'ordre mises à jour (370, 380, 390) ; table des matières et navigation reflètent la nouvelle séquence
  • src/lib/navigation.ts — le nouveau champ scope est propagé pour les futurs rendus filtrés par RENDER_TARGET
  • src/components/SiteHeader.astro, src/layouts/SiteLayout.astro, src/site.config.ts — section Leger enregistrée aux côtés de Manual / Changelog / Skills / MCP tools
  • src/i18n/en.ts + src/i18n/fr.ts — nouveaux blocs de chaînes site.navLeger et leger.* pour l'en-tête de section et le texte d'accueil
Other
  • Rien n'est supprimé du manuel. Les chapitres étiquetés scope: leger restent dans le site destiné à Sodimo ; quand une seconde cible de rendu sera câblée, le même arbre source produira les deux vues
  • Le frontmatter des chapitres français conserve sa forme actuelle — le champ scope sera déployé en FR lors de la prochaine passe de traduction (politique EN-first). La vue d'ensemble /fr/leger/ et les lignes du fil de releases français sont traduites dans cette même livraison
  • Les scripts npm build:sodimo / build:leger restent non câblés. La variable d'environnement RENDER_TARGET est honorée par chaque composant qui branche sur le scope ; les builds frères sont le dernier kilomètre et demeurent sur la liste de suivi

Catalogue des outils MCP — 13 outils, schémas JSON prêts à copier

La section /mcp-tools/ est livrée avec 13 pages de détail couvrant chaque verbe que le MCP Worker sodimo-core expose actuellement, chacune accompagnée d'un schéma d'entrée, d'un schéma de sortie et d'un exemple d'invocation prêt à copier. Met en correspondance la section de gouvernance du chapitre 42 (mcp-tools) avec la référence opérationnelle copier-coller dont une session Claude Code ou OpenWebUI a réellement besoin. Clôture le ticket #4 conformément à D-173.

Added
  • Index /mcp-tools/ avec barre de filtres (catégorie + stabilité) — DOM pur, aucun runtime de framework
  • 13 pages de détail dans src/content/mcp-tools/en/ : erp_read_accounts, erp_read_orders, crm_list_deals, crm_get_contact, crm_upsert_contact, crm_advance_stage, crm_add_activity, crm_search, email_send, email_status, ledger_write, doc_search_piler, whatsapp_send
  • Miroirs FR correspondants dans src/content/mcp-tools/fr/ (26 pages sur les deux locales)
  • src/components/McpToolCard.astro, src/pages/mcp-tools/[name].astro, src/scripts/mcp-filters.ts
  • Bloc i18n mcpTools.* dans src/i18n/en.ts et src/i18n/fr.ts
  • Comportement du bloc de copie partagé avec la section skills — navigator.clipboard en priorité, repli sur execCommand
Changed
  • src/site.config.tsMCP tools ajouté à la navigation principale
  • src/content.config.ts — collections mcp_tools_en + mcp_tools_fr enregistrées avec un schéma typé (enum catégorie, enum stabilité, enum auth, exemples d'invocation et de réponse obligatoires)
Other
  • Smoke Playwright : /mcp-tools/erp_read_accounts/ et /fr/mcp-tools/erp_read_accounts/ — le bouton de copie copie 257 caractères dans navigator.clipboard ; les deux PASS
  • npm run build se termine avec le code 0 ; pagefind indexe 11 030 mots sur les deux locales (147 pages au total)

Section skills partagés — 5 gabarits de prompt prêts à copier

La section /skills/ est livrée avec cinq gabarits de prompt canoniques pour l'équipe, chacun conçu pour s'exécuter en priorité sur la pile locale et n'escalader vers le cloud que lorsque l'équipe le demande explicitement. Chaque skill indique l'audience (employé / admin / agent-runtime), le niveau (local-task / local-heavy / cloud-heavy), les prérequis d'outils, une estimation de coût et un bloc de prompt prêt à copier. Clôture le ticket #3.

Added
  • Index /skills/ avec barre de filtres (audience + niveau)
  • Cinq skills de départ dans src/content/skills/en/ : summarize-email, rewrite-english, translate-fr, look-up-customer, draft-order-ack
  • Miroirs FR correspondants dans src/content/skills/fr/ (10 pages de détail sur les deux locales)
  • src/components/SkillCard.astro, src/components/CopyBlock.astro, src/pages/skills/[slug].astro, src/scripts/copy.ts
  • Bloc i18n skills.* dans src/i18n/en.ts et src/i18n/fr.ts
  • scripts/test-copy.mjs — smoke test Playwright qui sert dist/ et vérifie le contenu de navigator.clipboard sur le bouton de copie
Changed
  • src/site.config.tsSkills ajouté à la navigation principale
  • src/content.config.ts — collections skills_en + skills_fr enregistrées avec un schéma typé (enum audience, enum niveau, prompt et résumé obligatoires)

gpt-oss-120b sur Strix Halo via les flags kyuz0 ; applications smoke-validées

Pile IA locale alignée kyuz0 de bout en bout sur AMD Strix Halo, validée par un smoke test complet sur 8 conteneurs (OpenWebUI → LiteLLM → llama-swap → llama-server), complété d'un pass apps-smoke sur 11 cibles qui a révélé et corrigé de vrais bugs de quadlet dans l'arbre.

Added
  • docs/README.md, docs/kyuz0-toolbox.md, docs/resync-runbook.md — nouvel arbre de documentation décrivant la carte d'interpolation kyuz0, le SHA upstream épinglé (1421e8706020e8d7e797f71b9f28cd3072e7f868), les arbitrages RADV vs AMDVLK vs ROCm sur gfx1151, et un runbook de resynchronisation pas-à-pas pour les futurs bumps upstream kyuz0
  • Jeu de flags Strix-Halo kyuz0 appliqué obligatoirement à chaque modèle dans llama-swap.yaml : --no-mmap -fa on -ngl 999 --batch-size 4096 --ubatch-size 512 --cache-type-k q8_0 --cache-type-v q8_0 --jinja --direct-io --cache-prompt --cache-reuse 256 --threads 12
  • gpt-oss-120b (unsloth UD-Q8_K_XL, GGUF 2 shards, 65k ctx, reasoning_effort=high) câblé comme alias local-heavy
Changed
  • home/dot_config/containers/systemd/llama-swap.yaml — réécriture complète. Invoque /app/llama-server directement au lieu de ramalama --runtime llama.cpp run. Découvert lors de l'intégration que ghcr.io/mostlygeek/llama-swap:vulkan ne contient PAS de binaire ramalama — la config existante était silencieusement cassée au premier chargement de modèle
  • home/dot_config/containers/systemd/llama-swap.yaml — URLs proxy: basculées de http://llama-swap:NNNN (aller-retour DNS netavark) vers http://127.0.0.1:NNNN (netns colocalisé). Le bug DNS interne sous le DNAT hijack d'adguard produisait des 502 après la première requête ; vérifié corrigé (5,4 s à froid, 0,08 s à chaud)
  • home/dot_config/containers/systemd/llama-swap.container — montage de volume ~/.local/share/ramalama~/.local/share/llama-models (layout GGUF brut, pas de format cache ramalama). /dev/kfd + HSA_OVERRIDE_GFX_VERSION=11.0.0 conservés comme candidats à la suppression future (suivi dans #14)
  • home/dot_config/containers/systemd/litellm.yaml — champ modèle local-heavy : openai/gpt-oss-20bopenai/gpt-oss-120b
  • home/dot_config/containers/systemd/twenty.container + twenty-worker.container — image épinglée sur docker.io/twentycrm/twenty:v2.0.0 fully-qualified (la politique de short-name échoue sur les pulls non-TTY sous podman auto-update / bootc)
Fixed
  • home/dot_config/containers/systemd/llama-swap.container — suppression de GroupAdd=keep-groups et PodmanArgs=--group-add=render ; conservation de --group-add=video uniquement. La combinaison précédente était incompatible avec rootless podman 5.8.2 et empêchait llama-swap d'atteindre Active
  • home/dot_config/containers/systemd/postfix.container — lignes Volume=postfix-main.cf et Volume=postfix-master.cf commentées. Les fichiers référencés n'existent pas encore dans le dépôt ; podman échouait à créer le montage. Postfix démarre désormais avec la config POSTFIX_* env-only (rédaction de la vraie config suivie dans #18)
  • home/dot_config/sodimo/paperclip.env.tmpl — ajout de BETTER_AUTH_SECRET=CHANGEME-BETTER-AUTH-32-BYTE-HEX. Paperclip refuse de démarrer sans cette variable
Other
  • Pile IA 8 conteneurs sur le réseau de test 172.30.0.0/24 : qwen3-4b de bout en bout via OpenWebUI → LiteLLM → llama-swap → llama-server : PASS, 11,5 s à froid / 0,08–0,20 s à chaud / 53 tok/s sur RADV Vulkan. Chaque flag kyuz0 vérifié verbatim dans podman top sur le processus llama-server lancé
  • Pile apps 11 cibles sur 172.31.0.0/24 : 9/11 Tier 1 PASS, 3/3 Tier 2 HTTP PASS (vaultwarden /alive, paperclip /api/health, twenty /healthz). Migrations Twenty complétées en ~18 s (bien en dessous du budget de 3–10 min)
  • Runtime gpt-oss-120b différé au harness prod — téléchargement de 100 Go UD-Q8_K_XL infaisable en session + kernel cmdline de la dev-box non kyuz0-tuné (suivi dans sodimo/harness#11)

Buildout du mercredi — référence quadlet, vault, guide employé, jauge de progression

Passe importante sur le contenu et l'outillage : six nouveaux chapitres, une page de jauge de progression, une taille de référence sur 5 chapitres et un brouillon d'accounts-playbook. La structure du manuel s'est stabilisée lors de cette passe — les parties infrastructure et couche IA sont désormais complètes au niveau de référence pour la mission Sodimo.

Added
  • src/content/manual/en/37-vault.md — déploiement Vaultwarden, enveloppe papier, chemin de récupération (nouveau chapitre)
  • src/content/manual/en/38-quadlet-reference.md — table de lookup par quadlet pour chaque service du harness (nouveau chapitre)
  • Chapitres employee-guide 71–74 : 71-cf-pages-with-claude-code.md, 72-account-vault-basics.md, 73-key-rotation.md, 74-ssh-basics.md
  • src/content/manual/en/60-part-dashboard.md + 61-launchpad.md — section dashboard + chapitre launchpad
  • src/content/manual/en/70-part-employee-guide.md — nouvelle section
  • Page /progress + src/pages/fr/progress.astro — jauge de complétion par dépôt pilotée par src/data/progress.json et alimentée par scripts/compute-progress.mjs
  • .github/workflows/update-progress.yml — recalcule le JSON de progression selon un calendrier
  • src/content/manual/en/DRAFT-baseline-accounts-playbook.md — colonne vertébrale de comptes Google → GitHub → Cloudflare → Tailscale → leger.run, livrée en chapitre DRAFT (promu en 36-accounts-playbook.md dans la livraison du 2026-04-23)
  • Ligne de benchmark gpt-oss-120b ajoutée à 41-llm-stack.md (chiffres UD-Q8_K_XL 65k-ctx sur Strix Halo)
Changed
  • Taille de référence sur 5 chapitres (15-design-principles, 35-harness, 38-quadlet-reference, 42-mcp-tools, 53-crm) — le rationnel des décisions déplacé vers 55-annex-decisions.md. Net de −486 lignes sur les cinq chapitres ; l'annexe a grossi de 23 entrées
  • 51-the-repos.md, 31-network.md, 33-cloudflare.md, 35-harness.md, 42-mcp-tools.md — mise à jour du contenu en parallèle de la taille
Other
  • Progression par dépôt calculée : chaque dépôt suivi affiche > 0 % de complétion ; validé par JSON-schema contre src/data/progress.json

Quadlet Paperclip + cloudflared + routage Caddy

Première livraison de la pile quadlet Paperclip dans sodimo/dotfiles, câblée dans le tunnel cloudflared existant et le reverse-proxy Caddy, avec l'image dérivée construite localement sur la dev-box Strix Halo.

Added
  • docker/paperclip/Dockerfile — image dérivée superposant @mariozechner/pi@latest sur ghcr.io/paperclipai/paperclip:sha-b8725c5. Premier usage du répertoire docker/ à la racine pour une image Sodimo (établit le pattern pour les futures images dérivées)
  • home/dot_config/containers/systemd/paperclip.container + paperclip-db.container (sidecar Postgres)
  • home/dot_config/containers/systemd/paperclip-data.volume + paperclip-db-data.volume
  • home/dot_config/caddy/routes/paperclip.caddy — route reverse-proxy pour paperclip.sodimo.eu
  • home/dot_config/sodimo/paperclip.env.tmpl — premier EnvironmentFile .tmpl du dépôt (divergence par rapport à la convention de co-localisation des envs avec les unités .container ; autorisée dans le handoff)
  • home/dot_config/sodimo/paperclip/models.json — liste blanche de modèles pour Paperclip
  • Build image local : ghcr.io/sodimo/paperclip:v2026.416.0-pi0.x.y (2,55 Go, image id 6ebbd8afe02f) — pas encore poussée sur ghcr.io, en attente du write:packages au niveau de l'organisation (suivi dans #12)
Changed
  • home/dot_config/cloudflared/config.yml — liste d'ingress complétée avec paperclip.sodimo.eulocalhost:80 (tunnel nommé unique, routage désormais sur 6 hostnames)
  • Restart=always à l'échelle de la pile assoupli en Restart=on-failure pour Paperclip uniquement (instruction explicite du handoff ; à réévaluer après la première semaine de production)
Fixed
  • podman quadlet -dryrun passe avec 0 erreur de parsing sur l'ensemble des 42 unités après l'ajout de Paperclip

Site Changelog mis en place

Le site Changelog interne est en ligne sous forme de brouillon, hébergé provisoirement sur GitHub Pages à sodimo-changelog.pages.dev. Cloudflare Pages et le sous-domaine changelog.sodimo.eu seront configurés une fois le domaine transféré depuis Strato.

Added
  • Site statique généré à partir du gabarit de style Omarchy avec les couleurs Sodimo appliquées
  • Le fil de releases agrège les releases GitHub de chaque dépôt enregistré dans config/repos.toml
  • Recherche plein texte Pagefind sur les releases et le manuel interne
  • Filtres par dépôt, catégorie et date
  • Portail Cloudflare Access prévu pour les adresses sodimo.eu ainsi que thomas@leger.run une fois le domaine basculé
Changed
  • Tous les tags de release passent en calver YYYY-MM-DD-<slug> — le semver n'est pas un format lisible pour Michel qui consulte les rapports sur son téléphone

Dépôt modèle pour tous les dépôts Sodimo

Chaque nouveau dépôt Sodimo est forké à partir de ce modèle. Il intègre la cadence de release, le descripteur architectural et les conventions de commit afin qu'un nouveau dépôt atteigne la maturité de production en quelques minutes plutôt qu'en plusieurs heures.

Added
  • Descripteur architectural REPO.md avec les champs frontmatter : name, slug, chapter, audience, vendor_class, upstream, sanitization_posture, status, depends_on, consumed_by
  • CLAUDE.md avec la convention de release, la définition de « déployé » et la répartition de la pile Sodimo
  • COMMIT_MESSAGE.md avec les conventions de commit conventionnel
  • GitHub Actions : release-please.yml pour les releases calver, pr-feed.yml pour l'ajout dans .changelog/prs.jsonl lors d'une fusion, deploy-docs.yml déclenchant la reconstruction du Changelog lors d'une release, et ci.yml
  • Labels de taxonomie vendeur : vendored-upstream, hard-fork, soft-fork-inspired, contrib-upstream, home-built
  • Gabarits d'issues et de PR, CODEOWNERS, .gitignore et structure de tasks/
Changed
  • Convention de release fixée en calver YYYY-MM-DD-<slug> — lisible par le comité de direction, évite les fluctuations de semver sur les dépôts clients qui n'exposent pas d'API

Contrat de données Sodiwin verrouillé avec Florian

Le dump nightly Sodiwin est entièrement spécifié. Florian a accepté le SFTP vers le NAS Synology, les écritures atomiques, la convention de nommage par date et le contrat d'e-mail d'échec. L'élargissement des colonnes pour les clients, fournisseurs et articles fait l'objet d'un second tour. Aucun code n'a encore été livré — le dépôt sera mis en place à l'arrivée du premier dump.

Added
  • 20 tables canoniques spécifiées (7 référentiels, 2 stock/lots, 9 jumeaux documentaires, 2 finances)
  • Destination SFTP : 192.168.0.17, utilisateur sodiwin-dump, chroot /volume1/sodiwin-dumps/, horaire 02:30 Paris
  • Convention de nommage : YYYY-MM-DD_<slug>.csv par répertoire de slug, renommage atomique depuis .csv.partial
  • Format de fichier : CSV natif Sodiwin — séparateur ;, ISO-8859-1/Windows-1252, dates DD/MM/YYYY, décimale ,, CRLF
  • Fenêtres temporelles négociées : référentiels, stock, lots, devis, BL, encours, balance, objectifs et recettes en snapshot complet nightly ; base-ventes, base-commandes-ventes, base-achats et base-reglements sur une fenêtre glissante de 1 an ; base-echeances restreinte aux factures non soldées uniquement
  • Dump historique ponctuel convenu — toutes les données depuis l'origine de l'ERP jusqu'au 31 décembre 2025
  • Contrat d'e-mail d'échec : 3 tentatives à intervalles de 60 s, puis envoi à admin@sodimo.eu avec repli sur paul.ghafary@sodimo.eu
Changed
  • Fenêtre historique des tables transactionnelles réduite de 18 mois (demande de Thomas) à 1 an glissant — Florian avait proposé 3 ans, compromis à 1 an plus un backfill historique ponctuel
  • Suppression du fichier du jour précédent déléguée au côté Sodimo après l'ingestion nightly
Removed
  • Colonnes de rupture dynamiques supprimées de base-articles (rup1/rup2/rup3/sous_rupt/librup1..3) — générées à la demande dans Sodiwin, non stockées

Architecture hybride Cloudflare et on-prem verrouillée

La répartition architecturale de la mission est fixée. Ni full-Cloudflare (plan Monday, rejeté pour des raisons de souveraineté sur l'e-mail et l'inférence) ni full on-prem (rejeté en raison du coût de la surface publique). Cloudflare gère DNS, R2, D1, MCP Worker, Pages et Access. Un unique Framework Desktop gère SMTP, IMAP, FTP, l'inférence IA, la transcription vocale et l'archive e-mail. Tailscale relie le serveur, le NAS, les laptops et le téléphone de Rani.

Added
  • Framework Desktop AMD Strix Halo 395+ avec 128 Go de mémoire unifiée, commandé par Paul, livraison estimée dans environ 1 semaine
  • Quatre buckets R2 prévus : sodimo-archive, sodimo-backup, sodimo-dashboards, sodimo-public avec un cycle de vie Standard → IA sur 90 jours
  • Les identifiants sont autogérés — l'administrateur principal utilise un compte Gmail personnel et les identifiants importants sont consignés sur papier
  • Décision sur un second nœud reportée à la revue de tableau de bord T+90 — un Framework plus le backup Synology plus une restauration bare-metal avec un RTO de 2 heures est suffisant
  • Quatre domaines inventoriés (sodimo.eu, yallafood.eu, cavisteduliban.fr, sodimonet.fr) et poids des boîtes Strato recensés pour 33 boîtes totalisant environ 45,5 Go
Changed
  • Plan IA : inférence cloud-only Anthropic → inférence locale sur le serveur Framework, avec escalade cloud réservée aux travaux à enjeux élevés
  • Plan e-mail : Strato (33 boîtes, ~45,5 Go) → Postfix, Dovecot, rspamd et Piler sur le serveur Framework — souveraineté et garanties de suppression que Strato ne peut pas offrir

Système de marque v2 — Modernisme levantin

Le système de marque v2 remplace la v1 Olive/Leaf livrée avec le site WordPress historique. Cedar, Sumac, Parchment, Ink. Fraunces, Inter, JetBrains Mono. Quatre correctifs d'accessibilité P0 validés sur des ratios de contraste mesurés. Score de revue 7,80/10 contre 5,27/10 pour la v1.

Added
  • Cedar primaire #1F3B2D, accent Sumac #C85A3A, canvas Parchment #FAF6EF, Ink noir chaud #1B1913
  • Saffron réservé comme couleur signal — bagues de focus et badges d'avertissement uniquement
  • Tokens typographiques composites (type.h1 regroupe famille, graisse, taille, interligne, espacement) afin que les gabarits ne référencent qu'un seul token par niveau de titre
  • Double échelle d'espacement : statique space.100..900 et fluide space-fluid.100..800, nommage aligné 1:1
  • Élévation à teinte chaude utilisant l'alpha cedar-900 plutôt que le gris neutre, 5 niveaux d'ombre plus bague de focus
  • prefers-reduced-motion ramène tous les tokens de durée à 0ms à la :root
  • VOICE.md couvrant le vocabulaire interdit, trois tests d'écriture, le curseur de ton, des exemples de titres en FR et EN
  • Jeu de six fichiers SVG du logo dans assets/logo-v2/ (light, dark, icon, favicon, wordmark-dark, wordmark-light)
  • Deux variantes mode sombre livrées en parallèle : défaut cedar-deepening et alternate warm-charcoal
Changed
  • Couleur primaire #4b5759#1F3B2D — l'ancienne valeur donnait une impression de B2B hésitant
  • Accent #a2c32a → #5d9934 : dégradé supprimé, remplacé par un Sumac uni pour la compatibilité impression
  • Canvas #f7f7f5#FAF6EF — le Parchment chaud s'harmonise avec le thème alimentaire et viticole
  • Typographie Montserrat → Fraunces + Inter + JetBrains Mono — Montserrat est universel, Fraunces a une voix
  • Rayon des boutons 999px pilule → 8px rectangle, la pilule est réservée aux badges et étiquettes uniquement
  • Couleurs de statut réutilisent les primitives de marque — pas de rouge ou vert de feux de circulation étrangers
  • Bague de focus remappée depuis saffron sur parchment (1,95:1, échoue WCAG 1.4.11) vers une paire adaptée à la surface : sumac-500 sur fond clair (5,63:1), saffron-400 sur fond sombre (11,3:1)
  • --color-text-subtle remappé depuis ink-300 (2,79:1, échoue AA-Large) vers ink-400 (5,13:1 AA)
Fixed
  • Badge d'avertissement tokenisé en --color-warning-bg: saffron-50 + --color-warning-ink: saffron-700 — l'ancienne association ad hoc était à 2,95:1 (échec AA)
  • Affirmation de contraste corrigée à index.html:824 — blanc sur sumac-400 est à 4,22:1 (AA-Large uniquement), et non le 4,6:1 auto-déclaré

sodimo.eu reconstruit sur Cloudflare Pages

Le site public quitte WordPress pour Cloudflare Pages, servi depuis un unique script ESM build.mjs sans framework, sans CMS, sans dépendances d'exécution. Trois domaines frères (yallafood.eu, cavisteduliban.fr, sodimonet.fr) migreront vers le même schéma.

Added
  • 20 pages HTML (10 FR à la racine, 10 EN sous /en/, couverture hreflang complète)
  • Pages Functions POST /api/contact (formulaire de contact, support Turnstile, envoi MailChannels, diffusion via webhook Slack) et POST /api/newsletter (persistance Workers KV)
  • En-têtes de sécurité stricts : CSP, HSTS, X-Frame-Options DENY, interest-cohort=(), mise en cache immuable des assets
  • Redirections 301 pour chaque chemin WordPress historique, xmlrpc.php renvoie 410 pour décourager les sondes
  • Bandeau de cookies conforme GDPR, pas d'analytics, pas de cookies publicitaires, case de consentement explicite sur le formulaire de contact
  • 21 tuiles de marque en page d'accueil avec ancres vers les sections de nos-marques.html
Changed
  • Hébergement : WordPress historique (plus de 100 €/mois) → Cloudflare Pages (offre gratuite)
  • Build : WordPress/PHP → build.mjs unique, seule devDependency est wrangler@^3
Removed
  • Installation WordPress, wp-admin, wp-content, flux RSS

Logos PNG remplacés par un jeu SVG

Quatre PNG historiques (sodimo-logo-dark.png, sodimo-logo-light.png, sodimo-logo-footer.png, sodimo-favicon.png) sont remplacés par un jeu de six fichiers SVG. Web, e-mail et impression partagent désormais une source de vérité unique.

Added
  • logo-light.svg, logo-dark.svg, icon.svg, favicon.svg, wordmark-dark.svg, wordmark-light.svg
  • Pipeline de génération SVG documenté dans HANDOFF.md — potrace pour l'icône, vtracer pour le wordmark, svgo multipass
Removed
  • Tous les fichiers logo PNG
Fixed
  • Règle logo-dark mise à jour pour les fonds photographiques — un voile à 35 % d'opacité ou plus est requis avant que logo-dark.svg soit lisible sur une image

Topologie réseau cartographiée ; chemin de travail établi

Le réseau à deux VLAN de Sodimo est désormais documenté : 192.168.0.x pour les données, 192.168.1.x pour la VoIP. Les prises murales du bureau de Thomas sont toutes les deux incorrectes — l'une atterrit sur le VLAN VoIP, l'autre est morte. En attendant le repatch du panneau, le chemin de travail est le SSID sodimo_wifi, qui se rattache au VLAN données et donne accès au Synology SAUVE_DISK à 192.168.0.17.

Added
  • Inventaire des équipements : routeur TP-Link ER706W, contrôleur TP-Link OC300, Synology DS218j (DSM 6.2), serveur Sodiwin à 192.168.0.88 (Fujitsu, Windows Server, IIS 10.0, Pervasive SQL sur les ports 1583/3351), imprimante Canon iR-ADV, 12 caméras IP Dahua
  • Deuxième hôte Windows Fujitsu à 192.168.0.108 noté, usage à déterminer
  • Inventaire VLAN VoIP : routeur Sagemcom, switch PoE Zyxel, DECT Yealink — pas d'accès NAS
  • SSID invité sur 192.168.200.x signalé comme client-isolated et inutilisable pour le travail
Changed
  • Chemin de travail confirmé sur sodimo_wifi jusqu'au repatch des prises de données vers NETGEAR qui résoudra le problème des prises murales