Commit Graph
53 Commits
Author SHA1 Message Date
Jules NenyandClaude Opus 5.5 fec977a58f feat(carte-o): brouillon des 17 accroches au survol (à valider par Jules)
Champ problematique ajouté aux 17 nodes de carte-o-source.yaml (source
éditoriale), propagé par build-carte-o.js, lu en priorité par l'infobulle
de CarteO.vue. Page temporaire /apercu-accroches pour la relecture :
À SUPPRIMER avant merge. Branche partie de wip/pont-tailwind4-20260817 :
ne pas merger telle quelle dans main (elle embarque le pont non validé),
cherry-pick de ce commit seul, sans la page d'aperçu.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SHuEiSieLhPY2uZbCu6uQb
2026-09-29 14:06:25 +02:00
Jules NenyandClaude Fable 5.1 6a01db1833 wip(pont): pont Tailwind 4 câblé + pont-test.astro + carte-o.json (session défrichage 17/08, mis à l'abri le 22/09)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-22 14:05:12 +02:00
Jules NenyandClaude Sonnet 5 f642160d4b fix(insta): feed remplit toute la hauteur de colonne, Boutique collée en bas
La zone de scroll avait une max-height fixe (420px) alors que la colonne
fait toute la hauteur de la page -> gros bandeau blanc entre le feed et
le footer. Passe en flex-col (header shrink-0, feed flex-1 scrollable,
Boutique shrink-0 collée en bas), le feed occupe maintenant tout
l'espace disponible.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 17:55:43 +02:00
Jules NenyandClaude Sonnet 5 d58911a7e8 feat(insta): simplifie - 2 comptes en header, Boutique seule en bas
Retire les 3 onglets (trop petits, moches). Header : "Jules Neny"
(compte actif, lien direct) + "AEP" (lien direct vers @aep.politique,
pas encore de feed dédié). Bande du bas : uniquement "Boutique"
(placeholder désactivé).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 17:53:26 +02:00
Jules NenyandClaude Sonnet 5 5a4a8fbc2b feat(insta): 3 onglets (artistique/boutique/politique) + bande réduite
Réduit le padding de la bande d'actions (py-3->py-1, gap serré) pour
coller au feed. Ajoute un 3e onglet "Compte Insta politique" en
placeholder désactivé, à côté de "Boutique", en prévision d'une
navigation à onglets entre les comptes @julesneny (artistique, actif)
et @aep.politique (à venir).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 17:49:44 +02:00
Jules NenyandClaude Sonnet 5 aa819600f5 feat(insta): remplace la grille 3x3 par un feed scrollable (13 captures)
Empile les 13 captures d'écran du feed réel (IMG_5439..5451, plus récent
en haut, plus ancien en bas) dans une colonne overflow-y:auto avec
scrollbar fine, pour permettre de naviguer dans le feed sans quitter le
site. Petit gap 2px entre chaque capture (façon séparation Instagram).

Dédoublonnage pixel des zones de chevauchement tenté (corrélation de
luminance par ligne) mais abandonné : signal pas assez discriminant sur
ce contenu (fonds crème uniformes). Chevauchement naturel accepté.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 17:45:13 +02:00
Jules NenyandClaude Sonnet 5 11499a147c feat(insta): remplace Behold (jamais configuré) par galerie statique @julesneny
ColInsta n'affichait que le fallback bio depuis PC5 (feed IDs Behold jamais
renseignés, login Facebook Business trop lourd). Retire le bloc @aep.politique
(jugé insatisfaisant) et remplace InstaFeed par une galerie 3x3 statique de
9 vignettes réelles (croppées depuis le dernier screenshot du feed), avec
boutons Compte Insta + Boutique (placeholder désactivé, en attente d'URL).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 17:05:41 +02:00
Jules Neny 7e7ddfbfbf feat(api): ajoute endpoint /api/aep-perso (desinscription/reabonnement) 2026-07-04 11:55:15 +02:00
Jules Neny f099463636 feat(seo): sitemap + robots.txt + meta OG/Twitter/canonical + site URL
- Installe @astrojs/sitemap ; integre dans astro.config.mjs avec filtre /api/
- Ajoute site: 'https://trans-former.fr' pour canonical absolues
- BaseLayout : props ogImage + canonical + isArticle + articleDate ; meta description/canonical/robots/OG/Twitter Card complets ; suppression doublons
- manifeste.astro : passe isArticle=true pour Schema.org Article
- public/robots.txt : open index + GPTBot/ClaudeBot/Google-Extended/Applebot-Extended/PerplexityBot explicites
2026-05-12 11:29:02 +02:00
Jules Neny dbba7dee3a fix(v14-bis): drag handle overlay + toggle gauche + manifeste preview + scrollbar visible + couleurs attenuees + 2e logo insta
FIX 1 drag handle : overlay full-screen z-9998 capture mouseup garanti
  (iframe AEP capturait les events — overlay au-dessus de tout au mousedown)
FIX 2 toggle gauche : minmax(0,1fr) + visibility hidden au lieu de display:none
  (conflit display:none + width:0 effondrait la col centre quand 2 cols togglees)
FIX 3 manifeste preview : slot flex-col + astro-island display:block
  (display:contents masquait astro-island au flex layout, preview ne s'inserait pas)
FIX 4 scrollbar visible : overflow-y:auto + scrollbar-color custom #94A3B8
  (style WebKit + Firefox uniquement quand data-preview-open=true)
FIX 5 couleurs attenuees : data-muted #C8867E/#8F9A78/#7B848E/#566375 + texte encre
FIX 6 Insta x2 : @aep.politique + @julesneny avec aria-labels et titles distincts
FIX 7 SVG Insta : path simple (camera carree + lentille) au lieu du path complexe
2026-05-12 00:49:01 +02:00
Jules Neny 3baeb0378c merge(v14-cde): Carte O cadre + bouton toggle desktop + drag mouseup fix + manifeste preview client:load + transitions 2026-05-12 00:31:21 +02:00
Jules Neny 5a628fd85b fix(v14-cde): Carte O cadre + bouton replier desktop + drag mouseup fix + manifeste preview event + transitions
- C1 : cadre 1px #CBD5E1 + radius 6px autour section centre-haut (Carte O zone).
  Force tuning CarteO.vue : forceX/Y strength 0.05 -> 0.08, collide radius +12 -> +14
  pour mieux contenir les nodes dans le cadre visible.
- C2 : bouton toggle Carte O desktop (icone triangle dans le bandeau, a cote de la legende).
  Replie a flex 0 0 36px (header reste visible, body masque avec opacity 0).
  Persistance sessionStorage 'tf-carte-o-collapsed'.
- D  : fix drag handle qui ne se decliquait pas au mouseup. Listeners poses sur window
  (vs document) + ajout pointerup/mouseleave/blur/mouseenter-buttons-0 pour couvrir
  tous les flux utilisateur (sortie iframe, perte focus, relache hors-page).
  Suspension transitions CSS pendant le drag (pas de lag).
- E1 : PreviewArticle hydration client:load (vs client:visible) - le v-if rendait
  l'IntersectionObserver aveugle, donc les listeners 'preview-open' n'etaient jamais
  installes. Resultat : clic manifeste -> preview ne s'ouvrait pas.
- E2 : Transition Vue preview-fade (opacity + translateY 8px, 250ms ease) +
  transitions CSS flex-basis 0.3s ease sur sections haut/bas pour smooth UX.
2026-05-12 00:30:42 +02:00
Jules Neny bc7e394913 fix(v14-abf): toggle cols cacher seulement bidirectionnel + revert pastels transparent + footer align 2026-05-12 00:28:52 +02:00
Jules Neny e012d11bee feat(v13-f): palette desopacifiee pills + toggle cols laterales + footer gap-6 + manifeste CTA bord rouge 2026-05-11 20:14:28 +02:00
Jules Neny b4f6d63f33 feat(v13-e): manifeste UX preview centrale (racine) + page /manifeste preserve standalone 2026-05-11 20:08:20 +02:00
Jules Neny 8e7125b426 merge(v13-d): Carte O Option B rectangle central + bandeau sommaire + legende + TMIP 2026-05-11 20:01:34 +02:00
Jules Neny 6b9f6bf751 merge(v13-c): header 1-line cliquables + phrase intention Roboto Condensed 2026-05-11 20:01:33 +02:00
Jules Neny 8f8b0c5f4c feat(v13-d): Carte O Option B rectangle central + bandeau sommaire + legende + TMIP relie
- YAML carte-o-source : label central -> 'Une medecine du corps social pour
  ecrire un nouveau contrat social' (phrase pleine 3 lignes)
- YAML : projet TMIP gagne lien_central:true (edge explicite centre <-> projet)
- build-carte-o.js : addEdge accepte opts.central=true pour tagger les edges
  rattachees au noeud central (permet tuning force-link cote Vue)
- carte-o.json regenere : 17 nodes, 20 edges (vs 19 V1.2-O), tous les edges
  central->thematiques + central->tmip portent flag central:true
- CarteO.vue : noeud central rendu en RECT 300x64 fill encre (vs cercle r30),
  label blanc multi-tspan 3 lignes 13px font-weight 500 line-height 1.35
- CarteO.vue : splitCentralLabel reecrit pour wrap intelligent (3 lignes
  ~30 chars), preserve compat ' + ' (V1.2)
- CarteO.vue : force tuning V1.3 -> alphaDecay 0.025, velocityDecay 0.4,
  forceCollide +12 (CENTRAL_COLLIDE_RADIUS=160 pour le rect), forceX/Y
  strength 0.05 rappel cadre, link distance/strength differencies
  (central->projet = 90/0.6, central->essai = 200/0.3)
- CarteO.vue : hover handler selector etendu rect|circle
- CarteOWrapper.vue : CarteEdge gagne champ central?:boolean
- ColCentre.astro : tabs Chatbot retires (ChatbotV2 import retire aussi),
  remplaces par header bandeau 'Sommaire editorial d'architecture
  d'ecologie politique' (gauche, monospace 12px) + legende 3 symboles
  (publie ● / a venir ○ / projet 🟠) en droite

Build SSR : 5 pages prerender, 0 warning, 4.35s.
2026-05-11 20:00:30 +02:00
Jules Neny aa410ce7aa feat(v13-bg): layout 1 ecran fixe + hamburger desktop hide + categorie Pro 2026-05-11 20:00:16 +02:00
Jules Neny e90a7e12ef feat(v13-c): header 1-line cliquables + phrase intention Roboto Condensed 2026-05-11 19:58:07 +02:00
Jules Neny 1033099663 fix(v13-p0): iframe AEP skeleton timeout fallback (resolves loading stuck)
Le @load event ne fire pas (ou tardivement) sur l'iframe AEP enfermee
dans un wrapper avec transform scale(0.42) + viewport simulee 1440px.
Resultat : skeleton 'Chargement de la carte AEP...' reste affiche
indefiniment, masquant l'iframe meme si elle se charge.

Fix :
- setTimeout 2.5s dans onMounted qui force revealIframe() inconditionnellement
- onIframeLoad clear le timer si l'event fire dans les temps (cas nominal)
- retrait du z-10 sur le skeleton (defense en profondeur : si bug residuel,
  l'iframe sera quand meme visible derriere)
- factorisation revealIframe() partagee entre @load et fallback
- cleanup du timer dans onUnmounted

Build SSR : 5 pages, 0 warning, ~4s.
Tests browser manuels a faire par Jules pour confirmer disparition skeleton.
2026-05-11 19:52:57 +02:00
Jules Neny 9bb55bc311 merge(v12-p): preview article 3 zones + colonnes scrollables indep 2026-05-11 18:52:59 +02:00
Jules Neny 12a2d40371 feat(v12-p): preview article 3 zones + colonnes scrollables indep
- PreviewArticle.vue : nouveau composant qui ecoute journal-item-click et s'insere entre Carte O et iframe AEP
- EmbedDynamique.vue : retire le swap article (iframe AEP toujours visible en bas)
- ColCentre.astro : passe en flex-col, preview ouverte = Carte O 33vh + Preview auto + iframe 67vh, overflow-y-auto sur le container
- Bouton 'Retour a la carte' emet preview-close -> grid revient 1/3 + 2/3
- Scroll independant : Journal (gauche), Centre (preview), Insta (droite)
- Drag-resize desactive quand preview ouverte (anti-collision)
2026-05-11 18:52:11 +02:00
Jules Neny a1d6271b65 feat(v12-o): Carte O logos plateforme via Brandfetch CDN (visible zoom>1.5x)
Champ optionnel domain dans YAML carte-o-source : propage vers JSON et
permet d'afficher un logo plateforme en bas-droite de chaque node (cercle
blanc 18px + image clippee circulaire 14px) quand le zoom depasse 1.5x.

V1.2-O par defaut : substack.com sur les 15 thematiques essais. Centre +
projet TMIP gardent leur fill brut (encre / ocre). Toggle visibilite via
callback zoom (opacity 0/1 sur .logo-overlay).

A flagger : CDN Brandfetch retourne 403 en curl server-side avec le client
ID fourni. A revalider en browser (origin trans-former.fr) — le CDN peut
exiger un Origin header autorise. Si bloque, fallback prevu en V1.3
(proxy local ou logos packages dans /public/logos/).

Files:
- public/data/carte-o-source.yaml : +15 champs domain
- scripts/build-carte-o.js : propagation domain -> JSON
- src/components/vue/CarteO.vue : CarteNode.domain + logoUrl helper
  + logo-overlay (circle + image clip-path) + toggle visibilite zoom
- public/data/carte-o.json : regenere (15/17 nodes ont domain)
2026-05-11 18:48:15 +02:00
Jules Neny e613fc1ca3 merge(v12-q): iframe AEP forcé desktop transform scale 2026-05-11 18:43:06 +02:00
Jules Neny d12f77554f merge(v12-n): Carte O fusion noeud central + palette minimaliste 2026-05-11 18:43:06 +02:00
Jules Neny 3f2783e3fc feat(v12-n): Carte O fusion noeud central + palette minimaliste encre/papier/ocre
- YAML: fusion 3 noeuds confus (centre + ncs-politique + medecine-corps-social) en 1 seul noeud central 'Contrat social + Medecine du corps social'
- Build script: toutes les thematiques rattachees directement au centre (suppression mapping NCS/MDCS), radius central 30px, projets 18px
- CarteO.vue palette V1.2: central #0F172A (encre), essais #FFFFFF stroke encre, projets #B45309 (ocre conserve)
- Labels: inscrit dans le cercle (blanc) pour central+projets, a droite (encre douce) pour essais
- Label central long split sur 2-3 lignes via splitCentralLabel()
- Background: #FAFAF7 (papier, raccord colonnes laterales)
- Liens: #94A3B8 opacity 0.4 1px

17 nodes / 19 edges. Build SSR 5 pages prerender + server, 0 warning.
2026-05-11 18:42:06 +02:00
Jules Neny 3ba4628818 feat(v12-m): header bandeau Trans-Former / Jules Neny / baseline palette terre 2026-05-11 18:41:51 +02:00
Jules Neny 7791054ca0 feat(v12-q): iframe AEP forcé desktop via transform scale + viewport 1440px 2026-05-11 18:40:50 +02:00
Jules Neny 78dde6a2a3 merge(v12-r): col-centre default 1/3 + 2/3 (vs 50/50) 2026-05-11 18:34:39 +02:00
Jules Neny 3360daa61f merge(v12-l): footer 1-line 3-zones logos RS palette terre 2026-05-11 18:34:39 +02:00
Jules Neny 272fb5c181 feat(v12-r): col-centre default 1/3 Carte O + 2/3 iframe AEP (vs 50/50) 2026-05-11 18:34:01 +02:00
Jules Neny 6ea256f8a4 feat(v12-l): footer 1-line 3-zones (nav + subscribe + logos RS terre) 2026-05-11 18:33:46 +02:00
Jules Neny 95b75d4866 feat(v12-k): nav gauche palette terre + sub-pills Court/Article 2026-05-11 18:32:37 +02:00
Jules Neny 046f34ec8b feat(v11-f): drag-resize desktop ColCentre HAUT/BAS + persist session 2026-05-11 15:22:44 +02:00
Jules NenyandClaude Sonnet 4.6 61e53a04d5 feat(v11-e): centre BAS embed dynamique click-journal + suppression ScrollArticles
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 15:19:24 +02:00
Jules Neny 4a29a9592a Merge branch 'feat/v11-dg' into feat/page-cerveau-v1 2026-05-11 15:15:36 +02:00
Jules NenyandClaude Sonnet 4.6 79004573f1 feat(v11-dg): mobile header page active + hamburger top-right + poignee carte-o + polish css
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 15:14:48 +02:00
Jules NenyandClaude Sonnet 4.6 d8d3af28a0 feat(v11-c): carte-o rendering refonte niveau/nature/statut + contextmenu positionne
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 15:13:46 +02:00
Jules Neny 1e1c56db2f Merge branch 'feat/v11-i' into feat/page-cerveau-v1 2026-05-11 15:08:08 +02:00
Jules Neny c18328517a feat(v11-a): ajout Substack julesneny.substack.com dans selecteur Politique 2026-05-11 15:07:58 +02:00
Jules Neny beb8e9a0bd feat(v11-i): footer CTA infolettre + endpoint /api/subscribe Kit V4 2026-05-11 15:04:58 +02:00
Jules NenyandClaude Sonnet 4.6 62794459ac feat(v11-a): hashtags 4 categories capsules monospace + selecteur Politique
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-11 15:03:45 +02:00
Jules Neny be7fc09085 feat: PC7 chatbot V1 onglet centre HAUT + endpoint Astro proxy SSR
- ChatbotV2.vue : Vue island, thread chat (input + messages bot/user),
  persistance sessionStorage, bandeau beta '120 fiches AEP, RAG-PE bientot',
  gestion erreurs 429/502/504 ; pas de streaming ni markdown V1
- /api/chatbot.ts : endpoint Astro server proxy POST vers CHATBOT_UPSTREAM
  (default https://aep.trans-former.fr/api/chatbot), timeout 25s,
  body { question, history } -> upstream classique chatbot AEP Mistral Small
- astro.config.mjs : output 'server' + adapter @astrojs/node standalone
  (Astro 6 a supprime mode hybrid ; on opt-in prerender sur les pages)
- Toutes les pages publiques (index, manifeste, manifeste/commander,
  a-propos, mentions-legales) ont 'export const prerender = true'
- ColCentre.astro : remplace ChatbotPlaceholder par ChatbotV2 dans le tab
- .env.example : ajoute CHATBOT_UPSTREAM (V1.5 = switch LightRAG-PE 1 ligne)

Decision V1 : endpoint AEP /api/chatbot (classique, repond bien) au lieu
de /api/chatbot-v2 qui retourne v2_ready=false ('base vectorielle en cours').
Bandeau beta reste valide ; switch v2 quand ready cote AEP via env var.

Note PC8 deploy : Coolify doit booter avec 'node ./dist/server/entry.mjs'
(SSR Node standalone) au lieu de servir dist/client/ static.

Test end-to-end OK : SSR boot port 4399 + curl POST /api/chatbot ->
reponse_texte 800+ chars de l'AEP backend.
2026-05-09 01:22:01 +02:00
Jules Neny fccbc6d19c merge: PC6 journal n8n + JournalList (round 2) 2026-05-09 01:15:10 +02:00
Jules NenyandClaude Opus 4.7 e22dd6654a feat: PC6 journal unifie + n8n workflow agregateur (V1 MVP)
Composant Vue JournalList :
- fetch PUBLIC_JOURNAL_URL (defaut data.trans-former.fr/journal.json)
- ecoute event 'hashtag-filter-change' emis par ColJournal (PC2)
- filtre par hashtag actif, tri desc respecte (n8n cote serveur)
- fallback gracieux : loading / errored / empty / no-match

Cabling :
- ColJournal.astro importe et rend <JournalList client:visible />
- placeholder remplace par le composant Vue

Workflow n8n (docs/n8n-workflow-journal-aggregate.json) :
- Schedule trigger cron 0 3 * * *
- Fetch Gitea Atom (jules.atom) + Behold AEP + Behold julesneny (skip si feed IDs absents)
- Code Node normalisation 3 sources -> format JSON commun
- Tri desc + cap top 100
- Write Binary File vers /home/node/.n8n/journal/journal.json (volume Docker partage)

Sources V1 actives :
- Gitea Atom (#stack) - active, 200 OK confirme
- Behold @aep (#aep-politique) - conditionnel feed ID
- Behold @julesneny (#peinture) - conditionnel feed ID

Sources skipped (V1.5/V2) :
- GitHub.com : username 'julesneny' n'existe pas (HTTP 404), pivot Gitea
- Substack 'transformations' : pris par 'WoodHorse' (pas Jules), handle a confirmer
- LinkedIn, Castopod, Blog : V2

Mock journal.json en public/data/ pour dev local (fallback si data.trans-former.fr indisponible).

Setup VPS prepare (cf docs/PC6-JOURNAL-N8N-SETUP.md) :
- Caddyfile bloc data.trans-former.fr ajoute en commentaire (active apres DNS)
- Dossier /var/lib/docker/volumes/vps-kit_n8n_data/_data/journal/ cree
- journal.json initial deploye
- Caddy reload OK valide (config valide)
- Workflow JSON copie sur VPS /tmp/n8n-workflow-journal-aggregate.json (import manuel UI)

Checkpoint Jules requis :
- Ajout DNS A 'data' -> 178.104.106.195 (OVH)
- Decommenter bloc Caddy + reload
- Import workflow n8n via UI (creds basic auth deprecies, login email user)
- Run manuel + activation cron

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 01:13:51 +02:00
Jules Neny 6aa5a7143a feat: PC4 iframe carte AEP centre BAS + scroll articles Substack placeholder
- IframeCarteAEP.astro : iframe https://aep.trans-former.fr/agences avec
  skeleton loader + timeout 8s + fallback lien externe
- ScrollArticles.astro : 7 articles placeholder (V1, PC6 remplacera par
  fetch journal.json)
- ColCentre.astro : zone BAS cablee (iframe min-h 60vh mobile / 400px desktop
  + scroll articles dessous)
- Preflight headers : pas de X-Frame-Options ni frame-ancestors restrictifs
  sur /agences (200 OK), iframe cross-origin permise sans modif Caddy
2026-05-09 01:06:02 +02:00
Jules Neny 68e511be7a merge: PC5 embeds Insta col D Behold (round 1) 2026-05-09 01:01:11 +02:00
Jules Neny 0c53f450c3 merge: PC3 mindmap Carte O D3 + scrape AEP (round 1) 2026-05-09 01:01:07 +02:00
Jules NenyandClaude Opus 4.7 32bdc9a2e5 feat: PC3 mindmap Carte O (D3 force-directed) + scrape AEP/Articles + tabs centre HAUT
- scripts/build-carte-o.js : scan recursif AEP/Articles/, parse YAML + legacy header, extract wikilinks, infer 5 famille
- src/components/vue/CarteO.vue : D3 v7 force-directed avec drag, zoom + pan, click handler, tooltips, ResizeObserver
- src/components/vue/CarteOModal.vue : modal recap intention avec Teleport, Esc + backdrop close, transitions
- src/components/vue/CarteOWrapper.vue : fetch /data/carte-o.json, etat selectionne, fallback mobile (msg + miniature SVG)
- src/components/astro/ColCentre.astro : tabs Carte O / Chatbot, panneaux ARIA
- package.json : prebuild + predev hooks, build:carte-o script
- public/data/carte-o.json : 84 nodes / 94 edges sur 21 themes, distribution familles equilibree

Drill-down V1 = zoom + pan seul (V2 recursif backlog).
Pattern adapte de nav-carte/components/codev/CodevGraph.vue (sans coupling Nuxt).
Build Astro 6.3.1 OK, bundle CarteOWrapper 69KB.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 00:59:23 +02:00