Skip to content

fix(harvest): wait for cardpen global before use (Release/Pages race) - #402

Merged
jsboige merged 1 commit into
masterfrom
fix/harvest-cardpen-race
May 31, 2026
Merged

fix(harvest): wait for cardpen global before use (Release/Pages race)#402
jsboige merged 1 commit into
masterfrom
fix/harvest-cardpen-race

Conversation

@jsboige

@jsboige jsboige commented May 31, 2026

Copy link
Copy Markdown
Contributor

Problème

Lors d'une régénération Release (CardPen servi depuis GitHub Pages), le harvest plante avec ReferenceError: cardpen is not defined, ce qui bloque la régén release-grade (CMYK/PNG). En Debug (CardPen servi en local IIS) le pipeline fonctionne.

Diagnostic (vérifié, ai-01)

  • Le contenu GitHub Pages n'est PAS en cause. Vérifié en conditions réelles via Playwright sur https://argumentumgames.github.io/Argumentum/index.html : après chargement, cardpen est un objet complet (.form + .write présents), js/main.js répond HTTP 200 et s'exécute entièrement ; la seule erreur console est un favicon.ico 404 bénin.
  • La cause est une course au chargement dans HarvestManager. Le gate amont (HarvestManager.cs:374-393) n'attend que l'existence de l'élément iframe statique #cpOutput (présent dès le parsing du HTML), pas la définition du global cardpen — défini par main.js, le dernier script de la page. Puis HarvestManager.cs:483 appelle cardpen.form.set(...) sans garde d'existence.
  • En local IIS (Debug) la latence ~0 masque la course ; servi depuis Pages (Release), la latence CDN peut faire partir l'appel avant l'exécution de main.jsReferenceError. Comportement intermittent cohérent avec un échec de course.

Correctif

Ajout d'un page.WaitForFunctionAsync("() => typeof cardpen !== 'undefined' && cardpen.form && cardpen.write") avant le premier usage de cardpen (HarvestManager.cs:483). Défensif, source-agnostique (IIS local ou Pages distant), timeout 120s aligné sur les autres attentes du fichier. Aucune régression de comportement en Debug (où la garde est satisfaite immédiatement).

Validation

  • dotnet build : 0 erreur.
  • dotnet test : 120 réussis / 0 échec / 5 ignorés.
  • Validation finale = régén Release par po-2023 (seule machine lançant la régén Release ; ai-01 ne lance pas de régén Release localement). La garde élimine la course de façon déterministe ; à confirmer que le crash cardpen is not defined a disparu sur un run Release complet.

Notes

🤖 Generated with Claude Code

The harvest pre-generation gate only polled for the static #cpOutput
iframe element to exist, not for the `cardpen` global (defined by
main.js, the last script on the CardPen page) to be ready. Local IIS
(Debug) has ~0 latency so the race is never lost; served from GitHub
Pages (Release), CDN latency can let the first `cardpen.form.set` call
fire before main.js executed -> "ReferenceError: cardpen is not defined",
which blocked release-grade (CMYK/PNG) regeneration.

Add an explicit page.WaitForFunctionAsync that cardpen.form and
cardpen.write are present before the first use. Defensive and
source-agnostic (local IIS or remote Pages).

Verified live Pages serves a fully functional CardPen (cardpen object
with .form/.write after load; main.js HTTP 200; only console error is a
benign favicon 404), so the defect was the harvest load-race, not the
Pages content.

Build green, 120/0 tests pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jsboige
jsboige merged commit 0f98680 into master May 31, 2026
3 checks passed
@jsboige
jsboige deleted the fix/harvest-cardpen-race branch May 31, 2026 13:12
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.

1 participant