Skip to content

fix(ci): 前端三个 lint step 里两个「结构上不可能变红」——消掉 web 的 6 个 no-explicit-any(12 份手抄签名中删掉从未被传过的 options 参数)后把 Lint Web 与 mobile lint 翻成真门禁,desktop 保持 advisory 但把实测理由(4 个 exhaustive-deps warning + CI 命令带 --max-warnings 0 ⇒ exit 1)写进 YAML (#2274) - #2278

Merged
DeliciousBuding merged 2 commits into
masterfrom
fix/frontend-lint-real-gate
Sep 3, 2026

Conversation

@DeliciousBuding

Copy link
Copy Markdown
Collaborator

一句话

三个前端 lint step 里有两个结构上不可能让 CI 变红(挂着 continue-on-error: true)——这就是 6 个 no-explicit-any 能长期活在 master 上的原因:不是没人跑 lint,是跑了也不算。本 PR 消除那 6 个错误、把能用 CI 原命令证明绿的两个 step 翻成真门禁,并把第三个不能翻的实测理由写进 YAML,而不是留一个裸 flag。

关联 #2274(C-2 同族);desktop 的遗留债务已写进 #2251

逐个处置(判据 = 能不能用 CI 的原命令证明它绿)

step CI 原命令 实测 处置
Lint Web pnpm lint = eslint src --max-warnings 0 改前 6 errors;改后 0 problems 翻硬
Lint (mobile rules) pnpm --filter agenthub-mobile-rn lint 0 errors / 1 warning(脚本不带 --max-warnings 翻硬
desktop Lint pnpm lint --max-warnings 0 0 errors / 4 个 react-hooks/exhaustive-deps warning ⇒ exit 1 保持 advisory + 写明理由

desktop 不翻的原因是测出来的,不是习惯性的:那 4 条是 useMemo 依赖数组缺 t / tApp,修它等于改记忆化依赖 ⇒ 行为变更,需要自己一个被 review 的切片,不能塞进 lint 清理里。翻早了会让每个 desktop PR 恒红。

Go 侧同样的 report-only 有指纹棘轮当硬门(#1840);前端 eslint 此前什么硬门都没有。本 PR 不新增任何门禁脚本,只是把已有的两个 step 的 continue-on-error 摘掉。

6 个 any 的修法:删掉死参数,而不是给它找类型

同一个手抄签名 (key: string, options?: any) => string 全仓有 12 份(web 6 + desktop 6)。

  • web 5 处options 从未被任何调用点传过 ⇒ 直接删掉参数(回调类型应当描述被调方真正用到的东西)。
  • web 1 处createDefaultAgentProfileRequest):真的在插值 t?.('agents.newDefault', { index }) ⇒ 保留参数但改为 Record<string, unknown>
  • desktop 6 处:刻意不动。它们的调用方传的是 i18next 自己的 TFunction只有 options 为 any 时才赋得上——收窄会在 App.tsx:265TS2345(实测,不是推测);且 desktop 的 eslint 配置根本没开 no-explicit-any,所以那边没有违规。已在 web 那处留注释说明为什么两端不对称、以及"重新对称"会炸在哪一行,防止下一个人好心改回去。

两次自我纠错都由编译器抓出(不是 grep)

  1. 我先按"12 处 options 全是死表面"把它们全删了 ⇒ pnpm -r typecheck 立刻红:web agentQueries.ts:300 与 desktop documentQueries.ts:65,68,70 真的在插值({ index } / { time } / { month, day, time })。我此前用 grep 断言"没有任何调用点传 options"是错的,编译器才是可靠的普查员。
  2. 给 desktop 的 AppTranslate 换成 Record<string, unknown> 后 typecheck 再红(TFunction 不可赋值)⇒ desktop 6 处整体回退到 master(0 diff)。

刻意不做(避免过度工程化)

  • 不新造 shared 跨包类型verify-shared-barrel / verify-shared-boundary 两个门禁都盯着 shared 的导出面;为一行的函数类型别名开一条跨包契约,正是本 PR 要消的那种过度抽象。
  • 不动另外两个 advisory step(i18n callsites ratchet、cargo clippy):它们的 YAML 注释已写明"已知债务分批处理期间保持 advisory",翻硬会立刻恒红。
  • 不动 checks.yml:84 的 edge golangci-lint continue-on-error:那处有完整注释说明硬门在指纹棘轮,属既定设计而非遗漏。

证据

结果
pnpm -r typecheck 5 个包全绿
pnpm --filter agenthub-web test 33 文件 / 268 测试全绿
Lint Web 用 CI 原命令 0 problems(改前 6 errors)
Lint (mobile rules) 用 CI 原命令 0 errors / 1 warning,exit 0
desktop Lint 用 CI 原命令(带 --max-warnings 0 exit 1(4 warnings)⇒ 与"保持 advisory"的决定一致
verify-ci-gates.py(改 step 未破坏 job 结构) ok
verify-doc-ssot.py / verify-action-runtimes.py ok
git diff --check 无空白错误
desktop 回退核对 git statusapp/desktop/** 0 diff

未验证 / 可能错

  • 本地 node_modules 与 CI 的 pnpm install --frozen-lockfile 可能有 eslint 插件版本差异;若 CI 上 web/mobile lint 结果与本地不同,翻硬的那两个 step 会真的变红(这正是翻硬的意义——它会告诉我们真相,而不是继续静默)。
  • 未跑 desktop / mobile / shared / workbench 的测试:本 PR 对这四个包零改动(desktop 已整体回退)。

…进 YAML 而不是留一个裸 flag。web 的 6 个 no-explicit-any 全部消除(同一个手抄签名 `(key: string, options?: any) => string` 在 web 6 处 + desktop 6 处共 12 份;web 的 5 处直接删掉从未被传过的 options 参数、1 处 createDefaultAgentProfileRequest 真的插值故保留但改为 Record<string, unknown>),desktop 6 处刻意不动:它的调用方传的是 i18next 自己的 TFunction,只有 options 为 any 时才赋得上(收窄会在 App.tsx:265 报 TS2345,实测),且 desktop 的 eslint 配置根本没开 no-explicit-any (#2274)

病灶:`Lint Web` / `Lint (mobile rules)` / desktop `Lint` 三个 step 都挂着
`continue-on-error: true`,即无论多红都不会让 CI 失败。这就是 6 个
`no-explicit-any` 能长期活在 master 上的原因——不是没人跑 lint,是跑了也不算。
Go 侧同样的 report-only 有指纹棘轮当硬门(#1840),前端 eslint 什么硬门都没有。

按「能不能用 CI 的原命令证明它绿」逐个处置,而不是三个一起翻:

| step | CI 原命令 | 实测 | 处置 |
|---|---|---|---|
| Lint Web | `pnpm lint` = `eslint src --max-warnings 0` | 改前 6 errors;改后 **0 problems** | **翻硬**(删 continue-on-error) |
| Lint (mobile rules) | `pnpm --filter agenthub-mobile-rn lint` | **0 errors / 1 warning**,脚本不带 --max-warnings | **翻硬** |
| desktop Lint | `pnpm lint --max-warnings 0` | **0 errors / 4 个 react-hooks/exhaustive-deps warning ⇒ exit 1** | **保持 advisory**,但把这条实测理由写进 YAML 注释 |

desktop 不翻的原因是测出来的、不是习惯性的:那 4 条 warning 是 useMemo 依赖数组
缺 `t` / `tApp`,修它等于改记忆化依赖 ⇒ 行为变更,需要自己一个被 review 的切片,
不能塞进一个 lint 清理里。翻早了会让每个 desktop PR 恒红。
已把这条债务写进 #2251(CI 关键路径 frontend 半)。

消融过程中的两次自我纠错(都由编译器抓出,不是 grep):
1. 我先按「12 处 options 参数全是死表面」把它们全删了 —— `pnpm -r typecheck`
   立刻红两处:web `agentQueries.ts:300` 的 `t?.('agents.newDefault', { index })`
   与 desktop `documentQueries.ts:65,68,70` 的 `{ time }` / `{ month, day, time }`
   真的在插值。⇒ 逐点修法:真插值的保留参数并给精确类型,其余删掉。
2. 给 desktop 的 `AppTranslate` 也换成 `Record<string, unknown>` 后 typecheck 再红:
   `TFunction<"translation", undefined>` 赋不给它(TS2345 @ App.tsx:265)。
   ⇒ desktop 6 处整体回退到 master(0 diff),并在 web 那处留下注释说明
   **为什么两端不对称、以及"重新对称"会炸在哪里**,防止下一个人好心改回去。

刻意不做:
- 不为这个回调类型新造 shared 跨包导出(`verify-shared-barrel` /
  `verify-shared-boundary` 两个门禁都盯着 shared 的导出面;一个一行的函数类型
  别名不值得为它开一条跨包契约,那正是本 PR 要消的过度抽象方向)。
- 不动另外两个 advisory step(i18n callsites ratchet、cargo clippy):它们的
  YAML 注释已写明是"已知债务在分批处理期间保持 advisory",翻硬会立刻恒红。
- 不动 edge golangci-lint action 的 continue-on-error(checks.yml:84):那一处
  有完整注释说明硬门在指纹棘轮,属既定设计而非遗漏。

验证:`pnpm -r typecheck` 5 包全绿;`pnpm --filter agenthub-web test` 33 文件 /
268 测试全绿;web lint 用 CI 原命令 0 problems;mobile lint 用 CI 原命令
0 errors;desktop lint 用 CI 原命令 exit 1(与保留 advisory 的决定一致);
`verify-ci-gates` ok(改 step 未破坏 job 结构)、`verify-doc-ssot` ok、
`verify-action-runtimes` ok;`git diff --check` 无空白错误。

Co-authored-by: Cursor <cursor@vectorcontrol.tech>
@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: 8ca6965b-4f20-477a-a1a4-9462c93e9956

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…ZOMBIE 在 CI 上抓住了我:摘掉 checks.yml 的 continue-on-error 却忘了从 quality-debt-baseline.json 注销对应条目,登记在册的债务与实况分岔即红。这两条登记原因本就是「advisory while Wave 9-10 design-system refactor settles」(introduced_at 2026-08-11、review_by 2026-10-01)即带复审期限的临时豁免,销账正是棘轮要的结局;同时把 desktop 那条的 reason 从同款含糊措辞换成实测事实(CI 命令带 --max-warnings 0、0 errors 但 4 个 react-hooks/exhaustive-deps warning ⇒ exit 1、修它=改记忆化依赖属行为变更需独立切片),并把 issue 从 1575 改指 #2251 (#2274)

新增耦合事实(写进本 commit 以便下次不再漏):**改 checks.yml 的
continue-on-error 必须同步改 scripts/verify/quality-debt-baseline.json 的
soft_gates,并跑 verify-quality-debt-ratchet.py**。本 PR 第一版只在本地跑了
ci-gates / doc-ssot / action-runtimes 三个与 checks.yml 相关的门禁,漏了这个
棘轮,于是 CI 的 validate 红了一轮。soft_gates 从 6 条降到 4 条:
- 销账 2 条:frontend-web: Lint Web、frontend-mobile: Lint (mobile rules)
  (已翻硬,本 PR 用 CI 原命令证明 0 problems / 0 errors)
- 保留 4 条:go-edge-static: Lint(硬门在指纹棘轮,既定设计)、
  frontend-desktop: Lint(实测理由已更新,债务转 #2251)、
  validate: Verify i18n callsites ratchet(已知 CJK 基线回归在分批处理)、
  以及第 6 条原样不动。

验证:verify-quality-debt-ratchet.py **9 pass / 0 FAIL**(改前 2 FAIL / 8 pass)、
其负向自测 verify-quality-debt-ratchet.Tests.py **15 tests OK**、
verify-ci-gates / verify-doc-ssot / verify-action-runtimes 全 exit 0、
git diff --check 无空白错误。

Co-authored-by: Cursor <cursor@vectorcontrol.tech>
@DeliciousBuding
DeliciousBuding merged commit 09ec87c into master Sep 3, 2026
47 checks passed
@DeliciousBuding
DeliciousBuding deleted the fix/frontend-lint-real-gate branch September 3, 2026 07:11
DeliciousBuding added a commit that referenced this pull request Sep 3, 2026
…eateDefaultAgentProfileRequest 是它在全仓的唯一消费者(app/web/src/api/agentQueries.ts 里那句 t?.('agents.newDefault', { index }) ?? `新 Agent ${index}`,也正是 #2278 特意保留 t 参数的那一个 mapper),函数一走这个键就成了死键,被 verify-i18n-deadkeys.py 的 fail-closed 门禁抓到;两侧同时删,不走 baseline 登记(它不是动态键,是彻底的孤儿)

明卷:
- python3 scripts/verify/verify-i18n-deadkeys.py -> 通过
- 两个 bundle json.load 校验通过
- 主机在主 checkout 的合并树上复跑 validate job 的全部 62 条命令:仅本条与 commit-message 门禁两处红,其余 60 条全绿

Co-authored-by: Cursor <cursor@vectorcontrol.tech>
DeliciousBuding added a commit that referenced this pull request Sep 3, 2026
…eateDefaultAgentProfileRequest 是它在全仓的唯一消费者(app/web/src/api/agentQueries.ts 里那句 t?.('agents.newDefault', { index }) ?? `新 Agent ${index}`,也正是 #2278 特意保留 t 参数的那一个 mapper),函数一走这个键就成了死键,被 verify-i18n-deadkeys.py 的 fail-closed 门禁抓到;两侧同时删,不走 baseline 登记(它不是动态键,是彻底的孤儿)

明卷:
- python3 scripts/verify/verify-i18n-deadkeys.py -> 通过
- 两个 bundle json.load 校验通过
- 主机在主 checkout 的合并树上复跑 validate job 的全部 62 条命令:仅本条与 commit-message 门禁两处红,其余 60 条全绿

Co-authored-by: Cursor <cursor@vectorcontrol.tech>
DeliciousBuding added a commit that referenced this pull request Sep 3, 2026
…web/desktop 4 条契约收敛到单一来源 + 21 处过期注释/路径订正(净 −119 行) (#2279)

* refactor(frontend): 删掉 34 个全仓 0 引用导出的 export 修饰符(18 文件,实现保留)——按 #2274 C-4 清单逐条复核:每个符号仅本文件内使用、全仓代码/注释/barrel 均无外部消费(自建扫描器逐一验证未照抄车道结论);公共 barrel 未收录任何一个;删后 @agenthub/shared 与 @agenthub/workbench typecheck 均绿 (#2274)

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* refactor(frontend): 删掉 7 文件 13 个全仓 0 引用的真死导出符号(含实现与其描述性注释)——C-2 同族复核:BottomSheet.motion 3 常量、theme/motion resolveMotionTiming、hubClientTeamTypes 4 个无人消费的兼容别名、hubWS 两个从未被引用的内部事件名常量(同步修正 HubWSGapPayload 的文档注释,不再点名已删常量)、surfaceMetadata getSurfaceByWebRoute、e2eDataModeContract isE2ERequestAllowed(isBoundaryAllowed 仍有他处消费,保留)、workbenchApprovalEvents ApprovalJumpDetail;shared/workbench/mobile-rn typecheck 均绿 (#2274)

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* docs(shared): 修掉 5 处过期/不实注释(D-1/D-3/D-4/D-5,均有 git log/grep 证据)——diff.ts 与 index.ts 不再点名 #2151 已删除的 edge-server/internal/diff(改为陈述 TS 侧实现、无 Go 对应物,并指出现存 Go 侧只有 surfacing_diff.go 生成器与 diff_apply.go 应用器);normalizeEdgeEvents.test.ts 注释改为真实发射点 parser_ndjson_parse_msg.go:29,68(事件名常量 orchestration/contracts.go:163);vitest.config.ts 删掉不存在的 src/mock.ts 覆盖排除项及其编造的理由注释;normalizeHubMessages.ts pin 溯源注释重写为实况(REST 消费方 desktop useHubPinnedMessages / web useWebWorkbenchModel,WS 帧驱动 pinMap store,结论 HubMessage.pinned 不加保留) (#2246)

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* docs(mobile-rn): 去掉指向仓外一次性 lane 工件的裸 BLOCKED.md 指针(D-9)——mobilePlatform.ts 复审触发条件内联为可核验判据(Mobile Hub client 暴露 approval/runtimeEvidence/sandbox 契约或接通远程执行时再重新评估);同文件 mobileFriendlyError.ts 主机已修,未动 (#2246)

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* test(workbench): 修正 14 处过期路径字面量 app/shared/src/workbench/ → app/workbench/src/(D-11)——真实文件为 app/workbench/src/{RightInspector,AgentHubWorkbench}.tsx(已 ls 证实),测试断言与夹具两侧同步改,互相钉死的关系保留;shared+workbench 全量测试通过 (#2246)

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* docs(shared): 补掉 dc7f6bb 漏改的一处——HubWSGapPayload 的头注仍点名同批删掉的 HUB_WS_GAP_EVENT 常量,改为点名真正的投递口 HubWSHandle.onGap(desktop hubEventBridge.ts:466 与 web webHubRealtime.ts:322 都只经 onGap 消费它,事件名常量从加入起就没有任何引用) (#2274)

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* refactor(frontend): 清理写集内 102 处死 export 修饰符(全仓除定义外 0 引用)

判据:全仓 grep(含 test/barrel/md)除定义外 0 引用;以 typecheck + lint 双验证。

- 79 处:仅删除 export 修饰符(符号仍在定义文件内使用,例如
  DesktopPlatform/AppLanguage/UpdateExecutionTargetRequest 等)。
- 23 处:删修饰符后变成未使用(eslint no-unused-vars 报错,typecheck 未开
  noUnusedLocals 故以 eslint 为准),连实现一并删除:
  app/desktop/src/api/agentProfileQueries.ts:useHubCreate/Update/DeleteAgentProfile
  app/desktop/src/api/edgeClient.ts:deleteThreadPin、pinThreadItem
  app/desktop/src/api/hubQueries.ts:WorkspaceProjectPage
  app/desktop/src/platform/desktopPlatform.ts:desktopAgents、desktopConversations、
    desktopTranscript、resolveDesktopPreviewTranscript + 随之无用的 import/const
    (demoWorkbenchAgents、resolveDemoWorkbenchTranscript、WorkbenchAgent、
    TranscriptBlock、WORKBENCH_DEMO_FALLBACK_CONVERSATION_ID、
    DESKTOP_FALLBACK_CONVERSATION_ID)
  app/desktop/src/stores/modelSettingsStore.ts:DEFAULT_MODEL_ALIASES、
    DEFAULT_CC_SWITCH_PROVIDER_STATUS、obscureApiKey、revealApiKey、maskApiKey、
    CREDENTIAL_SALT(原仅经 export 组导出且 0 消费者)
  app/web/src/api/agentQueries.ts:createDefaultAgentProfileRequest
  app/web/src/api/projectQueries.ts:useCreateHubWorkspaceProjectThread、
    useSendHubWorkspaceProjectThreadMessage
  app/web/src/api/runEventReplay.ts:getRecoveryState、replayGapBlock、RecoveryState import
  app/web/src/config.ts:EVENT_LOG_MAX
  app/web/src/i18n/index.ts:setLanguagePreference
  app/web/src/platform/useWebWorkbenchModel.ts:webHubEmptyContacts(re-export 行)
- 验证:pnpm -r typecheck 5 包全绿;web test 271 passed;desktop test 458 passed;
  web lint 0 problems;desktop lint 10 problems(6 errors+4 warnings)与改前基线
  完全一致(4 条 warning 未增减);git diff --check 干净。

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* docs(desktop): hubEventBridge 头注指向真实 Edge 事件入口,断链修复 (#2246 / D-2)

- 原注释点名的 edgeEventBridge.ts 全仓从未存在(grep 仅此 1 命中即注释本身),
  会把读者引向空文件;真实入口是 platform/useDesktopEdgeEvents.ts +
  api/eventClient.ts(createEventStream 建流)。改为点名真实路径。

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* fix(desktop): 登录页错误处理回灌 web 的 i18n 规则,不再直出 err.message (#2256 D-P1-4)

- app/desktop/src/components/LoginForm.tsx:32-48:catch 块对齐 web
  LoginForm——OidcError 走 t('auth.error.oidc.<code>', { defaultValue:
  t('auth.error.oidc.default') }),非 OidcError 走 t('auth.error.oidc.default'),
  删除直出 err.message 的通道与硬编码英文 defaultValue 'Login failed'。
  键在 desktop locale 双语均已存在,defaultValue 原本就是不可达的死字面量。
- app/desktop/src/__tests__/LoginForm.test.tsx:改了两条断言并点名理由——
  原 'shows TokenDance errors from the auth hook' 与 'falls back to the
  localized unavailable error...' 断言的是旧缺陷行为(alert 里出现原始
  'Hub login unavailable' / 'auth.error.tokenDanceUnavailable'),本次改为
  钉住修复后行为(auth.error.oidc.default,且不含原始串),并新增一条
  OidcError 码解析断言;未删除任何用例,未放宽。

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* refactor(web): hubClient.ts 删除 shared DTO 的本地副本,不再遮蔽 SSOT 同名别名 (#2256 D-P2-3)

- 删除 app/web/src/api/hubClient.ts 里的 AgentInstance / PendingAgentTask
  两个 interface(与 shared hubClientTeamTypes.ts:606-634 逐字全等)。
- 消费方(webPlatform.ts:17,20)经 export * from '@shared/hub/hubClient'
  解析到 shared 的 AgentInstance/PendingAgentTask 别名,值逐字相同,
  0 个消费者的 import 需要改;shared 侧给 Hub* 加字段时 web 将出现编译错误,
  不再静默漂移。
- 关于牵出的 6 对同名镜像测试(hubClient/hubAuth/hubTokenStorage/useAuth/
  AuthPage/ThemeContext .test.*):逐对 diff 复核后确认**不是副本**
  (行数/断言均不同,各自钉 web 包装器与 desktop 客户端的表面行为),
  因此无测试可合并/删除——本次未删任何测试;证据见 round-69 lane-E REPORT 第 3 节。

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* fix(frontend): 执行目标健康态白名单收敛——web 补 registered、两端去掉 | string 吸收、desktop 的 online 改计 healthy (#2256 D-P2-1/D-P3-1)

- app/web|desktop/src/api/hubClient.ts:ExecutionTargetHealthState 去掉
  '... | string'(字面量被吸收、白名单零类型安全的根因),收成服务端
  target_health.go 取值域的 8 项联合;ExecutionTargetTrustLevel 收成 4 项联合。
- app/web/src/api/executionTargetQueries.ts:healthStates 白名单补
  'registered'(已绑定但尚无存活证据的正常生命周期态),与 desktop 对齐
  (8 项);新增测试钉住 registered 透传而非落入 unknown。
- app/desktop/src/api/executionTargetQueries.ts:summarizeExecutionTargets 的
  healthy 分支补 'online'(与 web 口径一致,online 不再落入 unknown)。
- app/desktop/src/api/hubClient.ts:toSharedTarget/包装器参数改用 shared 的
  HubExecutionTargetRequest 契约(desktop 本地 shape 可赋值给它),
  收紧类型后的 contravariance 编译红以此修掉,不改任何收窄结论。
- 待产品裁决(未发明):desktop 是否补 mismatch/stale 计数、web 是否去掉,
  见 round-69 lane-E REPORT。

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* fix(web): 执行目标清单收敛到 desktop 的 50×10 cursor 翻页,取满 500 并如实报 hasMore (#2256 D-P1-3)

- fetchExecutionTargets 从单次 pageSize=50 改为与 desktop 同策略的
  cursor 循环(50×10);循环耗尽返回 hasMore:true,避免第 51 台起静默截断。
- 纯收敛,仅改 app/web 侧,shared 不动。
- 关于 executionTargetQueries.test.ts:24 的 ?pageSize=50 断言:实测收敛后
  **并未变红**——该断言断言的是第一页 URL,而 qs() 不序列化 undefined,
  第一页 URL 仍为 ?pageSize=50。因此本条**未改该断言**(它仍然钉住第一页
  URL,不是错误断言),只新增两条断言钉住多页 cursor 与 500 上限行为;
  无任何断言被放宽。

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* chore(i18n): 删掉 web 的 agents.newDefault 键(en/zh 各一行)——cd3b7a4b 删掉的 createDefaultAgentProfileRequest 是它在全仓的唯一消费者(app/web/src/api/agentQueries.ts 里那句 t?.('agents.newDefault', { index }) ?? `新 Agent ${index}`,也正是 #2278 特意保留 t 参数的那一个 mapper),函数一走这个键就成了死键,被 verify-i18n-deadkeys.py 的 fail-closed 门禁抓到;两侧同时删,不走 baseline 登记(它不是动态键,是彻底的孤儿)

明卷:
- python3 scripts/verify/verify-i18n-deadkeys.py -> 通过
- 两个 bundle json.load 校验通过
- 主机在主 checkout 的合并树上复跑 validate job 的全部 62 条命令:仅本条与 commit-message 门禁两处红,其余 60 条全绿

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

* chore(frontend): 修掉本批自己引入的 2 处 EOF 空行——e35c7387 删掉 mobile-rn theme/motion.ts 的 resolveMotionTiming、cd3b7a4b 删掉 web api/hubClient.ts 的本地 DTO 副本后各留下一个文件尾空行,被 validate 的 Check whitespace(git diff --check "origin/master...HEAD")判红;两条 lane 各自只跑了 git diff --check(工作树,无 range)所以都没看见

Co-authored-by: Cursor <cursor@vectorcontrol.tech>

---------

Co-authored-by: DeliciousBuding <DeliciousBuding@users.noreply.github.com>
Co-authored-by: Cursor <cursor@vectorcontrol.tech>
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