From be733a6751a717e8c983f3802082bf8652666b53 Mon Sep 17 00:00:00 2001 From: Elmehdi Aitbrahim Date: Wed, 26 Aug 2026 20:22:06 -0400 Subject: [PATCH] fix(docs): stop emitting an email-shaped string Cloudflare deletes (#93) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #93. A live regression from #85, found by checking production rather than `dist`. ### What readers actually saw Every engine document page rendered: > Fetched at build time from CodeGateSoftware/**[email protected]**. Cloudflare's Email Address Obfuscation matched `keel@v0.11.2` as an address and replaced it at the edge: [email protected] Decoding `data-cfemail` with its leading-byte XOR key returns `keel@v0.11.2`, so the origin response was always correct — only the served bytes were wrong. ### Why #85 caused it The `${repo}@${ref}` template predates the pin. Before it, `ref` was `main`, and `keel@main` has no dot after the `@`, so it does not look like an address. `keel@v0.11.2` does. The irony is exact: #85 existed to make the documented version visible, and the moment it became a version number the edge deleted it. ### The fix, and why this one Two remedies existed. Turning Email Address Obfuscation off is a zone-level dashboard setting — not reachable from this repo, global in blast radius, and it would silently regress the day someone re-enables it. Emitting `repo at ref` instead carries the same information, matches no address pattern, and cannot be undone by a setting. All three locales get a connector in their own language — `at` / `عند` / `à` — rather than a symbol. A comment on the template says why, so nobody tidies it back to `@`. ### Same class as #82 An edge rewrite silently changing what the site says, invisible from inside the repo because `dist` was right. That is the second time; #93 suggests a production assertion, and `ai-crawler-check.yml` is the pattern to copy. ### Verification - `npm run check` — 0 errors, 0 warnings - `npm run build` — 56 pages, complete - Zero `CodeGateSoftware/keel@` occurrences in any built page - Renders in all three locales: - en — `from CodeGateSoftware/keel at v0.11.2` - ar — `من CodeGateSoftware/keel عند v0.11.2` - fr — `depuis CodeGateSoftware/keel à v0.11.2` Production must be re-checked after deploy: the origin was never the problem. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_015cBJ2syTN4VoE73F9sBNGW --- src/i18n/ui.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/i18n/ui.ts b/src/i18n/ui.ts index 8e76879..d8bde23 100644 --- a/src/i18n/ui.ts +++ b/src/i18n/ui.ts @@ -52,8 +52,15 @@ export const ui = { untranslatedOriginal: "Original document — shown in English", }, docs: { + /** + * `repo at ref`, never `repo@ref` (#93). Cloudflare's Email Address + * Obfuscation matched `keel@v0.11.2` as an address and replaced the + * version with an obfuscated mailto link in production — deleting the + * exact fact #85 added this line to show. `main` survived only because + * it has no dot after the `@`. + */ fetchedFrom: (repo: string, ref: string) => - `Fetched at build time from ${repo}@${ref}. If a document moves, the build fails — this site never renders stale docs.`, + `Fetched at build time from ${repo} at ${ref}. If a document moves, the build fails — this site never renders stale docs.`, backToDocs: "All documents", fetchedAt: (date: string) => `Last fetched ${date}.`, originalLanguageNote: @@ -151,7 +158,7 @@ export const ui = { }, docs: { fetchedFrom: (repo: string, ref: string) => - `جُلب وقت البناء من ${repo}@${ref}. وإن نُقل مستندٌ من موضعه فشل البناء — فهذا الموقع لا يعرض وثائق متقادمة أبدًا.`, + `جُلب وقت البناء من ${repo} عند ${ref}. وإن نُقل مستندٌ من موضعه فشل البناء — فهذا الموقع لا يعرض وثائق متقادمة أبدًا.`, backToDocs: "كل المستندات", fetchedAt: (date: string) => `آخر جلبٍ في ${date}.`, originalLanguageNote: @@ -256,7 +263,7 @@ export const ui = { }, docs: { fetchedFrom: (repo: string, ref: string) => - `Récupéré au moment du build depuis ${repo}@${ref}. Si un document change de place, le build échoue : ce site n'affiche jamais de documentation périmée.`, + `Récupéré au moment du build depuis ${repo} à ${ref}. Si un document change de place, le build échoue : ce site n'affiche jamais de documentation périmée.`, backToDocs: "Tous les documents", fetchedAt: (date: string) => `Dernière récupération : ${date}.`, originalLanguageNote: