Skip to content

docs(agents): update AGENTS.md as sole session-context reference#12

Merged
GoldenFarFR merged 40 commits into
mainfrom
claude/session-context-files-ofl85l
Jul 7, 2026
Merged

docs(agents): update AGENTS.md as sole session-context reference#12
GoldenFarFR merged 40 commits into
mainfrom
claude/session-context-files-ofl85l

Conversation

@GoldenFarFR

Copy link
Copy Markdown
Owner
  • retire la mention de Grok comme arbitre technique
  • ajoute la raison obligatoire quand une donnée est jugée insuffisante
  • précise qu'Invest_Prompt_v4.txt peut être amélioré
  • ajoute une limite stricte de ~100 tokens par réponse et un seuil d'alerte 20 messages / 50k tokens

claude added 30 commits July 6, 2026 17:49
- retire la mention de Grok comme arbitre technique
- ajoute la raison obligatoire quand une donnée est jugée insuffisante
- précise qu'Invest_Prompt_v4.txt peut être amélioré
- ajoute une limite stricte de ~100 tokens par réponse et un seuil d'alerte 20 messages / 50k tokens
Analyse les top holders d'un token via BlockscoutClient selon les 4 criteres
croises documentes dans AGENTS.md (coherence temporelle, entree precoce +
controlee, sortie disciplinee, concentration multi-wallets). Exclut les faux
signaux evidents (wash-trading, wallets contrat). Signal purement additif
au security_score existant, jamais un declencheur de trade.

Desactive par defaut dans scan_base_token (cout API par wallet) ; activable
via /scan <adresse> smart cote Telegram.

Met a jour AGENTS.md : la brique Blockscout + wallet-tracker est marquee
faite, la "prochaine brique prioritaire" est ouverte a validation.
Nouveau services/coingecko.py, meme patron que blockscout.py : throttle
~2.2s (tier public), politique d'erreurs 429/timeout identique, jamais de
supposition sur donnee absente. Recupere market cap, FDV, supply,
categories, whitepaper via /coins/base/contract/{adresse}.

Integration additive et opt-in dans scan_base_token (include_fundamentals) :
seul un ratio FDV/market cap >= 3x (dilution future significative) degrade
le score ; l'absence de donnee ne penalise jamais. Active cote Telegram via
/scan <adresse> fond.
…tat -> lecon)

Nouveau investment_memory.py : table SQLite investment_thesis dans aria.db
(CREATE TABLE IF NOT EXISTS, ajout pur sans migration). Journal local du
raisonnement d'ARIA sur ses paris — aucune action financiere, aucun appel
reseau. Cycle open -> closed avec transition atomique (un resultat n'est
attribue qu'une fois, l'historique n'est jamais reecrit).

Commandes Telegram admin (lecture/ecriture locale) :
- /these <adresse> <BUY|WATCH|SELL|AVOID> <these> : journalise un pari
- /issue <id> <resultat/P&L> | <lecon> : cloture et attribue l'issue
- /theses : liste les theses ouvertes

Prerequis d'un scoring VC qui apprend de ses erreurs (regle "auto-critique
honnete" d'AGENTS.md). 19 tests, tous verts.
Nouveau skills/vc_analysis.py : produit une analyse VC (Invest_Prompt_v4 :
Potentiel 0-10, Risque, These, Recommandation) + une proposition d'ordre, a
partir des briques deja construites (scan on-chain, fondamentaux,
smart-money, historique des theses).

Dome de securite (toutes les defenses testees) :
- entree hostile encapsulee <donnees_non_fiables>, system prompt anti-injection
- code source contrat jamais transmis (seuls les booleens d'audit)
- sortie LLM en JSON strict, parsing defensif, clamp score 0-10, allowlist
  recommandation, plafond dur taille 10%/position, troncatures
- anti-hallucination : tout critere non sourcable = "donnee insuffisante"
- zero chemin financier (test AST verifie l'absence d'import wallet/execution)
- degradation sure : LLM off/erreur/non-parsable => fallback deterministe
  conservateur (jamais de BUY sans analyse qualitative)

Modele retenu : tier "develop" = anthropic-claude-opus-4-8 via Spark (deepseek
-v4-pro etant banni comme primaire Virtuals). 28 tests, tous verts.
/vc <adresse> lance analyze_vc et renvoie un ordre concis (reco, potentiel,
risque, taille suggeree en % du capital, entree/invalidation/cible, these).
format_telegram_order testable independamment.

L'ordre est toujours une PROPOSITION : disclaimer "validation et execution
manuelle sur Tangem, aucune execution automatique" present sur chaque reco.
Fallback LLM signale explicitement. 7 tests, tous verts.
Nouveau skills/vc_report.py : render_html_report() produit un document HTML
autonome (CSS inline, aucun asset externe) pret pour l'email et le futur site
— en-tete ARIA Vanguard ZHC, badges Potentiel/Risque/Reco, encart ordre
propose, section "donnees insuffisantes", corps mini-markdown, disclaimer.

Securite (extension du dome au rendu) : tout champ dynamique est HTML-echappe
avant injection ; le mini-markdown n'emet que des balises controlees. Une
sortie LLM hostile (issue de donnees non fiables) est neutralisee — testes
d'echappement XSS inclus. 8 tests, tous verts.

L'envoi SMTP reste a faire (Etape C-envoi, en attente de l'App Password Gmail).
…arde-fous

Nouveau services/mailer.py : transport SMTP+STARTTLS (ou SSL 465), config lue
uniquement depuis l'environnement (ARIA_SMTP_*), TLS avec verification de
certificat. Le mot de passe n'apparait dans aucun log ni aucune erreur
(redaction + messages nettoyes). send_email ne leve jamais, smtplib synchrone
passe par asyncio.to_thread.

Nouveau skills/vc_delivery.py : orchestration rendu + envoi, sous kill-switch
fail-closed (is_paused strict=True) verifie AVANT tout envoi. Degradation sure
si SMTP non configure. Destinataire ARIA_VC_REPORT_TO (defaut ARIA_SMTP_USER).

/vc envoie desormais l'ordre court sur Telegram puis le rapport detaille par
email, en signalant le statut d'envoi. Aucun secret requis cote code : les
variables ARIA_SMTP_* sont posees sur le VPS par l'operateur. 22 tests, verts.
… (audit HIGH)

Faille (confirmee par audit adversarial) : _sanitize() ne neutralisait pas la
chaine litterale </donnees_non_fiables>. Un token hostile dont le symbole
(controle par le deployeur, renvoye brut par DexScreener puis injecte dans un
risk_flag) contient cette balise de fermeture pouvait terminer prematurement la
zone non fiable, faisant apparaitre son texte HORS des balises, au niveau des
instructions du prompt — contournant la regle 1 du system prompt.

Correctif au point d'etranglement unique (_sanitize, par lequel passent TOUTES
les donnees non fiables) : neutralisation des chevrons < > (remplaces par ‹ ›),
rendant toute forge de balise impossible. Les chevrons n'ont aucun usage
legitime dans des metadonnees on-chain. + durcissement du system prompt
(defense en profondeur : tout ce qui suit la 1re balise est traite comme
donnee inerte).

3 tests de regression reproduisant l'attaque exacte. 23 tests vc_analysis verts.
…inte SHA-256

Ajoute au pied du rapport HTML :
- mention de copyright et de confidentialite (© Aria Vanguard ZHC, reproduction
  /rediffusion/revente interdites) — dissuasion legale ;
- filigrane d'edition personnelle (destinataire + horodatage) rendant toute
  fuite tracable a qui a recu le rapport — cle pour le futur abonnement ;
- empreinte SHA-256 deterministe du contenu (reference courte + hash complet),
  anti-falsification, variant par destinataire.

render_html_report accepte desormais recipient (transmis par vc_delivery). Tout
champ dynamique reste HTML-echappe (filigrane inclus). Note d'honnetete : un
texte lisible n'est jamais 100% incopiable (capture/retape) ; ces mesures
protegent la valeur et tracent les fuites, elles ne rendent pas la copie
techniquement impossible. 7 tests ajoutes.
Nouveau vc_predictions.py : table vc_prediction (aria.db). Chaque /vc est
auto-loggue comme prediction datee (meme sans trade = shadow), ce qui
accelere l'accumulation d'un echantillon exploitable (a ~2 trades/mois, se
limiter aux positions reelles serait trop lent pour mesurer quoi que ce soit).

Metriques (fonction pure compute_metrics, testee) : hit-rate des BUY, P&L
moyen, et courbe de CALIBRATION (le P&L moyen croit-il avec le Potentiel ?
le vrai test d'un analyste).

Commandes Telegram : /vcresult <id> <pnl%> [note] cloture une prediction avec
son resultat reel ; /track affiche le track record. Transition open->closed
atomique (jamais de reecriture d'un resultat). 7 tests + handlers.
Integre la nouvelle section "Politique de modeles, subagents & consommation"
(Sonnet 5 xhigh par defaut, exception Opus zone rouge, code couleur simplifie,
subagents researcher/security-auditor). Preserve les statuts FAIT du jour
(memoire d'investissement + scoring VC + track record) que la version
optimisee, basee sur une copie anterieure, marquait encore "a construire".
Design institutionnel navy+or :
- embleme Aria Vanguard ZHC (PNG embarque en base64, aucun asset externe)
- jauge de Potentiel (0-10) = point focal visuel (grand chiffre + barre segmentee or)
- resume executif (TL;DR) en accroche, badge de confiance globale
- scenarios chiffres bull/base/bear (cible, probabilite, confiance)
- annexe methodologie & sources (transparence verifie vs suppose)
- titres en serif Georgia, filets or

Le moteur (vc_analysis) produit resume_executif, confiance_globale et
scenarios ; ces champs passent le dome (allowlists, clamps, troncatures,
neutralisation des chevrons). Tout champ dynamique reste HTML-echappe au rendu
(tests XSS scenarios inclus). 64 tests VC verts.
Ajoute des media queries (max-width 480px) qui empilent les colonnes de
scenarios et les KPI, replacent le badge de confiance sous le titre, et
reduisent les marges sur petit ecran. Classes .wrap/.pad/.sc-col/.kpi/.hdr
-badge + viewport + x-apple-disable-message-reformatting. Technique email
robuste (Apple Mail, Gmail app iOS/Android). Le style est statique, aucun
risque d'injection. Test responsive ajoute.
L'ombre portée à fort flou (10px) sur la carte pleine hauteur forçait un
re-rendu à chaque frame de scroll sur mobile (à-coups). Remplacée par un
liseré fin + ombre légère (3px), et ajout de -webkit-text-size-adjust.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
Ajoute upside_pct / downside_pct (bornés 0-2000 / 0-100) au schéma LLM et à
VCResult, d'où une propriété rr = récompense/risque calculée uniquement quand
les deux sont sourçables (sinon None — pas de ratio inventé, cohérent avec la
règle anti-hallucination). R/R affiché aussi dans l'ordre Telegram.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
… qualité »)

Grave la boussole produit : peu de capacités mais excellentes et vendables ;
toute feature qui n'approfondit pas l'intelligence on-chain ou la qualité des
rapports n'est pas construite.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
…lien site

- email_subject/render_html_report affichent désormais la date en plus visible
  (13px, contraste renforcé) : un abonné doit pouvoir trier ses rapports.
- Nouveau numéro « Rapport n°N » par token (vc_predictions.count_predictions_
  for_contract) : distingue plusieurs analyses suivies du même token.
- Nouveau « Série 00.0NN » : compteur global toutes analyses ARIA confondues
  (vc_predictions.total_predictions_count), format édition numérotée.
- Lien ariavanguardzhc.com en haut à gauche du rapport (site en ligne, confirmé).
- Tests : compteurs par contrat / globaux, format du numéro de série, ordre
  d'affichage série→rapport→date, câblage bout-en-bout dans /vc.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
- DexScreener expose déjà info.websites/socials par paire (site, X, Telegram,
  Discord...) : extraits sans nouvelle intégration ni clé (_extract_project_links).
  LinkedIn n'existe dans aucune source disponible — non câblé (pas d'invention
  via recherche floue, risque de lier la mauvaise entreprise).
- Ces liens ne transitent JAMAIS par le LLM : dérivés directement du scan brut
  (_extract_verified_links), donc jamais générés/halluciné. Revalidation stricte
  du schéma http(s) à deux points (extraction DexScreener + juste avant le rendu
  HTML <a href>) — défense en profondeur contre une URL javascript:/data: glissée
  par un token hostile.
- Nouvelle section « Références — vérifiez par vous-même » dans le rapport,
  clairement étiquetée « non vérifiées par ARIA ».
- format_telegram_order accepte capital_usd (env ARIA_CAPITAL_USD) et calcule
  le montant réel de la position en $ — l'opérateur exécute manuellement sur
  Tangem, un montant net évite le calcul mental avant signature.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
Les scripts d'analyse ad-hoc lancés sans bootstrap.configure() retombent sur
un chemin relatif data/.aria-test-data/GoldenFar — purs artefacts de test
local, jamais du travail réel.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
…piloté par les données

Réécriture complète de render_html_report : la maquette validée « B4 » (hero
sombre goutte+wordmark ARIA, corps ivoire, pied certificat) est désormais
produite par le VRAI code, chaque valeur pilotée par un champ de VCResult au
lieu d'être codée en dur.

Sécurité (dôme, double couche) : tout champ dynamique HTML-échappé via _esc au
rendu (titre/symbole aux 4 points d'injection, pastilles, en-têtes, montants,
scénarios, liens) ET sanitizé en amont (symbol via _project_symbol/_sanitize,
neutralise les chevrons). Couleurs/libellés de structure = allowlists indexées
par une valeur déjà clampée, jamais une chaîne LLM. rapport_detaille rendu
uniquement via _render_markdown_body. Liens revalidés http(s).

Honnêteté (facts-only) : bloc R/R masqué si ratio non estimable ; section
« Potentiel en $ » seulement si capital fourni ; projection temporelle OMISE
(moteur #5 pas construit — pas de montants inventés, TODO en place) ;
qualificatif R/R dérivé du vrai ratio ; réf = vrai hash SHA-256.

- vc_analysis : champ symbol (depuis ctx.best_pair.base_symbol, sanitizé)
- vc_delivery/telegram_bot : capital_usd threadé jusqu'au rendu
- tests : réécrits pour le nouveau markup, mêmes garanties d'échappement +
  cas R/R absent, capital_usd, pas de projection

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
claude added 10 commits July 6, 2026 23:20
… sans motif répété

Le scroll saccadait sur mobile (« dessine ligne par ligne ») : le hero empilait
7 dégradés (4 rais de lumière + 2 halos radiaux + fond nuit) re-rastérisés à
chaque frame, et les 2 bandes guilloché utilisaient repeating-linear-gradient
(motif hachuré très coûteux). Hero réduit à 2 couches (fond nuit + un halo
doré), repeating-linear-gradient retirés (bande dégradée lisse conservée). Look
sombre premium préservé, coût de rendu très réduit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
… scroll mobile

Deux éditions du rapport pilotées par un paramètre `tier` :
- premium (navy/or/émeraude) : rapport complet.
- standard (rose/vert/or) : sections Analyse détaillée / Méthodologie /
  Références masquées, remplacées par une ligne d'incitation ; bandeau de tier
  affiché en haut à gauche sous le lien du site.
Thème sélectionné via une allowlist fermée `_TIER_THEMES` / `_theme(tier)` —
tout tier invalide retombe sur premium (dégradation sûre).

Correctif performance scroll mobile (Gmail WebView « dessine ligne par ligne ») :
suppression des 3 `radial-gradient` (hero premium, hero standard, wrapper
externe), remplacés par un `linear-gradient` simple ou une couleur plate. Les
filets 1px (dividers/guilloché) et les dégradés des pastilles/barres sont
conservés (surfaces faibles, sans coût de re-rastérisation). Un test vérifie
qu'aucun `radial-gradient` ne subsiste dans le HTML final.

Escaping du dôme (titres/liens/LLM) intact dans les deux thèmes, couvert par un
test hostile en édition standard. `send_vc_report` et `_handle_vc`
(`ARIA_REPORT_TIER`, défaut premium) threadent le tier de bout en bout.

74 tests VC verts (report + delivery + telegram/format).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
Synthèse factuelle (6 agents) : sur Base, la thèse pré-bonding ne s'applique
proprement qu'à Virtuals (seule vraie courbe, API gratuite sans clé) ; Flaunch
en second (Fair Launch 30 min) ; Clanker/Zora sautent le bonding (liquides dès
t=0). Reco : rester Base-first, Solana en monitoring lecture-seule. Toutes les
adresses/endpoints marqués « à revérifier sur VPS/BaseScan » (aucun testé en
direct côté recherche).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
…uration

VISION.md : bloc daté (07/07) « ARIA investisseuse VC — gamme luxe » — moat =
l'analyse (pas l'exécution), abonnement boutique ~500$/mois × 4-5 clients,
éditions premium/standard, funnel échelle de risque (web2 → BTC/ETH → risque),
overlay macro obligatoire, niche pré-bonding = Virtuals, proof engine = pilier
qualité, conformité avant facturation.

docs/conformite-dossier-avocat.md : dossier préparatoire (NON un avis juridique)
pour un avocat crypto/finance — questions sur la qualification « conseil en
investissement » (AMF/MiFID/MiCA), valeur du disclaimer, MAR/conflits
d'intérêts, KYC-AML, CGV/responsabilité. Prudence : aucun encaissement avant
validation d'un professionnel.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
…Virtuals

Briques construites et testées hors-ligne (non encore câblées dans le rapport/flux
— le stitching viendra après). 73 tests verts, zéro fichier garde-fou touché.

- #6 Mode test `/vc <adresse> test` (admin) : affiche le raisonnement complet,
  n'envoie PAS d'email et n'enregistre PAS la prédiction (aucune pollution du
  track-record, compteurs inchangés). Flag détecté en fin d'args, insensible à
  la casse ; mode normal strictement préservé.
- #2 Proof engine `vc_judge.py` : LLM-juge adverse qui audite une analyse VC
  (verdict solide/fragile/rejeté, score, points forts/faibles, claims non
  étayés = chasse aux données inventées, cohérence R/R). Fallback déterministe
  si LLM indisponible ; sortie sanitisée (dôme) ; jamais d'exécution.
- #9 `ta_levels.py` (+ `chart_render.py`) : niveaux support/résistance/tendance
  déterministes et factuels depuis OHLCV ; graphique PNG email-safe (Pillow,
  data-URI inline, pas de SVG) avec lignes entrée/invalidation/cible.
- #10 `services/virtuals.py` : client api.virtuals.io + parsing statut
  UNDERGRAD/AVAILABLE, is_in_bonding, progression graduation ; dégradation
  gracieuse (offline-safe), chaînes externes sanitisées.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
Suite à l'audit anti-bot du site. Durcissement bénin, sans CSP (éviter de
casser l'app sans test) :
- robots.txt explicite (crawl autorisé — vitrine publique par nature) + sitemap.
- _headers : ajout d'un bloc /* avec X-Content-Type-Options: nosniff,
  Referrer-Policy, X-Frame-Options: SAMEORIGIN, HSTS (6 mois), Permissions-Policy.
  Cache-Control existant préservé.

Note : ces en-têtes durcissent mais ne « bloquent » pas les bots — un vrai
anti-bot se fait au niveau hébergeur (Cloudflare + Bot Fight/Turnstile).
Les correctifs sensibles (mur Privy off par défaut, ancrage du rate-limit,
coût LLM /api/aria/chat public) relèvent du modèle d'accès → décision humaine.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
Le LLM-juge (#2) tourne désormais en MODE TEST admin, sur les MÊMES faits
on-chain que l'analyse (aucun re-scan) :
- vc_analysis : analyze_vc_with_context() renvoie (VCResult, ctx) ; analyze_vc
  reste le wrapper public inchangé — aucun appelant existant impacté.
- telegram : en mode test, après le raisonnement, judge_analysis(result, ctx)
  affiche verdict/score/points faibles/claims non étayés (wrappé try/except,
  ne casse jamais le handler). Le flux CLIENT est inchangé : le juge n'ajoute
  ni coût ni latence aux rapports — sa promotion sur chaque analyse est une
  décision produit (coût/latence) laissée à l'opérateur.
- tests : mode test câblé sur analyze_vc_with_context + juge mocké, nouveau
  test dédié (verdict affiché, juge appelé avec le VCResult). 36 tests verts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
État livré (rapport premium/standard, proof engine branché en mode test,
4 moteurs testés, durcissement vitrine), prochaines étapes priorisées
(#14 macro / #9 graphique / #10 Virtuals / #12 backend), décisions sécu à
trancher (modèle d'accès), et note sur l'échec de test pré-existant
test_llm_fallback (sans rapport avec cette session).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
Lance pytest à chaque push/PR touchant packages/aria-core (Python 3.12, deps
mockées, hors-ligne). Scope ASSUMÉ sur le cœur VC (rapport, analyse, juge,
Telegram, Virtuals, TA) = 187 tests verts → le vert/rouge de la CI a enfin un
sens et attrape une régression AVANT le VPS.

Non inclus volontairement : ~17 tests en échec pré-existants (réseau + dette
technique hors périmètre VC : llm_fallback, holding_site, web_verify…). Leur
triage est un chantier séparé (voir handoff) ; on élargira la CI au fur et à
mesure de leur stabilisation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
La CI a attrapé un défaut latent : aria_core/public_mode.py importe fastapi au
niveau module (chaîne telegram_bot → brain → public_mode), mais fastapi n'était
pas dans les dépendances. En local il était présent (via le backend) → masqué ;
sur une install propre (CI) → ModuleNotFoundError.

Fix : ajout de fastapi aux dépendances d'aria-core. Vérifié dans un venv neuf
(`pip install -e .[dev]`) : fastapi tiré automatiquement, 187 tests VC verts.
Aucun impact VPS (le backend FastAPI l'a déjà).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Htwan6DUgJV1xBE1fJQvG1
@GoldenFarFR GoldenFarFR merged commit b0c9310 into main Jul 7, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants