Repository navigation
fix(picker,#14537): impute_base_reds corrobore par ORGANE et par LANE, pas par nom de job ni login - #14644
Conversation
Les deux cles du predicat d'imputation a la base etaient fausses et se compensaient mal : le NOM d'un agregateur (identique quel que soit l'organe tombe, corroboration garantie par construction) et author.login (identite de poussee partagee des cinq lanes, 52/59 de l'ouvert -- le cas nominal n'etait jamais croise). Desormais : cle = cause (organe resolu via l'annotation du check-run pour un agregateur, nom pour un check direct), unite = tag de lane du grain tag, dedup par set, fail-closed aux deux bouts (PR sans tag et agregateur non resolu sont exclus ET dits -- base_unresolved).
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — Réfection vérifiée first-hand : solide, un résiduel mineur à tracer (contrainte token : COMMENT only, opener=jsboige).
Vérifié par exécution réelle (tarball au SHA de tête 37f4d4f, venv propre, pytest 3.12) :
test_pick_idle_grain.py: 95 passed head / 89 passed base = +6 nets (6 nouveaux listés, 0 retrait — le « 7 nouveaux/mis à jour » du body compte l'update detest_base_inherited_red_is_not_the_lanes, cohérent). Les 7 suites picker complètes : 165 passed — claim du body reproduit à l'identique.- Parseur d'organes validé sur le réel : annotation du check-run
Always-on guards -- 12 organes, 1 checkouten échec sur #14596 (run 100999413432) →_ORGAN_BANNER_REextrait['adjacency'], exactement la sortie live du body. Le format réel « organe (détail…) » est bien couvert par la classe[a-z_ ]+?. - Logique : corroboration par lane (pas
author.login— l'identité de poussée partagée 52/59 rendait l'ancien prédicat vide au cas nominal), regroupement par cause (organe de l'annotation pour l'agrégateur, nom pour le check direct #13545), dédupset, fail-closed aux deux bouts (laneabsente → hors corroboration ; agrégateur illisible →base_unresolveddit le non-tranché au lieu d'un silence). Héritage partiel par subsetkeys <= inherited: testé multi-organes, l'agrégateur partiellement hérité reste une cause lane — correct. subprocessgh dansfetch_check_organs:check=True, timeout=60, catch-all → fail-closed sans crash picker. Cacheorgan_cacheévite le re-fetch par PR.
Résiduel (non bloquant, pour la traçabilité) : AGGREGATOR_CHECK_PREFIXES = ("Always-on guards",) matche aussi « Always-on metadata guards -- 3 organes » (préfixe commun). Vérifié sur #14596 : ce check est success donc hors chemin FAILURE — sans effet aujourd'hui, mais si l'agrégateur metadata tombe un jour, il sera traité par la voie organe (annotation du même format ?) alors que sa bannière n'a pas été vérifiée dans le corpus. Une ligne de commentaire ou un test future en bénéficierait.
Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=). Les deux résiduels arbitrables du body (two-hop PR gate, carve-out prev_guard/adjacency) sont correctement signalés au coordinateur au lieu d'être enterrés.
Path-collision (organ #13359/#13615)Cette PR #14644 (
|
Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: MED/guard #14601
Quoi
Réfection des deux clés du prédicat
impute_base_redsdescripts/pick_idle_grain.py(#14537) — l'imputation « ROUGE IMPUTE A LA BASE » qui gèle des PRs en routant leur rouge au coordinateur à tort :Always-on guards/PR gateportent un nom identique quel que soit l'organe tombé — corroboration garantie par construction)Organes bloquants en echec : <organe>) pour un agrégateur ; le nom pour un check direct (cas fondateur #13545Scripts Tests (CPU), inchangé)author.login(identité de poussée partagée des cinq lanes — 52/59 de l'ouvert ; le cas nominal n'était JAMAIS croisé, le verdict ne tenait qu'à l'accident du compte de poussée #14534)#14340cité 3× comme sa propre corroboration)set— chaque PR est témoin uniqueFail-closed aux deux bouts (#14567) : une PR sans tag de lane lisible reste hors corroboration (elle n'irait grossir aucun seau), et un agrégateur sans organe lisible ne corrobore rien — il est dit dans la sortie (
base_unresolved: « pas pu trancher, le rouge RESTE à la lane ») au lieu d'un silence lu comme un acquittement. Un agrégateur partiellement hérité (un organe à la base, un à la lane) reste une cause pour la lane.Preuve (relancée après le dernier commit)
python -m pytest scripts/tests/test_pick_idle_grain.py= 95 passed (7 nouveaux/mis à jour), suites picker complètes (test_pick_idle_grain_cache,test_pick_admissibility,test_pick_child_encoding,test_pick_claim_filter,test_pick_filters,test_pick_nanoclaw_concerns,test_substance_drought) = 165 passed.--lane myia-po-2026:CoursIA, 2026-09-04T16:25Z) — première sortie du prédicat réparé sur le réel :L'organe est résolu et nommé (acceptance 4 de #14567), et
PR gate— dont l'annotation nomme des checks enfants, pas des organes — est correctement fail-closed au lieu de corroborer par son nom.Acceptance #14537 → tests
jsboigeEST imputé (l'angle mort fondateur) :test_same_organ_two_lanes_same_push_login_is_imputed.test_distinct_organs_under_one_aggregate_are_not_imputed.test_aggregate_with_unreadable_organ_stays_with_lane,test_untagged_pr_never_corroborates.test_rollup_stack_does_not_self_corroborate.blocking_causes:test_partial_inheritance_keeps_the_lane_cause.test_base_inherited_red_is_not_the_lanes(mis à jour :PR gaterésolu en organe au lieu de corroborer par nom).Résiduel signalé (hors scope, arbitrable)
PR gatereste non résolvable (fail-closed dit) : son annotation finale est[pr-gate] FAIL -- failing checks: <noms de checks enfants>— elle nomme des checks, pas des organes. Une résolution two-hop (annotation PR gate → check enfant nommé → SON annotation d'organe, les deux runs étant dans le même rollup) est possible en suivi.prev_guard(5 PRs, plusieurs lanes) etadjacency(2 PRs) — or ces organes sont, par design, réparables Côté lane (chaque PR déclare son propreprev:/séquence de genre). L'acceptance de picker: l'imputation d'un rouge a la base corrobore sur le NOM d'un agregateur et sur author.login, pas sur l'organe ni sur la lane (#13545) #14537 dit « même organe sur ≥2 lanes = base », mais un carve-out « organes lane-side » (prev_guard/adjacency/lane_claim) peut se justifier — décision coordinateur au premier signalement fantôme.Périmètre
2 fichiers :
scripts/pick_idle_grain.py(prédicat + résolution d'organe +databaseIdau fragment GraphQL + sortiebase_unresolved),scripts/tests/test_pick_idle_grain.py(7 tests nouveaux/mis à jour).(Worktree frais depuis origin/main ; des fichiers
slides/S3-acculturation/*salis par un flip EOL dans le working tree NE SONT PAS dans le commit — vérifiégit show --stat HEAD= 2 fichiers.)See #14567 (jumelle du même défaut, déposée ce jour par une autre lane — non claimée ici ; couverte par ce fix, fermeture laissée au coordinateur/découvreur).
Closes #14537