You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Use one Berlin business date in #106 scheduling and default-SPA E2E
Status: code/reviews/checks complete on main; sandbox acceptance is blocked on successful normal CI deployment by #136 pending #143 ownership remediation; #140 is complete and #141 is not a blocker
Tags: bug, testing, frontend, P1
Depends on: #140 completed; successful normal CI deployment after #136, which awaits #143 ownership remediation
Blocks: None — #128 uses the shipped repair; #134 awaits the same normal deployment
Next owner: On-Call after #136 clears
Resume condition: sanitized On-Call evidence that normal main CI/CD terminally succeeds with the accepted #134 repair and completes relevant deployed smoke
Context: first cancelled #128 workflow; second failed pre-deploy workflow
Scope
Keep the accepted production correction and finish the missed default-SPA test migration exposed across the Jul 30 → 31 Europe/Berlin boundary.
Accepted production UX: freshly-started workflows show all-red at t=0 — add scheduled/not-started state + richer bundle cards #106 correction.backend/src/public/app.js now uses one explicit Europe/Berlin business-calendar formatter for app “today” and bundle.createdAt scheduling comparisons. At Berlin 00:xx while UTC is still on the prior day, all nine pre-creation Newsletter tasks remain Scheduled rather than one leaking into due/overdue risk. Preserve this behavior.
Accepted original E2E correction.backend/e2e/bundle-detail.spec.js and backend/e2e/home-dashboard.spec.js use the shared Berlin helper, timezone, and fixed midnight-boundary clock. Preserve this coverage.
Required comprehensive repair. Six other default-SPA specs still derive UI-facing “today” or offsets from the Node runner local/UTC calendar and can disagree with the production Berlin date:
backend/e2e/accessibility.spec.js
backend/e2e/follow-up-actions.spec.js
backend/e2e/intake-inbox.spec.js
backend/e2e/operations-smoke.spec.js
backend/e2e/task-list.spec.js
backend/e2e/template-editor.spec.js
Migrate those six specs to backend/e2e/helpers/business-date.js. Where an assertion depends on the UI meaning of “today”, install the explicit Europe/Berlin browser timezone and a fixed clock before deriving fixtures, navigating, or asserting. Use the canonical boundary 2026-07-30T22:30:00.000Z (UTC Jul 30, Berlin Jul 31), or an equivalently frozen 23:xx UTC/Jul 31 Berlin instant when a scenario requires it. Do not add sleeps, retries, skipped assertions, or duplicate local date helpers.
Acceptance Criteria
The frontend has one explicit Europe/Berlin business-calendar date formatter for instants; app “today” and bundle.createdAt scheduling comparisons use that same formatter.
taskIsScheduled compares a template task’s date-only value with the bundle creation calendar date in Europe/Berlin, without truncating the creation timestamp to its UTC ISO date. Invalid task/bundle dates remain fail-safe.
The original focused regression explicitly exercises the UTC/Europe-Berlin date divergence and both specs pass with retries disabled, not as flaky retry recoveries.
All six newly affected default-SPA specs use the shared Berlin business-date/offset helpers for UI-facing current dates; none retains a runner-local or UTC helper for expectations about the production UI “today”.
Every migrated scenario whose UI expectation depends on “today” freezes the browser clock and sets timezoneId: Europe/Berlin before fixture derivation/navigation, so API fixtures and browser output share one date.
Deterministic boundary assertions prove the chosen instant is UTC Jul 30 and Berlin Jul 31; task-list seeds rows for the date the UI opens, and template-editor produces the Berlin-dated default title.
template-editor.spec.js and task-list.spec.js pass together with --retries=0.
All six affected default-SPA specs pass together with --retries=0, with no skipped or flaky recovery.
An automated static audit of default-SPA specs rejects ad hoc runner-local “today” helpers/live date derivation for UI-current-date expectations. Deliberate UTC API specs are explicitly excluded and remain unchanged.
CI=true npm --prefix backend run test:e2e passes 352/352 with exit code 0 and zero retry/flaky results.
Scenario: Task list opens on the seeded Berlin day
Given: the browser clock is fixed at the UTC-Jul-30/Berlin-Jul-31 boundary
When: task-list scenarios seed work for “today” and open the default task route
Then: the route and fixtures both use Jul 31 and every expected task row is present on the first attempt.
Scenario: Template title uses Berlin today
Given: the same fixed boundary
When: the template editor creates its default generated title
Then: the suffix is the Berlin date Jul 31, not the runner/UTC date Jul 30.
Scenario: Remaining default-SPA specs share the calendar
Given: accessibility, follow-up-actions, intake-inbox, and operations-smoke contain UI-facing current-date fixtures
When: they run at the fixed boundary
Then: their fixtures and browser expectations use the shared Berlin helper and pass without retry.
Scenario: Intentional UTC API coverage stays UTC
Given: an API spec deliberately validates UTC timestamp/date behavior rather than browser “today”
When: the default-SPA audit runs
Then: that documented API spec is excluded and its semantics remain unchanged.
Verification
Run from the repository root and record exit codes plus Playwright pass/flaky counts:
CI=true npm --prefix backend run test:e2e -- \
e2e/template-editor.spec.js e2e/task-list.spec.js --retries=0
CI=true npm --prefix backend run test:e2e -- \
e2e/accessibility.spec.js \
e2e/follow-up-actions.spec.js \
e2e/intake-inbox.spec.js \
e2e/operations-smoke.spec.js \
e2e/task-list.spec.js \
e2e/template-editor.spec.js --retries=0
CI=true npm --prefix backend run test:e2e
npm --prefix backend test
npm --prefix backend run typecheck
npm --prefix backend run build
git diff --check
Add a focused automated static/source audit covering the default-SPA spec inventory and the shared-helper rule. Screenshots are unnecessary unless rendering changes beyond corrected dates/counts; this repair must not redesign the UI.
Use one Berlin business date in #106 scheduling and default-SPA E2E
Status: code/reviews/checks complete on
main; sandbox acceptance is blocked on successful normal CI deployment by #136 pending #143 ownership remediation; #140 is complete and #141 is not a blockerTags:
bug,testing,frontend,P1Depends on: #140 completed; successful normal CI deployment after #136, which awaits #143 ownership remediation
Blocks: None — #128 uses the shipped repair; #134 awaits the same normal deployment
Next owner: On-Call after #136 clears
Resume condition: sanitized On-Call evidence that normal
mainCI/CD terminally succeeds with the accepted #134 repair and completes relevant deployed smokeContext: first cancelled #128 workflow; second failed pre-deploy workflow
Scope
Keep the accepted production correction and finish the missed default-SPA test migration exposed across the Jul 30 → 31 Europe/Berlin boundary.
backend/src/public/app.jsnow uses one explicit Europe/Berlin business-calendar formatter for app “today” andbundle.createdAtscheduling comparisons. At Berlin 00:xx while UTC is still on the prior day, all nine pre-creation Newsletter tasks remain Scheduled rather than one leaking into due/overdue risk. Preserve this behavior.backend/e2e/bundle-detail.spec.jsandbackend/e2e/home-dashboard.spec.jsuse the shared Berlin helper, timezone, and fixed midnight-boundary clock. Preserve this coverage.backend/e2e/accessibility.spec.jsbackend/e2e/follow-up-actions.spec.jsbackend/e2e/intake-inbox.spec.jsbackend/e2e/operations-smoke.spec.jsbackend/e2e/task-list.spec.jsbackend/e2e/template-editor.spec.jsMigrate those six specs to
backend/e2e/helpers/business-date.js. Where an assertion depends on the UI meaning of “today”, install the explicitEurope/Berlinbrowser timezone and a fixed clock before deriving fixtures, navigating, or asserting. Use the canonical boundary2026-07-30T22:30:00.000Z(UTC Jul 30, Berlin Jul 31), or an equivalently frozen 23:xx UTC/Jul 31 Berlin instant when a scenario requires it. Do not add sleeps, retries, skipped assertions, or duplicate local date helpers.Acceptance Criteria
bundle.createdAtscheduling comparisons use that same formatter.taskIsScheduledcompares a template task’s date-only value with the bundle creation calendar date in Europe/Berlin, without truncating the creation timestamp to its UTC ISO date. Invalid task/bundle dates remain fail-safe.bundle-detail.spec.jsandhome-dashboard.spec.jsinstall one deterministic clock/time zone before deriving, seeding, rendering, or asserting dates; API fixtures and browser expectations use the same Berlin calendar day.timezoneId: Europe/Berlinbefore fixture derivation/navigation, so API fixtures and browser output share one date.task-listseeds rows for the date the UI opens, andtemplate-editorproduces the Berlin-dated default title.template-editor.spec.jsandtask-list.spec.jspass together with--retries=0.--retries=0, with no skipped or flaky recovery.CI=true npm --prefix backend run test:e2epasses 352/352 with exit code 0 and zero retry/flaky results.mainCI/CD deployment completes successfully after Migrate Sponsor CRM GSIs in a protected stage-only workflow #136 clears, and On-Call records sanitized sandbox acceptance; no manual deployment substitutes for this gate.Test Scenarios
Scenario: Task list opens on the seeded Berlin day
Given: the browser clock is fixed at the UTC-Jul-30/Berlin-Jul-31 boundary
When: task-list scenarios seed work for “today” and open the default task route
Then: the route and fixtures both use Jul 31 and every expected task row is present on the first attempt.
Scenario: Template title uses Berlin today
Given: the same fixed boundary
When: the template editor creates its default generated title
Then: the suffix is the Berlin date Jul 31, not the runner/UTC date Jul 30.
Scenario: Remaining default-SPA specs share the calendar
Given: accessibility, follow-up-actions, intake-inbox, and operations-smoke contain UI-facing current-date fixtures
When: they run at the fixed boundary
Then: their fixtures and browser expectations use the shared Berlin helper and pass without retry.
Scenario: Intentional UTC API coverage stays UTC
Given: an API spec deliberately validates UTC timestamp/date behavior rather than browser “today”
When: the default-SPA audit runs
Then: that documented API spec is excluded and its semantics remain unchanged.
Verification
Run from the repository root and record exit codes plus Playwright pass/flaky counts:
CI=true npm --prefix backend run test:e2e -- \ e2e/template-editor.spec.js e2e/task-list.spec.js --retries=0 CI=true npm --prefix backend run test:e2e -- \ e2e/accessibility.spec.js \ e2e/follow-up-actions.spec.js \ e2e/intake-inbox.spec.js \ e2e/operations-smoke.spec.js \ e2e/task-list.spec.js \ e2e/template-editor.spec.js --retries=0 CI=true npm --prefix backend run test:e2e npm --prefix backend test npm --prefix backend run typecheck npm --prefix backend run build git diff --checkAdd a focused automated static/source audit covering the default-SPA spec inventory and the shared-helper rule. Screenshots are unnecessary unless rendering changes beyond corrected dates/counts; this repair must not redesign the UI.
Out of Scope
DateortoISOString()use.frontend/srcapplication local-time-versus-Berlin gap; capture/handle that independently rather than expanding this pre-deploy repair.DataTalksClub/dataops.