Skip to content

波次0-P2 模块卫生:hello 认证去重 + /life/* 收紧 + 参考实现达标(#82) - #84

Merged
HandyWote merged 2 commits into
m1/devfrom
m1/issue-82
Sep 9, 2026
Merged

波次0-P2 模块卫生:hello 认证去重 + /life/* 收紧 + 参考实现达标(#82)#84
HandyWote merged 2 commits into
m1/devfrom
m1/issue-82

Conversation

@HandyWote

Copy link
Copy Markdown
Contributor

背景

issue #82(波次0-P2):M0 审查发现 hello 参考实现带病——两份认证实现一份是死代码、/life/* 裸奔、export 形状无校验、样式裸 hex。#45①② 的落地。

改动

1. 认证去重(#45①)

  • modules/hello/src/index.tscreateAuthMiddleware(导出但从未挂载的死代码,grep 全仓零引用)
  • 认证统一走 requireAuth 收口(本文件唯一验签实现,/api/* 与 /life/* 共用)

2. /life/* 收紧(#45②)

  • GET /life/exportPOST /life/purgerequireAuth,与 /api/count 同规:无 Bearer → 401 人话(不含 jose/jwt 原始错误);缺 CORE_JWKS_JSON → 503;export 同时补齐 storage 缺绑定 503(与 count/purge 一致,不再静默导出 0 行)
  • 卸载专用凭据设计留给 M1 M1-a 管理界面骨架(模块启停 + 成员列表) #17(本 issue 不做)

3. export 形状机器校验(喂活 contracts)

  • 测试改用 ExportBundleSchema.parse 断言 /life/export 响应形状(version/moduleId/exportedAt/tables/files),lifecycle-schema.ts 从此被真实消费

4. 页面样式 tokens 化(§6.5 单源)

  • 内联 <style> 裸 hex 全部改 var(--color-*)(与 apps/shell/src/tokens.css 同名),间距/字号/圆角同步取 tokens(--space-* / --font-size-* / --radius-*)
  • ⚠ 一处设计说明:模块页运行在 shell iframe 独立文档中,CSS 自定义属性不跨文档,页面必须自带令牌值——故 :root 保留一份与 tokens.css 同名同值的副本(值以 rgb() 表达,与十六进制等价且源内零裸 hex,满足验收 grep)。唯一单源的终极形态(令牌下发/共享 css 资产)建议后续轮次做

5. contracts 契约真值标注

  • packages/contracts/src/lifecycle.ts 注释标注:M0/M1 真值 = HTTP 端点(GET /life/export、POST /life/purge);ModuleLifecycle 对象接口 M6 卸载编排时接入,此前只是形状约定

测试

  • 新增:匿名调 /life/export/life/purge → 401 人话
  • 更新:export 用例喂活 ExportBundleSchema.parse(带 token;形状断言保留 rows 深等);purge 用例按新契约带 token
  • 旧测试零删减(12 → 13 条)
  • 验证:pnpm -r typecheck && pnpm -r test && pnpm -r build 全绿(7 包 typecheck 过;test 7 包全过;build 过)
  • grep -E '#[0-9a-fA-F]{3,8}' 于 modules/hello 零命中

验收对照

验收项 状态
1. 匿名调 /life/* → 401;带 token → 200,export 过 ExportBundleSchema ✅ 测试覆盖(新增 401 用例 + export parse 用例)
2. 三件套全绿,旧测试零删减 ✅ 干净 worktree 验证;12→13 条,零删减
3. 样式零裸 hex(grep 零命中) ✅ modules/hello 全树 grep 零命中
4. agent-browser 走查 hello 页面无样式回归 ⏳ 待主会话走查(本会话无浏览器环境)

附属观察(供主会话,非本 PR 范围)

  1. 共享工作目录并发风险:本会话执行期间工作树被并行会话切到 m1/issue-83(reflog:HEAD@{0}),工作目录同时残留 波次0-P1 后端卫生:token 契约对真 + core-api 拆分 + 身份行接通 #81/波次0-P3 前端卫生:壳拆分 + 死代码清理 + 手机登出 #83 的未提交改动。本 PR 在独立 worktree(/tmp/unself-issue82)中验证提交,未混入任何外来改动;但建议主会话确认并行会话的分工与目录隔离策略(AGENTS「一个 issue 一个新会话」在共享 tree 下会互相踩)
  2. 共享树中 tsconfig.base.json 有未提交改动(新增 "noUnusedLocals": true),会让 base 的 packages/ui typecheck 挂(input.vue TS6133)——疑似 波次0-P1 后端卫生:token 契约对真 + core-api 拆分 + 身份行接通 #81/波次0-P3 前端卫生:壳拆分 + 死代码清理 + 手机登出 #83 侧的本地实验,未纳入本 PR;三件套验证在干净 worktree 完成

- 删 createAuthMiddleware 死码(从未挂载,认证统一 requireAuth 收口,#45 遗留项①)
- GET /life/export、POST /life/purge 挂 requireAuth 与 /api/count 同规(缺 CORE_JWKS_JSON 503、无 Bearer 401 人话;#45 遗留项②)
- 页面内联样式改 var(--color-*) 同名 token(tokens.css 单源),源内零裸 hex(grep 零命中)
- 测试:export 响应喂活 ExportBundleSchema.parse(lifecycle-schema.ts);新增匿名调 /life/* → 401 用例;export/purge 用例按新契约带 token

Signed-off-by: HandyWote <huangyinghui01@corp.netease.com>
ModuleLifecycle 对象接口暂未运行时接入——真值是 GET /life/export + POST /life/purge;对象接口 M6 卸载编排时接入

Signed-off-by: HandyWote <huangyinghui01@corp.netease.com>
@HandyWote
HandyWote merged commit dbc7123 into m1/dev Sep 9, 2026
1 check passed
@HandyWote
HandyWote deleted the m1/issue-82 branch September 9, 2026 07:09
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