| event_payload |
{"ref":"refs/heads/main","befo {"ref":"refs/heads/main","before":"63ff31f256e45886e0a52d5e819ef7b3730eba9b","after":"59265a6ffc4d0d4ffda878fd880a5d5a308720bb","compare_url":"https://gitea.g-hi.com/luoanwu/enterprise-platform/compare/63ff31f256e45886e0a52d5e819ef7b3730eba9b...59265a6ffc4d0d4ffda878fd880a5d5a308720bb","commits":[{"id":"59265a6ffc4d0d4ffda878fd880a5d5a308720bb","message":"fix(workbench): 客户端独有的状态不得进首帧——修掉两处水合不一致(D-12)\n\nD-12 登记的是顶栏那一处,查下来是两处同病,其中一处每次打开登录页都在报:\n\n- `app-nav.tsx` 直接渲染会话里的 subject。工作台是 output: \"export\",HTML 在构建期定死,\n 里面不可能有会话,而首帧客户端已经有了。只在 sessionStorage 有令牌时触发。\n- `login/page.tsx` 的 `typeof window === \"undefined\" ? null : readOidcConfig(...)`:服务端恒为\n null(渲染「缺配置」),浏览器算得出配置(渲染登录按钮),**必然**对不上,与有没有会话无关。\n 同源托管记录 §4.3 记的那个「缺配置」就是产物原文,客户端随后整片换掉了。\n\n定位用的是对照实验而不是读代码猜:清空 sessionStorage 重载 / 不报错,植入会话再重载即报;\n重载 /login/ 在无会话时也报。\n\n修法统一为新增的 useMounted():客户端独有的状态(sessionStorage 会话、window.location)\n等挂载之后再渲染,首帧与构建期产物逐字一致。没有复用 store 的 hydrated 标志——那面旗由\nProviders 的 effect 翻,时序上依赖别的组件;组件自己的 useState(false) 在水合那一帧恒为 false。\n\n登录页因此多出第三种状态「读取中」。这与本仓一贯口径一致:配置还没读到时,既不能说\n「缺配置」也不能说「可登录」。\n\n验证:workbench typecheck / lint 通过;next build 六路由导出;重载 /login/ 与植入会话硬跳转 /\n均不再新增 hydration 报错。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/enterprise-platform/commit/59265a6ffc4d0d4ffda878fd880a5d5a308720bb","author":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"committer":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"verification":null,"timestamp":"2026-09-18T16:41:05-07:00","added":["runtime/apps/workbench/src/lib/use-mounted.ts"],"removed":[],"modified":["runtime/apps/workbench/src/app/login/page.tsx","runtime/apps/workbench/src/components/app-nav.tsx"]}],"total_commits":0,"head_commit":{"id":"59265a6ffc4d0d4ffda878fd880a5d5a308720bb","message":"fix(workbench): 客户端独有的状态不得进首帧——修掉两处水合不一致(D-12)\n\nD-12 登记的是顶栏那一处,查下来是两处同病,其中一处每次打开登录页都在报:\n\n- `app-nav.tsx` 直接渲染会话里的 subject。工作台是 output: \"export\",HTML 在构建期定死,\n 里面不可能有会话,而首帧客户端已经有了。只在 sessionStorage 有令牌时触发。\n- `login/page.tsx` 的 `typeof window === \"undefined\" ? null : readOidcConfig(...)`:服务端恒为\n null(渲染「缺配置」),浏览器算得出配置(渲染登录按钮),**必然**对不上,与有没有会话无关。\n 同源托管记录 §4.3 记的那个「缺配置」就是产物原文,客户端随后整片换掉了。\n\n定位用的是对照实验而不是读代码猜:清空 sessionStorage 重载 / 不报错,植入会话再重载即报;\n重载 /login/ 在无会话时也报。\n\n修法统一为新增的 useMounted():客户端独有的状态(sessionStorage 会话、window.location)\n等挂载之后再渲染,首帧与构建期产物逐字一致。没有复用 store 的 hydrated 标志——那面旗由\nProviders 的 effect 翻,时序上依赖别的组件;组件自己的 useState(false) 在水合那一帧恒为 false。\n\n登录页因此多出第三种状态「读取中」。这与本仓一贯口径一致:配置还没读到时,既不能说\n「缺配置」也不能说「可登录」。\n\n验证:workbench typecheck / lint 通过;next build 六路由导出;重载 /login/ 与植入会话硬跳转 /\n均不再新增 hydration 报错。\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n","url":"https://gitea.g-hi.com/luoanwu/enterprise-platform/commit/59265a6ffc4d0d4ffda878fd880a5d5a308720bb","author":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"committer":{"name":"juhailaoluo pro","email":"hillao@juhailaoluodeMacBook-Pro.local","username":""},"verification":null,"timestamp":"2026-09-18T16:41:05-07:00","added":["runtime/apps/workbench/src/lib/use-mounted.ts"],"removed":[],"modified":["runtime/apps/workbench/src/app/login/page.tsx","runtime/apps/workbench/src/components/app-nav.tsx"]},"repository":{"id":116,"owner":{"id":5,"login":"luoanwu","login_name":"","source_id":0,"full_name":"","email":"law@g-hi.com","avatar_url":"https://gitea.g-hi.com/avatar/627574a890388a2aadc80ab38d22f3a0","html_url":"https://gitea.g-hi.com/luoanwu","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-01-30T16:28:30+08:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"luoanwu"},"name":"enterprise-platform","full_name":"luoanwu/enterprise-platform","description":"","empty":false,"private":false,"fork":false,"template":false,"mirror":false,"size":21164,"language":"","languages_url":"https://gitea.g-hi.com/api/v1/repos/luoanwu/enterprise-platform/languages","html_url":"https://gitea.g-hi.com/luoanwu/enterprise-platform","url":"https://gitea.g-hi.com/api/v1/repos/luoanwu/enterprise-platform","link":"","ssh_url":"git@gitea.g-hi.com:luoanwu/enterprise-platform.git","clone_url":"https://gitea.g-hi.com/luoanwu/enterprise-platform.git","original_url":"","website":"","stars_count":0,"forks_count":0,"watchers_count":1,"branch_count":44,"open_issues_count":0,"open_pr_counter":0,"release_counter":0,"default_branch":"main","archived":false,"created_at":"2026-09-11T07:33:25+08:00","updated_at":"2026-09-19T07:37:57+08:00","archived_at":"1970-01-01T08:00:00+08:00","permissions":{"admin":true,"push":true,"pull":true},"has_code":true,"has_issues":true,"internal_tracker":{"enable_time_tracker":true,"allow_only_contributors_to_track_time":true,"enable_issue_dependencies":true},"has_wiki":true,"has_pull_requests":true,"has_projects":true,"projects_mode":"all","has_releases":true,"has_packages":true,"has_actions":true,"ignore_whitespace_conflicts":false,"allow_merge_commits":true,"allow_rebase":true,"allow_rebase_explicit":true,"allow_squash_merge":true,"allow_fast_forward_only_merge":true,"allow_rebase_update":true,"allow_manual_merge":false,"autodetect_manual_merge":false,"default_delete_branch_after_merge":false,"default_merge_style":"merge","default_allow_maintainer_edit":true,"avatar_url":"","internal":false,"mirror_interval":"","object_format_name":"sha1","mirror_updated":"0001-01-01T00:00:00Z","topics":[],"licenses":[]},"pusher":{"id":5,"login":"luoanwu","login_name":"","source_id":0,"full_name":"","email":"5+luoanwu@noreply.localhost","avatar_url":"https://gitea.g-hi.com/avatar/627574a890388a2aadc80ab38d22f3a0","html_url":"https://gitea.g-hi.com/luoanwu","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-01-30T16:28:30+08:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"luoanwu"},"sender":{"id":5,"login":"luoanwu","login_name":"","source_id":0,"full_name":"","email":"5+luoanwu@noreply.localhost","avatar_url":"https://gitea.g-hi.com/avatar/627574a890388a2aadc80ab38d22f3a0","html_url":"https://gitea.g-hi.com/luoanwu","language":"","is_admin":false,"last_login":"0001-01-01T00:00:00Z","created":"2026-01-30T16:28:30+08:00","restricted":false,"active":false,"prohibit_login":false,"location":"","website":"","description":"","visibility":"public","followers_count":0,"following_count":0,"starred_repos_count":0,"username":"luoanwu"}}... |