Files
lislgosms/docs/operations-fixes-20260908.md
T
hectorzhao 809175b544
CSS quality / css-quality (push) Has been cancelled
fix: enforce production React release builds
2026-09-08 22:39:32 +08:00

70 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 运营页面与内存修复(2026-09-08)
状态:已授权实现、本地提交和测试环境部署,测试环境已完成验收(2026-09-08 13:39,运行提交2c228a9)。不包含推送、预生产部署或导入导出优化。补充签名清退、监控设计及UI规范,本节替代相关旧分页和汇总展示口径。
1. 固定北京时间日期/小时格式化器按模块复用,保持T-1、闰日、跨月年语义;真实检测规模对照验证内存,不更改检测阈值、发送和报备流程。
2. 每日清退预警在生成时按日期、企业、企业应用汇总,每应用每天只产生一条消息,并按消息分页;未绑定应用独立归组,保留原消息明细、已读、抑制与查询条件。数据库完成分组和分页,禁止仅合并当前页伪汇总。每日Webhook按企业应用分组,保留幂等键和冻结正文,不补发历史通知,验收不调用外部Webhook。
3. 首页指标保持原业务口径,以发送、质量、经营的清晰数字卡展示,单位独立、数值对齐、状态强调;加载/失败显示未取得数据,不能展示假零。CSS归页面所有者,不改共享历史样式。
4. 签名质量四个模块用四个Tab,分别保留日期、查询条件及页码,每页10/25/50/100,默认25。只请求当前模块;热力图保持真实30天快照与客户端维度分页,服务端质量及未报备分页上限同步100。切换和过期响应不得串数据。
5. 监控告警保存优先使用显式PROMTOOL_PATH,否则查找标准安装目录;仍强制promtool校验、原子替换、reload和失败恢复,不跳门禁。测试写入经真实API回读与Prometheus规则核验,恢复原阈值。
6. 创建通道只能关闭按钮或右上角叉主动关闭,遮罩和Escape无效;公共Modal新增可选控制,其他消费者默认行为保持。验收不创建或修改实际通道。
7. 通道报备状态筛选去重为业务状态,报备中覆盖reporting/exporting,报备失败覆盖failed/rejected;历史状态展示保持,查询必须命中全部对应记录。
验证:定向及前后端全量、类型/构建、格式/lint/CSS/安全/部署/包体门禁;真实PostgreSQL隔离集成、测试环境API/浏览器1600×1000、1366×768、390×844及内存对照。使用标准release完成精确提交计划、验证、preflight、prepare、deploy、verify。已有脏文件保护,只提交本轮精确文件/hunk。
## 每日消息兼容与事务
新增dailyGroupKey唯一键、notificationDate/applicationId和detectionIds数组,原代表detectionId/cycleId保留供历史读取。新增列可空或有空数组默认,无删除或历史重写。发布当天已由旧版本生成的检测不重复创建消息;下一检测日按新规则生成。一组包含全部企业/通道维度,不因运营商多条而增加未读数。查询以组内任意检测命中筛选并按消息去重,正文和明细可展开查看。整组抑制必须有原因并原子写入该消息包含的全部维度,旧消息继续原单维度抑制;较新的应用消息存在时禁止从旧组设置抑制。Webhook只为新汇总消息建立每日应用幂等任务,不补发历史任务。
回退应用时保留新增列和唯一键;旧版本只能识别代表明细且会恢复旧生成口径,所以消息行为回退需要停用相应调度后专项决策,不能称简单应用回退即可恢复新口径。正式数据库不造预警;并发与迁移在独立PostgreSQL schema验证,禁止启动检测/发送/Webhook生命周期。
## 验收结果
精确归档前端108项、API673项、类型/格式/样式/构建与质量门禁通过。真实PG并发每日应用唯一、分组查询和抑制通过,19788条实际热力图服务RSS增长49.81MiB。测试环境三视口真实浏览器、100条分页、状态历史exporting合并、阈值保存及恢复通过。详细证据和未执行项见testing-progress.md的2026-09-08 13:39记录;只发布测试环境,历史预警保留。
## 分页交互补充(2026-09-08
本次单独授权为修改并本地提交,不包含推送、测试环境部署或预生产部署。补充上文第4项及通道报备明细的分页交互,不改变已部署版本的历史验收结论。
- 根因:质量检测容量Select位于顶部page-actions,与底部分页分离;报备明细硬编码pageSize=10,查询依赖只有page。现有GET /api/admin/report-details支持page/pageSize及最大100条,无需后端变更。
- 公共Pagination新增可选pageSize、pageSizeOptions、onPageSizeChange,将容量Select置于翻页区。只有传入容量和回调的消费者显示下拉;未传的既有消费者保持原界面与默认每页10的推算。页码输入独立按page重置草稿,避免effect级联更新;原Enter与页码边界保持。
- 签名质量、企业活跃度、通道活跃度、未报备签名都在底部显示10/25/50/100(默认25),包含零结果。日期与已应用查询条件继续按Tab独立保存;质量/未报备重新请求服务端第一页,热力图保留既有真实30天维度数据及客户端分页,改变容量回到第一页。
- 通道报备明细首次进入/刷新默认25,改变容量回到第一页、清空当页选择,保留已应用筛选及URL范围;总数与页面内容来自同一个真实分页接口。增加请求序号和卸载失效保护,过期成功与失败都不能覆盖最新列表或错误;当前请求失败继续真实展示。
- 实际新增容量消费者只有AdminAnalyticsPage的四个模块与AdminReportTasksPage;不改CSS、后端、数据库、权限、详情/状态修改/导出逻辑或其他列表的容量设置。共享Pagination的原消费者通过兼容单测和前端全量回归验证。
- 验收覆盖四档请求、翻页后改容量、空结果、独立日期/筛选、乱序响应、跳转输入草稿、三视口和刷新/路由切换。执行结果见testing-progress.md本轮分页记录;用例OPS-PAGE0908-0105。
## 浏览器异常与通知刷新修复(2026-09-08 夜)
本轮授权为修复、本地提交、测试环境部署;预生产只读诊断,不推送、不发布预生产。补充本方案的公共分页和运营顶栏通知行为,不改变业务数据、API端口或计数口径。
### 当前证据与修复边界
- `et.reportAllChanges (<anonymous>:2:19429)` / `n.timeout (:2:5652)` 与 GoogleChrome/web-vitals 官方 issue #792 的堆栈及偏移完全一致。DevTools 的 LiveMetrics 在名为 `DevTools Performance Metrics` 的隔离上下文注入性能脚本,并在前面加一行 `window.devToolsReportSoftNavs`,说明匿名脚本第2行的来源机制。用户报告另一台 Chrome 152.0.7977.77 打开 F12 控制台时出现;不要求先打开 Performance 面板,DevTools 初始化即启动 LiveMetrics。仓库业务源码和前端依赖未引入 reportAllChanges/web-vitals。历史2026-09-05记录只把它列为外部注入待核验,没有完成这个异常的业务代码修复。
- 进一步在独立临时 Chrome 152.0.7977.76、真实预生产公开登录页捕获到了同名隔离上下文及匿名scriptId 5:长度20705 bytesSHA256 `0f2eb3b63431416befd0d826255fb1736117e0ddbca120c5c3e54aca03a1810d`,首行为 `window.devToolsReportSoftNavs = true;`,第2行19429列正是未经空数组检查的 `t.entries[0].startTime`。这确认了报错代码的DevTools归属和直接缺陷:延迟报告回调读取不存在的第一个性能条目。该次正常浏览未触发异常,另一台电脑为何产生空entries仍需现场事件证据。不通过覆盖Performance API、全局error过滤或吞错伪装修复。web-vitals #792仍开放,但DevTools已在2026-08-31合入正式修复[6a47f933Live Metrics: Handle empty INP entries](https://github.com/ChromeDevTools/devtools-frontend/commit/6a47f93393a72ca3ae77fdb0525296812d92f9a2),对应Chromium543499029,增加entries首项可选链和空条目测试;尚未确认包含该修复的已发布Chrome版本。隔离临时Chrome中已通过标准UI验证规避入口:DevTools F1 → 偏好设置 → Performance,关闭“启用软导航性能监控”,注入首行从true变false且刷新后保持。开关前后真实公开登录页各刷新验证码3次、异常均0;这证明控制开关生效,不冒称复现异常后已消除。关闭F12后同样应刷新以清除旧注入上下文。
- 六类通知 GET 的 ERR_CONNECTION_CLOSED 是传输层失败,与匿名脚本异常分别诊断。2026-09-08 21:0521:13API/Nginx稳定、无OOM或新增上游超时/限流/5xx证据;本机公网H1/H2共36次请求均收到预期401H2覆盖两个Cloudflare地址;源站本机约12ms,公网约1–4.65s。匿名401只证明链路可达,不代表登录后业务通过;没有依据修改Nginx、关闭HTTP2或认定Cloudflare/本机代理是根因。另一台电脑的历史连接关闭暂未复现,必须保留这一未验证项。
- 可复核的应用缺陷:AdminLayout原先30秒定时、focus和多种业务事件均直接触发六GET,没有批次互斥/超时/隐藏暂停,线上只读日志出现1–4秒内重复整批;四类计数失败时归零。该缺陷会放大网络抖动并显示误导计数,但不能据此声称已定位TCP关闭原因。
### 预期行为和实现范围
1. 公共Pagination容量只显示“25 条/页”等选中值,不显示“每页数量”标题;复用既有sr-only隐藏标签及唯一id保留无障碍名称。适用于通道报备明细与签名质量四Tab;四档10/25/50/100、默认25、独立日期/分页、其他Select标签和无容量消费者保持。
2. 运营顶栏仅保留一个通知请求批次,批次内六个独立只读GET并行。触发事件合并,业务刷新最多保留一次待执行刷新;失败后按30/60/120秒退避,上限120秒,focus不能绕过冷却连续发请求。
3. 单批设置15秒超时并取消请求,页面隐藏/离线/锁屏/卸载停止轮询和在途请求,恢复后按调度条件刷新。旧批次响应不能覆盖新状态;不新增全局POST重试、短信重投或业务写入。
4. 每类接口失败独立保留上次真实计数,并在对应通知入口说明计数暂不可用;首次未取得数据不能显示为已确认的零。成功后清除不可用状态。401/锁屏仍服从现有统一会话处理,不将权限失败包装成功。
5. 定向测试验证批次去重、取消/超时、退避、状态保留和恢复;真实测试环境验证六接口及分页,不用静态响应或localStorage代替业务数据。故障注入仅验收失败路径,与真实成功请求证据分别记录。
官方依据:[web-vitals #792](https://github.com/GoogleChrome/web-vitals/issues/792)、[LiveMetrics注入](https://raw.githubusercontent.com/ChromeDevTools/devtools-frontend/main/front_end/models/live-metrics/LiveMetrics.ts)、[设置注册](https://raw.githubusercontent.com/ChromeDevTools/devtools-frontend/main/front_end/panels/timeline/timeline-meta.ts)。
## 通知取消复核与前端构建模式补充(2026-09-08 22:35
第三轮真实测试浏览器诊断确认一个独立发布缺陷:标准 prepare 的 NODE_ENV=test 使 Vite/React 插件选择开发运行时,实际线上 index-TLGANFcU.js 包含 19 处 react_stack_bottom_frame、2 处 jsx-dev-runtimeSHA-256 为 a8db74bfdb24ef0892ca77fee891297d492d07b979c8653d5fd7c86c186e080c。先前仅依据生产构建命令推断线上运行生产 React 的判断撤回,以实际下载产物为准。
18 次通知原生 signal abort 均在可见且在线文档中发生,耗时约 3.114ms、reason=AbortError,全部落在 JS 225:176295 的通知 effect cleanupReact 146:26427/25089 映射为删除树 passive unmount 清理及其递归遍历,不是 15 秒超时。已确认取消来自布局清理链,但不能进一步把每次清理都写成 StrictMode 双 effect,不能据此宣称另一台电脑历史 ERR_CONNECTION_CLOSED 已定位或根除。原六类通知 GET 的保值、退避、取消及会话设计保持。
最小修复为发布工具仅给前端 npm run build 显式 production 环境;新增 Vite build/configResolved 的 isProduction 守卫,在错误模式下拒绝产出发布包,不改变 serve/Vitest配置或后端接口。真实 test/development 模式两个构建负例已拒绝;Windows 工具 37 项中 35 通过、2 平台跳过。默认构建/lint 正在执行、Linux 新 37 项待返回,不提前记录通过。须以重新生成的正式候选及真实三尺寸、刷新/跨路由、通知六 GET 验收关闭本问题,不能修改浏览器错误过滤来代替正式包复测。
最终检查结果补记(2026-09-08 22:36):默认 npm run build 成功,npm run lint 退出码 0;两个真实 test/development 构建负例准确拒绝。Linux 新版工具 37/37 通过、0 失败/0 跳过,耗时 0.192s,日志 SHA-256 为 305e7df43ff9d6506a755fd8d5e0adb6926e5ee89eb719d8baa015c231a4060b,位于主 TEMP/release-linux-unit-buildmode-2026-09-08T14-34-37-205Z/linux-unittest.log。本结果补齐上文执行中的本地检查;正式候选及真实部署页面仍待验收。