## 背景 #424 报的现象有一层结构性因素:`parsePeakSpec` 的失败语义是「整串视为未配置」(模块头契约:排程是省钱手段,绝不该因为写错格式把蒸馏/巩固停掉)。这个契约本身是对的——但它意味着**配置写错的唯一症状是「功能悄悄没生效」**:用户明明写了 `summarizePeakHours` / `dreamPeakHours`,巩固/蒸馏却回到全天候,日志、面板、审计里都没有任何痕迹。#424 主楼里 louisjar 的排查只能靠「高峰期还在巩固」倒推,正是这个缺口的全貌。 PR #621 已把根因表里**全角等价符号**那四种收掉(归一化后照常解析)。但归一化不救错——剩余的静默失效面依然存在且永远存在: - `24:00` 越界(正写是 `04:00-00:00`,#424 里已教过); - 「点号当冒号」(`09.00-18.00`)、半角 `~` 等非等价类写法; - 任何未来的笔误。 只要 null 语义还在(它应该一直在),这类写法就都会静默。本 issue 只补**可见性**,不动语义。 ## 提案(零行为变化、不新增配置键) 1. **启动/配置装配时告警**:对 `summarizePeakHours` / `dreamPeakHours` 各跑一次 `parsePeakSpec`——**非空**且解析为 null 时 `logger.warn` 一条(带键名与原串;空串是合法的「未配置」,不告警,否则每个没配错峰的用户开机都被警告一遍)。 2. **面板设置页提示**:两个时段键的值在设置页展示时,解析失败给显式提示(输入框旁标红或说明行);具体落点(保存时校验 vs 渲染时提示)评审定。 3. **不做的**:不改解析语义(不救错、不放宽边界);不加配置键;不动 #424 的五项提案(正向定点 / 债务上限 / 定点搭便车 / 失败短重试 / 手动入口,那些是排程增强,与本 issue 的可观测性正交)。 ## 验收草案 - [ ] 配置非空且非法时,启动日志有一条 warn(键名 + 原串),行为零变化(null 语义不动); - [ ] 空串与合法串零新增日志(不骚扰未配置用户); - [ ] 面板设置页对非法时段串有可见提示; - [ ] 全角归一(#621 已落)与本提示共存:归一救得了的不告警,救不了的才告警。 ## 参考 - #424(根因复核与「另开可观测性 issue」的结论);PR #621(全角等价归一,本 issue 的前置) - `dsh-mneme/src/peak-hours.js`(parsePeakSpec 契约与 normalizeFullwidth)
Activity
merge origin/main into feat/622-peak-hours-observability
merge origin/main into feat/622-peak-hours-observability
feat(peak-hours): 错峰串写错不再静默(#622) (#629)