chore(todo): 记 #28 App Group 事故复盘 + #29 chenxin 凭据过期 + #30 四语支付文案缺口
Deploy Client / build-windows (push) Successful in 1m43s
Deploy Client / build-android (push) Successful in 6m57s
Deploy Client / build-macos (push) Successful in 8m43s
Deploy Client / build-ios (push) Successful in 4m53s
Deploy Client / release-deploy (push) Successful in 2m6s

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FEVUXAbFT6bF1Qw27RHWoD
This commit is contained in:
wangjia
2026-08-08 23:41:36 +08:00
parent 77302cfa7a
commit 6a4da3e164
2 changed files with 153 additions and 6 deletions
+97 -4
View File
@@ -327,10 +327,10 @@ header .header-meta{color:var(--fg-soft)}
<header>
<div class="wrap">
<h1>feature+windows — 项目 TODO</h1>
<div class="header-meta">生成于 2026-08-01 · 真相源 todo/todo.json</div>
<div class="header-meta">生成于 2026-08-08 · 真相源 todo/todo.json</div>
<div class="stats">
<div class="stat-pill"><strong>26</strong>全部</div>
<div class="stat-pill"><strong>13</strong>待开始</div>
<div class="stat-pill"><strong>29</strong>全部</div>
<div class="stat-pill"><strong>16</strong>待开始</div>
<div class="stat-pill"><strong>0</strong>开发中</div>
<div class="stat-pill"><strong>5</strong>待验收</div>
<div class="stat-pill"><strong>8</strong>已验收</div>
@@ -376,12 +376,74 @@ header .header-meta{color:var(--fg-soft)}
<div class="section-block" id="section-open">
<div class="section-title st-open" data-toggle="open">
📋 待开始 <span class="s-count">13</span>
📋 待开始 <span class="s-count">16</span>
<span class="s-arrow">▴ 收起</span>
</div>
<div class="section-list-wrap " id="list-wrap-open">
<ul class="todo-list" id="list-open">
<li class="todo-card s-open"
data-id="28"
data-level="high"
data-status="open"
data-tier="2"
data-tags="mac,CI/CD">
<div class="card-header">
<span class="item-id">#28</span>
<span class="item-title">修复 macOS PacketTunnel 系统扩展 App Group 不一致导致装不上</span>
<div class="card-badges">
<span class="tag status-badge s-open">待开始</span>
<span class="tag t-block">高优 · 紧急</span>
<span class="tag tier-2">二级</span>
</div>
</div>
<div class="item-desc">根因:scripts/ci/compile-macos.sh 第 221 行把 sysext 的 application-groups 硬编码成 iOS 风格的 group.com.pangolin.pangolin,且第 195-210 行生成的 app.entitlements 完全没有 application-groups 键。二者与扩展 Info.plist 里的 NEMachServiceNameBYL4KQHMTN.com.pangolin.pangolin.PacketTunnel)对不上前缀 —— nesessionmanager 报 NetworkExtensionErrorDomain Code=6sysextd 校验失败当场卸载刚 staging 的新扩展;VpnChannel.start() 的 step1 activateSystemExtensionIfNeeded 抛 code=9,永远走不到 step2 的 loadOrCreateManagerNETunnelProviderManager 配置建不出来,scutil --nc list 里没有 Pangolin,客户端一个包都发不到服务器(服务端侧该 Mac 出口 IP 的握手尝试数为 0)。这违反了 CLAUDE.md 第 152 行已写明的铁律。注意这两个 entitlements 是 codesign --force 最终覆盖签名用的,仓库里的 .entitlements 源文件只在 Xcode 编译阶段生效,所以线上包坏而本地 all 流程正常。修复:compile-macos.sh 两处改用脚本第 99 行已定义的 APP_GROUP 变量,app.entitlements 补 application-groups。scripts/local_test.sh 的同款硬编码本次已修,并新增 verify_app_group 一致性闸(读最终产物签名,比对两端 App Group 与 NEMachServiceName 前缀)和 macos 一条龙子命令。建议把同样的闸加进 .gitea/workflows/ci.yml。改完需重新构建+公证+替换 api.yanmeiai.com/downloads/pangolin-macos-x64.zip。附带:受影响机器会堆积多个 terminated waiting to uninstall on reboot 的旧扩展(本机 13 个,已 38 天未重启),建议重启清理。</div>
<div class="card-footer">
<div class="tag-row"><span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="CI/CD">CI/CD</span></div>
<div class="item-meta">
<span class="tag owner-agent">🤖 agent</span>
<span class="meta-date">🕐 2026-08-08</span>
</div>
</div>
</li>
<li class="todo-card s-open"
data-id="29"
data-level="high"
data-status="open"
data-tier="2"
data-tags="Windows,后端">
<div class="card-header">
<span class="item-id">#29</span>
<span class="item-title">Windows 端 chenxin 设备连接凭据已过期,需重新签发并补过期处理</span>
<div class="card-badges">
<span class="tag status-badge s-open">待开始</span>
<span class="tag t-block">高优 · 紧急</span>
<span class="tag tier-2">二级</span>
</div>
</div>
<div class="item-desc">设备 Win·chenxindevices.id=25dp_uuid 019f599b-d11a-7763-9099-9935f4b49070client_version v1.0.72)的 connect_credentials 已于 2026-08-01 18:19 UTC 过期,agent 随后把它从 /etc/sing-box/config.json 的 reality-in users 里清掉了(当前只剩 019f55d6 和 019f8c8f 两个)。客户端对此无感知,持续高频重连,sing-box 一路报 REALITY: processed invalid connection。实测最近 2 小时该出口 IP 124.88.8.196 刷了 1801 条失败日志,占服务端全部握手失败的约 99%,把真正的故障信号淹没了(这次排查 Mac 问题时一度被误导)。处理项:1) 先给该 dp_uuid 重新签发凭据,恢复 chenxin 可用;2) 查清为什么它没像 Mac 那样自动续期成功——Mac 的 019f55d6 已续到 2026-08-09,说明续期链路本身是通的,怀疑 v1.0.72 版本客户端的续期逻辑有缺陷或登录态已失效;3) 客户端在凭据过期时应给出明确提示并做退避重试,而不是无限高频重连;4) 服务端对同一 dp_uuid 的连续握手失败做限频或告警,避免单台故障设备淹没日志。</div>
<div class="card-footer">
<div class="tag-row"><span class="tag t-tag" data-tag="Windows">Windows</span> <span class="tag t-tag" data-tag="后端">后端</span></div>
<div class="item-meta">
<span class="tag owner-agent">🤖 agent</span>
<span class="meta-date">🕐 2026-08-08</span>
</div>
</div>
</li>
<li class="todo-card s-open"
data-id="1"
data-level="mid"
@@ -781,6 +843,37 @@ header .header-meta{color:var(--fg-soft)}
<span class="tag owner-agent">🤖 agent</span>
<span class="meta-date">🕐 2026-06-22</span>
</div>
</div>
</li>
<li class="todo-card s-open"
data-id="30"
data-level="low"
data-status="open"
data-tier="3"
data-tags="前端,iOS,Android,mac,Windows">
<div class="card-header">
<span class="item-id">#30</span>
<span class="item-title">补齐 es/ja/ko/ru 四语的 28 条支付文案(当前回退英文)</span>
<div class="card-badges">
<span class="tag status-badge s-open">待开始</span>
<span class="tag t-low">一般 / 优化</span>
<span class="tag tier-3">三级</span>
</div>
</div>
<div class="item-desc">本次为修构建引入了英文兜底机制:主语言改为英语,StringsEs/Ja/Ko/Ru/Zh 一律 extends StringsEn,未覆写的文案自动回退英文,缺翻译不再是编译错误(原先四个语言文件各缺 28 条,直接把 kernel_snapshot 打挂)。构建期由 ci/check-l10n-coverage.mjs 列出缺口,只报 warning 不阻断。当前缺口:es/ja/ko/ru 各缺 28 条,合计 112 处,覆盖率均为 161/189 = 85.2 百分比;en/zh 已 100 百分比。缺的都是支付相关:purchaseTitle, paymentTitle, buyNow, payMethodAlipay, payMethodCrypto, choosePayMethod, proMonthly, proQuarterly, proYearly, perQuarter, perYear, payAmountLabel, payAddressLabel, payNetworkLabel, payExactAmountHint, copied, openAlipay, openAlipayHint, openAlipayFailed, awaitingPayment, paySucceeded, payExpiresAt, payDone, payFailed, payRetry, switchPayMethod, cancelOrder, qrNotSupported。注意红线词规范(禁 VPN/翻墙/科学上网等),文案定位为网络加速/体验优化+隐私,见各 strings 文件头部注释。补齐后 warning 自动消失。</div>
<div class="card-footer">
<div class="tag-row"><span class="tag t-tag" data-tag="前端">前端</span> <span class="tag t-tag" data-tag="iOS">iOS</span> <span class="tag t-tag" data-tag="Android">Android</span> <span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="Windows">Windows</span></div>
<div class="item-meta">
<span class="tag owner-agent">🤖 agent</span>
<span class="meta-date">🕐 2026-08-08</span>
</div>
</div>
</li>
+56 -2
View File
@@ -1,9 +1,9 @@
{
"meta": {
"title": "feature+windows — 项目 TODO",
"updated_at": "2026-07-31T16:34:06.427Z"
"updated_at": "2026-08-08T01:41:54.388Z"
},
"seq": 27,
"seq": 30,
"items": [
{
"id": 1,
@@ -429,6 +429,60 @@
"done": false,
"completed_at": null,
"version": null
},
{
"id": 28,
"title": "修复 macOS PacketTunnel 系统扩展 App Group 不一致导致装不上",
"desc": "根因:scripts/ci/compile-macos.sh 第 221 行把 sysext 的 application-groups 硬编码成 iOS 风格的 group.com.pangolin.pangolin,且第 195-210 行生成的 app.entitlements 完全没有 application-groups 键。二者与扩展 Info.plist 里的 NEMachServiceNameBYL4KQHMTN.com.pangolin.pangolin.PacketTunnel)对不上前缀 —— nesessionmanager 报 NetworkExtensionErrorDomain Code=6sysextd 校验失败当场卸载刚 staging 的新扩展;VpnChannel.start() 的 step1 activateSystemExtensionIfNeeded 抛 code=9,永远走不到 step2 的 loadOrCreateManagerNETunnelProviderManager 配置建不出来,scutil --nc list 里没有 Pangolin,客户端一个包都发不到服务器(服务端侧该 Mac 出口 IP 的握手尝试数为 0)。这违反了 CLAUDE.md 第 152 行已写明的铁律。注意这两个 entitlements 是 codesign --force 最终覆盖签名用的,仓库里的 .entitlements 源文件只在 Xcode 编译阶段生效,所以线上包坏而本地 all 流程正常。修复:compile-macos.sh 两处改用脚本第 99 行已定义的 APP_GROUP 变量,app.entitlements 补 application-groups。scripts/local_test.sh 的同款硬编码本次已修,并新增 verify_app_group 一致性闸(读最终产物签名,比对两端 App Group 与 NEMachServiceName 前缀)和 macos 一条龙子命令。建议把同样的闸加进 .gitea/workflows/ci.yml。改完需重新构建+公证+替换 api.yanmeiai.com/downloads/pangolin-macos-x64.zip。附带:受影响机器会堆积多个 terminated waiting to uninstall on reboot 的旧扩展(本机 13 个,已 38 天未重启),建议重启清理。",
"level": "high",
"tier": 2,
"tags": [
"mac",
"CI/CD"
],
"owner": "agent",
"status": "open",
"created_at": "2026-08-08T01:20:23.304Z",
"done": false,
"completed_at": null,
"version": null
},
{
"id": 29,
"title": "Windows 端 chenxin 设备连接凭据已过期,需重新签发并补过期处理",
"desc": "设备 Win·chenxindevices.id=25dp_uuid 019f599b-d11a-7763-9099-9935f4b49070client_version v1.0.72)的 connect_credentials 已于 2026-08-01 18:19 UTC 过期,agent 随后把它从 /etc/sing-box/config.json 的 reality-in users 里清掉了(当前只剩 019f55d6 和 019f8c8f 两个)。客户端对此无感知,持续高频重连,sing-box 一路报 REALITY: processed invalid connection。实测最近 2 小时该出口 IP 124.88.8.196 刷了 1801 条失败日志,占服务端全部握手失败的约 99%,把真正的故障信号淹没了(这次排查 Mac 问题时一度被误导)。处理项:1) 先给该 dp_uuid 重新签发凭据,恢复 chenxin 可用;2) 查清为什么它没像 Mac 那样自动续期成功——Mac 的 019f55d6 已续到 2026-08-09,说明续期链路本身是通的,怀疑 v1.0.72 版本客户端的续期逻辑有缺陷或登录态已失效;3) 客户端在凭据过期时应给出明确提示并做退避重试,而不是无限高频重连;4) 服务端对同一 dp_uuid 的连续握手失败做限频或告警,避免单台故障设备淹没日志。",
"level": "high",
"tier": 2,
"tags": [
"Windows",
"后端"
],
"owner": "agent",
"status": "open",
"created_at": "2026-08-08T01:20:48.075Z",
"done": false,
"completed_at": null,
"version": null
},
{
"id": 30,
"title": "补齐 es/ja/ko/ru 四语的 28 条支付文案(当前回退英文)",
"desc": "本次为修构建引入了英文兜底机制:主语言改为英语,StringsEs/Ja/Ko/Ru/Zh 一律 extends StringsEn,未覆写的文案自动回退英文,缺翻译不再是编译错误(原先四个语言文件各缺 28 条,直接把 kernel_snapshot 打挂)。构建期由 ci/check-l10n-coverage.mjs 列出缺口,只报 warning 不阻断。当前缺口:es/ja/ko/ru 各缺 28 条,合计 112 处,覆盖率均为 161/189 = 85.2 百分比;en/zh 已 100 百分比。缺的都是支付相关:purchaseTitle, paymentTitle, buyNow, payMethodAlipay, payMethodCrypto, choosePayMethod, proMonthly, proQuarterly, proYearly, perQuarter, perYear, payAmountLabel, payAddressLabel, payNetworkLabel, payExactAmountHint, copied, openAlipay, openAlipayHint, openAlipayFailed, awaitingPayment, paySucceeded, payExpiresAt, payDone, payFailed, payRetry, switchPayMethod, cancelOrder, qrNotSupported。注意红线词规范(禁 VPN/翻墙/科学上网等),文案定位为网络加速/体验优化+隐私,见各 strings 文件头部注释。补齐后 warning 自动消失。",
"level": "low",
"tier": 3,
"tags": [
"前端",
"iOS",
"Android",
"mac",
"Windows"
],
"owner": "agent",
"status": "open",
"created_at": "2026-08-08T01:41:54.388Z",
"done": false,
"completed_at": null,
"version": null
}
]
}