From 09596fe7a51a750299cd68ba07bbbd1066eef341 Mon Sep 17 00:00:00 2001 From: hoelee Date: Tue, 27 Oct 2026 04:07:00 +0800 Subject: [PATCH] edit(content): review batch-2 editorial pass across 24 posts (EN + ZH) Tracker at 20 approved / 71 pending. Same pass as batch 1: first person throughout, no LAN IPs in prose, ZH twins normalised to simplified Chinese, dynamicCta where the post ends on a concrete next step. --- docs/consultant-review/AUDIT-TRACKER.md | 28 +-- docs/consultant-review/audit-tracker.json | 164 +++++++++--------- .../posts/authentik-css-greater-than-bug.md | 10 +- .../authentik-forward-auth-gate-wasnt-live.md | 6 +- .../posts/authentik-major-upgrade-gotchas.md | 4 +- .../automating-cyberpanel-without-the-ui.md | 14 +- ...eported-exit-0-the-oom-killer-disagreed.md | 2 +- ...very-player-stuttered-the-file-was-fine.md | 31 ++-- .../posts/hardening-a-tor-onion-service.md | 6 +- ...it-reported-success-nothing-had-changed.md | 33 ++-- .../posts/n8n-v1-to-v2-upgrade-gotchas.md | 8 +- ...e-hostname-public-tracker-sso-dashboard.md | 18 +- .../passbolt-hang-three-failure-modes.md | 6 +- .../patching-workbench-26-for-mariadb.md | 11 +- ...ell-patching-every-php-runtime-i-manage.md | 31 ++-- ...-a-front-door-on-an-app-you-cant-modify.md | 6 + ...-nocodb-dashboard-for-a-remote-database.md | 12 +- .../posts/replacing-rdpguard-with-ipban.md | 13 +- ...n-ai-photo-editor-as-a-wordpress-plugin.md | 11 +- ...self-improving-ai-agent-across-machines.md | 12 +- ...he-single-writer-rule-for-coding-agents.md | 6 +- ...when-to-give-your-agent-physical-clicks.md | 2 +- .../why-i-built-a-video-knowledge-base.md | 10 +- ...headless-browser-cant-scrape-everything.md | 5 +- .../zh/authentik-css-greater-than-bug.md | 10 +- .../authentik-forward-auth-gate-wasnt-live.md | 10 +- .../zh/authentik-major-upgrade-gotchas.md | 6 +- .../automating-cyberpanel-without-the-ui.md | 16 +- ...eported-exit-0-the-oom-killer-disagreed.md | 2 +- ...very-player-stuttered-the-file-was-fine.md | 13 +- .../posts/zh/hardening-a-tor-onion-service.md | 100 +++++------ ...it-reported-success-nothing-had-changed.md | 13 +- .../posts/zh/n8n-v1-to-v2-upgrade-gotchas.md | 10 +- ...e-hostname-public-tracker-sso-dashboard.md | 7 +- .../zh/passbolt-hang-three-failure-modes.md | 6 +- .../zh/patching-workbench-26-for-mariadb.md | 11 +- ...ell-patching-every-php-runtime-i-manage.md | 23 +-- ...-a-front-door-on-an-app-you-cant-modify.md | 6 + ...-nocodb-dashboard-for-a-remote-database.md | 7 +- .../posts/zh/replacing-rdpguard-with-ipban.md | 14 +- ...self-improving-ai-agent-across-machines.md | 28 +-- ...he-single-writer-rule-for-coding-agents.md | 8 +- ...when-to-give-your-agent-physical-clicks.md | 2 +- .../zh/why-i-built-a-video-knowledge-base.md | 10 +- ...headless-browser-cant-scrape-everything.md | 4 +- 45 files changed, 418 insertions(+), 337 deletions(-) diff --git a/docs/consultant-review/AUDIT-TRACKER.md b/docs/consultant-review/AUDIT-TRACKER.md index 413e2a1..358ee36 100644 --- a/docs/consultant-review/AUDIT-TRACKER.md +++ b/docs/consultant-review/AUDIT-TRACKER.md @@ -1,7 +1,7 @@ # 全站文章顾问审阅状态总控台 (Audit Tracker) -> **最后同步时间**:2026-10-27 03:22:38 -> **全站总文章数**:91 篇 | **已审批完成**:9 篇 (9.9%) | **待审阅**:82 篇 +> **最后同步时间**:2026-10-27 04:06:09 +> **全站总文章数**:91 篇 | **已审批完成**:20 篇 (22.0%) | **待审阅**:71 篇 ## 一、操作命令速查 - `python scripts/manage_review.py list` — 查看待审与已审概览 @@ -36,20 +36,20 @@ | 22 | `case-studies` | `self-healing-digital-goods-entitlements` | 数字商品的自愈式访问控制:NocoDB、n8n 与 AList | ⏳ 待审阅 | Batch-02 | - | | | 23 | `case-studies` | `self-hosted-speech-to-text-api` | 自建语音转文字服务:打字速度的 3 倍以上,而且数据不出内网 | ⏳ 待审阅 | Batch-02 | - | | | 24 | `case-studies` | `self-hosted-tts-cosyvoice2-n8n-gpu` | 从云端转本地:在 12GB 显卡与群晖 N8N 上搭建中英混读高保真 TTS 语音栈 | ⏳ 待审阅 | Batch-02 | - | | -| 25 | `case-studies` | `self-hosting-mem0-memory-stack` | 我如何在自家 NAS 上自托管 Mem0 记忆栈(让 AI 助手有记忆) | ⏳ 待审阅 | Batch-02 | - | | +| 25 | `case-studies` | `self-hosting-mem0-memory-stack` | 我如何在私有存储节点上自托管 Mem0 记忆栈(让 AI 助手拥有持久记忆) | ⏳ 待审阅 | Batch-02 | - | | | 26 | `case-studies` | `shipping-an-ai-photo-editor-as-a-wordpress-plugin` | 把 AI 修图工具做成 WordPress 插件:22 个版本换来的经验 | ⏳ 待审阅 | Batch-02 | - | | | 27 | `case-studies` | `syncing-a-self-improving-ai-agent-across-machines` | 在多台机器之间同步一个会自我学习的 AI Agent | ⏳ 待审阅 | Batch-02 | - | | -| 28 | `case-studies` | `the-single-writer-rule-for-coding-agents` | 代码只让一个 AI 改:我是如何避开多 Agent 协同踩坑的「单写多审」架构 | ⏳ 待审阅 | Batch-03 | - | | -| 29 | `case-studies` | `when-to-give-your-agent-physical-clicks` | 什么时候该让 AI 操控物理鼠标(以及什么时候绝对不要用) | ⏳ 待审阅 | Batch-03 | - | | -| 30 | `case-studies` | `why-i-built-a-video-knowledge-base` | 为什么我要做视频精读知识库:把收藏夹吃灰的短视频变成可检索笔记 | ⏳ 待审阅 | Batch-03 | - | | -| 31 | `case-studies` | `why-your-headless-browser-cant-scrape-everything` | 为什么你的无头浏览器不是万能爬虫 | ⏳ 待审阅 | Batch-03 | - | | -| 32 | `devops` | `authentik-css-greater-than-bug` | 一个字符让我的 authentik CSS 静默失效 | ⏳ 待审阅 | Batch-03 | - | | -| 33 | `devops` | `authentik-forward-auth-gate-wasnt-live` | 验证完全正确的 Forward-Auth 网关——其实并未上线 | ⏳ 待审阅 | Batch-03 | - | | -| 34 | `devops` | `authentik-major-upgrade-gotchas` | Authentik 从 2025.8 升级到 2026.8:那些没人提醒你会坏掉的部分 | ⏳ 待审阅 | Batch-03 | - | | -| 35 | `devops` | `automating-cyberpanel-without-the-ui` | 不用界面管理 CyberPanel:逆向一个没有文档的 v2 API | ⏳ 待审阅 | Batch-03 | - | | -| 36 | `devops` | `docker-reported-exit-0-the-oom-killer-disagreed` | Docker 报告退出码 0,内核却早已执行 OOM-Kill | ⏳ 待审阅 | Batch-03 | - | | -| 37 | `devops` | `every-player-stuttered-the-file-was-fine` | 每个播放器都在同一个视频上卡顿,而文件本身是无辜的 | ⏳ 待审阅 | Batch-03 | - | | -| 38 | `devops` | `hardening-a-tor-onion-service` | 加固 Tor 洋葱服务:真正重要的是什么 | ⏳ 待审阅 | Batch-03 | - | | +| 28 | `case-studies` | `the-single-writer-rule-for-coding-agents` | 代码只让一个 AI 改:我是如何避开多 Agent 协同踩坑的「单写多审」架构 | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | +| 29 | `case-studies` | `when-to-give-your-agent-physical-clicks` | 什么时候该让 AI 操控物理鼠标(以及什么时候绝对不要用) | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | +| 30 | `case-studies` | `why-i-built-a-video-knowledge-base` | 为什么我要做视频精读知识库:把收藏夹吃灰的短视频变成可检索笔记 | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | +| 31 | `case-studies` | `why-your-headless-browser-cant-scrape-everything` | 为什么你的无头浏览器不是万能爬虫 | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | +| 32 | `devops` | `authentik-css-greater-than-bug` | 一个字符让我的 authentik CSS 静默失效 | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | +| 33 | `devops` | `authentik-forward-auth-gate-wasnt-live` | 验证完全正确的 Forward-Auth 网关——其实并未上线 | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | +| 34 | `devops` | `authentik-major-upgrade-gotchas` | Authentik 从 2025.8 升级到 2026.8:那些没人提醒你会坏掉的部分 | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | +| 35 | `devops` | `automating-cyberpanel-without-the-ui` | 不用界面管理 CyberPanel:逆向一个没有文档的 v2 API | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | +| 36 | `devops` | `docker-reported-exit-0-the-oom-killer-disagreed` | Docker 报告退出码 0,内核却早已执行 OOM-Kill | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | +| 37 | `devops` | `every-player-stuttered-the-file-was-fine` | 每个播放器都在同一个视频上卡顿,而文件本身是无辜的 | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | +| 38 | `devops` | `hardening-a-tor-onion-service` | 加固 Tor 洋葱服务:真正重要的是什么 | ✅ 已通过 | Batch-03 | 2026-10-27 03:49 | 外部顾问审阅完成,已采纳并落地全量修改意见 | | 39 | `devops` | `it-reported-success-nothing-had-changed` | 它报告了成功,可实际上什么都没变 | ⏳ 待审阅 | Batch-04 | - | | | 40 | `devops` | `n8n-v1-to-v2-upgrade-gotchas` | n8n v1 升级到 v2:一个日志文件里的七项废弃警告 | ⏳ 待审阅 | Batch-04 | - | | | 41 | `devops` | `one-hostname-public-tracker-sso-dashboard` | 公开的埋点与要 SSO 的仪表盘,怎么共用一个域名 | ⏳ 待审阅 | Batch-04 | - | | diff --git a/docs/consultant-review/audit-tracker.json b/docs/consultant-review/audit-tracker.json index 3a6ddd0..5e81c7b 100644 --- a/docs/consultant-review/audit-tracker.json +++ b/docs/consultant-review/audit-tracker.json @@ -44,12 +44,12 @@ "zh_title": "一个字符让我的 authentik CSS 静默失效", "category": "devops", "pub_date": "2026-09-20", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 9206, - "zh_chars": 5485 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 9317, + "zh_chars": 5589 }, "authentik-forward-auth-gate-wasnt-live": { "slug": "authentik-forward-auth-gate-wasnt-live", @@ -57,12 +57,12 @@ "zh_title": "验证完全正确的 Forward-Auth 网关——其实并未上线", "category": "devops", "pub_date": "2026-08-12", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 16519, - "zh_chars": 8735 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 16526, + "zh_chars": 8746 }, "authentik-major-upgrade-gotchas": { "slug": "authentik-major-upgrade-gotchas", @@ -70,12 +70,12 @@ "zh_title": "Authentik 从 2025.8 升级到 2026.8:那些没人提醒你会坏掉的部分", "category": "devops", "pub_date": "2026-09-09", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 11639, - "zh_chars": 6086 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 11710, + "zh_chars": 6147 }, "automating-cyberpanel-without-the-ui": { "slug": "automating-cyberpanel-without-the-ui", @@ -83,12 +83,12 @@ "zh_title": "不用界面管理 CyberPanel:逆向一个没有文档的 v2 API", "category": "devops", "pub_date": "2026-09-09", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 8495, - "zh_chars": 5223 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 8474, + "zh_chars": 5205 }, "best-ai-video-generators-2026": { "slug": "best-ai-video-generators-2026", @@ -148,12 +148,12 @@ "zh_title": "Docker 报告退出码 0,内核却早已执行 OOM-Kill", "category": "devops", "pub_date": "2026-10-16", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 10183, - "zh_chars": 5483 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 10200, + "zh_chars": 5488 }, "does-hevc-actually-shrink-your-files": { "slug": "does-hevc-actually-shrink-your-files", @@ -187,12 +187,12 @@ "zh_title": "每个播放器都在同一个视频上卡顿,而文件本身是无辜的", "category": "devops", "pub_date": "2026-10-08", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 7884, - "zh_chars": 3921 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 8459, + "zh_chars": 4296 }, "five-step-ai-roadmap-what-i-actually-run": { "slug": "five-step-ai-roadmap-what-i-actually-run", @@ -275,15 +275,15 @@ "hardening-a-tor-onion-service": { "slug": "hardening-a-tor-onion-service", "title": "Hardening a Tor Onion Service: What Actually Matters", - "zh_title": "加固 Tor 洋葱服务:真正重要的是什么", + "zh_title": "加固 Tor 洋葱服务:真正重要的是什么", "category": "devops", "pub_date": "2025-12-10", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 14882, - "zh_chars": 7031 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 14907, + "zh_chars": 7041 }, "hello-world": { "slug": "hello-world", @@ -399,8 +399,8 @@ "batch_id": "Batch-04", "approved_at": null, "notes": "", - "en_chars": 7654, - "zh_chars": 3480 + "en_chars": 8349, + "zh_chars": 3886 }, "jpa-version-field-lost-update": { "slug": "jpa-version-field-lost-update", @@ -464,8 +464,8 @@ "batch_id": "Batch-04", "approved_at": null, "notes": "", - "en_chars": 11892, - "zh_chars": 6540 + "en_chars": 12262, + "zh_chars": 6712 }, "nocodb-sso-is-a-licensed-feature": { "slug": "nocodb-sso-is-a-licensed-feature", @@ -490,8 +490,8 @@ "batch_id": "Batch-04", "approved_at": null, "notes": "", - "en_chars": 13998, - "zh_chars": 6677 + "en_chars": 14400, + "zh_chars": 6837 }, "one-prometheus-for-unraid-synology-and-a-vps": { "slug": "one-prometheus-for-unraid-synology-and-a-vps", @@ -516,8 +516,8 @@ "batch_id": "Batch-04", "approved_at": null, "notes": "", - "en_chars": 7740, - "zh_chars": 4063 + "en_chars": 7864, + "zh_chars": 4187 }, "patching-workbench-26-for-mariadb": { "slug": "patching-workbench-26-for-mariadb", @@ -529,8 +529,8 @@ "batch_id": "Batch-04", "approved_at": null, "notes": "", - "en_chars": 15104, - "zh_chars": 9020 + "en_chars": 15965, + "zh_chars": 9501 }, "php2shell-patching-every-php-runtime-i-manage": { "slug": "php2shell-patching-every-php-runtime-i-manage", @@ -542,8 +542,8 @@ "batch_id": "Batch-04", "approved_at": null, "notes": "", - "en_chars": 22273, - "zh_chars": 12465 + "en_chars": 22354, + "zh_chars": 12531 }, "plugging-windows-desktop-control-into-four-ai-agents": { "slug": "plugging-windows-desktop-control-into-four-ai-agents", @@ -568,8 +568,8 @@ "batch_id": "Batch-04", "approved_at": null, "notes": "", - "en_chars": 13314, - "zh_chars": 6978 + "en_chars": 13927, + "zh_chars": 7415 }, "read-only-nocodb-dashboard-for-a-remote-database": { "slug": "read-only-nocodb-dashboard-for-a-remote-database", @@ -581,8 +581,8 @@ "batch_id": "Batch-04", "approved_at": null, "notes": "", - "en_chars": 11723, - "zh_chars": 6166 + "en_chars": 12009, + "zh_chars": 6287 }, "reading-a-containers-own-api-docs": { "slug": "reading-a-containers-own-api-docs", @@ -607,8 +607,8 @@ "batch_id": "Batch-04", "approved_at": null, "notes": "", - "en_chars": 12784, - "zh_chars": 7641 + "en_chars": 13131, + "zh_chars": 7789 }, "running-ai-video-locally-on-a-12gb-gpu": { "slug": "running-ai-video-locally-on-a-12gb-gpu", @@ -699,20 +699,20 @@ "approved_at": null, "notes": "", "en_chars": 8913, - "zh_chars": 4402 + "zh_chars": 4773 }, "self-hosting-mem0-memory-stack": { "slug": "self-hosting-mem0-memory-stack", "title": "How I Self-Hosted a Mem0 Memory Stack (So My AI Agent Remembers)", - "zh_title": "我如何在自家 NAS 上自托管 Mem0 记忆栈(让 AI 助手有记忆)", + "zh_title": "我如何在私有存储节点上自托管 Mem0 记忆栈(让 AI 助手拥有持久记忆)", "category": "case-studies", "pub_date": "2026-09-16", "status": "pending", "batch_id": "Batch-02", "approved_at": null, "notes": "", - "en_chars": 7894, - "zh_chars": 4708 + "en_chars": 8057, + "zh_chars": 4849 }, "shipping-an-ai-photo-editor-as-a-wordpress-plugin": { "slug": "shipping-an-ai-photo-editor-as-a-wordpress-plugin", @@ -724,8 +724,8 @@ "batch_id": "Batch-02", "approved_at": null, "notes": "", - "en_chars": 13782, - "zh_chars": 6796 + "en_chars": 13879, + "zh_chars": 6861 }, "slashing-agent-context-with-a-code-graph": { "slug": "slashing-agent-context-with-a-code-graph", @@ -789,8 +789,8 @@ "batch_id": "Batch-02", "approved_at": null, "notes": "", - "en_chars": 8918, - "zh_chars": 4599 + "en_chars": 8861, + "zh_chars": 4541 }, "synology-api-401-with-the-correct-password": { "slug": "synology-api-401-with-the-correct-password", @@ -863,12 +863,12 @@ "zh_title": "代码只让一个 AI 改:我是如何避开多 Agent 协同踩坑的「单写多审」架构", "category": "case-studies", "pub_date": "2026-08-26", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 13268, - "zh_chars": 6916 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 13331, + "zh_chars": 6954 }, "the-upstream-was-deleted-then-came-back-rewritten": { "slug": "the-upstream-was-deleted-then-came-back-rewritten", @@ -993,12 +993,12 @@ "zh_title": "什么时候该让 AI 操控物理鼠标(以及什么时候绝对不要用)", "category": "case-studies", "pub_date": "2026-05-28", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 6853, - "zh_chars": 3594 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 6882, + "zh_chars": 3608 }, "why-500000-lines-of-commit-churn-only-left-230000-in-production": { "slug": "why-500000-lines-of-commit-churn-only-left-230000-in-production", @@ -1032,12 +1032,12 @@ "zh_title": "为什么我要做视频精读知识库:把收藏夹吃灰的短视频变成可检索笔记", "category": "case-studies", "pub_date": "2024-11-28", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 5728, - "zh_chars": 2903 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 5770, + "zh_chars": 2924 }, "why-i-still-bought-a-local-gpu": { "slug": "why-i-still-bought-a-local-gpu", @@ -1136,12 +1136,12 @@ "zh_title": "为什么你的无头浏览器不是万能爬虫", "category": "case-studies", "pub_date": "2026-01-21", - "status": "pending", + "status": "approved", "batch_id": "Batch-03", - "approved_at": null, - "notes": "", - "en_chars": 8065, - "zh_chars": 3791 + "approved_at": "2026-10-27 03:49", + "notes": "外部顾问审阅完成,已采纳并落地全量修改意见", + "en_chars": 8076, + "zh_chars": 3792 }, "why-your-windows-mcp-calls-silently-fail": { "slug": "why-your-windows-mcp-calls-silently-fail", diff --git a/src/content/posts/authentik-css-greater-than-bug.md b/src/content/posts/authentik-css-greater-than-bug.md index 14da737..94d579b 100644 --- a/src/content/posts/authentik-css-greater-than-bug.md +++ b/src/content/posts/authentik-css-greater-than-bug.md @@ -126,7 +126,7 @@ There it is. **`u003e`.** The `>` character — written correctly in my CSS, stored correctly in the database, returned correctly by the API — was rendered into the HTML as -the literal text `u003e`. Not the `>` character. The six characters +the literal text `u003e`. Not the `>` character. The five characters `u`, `0`, `0`, `3`, `e`. So the browser tried to parse this selector: @@ -163,11 +163,9 @@ That is the whole fix. One character deleted. ### Where the escaping comes from -`\u003E` is how JSON/JavaScript encodes `>`. authentik's Django templates -render the brand config as a JavaScript object literal, and a HTML/JS -escaper is being applied to the `branding_custom_css` string. Backslash -and the `u` get separated somewhere in that path, so the browser receives -`u003e` — the escape without its backslash — instead of `>`. +`\u003E` is how JSON/JavaScript encodes `>`. authentik's Django templates render the brand config as a JavaScript object literal, and a HTML/JS escaper is being applied to the `branding_custom_css` string. + +In CSS syntax (unlike JS), hex escapes are written `\003e` without a `u`. Because `u` is not a hex digit, the browser's CSS tokenizer treats `\u` as an escaped literal `u`, turning `\u003E` inside the `