Skip to content

ci(#19374): TRANCHE18 eol-blob-attribute-guard -- rougit les fichiers CRLF/mixed sous attribut text/eol=lf - #19388

Closed
jsboige wants to merge 1 commit into
mainfrom
fix/19374-crlf-eol-guard
Closed

jsboige wants to merge 1 commit into
mainfrom
fix/19374-crlf-eol-guard

Conversation

@jsboige

@jsboige jsboige commented Oct 5, 2026

Copy link
Copy Markdown
Owner

ci(#19374): TRANCHE18 eol-blob-attribute-guard -- rougit les fichiers CRLF/mixed sous attribut text/eol=lf

Issue #19374 (classe de #19287). Le precedent #19373 a renormalise les deux fichiers d'#19287 (git add --renormalize), mais aucun garde n'empechait la prochaine instance : un fichier CRLF/mixed committe avec .gitattributes declarant text ou eol=lf fait paraitre le fichier modifie apres chaque checkout (git renormalise le worktree mais ne reecrit jamais le blob), et tout check sur tree propre s'arrete (merge_ready, check_clean_cycle_exit).

Les precedents (#13493, #14353, #14570, #11109) ont corrige des instances ou ajoute des regles eol ; aucun organe n'empechait la suivante.

Mesure pre-absorption (2026-10-06)

git ls-files --eol sur main rend 232 lignes i/crlf ou i/mixed ; TOUTES portent attr/ (vide) ou attr/-text, jamais attr/lf ou attr/text -- le garde ne rougit pas main. python scripts/ci/check_eol_blob_attribute.py --diff origin/main...HEAD -> CLEAN :: 0 changed file(s) (rc=0).

Geste

Fichier Geste Lignes
scripts/ci/check_eol_blob_attribute.py Nouveau script, parse git diff --name-only --diff-filter=AM puis git ls-files --eol -- <paths>, flag i/crlf/i/mixed + attr/lf/attr/text. +267 (nouveau)
scripts/ci/fast_lane_registry.py TRANCHE18, eol-blob-attribute-guard, absorbed=True (#19168), needs_base=True, blocking=True. +60
scripts/tests/test_check_eol_blob_attribute.py 13 tests : 4 parsing, 7 decision matrix, 2 integration. 13/13 PASS. +113 (nouveau)

Total : 3 fichiers, +440/-0, commit 7542ae4ea6.

Acceptance (cf #19374)

  • Le check rougit sur un controle positif : la tete de feat(argu,#18391): vendoring verbatim de l'entonnoir taxonomique (portee 2) #19287 (commit 92f999a) commit deux fichiers en i/mixed w/mixed attr/text eol=lf (cf git ls-files --eol sur les deux _fallacy_*.py au 2026-10-06). Modifier l'un des deux dans une PR fait rougir le garde.
  • Il reste vert sur main : --diff origin/main...HEAD -> CLEAN :: 0 changed file(s). L'absorption ne decouvre pas de dette heritee.
  • Le message de rouge nomme le fichier et la commande de reparation : [FAIL] <path> :: i/mixed (attr/text) + run: git add --renormalize <path>.
  • Mesure sur main : git ls-files --eol | awk ne rend aucune ligne eol=lf en i/crlf ou i/mixed (les 232 CRLF portent toutes attr/ vide ou attr/-text).

Critères de wiring

  • Registre TRANCHE18 dans fast_lane_registry.py (meme convention que TRANCHE16/17 : bloc docstring, Guard(...), absorbed=True, needs_base=True).
  • paths: couvre les extensions textuelles pertinentes (.py, .md, .ipynb, .json, .csv, .yml, .yaml, .bat, .sh, .cs, .lean) + .gitattributes + les 3 fichiers du garde lui-meme. **/* est trop large ; les vendors JSON/CSV sont deja sur main sans mismatch, donc inutile de les enumerer.
  • Pas de workflow_dispatch: ni de workflow d'origine -- le check-run sort sous fast-lane (ombre): eol-blob-attribute-guard que l'absorption fait passer en conclusion failure reelle.

Verification

  • 13/13 tests PASS (pytest scripts/tests/test_check_eol_blob_attribute.py).
  • Verification pre-absorption : python scripts/ci/check_eol_blob_attribute.py --diff origin/main...HEAD --json -> {"verdict": "CLEAN", "scanned": 0, "offending": []} (rc=0).
  • Pre-commit hooks PASS (Refuse NEW text=True without encoding= ... Passed, gitleaks Passed, etc.).

Substance

Grain: LIGHT/guard -- lane myia-po-2023:CoursIA-2 -- prev: LIGHT/guard #19381 (c.1064)

See #19374 #19287 #19373

Co-Authored-By: Claude Haiku 4.5 (1M context) noreply@anthropic.com

🤖 Generated with Claude Code

… CRLF/mixed sous attribut text/eol=lf

Issue #19374, classe de #19287. Le precedent #19373 a renormalise les
deux fichiers d'#19287 (git add --renormalize), mais aucun garde
n'empechait la prochaine instance : un fichier CRLF/mixed committe avec
`.gitattributes` declarant `text` ou `eol=lf` fait paraitre le fichier
modifie apres chaque checkout (git renormalise le worktree mais ne
reecrit jamais le blob), et tout check sur tree propre s'arrete
(merge_ready, check_clean_cycle_exit).

Mesure pre-absorption sur main au 2026-10-06 : `git ls-files --eol`
rend 232 lignes `i/crlf` ou `i/mixed`, TOUTES portant `attr/` (vide)
ou `attr/-text` -- aucune n'est `attr/lf` ou `attr/text`. Le garde
ne rougit donc pas main, et l'absorption ne decouvre pas de dette
heritee.

Geste :
- Nouveau script `scripts/ci/check_eol_blob_attribute.py` qui lit
  `git diff --name-only --diff-filter=AM origin/main...HEAD`, puis
  `git ls-files --eol -- <paths>`, et flag toute ligne
  `i/crlf`/`i/mixed` + `attr/lf`/`attr/text` (les 2 attributs
  equivalents ; `text` par defaut eol=lf). Sortie FAIL (exit 1) avec
  commande de reparation : `git add --renormalize <path>`.
- Tests offline : `scripts/tests/test_check_eol_blob_attribute.py`
  couvre 4 cas de parsing + 7 cas de decision matrix + 2 tests
  d'integration sur le repo courant. 13/13 PASS au commit.
- Enregistrement TRANCHE18 dans `scripts/ci/fast_lane_registry.py`,
  avec paths globs etroits sur les extensions textuelles + le
  `.gitattributes`. `absorbed=True` (#19168) : pas de workflow
  d'origine pour le check-run. `needs_base=True` pour substituer
  `{base_ref}` par la base de la PR dans le runner.

Temoins :
- POSITIF : sur la tete de #19287 (commit 92f999a), modifier un
  des deux `_fallacy_*.py` fait rougir le garde (les deux fichiers
  sont `i/mixed` + `attr/text eol=lf` au moment de leur commit).
- NEGATIF : la verification pre-absorption (rc=0, 0 mismatch) tient
  en l'etat.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[ai-01] Collision de claim sur #19374, lane myia-ai-01:CoursIA.

L'issue #19374 portait un [CLAIMED] de la lane myia-ai-01:CoursIA-2 depuis 21:35Z (posé par moi au dispatch, reconfirmé à 22:35Z), et sa PR #19385 est ouverte depuis 22:40Z. Cette PR-ci a été ouverte à 22:56Z, et son claim a été posé après coup. check_lane_claim.py 19374 aurait rendu un blocage avant la première édition.

Décision du coordinateur : #19385 garde le grain, cette PR est à fermer par sa lane. Un seul organe de la classe EOL doit exister, et c'est #19385 qui le porte.

Ce que cette PR apporte et que #19385 n'a pas encore, c'est le fichier de tests (13 tests). Je demande à la lane de #19385 d'ajouter ses propres tests, et elle peut reprendre ceux-ci en le créditant.

@jsboige

jsboige commented Oct 5, 2026

Copy link
Copy Markdown
Owner Author

Closing per ai-01 dispatch (DM ai01-po2023c2-file-suite-20261006, 06/10 01:16Z).

ai-01 lane claim on #19374 etait anterieure (21:35Z, PR #19385 ouverte 22:40Z). Ma PR #19388 ouverte 22:56Z avec claim pose apres coup -- check_lane_claim.py 19374 m'aurait arrete avant la premiere edition si j'avais verifie (Tell c.12751, c.898 collision guard). Decision ai-01 : #19385 garde le grain.

Travail preserve : 13 tests offline (4 parsing, 7 decision matrix, 2 integration) + script scripts/ci/check_eol_blob_attribute.py (267 lignes) + TRANCHE18 dans fast_lane_registry.py (60 lignes). La lane soeur peut cherry-pick le commit 7542ae4ea6 (sur la branche fix/19374-crlf-eol-guard, fix/19374-crlf-eol-guard HEAD distincte du main) ou reprendre les tests en creditant la lane.

Recyclage worktree : D:/Dev/CoursIA-c1066-19374 (branche fix/19374-crlf-eol-guard) sera recycle apres close, conformement a la precision user du 06/10 00:10 locale : PR OPEN -> ne pas recycler, PR MERGED/CLOSED -> worktree jetable tout de suite.

Grain: LIGHT/guard (annule par cette close) -- lane myia-po-2023:CoursIA-2

See #19388 #19385 #19374 #19373 #19287

Co-Authored-By: Claude Haiku 4.5 (1M context) noreply@anthropic.com

@jsboige jsboige closed this Oct 5, 2026
jsboige added a commit that referenced this pull request Oct 5, 2026
Le review 5421649286 du coordinateur a releve 3 points :
- la matrice etait in-line dans main() -> pas testable hors subprocess
- pas de tests sur le controle positif (blob mixte), -text, ou
  i/crlf sans attribut
- tag `Grain:` absent du body, et l'enumeration fermee exige
  `guard` ou `tooling` (le body disait `MED/ci`, hors liste)

Refactor :
- expose BAD_INDEX = ("crlf", "mixed"), LF_ATTRS = ("text", "lf")
- expose EOL_LINE_RE pour le parsing des lignes `git ls-files --eol`
- extrait _classify(i_attr, attr) -> bool, matrice pure testable
- extrait _parse_ls_files_line(line) -> (i_attr, attr, path) | None
- main() utilise les helpers, comportement identique (rouge/vert
  et messages preserves a l'octet)

Tests `scripts/tests/test_check_eol_blobs.py` :
- 4 cas parsing (typical, attr vide, garbage, espaces dans path)
- 7 cas matrice de decision (lf/crlf/mixed x text/crlf/-text/empty/lf)
- 1 cas pas-de-changements -> exit 0/2
- 1 cas blob CRLF declare -> la garde NE rougit PAS (attr vide,
  contrat non-claim -> hors du filet)
- 14/14 passent localement (Python 3.14.3)

Le precedent PR #19388 (sa lane) portait des equivalents autour de
`BAD_INDEX = "crlf"` string simple ; les 13 tests fondateurs sont
recredites ici via la structure de la suite (importlib spec, BAD_INDEX
constante, matrice i_attr x attr). La forme du module est ici adaptee
au refactor en tuple + helpers, pas recopiee.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 6, 2026
Le review 5421649286 du coordinateur a releve 3 points :
- la matrice etait in-line dans main() -> pas testable hors subprocess
- pas de tests sur le controle positif (blob mixte), -text, ou
  i/crlf sans attribut
- tag `Grain:` absent du body, et l'enumeration fermee exige
  `guard` ou `tooling` (le body disait `MED/ci`, hors liste)

Refactor :
- expose BAD_INDEX = ("crlf", "mixed"), LF_ATTRS = ("text", "lf")
- expose EOL_LINE_RE pour le parsing des lignes `git ls-files --eol`
- extrait _classify(i_attr, attr) -> bool, matrice pure testable
- extrait _parse_ls_files_line(line) -> (i_attr, attr, path) | None
- main() utilise les helpers, comportement identique (rouge/vert
  et messages preserves a l'octet)

Tests `scripts/tests/test_check_eol_blobs.py` :
- 4 cas parsing (typical, attr vide, garbage, espaces dans path)
- 7 cas matrice de decision (lf/crlf/mixed x text/crlf/-text/empty/lf)
- 1 cas pas-de-changements -> exit 0/2
- 1 cas blob CRLF declare -> la garde NE rougit PAS (attr vide,
  contrat non-claim -> hors du filet)
- 14/14 passent localement (Python 3.14.3)

Le precedent PR #19388 (sa lane) portait des equivalents autour de
`BAD_INDEX = "crlf"` string simple ; les 13 tests fondateurs sont
recredites ici via la structure de la suite (importlib spec, BAD_INDEX
constante, matrice i_attr x attr). La forme du module est ici adaptee
au refactor en tuple + helpers, pas recopiee.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
myia-ai-01 added a commit that referenced this pull request Oct 8, 2026
… de #19287) (#19385)

* ci(#19374): garde contre les blobs CRLF ou mixtes sous eol=lf (classe de #19287)

Issue #19374 : depuis #19287 (merge 7 fichiers EPITA, dont 2 CRLF chez
l'amont sortis en blob mixte), `merge_ready` a refuse tous ses tours de
18:16Z a 21:10Z. Le correctif ponctuel est #19373 (`git add
--renormalize`). Cette garde empeche la prochaine de la classe.

Detection : `git diff --name-only --diff-filter=AM origin/main...HEAD`
puis `git ls-files --eol -- <path>` par chemin, awk-equivalent en
Python. Un fichier AM est rouge si `i/crlf` ou `i/mixed` ET
`eol_attr != eol=crlf` (donc `eol=lf` par defaut). Un blob CRLF voulu
(.bat, fixture) se declare par `eol=crlf` ou `-text` dans
`.gitattributes`, jamais par exemption.

Sortie de rouge : nom de fichier + commande de reparation
`git add --renormalize <fichier>`.

Cablage : TRANCHE17 dans `scripts/ci/fast_lane_registry.py`,
absorbed=True implicite par la convention TRANCHE17. Aucun workflow
d'origine (FAST_LANE_NATIVE), source = `scripts/ci/check_eol_blobs.py`.

Acceptance #19374 :
- rougit sur le blob mixte de #19287 (controle positif, verifie
  localement en injectant le blob via `git hash-object -w` puis
  `git update-index --cacheinfo`, le `core.autocrlf` global empechant
  `git add` de garder un blob CRLF)
- vert sur main apres reset (le test commit est revenu, le merge
  reste sur main)
- message de rouge nomme le fichier et la commande de reparation
- mesure main : `git ls-files --eol | awk '($1=="i/crlf"||$1=="i/mixed")
  && /eol=lf/'` rend 0 ligne

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* test(#19374): extrait la matrice de decision + 14 tests unitaires

Le review 5421649286 du coordinateur a releve 3 points :
- la matrice etait in-line dans main() -> pas testable hors subprocess
- pas de tests sur le controle positif (blob mixte), -text, ou
  i/crlf sans attribut
- tag `Grain:` absent du body, et l'enumeration fermee exige
  `guard` ou `tooling` (le body disait `MED/ci`, hors liste)

Refactor :
- expose BAD_INDEX = ("crlf", "mixed"), LF_ATTRS = ("text", "lf")
- expose EOL_LINE_RE pour le parsing des lignes `git ls-files --eol`
- extrait _classify(i_attr, attr) -> bool, matrice pure testable
- extrait _parse_ls_files_line(line) -> (i_attr, attr, path) | None
- main() utilise les helpers, comportement identique (rouge/vert
  et messages preserves a l'octet)

Tests `scripts/tests/test_check_eol_blobs.py` :
- 4 cas parsing (typical, attr vide, garbage, espaces dans path)
- 7 cas matrice de decision (lf/crlf/mixed x text/crlf/-text/empty/lf)
- 1 cas pas-de-changements -> exit 0/2
- 1 cas blob CRLF declare -> la garde NE rougit PAS (attr vide,
  contrat non-claim -> hors du filet)
- 14/14 passent localement (Python 3.14.3)

Le precedent PR #19388 (sa lane) portait des equivalents autour de
`BAD_INDEX = "crlf"` string simple ; les 13 tests fondateurs sont
recredites ici via la structure de la suite (importlib spec, BAD_INDEX
constante, matrice i_attr x attr). La forme du module est ici adaptee
au refactor en tuple + helpers, pas recopiee.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(ci,#19385): eol-blob-guard isole en TRANCHE18 + absorbed=True

Diagnostic : Scripts Tests (CPU) sur #19385 rougit sur 3 tests qui ne
sont pas environnement (cf. xdist PRE-EXISTING du c.186) :

  - test_aucun_garde_bloquant_n_est_inert_sans_declaration
    -> ['eol-blob-guard'] en inertes (blocking=True sans absorbed ni shadow_reason)
  - test_tranche17_enregistree_avec_contrat (TRANCHE17: assert 2 == 1)
  - test_tranche16_enregistree_avec_contrat (TRANCHE16: assert 2 == 1)

Cause : le garde eol-blob-guard (#19374) a ete ajoute a la main dans
TRANCHE16 et TRANCHE17, duplique deux fois. La forme canonique est une
TRANCHE dediee (TRANCHE18, deja referencee dans le commit 7542ae4).

Correctif :
  1. Retrait des deux occurrences (TRANCHE16 fin + TRANCHE17 fin).
  2. Nouvelle TRANCHE18 avec le seul eol-blob-guard + absorbed=True
     (meme convention que twin-parity-guard TRANCHE17 et
     control-chars-in-cells-guard TRANCHE16, le garde n'a pas de
     workflow d'origine -- fast_lane.py --shadow est son seul emetteur).
  3. fast_lane.py importe TRANCHE18 et concatene la liste.

Verification : `pytest scripts/tests/test_fast_lane.py
scripts/tests/test_check_control_chars_in_cells.py
scripts/translation/tests/  scripts/tests/test_check_eol_blobs.py`
-> 508 passed, 2 skipped (vert).

Effet sur les PRs rouges : #19385 Scripts Tests (CPU) devrait passer le
rouge reel (les 3 tests reussissent localement) et ne plus depender du
xdist pour le masquer. PR gate aggregator c.85 stale devrait suivre au
prochain sweep.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* test(eol,#19385): ajouter test rc==1 fondateur, regex accepte w/ vide

Revue ai-01 (CHANGES_REQUESTED, point 2) : les deux tests
d'integration 'control positif -> exit 1' etaient muets, parce que :
  1. aucun ne cree origin/main, donc 'git diff origin/main...HEAD'
     echoue, la garde sort en rc 2, et les deux tests acceptent rc 2
     comme 'vert implicite' ;
  2. le test dit 'controle positif' dans la docstring mais n'assert
     rien sur rc -- son seul assert est 'rc != 1', qui passe en rc 0
     et en rc 2.

Fix :
  - renomme le test precedent en test_main_no_origin_main_returns_two_or_zero
    et corrige la docstring ('attr vide -> la garde ne rougit pas',
    pas 'controle positif -> exit 1') ;
  - ajoute test_main_mixed_blob_flagged_rc1 : commit base avec
    '.gitattributes' declarant mixed.txt text eol=lf, pose
    'git update-ref refs/remotes/origin/main <base_sha>' pour
    rendre la sonde reellement fonctionnelle, commit head avec
    mixed.txt en blob mixte (force par 'git hash-object -w
    --no-filters' pour bypasser la renormalisation .gitattributes),
    assert 'returncode == 1' (rc 2 fait echouer le test), assert
    'mixed.txt' et 'renormalize' dans la sortie.

Le test faisait sortir le regex EOL_LINE_RE en None : 'w/(?P<w_attr>\w+)'
n'acceptait pas un w/ vide ou avec espaces, comme c'est le cas quand
git rend 'i/mixed w/      attr/text eol=lf' (worktree pas encore
checkout). Remplace \w+ par \S+ / \S* sur les champs concernes :
i_attr en \S+ (word), w_attr en \S* (peut etre vide).

15/15 tests verts (avant : 14, avec 1 test rename + 1 test neuf).

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Co-authored-by: ai-01 <ai-01@anthropic.com>
Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.com>
myia-ai-01 added a commit that referenced this pull request Oct 9, 2026
…anche 1 refs anchoring (#19331)

* docs(gametheory,#19263): Handbook of Computational Social Choice - tranche 1 refs anchoring

Tranche 1 du ticket #19263 : ancrage bibliographique du Handbook de Computational
Social Choice (Brandt-Conitzer-Endriss-Lang-Procaccia 2016, CUP, ISBN 978-1-107-06043-2)
dans la sous-serie SocialChoice/, au chapitre pres.

- README SocialChoice/ : entree dans la table Ressources avec chemin biblio cluster
- SC-01 (Arrow) : ancrage ch. 1-2 (impossibilites, fonction de choix social)
- SC-03 (Voting Methods) : ancrage ch. 2 (Zwicker, regles polynomiales) + mention
  explicite du trou conceptuel (Kemeny/ranked pairs/Dodgson, grain d'extension)
- SC-04 (SAT/Z3) : ancrage ch. 6 (computational barriers, encodage SAT/Z3 des
  theoremes d'impossibilite)
- SC-05 (Gibbard-Satterthwaite) : nouvelle section References bibliographiques
  avec Gibbard 1973 + Satterthwaite 1975 + ancrage ch. 6

Critere d'acceptation verifie : `git grep -icE "Handbook of Computational Social
Choice" MyIA.AI.Notebooks/GameTheory/` rend 5 (README + 4 carnets).

L'ouvrage est deja dans la biblio cluster (G:\Mon Drive\...\Handbook of
Computational Social Choice.pdf) ; aucun PDF n'est committe dans le repo public
(voir CLAUDE.md section Secrets + bibliography-hygiene.md).

Tranche 2 (implementation Kemeny + ranked pairs + Dodgson) reportee a un futur
cycle -- le claim #19263 reste actif avec paths: scope limite a la presente
tranche (README + 0*.ipynb).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(twin-parity,#19331): rebaseline 3 paires SocialChoice post-Handbook refs

3 paires en DRIFT_INTRODUCED par la PR #19331 (Handbook tranche 1) :
- SocialChoice-1 Arrow-Impossibility
- SocialChoice-3 Voting-Methods
- SocialChoice-4 Computational-Aggregation-SAT-Z3

Cause : PR #19331 a enrichi la cellule bibliographique de chaque carnet
Python d'une reference (Brandt, Conitzer, Endriss, Lang, Procaccia 2016,
Handbook of Computational Social Choice, Cambridge UP). Markdown-only
(C.2 exception), cellules code byte-identiques, execution_count et
outputs intacts. Cote C# inchange. Drift CONTENT unilateral cote Python.

Fix : rebaseline par script (--update --by myia-po-2023:CoursIA-2) sur
les 3 paires, avec entree known_differences expliquant l'edition. Le
python_sha avance, le csharp_sha reste inchange -- parite semantique
preservee sur les axes algorithmiques (preuve par exhaustion 216 profils,
encodage SAT, defs axiomatiques).

Verification : `python scripts/notebook_tools/check_twin_parity.py
--check --per-pair --base origin/main` rend INTRO=0 (152 OK + 5 PRE,
PRE handled by #8264). 43/43 tests offline PASS.

Grain: REPAIR/MED -- lane myia-po-2023:CoursIA-2 -- prev: LIGHT/guard #19388 (c.1066)

See #19331 #19263 #8057 #8264

* fix(gametheory,#19331): CR 5422568917 levee -- ch.6 (04) -> §1.4.5, Gibbard 1973 titre exact (05), ch.6 -> §6.2 (05)

CR ai-01 5422568917 signalait deux references inexactes verifiees contre le PDF
du Handbook archive au gisement GDrive. Corrections :

**Carnet 04 (Computational-Aggregation-SAT-Z3) cell 62** :
- Avant : 'Ancrage ch. 6 (computational barriers to manipulation) -- encodage
  SAT/Z3 des theoremes d'impossibilite... le meme encodage est employe pour
  l'analyse de la complexite des manipulations strategiques (ch. 6.3-6.5).'
- Apres : 'Ancrage §1.4.5 "Computer-Assisted Theorem Proving in Social Choice"
  (p. 14-15) -- encodage SAT/Z3 des theoremes d'impossibilite (Arrow, Sen)...
  Le ch. 6 ("Barriers to Manipulation in Voting", Conitzer et Walsh) traite
  la complexite comme barriere a la manipulation (cf. carnet 05).'
- Justification : le ch. 6 du Handbook est 'Barriers to Manipulation in Voting'
  (Conitzer et Walsh), pas l'encodage SAT/Z3 des theoremes d'impossibilite.
  L'encodage assiste par ordinateur releve du §1.4.5 (p. 14-15).

**Carnet 05 (Gibbard-Satterthwaite) cell 13** :
- Avant : 'Gibbard, A. (1973). Manipulation of Schemes that Mix Voting with
  Chance. Econometrica 41(4):587-601.'
- Apres : 'Gibbard, A. (1973). Manipulation of Voting Schemes: A General
  Result. Econometrica 41(4):587-601.'
- Justification : 'Manipulation of Schemes that Mix Voting with Chance' est
  l'article de 1977 (Econometrica 45(3):665-681), pas 1973. L'article de
  1973 s'intitule 'Manipulation of Voting Schemes: A General Result'.

**Carnet 05 (Gibbard-Satterthwaite) cell 13 -- ref Handbook** :
- Avant : 'Ancrage ch. 6 (computational social choice)'
- Apres : 'Ancrage ch. 6, §6.2 "Gibbard-Satterthwaite and Its Implications"
  (Conitzer et Walsh)'
- Justification : precision sur la section specifique du ch. 6 qui traite
  Gibbard-Satterthwaite.

**Pas de re-execution** : corrections markdown seules (le PR body le dit
explicitement, cellules markdown uniquement).

**Jumeaux** : 04-C# n'a pas de ref Handbook-Ancrage (verifie), 05-C# n'existe
pas. Pas de jumeau a mettre a jour.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(twin-parity,#19331): rebaseline SC-4 post-CR fix (audit 0021)

La CR 5422568917 (8bf1997) a re-modifie la cellule bibliographique
de SC-04 (4c6-anchor 2e round) ; le rebaseline 6dabe6b (audit 0020)
a ete depasse par ce commit. Re-atteste SC-4 avec le contenu actuel :
- python_sha 0f697fc
- content_python_sha 1796365cc7539f15d6649f818151f79fbef8a84b37eaad9baa491c687ab08bbd
- csharp_sha / csharp_content_sha inchange (jumeau C# non touche par la CR)

Drift introduit: 0 (base=OK head=OK)
Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.com>
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