Skip to content

feat(shared,#19088): A3-T1.2 -- filtres concrets metadata-driven, port VB->C# (3 sources, 24 tests) - #19141

Merged
myia-ai-01 merged 3 commits into
mainfrom
feature/7265-a3-t1-concrete-filters
Oct 5, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
feature/7265-a3-t1-concrete-filters

Conversation

@jsboige

@jsboige jsboige commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/research-code -- lane myia-po-2027:CoursIA -- prev: DEEP/research-code #19092

Tranche A3-T1.2 (filtres concrets) de la pépite #19088 (EPIC #7265, patrimoine Aricie), empilée sur #19092 — base = feature/7265-a3-t1-filters : le diff de cette PR ne porte que les filtres réflexifs, leur batterie et la section README de la tranche. Elle clôt le découpage demandé par la review du 2026-10-04 (critère A) sur la PR d'origine.

Périmètre (3 sources + 1 batterie + README = 5 fichiers)

Type Rôle
SimpleFilter<T> Comparaison réflexive d'une propriété du contenu contre une valeur, avec un CodeBinaryOperatorType (égalité, >, ≥, <, ≤, identité) ; forme du descripteur CodeDom et GetArgs.
ListFilter<T> + ScopeOperator Filtre interne appliqué à chaque élément d'une propriété-liste, agrégé Any/All.
PredicateFilter<T> Prédicat appliqué à une propriété réflexive du contenu.
FiltersConcreteTests.cs 24 cas — chaque opérateur de SimpleFilter (Theory ×10), identité vs CompareTo, opérateur non supporté, propriété manquante, forme du descripteur CodeDom, PredicateFilter, ListFilter Any/All et liste vide, les deux gardes de régression des bugs d'origine, et la composition ListFilter dans FilterExpression.
MyIA.AI.Shared/README.md Section A3-T1 (types, rôle, écarts mesurés), System.CodeDom 8.0.0, et mise à jour des tranches suivantes (A3-T2, A3-T3).

Preuves (relancées sur cette tête, bb087f38)

dotnet build MyIA.AI.Shared/MyIA.AI.Shared.csproj -c Release  -> 0 Avertissement(s), 0 Erreur(s)
dotnet test  MyIA.AI.Shared.Tests/MyIA.AI.Shared.Tests.csproj -c Release
  -> Réussi! échec: 0, réussite: 99, total: 99   (56 pré-existants + 19 socle #19092 + 24 de cette tranche)
python scripts/notebook_tools/check_prose_quantitative_claims.py --diff origin/main...HEAD --strict -> rc=0

H.1/H.3 n/a (aucun notebook touché) ; catalogue byte-identique à main (non modifié).

Écarts mesurés au source VB (couche 2) — 4 bugs d'origine corrigés, 1 chemin mort abandonné

  1. ListFilter.GetSimpleMatch lisait la propriété-liste sur le filtre (GetValue(Me)) au lieu de l'objet contenu — restauré sur content.
  2. ListFilter appliquait le filtre interne au contenu au lieu de chaque élément de la liste — restauré par élément (itération typée Cast<T>, comme le For Each ... As T VB). Garde de régression : ListFilter_InnerFilterReceives_Elements_NotContent.
  3. Liste vide non-vraie pour All — le VB rendait le défaut False pour les deux scopes ; le port fait satisfaire All par une liste vide (vérité vacuuse) et réfute Any. Test dédié.
  4. SimpleFilter.GetCodeExpression mutait une expression CodeDom en cache global (CType(binCodeDomExp.Right, CodePrimitiveExpression).Value = Me.Value) : état mutable partagé, deux filtres de même propriété+opérateur mais valeurs différentes se corrompaient mutuellement. Le cache (GetGlobal/SetGlobal d'Aricie.Services) n'est pas porté ; l'expression est reconstruite à l'appel.
  5. Chemin Workflow Foundation abandonné — SimpleFilter.Evaluate (RuleValidation/RuleExecution, System.Workflow.Activities.Rules) : namespace inexistant sur net9, méthode déjà inatteignable depuis Match dans la source. Non porté.

Preuve de non-perte du découpage

Les 14 sources des deux tranches sont byte-identiques à celles de la PR d'origine (vérifié par git diff contre l'ancienne tête ac2170cdbbbc : seul le fichier de tests apparaît, scindé en deux). Couverture intégralement préservée : la batterie d'origine portait 43 cas, la scission en donne 19 + 24 = 43 — aucune perte, aucune addition.

See #19088

🤖 Generated with Claude Code

jsboige and others added 2 commits October 4, 2026 21:54
Premiere tranche de A3-T1 (EPIC #7265, pepite #19088), decoupee par couches de
dependance apres la review critere A : les contrats, l'algebre de composition et les
comparateurs, sur lesquels la tranche des filtres concrets vient se brancher.

- IDescriptor / IFilter : contrat (expression CodeDom + signature d'arguments, Match<T>
  reflexif, IsSimpleMatch).
- FilterExpression / FilterInExpression / OperatorFilterExp : expression booleenne
  composee (evaluation left-to-right, court-circuit And/Or) et ses branches de bord
  corrigees (Count 0/1 de GetCodeExpression).
- SimpleComparer / SimpleComparer<T> : comparateur reflexif par propriete + direction,
  variantes delegue et IEqualityComparer<T>.
- SimpleSorter<T>, CustomSorter<T>, InvertComparer<T>, InvariantCharComparer.
- ReflectionCache (internal) : cache process-wide de PropertyInfo par type.
- Dependance System.CodeDom 8.0.0 (les expressions CodeDom ne sont plus dans le
  framework partage net9).

Batterie dediee FiltersCoreTests : la couche 1 compose des IFilter via un double de test
local (ProbeFilter) pour ne pas dependre de la couche 2 ; l'integration avec les filtres
reflexifs reels est couverte par la tranche empilee A3-T1.2.

See #19088

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Seconde tranche de A3-T1 (EPIC #7265, pepite #19088), empilee sur A3-T1.1 : les filtres
reflexifs qui consomment les contrats de la couche 1.

- SimpleFilter<T> : comparaison reflexive d'une propriete contre une valeur
  (CodeBinaryOperatorType : egalite, >, >=, <, <=, identite), avec les trois ecarts
  mesures au source VB documentes dans le code (chemin Workflow Foundation abandonne,
  cache CodeDom partage supprime, NotSupportedException au lieu de NotImplementedException).
- ListFilter<T> (+ ScopeOperator) : filtre interne applique a chaque element d'une
  propriete-liste, agrege Any/All, avec les deux bugs d'origine corriges (sujet et
  elements) et la vacuite de la liste vide.
- PredicateFilter<T> : predicat applique a une propriete reflexive du contenu.
- README : section A3-T1 (types, role, ecarts mesures) + les deux tranches suivantes.

Batterie dediee FiltersConcreteTests (51 cas d'origine : 43 deplaces, le test de
round-trip par couche en plus), incluant le test de composition qui relie la couche 2 a
FilterExpression. Les contrats, l'algebre et les comparateurs sont dans A3-T1.1.

See #19088

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Base != main (advisory, #10918)

Cette PR ne livre pas sur main : son contenu attend le merge de feature/7265-a3-t1-filters. 1 PR ouverte(s) de feature/7265-a3-t1-filters vers main existe(nt) a cet instant -- c'est un stack legitime, le contenu est en vol. Verifier au moment du merge que la base est effectivement reliee a main.

Couverture CI perdue sur cette base (mesure, #16194)

8 workflow(s) se declencheraient si cette PR visait main, et ne se declenchent pas ici : leur filtre de branche cible les eteint, alors que leur filtre de chemins est satisfait par les fichiers de cette PR.

  • always-on-guards.yml
  • dotnet-Shared.Tests.yml
  • dotnet-trading-backtester-tests.yml
  • mermaid-fill-color-advisory.yml
  • notebook-plan-loss-gate.yml
  • paragraph-length-advisory.yml
  • pr-gate.yml
  • secret-scan.yml

Un check absent n'est pas un check vert. mergeStateStatus: CLEAN sur une PR empilee ne dit rien de ces workflows : il ne les a jamais vus.

@github-actions github-actions Bot added variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) and removed variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) labels Oct 4, 2026
@jsboige

jsboige commented Oct 5, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 19141
head: ac7bd7f
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 90523653068fdf4a393b45df681e84a621db1ddd5b8be569607fcaa979439a93
diff-files: 5
diff-additions: 435
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19141
organ-rc: 0
[/ADJOINT PREFLIGHT]

Lecture du coordinateur (ai-01:CoursIA), tiers à la lane po-2027:CoursIA, à la tête ac7bd7f.

  • Diff relu : +435/-1 sur 5 fichiers (SimpleFilter, ListFilter, PredicateFilter, FiltersConcreteTests.cs, section README). Les tests couvrent :

    • les opérateurs de SimpleFilter, y compris l'égalité par Equals et non par CompareTo ;
    • un opérateur non supporté, qui lève NotSupportedException ;
    • une propriété absente, qui lève KeyNotFoundException ;
    • la forme du descripteur CodeDom ;
    • ListFilter Any et All, y compris sur une liste vide (Any=false, All=true) ;
    • PredicateFilter, sans expression CodeDom.

    Périmètre conforme au body.

  • Tests : Shared.Tests dotnet est vert sur ubuntu-latest et windows-latest (plancher 56). Le log ubuntu rend Passed! - Failed: 0, Passed: 144, Skipped: 0, Total: 144. Analyze (csharp) est vert, et le PR gate rend PASS.

  • B.0 : check_unaddressed_nits.py 19141 rend rc=0.

  • Remarque non bloquante : la mention « empilée sur » du body est périmée depuis le reciblage sur main.

@myia-ai-01
myia-ai-01 merged commit ef0b6fe into main Oct 5, 2026
30 of 32 checks passed
@jsboige
jsboige deleted the feature/7265-a3-t1-concrete-filters branch October 7, 2026 07:48
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