feat: ClassIsland / ClassHelper 灵动岛提示词套件

- 重构版主提示词(14 parts,面向 ClassHelper 灵动岛重构)
- ClassIsland 全量规格提示词(20 parts,含分卷与逐章版本)
- 投喂指南、分卷、逐节文件
- 调研记录、一致性基线、生成与质检脚本
This commit is contained in:
ClassIsland Prompt Kit committed 2026-11-12 21:59:58 +08:00
commit 22c1784bab
117 files changed
+47759

No files matched your search

+239
View File
@@ -0,0 +1,239 @@
# features(Part 06/07/08)分析备注
负责人:features。产出:`parts/06-schedule-profile.md`、`parts/07-notifications.md`、`parts/08-automation.md`。
本文件记录:已读源文件清单、关键枚举/默认值表(供 Lead 汇总时交叉校验)、未决问题与缺口。全部为静态阅读结论,未构建、未运行、未截图。
## 1. 已读文件清单(相对 `D:\clword`)
### 1.1 档案 / 课表 / 时间表(Part 06)
| 文件 | 说明 / 关键行 |
|---|---|
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/Profile.cs` | 档案根模型(484 行):字段默认值 17-32,内置课表群 44-59,解散/删除群 104-137,科目编辑集合 139-217,临时层/临时课表/临时群 313-449,`OrderedSchedules` 468-477 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/ClassPlan.cs` | 课表(608 行):默认值 15-27,`ValidTimeLayoutItems` 双向裁剪 54-98,`RefreshClassesList` 451-491,`RefreshIsChangedClass` 496-513,`RemoveTimePointSafe` 515-522 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/TimeLayout.cs` | 时间表(298 行):默认名 17,增删时间点 188-235,`Layouts` 254-267 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/TimeLayoutItem.cs` | 时间点(256 行):Start/End 62-93,TimeType 文档 119-138,BreakName 175-191,ActionSet 196-205,CompareTo 212-241 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/ClassInfo.cs` | 课程项(122 行) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/Subject.cs` | 科目(141 行):自动 Initial 19-30,三个内置科目 79-101,复姓表 14、`GetFirstName` 107-140 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/TimeRule.cs` | 触发规则(70 行):默认 WeekDay=0 / Div=0 / DivTotal=2 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/ClassPlanGroup.cs` | 课表群(50 行):两个内置 GUID |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/OrderedSchedule.cs` | 预定课表(25 行) |
| `repos/ClassIsland/ClassIsland.Shared/Enums/TempClassPlanGroupType.cs` | Override / Inherit |
| `repos/ClassIsland/ClassIsland.Shared/Enums/TimeState.cs` | None/OnClass/PrepareOnClass/Breaking/AfterSchool |
| `repos/ClassIsland/ClassIsland/Services/LessonsService.cs` | 课程服务(646 行):50ms 计时器 39-45,课表选择 143-201,tick 主逻辑 373-527,`LoadCurrentClassPlan` 549-580,`CheckClassPlan` 582-607,周次计算 619-635,`GetClassIndex` 531-541 |
| `repos/ClassIsland/ClassIsland/Services/ProfileService.cs` | 档案服务(438 行):路径 34-53,集控合并 78-137,加载/保存 139-227,临时层 235-328,转正 335-360,临时群 362-415,信任 417-422 |
| `repos/ClassIsland/ClassIsland/Services/ProfileAnalyzeService.cs` | 对象图分析(212 行) |
| `repos/ClassIsland/ClassIsland/Views/ProfileSettingsWindow.axaml` | 档案编辑窗(2004 行):窗口参数 23-30,课表信息面板 53-140,时间表面板 202-232,临时课表/临时层 235-338,课表群 342-413,换课 Flyout 415-446,临时层 Flyout 448+ |
| `repos/ClassIsland/ClassIsland/Views/ProfileSettingsWindow.axaml.cs` | 交互逻辑(1671 行):`Open` 与页索引 186-262,保存于关闭 264-274,新增时间点 983-1099,调课 1414-1510,导入导出 1565-1668 |
| `repos/ClassIsland/ClassIsland/Views/ClassPlanDetailsWindow.axaml` | 课表详细信息窗(199 行) |
| `repos/ClassIsland/ClassIsland/Controls/TimeRuleEditControl.axaml` | 单双周/星期 Chip UI(54 行) |
| `repos/ClassIsland/ClassIsland/Controls/WeekOffsetSettingsControl.axaml.cs` | 轮换偏移正/反算(132 行) |
| `repos/ClassIsland/ClassIsland.Shared/Extensions/CsesExtensions.cs` | CSES 双向转换(167 行) |
| `repos/ClassIsland/ClassIsland/Controls/ProfileTransferProviders/CsesImportProvider.cs` | CSES 导入(72 行) |
| `repos/ClassIsland/ClassIsland/Controls/ProfileTransferProviders/ClassIsland1ImportProvider.cs` | 1.x 导入(58 行) |
| `repos/ClassIsland/ClassIsland/Views/ExcelImportWindow.xaml.cs` | **整文件 `#if false`(1 行处),WPF 遗留**(824 行) |
| `repos/ClassIsland/ClassIsland/Views/ExcelExportWindow.xaml.cs` | **整文件 `#if false`(1-539 行)** |
| `repos/ClassIsland/ClassIsland/App.Services.xaml.cs` | 注册表:窗口 109/145/148/198/204,提醒提供方 198-202,触发器 240-251,规则 253-267,行动 269-276,导入导出 292-296 |
### 1.2 提醒(Part 07)
| 文件 | 说明 / 关键行 |
|---|---|
| `repos/ClassIsland/ClassIsland/Services/NotificationHostService.cs` | 提醒主机(542 行):优先队列 41,提供方注册 79-114,Setup 128-155,Show 157-176,入队 178-191,链式 205-254,渠道注册 273-284,取消全部 322-335,推送/弹出 337-419,消费者注册 436-470,重新入队 488-522 |
| `repos/ClassIsland/ClassIsland/Services/NotificationWorkerService.cs` | 播放会话(250 行):设置三层覆盖 109-124,计时 82-107,语音/音效 178-208,状态机 211-234 |
| `repos/ClassIsland/ClassIsland.Core/Models/Notification/NotificationRequest.cs` | v2 请求(200 行) |
| `repos/ClassIsland/ClassIsland.Core/Models/Notification/NotificationContent.cs` | 内容与三个模板工厂(217 行) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Notification/NotificationPriority.cs` | 比较器(63 行,含 IsPriorityOverride 反常行为) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Notification/NotificationSettings.cs` | 提醒设置默认值(116 行) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Notification/NotificationProviderRegisterInfo.cs` | 提供方注册信息(57 行) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Notification/NotificationRequest.cs` | 旧版(`[Obsolete]`,249 行) |
| `repos/ClassIsland/ClassIsland.Core/Enums/Notification/NotificationState.cs` | 播放状态(32 行) |
| `repos/ClassIsland/ClassIsland.Shared/Enums/NotificationModes.cs` | Disabled/EnabledForce/Default |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/INotificationConsumer.cs` | 消费者契约 |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/Services/NotificationProviders/NotificationProviderBase.cs` | 提供方基类(198 行) |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/Services/NotificationProviders/NotificationChannel.cs` | 渠道(104 行) |
| `repos/ClassIsland/ClassIsland.Shared/Interfaces/INotificationProvider.cs` | 默认音效 Uri(37 行) |
| `repos/ClassIsland/ClassIsland.Core/Attributes/NotificationProviderInfo.cs` / `NotificationChannelInfo.cs` | 特性定义 |
| `repos/ClassIsland/ClassIsland/Services/NotificationProviders/ClassNotificationProvider.cs` | 上下课提醒(325 行) |
| `.../AfterSchoolNotificationProvider.cs` | 放学提醒(61 行) |
| `.../WeatherNotificationProvider.cs` | 天气提醒(173 行) |
| `.../ManagementNotificationProvider.cs` | 集控提醒(81 行) |
| `.../ActionNotificationProvider.cs` | 行动提醒(17 行,仅作为发送源) |
| `repos/ClassIsland/ClassIsland/Models/NotificationProviderSettings/ClassNotificationSettings.cs` | 上下课设置默认值(199 行) |
| `.../WeatherNotificationProviderSettings.cs` | 天气设置默认值(70 行) |
| `.../AfterSchoolNotificationProviderSettings.cs` | 放学设置默认值(33 行) |
| `repos/ClassIsland/ClassIsland.Controls/NotificationProviders/*.axaml` | 气泡内容布局:`ClassNotificationProviderControl.axaml`(104 行)、`AfterSchoolNotificationProvider.axaml`(30 行)、`WeatherNotificationProviderControl.axaml`(47 行) |
| `repos/ClassIsland/ClassIsland/Controls/MainWindowLine.cs` | 消费者与播放流程(815 行):`ReceiveNotifications` 639-656,模板键解析 658-665,中心点 667-680,`ProcessNotification` 682-811,`AcceptsNotificationRequests` 814 |
| `repos/ClassIsland/ClassIsland/Controls/MainWindowLine.axaml` | 行样式:`IslandContainerHeight=40`(16 行),进度绑定 77 |
| `repos/ClassIsland/ClassIsland/XamlThemes/FluentTheme/Styles.axaml` | 气泡模板与动画(120-197、275-449);`SlantedMaskControl` 参数 175-180 |
| `repos/ClassIsland/ClassIsland/XamlThemes/ClassicTheme/Styles.axaml` | 经典主题同类样式(136-330) |
| `repos/ClassIsland/ClassIsland/Controls/SlantedMaskControl.cs` | 斜切遮罩(346 行,含 5 区域权重与绘制) |
| `repos/ClassIsland/ClassIsland/Controls/NotificationEffects/RippleEffect.axaml(.cs)` | 强提醒涟漪(32/113 行) |
| `repos/ClassIsland/ClassIsland/Views/TopmostEffectWindow.axaml(.cs)` | 特效窗口(35/135 行),`UpdateWindowPos` 100-109 |
| `repos/ClassIsland/ClassIsland/ViewModels/TopmostEffectWindowViewModel.cs` | 特效控件集合(24 行) |
| `repos/ClassIsland/ClassIsland/MainWindow.axaml.cs` | 置顶锁 1056-1092,清除全部 1171-1174 |
| `repos/ClassIsland/ClassIsland/MainWindow.axaml` | 右键「清除全部提醒」86-94,行「此行可以显示提醒」425-433 |
| `repos/ClassIsland/ClassIsland/Views/ClearNotificationButtonWindow.xaml(.cs)` | **`#if false` 遗留,仅 15/18 行** |
| `repos/ClassIsland/ClassIsland/Services/AudioService.cs` | 音频设备共享与播放(143 行) |
| `repos/ClassIsland/ClassIsland/Services/SpeechService/SystemSpeechService.cs` | 系统 TTS 音量映射 |
| `.../EdgeTtsService.cs` | Edge TTS 音色/缓存/音量 |
| `repos/ClassIsland/ClassIsland/Views/SettingPages/NotificationSettingsPage.axaml` | 提醒设置页(497 行) |
### 1.3 自动化(Part 08)
| 文件 | 说明 / 关键行 |
|---|---|
| `repos/ClassIsland/ClassIsland/Services/AutomationService.cs` | 自动化服务(465 行):时间点行动 84-108,触发 112-133,恢复 138-167,配置加载 173-233,工作流加载 237-328,触发器加载 334-436 |
| `repos/ClassIsland/ClassIsland/Services/ActionService.cs` | 行动服务(277 行):Invoke/Revert/Interrupt 20-91,行动项执行 93-135,可变列表迭代 137-173,迁移 179-203,菜单树 208-260 |
| `repos/ClassIsland/ClassIsland/Services/RulesetService.cs` | 规则求值(163 行) |
| `repos/ClassIsland/ClassIsland/Services/WeatherService.cs` | 天气规则处理(460 行):规则注册 64-68,各规则 93-221,刷新与预警去重 236-403 |
| `repos/ClassIsland/ClassIsland/Services/WindowRuleService.cs` | 窗口规则处理(111 行) |
| `repos/ClassIsland/ClassIsland.Core/Models/Automation/Workflow.cs` | 工作流(33 行) |
| `.../TriggerSettings.cs` | 触发器设置(61 行) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Automation/ActionSet.cs` | 行动组(128 行) |
| `.../ActionItem.cs` | 行动项(99 行) |
| `repos/ClassIsland/ClassIsland.Core/Models/Ruleset/{Ruleset,RuleGroup,Rule,StringMatchingSettings}.cs` | 规则集模型 |
| `repos/ClassIsland/ClassIsland.Core/Enums/RulesetLogicalMode.cs` | Or/And |
| `repos/ClassIsland/ClassIsland.Shared/Enums/ActionSetStatus.cs` | 4 状态 |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/Automation/{TriggerBase,ActionBase}.cs` | 基类契约 |
| `repos/ClassIsland/ClassIsland.Core/Attributes/{TriggerInfo,ActionInfo}.cs` | 注册特性 |
| `repos/ClassIsland/ClassIsland/Services/Automation/Triggers/*.cs` | 12 个触发器(逐文件已读) |
| `repos/ClassIsland/ClassIsland/Services/Automation/Actions/*.cs` | 7 个行动(逐文件已读) |
| `repos/ClassIsland/ClassIsland/Models/Automation/Triggers/*.cs` | 5 个触发器设置模型 |
| `repos/ClassIsland/ClassIsland/Models/Actions/*.cs` | 6 个行动设置模型 |
| `repos/ClassIsland/ClassIsland/Models/Rules/*.cs` | 6 个规则设置模型 |
| `repos/ClassIsland/ClassIsland/Views/SettingPages/AutomationSettingsPage.axaml(.cs)` | 自动化设置页(402/167 行) |
| `repos/ClassIsland/ClassIsland/Models/Settings.cs` | 全局默认值(2655 行,按行号引用) |
## 2. 关键枚举 / 默认值总表(供交叉校验)
### 2.1 枚举
| 名称 | 值 | 证据 |
|---|---|---|
| `TimeLayoutItem.TimeType` | 0 上课 / 1 课间 / 2 分割线 / 3 行动 | `TimeLayoutItem.cs:120-138,246-253` |
| `TimeState` | 0 None / 1 OnClass / 2 PrepareOnClass(预留) / 3 Breaking / 4 AfterSchool | `TimeState.cs:6-27` |
| `TempClassPlanGroupType` | 0 Override / 1 Inherit | `TempClassPlanGroupType.cs:6-16` |
| `NotificationState` | None/Queued/Playing/Paused/Cancelled/Completed | `NotificationState.cs:6-31` |
| `NotificationModes` | Disabled=0 / EnabledForce=1 / Default=2 | `NotificationModes.cs:6-19` |
| `ActionSetStatus` | Normal / Invoking / IsOn / Reverting | `ActionSetStatus.cs:6-24` |
| `RulesetLogicalMode` | Or / And | `RulesetLogicalMode.cs:6-15` |
| `WindowStatusRuleSettings.State` | 0 正常 / 1 最大化 / 2 最小化 / 3 全屏(默认 1) | `WindowStatusRuleSettings.cs:7-27` |
| `RunActionRunType` | Application/Command/File/Folder/Url(字符串枚举) | `RunActionSettings.cs:19-49` |
| `WeatherNotificationActionSettings.NotificationKind` | 0 三天预报 / 1 预警 / 2 逐小时 | `WeatherNotificationActionSettings.cs:7` |
### 2.2 固定 GUID / ID
- 默认课表群 `ACAF4EF0-E261-4262-B941-34EA93CB4369`;全局课表群 `00000000-0000-0000-0000-000000000000`(`ClassPlanGroup.cs:44-49`)。
- 提醒提供方:上下课 `08F0D9C3-C770-4093-A3D0-02F3D90C24BC`、放学 `8FBC3A26-6D20-44DD-B895-B9411E3DDC51`、天气 `7625DE96-38AA-4B71-B478-3F156DD9458D`、集控 `0117fb4f-5374-434a-97fb-4f5374634a07`、行动 `4B12F124-8585-43C7-AFC5-7BBB7CBE60D6`。
- 渠道:准备上课 `CDDFE7FF-B904-4C73-B458-82793B2F66E9`、上课 `AFF5B9A4-037C-4A71-8563-C9EA87DDA75C`、下课 `77C9F3FB-0A2A-4B22-BDDF-3C333462B2F9`。
- 触发器 12 个 ID、行动 8 个 ID、规则 15 个 ID:见 Part 08 的表格(证据集中在 `App.Services.xaml.cs:240-276` 与各触发器/行动源文件)。
### 2.3 关键默认值(Part 06/07/08 交叉引用)
| 设置 | 默认 | 证据 |
|---|---|---|
| `SelectedProfile` | `"Default.json"` | Settings.cs:66 |
| `SingleWeekStartTime` | 今天所在周的周日 | Settings.cs:37-42 |
| `MultiWeekRotationMaxCycle` | 4 | Settings.cs:61 |
| `MultiWeekRotationOffset` | `[-1,-1,0,0,0]` | Settings.cs:60 |
| `DefaultOnClassTimePointMinutes` | 40 | Settings.cs:108 |
| `DefaultBreakingTimePointMinutes` | 10 | Settings.cs:109 |
| `ClassPrepareNotifySeconds` | 60 | Settings.cs:43 |
| `IsProfileEditorClassInfoSubjectAutoMoveNextEnabled` | true | Settings.cs:181 |
| `IsSwapMode` | true | Settings.cs:210 |
| `ExpIsExcelImportEnabled` | false | Settings.cs:113 |
| 档案窗口 | 1100×600,MinWidth 750 | ProfileSettingsWindow.axaml:27-28 |
| 课表详情窗口 | 800×500 | ClassPlanDetailsWindow.axaml:17 |
| `IsNotificationEnabled` | true | Settings.cs:91 |
| `AllowNotificationSpeech` | false | Settings.cs:153 |
| `AllowNotificationEffect` | true | Settings.cs:154 |
| `AllowNotificationSound` | false | Settings.cs:155 |
| `AllowNotificationTopmost` | true | Settings.cs:156 |
| `NotificationSoundVolume` | 1.0 | Settings.cs:182 |
| `SpeechVolume` | 1.0 | Settings.cs:136 |
| `EdgeTtsVoiceName` | `zh-CN-XiaoxiaoNeural` | Settings.cs:138 |
| `IsNotificationSoundEnabled`(全局兜底层) | true | Settings.cs:144 |
| `NotificationEffectRenderingScale` | 1.0 | Settings.cs:150 |
| `NotificationUseStandaloneEffectUiThread` | true | Settings.cs:1837 |
| `AnimationLevel` | 1 | Settings.cs:1851 |
| 遮罩/正文默认时长 | 5s / 5s | NotificationContent.cs:22-23 |
| 行高 `IslandContainerHeight` | 40 | MainWindowLine.axaml:16 |
| `IsAutomationEnabled` / `IsAutomationWarningVisible` / `CurrentAutomationConfig` | false / true / `"Default"` | Settings.cs:160-162 |
| `IsOnClassNotificationEnabled` 等三个上下课开关 | true | ClassNotificationSettings.cs:7-9 |
| 室内/户外提前量 | 60 / 600 秒 | ClassNotificationSettings.cs:10-11 |
| `WeatherAlertSpeed` | 7.0 | WeatherNotificationProviderSettings.cs:14 |
| 天气显示模式(预警/预报) | Disabled / Disabled | WeatherNotificationProviderSettings.cs:10-11 |
| 放学提醒 `IsEnabled` / `NotificationMsg` | true / `"今天的课程已结束,请同学们有序离开。"` | AfterSchoolNotificationProviderSettings.cs:9-10 |
| `NotificationActionSettings.MaskDurationSeconds` / `ContentDurationSeconds` | 5.0 / 10.0 | NotificationActionSettings.cs:14-15 |
| `SleepActionSettings.Value` | 5 秒 | SleepActionSettings.cs:6 |
| `PreTimePointTriggerSettings` | `TargetState=OnClass`, `TimeSeconds=60` | PreTimePointTriggerSettings.cs:9-11 |
| `CronTriggerSettings.CronExpression` | `"* * * * *"` | CronTriggerSettings.cs:7 |
| `ActionSet.Name` / `IsEnabled` / `IsRevertEnabled` | `"新行动组"` / true / false | ActionSet.cs:77-93 |
## 3. 未决问题 / 缺口(需 Lead 决策或后续补读)
1. **提醒优先级插队语义反常**:`NotificationPriority.CompareTo` 在 `IsPriorityOverride=true` 时返回 1(`NotificationPriority.cs:47-50`),在 .NET 最小堆中意味着**更晚**出队,与「紧急插队」直觉相反。Part 07 已按「显式定义 + 标注【推断】为历史取反问题」处理;若 Lead 要求逐位一致,需在总纲统一说明。
2. **`ClearNotificationButtonWindow` 为 `#if false` 遗留**:当前版本没有「清除提醒浮动按钮窗口」;Part 07 明确要求不得实现它,改用右键菜单「清除全部提醒」。若产品要求必须有,属新增功能。
3. **Excel 导入/导出整体被 `#if false` 屏蔽**(两个窗口 + DI 注册 + `ExpIsExcelImportEnabled=false`)。Part 06 已把它标为非首版必做,并给出【推断】格式建议;当前可用的导入导出是 CSES / ClassIsland 1.x / Class Widgets 1.2 / 导出 CSES(`App.Services.xaml.cs:292-296`)。
4. **「静音时段」不存在**:Settings 与提醒链路中没有任何免打扰时段字段,只有 `-q` 静默启动后 10 秒丢弃提醒(`MainWindowLine.cs:698-704`)。Part 07 已声明不得虚构,并给出可选扩展模型(标注【推断】)。
5. **强提醒渲染缩放自动推算公式缺失**:`IsNotificationEffectRenderingScaleAutoSet=true` 时的具体系数未在 `TopmostEffectWindow.cs` 中给出,Part 07 标【推断】。
6. **Class Widgets 1.2 导入转换逻辑未细读**:`ClassWidgetsProfileTransferHelper.cs` 尚未逐行阅读,Part 06 只按注册表与通用导入契约要求实现(文件名/流程/失败提示),未写字段映射细则。若需要像素级导入转换,需补读该文件。
7. **`ClassIslandV1ProfileTransferHelper` 与 `ClassWidgetsProfileTransferHelper`** 同样未逐行读;Part 06 只覆盖 CSES 的完整映射算法。
8. **时间线缩放常量缺失**:`ProfileSettingsWindow.axaml.cs` 的 ZoomIn/ZoomOut 只做 UI 事件,未读取具体缩放范围常量,Part 06 标【推断】为 0.5x–3x / 步长 0.1。
9. **档案 JSON 损坏的容错细节**:`ConfigureFileHelper.LoadConfig` 未逐行读,Part 06 要求「回退空档案 + 保留 .bak」并标【推断】。
10. **`ScheduleDataGrid` 单元格渲染细节**(科目简称/颜色/换课标记的视觉)未细读,Part 06 标【推断】,视觉规格建议归入 Part 04/05 由 ui-island 统一。
11. **`ProfileSettingsWindow.axaml` 的 2004 行中仅精读约 500 行**(结构、课表/时间表/临时/群/换课/导入导出区域)。剩余部分(约 900-1600 行为止的时间线列表模板、日程调整表格模板、附加设置项)只做了 outline 级 grep,像素细节若需要请 ui-island 或 windows part 补充。
12. **接口文件 `ILessonsService` / `IProfileService` 未逐行读**:只依据实现类与调用点推断契约;对外接口方法名(如 `GetCyclePositionsByDate`、`CreateTempClassPlan`)已在 Part 06 使用实现类签名表述。
13. **`ActionSetRunningControl` / `TriggerSettingsControl` / `ActionControl` / `RulesetControl` 的内部 UI 未精读**(仅确认存在与绑定方式),Part 08 只描述宿主页布局与行为契约;控件内部像素规格建议由 windows part 统一。
14. **天气图标模板 / WeatherInfo 数据结构**(`ClassIsland.Core/Models/Weather`)未展开,Part 07 只用到 `Alerts[].Title/Detail/Type/PubTime/Images`、`ForecastDaily.Weather/SunRiseSet`、`Minutely.Precipitation.RainRemainingMinutes`、`Current.Weather`、`UpdateTime`。若需要完整天气数据 schema,需补读该目录(可能属 Part 05 天气组件范围)。
15. **`GetSettingsDeltaTime` 的附加设置来源**:`ClassNotificationProvider` 使用 `IAttachedSettingsHostService`;附加设置体系(AttachedSettings)属跨 part 内容,Part 06/07 只按「按优先级取第一个启用项」描述,未定义完整附加设置模型,建议由 Lead 在总纲指定归属(可能在 Part 05 或 Part 13)。
## 3.1 裁决与修补(Lead 裁决,2026-11-12 修补轮)
本轮按 Lead 裁决修补 `parts/06`、`parts/07`、`parts/08`(不重写整篇),结论如下:
1. **Excel 导入/导出 = P1 必须实现**:用 `xlsx`(SheetJS)重建,禁止依赖 ReoGrid/WPF/OfficeOpenXml。ClassIsland 2.1 源码两个窗口整体 `#if false`,且 `ExcelImportViewModel`/`ExcelExportViewModel` 类型在仓库中**已不存在**(全仓检索无命中,属不可编译骨架),只能作布局参考。向导 UI 归 Part 11;Part 06 已新增 `6.9.1` 定义列格式、映射算法、往返一致性、预检规则与导出参数默认值(默认值标【推断】)。CSES 导入/导出标 **P0**。
2. **ClearNotificationButtonWindow**:维持「不实现(`#if false` 遗留)」,清除提醒统一用右键菜单「清除全部提醒」→ `CancelAllNotifications`。
3. **静音时段**:维持「ClassIsland 2.1 不存在、不得虚构」;可选扩展模型改为明确 **P2、默认关闭**,并要求命中时段时只屏蔽音效/语音/置顶/特效、不丢弃提醒。
4. **NotificationPriority = 最终确定语义**:排序键 `(提供方优先级下标升序) → (Level: Emergency>High>Normal>Low) → (入队序号升序)`;新增 `NotificationLevel` 字段(默认 `Normal`);记录原比较器 `IsPriorityOverride` 取反的反常行为并声明按语义修正;旧字段兼容映射(读入 true→Emergency,写出 High/Emergency→true)。Part 07 §7.2 已删除互相矛盾的「逐位一致」表述。
5. **附加设置 AttachedObjects = 2.x 现役机制**:`ClassIsland.Shared/AttachableSettingsObject.cs:15` 定义 `Dictionary<Guid, object?> AttachedObjects`;2.x `AttachedSettingsControlPresenter` 读取 `:241`、回写 `:361`。Part 06 新增 §6.10(定义/注册表 GUID/读取优先级/写回纪律/1.7 兼容/与档案分析关系/边界),Part 07 补全提醒侧的数据来源、GUID 与字段。**注意**:实际继承 `AttachableSettingsObject` 的是 `ClassPlan/ClassInfo/TimeLayout/TimeLayoutItem/Subject`;`Profile` 不继承(`Profile.cs:14`),故附加设置不能挂档案根——已在 §6.10.1 按源码写明。
6. **天气服务**:Part 07 末尾新增 §7.14(刷新/缓存、定位与城市来源、完整 JSON schema、预警去重、图标主题、断网降级与重试、消费方分工、验收)。数据源证据为 `Services/WeatherService.cs` 全文、`ClassIsland.Core/Models/Weather/*` 全部 18 个模型、`IWeatherService`、`ILocationService`、`WeatherSettingsPage.axaml`、`Assets/XiaomiWeather/xiaomi_weather_status.json`。
7. **其余未细读项**(Class Widgets 1.2 / ClassIsland 1.x 导入 helper 的字段映射、`ScheduleDataGrid` 单元格视觉)按要求**保持【推断】**,本轮不补读。
8. 原 §3 第 3、4、14、15 条已被上述裁决覆盖/关闭;第 1 条已由裁决 4 关闭;第 5、8、9、10、11、12、13 条仍为开放缺口,保留原描述。
### 3.1.1 本轮补读文件清单(新增证据)
| 文件 | 用途 |
|---|---|
| `repos/ClassIsland/ClassIsland.Shared/AttachableSettingsObject.cs`(62 行) | `AttachedObjects` 字段 15、`GetAttachedObject` 23-32、写入 39-42、默认值重载 51-61 |
| `repos/ClassIsland/ClassIsland.Shared/Interfaces/IAttachedSettings.cs`(40 行) | `IsAttachSettingsEnabled` 与 `GetIsEnabled`(含 JsonElement 兼容) |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/Services/IAttachedSettingsHostService.cs`(44 行) | 4 个注册集合(14-22)、`GetAttachedSettingsByPriority` 24-43 |
| `repos/ClassIsland/ClassIsland/Services/AttachedSettingsHostService.cs`(13 行) | 实例侧集合 |
| `repos/ClassIsland/ClassIsland.Core/Attributes/AttachedSettingsControlInfo.cs` / `AttachedSettingsUsage.cs` | 注册特性(GUID/名称/图标/hasEnabledState/targets) |
| `repos/ClassIsland/ClassIsland.Core/Enums/AttachedSettingsTargets.cs` / `AttachedSettingsControlState.cs` | Flags 目标值、节点状态 Disabled/Enabled/Override |
| `repos/ClassIsland/ClassIsland.Core/Controls/AttachedSettingsControlPresenter.axaml.cs`(421 行) | 读取 241、目标类型映射 245-253、状态提示 272-341、写回纪律 354-362 |
| `repos/ClassIsland/ClassIsland/Helpers/AttachedSettingsControlHelper.cs`(69 行) | 控件侧读写 helper |
| `repos/ClassIsland/ClassIsland/Controls/AttachedSettingsControls/*.axaml.cs`(4 个) | 4 个附加设置的 GUID/名称/图标/targets/hasEnabledState |
| `repos/ClassIsland/ClassIsland/Models/AttachedSettings/{ClassNotification,AfterSchoolNotification,WeatherNotification}.cs`、`ClassIsland.Core/Models/AttachedSettings/LessonControlAttachedSettings.cs` | 附加设置模型与默认值 |
| `repos/ClassIsland/ClassIsland/Models/AttachedSettingsNodeWithState.cs` | 节点+状态模型 |
| `repos/ClassIsland/doc/AttachedSettings.md`(88 行) | 官方优先级说明 Subject→TimeLayoutItem→ClassPlan→TimeLayout(50-57) |
| `repos/ClassIsland/ClassIsland.Core/Models/Weather/*.cs`(18 个,36+23+22+14+9+8+40+9+8+18+33+29+21+9+12+10+32 行) | 天气完整 schema 与派生字段 |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/Services/IWeatherService.cs`、`ClassIsland.Platforms.Abstractions/Services/ILocationService.cs` | 天气服务契约、定位契约 |
| `repos/ClassIsland/ClassIsland/Views/SettingPages/WeatherSettingsPage.axaml`(327 行) | 城市搜索/位置设置/图标包/排除预警/不使用 TLS 的 UI 文案 |
| `repos/ClassIsland/ClassIsland/Assets/XiaomiWeather/xiaomi_weather_status.json` | 天气码→中文文案表(0-35、53、301、302、99) |
| `repos/ClassIsland/ClassIsland/Views/ExcelImportWindow.xaml.cs`(824 行,`#if false`) | 时间点解析正则/数字个数 422-458、自动补课间 502-522、科目 Contains 匹配 587-639、完成导入 695-708 |
| `repos/ClassIsland/ClassIsland/Views/ExcelExportWindow.xaml.cs`(539 行,`#if false`) | 星期名 340-350、单元格生成 352-473、列宽/行高/边框 446-472、保存/打开 486-516 |
## 4. 与其他 part 的边界约定(避免重复/冲突)
- 窗口/控件像素级细节:主界面行、组件、主题样式以 Part 04/05/03 为准;本三篇只给与业务强相关的数值(气泡动画、斜切遮罩、特效窗口、课表窗口尺寸),并已注明来源,便于交叉核对。
- 数据存储路径、备份、迁移、Settings/Profile JSON schema 总表:Part 13;本三篇给出的是业务字段语义与默认值,字段名保持一致(`Actions` 而非 `ActionItems`、`ClassPlans`、`OrderedSchedules` 等)。
- 动画总表:Part 14;本三篇提供气泡/涟漪的时长与曲线原始值,建议 Part 14 直接引用本节,勿另行估算。
- 设置中心页面树:Part 10;本三篇只描述「提醒」「自动化」两页的结构与文案,页面注册顺序由 Part 10 统一。
- **Excel 导入/导出向导 UI 归 Part 11**;数据契约/列格式/往返一致性/预检以 Part 06 §6.9.1 为准,Part 11 只做步骤机与表单,不得另定格式。
- **附加设置模型(AttachedObjects)以 Part 06 §6.10 为唯一事实源**;Part 05(组件)/Part 13(存储 schema)如需引用,必须沿用同名字段与同一优先级链,不得另立模型。
- **天气服务与数据模型以 Part 07 §7.14 为准**;Part 05 的天气组件只消费 `LastWeatherInfo` 与 `SelectedWeatherIconTemplate`,不得自行请求或另定义 schema。
- 提醒优先级语义(三级排序键 + `NotificationLevel`)以 Part 07 §7.2 为准,Part 08 的「显示提醒」行动与集控提醒都按此映射,不得各自定义顺序。