# Changelog

## [0.6.1] - 2026-11-04

### 输入框「提示词」弹层在 DSH 0.2.2 上错位 / 不显示

- 根因（实测定位，不是猜）：DSH 0.2.2-rc.1 给输入框容器加了
  `[data-phase=active] .composerSeat{will-change: transform; position: sticky}`。
  带 `will-change: transform` 的祖先会成为 `position: fixed` 后代的 containing
  block，于是弹层的视口坐标被叠加到这个容器的原点上——弹层落到右下角、出屏
  （看起来“点不开”），每次开合又按内容高度重算，于是“多点击几次跳得奇怪”。
  会话阶段是 `settling / hero / active`：空会话是 hero，一旦有对话就变 active，
  这正好解释了“第一轮没问题、第二轮开始坏”。
- 修复：弹层改为 `ReactDOM.createPortal` 到 `document.body`（宿主自己的锚定
  弹层也是这个做法），`position: fixed` 重新相对视口；皮肤改由弹层自己的
  `data-cys-skin` 决定，不再依赖输入框内的祖先选择器。
- 定位加固：挂载后按真实尺寸（含翻转与左右/上下 clamp）定位，开合各清空一次
  旧坐标；滚动 / 窗口缩放时跟随锚点重定位，而不是直接关闭弹层。340px 高度
  上限（D9）不变。
- 门禁：新增 `smoke/popover_anchor_test.mjs`（纯几何 + portal 契约，含 4 条
  变异自测），并接入 `run_all_checks.py`；真机侧用 agent-desktop 点击复核。

## [0.6.0] - 2026-11-03

### 1. 两套皮肤：纸屿经典 与 原生柔光

- 新增 A⁺「原生柔光」皮肤（`prefs.skin = 'modern'`）：桌面、窗口体系、应用坞、便签、纸页、提示词、日历待办、画纸、设置与导览全部按其重构；去掉胶带、印章、纸纹、手写字等拟物装饰，配色与深浅色优先消费 DSH 原生令牌。
- 「纸屿经典」保持既有视觉与行为不变（含纸纹、手写字、自由摆放的便签与 z 叠放）；新增与基线构建的逐像素对照门禁守住这一点。
- 设置 → 外观 →「界面皮肤」一行显示当前皮肤，「选择」按钮打开与首次/升级相同的双卡选择页；卡片带两张真实的小型界面预览。切换即时生效：不整页刷新，不丢失窗口、未保存编辑、搜索词、日历选中日与画纸当前页。
- 经典专属的「纸纹」「便签字形」在现代隐藏但保留取值，切回经典立即恢复。

### 2. 首次与升级提示

- 新装首次打开先出现皮肤选择（默认突出当前皮肤，首次可预选原生柔光）；选择页关闭后才进入既有导览，两个模态层不重叠。
- 每次升级后首次打开提示一次；同版本、降级都不重复。勾选「下次不再提醒我」并确认后永久关闭，之后可从设置手动打开并取消勾选恢复。
- 确认、关闭、右上角 X、Escape、点击遮罩与程序性关闭共用同一个关闭函数；只有确认才应用皮肤并写入永久关闭开关。
- 只读工作区（损坏 / 来自更新版本 / 读取失败）不会为记录提示状态而写盘，也不会被误当新安装触发首次导览。

### 3. 数据与架构

- 新增三个可选附加字段：`prefs.skin`、`prefs.skinPromptSuppressed`、`meta.skinPromptVersion`；不改业务 schema 语义，旧工作区缺字段时按默认补齐。
- 便签排序：新增 `P.data.listActiveStickies()`（过滤废纸篓、保留数组顺序）与公开动作 `P.data.reorderStickies(ids)`（校验 id 集合完整无重复、拒绝部分应用、只调整活动便签顺序、不改 `x/y/z`、走既有保存链）。现代栅格排序可持久化，切回经典仍用原坐标与 z 叠放。
- 首帧在 `<html>` 上同时注入 `data-theme` 与 `data-skin`，现代工作区不再先闪一帧经典。
- 只读工作区在页面与外壳两侧同时封住写入：页面不再发送保存快照，外壳不排队 POST/DELETE。

### 4. 快捷键与无障碍

- 便签卡片与应用坞的 `Alt + ←/→` 重排不再吞掉 `Ctrl/Cmd + Alt + ←/→`（后者只负责窗口循环）。
- 键盘可达：皮肤选择页（含焦点管理）、便签重排（含读屏播报）、应用坞拖动都有键盘等价路径。
- 窗口标题栏在现代提供收起 / 关闭入口，行为走同一套窗口管理器动作。

### 5. 门禁与证据

- 新增源码级皮肤模型套件（版本比较与提示决策）、K3 数据兼容套件（排序非法输入、持久化、经典回切）、双皮肤真机套件（`--skin=classic|modern`）、经典像素回归对照与指纹（`--cdp`）、升级路径真机断言。
- 测量纪律固化：取值前必须"页面可见 + 动画静止 + 连续采样稳定"，避免把过渡/入场动画中间态当成产品缺陷。

### 6. 兼容与升级

- 老工作区没有皮肤字段时默认「纸屿经典」；升级后首次打开提示一次。
- DSH 官方限制：已安装插件不支持自动更新，需卸载后重装。
- 数据格式版本仍为 schema 4，本次不迁移业务数据。

## [0.5.2] - 2026-10-30

### 1. 两条示例提示词

- 新增「深层」「沟通原则」两条原生示例提示词（`sample: true`，带「示例」徽标）。
- 仅影响新建工作区、v1→v3 迁移与空态「放入示例」；已有工作区不被改写。
- 英文页补充对应翻译；`migrate_test` / `page_e2e` 的示例计数断言同步从 3 条更新到 5 条。
- README 的提示词截图更新为 5 条。

## [0.5.1] - 2026-10-30

### 1. README 与截图

- README 按仓库呈现规范重写：封面、简介、核心特性分组、安装、使用、配置、兼容性、项目结构、开发、发布与许可证；中英两版结构一一对应。
- 16 张功能截图按 0.5.0 界面重拍（8 张中文 + 8 张英文；1440×900 @2× → 1400px webp）。
- 仅文档与截图变更，无代码、数据格式或行为变化。

## [0.5.0] - 2026-10-29

### 1. 纸页可置顶
根因：纸页只有 `createdAt/updatedAt`，列表按新建时间倒序，没有任何置顶手段。
修法：`note.pinned`（默认 false）+ `validateWorkspace` 白名单放行 + `noteSort`（置顶优先，其余仍按新建时间倒序）+ 编辑器工具栏「置顶/取消置顶」（`aria-pressed`）+ 列表置顶徽标。工作区 schema 3 → 4：迁移只改 `version` 与 `meta`，不动任何节点数据；旧版读到 v4 会走只读保护，宿主另存 `workspace.v3.backup.json`。

### 2. 应用坞拖动有了选位动画
根因：拖动中图标只抬一下、邻位零反馈，松手 `buildDock()` 全量重建 → 硬切。
修法：拖动中缓存几何 + rAF 合并，被拖图标按 `--dock-dx/--dock-dy` 跟手、邻居 `translate3d` 连续让位；松手先同步提交，再用 FLIP 240ms 落位；键盘 Alt+方向键共用同一缓动；减少动效时全部退化为瞬时。

### 3. 「紧急但不重要」改绿
根因：`.cal-day__dot` / `.task-pip` / `.task-pip-btn::after` 三处把 urgent 与 none 都写成灰色（浅色差 1 个色阶，深色 pipBtn 完全相同）。
修法：urgent 三处统一 `var(--sage)`（浅 #7b8f72 / 深 #93a88a），none 深色改中性灰 #969696；四档两两可分。

### 4. 设置只留名称
根因：五个分区里有 5 条分区引言、12 条选项说明、2 条脚注、4 条动作副标题、1 段关于正文。
修法：全部删除（含运行时回写的示例计数），分区标题、选项名、按钮名、下拉值、统计卡、版本信息一个不少；死 CSS 一并清理；`en.json` / `en.templates.json` 死键同步删除。

### 5. 桌面右上角不再有文字
根因：保存状态的可见文字与时钟占了顶栏右侧。
修法：`#save-text` 改 `.sr-only`（读屏播报保留）、删掉「· 时间」段与整个 `.clock`；圆点状态与齿轮保留；导览第 5 步相应改写。

### 6. 纸页窗口删掉面包屑
`updateBreadcrumb` 与 `[data-breadcrumb]` 删除；窗口标题栏仍显示纸页名。

### 7. 日历与待办
表头改「周一…周日」（复用唯一短名表，英文页仍 M/T/W/T/F/S/S）；删「SELECTED DAY · 这一天」；待办详情删掉 4 条紧急程度说明与 2 条状态说明，「首次出现在 … · 已打卡 n 天」保留。

### 8. 提示词窗口
删掉「正在编辑 · 某某」整行与左栏底部两行注；四个动作按钮改为靠右；无选中时顶部条整体隐藏。

### 9. 对话输入框的提示词入口
删掉弹层底部的「只填入草稿，不会发送」，只留「在便签里管理 ↗」。

### README 截图
README 的 16 张截图已按 0.5.0 界面重拍（8 张中文 + 8 张英文；1440×900 @2× → 1400px webp），设置页、纸页页与提示词页不再显示本次删掉的文案。

## [0.4.4] - 2026-10-27

### 1. 深色下待办「+」图标不可见
日历「在 … 留一件事…」右侧的提交按钮把图标写死成 `#f7f7f7`，而深色主题的 `--ink` 是浅色 → 白底白图标，只剩一个白方块。改成 `color: var(--paper)`，深浅两色都看得见。

### 2. README 截图全部重拍
8 张功能截图改用当前界面渲染（1440×900 视口 @2× → 1400px webp），并新增 8 张英文界面截图给 `README.en.md`；
顺手修正「命令与应用」那张原本误截成「外观」页的问题。
## [0.4.3] - 2026-10-27

300% 缩放下面板只有约 408×489 CSS px 时仍按手机处理，且内容被窗口底边裁掉。

### 1. 鼠标永不整屏
整屏判据由 `(max-width: 600px), (pointer: coarse) and (max-width: 820px)` 改为只看 `(pointer: coarse)`：
300% 缩放的桌面面板不再被当成手机，窗口保留 10px 纸边、可拖可缩放；只有真触屏 / 手机才整屏。
实测 408×489@DPR3：窗口 408×395 整屏 → 368×339 带纸边、缩放手柄可见。

### 2. 矮窗口不再裁内容
窗口高度 ≤420px 时给 `.window` 挂 `is-short`：应用整块可滚动，并在纸页 / 提示词里先收起搜索与计数这类非必需行，把高度让给正文。
实测 408×489：纸页窗口内容 476px 可滚（此前编辑区被窗口底边切掉）；提示词列表由 14px 变为 165px。

### 3. 门禁
`run_all_checks` 的整屏断言改为「能力查询 + 无 max-width:600px 规则 + is-short 兜底」；
`page_e2e` 新增 408×489 鼠标窗口断言，整屏断言改用触摸模拟（真 `pointer: coarse`），不再用精细指针冒充触屏。
## [0.4.2] - 2026-10-27

四条反馈一次落地：issue #1 的窄面板显示、术语统一、设置改为「教程」、提示词弹层不再截断。

### 1. 300% 缩放（787×627 面板）退化成手机整屏（issue #1）
根因三层：
- 整屏 sheet 与「紧凑密度」共用 @media (max-width: 820px)：787 一进来，.window 被 width:100%!important 铺满，纸边与阴影消失；
- isMobile() 同一条 820 判据，beginDrag / beginResize 直接 return → 窗口既不能拖也不能缩放；
- 提示词两栏用「视口」宽度（860）判断，真正被压缩的是「窗口」宽度，于是列表可视区只剩 43px，而单条 83px。
修法：
- 整屏判据抽成唯一常量 (max-width: 600px), (pointer: coarse) and (max-width: 820px)：CSS 两处与 JS 一处逐字一致；
- 820 及以下只保留紧凑密度，不再整屏、不再禁拖拽；
- 提示词按「窗口自身宽度」三段排版（>700 / 520–700 / <=520），矮窗口收起 rail 说明，列表保证 3 条完整行；
- 短高补偿门槛 821 → 601，787×627 也吃得到。
实测（无头 Edge，787×627@DPR3）：窗口 787×483 整屏 → 747×477 带纸边、可拖可缩放；提示词单列 43px → 两栏、列表 313px、3 条完整行。1400×900 无回归。
门禁：page_e2e 新增 787×627 / 500×900 两段断言；run_all_checks 新增常量计数与关键字断言。

### 2. 「仅今日」改为「今日」
胶囊、待办详情选项、aria/title 三处措辞统一（此前胶囊写「仅今日」、aria 写「仅限今日」）；英文改为 Today，与 Daily 对仗。只动展示，schema / 迁移 / 导出格式不变。

### 3. 设置里的「快捷键」→「教程」
删除 8 条按键清单与相关 CSS（P.shortcuts、IS_MAC / MOD_LABEL / ALT_LABEL、.shortcut-* 规则），保留「新手导览 / 触屏 / 窗口」三行；分区 id shortcuts → tutorial；按键绑定本身全部保留（含 Ctrl+K 命令面板、Esc 关窗、应用坞 Alt+←/→ 重排等）。

### 4. 会话框「提示词」弹层不再只显示 8 条
去掉 items.slice(0, 8)；弹层高度与定位上限（340px）不变，超出的条目在列表内滚动，键盘 ↑↓ / Home / End / Enter 照旧。

## [0.4.1] - 2026-10-26

三处显示问题 + 中英双语（同一版本发布）。

### 1. 进入便签先闪一下米黄
根因：页面在 0.4.0 已换成中性色，但挂载页面的**外壳** CSS 还留着上一版的暖色
（.cys-panel #f1e7d4 / .cys-frame #f2ead9 / .cys-loading #f4ecdd，按钮与失败提示同族）。
面板一挂载就铺满这层色，直到页面 postMessage ready 才消失；iframe 还要等
GET /api/control-your-schedule/workspace 回来才创建，闪屏窗口更长。
修法：
- 外壳不再画任何插件自己的颜色：面板与 iframe 透明，加载层/错误层/host-note/按钮
  改用宿主 --dsw-alias-*；外壳里零暖色常量。
- 加载遮罩延迟 300ms 才出现（快路径根本不闪），ready 到达即撤销。
- 启动即预取工作区快照，面板挂载不再付第二次 GET；写入落地后缓存失效。
- embed() 把首帧主题写进页面的 <html data-theme>（快照 prefs.theme 为浅/深时用它，
  否则读宿主 body[data-ds-dark-theme]），深色用户也不会先看到一帧白。
门禁：smoke/shell_theme_test.mjs —— 12 条断言 + 13 个内存变异自检（正反两侧）。

### 2. macOS 顶部 48px 米黄带
根因：iframe 为 macOS 红绿灯让出 48px（DSH 的 --dsh-frame-top-clearance），
但让出的那一块没有任何东西绘制，露出外壳的 #f1e7d4。
（0.3.x 修过的是另一个 bug：让位后高度没扣减，iframe 溢出把应用坞裁掉。）
修法：
- iframe 回到 inset:0 全幅，不再让位。
- 宿主持有 --dsh-frame-top-clearance（仅 darwin，取计算值，不写死 48px），
  以 --cys-top-clearance 写进页面自己的 <html>。
- 页面顶栏向上多长同样高度、padding-top 让出同样高度：内容行位置不变，
  顶部那一带与顶栏是同一块 CSS（渐变、纸纹、深色覆盖），没有接缝。
门禁：page_e2e 增 10 条几何断言（0/37/48px、宽窄两档、elementFromPoint 命中顶栏、
无横向溢出、清空变量回到 56px）。

### 3. GitHub README 渲染错乱
根因：独立的 <img ...> 行后面没有空行时，GitHub 把它当作 HTML block 起始，
一直吞到下一个空行；期间的 `- **…**` 按原文输出（用 GitHub 实际渲染出的 HTML 证实，
不是字体问题）。
修法：中英两份 README 的每张截图前后补空行（只动空白，不改文案）；
新增 smoke/readme_lint.py（独立 img 行前后空行 + 顶部横幅 + 本地图片存在，含正反两侧自检）。

### 4. 中英双语
- 语言来源：默认跟随 DSH「设置 → 通用 → 语言」；「纸屿设置 → 外观 → 语言」可单独覆盖
  （跟随 DSH / 中文 / English），只在纸屿生效。
- 页面仍只有一份中文源；构建期按 assets/i18n/en.json 生成英文页，client.js 同时内嵌
  中英两页（构建产物，禁手改，--check 逐字节）。带参数/复数的句子走 F() + en.templates.json。
- 不翻译用户数据：便签、纸页、待办、提示词正文原样保留；示例内容按首次创建时的语言生成。
- 切换语言时先要一份即时快照再重建 iframe；窗口与每个应用正在看的内容都会恢复。
- 标识保留：纸屿 / Paper Isle；红色印章「屿」作为装饰字保留。
- 门禁：smoke/i18n_check.py（去掉注释后英文页零未翻译 CJK，白名单仅「屿」；
  词典无空值/无多余键；--self-test 喂删键副本必须红）；page_e2e 中英两页都跑。

### 5. 发布前审查与视觉验收修正
- **未命名提示词不再写进数据**：旧版把「未命名提示词」当标题写进过快照，英文构建还写出过
  「Untitled prompt」；现在无标题就是空串，显示用本地化占位，旧值读入时归一为空。
  这样中文快照在英文界面里不会再露出中文。composer 侧同一口径（空标题 → 未命名）。
- **跳过不算通过**：page_e2e 没有可用浏览器时改为 exit 3（SKIP），不再 exit 0 被记成 PASS。
- **外壳暖色门禁升级**：从「8 个已知色值」改为解析全部 CSS 规则；background / border / color
  只允许 transparent / var(--dsw-*) / inherit / currentColor / none / 0，hex/rgb(a)/命名色、
  第二条规则、var() fallback 里的暖色都会红。
- **词典死键**：i18n_check 改为真实 lookup 口径，死键判红；en.json 清掉 59 条 F() 化后的
  拼接残留（767 → 708 键）。
- **icon 纳入构建校验**：build_page.py --check 同时逐字节校验 icon.svg。
- **英文文案与版式**：示例便签压到两行（不再裁掉末行）；待保存 → Unsaved；导览 Tap → Click；
  Stickies → Sticky notes；窗口标题在 kicker 与标题同词时只显示一次（中英同一规则）。
- **深色可读性**：便签「示例」小标签 1.58:1 → 4.39:1（中英同修，e2e 加 ≥3 断言）。
- 验收截图改为先关闭新手导览再拍（0.46 遮罩会把深色页压暗），并补中文/英文深色便签页。

## [0.4.0] - 2026-10-24

五条用户反馈落地：状态排版、深色可读性、命令面板并入设置、应用坞可排序、配色与 DSH 对齐。

### 1. 待办「状态」不再竖排
根因是 .priority-option 的 grid-template-columns: 10px auto —— 那个 10px 首列是给
「紧急程度」的色点 .task-pip 留的；「状态」两项没有色点，标签直接落进 10px 列，
中文单字宽度大于列宽，于是逐字换行。新增 .priority-list--repeat 覆写为
minmax(112px, max-content) 1fr，标签在左、说明在右，窄于 560px 回落两行。
文案同时把「每天 · 直到解决」改成「每天，直到解决」。

### 2. 深色
- 命令面板的白边来自 box-shadow: 0 2px 0 rgba(255,255,255,0.6) inset（合成 #aaa9a8，6.18:1），
  尖角来自 border-radius: 3px；面板整体删除后消失，其余承载面的白内高光在深色下一律压到 4%。
- 文字令牌换成 DSH 的 label 值：ink #f9fafb / soft #cfd3d6 / faint #adb2b8 / ghost #81858c。
  改前被当正文用的 ghost 只有 3.16:1，改后 faint 在 raised 上是 6.53:1。
- 38 处「正文却用 ghost」改指 faint，并把这条写成门禁：ghost stays a decoration token。
- 层次：桌面 #1b1b1c、纸面 #232324、浮层 #2c2c2e、凹槽 #151517（DSH 原值），
  桌面与窗口的分离从 1.01:1 变成 1.45:1；同时把此前 0 引用的 --paper-sink、--paper-edge 真正用起来。

### 3. 命令面板并入设置
删除浮层 DOM/CSS/JS（约 340 行 JS + 215 行 CSS）与顶栏放大镜按钮；设置左栏新增第一分区
「命令与应用」（搜索 + 应用/操作/最近纸页 + 上下键 Enter Esc），Ctrl/Cmd+K 直接落到该分区。
命令的清单与执行留在 shell，挂成 P.commands（单一事实源），设置只负责渲染 ——
避免重演「跨闭包调用不到 quickNewNote」那类事故。
执行后只有落点不是设置时才把设置收起；「打开设置 · 工作区」这类切分区的命令留在原地。
设置图标从陶土圆印章换成齿轮（坞图标 + 顶栏按钮 + 命令行三处同源）。

### 4. 应用坞可拖拽排序
prefs.dockOrder 为唯一事实源，五处读写同步（createEmptyState / setPrefs / hydrate /
sanitizePrefs / createSeed）。6px 阈值区分点击与拖拽；拖动时抬起 + 插入位竖线；
未知 id 丢弃、重复去重、缺失的应用按注册顺序补到末尾；Alt + 左右箭头 是键盘等价物；
设置 → 外观里「恢复默认」。

### 5. 与 DSH 对齐
大色块全部换成 DSH 的原始值（浅色 #ffffff / #f9fafb / #f1f3f5，深色 #232324 / #1b1b1c /
#2c2c2e / #151517），边框改用 border-l1/l2 口径；外壳里 356 处暖色声明按「同明度转中性」
批量处理（两轮：227 处外壳 + 129 处应用内承载面）。
身份资产原样保留：纸纹噪点、衬线标题、便签五色、胶带、印章、clay 强调色。
新增「宿主令牌桥」：iframe 不继承父文档的 CSS 变量，所以运行时读 parent.document.body 的
--dsw-alias-* 写回本页，并用 MutationObserver 盯住宿主 data-ds-dark-theme ——
原来只监听 prefers-color-scheme，在 DSH 里点深色要刷新才生效。
「纸张颜色」三档下线，换成「纸纹」开关。

### 实机反馈后的三处修正（0.4.0 未发布前，同日）

**1. 设置里「恢复默认」被挤成两行**
根因不是文案：.paper-btn 没有 white-space: nowrap，也没有 flex: 0 0 auto；所在的 .setting-row 是
justify-content: space-between，左侧说明很长，按钮被压到最窄就折行。
修法：.paper-btn 全局加 flex: 0 0 auto; white-space: nowrap（同类挤压在 0.3.0 的「＋新建」上已发生过）。

**2. 深色「像蒙了一层灰」**
量出来的：窗口正文应为 #232324 (35,35,36)，实际渲染 (44,44,46)，+9；桌面应为 #1b1b1c (27,27,28)，
实际 (40,40,40)，+13。根因三条：
- 噪点纹理叠了两层（.window 一次、.app 一次），深色下 4% 灰噪点把整屏抬亮；
- .window:not(.is-focused) .window__body { opacity: .945 } 让未聚焦窗口和深色桌面混色；
- 便签纸深色版还是 0.3.x 暖炭时代的值，和冷中性外壳只差 1.1:1，看起来「脏」。
修法：深色彻底关噪点（--paper-noise / --grain: none）；浅色只由 .window 铺一层、alpha 4% 降到 2.5%；
删掉未聚焦窗口的正文透明度；便签深色纸提亮一档（保色相）；坞按钮深色底改为透明（只留 hover）。
复测：窗口正文 (28,28,29)，桌面 (35,35,36) 正好是纸面色 —— 不再有那层纱。

**3. 侧栏图标是彩色的，和官方画风不符**
侧栏图标是本插件自己的内联 SVG（src/client.src.js 的 SidebarIcon），原图是黄纸+棕线+陶土圆点的彩色纸片；
DSH 自己的侧栏是 16px、1.5px 描边的单色线性图标。
修法：新增 sidebar-icon.svg（折角便签轮廓，stroke=currentColor），内联 SVG 因此自动跟随宿主文字色；
包根 icon.svg 由构建从同一张图生成、描边固定 #8a8f98（它走 <img>，拿不到 currentColor）。
build_page.py 不再从页面里抽便签插画当图标，改为读 sidebar-icon.svg；package.json 的 files 同步。

门禁新增 dark mode is not veiled（深色必须无噪点、每扇窗只铺一层、未聚焦不变淡、长按钮不折行、
侧栏图标必须用 currentColor 且构建确实读它）。反向审计：把噪点与未聚焦透明度塞回去 → exit 1，
点名 dark has no noise overlay / dark has no grain overlay / inactive window does not dim its body；
恢复后 PASS 101 / FAIL 0 / SKIP 2、PASS 90 / FAIL 0。

**4. 深色下坞图标的悬停提示条看不清**
dock__tip 的文字用 color: var(--ink)（深色下是近白），底色却仍是 rgba(249,249,249,.97) 的近白，
而且从来没有深色覆盖 —— 于是白底白字，对比度约 1:1。
量出来的旧值：白底 rgb(249,249,249) + 白字 rgb(249,250,251)；修后 rgb(53,53,56) 底 + rgb(249,250,251) 字，11.7:1。
同一类问题顺手清了一批：icon-btn:hover / save-pill:hover / topbar__btn:hover / calendar-month__nav:hover /
draw-tool-btn:hover / draw-nav(:hover) / setting-action__icon 与 select-wrap select 都补了深色落地。
门禁新增 no light pills left uncovered in dark（凡是「浅底 + ink 文字」的选择器都必须有深色覆盖；
文件柜与窗口三件套这两个已删功能的残留选择器在允许表里并注明原因），
page_e2e 新增 dark dock tooltip stays readable（深色下实测提示条前景/背景对比度，要求 >= 4.5，实际 11.7）。
反向审计：删掉 dock__tip 的深色覆盖 → exit 1，点名 dock__tip。
### 门禁
| 套件 | 结果 |
|---|---|
| smoke/run_all_checks.py | **PASS 98 / FAIL 0 / SKIP 2** |
| smoke/page_e2e.mjs（无头 Edge，82 项） | **PASS 82 / FAIL 0** |

新增：深色对比度门禁（直接从令牌块算 WCAG）、深色明度阶梯、ghost 只做装饰、命令分区唯一入口、
命令面板必须完全消失、坞顺序持久化 + 拖拽 + 点击不误判、状态整行化。

**反向审计**（注入已知坏输入，确认门禁真的会红并点名）：
| 注入 | 结果 |
|---|---|
| 把 --ink-faint 改回 #7d7566 | FAIL dark text contrast floor，点名 3.06 / 3.45 两处不达 4.5 |
| 把 --desk-a 改成与纸面同色 | FAIL dark elevation ladder，点名 Y 相等 |
| 删掉导航里的「命令与应用」并让一条正文回退 ghost | FAIL 3 条：命令分区按钮缺失、构建陈旧、ghost 用量 16 大于 15 |

恢复后复跑：**PASS 99 / FAIL 0 / SKIP 2**、**PASS 89 / FAIL 0**。

## [0.3.1] - 2026-10-22

修掉 0.3.0 里「提示词编辑器只能粘贴、不能打字」的回归。

### 根因
编辑器每次收到 `prompts` 变更事件都会把整块 DOM 重建（`refs.editor.innerHTML = ''`），
而输入本身就会写库并触发该事件 —— 于是**打完第一个字、防抖一提交，输入框就被换掉**，
焦点落到 body 上，后续按键全部丢失。粘贴能成功，是因为它一次性填完，不需要连续焦点。

### 修法
把「重建」与「同步」拆开：
- `editorFor` 记住当前编辑器是为哪一条提示词建的；**只有选中项变化**时才重建 DOM；
- 其余变更只更新栏头标题、字数、置顶态（`updateEditorMeta`）；
- 正在编辑器里输入时**不动左侧列表**（避免整表重建、也避免行在脚下重排），失焦时补一次；
- 顺带：新建提示词的标题栏改为空值 + placeholder（原来会把「未命名提示词」预填进去，
  得先删掉才能写），新建后焦点落在标题栏。

### 门禁（真正该有的那类断言）
page_e2e 新增 6 条走**真实输入路径**（CDP `Input.insertText`，不是给 `value` 赋值）：
打字 → 等过防抖 → 继续打字，断言 ①标题连续成文 ②焦点仍在输入框 ③内容进了存储；正文同理。
反向审计：把订阅回调改回「每次重建」，这 6 条立刻红，并复现用户看到的现象
（只进去第一个词、焦点丢失、库里只有半截）。

## [0.3.0] - 2026-10-21

新增「提示词」：一份在纸屿里维护、在对话输入框里随手取用的常用提示词库。
它只在**你点了才填进草稿**，不进系统提示词、不自动发送。

### 新增：纸屿应用坞第 5 个应用「提示词」
- **有自己的视觉语言，不是笔记的换皮**：陶土色主调（笔记是鼠尾草绿）、左栏「索引卡抽屉」
  （01/02/03 编号 + 左侧陶土色书签条）、右栏「一张立起来的卡」（顶部压线、大号衬线标题、左侧虚线书脊），
  正文写在纸上而不是表单框里。
- 左列表（搜索标题与正文、置顶优先、条数）+ 右编辑器（标题、多行正文、字数、字段回显）。
- 新建 / 复制正文 / 复制一条 / 置顶 / 删除（删除有确认框）；正文上限 20000 字，最多 300 条。
- 窄窗（≤820px）自动切成上下两栏，卡片与动作区一起收紧。

### 原生示例提示词（三条，随包发布）
- 内容就是用户给的那三句：调研同类产品再动手 / 先对齐需求再动手 / 多开子代理争最好效果。
- **唯一一份定义**（`P.SAMPLE_PROMPTS`），三处共用：首次运行、v1→v3 与 v2→v3 迁移、
  空态里的「放入示例」。
- 已经用过旧版的用户也能看到：**v3 但文件里没有 `prompts` 字段**的旧快照会被补上这三条；
  而空数组（用户自己删空/清过示例）**不会**被偷偷填回来。
- 都带 `sample: true`，设置里的「清除示例」会把它们连便签/纸页示例一起清掉。

### 新增：每个对话输入框的「提示词」入口
- 注册在宿主 `conversation.input.left`（输入框工具行左侧），与权限/计划 chip 同排。
- 点开在按钮上方弹出小列表：置顶在前、最多 8 行、↑↓/Enter/Esc、点外部关闭。
- 填入规则：草稿为空走 `setDraft`（多行正确成段）；草稿非空走 `captureInsertion` + `insertText`
  （单步可撤销、保留原有内容与引用 chip）；输入框正在发送则拒绝并提示，不丢内容。
- 关闭时把焦点还给打开前的元素；只读公开 action face，不读宿主内部 DOM、不用 portal。
- 底栏「在便签里管理 ↗」直接切到纸屿并打开提示词窗口。

### 数据与兼容
- 工作区 schema **v2 → v3**：新增顶层 `prompts`，迁移只做加法（v1→v3 / v2→v3 逐值保留）。
- 为什么升版本：v3 文件被 0.2.x 读到会走「来自更新版本、只读保护」，而不是被旧白名单丢掉再写回。
- **Host 侧零改动**：提示词复用既有 `/api/control-your-schedule/workspace`，不需为此重启 DSH。
- 客户端新增 peer `@deepseek-ai/dsh-client-ui-conversation`（宽下界 `>=0.2.0-0`）。

### 门禁
- 静态套件 `PASS 79 / FAIL 0 / SKIP 2`（SKIP = 未加 --cdp 的两项真机检查，单独计数）。
- 迁移测试扩到 **31 条**：v1→v3、v2→v3、含提示词的 v3 原样通过。
- 新增纯函数门禁 `prompt_model_test.mjs`（**11 条**）：置顶排序、缺标题占位、非法行丢弃、
  光标插入、空/失效回退整段、忙时重试一次后拒绝、action face 缺失不抛错。
- 页面真机（无头 Edge）**58 条**：应用可开、列表/搜索/置顶/改名/复制/删除、
  字段经 validate 回环不丢、多行保留、示例随其他示例一起清除、刷新后仍在。
- 新增 `smoke/composer_e2e.mjs`（需 DSH_BASE + DSH_WEB_TOKEN）：入口可见 → 弹层 → 填入草稿 → 关闭。
  缺 token 时显式 SKIP 并单列，不计入通过。

## [0.2.3] - 2026-10-21

### 去掉无意义的占位文案
- 未完成的一次性待办不再显示「被放在这一天」，没有信息就不占位。
- 有意义的元信息照旧显示：已完成时间、打卡天数、已解决日期。

### 「每天出现」的逐日验证
- 实测未来 4 天：每天恰好 1 条当前实例，且都是未完成。
- 今天打卡后：今天这条变已完成；明天自动是一条**未完成的新实例**（`current: true`）。
- 收起后：未来不再长新实例，但已打卡那天仍留在日历上。

### 门禁
- 真机断言增至 **41 条**，新增两条直接盯这两处：
  - 未完成一次性待办的 meta 必须为空；
  - 持久待办连续 4 天各 1 条、打卡后次日重置为未完成。
- 项目门禁 `PASS 75 / FAIL 0 / SKIP 0`。
## [0.2.2] - 2026-10-21

修掉三处用户实测反馈的问题。

### 关掉所有浮层提示
- 用户要求「这个弹窗显示着就很丑，直接把这个弹窗提示都去掉」。
- 做法是给 `toast()` 加 `TOAST_ENABLED = false` 开关，**保留全部调用点与签名**，只让它不显示；
  直接删调用会在 `if (...) { toast(...) }` 处留下空块，把页面结构改坏（本轮踩过，已回滚重做）。

### 紧急程度浮层只留四行
- 删掉每档下面的解释文字（`priority-popover__hint` 元素与对应 CSS），浮层高度从约 300px 降到 152px。
- 保留四行档位名：重要且紧急 / 重要但不紧急 / 紧急但不重要 / 不紧急也不重要。

### 改成「每天」后待办当场消失（真逻辑 bug）
- 根因：`taskVisibleOn` 对 `repeat: daily` 只允许「今天」或「打过卡的日子」可见，**漏了它自己的锚定日**。
  所以在非今天的那一天把待办改成每天，它的 `date` 仍是那天，却既不等于今天也没打卡 → 当场消失。
- 修法：`day === task.date` 直接可见；未来仍不铺、没打卡的过去仍不显示。
- 真机复现：在 2026-10-19 把一条待办从「仅今日」切成「每天」，行仍在、胶囊变「每天」、投影数仍为 1。

### 门禁
- 真机断言增至 **39 条**：浮层提示确实不出现、浮层只有四档且无解释行、锚定日切换后不消失。
- 项目门禁 `PASS 75 / FAIL 0 / SKIP 0`。
## [0.2.1] - 2026-10-21

修掉 0.2.0 里三处「看起来做了、其实没生效」的问题。

### 待办行：紧急程度与状态就地可改
- 待办行右侧新增两枚控件：**色点**（点开四色小浮层，选中即生效、不弹大对话框）与**状态胶囊**（`仅今日` / `每天`，点一下直接切换）。
- 修掉「已有待办点编辑没反应」：详情弹层用了不在作用域内的 `el()`，点击即抛 `ReferenceError`，四档紧急程度因此从未真正可用过。
- 详情弹层保留，用于改标题、看打卡天数等。

### 已完成的圆点终于是灰色
- 原因是 CSS 特异性：`.cal-day__dot[data-priority="…"]`(0-2-0) 压过 `.cal-day__dot--done`(0-1-0)，完成态形同虚设。
- 改为 `.cal-day__dot.cal-day__dot--done`，并补深色档；真机实测完成点 `rgb(157,154,144)`、未完成点仍为档位色。

### 切走再回来保持原状
- 便签窗口现在记住滚动位置与最后碰过的那张便签（写进窗口 `params.view`，随桌面布局一起落盘）。
- 新增 `storage.flushNow()`：宿主拆 iframe 前会发 `flush-now`，页面同步落一次盘再回话；
- `client.js` 卸载顺序改为「先要最终快照（≤200ms）→ 再 flush → 最后拆 iframe」，关掉原先 420ms 防抖来不及送出的丢失窗口。

### 门禁
- 真机断言从 30 条增至 **36 条**：行内控件存在、浮层四档可选并落库、详情弹层能打开、完成点与未完成点色彩不同、便签滚动位置进入快照、`flushNow` 可用。
- 项目门禁 `PASS 75 / FAIL 0 / SKIP 0`。
## [0.2.0] - 2026-10-21

按 13 条使用反馈重做界面与数据层。**升级不会丢数据**：工作区 schema 从 v1 升到 v2，
旧快照会自动迁移，Host 写盘前会把旧版本另存 `workspace.v1.backup.json`。

### 数据与升级
- 新增迁移阶梯（`P.migrateWorkspace`）与唯一入口 `ingestWorkspace`；Host 快照、IndexedDB、
  localStorage、恢复日志、导入文件五条加载路径统一走它。
- 修复「版本一升，旧快照被判无效并立刻被示例桌面覆盖」的丢数据路径。
- 载入到**更高版本**的工作区时不再 seed、不再写盘，只提示升级插件。
- 任务完成态由 `done` 布尔改为 `doneOn` 日期数组；v1 的 `done` 按日期迁移过去。

### 便签
- 正文默认使用内置手写体（霞鹜文楷子集，OFL），新增「便签字形」三档：内置文楷 / 系统行楷 / 纸张宋体。
- 整张便签都能拖着走（正文、滚动条、色块、删除键除外），不再只能按住左上角把手。
- 叠放顺序改为「最后碰过的那张在最上面」，并持久化。
- 删除不再弹「贴回去」提示，改为顶部「废纸篓」：只收非空便签，保留 7 天后自动彻底删除，随时可放回去。

### 日历与待办
- 新增四档紧急程度（重要且紧急 / 重要但不紧急 / 紧急但不重要 / 都不紧急），各自一个颜色；
  日历格子里只显示对应颜色的小圆点，钉在格子底部，完成后变灰但位置不变。
- 新增待办「状态」：仅限今日 / 每天出现直到解决。持久待办只在今天和真正打卡过的日子出现，
  不铺未来；收起后保留「打卡 N 天」并可恢复。
- 待办详情弹层（标题 + 紧急程度栏 + 状态）；删除撤销改为原样回填，不再丢打卡记录。
- 「本月 N 件」改为条目数（持久待办恒算 1），不再随打卡天数增长。
- 右侧今日纸签待办溢出时只显示省略号。

### 纸页笔记
- 删除左上角「已保存到纸屿」、底部「自动保存 · 无需手动提交」与「删除这张纸页」。
- 新纸页标题改为 placeholder，不再直接写一行「未命名纸页」；正文 placeholder 首句号改逗号。

### 画纸
- 画纸簿新增左右翻页按钮；新增「删掉这张」，可撤销找回。

### 外观与文案
- 新增三档配色：跟随 DSH（默认）/ 浅色 / 深色；只读宿主主题信号，不写宿主 DOM。
- 去掉窗口内重复的应用标题行，标题只剩窗口标题栏一处。
- 删除「选择底部应用开始」「从底部应用坞打开应用…」「TODAY'S PAPER」「外观 · 数据 · 快捷键 · 关于」。
- 「YOUR PAPER DESK」移到「把今天，写成一张纸。」下方。
- 「宜书写」改为按日期确定性随机（同一天恒定），候选 13 条。
- 首次打开应用铺满工作区，不再按各自尺寸错开。
- 「桌面收好了」提示改为右下角、更小、更淡。

### 一致性
- 切换 DSH 面板再回来会恢复打开的窗口与各应用正在看的对象（选中的纸页/那一天/那张画纸/设置分区）。
- 页面版本号由构建从 `package.json` 注入，界面不再停在旧版本号。

### 复核后补强（同日）
- 拒收路径不再 seed 覆盖：任何过不了校验的工作区都走只读，并把原稿另存一份；Host 每次写盘前留 workspace.prev.json。
- 深色档补齐笔记编辑区、导览卡、废纸篓条目、紧急程度选项，修掉一个死选择器；真机实测承载面亮度 0.017、正文对比度 10.6:1。
- 废纸篓改为启动时清理；已解决的持久待办不再算「没做」；便签 z 序到顶自动归一化。
- 迁移门禁两条恒真断言改为可失败断言；真机新增字段回环用例（走 ingestWorkspace 验证 priority/repeat/doneOn/resolvedAt/z/trashedAt）。
- 删除死导出 listTasks / listStoredTasks / projectRange 与空转缓存失效函数。
### 门禁
- 新增迁移门禁 `smoke/migrate_test.mjs`（v1 真实快照逐字段比对 + v(N+1)/缺字段反向用例）。
- 新增真机页面检查 `smoke/page_e2e.mjs`（无头浏览器 25 项断言，`--cdp` 时纳入门禁）。
- Host 路由测试补上「升级前备份」与「内置字体路由」。
- 项目门禁：`PASS 75 / FAIL 0 / SKIP 0`（含真机）；反向审计 4 项注入均按预期变红。

## [0.1.6] - 2026-10-18

- 文档：README 的安装说明改为「npm 一行包名」优先，删掉「暂未发布」的旧说明；代码与 0.1.4 相同。

## [0.1.4] - 2026-10-18

- 发布到 npm：现在可以直接在 DSH「Add plugin」里填 `dsh-plugin-control-your-schedule` 安装，不必再填完整 GitHub 地址。
- 修复提示条（toast）叠加：同一时刻只保留一条，新消息替换旧消息、重复消息只重置计时；停留时间缩短为信息 1.6s / 提醒 2.2s / 错误 3.2s（上限 3.2s）。
- 修复 macOS 原生全屏下底部应用坞被遮住一截：iframe 顶部让位 48px 时高度没有相应扣减，导致内容溢出面板、被裁掉底部；改为按顶部让位量扣减高度。

## [0.1.3] - 2026-10-18

- 删除底部应用坞下方的「点击图标打开应用」说明文字。
- 新增：点击窗口外的空白桌面，一键把所有窗口收进应用坞（与房子按钮一致，不销毁窗口，点图标可恢复）。
- 新手导览第 4 步同步说明“点空白桌面也可以收好全部窗口”。

## [0.1.2] - 2026-10-18

- 右侧「今日纸签」改为固定右栏：窗口只在左侧工作区活动，不再遮住它；窄屏（≥821px）也保留。
- 去掉所有应用窗口的最小化/最大化/关闭三个按钮，标题栏只负责拖动；收起窗口改为点底部应用坞图标，房子按钮一键收好；关闭当前窗口可用 Ctrl/Cmd + Alt + W 或命令面板。
- 所有窗口、对话框、命令面板统一 18px 圆角，去掉外层错位纸边。
- 移除双击标题栏最大化；旧布局里保存的最大化状态会自动忽略。

## [0.1.1] - 2026-10-18

修复：

- 修复窗口层被多余的 `</div>` 挪出 `#stage` 的问题：窗口标题栏不再被顶部工具栏盖住，最大化后也能点关闭/最小化/拖动。
- 增加 DOM 嵌套门禁：窗口层、今日纸签、应用坞、导览卡必须在 `#stage` 内。

## [0.1.0] - 2026-10-18

首发：

- 左侧栏「便签」入口 + 全屏纸屿主面板。
- 便签 / 纸页笔记 / 日历待办 / 画纸四个应用；删除文件柜入口与左侧桌面图标列。
- 字号整体放大，底部应用坞图标放大；便签改为专用拖动把手 + 10px 移动阈值。
- 6 步新手导览，重点说明「收好桌面」；首次打开自动播放，可在设置中重播。
- 数据落盘到 $DSH_HOME/control-your-schedule/workspace.json，并保留浏览器缓存。
- 导出 / 导入工作区 JSON；页面契约与构建逐字节门禁。

### 独立复核后补的（同日）
- 触屏：`.dock`/`.dock__btn` 加 `touch-action: none`；`pointercancel` 从「提交顺序」拆成「只清理」。
  之前手势被系统收走（触屏滚动/来电）也会把拖到一半的顺序写进 prefs。
- 读屏：命令输入框补 `role="combobox"` + `aria-controls` + `aria-activedescendant`，每条选项给稳定 id；
  应用坞加 `aria-live`，拖动或 `Alt+←/→` 后播报「已移到第 N 位，共 M 位」。
- 深色下前景窗口与普通窗口阴影原本完全相同，叠放时看不出层级；给 `.window.is-focused` 单列一档。
- ghost 门禁从「计数 <= 15」改成**选择器白名单**，避免重排 CSS 造成假红/假绿；顺手把面包屑 hover 从 ghost 提到 faint。
- 拖拽后的点击静默期从全局收窄到「只对这一枚图标」；`theme-color` 从旧纸色改成 `#f9fafb`。
- 新增「宿主令牌桥」的父子页夹具验证：跟随 DSH 时读宿主值、宿主切深色 iframe 实时变、强制浅色时宿主令牌让位。
  最后一条是修 bug：原实现无条件吃宿主令牌，强制浅色 + 宿主深色会反色。
