fix(server): 修复 INT-184 与 INT-186 合并后的语义冲突(main 编译失败) #169

Merged
fjbobo merged 2 commits from fix/int184-int186-merge into main 2026-11-04 11:00:40 +08:00
Owner

相关需求

INT-184(main 集成修复,无独立需求条目):#17

改动内容

405d131a 把 INT-184(#166)与 INT-186(#167)合并进 main 时,两分支改了同一批文件但没有文本冲突,整合状态编译失败——即 main 目前是坏的。本 PR 修复这三处语义冲突:

  • AgentScreenshotImage 签名:INT-186 把返回改成 (AgentScreenshotFile, error)(缩略图/缩放变体下发),INT-184 R13 的「缺失文件按原因归因」分支仍写 return "", "", errs.New(...) → too many return values。改为 AgentScreenshotFile{},行为不变:文件缺失仍按 40406 带出已记录的 asset.Error(而非落到 handler 的 500)。
  • review_screenshot_ast_test:INT-186 把 ReviewAgentScreenshot.Url 从 string 改成 *string(omitempty,失败行字段缺省),INT-184 的「缺失文件不给 URL」用例需按指针语义断言(Url == nil)。
  • review_screenshot_scale_test:40406 断言从 errors.Is 改为按错误码。理由:INT-184 的缺失文件归因返回同码带原因的消息(这是 errs 包既有约定,ErrReviewResultInvalid 注释明确「同码 40004,消息里写明具体字段」),而 AppError 没有按码的 Is 方法,errors.Is 对定制消息实例不成立。实测给 AppError 全局加按码 Is 会给 3 处依赖「同码区分」的既有逻辑带来行为变化(TestBotPersonaFrozenDuringHold 等失败),故不采用全局方案,只把该断言改成按码判定。

修改范围

  • server/internal/service/review_assets.go(缺失文件归因分支适配新签名)
  • server/internal/service/review_screenshot_ast_test.go(Url 指针语义断言)
  • server/internal/service/review_screenshot_scale_test.go(40406 按码断言 + 调用行)

本地验证

在整合后的代码(405d131a + 本 PR 三个修复)上跑:

检查命令 结果
cd web && pnpm api-types --check 通过(openapi-typescript --check 生成物一致)
cd web && pnpm check(lint + typecheck) 通过,eslint 0 警告、tsc 零错误
cd server && gofmt -l . / go vet ./... 干净,零输出
cd server && go test -count=1 ./... 通过,19 个包全绿(含 INT-184 保留策略与 INT-186 缩略图两侧用例)
  • 验证方式(命令 / 无头浏览器):go test -count=1 ./... 在整合状态全量运行;本 PR 只改服务端类型适配与测试断言,无界面变化

  • 启动命令:不适用(无运行时行为变化,纯编译/测试适配)

  • 验证提交 SHA:b080d936

  • 应用可以启动(编译失败已修复,整合状态 go build ./... 通过)

  • 异常或空状态已验证(覆盖:文件缺失走 40406 带原因、缩略图缩放变体生成、失败行字段缺省)

已修复的基线问题

  • main 编译失败(INT-184 + INT-186 合并语义冲突),发现命令 cd server && go build ./...(internal/service/review_assets.go:1064: too many return values),修复提交 b080d936。

端到端截图

无界面变化(纯服务端编译适配 + 测试断言),按模版删去对比表。替代证据:整合状态 go build/go vet/go test -count=1 ./... 全绿(19 包),以及 TestAgentScreenshotImageScale(INT-186 侧 40406 语义与缩略图路径)与 INT-184 的缺失文件归因用例同时通过。

未验证范围与原因

  • 本 PR 不在隔离实例上做端到端 UI 演示:改动不含运行时行为变化(编译适配 + 测试断言),行为等价性由整合状态全量测试覆盖。
  • 两个功能面的交互(缩略图请求命中「重下失败的保留引用」行)没有真实浏览器路径演示:该组合由单测覆盖(TestAgentScreenshotImageScale 的 missing 用例 + TestAgentScreenshotsMissingFileReportsReason)。

API 变更说明

无(INT-186 的 API 字段变更已在 #167 完成;本 PR 只是让实现与它对齐)。

创建 PR 前完成

  • 本地验证表已填完,每条检查零警告、零错误、零失败
  • 端到端截图已贴入,或已写明无需截图的原因
  • 补充需求编号(如果存在):INT-184(集成修复)
  • 变更影响范围已补充到 PR 描述中

审查意见处理

  • 逐条处理所有审查评论:真实问题修复后回复并重新验证;误报或不适用意见回复理由。(2 轮:R1 2×Note 全部 Act on 并补变异验证回归闸,R2 0×P0–P2 + 0 Note 通过)
  • 推送新提交后按 $pr-review-loop 自动等待审查结果并处理新意见,直到收敛(第 2 轮 fastship-bot 全部组合通过,检查全过)
## 相关需求 INT-184(main 集成修复,无独立需求条目):https://fj.frp.musiver.cn/fjbobo/fast_ship/issues/17 ## 改动内容 `405d131a` 把 INT-184(#166)与 INT-186(#167)合并进 main 时,两分支改了同一批文件但**没有文本冲突**,整合状态编译失败——即 main 目前是坏的。本 PR 修复这三处语义冲突: - **`AgentScreenshotImage` 签名**:INT-186 把返回改成 `(AgentScreenshotFile, error)`(缩略图/缩放变体下发),INT-184 R13 的「缺失文件按原因归因」分支仍写 `return "", "", errs.New(...)` → `too many return values`。改为 `AgentScreenshotFile{}`,行为不变:文件缺失仍按 40406 带出已记录的 `asset.Error`(而非落到 handler 的 500)。 - **`review_screenshot_ast_test`**:INT-186 把 `ReviewAgentScreenshot.Url` 从 `string` 改成 `*string`(`omitempty`,失败行字段缺省),INT-184 的「缺失文件不给 URL」用例需按指针语义断言(`Url == nil`)。 - **`review_screenshot_scale_test`**:40406 断言从 `errors.Is` 改为按错误码。理由:INT-184 的缺失文件归因返回**同码带原因**的消息(这是 errs 包既有约定,`ErrReviewResultInvalid` 注释明确「同码 40004,消息里写明具体字段」),而 `AppError` 没有按码的 `Is` 方法,`errors.Is` 对定制消息实例不成立。实测给 `AppError` 全局加按码 `Is` 会给 3 处依赖「同码区分」的既有逻辑带来行为变化(`TestBotPersonaFrozenDuringHold` 等失败),故不采用全局方案,只把该断言改成按码判定。 ## 修改范围 - `server/internal/service/review_assets.go`(缺失文件归因分支适配新签名) - `server/internal/service/review_screenshot_ast_test.go`(Url 指针语义断言) - `server/internal/service/review_screenshot_scale_test.go`(40406 按码断言 + 调用行) ## 本地验证 在整合后的代码(`405d131a` + 本 PR 三个修复)上跑: | 检查命令 | 结果 | | --- | --- | | `cd web && pnpm api-types --check` | 通过(`openapi-typescript --check` 生成物一致) | | `cd web && pnpm check`(lint + typecheck) | 通过,eslint 0 警告、tsc 零错误 | | `cd server && gofmt -l .` / `go vet ./...` | 干净,零输出 | | `cd server && go test -count=1 ./...` | 通过,19 个包全绿(含 INT-184 保留策略与 INT-186 缩略图两侧用例) | - 验证方式(命令 / 无头浏览器):`go test -count=1 ./...` 在整合状态全量运行;本 PR 只改服务端类型适配与测试断言,无界面变化 - 启动命令:不适用(无运行时行为变化,纯编译/测试适配) - 验证提交 SHA:b080d936 - [x] 应用可以启动(编译失败已修复,整合状态 `go build ./...` 通过) - [x] 异常或空状态已验证(覆盖:文件缺失走 40406 带原因、缩略图缩放变体生成、失败行字段缺省) ### 已修复的基线问题 - **main 编译失败**(INT-184 + INT-186 合并语义冲突),发现命令 `cd server && go build ./...`(`internal/service/review_assets.go:1064: too many return values`),修复提交 `b080d936`。 ## 端到端截图 无界面变化(纯服务端编译适配 + 测试断言),按模版删去对比表。替代证据:整合状态 `go build`/`go vet`/`go test -count=1 ./...` 全绿(19 包),以及 `TestAgentScreenshotImageScale`(INT-186 侧 40406 语义与缩略图路径)与 INT-184 的缺失文件归因用例同时通过。 ## 未验证范围与原因 - 本 PR 不在隔离实例上做端到端 UI 演示:改动不含运行时行为变化(编译适配 + 测试断言),行为等价性由整合状态全量测试覆盖。 - 两个功能面的交互(缩略图请求命中「重下失败的保留引用」行)没有真实浏览器路径演示:该组合由单测覆盖(`TestAgentScreenshotImageScale` 的 missing 用例 + `TestAgentScreenshotsMissingFileReportsReason`)。 ## API 变更说明 无(INT-186 的 API 字段变更已在 #167 完成;本 PR 只是让实现与它对齐)。 ## 创建 PR 前完成 - [x] 本地验证表已填完,每条检查零警告、零错误、零失败 - [x] 端到端截图已贴入,或已写明无需截图的原因 - [x] 补充需求编号(如果存在):INT-184(集成修复) - [x] 变更影响范围已补充到 PR 描述中 ## 审查意见处理 - [x] 逐条处理所有审查评论:真实问题修复后回复并重新验证;误报或不适用意见回复理由。(2 轮:R1 2×Note 全部 Act on 并补变异验证回归闸,R2 0×P0–P2 + 0 Note 通过) - [x] 推送新提交后按 `$pr-review-loop` 自动等待审查结果并处理新意见,直到收敛(第 2 轮 fastship-bot 全部组合通过,检查全过)
405d131a 合并时两分支改动同一批文件但无文本冲突,整合状态编译失败:

- AgentScreenshotImage:INT-186 把签名改成返回 (AgentScreenshotFile,
  error),INT-184 R13 的缺失文件归因仍返回三值 → 编译错误。改为
  AgentScreenshotFile{}(行为不变:40406 带已记录原因)。
- review_screenshot_ast_test:INT-186 把 ReviewAgentScreenshot.Url 改成
  *string,INT-184 的缺失文件用例断言需适配指针语义(无 URL = nil)。
- review_screenshot_scale_test:40406 断言改为按错误码——INT-184 的缺失
  文件归因返回同码带原因的消息,AppError 无按码的 Is 方法,errors.Is 对
  定制消息实例不成立(全局加 Is 实测会破坏 3 处既有同码区分逻辑,故不
  采用)。

整合状态验证:go build/vet/gofmt 干净,go test -count=1 ./... 19 包全绿
(含 INT-184 保留策略与 INT-186 缩略图两侧用例),web api-types --check
通过。
Collaborator

代码审查 · e0ed7e2 · 第 2 轮

全部组合通过,未发现 P0–P2 问题。

组合 状态 P0 P1 P2 Note
cliproxyapi/deepseek-v4.1-flash · pi 完成 0 0 0 0

cliproxyapi/deepseek-v4.1-flash · pi

thinking=low

本轮新增改动仅 14 行(列表注释对齐取图端点现状 + 缺失行原因断言),未发现新问题;上一轮 2 条 Note 均已按建议修复,且回归闸经本地测试验证有效。

复审说明:推送新提交后会自动重新审查。

<!-- fast-ship-code-review --> ## 代码审查 · e0ed7e2 · 第 2 轮 全部组合通过,未发现 P0–P2 问题。 | 组合 | 状态 | P0 | P1 | P2 | Note | | --- | --- | --- | --- | --- | --- | | cliproxyapi/deepseek-v4.1-flash · pi | 完成 | 0 | 0 | 0 | 0 | ### cliproxyapi/deepseek-v4.1-flash · pi <sub>thinking=low</sub> > 本轮新增改动仅 14 行(列表注释对齐取图端点现状 + 缺失行原因断言),未发现新问题;上一轮 2 条 Note 均已按建议修复,且回归闸经本地测试验证有效。 复审说明:推送新提交后会自动重新审查。
fastship-bot 第 1 轮 0×P0-P2,2 条 Note 全部 Act on:

- Note1 断言只比错误码会削弱 R13 的「按原因归因」契约:给 asset-missing
  行种上 asset.Error(「下载超时」),断言 appErr.Message 等于该原因。
  变异验证:把实现改回裸 sentinel(丢 reason 优先级)时该用例失败
  (message = "问题图片不存在"),恢复后通过——退化不再随 404 语义静默
  通过。
- Note2 列表分支注释「端点此刻只会 500」与同一提交后的实现相反:取图
  端点对路径在而文件缺失的行已按 40406 带同一原因返回。改为现状描述,
  并写明列表仍不给 URL 的理由(不为已知不可用项发起请求)。

server 全量 go test -count=1 ./... 19 包全绿 + gofmt + vet 干净。
Author
Owner

PR#169 第 1 轮 Note 处置(e0ed7e25)

第 1 轮 0×P0–P2,2 条 Note 全部 Act on:

  1. Note1 契约覆盖被削弱:属实——只比错误码的话,改回裸 sentinel 或丢掉 asset.Error 优先级仍全绿。已补:给 asset-missing 行种 error = "下载超时",断言 appErr.Message 等于该原因。并做了变异验证:把实现改回裸 sentinel 时该用例失败(message = "问题图片不存在"),恢复后通过——R13 的「按原因归因」契约现在有回归闸。
  2. Note2 注释与实现相反:属实——同一提交后取图端点对「路径在而文件缺失」已按 40406 带原因返回,不再是 500。注释改为现状描述,并写明列表仍不给 URL 的理由(审查员不需要为已知不可用项发起请求)。

server 全量 go test -count=1 ./... 19 包全绿 + gofmt + vet 干净。推送自动触发下一轮审查。

## PR#169 第 1 轮 Note 处置(e0ed7e25) 第 1 轮 0×P0–P2,2 条 Note 全部 Act on: 1. **Note1 契约覆盖被削弱**:属实——只比错误码的话,改回裸 sentinel 或丢掉 `asset.Error` 优先级仍全绿。已补:给 `asset-missing` 行种 `error = "下载超时"`,断言 `appErr.Message` 等于该原因。并做了变异验证:把实现改回裸 sentinel 时该用例失败(`message = "问题图片不存在"`),恢复后通过——R13 的「按原因归因」契约现在有回归闸。 2. **Note2 注释与实现相反**:属实——同一提交后取图端点对「路径在而文件缺失」已按 40406 带原因返回,不再是 500。注释改为现状描述,并写明列表仍不给 URL 的理由(审查员不需要为已知不可用项发起请求)。 server 全量 `go test -count=1 ./...` 19 包全绿 + gofmt + vet 干净。推送自动触发下一轮审查。 <!-- pr-review-loop:reply -->
fjbobo merged commit 28a908b756 into main 2026-11-04 11:00:40 +08:00
fjbobo deleted branch fix/int184-int186-merge 2026-11-04 11:00:40 +08:00
Sign in to join this conversation.
No description provided.