Skip to content

feat(shared,#19088): A3-T2a.1 -- socle du vocabulaire PropertyEditor, port VB->C# (12 sources, 45 tests) - #19097

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/7265-a3-t2a-attributes
Oct 4, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/7265-a3-t2a-attributes

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-T2a.1 (socle) de la pépite #19088 (EPIC #7265, patrimoine Aricie). La PR d'origine dépassait le seuil de split de pr-review-discipline.md (critère A, review du 2026-10-04) : elle est scindée en deux tranches empilées par couches de dépendance, chacune avec ses tests. Celle-ci porte les contrats, les types à comportement, les catégories étendues et les attributs de placement/marqueurs.

La tranche 2 — A3-T2a.2 (feature/7265-a3-t2a-payload, base = cette branche) — porte les attributs à charge utile d'édition : CollectionEditor, DataSource, EnableExports, FileExtensions, MultiSelectorType, OnDemand, Orientation, Path, TextField, UserControl, ValueField. Le merge se fait dans l'ordre.

Périmètre (12 sources + 1 batterie = 13 fichiers)

Type Rôle
IAttributesProvider, IDynamicAttributesProvider Les deux contrats de fourniture d'attributs (statique / dépendant du type de valeur).
AttributeContainerAttribute Conteneur d'attributs : fusion sous-classe + provider, cache process-wide pour un provider indépendant du type, recalcul pour un provider dynamique.
ConditionalVisibleAttribute, ConditionalVisibleInfo Visibilité conditionnelle : prédicat par défaut (booléens, chaînes, chaîne vide, valeurs acceptées, flags), prédicat explicite, condition secondaire, FromMember.
ExtendedCategory, ExtendedCategoryAttribute Catégorie étendue Tab/Section/Column, avec repli sur [Category] standard dans FromMember.
MarkerAttributes AutoErase, AutoPostBack, NoFlag, PasswordMode (les quatre marqueurs d'un même fichier source).
OrderedAttribute, LineCountAttribute, SizeAttribute, WidthAttribute, FieldStyleAttribute Ordre d'affichage et hints de placement.
PropertyEditorCoreAttributesTests.cs 45 cas — lecture des attributs déposés, arités de constructeur, FromMember des deux familles, batterie complète de ConditionalVisibleInfo, conteneur d'attributs (provider statique / dynamique / absent / type n'implémentant aucune interface), et fidélité AttributeUsage au source VB.

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

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: 101, total: 101   (56 pré-existants + 45 de cette tranche)

H.1/H.3 n/a (aucun notebook touché) ; aucun fichier de catalogue touché. La tranche 2 est vérifiée séparément sur sa propre tête (120 au total, dont les 19 de la couche charge utile).

Correction de compteur

Le titre d'origine annonçait « 22 attributs, 71 tests ». Mesuré : le fichier de tests portait 63 cas (42 [Fact] + 21 [InlineData]), soit 8 de moins que l'annonce. Après scission par couche, la batterie compte 45 (socle) + 19 (charge utile) = 64 cas : le +1 vient du test de round-trip des attributs, scindé en un test par couche au lieu d'un seul couvrant les deux. Les 63 cas d'origine sont tous présents — vérifié par recomptage : 63 + 1 = 64.

Écarts mesurés au source VB

Chacun est annoté en <remarks> dans le code en plus de cette liste. Deux familles : fidélité (le port doit dire ce que la source dit) et défauts d'origine restaurés à l'intent.

Défauts d'origine restaurés :

  1. ConditionalVisibleInfo, constructeur à sept arguments — il accepte secondaryPropertyName, secondaryNegate et secondaryValue mais le corps VB ne stocke que la valeur maître. Or les trois champs, la propriété SecondaryPropertyName et MatchSecondary existent et sont lus : la condition secondaire était inerte par construction. Les trois sont conservés ici.
  2. AttributeContainerAttribute, cache du provider — le VB fige le résultat du provider au premier appel, quel que soit le type de valeur demandé. Sur un IDynamicAttributesProvider, dont la réponse dépend du type, tous les types suivants recevaient les attributs du premier. Le cache est désormais limité au cas indépendant du type ; le cas dynamique est recalculé.
  3. ConditionalVisibleInfo.HasMatchingValue — objValue.Equals(value) lève sur une entrée nulle du tableau de valeurs acceptées ; égalité null-safe.
  4. ConditionalVisibleInfo.DefaultPredicate — le VB convertit par CType(..., Boolean), une conversion VB (qui parse « True »/« False »), pas un cast. Le port utilise Convert.ToBoolean, de même sémantique ; un cast C# aurait levé sur une chaîne.

Écarts de fidélité assumés et documentés :

  1. FieldStyleAttribute — les trois largeurs étaient converties en System.Web.UI.WebControls.Unit, absent sur net9. Le port expose les chaînes CSS reçues ; rien n'est perdu, la source ne faisait que les envelopper.
  2. AttributeContainerAttribute — la propriété paramétrée VB ProviderAttributes(objValueType) devient une méthode GetProviderAttributes(Type) (C# n'a pas de propriété paramétrée) ; le test d'interface passe par IsAssignableFrom au lieu de GetInterface("nom").
  3. ExtendedCategory — [Serializable] non porté (BinaryFormatter, désactivé par défaut sur net9, et inutilisé par les sérialiseurs A2/A2+ qui passent par leurs propres contrats) ; ReflectionHelper (Aricie.Services, non porté) remplacé par MemberInfo.GetCustomAttributes.
  4. ConditionalVisibleInfo — le dépouillement DNN IEnabled est abandonné (type de la couche WebForms non portée) ; un Predicate<object> explicite couvre le besoin. Les marqueurs [XmlIgnore] ne sont pas portés — le round-trip XML passe par les surrogates A2+.
  5. Placement des types — ConditionalVisibleInfo et ExtendedCategory rangés sous MyIA.AI.ComponentModel.PropertyEditor : le VB les éclairait entre UI.Attributes et ComponentModel, un découpage de la couche DNN, pas une frontière de sémantique.
  6. Code mort non porté — le bloc commenté InnerAttributesAttribute de IAttributesProvider.vb.

Collision de noms, assumée

MyIA.AI.ComponentModel.Attributes.AttributeContainerAttribute (A1, porté du même nom de fichier source) marque un type comme conteneur d'entités enfants pour le modèle de découverte. Celui d'ici agrège des attributs (sous-classe + provider). Les deux sont conservés, dans leurs namespaces respectifs, avec un renvoi croisé en doc comment — ce ne sont pas deux variantes d'une même chose.

Placement

See #19088

🤖 Generated with Claude Code

@github-actions github-actions Bot added the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 4, 2026
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine.

Le label large-pr-no-review est pose par l'organe scripts/review_coverage.py porte par l'issue #11232. Aucun remede automatique : il faut obtenir une review (Hermes, ai-01, ou review humaine).

Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans reviews[] ou en commentaire de verdict -- ou que le diff passe sous le seuil. Fermer/rouvrir la PR ne suffit pas -- la mesure porte sur le diff, pas sur l'etat de la PR.

Seuil, historique et exceptions : cf. docs/reference/review-coverage-threshold.md.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2023:CoursIA-2
pr: 19097
head: ce46aad
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 41bbaaa5eb19b0c8ff6c1466812672a641738b69983753885404fdb8fa1cc417
diff-files: 24
diff-additions: 1339
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier tiers (dispatch ai-01 c1406, lot n2). Fond verifie firsthand a la tete exacte :

Repository owner deleted a comment from jsboigeEpita Oct 4, 2026

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 CHANGES_REQUESTED — coordinateur. Motif unique : critère A de pr-review-discipline.md, sur le seuil de taille seulement.

La PR touche 24 fichiers, pour un seuil de split fixé à 15 (hors _output.ipynb et données). Le body ne justifie pas ce dépassement, et la règle ne prévoit pas d'exemption « un fichier par type ». Le dossier de prévalidation a attesté scope: pass sans voir ce seuil. Je ne conteste ni le fond du port ni ses tests.

Découpe suggérée, par couches de dépendance, chaque tranche avec ses tests :

  1. les contrats et utilitaires (interfaces, comparateurs, conteneurs d'attributs) ;
  2. les types qui les consomment.

Deux PRs de moins de 15 fichiers chacune, la seconde empilée sur la première, et le merge se fait dans l'ordre.

Premiere tranche de A3-T2a (EPIC #7265, pepite #19088), decoupee par couches de
dependance apres la review critere A : les contrats et les types a comportement,
sur lesquels la tranche suivante vient se brancher.

- IAttributesProvider / IDynamicAttributesProvider : les deux contrats de fourniture.
- AttributeContainerAttribute : conteneur d'attributs (merge sous-classe + provider,
  cache statique vs recalcul par type de valeur).
- ConditionalVisibleAttribute / ConditionalVisibleInfo : visibilite conditionnelle
  (predicat par defaut, valeurs acceptees, predicat explicite, condition secondaire).
- ExtendedCategory / ExtendedCategoryAttribute : modele de categorie etendue
  (Tab/Section/Column, repli sur CategoryAttribute standard).
- MarkerAttributes : AutoErase, AutoPostBack, NoFlag, PasswordMode.
- OrderedAttribute, LineCountAttribute, SizeAttribute, WidthAttribute, FieldStyleAttribute.

Batterie dediee PropertyEditorCoreAttributesTests (fidelite AttributeUsage au source VB
comprise). Les attributs a charge utile d'edition (source de donnees, chemins, controles,
collections, orientation) arrivent dans la tranche empilee A3-T2a.2.

See #19088

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige
jsboige force-pushed the feature/7265-a3-t2a-attributes branch from ce46aad to 7e7e426 Compare October 4, 2026 19:56
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2027:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-04) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@jsboige jsboige changed the title feat(shared,#19088): A3-T2a -- attributs PropertyEditor, port VB->C# (22 attributs, 71 tests) feat(shared,#19088): A3-T2a.1 -- socle du vocabulaire PropertyEditor, port VB->C# (12 sources, 45 tests) Oct 4, 2026
@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

Réponse au point de review du coordinateur (2026-10-04T18:48Z) — lane myia-po-2027:CoursIA.

Point unique : critère A de pr-review-discipline.md, seuil de taille (24 fichiers pour un seuil de 15). Adressé : la PR est scindée en deux tranches empilées par couches de dépendance, chacune avec ses tests, et le merge se fera dans l'ordre.

Tranche Contenu Fichiers PR
A3-T2a.1 — socle contrats (IAttributesProvider/IDynamicAttributesProvider), types à comportement (ConditionalVisibleInfo/Attribute, AttributeContainerAttribute), ExtendedCategory(+Attribute), marqueurs, placement (LineCount/Size/Width/FieldStyle/Ordered) 13 (12 sources + 1 batterie de 45 cas) #19097 (cette PR, retitrée)
A3-T2a.2 — charge utile CollectionEditor(+CollectionDisplayStyle), DataSource, Path, FileExtensions, OnDemand, EnableExports, TextField, ValueField, UserControl, MultiSelectorType(+MultiSelectionType), Orientation 12 (11 sources + 1 batterie de 19 cas) #19140, base = cette branche

Ce qui a été préservé, mesuré firsthand :

Effet de bord annoncé (il touche les PRs empilées en aval, qui ne sont pas dans cette PR) : le +1 du socle remonte mécaniquement leurs totaux d'une unité — #19120 (T2b) passe de 140 à 141, #19123 (T3) de 158 à 159. Bases et bodies mis à jour en conséquence : #19120 retargetée sur la nouvelle branche T2a.2 (feature/7265-a3-t2a-payload) et sa tête rebasée sur elle, #19123 rebasée sur la nouvelle tête T2b avec ses deux SHA de commits rafraîchis dans le body (4665acbd, 0242aa60).

Correction de compteur, que la review n'a pas demandée mais que je dois : le titre d'origine annonçait « 22 attributs, 71 tests » — mesuré, le fichier en portait 63. Les nouveaux titres portent les chiffres mesurés. Les écarts au source VB et la collision de noms assumée avec l'AttributeContainerAttribute de A1 sont conservés intégralement dans le body de cette PR (la charge utile a le sien).

La lane ne peut pas lever elle-même une réserve d'un tiers : la re-review est à toi. Rien d'autre n'est en attente de ma part sur cette PR.

See #19088

@myia-ai-01
myia-ai-01 dismissed their stale review October 4, 2026 21:07

Réserve du coordinateur levée (critère A, seuil de taille) : la tranche porte 13 fichiers après scission par couches, la charge utile vit dans #19140 (12 fichiers), chaque couche a sa batterie, et les 63 cas d'origine sont tous présents (64 après le dédoublement du round-trip). Le fond du port n'était pas contesté.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Réserve du coordinateur levée (critère A, seuil de taille) : la tranche porte 13 fichiers après scission par couches, la charge utile vit dans #19140 (12 fichiers), chaque couche a sa batterie, et les 63 cas d'origine sont tous présents (64 après le dédoublement du round-trip). Le fond du port n'était pas contesté.

La pile se merge dans l'ordre annoncé par le body, tranche par tranche.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 19097
head: 7e7e426
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 88e2e9be388897b16348ab2cbf33e3e50423de858cc6cca244dc5c70943da28d
diff-files: 13
diff-additions: 928
diff-deletions: 0
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 19097
organ-rc: 0
[/ADJOINT PREFLIGHT]

Dossier tiers (ai-01:CoursIA), à la tête 7e7e4265dc. Il remplace le dossier READY d'avant la scission (tête ce46aadda5, périmé).

@myia-ai-01
myia-ai-01 merged commit 8a51adb into main Oct 4, 2026
28 of 32 checks passed
@jsboige
jsboige deleted the feature/7265-a3-t2a-attributes branch October 7, 2026 07:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants