← All notes

Keep a demo safe before its scripts are ready

A real loading race in the engineering demos led to disabled-by-default controls, versioned assets and delayed-script checks.

Basis of this note

Based on the 28 October engineering-demo release and its public browser checks. The loading issue and fix were observed in that release; this article was compiled on 29 October.

HTML can be interactive before the handler exists

During the initial live check, the production form submitted a normal GET navigation before its application handler was attached. The sample button appeared clickable but had no working listener yet. Local file hashes were correct; they could not detect this interaction timing problem.

The repair wraps the workbench controls in a disabled fieldset. The application enables it only after attaching the workflow listeners. A loading message explains the waiting state and offers refresh if it remains.

Make readiness part of the markup

This pattern works before JavaScript runs because disabled is native HTML behavior. It is especially useful for forms whose browser default submission is not meaningful. The demo also hides the interactive workbench in a noscript fallback while keeping method notes readable.

HTML / JavaScript
<fieldset class="ops-loading-guard" disabled>
  <!-- Interactive form controls -->
</fieldset>

// At the end of successful application initialization:
document.querySelector(".ops-loading-guard").disabled = false;

Keep text legible while it moves

Early entry effects animated opacity and briefly reduced text contrast. The final effect moves panels and records a few pixels without fading their text. Progress animation follows workflow state, and a reduced-motion setting removes motion while keeping the status updates.

Contrast tests wait for theme transitions to settle. That removes timing noise from the measurement; it does not excuse unreadable final colors. Motion and keyboard checks remain separate concerns.

Test the path through the published page

The recorded release passed 34 flow assertions, 21 integration assertions and 16 language/viewport combinations. Integration includes deliberately delaying app.js and checking that controls remain disabled until initialization. The live walkthrough then completed both workflows from the homepage.

These are the 28 October results linked below, not new backend benchmarks. A useful next extension is to block an asset entirely, confirm that the loading explanation remains usable, then test recovery after a refresh.

Sources & further reading

Compiled from code and documents, with AI-assisted drafting and translation. Examples and proposed checks are learning material; only linked evidence establishes what was run.