Skip to content

EPIC: Série *The Unexpected AI Stack: C#/.NET* — porter ses axes dans CoursIA (Aspire, OTEL, CSharpRepl, Roslyn, EF Core) #10473

Description

@myia-ai-01

Etat mesure au 2026-09-18 (lane myia-po-2025:CoursIA) — le tableau « Grains » ci-dessous porte 3 lignes « a ouvrir » qui sont livrees selon la chronologie du present body, verifiee firsthand ce jour (gh pr view N --json state : MERGED) :

Ces lignes restent reproduites telles quel ci-dessous (historique intact) ; aucune lane ne doit les reprendre comme travail ouvert. Restent reellement ouverts : #10474 (claime myia-po-2023:CoursIA-2), #10475 (veille — claim epic-wide myia-po-2024 marque DELIVERED PR #14800 MERGED, release demandee issuecomment-5730103293), et l'axe « AppHost pile GenAI apres #10474 » (gate sur #10474). Portee du present bloc : etat du tableau Grains uniquement ; les sous-grains crees entre le 2026-08-30 et ce jour ne sont pas reinventories ici.

État vérifié au 2026-08-30 — baseline historique et livraisons

Les trois sondes de la section « État mesuré du dépôt » sont une baseline historique datée du 2026-08-11, pas une description de l'état courant. Elles ont été re-mesurées sur le dernier commit de main antérieur à l'ouverture de l'issue (5934d23a969948150d9991f942ec10a8bf2e2959) :

  • git grep -il aspire retourne exactement 9 fichiers ; aucun AppHost ni répertoire GenAI/Aspire/ n'existe alors ;
  • git grep -il "csharprepl\|dotnet-repl" retourne exactement 0 fichier ;
  • SemanticKernel/04-SemanticKernel-Filters-Observability.ipynb porte 10 cellules code, 0 hit exporter et 0 hit ActivitySource dans ces cellules.

Les lectures Vibe du 2026-08-29 observent donc correctement l'état post-livraison, mais ne réfutent pas ces mesures initiales. La chronologie Git établit notamment :

Axe livré après l'ouverture Preuve mergée
OpenTelemetry SK-4 exécuté #10498 (2026-08-12), complété par #10964
CSharpRepl attaché à un process vivant #10806 (2026-08-14), mode scripté #10944
Aspire AppHost + run --isolated #10846 (2026-08-14), pile réelle #10871
OpenTelemetry / ActivitySource Aspire #11530 (2026-08-18), tranche résolue #12550
Channels + BackgroundService #11537 (2026-08-19)
Roslyn dans la compilation #11866 (2026-08-20), enrichi par #12535 et #13417
EF Core #12393 (2026-08-23)

Conséquence de tri : les affirmations historiques « 9 », « 0 » et « narré, jamais exécuté » restent exactes dans leur périmètre daté. L'état courant montre précisément le progrès produit par l'EPIC ; il ne doit pas être rétroprojeté sur sa baseline.

Origine : demande user 2026-08-11, à partir de The Unexpected AI Stack: C#/.NET — Part 1 (Charles Chen, 08/2026) — « compte tenu de notre positionnement singulier avec la parité csharp, ce début de série est très prometteur ».

Périmètre, précisé par le user : cet Epic couvre toute la série, dont seul le premier article est publié à ce jour — pas seulement Aspire. Aspire est le premier axe qu'on exploite parce que c'est celui que la Part 1 développe ; les axes suivants s'ouvriront au fil des publications. Le suivi des parutions est lui-même un grain (voir §Grains).

Pourquoi la série, et pas juste un outil

Notre parité C#/Python est jusqu'ici une parité de ponts vers des libs SOTA — PyMC ↔ Infer.NET, jpype ↔ IKVM, OR-Tools ↔ choco, mealpy ↔ MetaGeneticSharp, pyspiel ↔ PythonNet (#10382, livré par #10470). Dans tous ces couples, le C# rattrape un écosystème Python dominant.

La thèse de la série inverse le sens : elle soutient que pour construire et opérer des systèmes agentiques — orchestration, observabilité, introspection d'un process vivant, garde-fous statiques — l'outillage .NET est en avance et sous-estimé. C'est le premier corpus qui documente cet axe de façon suivie, et c'est exactement ce que « positionnement singulier » veut dire chez nous : nos notebooks C# n'ont pas à se contenter d'égaler leur jumeau Python, ils peuvent montrer ce que le Python n'a pas.

D'où le périmètre par série et non par outil : chaque article apporte un axe, chaque axe vaut un ou plusieurs grains, et la valeur pédagogique se construit sur l'ensemble.

Axes nommés par la Part 1 (garde-fou anti-dérive)

À citer tel quel plutôt qu'extrapoler :

Axe Ce que l'article en fait
Aspire encapsule le runtime ; orchestration programmable en C# (analogie Pulumi/CDK vs Terraform) ; aspire logs / describe / resource ; run --isolated pour l'isolation de ports par worktree
OpenTelemetry via le dashboard Aspire télémétrie intégrée sans configuration ; attributs gen.ai (l'article) / gen_ai.* (conventions sémantiques OTEL) ; aspire otel spans <res> --search "…"
CSharpRepl attaché à une application vivante par DOTNET_STARTUP_HOOKS + ASPNETCORE_HOSTINGSTARTUPASSEMBLIES ; connect init / connect list / connect <pid> ; accès direct aux dépendances du runtime ; #wrap / #replace pour envelopper ou remplacer une fonction à chaud
Roslyn analyseurs statiques comme garde-fous d'agent ; générateurs de source
EF Core requêtes vérifiées à la compilation
System.Threading.Channels, Orleans concurrence et acteurs, mentionnés comme atouts de la pile

Sections de la Part 1, verbatim : Summary · Why C#? · Encapsulating the Runtime with Aspire · Built in telemetry and observability · Agent interaction with runtime resources · Port isolation for worktrees · Wiring CSharpRepl into the running application · Direct access to runtime dependencies · Wrapping and replacing functions at runtime · Closing Thoughts.

Part 2, publiée le 2026-08-13, distillée (#10897, verdicts tranchés ai-01 c.97) — le contenu annoncé avait glissé : la Part 2 réelle est le scaffolding du template zeeq-tmpl (Mise, symlink AGENTS.md/CLAUDE.md, MCP Nuxt UI + Playwright, minimal API Scrutor IEndpoint/IEndpointHandler, frontend Nuxt UI Vite, AppHost AddViteApp+WithPnpm, CSharpRepl scripté connect --streamPipedInput). EF Core compile-time et testcontainers sont absents (renvoyés en Part 4). Bilan de distillation : axe 1 (CSharpRepl scripté) livré — PR #10944 ; axes 2/3 différés (pas de surface d'accueil ; #10857 d'abord) ; axes 4/5/6 clos — qu'aucune lane n'y revienne sans élément neuf. Parts 3 (Copilot SDK streaming) et 4 (Testcontainers + telemetry) annoncées par l'auteur, non publiées — voir #10475.

Ce que la série ne dit pas : ni Semantic Kernel, ni ML.NET, ni Microsoft.Extensions.AI, ni ONNX/TorchSharp, ni l'interop Python. Le raccordement à nos séries existantes est notre apport — à ne pas attribuer à la source.

Table de parité visée

Axe Python C#/.NET
Observabilité d'appels LLM OTEL SDK + collecteur à câbler, ou LangSmith / Langfuse (SaaS) dashboard Aspire : cible OTLP incluse, interrogeable en CLI
Orchestration de dev docker-compose, Tilt (YAML déclaratif) AppHost Aspire : orchestration programmable
Introspection d'un process vivant IPython, %autoreload, pdb attach CSharpRepl : #wrap / #replace à chaud sur un process attaché
Garde-fous statiques sur du code généré mypy, ruff (hors compilation) analyseurs Roslyn (dans la compilation)
Requêtes de données validées ORM à l'exécution EF Core vérifié à la compilation
Isolation de ports par worktree à la main aspire run --isolated

Cette table est le livrable transversal de l'Epic : chaque grain en remplit une ligne avec du code exécuté, jamais avec de la prose.

État mesuré du dépôt (firsthand, 2026-08-11)

Sonde Résultat
git grep -il aspire 9 fichiers, tous des faux positifs français (« le monde de l'aspirateur », Search-1) — aucun AppHost, aucun .AppHost.csproj
git grep -il "csharprepl|dotnet-repl" 0
OpenTelemetry présent dans GenAI/SemanticKernel/04-SemanticKernel-Filters-Observability.ipynb §6 « OpenTelemetry (Apercu) » — narré, jamais exécuté (0 exporter, 0 ActivitySource sur ses 10 cellules code). Également mentionné dans GenAI/Texte/9_Production_Patterns.ipynb
Roslyn / analyseurs présents dans la série ML/.NET comme outillage de build, jamais comme garde-fou de code généré par agent
dotnet --version 10.0.110 (ai-01), aucune charge de travail installée
aspire.cli 13.4.6, éditeur Microsoft, package vérifié → dotnet tool install -g aspire.cli, donc RECOVERABLE-LOCAL (sota-not-workaround) — installé firsthand sur myia-po-2023:CoursIA-2 le 2026-08-11
Issues existantes aucune sur aspire / CSharpRepl / OpenTelemetry avant celle-ci — pas de doublon

Grains

# Axe État
#10474 Aspire + OTEL : SK-4 §6, de l'aperçu narré aux spans gen_ai réellement captées ouvert, claimé myia-po-2023:CoursIA-2
#10475 Veille de la série : suivre les parutions, distiller chaque article en grains candidats ouvert
— Aspire AppHost orchestrant notre pile GenAI existante (ComfyUI / Qwen / vLLM) + run --isolated sur notre dette de worktrees à ouvrir après #10474
— CSharpRepl attaché à une application .NET vivante (#wrap / #replace), face à %autoreload / pdb à ouvrir
— Analyseurs Roslyn comme garde-fous de code généré par agent à ouvrir
— Axes de la Part 2 distillés (#10897) : CSharpRepl scripté livré #10944 · Scrutor minimal API + AppHost frontend différés · Mise / symlink / MCP frontend clos

Un grain par axe, See #10473 (jamais Closes : l'Epic vit tant que la série publie).

Hors périmètre

  • Aucune réécriture du contenu existant des séries touchées : les sections grossissent, le reste reste inchangé.
  • Aucun Aspire ni CSharpRepl en CI : ce sont des outils de développement local. Les notebooks restent exécutables sans eux.
  • Pas d'adoption d'Orleans ni de refonte d'architecture : la série est une source d'axes pédagogiques, pas un plan de migration.

Garde-fous applicables à chaque grain

C.1 (aucune erreur volontaire) · C.2 (cellules committées avec execution_count et sorties réelles) · Prong A (vrai outil, bridge_verdict écrit) · three-exercises-per-notebook · prose FR d'abord · tag Grain: en première ligne · pour un notebook .NET uniquement : strip_probe_banner.py --apply après ré-exécution.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions