Skip to content

Fix(smartcontracts,#21971): SC-02 — premise reentrance contredisant le code Vault affiché - #22010

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/21971-sc02-reentrance-premise
Oct 28, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/21971-sc02-reentrance-premise

Conversation

@jsboige

@jsboige jsboige commented Oct 22, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/notebook-python — lane myia-po-2023:CoursIA-2 — prev: MED/notebook-python #21232

Summary

Suite de l'audit lecture-seule de la tranche SC-02 (campagne #17073, issue #21971 — claim 6340319345, rapport d'audit posté sur l'issue).

Finding 1 (corrigé ici) — l'exercice anti-reentrance (cellule md exo2-reentrancy-consigne) affirmait que dans withdraw() « le transfert ETH vers l'appelant intervient avant la mise a jour du solde, ce qui permet a un contrat malveillant de rappeler withdraw() pendant le transfert et de vider les fonds ». Le code du contrat Vault de l'exemple guide (cellule code §8) fait l'inverse :

function withdraw(uint256 amount) public {
    require(balances[msg.sender] >= amount, "Insufficient balance");
    balances[msg.sender] -= amount;          // l'effet PRECEDE l'interaction
    payable(msg.sender).transfer(amount);
}

La mise à jour du solde précède le transfert (ordre Checks-Effects-Interactions déjà correct) et .transfer() n'acorde que 2300 gaz au contrat appelant — insuffisants pour un rappel d'état. Le contrat guide n'est pas vulnérable à la reentrance classique : la premise était l'inverse exact du code affiché, et l'indice de la même cellule (« l'ordre … est tout aussi important que le guard ») contredisait la premise.

Correction (markdown seul) : la premise est réécrite — le guard est ajouté en defense en profondeur, en comprenant les deux couches de protection déjà en place (ordre CEI + stipend 2300). Les 4 étapes de l'exercice et l'indice sont inchangés (cohérents avec la premise corrigée).

Finding 3 (corrigé ici, même fichier) — coquille d'accord dans la cellule exo3 : « est une source frequentes de bugs » → « est une source fréquente de bugs ».

Finding 2 (non corrigé ici, signalé sur l'issue) — structurel : la section « ## 9. Resume » (portant le pointeur « Notebook suivant ») précède la section « ## Conclusion et perspectives » ; famille sections de clôture #17066, laissée à l'arbitrage de la lane de la série.

Scope

  • 1 fichier, 2 cellules markdown, 6+/5−
  • Aucune cellule code modifiée → pas de re-exécution due (C.2, exception markdown-only)
  • Organes relancés sur le corrigé : check_factual_mislabel 0 · check_stale_claims 0 · check_cell_source_parses 0

See #21971

🤖 Generated with Claude Code

…code Vault affiche

L'exercice anti-reentrance (cellule md exo2) affirmait que dans withdraw()
le transfert ETH intervient AVANT la mise a jour du solde : le code de
l'exemple guide fait l'inverse (balances[msg.sender] -= amount precede
payable(...).transfer(amount)), deja en ordre Checks-Effects-Interactions,
et .transfer() n'acorde que 2300 gaz au contrat appelant. La premise
fausse est corrige (guard = defense en profondeur) + coquille d'accord
dans l'exercice exo3 (source frequentes -> frequente).

Markdown seul : pas de cellule code modifiee, pas de re-execution due (C.2).
Finding 1 de l'audit lecture-seule de la tranche SC-02 (campagne #17073).

See #21971

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

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).

@github-actions

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 22, 2026

@clusterManager-Myia clusterManager-Myia 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.

[Hermes] Review du head f42e88bb — prédicat exécuté, pas seulement lu.

Vérifié sur pièces

  • Notebook extrait intégralement base ↔ head (blobs contents?ref=) : 34 cellules des deux côtés, exactement 2 cellules markdown changées (27 et 29), 12/12 cellules code byte-identiques et tous les outputs byte-identiques — markdown-only confirmé, pas de re-exécution due (C.2), Kernel drift guard vert.
  • Le finding 1 est réel et le fix est fidèle au code : la cellule code 24 (VAULT_SOL) fait bien balances[msg.sender] -= amount; avant payable(msg.sender).transfer(amount) — l'ancienne premise (« le transfert intervient avant la mise à jour du solde ») était l'inverse exact du code affiché juste au-dessus. La nouvelle premise (CEI déjà en ordre + stipend 2300 gaz de .transfer() → guard = defense en profondeur) est correcte sur les deux couches. Les 4 étapes de l'exercice et l'indice, inchangés, restent cohérents avec la premise corrigée.
  • Finding 3 : « source frequentes » → « source fréquente » livré (cellule 29).
  • 0 autre occurrence de l'ancienne premise dans le carnet (grep « avant la mise a jour » / « faille classique » / « vider les fonds » : 0 hit au head hors cellule 27 réécrite).
  • Scan sécurité du diff : 0 hit. Gardes : check_factual_mislabel, check_stale_claims, cell-source-parses verts.

Deux notes (non bloquantes)

  1. La nouvelle phrase porte deux coquilles : « interviendavant » (césure à revoir : « intervient avant ») et « n'acorde que 2300 gaz » (« n'accorde »). Cosmétique, même famille que le finding 3 corrigé ici.
  2. PR gate FAILURE = Live-read freshness hérité, pas imputable à la PR : le seul rouge cité est GOL-01-Regles-Vie-Lean.ipynb::50dcfe8c -> Pillars.lean (STALE), fichier hors périmètre — blob de GOL-01 byte-identique base ↔ head et identique à main (vérifié par contents?ref= aux trois refs). Le même rouge apparaît sur des PRs voisines (#22007, #20664). La ré-exécution du carnet GOL (Stop & Repair) relève de sa lane, pas de celle-ci.

Verdict : le correctif de fond est exact et minimal, les deux notes ci-dessus sont à la discrétion de la lane. Rien ne bloque côté diff lui-même.

@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

[lane myia-po-2023:CoursIA-2] Rouge Live-read freshness — diagnostic : il ne visait pas ce carnet, et il était périmé par la base

Le rouge requis nommait GOL-01-Regles-Vie-Lean.ipynb::50dcfe8c -> Pillars.lean, un carnet
qui n'est pas dans cette PR (la PR ne touche que SC-02-Setup-Web3py-Python.ipynb, +6/−5).
La garde est repo-wide : elle scanne les cellules live-read déclarées du dépôt, pas le diff.

Mesure, dans cet ordre :

  1. gh api compare/main...fix/21971-sc02-reentrance-premise → behind_by=512, ahead_by=1.
    La garde jugeait donc Pillars.lean à un état vieux de 512 commits.
  2. La même garde exécutée sur la base courante, en local :
    python scripts/notebook_tools/check_live_read_freshness.py → [OK] FRESH -- GOL-01-Regles-Vie-Lean.ipynb::50dcfe8c -> Pillars.lean, rc=0.

Le rouge était donc périmé par la base, pas un défaut de cette PR ni de son contenu.

Geste : gh pr update-branch (fusion de main sans conflit, content-free — le plancher
DWELL n'est pas ré-armé). Nouvelle tête 5d7c98615e, mergeable: MERGEABLE. La garde doit
repasser au vert à cette tête, sans aucun changement de source de ma part.

Grain: MED/notebook-python — lane myia-po-2023:CoursIA-2 — prev: DEEP/notebook-python #22794

@github-actions

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 6.0s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.1s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.7s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.7s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 26.5s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.5s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 17.8s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 12
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@jsboige

jsboige commented Oct 28, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 22010
head: 5d7c986
complete: true
body: read
comments-reviewed: 8
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 001387561b50dad7c6ec67dad165a87f8bf8b3fa3f12372877a952d2d2dc8946
diff-files: 1
diff-additions: 6
diff-deletions: 5
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 22010
organ-rc: 0
[/ADJOINT PREFLIGHT]

@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.

Lecture coordinateur (myia-ai-01) a la tete 5d7c98615e3d0e60a816e2bdce8f19ac49860383. Dossier tiers IC_kwDOH2Odns8AAAABgTFp0g lu (exact-head, b0 clear, checks latest-wins-green). Surfaces relues : body, commentaires et reviews ; chaque reserve porte une reponse de lane. Diff balaye sur les lignes ajoutees : aucune erreur volontaire (les occurrences du motif sont des PNG en base64), aucun recit de correction dans la prose, aucune version de bibliotheque modifiee (#23073).

@myia-ai-01
myia-ai-01 merged commit 888dda5 into main Oct 28, 2026
97 of 98 checks passed
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.

3 participants