Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions .github/workflows/e2e-live.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,10 @@ name: E2E — live render (Sandpack bundler)
# the deployed app directly. `ai: true` adds the LLM answer checks;
# `pkg_pr_new_ref` boots one container at a pkg.pr.new build (DEV-2198
# validation days).
# - schedule — the weekly prod canary (Mon 05:00 UTC), deployed mode with AI
# on. Deploy-time breakage is caught by the post-deploy smoke below; the
# canary exists for external drift — the hosted bundler, npm, the broker,
# docs-bucket rot — which moves on week-scale. Daily would burn container
# hours and turn every bundler blip into a triage.
# - schedule — the nightly prod canary (03:00 UTC, after the 01:00 starter
# matrix). Deploy-time breakage is caught by the post-deploy smoke below;
# the canary catches external drift — the hosted bundler, npm, the broker,
# docs-bucket rot — and, at Dan's call, runs every live-gated test nightly.
# - workflow_call with `smoke: true` — the post-deploy subset both deploy
# workflows invoke: `--grep @smoke`, one container, a few minutes.
#
Expand Down
9 changes: 8 additions & 1 deletion runner/e2e/preview-recovery.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,14 @@ test("live: breaking and un-breaking a line leaves the grid alone", async ({ pag
const at = doc.indexOf("'Company name'") + 1;
view.dispatch({ changes: { from: at, to: at + "Company name".length, insert: "Sentinel column" } });
})()`);
await expect(preview.getByText("Sentinel column")).toBeVisible({ timeout: 60_000 });
// Handsontable renders a column header more than once — the master table
// plus overlay clones, and at least one copy is a hidden internal render —
// so a bare getByText is a strict-mode violation the moment the rename
// actually lands, and a positional .first() can pin the hidden copy. Filter
// to the visible instance (first live run of this rework, DEV-2203).
await expect(
preview.getByText("Sentinel column").filter({ visible: true }).first(),
).toBeVisible({ timeout: 60_000 });

// The grid never left, the status never left ready — and, the discriminating bit,
// the preview document was never reset behind our back.
Expand Down
Loading