Skip to content

fix(#60): T2 list 快照红测+G1 清理+x-request-id+OIDC 失败态+r2 文本格式(fixer-c) - #63

Merged
HandyWote merged 4 commits into
m0/devfrom
fix/task-c
Sep 8, 2026
Merged

fix(#60): T2 list 快照红测+G1 清理+x-request-id+OIDC 失败态+r2 文本格式(fixer-c)#63
HandyWote merged 4 commits into
m0/devfrom
fix/task-c

Conversation

@HandyWote

Copy link
Copy Markdown
Contributor

概述

issue #60 的 P1 次项 + P2 一批(fixer-c 工作包),基于 origin/m0/dev@06ce90e(已含 fixer-a #59、fixer-b #62)线性叠加:

  1. T2 红测 + 修复buildManifestSnapshot 读不了 YAML list,requires/capabilities 硬编码 → 快照/token caps 授牌错误
  2. G1 空洞断言清理:ui / module-sdk / hello 三处恒真与自证断言改行为断言
  3. D8/T6:core-api x-request-id 全局中间件 + 四类路由响应头断言
  4. OIDC callback 失败态:不再 500,统一 302 回 /login?error=<短码> + 5 条路由级用例
  5. T4r2 bucket list fake 改 wrangler v4 真实文本格式 + parseR2BucketList 直测

提交(均为 -s,线性、无 merge commit):

commit 内容
edef773 fix(deploy): buildManifestSnapshot 解析 YAML list(先红测后修)
92c230e test(deploy): r2 bucket list fake 真实文本格式 + parseR2BucketList 直测
23d4cab test(ui,sdk,hello): 清 G1 恒真/自证断言,改行为断言
ffc6eef feat(core-api): x-request-id 中间件 + OIDC callback 失败态 302 回登录页

验收对照(issue #60 标准)

标准 / 审核项 落地 对照
集成为主、少量单测 core-api 新用例走 app.request 路由级;deploy 解析器留纯函数单测
fake factory 统一供给 两个新 core-api 测试文件 CORE_DB 复用 test-factory.createCoreDb()(真 sqlite + 真迁移),无手搓假 D1
真实业务行为 + 边界 list/flow 边界、r2 文本/ANSI/CRLF/旧 JSON、OIDC state/过期/IdP error/Cookie 损坏、x-request-id 401/403/503
测试=可执行预期,禁恒真/自证 G1 三处清零;断言行为结果(渲染产物、parent 未触达、篡改签名 401)
审核 T2 非默认值 list manifest 全字段断言(修复前 3 条红,证据见提交说明)
审核 §2.2 G1 ui.test.ts 全文件、sdk.test.ts 无 window、hello.test.ts 自证 三处清理
审核 D8/T6 中间件对所有响应回写 x-request-idreq-+16hex),4 类路由断言 + 唯一性/格式
审核 §2.3 OIDC 失败态 callback 失败矩阵:成功 302 / OIDC 失败 302 error / Cookie 缺失损坏 400 / 未配置 503;500 路径消除
审核 T4 fake 输出与 wrangler v4 formatLabelledValues 文本一致;解析分支有直测
全部代码文件 SPDX 头 11 个改动/新增文件全部带 // SPDX-License-Identifier: AGPL-3.0-only

验证(本机全绿)

pnpm -r typecheck  exit=0   (7 包)
pnpm -r test       exit=0
  contracts 23 · ui 7 · module-sdk 35 · shell 39
  core-api 10 files/74 · deploy-cloudflare 7 files/46 · hello 10
pnpm -r build      exit=0

发现与脱节(记录,部分超出本任务允许改动范围)

  1. 任务书「勿碰 deploy/」与第 1/5 条自相矛盾**:第 1/5 条明确要求改 deploy/cloudflare/{src/registry.ts,src/provision.ts,test/*},而改动范围又写「勿碰 deploy/**」。按明确条目执行;本 PR 的 deploy 改动只落在 registry.tsprovision.tstest/{registry-manifest,provision-registry,steps}.test.ts,与 fixer-a 的 assemble/smoke/steps(src)/README 无文件重叠,rebase 后全绿。
  2. flow 式 list 未支持:PRODUCT_SPEC §5.4 示例用 requires: [identity] / capabilities: [messaging](flow 式),真实 manifest.yaml 是 block 式;本次按任务书只实现最小 block 解析。若模块写 flow 式,capabilities 会被当标量丢弃 → 静默变 [](schema 无 min 不拦截)。建议后续补 flow 式或规范统一为 block 式。
  3. LoginView.vue 注释过期apps/shell/src/LoginView.vue 仍写「core-api callback 失败时不会回本页(服务端直接报错)」;本 PR 后失败正是 302 回 /login?error=。前端行为已对齐(只把 error 有无映射为人话卡片),注释属 shell 侧跟进。
  4. OIDC 错误码与 oidc.ts 消息字符串耦合oidc.ts 不在本任务允许改动清单,分类只能按错误消息前缀匹配;若文案重构会安全降级为 oidc_failed(fail-closed)。建议后续在 oidc.ts 引入带 code 的结构化错误。
  5. 壳侧 setup-api.test.ts 仍把 headers.get 桩成恒 null(审核 T6 同项):本 PR 只补了 core-api 产出面;壳侧「响应头→ErrorCard requestId」的契约测试仍缺,建议后续在 shell 侧补(本任务改动范围不含 apps/shell)。
  6. requires 取值越界即整体失败:清单写 requires: [superuser]ModuleManifestSchema.parse 抛错、部署中止(符合「当前必为 identity」契约的 fail-fast,未来扩枚举需同步)。
  7. manifest.entry 恒被重写(§5.3 同域路径制设计使然):第三方模块声明独立域名 entry 会被静默忽略,属已知设计取舍,供产品侧知悉。

不在本 PR 范围

审核 T2:requires/capabilities 是 YAML list,旧逐行正则只读标量,
快照硬编码 ['identity']/['demo'] → 模块自定义 capabilities 时 token caps 授牌错误。
先写红测(非默认值 list manifest 全字段断言,修复前 3 条红),
再以最小解析(标量正则 + list 项归属最近空值顶层 key)修正,并让 description 进快照。

Ref #60

Signed-off-by: HandyWote <huangyinghui01@corp.netease.com>
审核 T4:wrangler v4 `r2 bucket list` 输出 formatLabelledValues 文本
(name: 对齐 + creation_date,无 --json),旧 fake 只喂 JSON → 真实解析分支零测试,
真机格式一变就重复 create(already exists)。
抽 parseR2BucketList 并直测文本/空/旧 JSON/去重/ANSI/CRLF,steps fake 同步改文本。

Ref #60

Signed-off-by: HandyWote <huangyinghui01@corp.netease.com>
审核 §2.2 G1:
- ui.test.ts 删「导出存在性 + 版本号」恒真,改 vue/server-renderer 真渲染
  (UButton 变体/disabled、UErrorCard requestId/详情折叠、UInput、UCard);
- sdk.test.ts 无 window 用例不再只断言 not.toThrow,改为观测不得触达 parent,
  装 window 后投递仍生效(证明守卫是运行时条件而非 no-op 桩);
- hello.test.ts 身份行自证循环改为验签行为断言:正签 token 200、同签名篡改
  payload → 401(claims 只能来自签发方签过的 token)。

Ref #60

Signed-off-by: HandyWote <huangyinghui01@corp.netease.com>
审核 D8/T6:壳侧三处消费响应头 x-request-id(ErrorCard 展示 request id),
core-api 全源码零产出 → requestId 恒 undefined,死功能。
新增全局中间件每请求生成 req-<16hex> 并回写所有响应(含 401/403/503)。

审核 §2.3 OIDC 失败态:callback 换 token/验签抛错此前未捕获 → 500。
改为清流程 Cookie + 302 /login?error=<短码>(state 不匹配/过期/IdP error 各有码),
Cookie 缺失/损坏仍 400;成功链路不变。

新增路由级用例:request-id.test.ts(auth/registry/setup/token 四类路由 + id 唯一/格式)、
oidc-callback-failures.test.ts(5 条失败态)。CORE_DB 复用共享 test-factory 真 sqlite。

Ref #60

Signed-off-by: HandyWote <huangyinghui01@corp.netease.com>
@HandyWote
HandyWote merged commit 4a997a8 into m0/dev Sep 8, 2026
1 check passed
@HandyWote
HandyWote deleted the fix/task-c branch September 8, 2026 11:11
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