Skip to content

Honest generation wait-time copy + humanize em-dashes - #32

Merged
upgradedev merged 1 commit into
mainfrom
fix/humanize-copy-wait-time
Jul 27, 2026
Merged

Honest generation wait-time copy + humanize em-dashes#32
upgradedev merged 1 commit into
mainfrom
fix/humanize-copy-wait-time

Conversation

@upgradedev

Copy link
Copy Markdown
Owner

Summary

Copy-only PR, two coupled goals. No logic, routing, timeout, or pipeline changes — only user-visible strings (and the tests that assert on them).

A. Honest wait-time expectations

  • Hero.tsx — dropped the false ~30 seconds claim from the sub-CTA caption (a live reel is a multi-minute AI render, not 30s). Now reads No account · No watermark.
  • GenerateReel.tsx (in-flight screen) — added one honest line under the heading: "A live reel can take a few minutes to render. No need to refresh, this updates on its own." lib/progress.ts progress math is untouched.
  • GenerateReel.tsx (failure screen) — humanized the copy and softened the raw error:
    • Subtitle: Something interrupted the render. Your photos and occasion are safe — try again.Your photos and occasion are safe. Just try again.
    • The raw ApiError message (e.g. Request to /reels/upload-multipart failed (504).) is no longer shown as the headline. A gateway-timeout status (504/502/503/408) now reads as "This is taking longer than expected. Please try again in a moment."; other failures read as "We couldn't finish this one. Please try again." The raw technical detail (path + status) still renders underneath as a small secondary line, never the headline. Added GenerateReel.test.tsx coverage for the timeout path (previously untested -- the only existing failure test used a plain Error, never touching the new ApiError/status branches).

B. Em-dash / en-dash humanization

Scoped by grepping em-dash (U+2014) and en-dash (U+2013) across all of frontend/ (not just src/, and including index.html), then classifying every hit. Code comments, JSDoc, CSS comments, describe/it test labels, README.md, and package.json's npm metadata description were left untouched (never user-visible). Every genuinely user-visible dash was rewritten as two short sentences, a colon, a comma, or a parenthetical -- never just deleted.

# File Before -> After
1 index.html cinematic memory reel — scored, stitched, -> cinematic memory reel: scored, stitched,
2 index.html <title>Cinemory — your memories, made into film</title> -> Cinemory: your memories, made into film
3 Footer.tsx Cinemory — your memories, made into film. -> Cinemory. Your memories, made into film.
4 Hero.tsx title cards — an editor's eye, automated. -> title cards: an editor's eye, automated.
5 Hero.tsx year-in-review — each with its own pacing -> year-in-review: each with its own pacing
6 Hero.tsx manifest is sealed — verifiable, tamper-evident. -> manifest is sealed: verifiable, tamper-evident.
7 Hero.tsx cinematic reel — and seals it with -> cinematic reel, and seals it with
8 Hero.tsx small teams — no video editor required. -> small teams. No video editor required.
9 Hero.tsx No account · No watermark · ~30 seconds -> No account · No watermark (= Task A)
10 HashChip.tsx tooltip ${hash} — click to copy -> ${hash} (click to copy)
11 HowItWorks.tsx handful of moments — the order you choose -> handful of moments. The order you choose
12 HowItWorks.tsx cryptographically verify — in seconds. -> cryptographically verify in seconds.
13 ShareBar.tsx share-sheet title Cinemory — ${reel_name} -> Cinemory: ${reel_name}
14 ShareBar.tsx isn't available here — use Download or Copy link. -> isn't available here. Use Download or Copy link instead.
15 ShareBar.tsx Copy failed — copy the address from the address bar instead. -> Copy failed. Copy the address from the address bar instead.
16 ShareBar.tsx share yet — the reel is still stored and sealed -> share yet. The reel is still stored and sealed
17 lib/api.ts Network unreachable — check your connection. -> Network unreachable. Check your connection and try again.
18 lib/provenance-verify.ts manifest couldn't be fetched — check your connection and retry. -> manifest couldn't be fetched. Check your connection and retry.
19 lib/provenance-verify.ts does NOT match the sealed manifest_hash — the manifest bytes have changed. -> does NOT match the sealed manifest_hash. The manifest bytes have changed.
20 lib/provenance-verify.ts re-fetched manifest — it matches the sealed manifest_hash. -> re-fetched manifest. It matches the sealed manifest_hash.
21 lib/provenance-verify.ts verification receipt couldn't be fetched — check your connection and retry. -> verification receipt couldn't be fetched. Check your connection and retry.
22 ProvenancePanel.tsx manifest is sealed — tampering with any field breaks the hash. -> manifest is sealed. Tampering with any field breaks the hash.
23 ProvenancePanel.tsx empty reel_url placeholder "—" -> "(none)" (now matches ShareBar.tsx's existing fallback for the same field)
24 ProvenancePanel.tsx checks passed — all verified / — tamper detected -> checks passed. All verified. / . Tamper detected.
25 ExampleReel.tsx aria-label Example Cinemory reel — a cinematic sequence -> Example Cinemory reel: a cinematic sequence
26 ReelResult.tsx Preview slideshow of your photos — the reel file plays here -> Preview slideshow of your photos. The reel file plays here
27 PhotoUpload.tsx set the story — the order becomes the edit. -> set the story. The order becomes the edit.
28 PhotoUpload.tsx Tip: 4–12 photos (en-dash range) -> Tip: 4 to 12 photos
29 OccasionPicker.tsx title style — the whole edit changes with your choice. -> title style. The whole edit changes with your choice.
30 GenerateReel.tsx occasion subtitle reel — ${music_style}. -> reel: ${music_style}.
31 GenerateReel.tsx failure subtitle (= Task A, see above)
32 lib/utils.ts shortHash empty fallback "—" -> "N/A"
33 lib/utils.ts formatBytes nullish fallback "—" -> "N/A"

Deliberately left as-is (not user-visible, or a different typographic convention): all //, /* */, /** */ comments and describe/it/test labels across the codebase; README.md (explicit separate concern per scope); package.json's npm description metadata; frontend/src/lib/share.test.ts's Cinemory — demo fixture (an arbitrary internal test input to the pure shareReel() helper, independent of the real title template fixed in item 13).

Note: frontend/web/ is a separate client in this monorepo with its own CI job and likely carries some of the same copy; it's outside this task's frontend/src scope and was intentionally left untouched.

Test plan

  • Updated e2e/journey.spec.ts and ProvenancePanel.test.tsx regexes for the checks passed. All verified. copy change.
  • Updated utils.test.ts assertions + descriptions for the N/A placeholder change.
  • Added GenerateReel.test.tsx coverage for the 504 timeout path (new behavior, previously untested).
  • Read every other test file touching a changed component; all other assertions use case-insensitive substring regexes that survive the punctuation-only rewrites, so no other test changes were needed.
  • Final repo-wide grep confirms zero user-facing em/en-dashes remain outside comments/labels/README/package.json.
  • CI (typecheck, vitest coverage gate, Playwright e2e, Lighthouse a11y) — pending.

@upgradedev
upgradedev merged commit 9b8ce05 into main Jul 27, 2026
12 checks passed
@upgradedev
upgradedev deleted the fix/humanize-copy-wait-time branch July 27, 2026 22:13
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