Skip to content

Add durable notification recovery and real mail workflow E2E - #41

Draft
xuewill wants to merge 3 commits into
mainfrom
codex/development-roadmap
Draft

xuewill wants to merge 3 commits into
mainfrom
codex/development-roadmap

Conversation

@xuewill

@xuewill xuewill commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Inbound mail could be stored before notification delivery finished, leaving notifications unrecoverable after a Worker interruption. Mail metadata and notification intents now commit together in D1; bounded leased tasks recover through minute-level scheduling, preserve stable event IDs, retry transient failures, and clean up retained payloads with their source mail.

Webhook and Telegram settings expose task status and replay, system settings show administrator aggregates, and notification rules support explicit timezones and explainable dry-runs. Legacy UTC rules and generic webhook replay remain compatible. Chat-platform acknowledgements, canonical replay payloads, modal cleanup, and clipboard feedback lifecycle are also corrected. The homepage demonstrates extraction and avoids unmeasured deployment-time claims.

An isolated business E2E runner connects production routes, inbound processing, local D1/R2, and the browser without API mocks. External providers use controlled adapters; real provider validation remains a staging release gate.

Validation:

  • All four workspaces pass lint, typecheck, tests, and build: shared 30, Worker 220, Web 339 tests, plus Docs assertions.
  • Browser smoke: 13 passed, 2 existing opt-in visual scaffolds skipped.
  • Real local business E2E: 7 passed, including notification UI replay, rule explanations, automatic recovery, permissions, quotas, deduplication, HTML, and attachments; desktop and 375px mobile layouts checked.
  • Version metadata, API catalog, migration numbering, and deployment preflight pass.

Deployment: apply D1 migrations 0024–0026. Keep both the minute notification-recovery cron and the hourly mail-retention cron. The changes are additive; version remains 0.4.0 until a release is cut.

Why: the landing page described the product (82 text nodes, zero product
imagery) instead of demonstrating it. The hero CTA 立即开始 led straight
into the invite-code wall, open-source/self-host positioning was absent
from the first screen, and the page presented config defaults (a 20/day
send limit) as key metrics alongside fabricated testimonials — trust
risks for an open-source project.

Constraints / tradeoffs:
- Hero becomes a two-column composition: copy (OSS pills 开源/自托管/
  Cloudflare 边缘, serif headline with the rotating word now in brand
  orange, honest CTAs 申请邀请 + 自托管部署 → hosted docs) beside an
  auto-playing inbox demo card (mail arrives → code chip extracts →
  copy state), replacing the abstract 634px orb.
- The stats marquee (config defaults) is replaced by an extraction
  playground: a textarea where pasted text is processed by the REAL
  buildMessageExtraction from @wemail/shared client-side — the same pure
  function the Worker runs. Verified live: re-extraction on input,
  Chinese codes, price/date rejection.
- Demo steps are JS-timed with a reducedMotion prop that skips to the
  final frame; a blanket prefers-reduced-motion CSS guard now covers
  every landing animation (previously 1 guard in 2430 lines).
- Metrics now show verifiable facts (500+ tests, 5-min self-host,
  300+ edge locations, 100% open source); testimonials relabeled
  场景示例 with workflow scenarios, no invented personas.
- Hero headline scales from 10rem editorial display to a column-fitting
  clamp so copy + demo + playground land above the fold.

Verification:
- Full matrix: lint 0, typecheck 0, 532 tests (30+169+333), Playwright
  E2E at baseline parity (landing smoke green).
- Runtime browser verification at 1440 and 390: two-column layout
  renders, playground live-extracts typed input (991177 extracted,
  39.90 rejected), no horizontal overflow, demo steps advance, orb and
  marquee confirmed removed.
- Landing test updated to the new CTA contract and extended with
  playground/demo-region assertions.

Risks: hero visual identity shifts from centered editorial to split
layout; the serif display type and grid identity are retained.

Rejected alternatives: keeping the marquee with different numbers
(config values read as limits, not achievements); linking the secondary
CTA to the in-app /docs placeholder (it is a stub — hosted docs used
instead).
@vercel

vercel Bot commented Oct 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
we-mail-docs Ready Ready Preview Oct 6, 2026 4:04am UTC

This branch was successfully deployed

1 active deployment
Preview — eb83e65d Deployed Oct 6, 2026 by vercel[bot]
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