Honest generation wait-time copy + humanize em-dashes - #32
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
~30 secondsclaim from the sub-CTA caption (a live reel is a multi-minute AI render, not 30s). Now readsNo account · No watermark.lib/progress.tsprogress math is untouched.Something interrupted the render. Your photos and occasion are safe — try again.→Your photos and occasion are safe. Just try again.ApiErrormessage (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. AddedGenerateReel.test.tsxcoverage for the timeout path (previously untested -- the only existing failure test used a plainError, never touching the newApiError/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 justsrc/, and includingindex.html), then classifying every hit. Code comments, JSDoc, CSS comments,describe/ittest labels,README.md, andpackage.json's npm metadatadescriptionwere 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.index.htmlcinematic memory reel — scored, stitched,->cinematic memory reel: scored, stitched,index.html<title>Cinemory — your memories, made into film</title>->Cinemory: your memories, made into filmFooter.tsxCinemory — your memories, made into film.->Cinemory. Your memories, made into film.Hero.tsxtitle cards — an editor's eye, automated.->title cards: an editor's eye, automated.Hero.tsxyear-in-review — each with its own pacing->year-in-review: each with its own pacingHero.tsxmanifest is sealed — verifiable, tamper-evident.->manifest is sealed: verifiable, tamper-evident.Hero.tsxcinematic reel — and seals it with->cinematic reel, and seals it withHero.tsxsmall teams — no video editor required.->small teams. No video editor required.Hero.tsxNo account · No watermark · ~30 seconds->No account · No watermark(= Task A)HashChip.tsx${hash} — click to copy->${hash} (click to copy)HowItWorks.tsxhandful of moments — the order you choose->handful of moments. The order you chooseHowItWorks.tsxcryptographically verify — in seconds.->cryptographically verify in seconds.ShareBar.tsxCinemory — ${reel_name}->Cinemory: ${reel_name}ShareBar.tsxisn't available here — use Download or Copy link.->isn't available here. Use Download or Copy link instead.ShareBar.tsxCopy failed — copy the address from the address bar instead.->Copy failed. Copy the address from the address bar instead.ShareBar.tsxshare yet — the reel is still stored and sealed->share yet. The reel is still stored and sealedlib/api.tsNetwork unreachable — check your connection.->Network unreachable. Check your connection and try again.lib/provenance-verify.tsmanifest couldn't be fetched — check your connection and retry.->manifest couldn't be fetched. Check your connection and retry.lib/provenance-verify.tsdoes NOT match the sealed manifest_hash — the manifest bytes have changed.->does NOT match the sealed manifest_hash. The manifest bytes have changed.lib/provenance-verify.tsre-fetched manifest — it matches the sealed manifest_hash.->re-fetched manifest. It matches the sealed manifest_hash.lib/provenance-verify.tsverification receipt couldn't be fetched — check your connection and retry.->verification receipt couldn't be fetched. Check your connection and retry.ProvenancePanel.tsxmanifest is sealed — tampering with any field breaks the hash.->manifest is sealed. Tampering with any field breaks the hash.ProvenancePanel.tsxreel_urlplaceholder"—"->"(none)"(now matchesShareBar.tsx's existing fallback for the same field)ProvenancePanel.tsxchecks passed — all verified/— tamper detected->checks passed. All verified./. Tamper detected.ExampleReel.tsxExample Cinemory reel — a cinematic sequence->Example Cinemory reel: a cinematic sequenceReelResult.tsxPreview slideshow of your photos — the reel file plays here->Preview slideshow of your photos. The reel file plays herePhotoUpload.tsxset the story — the order becomes the edit.->set the story. The order becomes the edit.PhotoUpload.tsxTip: 4–12 photos(en-dash range) ->Tip: 4 to 12 photosOccasionPicker.tsxtitle style — the whole edit changes with your choice.->title style. The whole edit changes with your choice.GenerateReel.tsxreel — ${music_style}.->reel: ${music_style}.GenerateReel.tsxlib/utils.tsshortHashempty fallback"—"->"N/A"lib/utils.tsformatBytesnullish fallback"—"->"N/A"Deliberately left as-is (not user-visible, or a different typographic convention): all
//,/* */,/** */comments anddescribe/it/testlabels across the codebase;README.md(explicit separate concern per scope);package.json's npmdescriptionmetadata;frontend/src/lib/share.test.ts'sCinemory — demofixture (an arbitrary internal test input to the pureshareReel()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'sfrontend/srcscope and was intentionally left untouched.Test plan
e2e/journey.spec.tsandProvenancePanel.test.tsxregexes for thechecks passed. All verified.copy change.utils.test.tsassertions + descriptions for theN/Aplaceholder change.GenerateReel.test.tsxcoverage for the 504 timeout path (new behavior, previously untested).