| type | readme | |||
|---|---|---|---|---|
| title | 敏敏子倒计时 | |||
| tags |
|
|||
| intent | 说明敏敏子倒计时的功能、运行方式和维护入口。 |
基于 C# / .NET 10 WPF 的 Windows 桌面多倒计时工具。用户可以为不同目标命名并分别设置截止时刻,程序统一按北京时间(UTC+8)计算、排序和显示;PowerShell 7 继续负责安装、计划任务和办公室部署。
- 悬浮窗可选择精确到天、小时、分钟或秒,统一显示“天 / 小时 / 分钟 / 秒”单位
- 截止时间统一按
China Standard Time处理 - 应用固定为单一日间暖色主题,不再提供主题切换入口;旧设置中的任何主题值(Auto / Day / Night / 未知值)启动时一律按日间解释,不报错、不丢数据
- 同时保存和展示多个具名倒计时
- 倒计时与便签共用同一管理窗口和桌面悬浮入口;便签可新增、编辑正文、年月日日期和标签、勾选完成、删除。完整管理窗口用并排的“未完成 / 已完成”分段切换控件选择显示哪个状态列表:两段同屏可点、各带数量徽章,两个状态列表不同时显示,默认选中未完成;列表内按较新日期和同日较新添加项优先显示,每个日期分组都可独立收起、展开
- 每条便签和用户倒计时可在共享次级编辑器中管理最多 8 条绝对一次、固定间隔或类型化日/周/月/年日历规则;用户倒计时还支持到点或提前
0..5,256,000分钟的相对目标规则。日历规则按北京时间解释、以规范 UTC occurrence 持久化,不存在日期跳过,显式“最后一天”按月长和闰年计算;冷启动和长时间延迟只补发每条规则最新的错过 occurrence。编辑倒计时目标会用相同 rule ID 安全重算未送达相对 occurrence,派生时刻已过去时整笔倒计时编辑不提交 - 到期便签与用户倒计时统一进入单一提醒中心;同一时刻的条目批量加入,后续条目追加并稳定排序,但每条规则最多保留一个未解决发生项,处于稍后或送达失败状态时不会再展示同规则的新基础周期。两类都提供“知道了 / 稍后提醒 / 打开来源”,只有便签提供“完成便签”,均不提供删除;打开来源会恢复管理窗口,保留既有草稿与筛选,临时揭示准确来源卡片并聚焦其编辑入口。知道了、稍后、完成便签及送达写盘失败都保留原状态和条目并按 5、10、20、30 秒退避重试。提醒中心与规则编辑器可从窗口头部拖动;提醒中心首次显示贴齐工作区右上,之后保留手动位置
- 倒计时与便签共用一套多选标签:可新建、改名、删除和关联;新建标签沿用暖白、蜜桃、便签黄和珊瑚色板,删除标签只解除关联,不删除任何倒计时或便签
- 标签筛选只作用于当前工作区,支持“全部 / 无标签 / 已选标签”;多选标签可按“任一 / 全部”匹配
- 倒计时可将标签条件与“进行中 / 已到期”叠加筛选;便签可继续叠加“未完成 / 已完成”、正文搜索,以及精确日期或“未设置日期”
- 管理窗口与桌面悬浮窗共享筛选条件;从悬浮窗打开管理窗口时沿用悬浮窗当前工作区。悬浮倒计时始终只显示进行中项目,便签快速新增在进入新增状态时以当时的筛选标签初始化;标签选择器未选择时显示“选择标签”,已选择时显示标签名称(两个以顿号并列,三个及以上显示“首个名称 +N”,超长截断为省略号),点击弹出复选列表可多选或逐项取消勾选
- 悬浮窗便签工作区提供折叠式正文搜索:“搜索便签”按钮或
Ctrl+F切换到便签工作区、展开输入行并聚焦(占位“搜索便签”,最长 140 字符);Esc或“✕”清除钮清空搜索词并收起。提示条三态:无词且收起时不显示搜索行;收起且有词时显示“搜索:{词}”与“✕”,点击词钮重新展开聚焦;展开时显示输入行。搜索词与管理窗口共享同一筛选态,只忽略大小写匹配未完成便签正文,不写入设置 - 管理窗口便签页
Ctrl+F直接聚焦便签搜索;倒计时页没有正文搜索,Ctrl+F仍打开倒计时筛选。悬浮窗Ctrl+R或托盘菜单「复位窗口位置」把悬浮窗夹回当前工作区,完成窗口归位不依赖拖动 - 管理窗输入时可用
Ctrl+1/2切换工作区、Ctrl+T标签管理、Ctrl+M收起、Ctrl+S保存当前倒计时或便签;弹层打开时全局快捷键暂停。名称、标签名、月薪和工时字段Enter提交所在表单;两窗便签正文Enter换行、Ctrl+Enter提交。列表行的Delete打开安全默认取消的删除确认;文本输入中的Ctrl+Z保留编辑撤销,离开输入后可撤销最近删除(#224)。按钮提示中可查看对应快捷键 - 倒计时和便签日期都通过主题化日历选择,点击日期文字或下拉按钮都可打开日历;倒计时的时、分、秒下拉点击文字区域即可打开,不要求点到箭头
- 倒计时编辑器通过提醒规则单选组选择“不提醒 / 按时间提醒 / 自定义提醒”,新增时默认不提醒;按时间提醒会在截止时刻提醒一次,自定义提醒可配置多条提醒规则
- 新增、编辑和删除后自动保存,启动时自动恢复
- 删除倒计时或便签前弹确认框且以取消为安全默认,并写明删除后 10 秒内可撤销;删除成功后,撤销出现在发起删除的窗口(悬浮窗底部状态行或管理窗口状态区),10 秒内可点击或按 Ctrl+Z,焦点或悬停在撤销按钮上时暂停计时,只保留最近一次删除(#214)。提醒中心「完成便签」先确认再提交;从悬浮窗、托盘或 Alt+F4 退出时都会先确认,并写明退出后不再提醒;有未保存的编辑器草稿或显示设置时,确认框会列出这些项。取消则留在应用。只隐藏管理窗口则继续保留草稿
- 图标按钮提供自动化名,装饰手写体与纯装饰图标不参与屏幕阅读器朗读;可见字段标签通过标签关系指向输入;数量变化由单一状态区整句播报
- 每次合法保存维护
settings.json.backup1/.backup2两代设备本地备份;主设置损坏或不可读时只提供“恢复备份 / 退出”,不会静默恢复或以空设置继续。恢复前保留可读的原始损坏字节,且只有从主路径回读校验成功后才启动窗口 - 旧版单倒计时设置自动迁移为“我的倒计时”
- 到期项目保留在管理列表并显示“已到期”;悬浮窗仅显示进行中的项目,按截止时间排序
- 可输入月薪和上下班时间,实时计算“今日已赚”
- 工资按当月实际工作日计算,并同步法定带薪休假和调休补班日历;日历按本地缓存、联网结果、随包年度数据的顺序取值,日历未就绪时不会显示估算金额,悬浮窗底部状态会说明影响范围与恢复方式(「节假日安排未就绪:距离下班和今日已赚暂不可用,联网后自动恢复」)。随包数据的来源、覆盖年份、许可证和更新方式见 holiday-data/README.md;北京时间进入 12 月后若随包数据尚未覆盖下一年,发布契约校验会明确失败并提示补数据(#218)
- 节假日日历已就绪时,悬浮窗会在实际工作日、下班前把“距离下班”倒计时固定显示为首行唯一主项,使用主项的粉色底、红色强调、字体和数字色块分格的剩余时间效果,并显示“超期待!”徽章;它不是用户记录,没有规则集合、编辑入口或提醒 occurrence。没有“距离下班”时,第一个普通倒计时仍是主项
- 登录 Windows 后自动启动,默认以小型悬浮框显示所有进行中的倒计时
- 悬浮框除按钮、输入框和滚动区等交互控件外,整个背景区域都可拖动;手动位置在内容刷新后保留,并按当前工作区边界收紧,点击“管理”打开完整编辑窗口,关闭管理窗口不会停止悬浮显示
- 点击悬浮框标题栏的“缩小”按钮会隐藏悬浮窗;应用运行期间系统托盘图标常驻,单击图标或选择“打开悬浮窗”可恢复悬浮窗。托盘菜单为“打开管理窗口 / 打开悬浮窗 / 复位窗口位置 / 退出”;“打开管理窗口”会恢复管理窗口并保留草稿与筛选。管理窗口的“最小化”和 Ctrl+M 只收起管理窗口,悬浮窗保持可见
- 悬浮框固定为
520 x 390;首次显示自动贴齐工作区右下方并保留任务栏安全间距;手动移动后会继续保持可见,内容较多时列表滚动显示。现役双工作区的精确布局、安全区和排版合同见 DESIGN.md - 多显示器与每显示器 DPI(#219):悬浮窗保持当前屏上的手动位置,越界、
Ctrl+R或托盘复位只夹回当前屏;提醒中心首次放在悬浮窗所在屏右上,手动移动后保持。规则编辑器和确认框在所有者所在屏居中并夹取;规则编辑器高度为min(790 DIP, 工作区高度 - 36 DIP),底部按钮和缩放手柄保持可达。应用 EXE 清单声明PerMonitorV2,显示器、工作区或 DPI 变化后已打开窗口重新夹回可见区域。 - 普通交互模式按当前用户、应用根和设置路径单实例运行;第二次普通启动通过有界命名管道请求恢复并聚焦现有悬浮窗,只有收到匹配协议、scope 和 request identity 的确认才成功退出。托盘、隐藏或最小化状态都会恢复,已可见时只聚焦;该动作不显示管理窗口、不改变筛选或草稿,也不写设置
- 主窗口和悬浮窗沿用暖色日间主题;装饰 raster 与真实 WPF 动态控件保持分层,具体视觉和命中测试合同以 DESIGN.md 为准
- 主窗口立绘的来源与私人使用边界见 三丽鸥官方背景素材;悬浮窗玩偶的来源与非生成式处理说明见 悬浮窗玩偶素材来源
- 本机滚动诊断日志记录启动、正常退出、窗口就绪、单实例激活结果、节假日日历状态和致命异常;激活诊断只保存非内容身份与窗口状态,不记录筛选值、草稿、便签正文、倒计时名称或设置 JSON
敏敏子倒计时.ps1:C# 应用的薄启动 adapter;映射既有参数。生产启动用Win32_Process.Create脱离计划任务作业,确认 C# 仍存活后退出 0;validate/exercise 仍等待并传播退出码。不回退旧 PowerShell WPFsrc/MinminCountdown:C# WPF 应用宿主源码src/MinminCountdown.Core:设置 schema、校验、原子写入、跨进程 mutex,以及基于固定Ical.Net 5.2.3的类型化日历 occurrence 计算src/MinminCountdown.Verification:C# 设置契约与互操作验证程序Build-CountdownApplication.ps1:生成 self-contained 的应用与验证 EXE,并复制、校验 9 个现役应用资产(#231 起三张 floating-plush 派生姿态参考图只随发布/验证包作视觉基线 sourceBinding 输入,不再装进app);载荷哈希后确保app\startup-request.json存在,缺失时补写手动启动形态app/MinminCountdown.exe:生成的 C# WPF 应用verification/MinminCountdown.Verification.exe:生成的设置契约验证程序Countdown.App.psm1:旧 PowerShell WPF 兼容回归夹具;只保留在仓库和部署验证包中,不安装到运行目录,生产入口不调用Countdown.Core.psm1:北京时间换算与倒计时核心逻辑Countdown.Notes.psm1:便签候选状态变更与持久化事务Countdown.Tags.psm1:共享标签的领域模型、筛选语义与显示名称解析Countdown.Runtime.psm1:每次启动的令牌、窗口首帧就绪回执、有界等待与滚动诊断日志Countdown.Settings.psm1:设置 schema 迁移、校验、原子写入与部署等价校验Countdown.InstallTransaction.psm1:带全机互斥锁的可回滚安装事务;覆盖安装目录、启动器、两份计划任务与 Windows 时间服务状态,并为办公室验收原子写出独立回执Countdown.TransactionAcceptance.psm1:安装与办公室部署共用的事务验收状态机Countdown.Validation.psm1:安装器共用的 Core、C#、兼容 UI 与应用 validate-only 验证 moduleCountdown.RemoteDeployment.psm1:办公室候选安装、验证门禁、事务验收、回滚、提交后收尾,以及成功/失败回执、部署 binding、独立回读与回滚前诊断的严格契约 moduleCountdown.TransferLedger.psm1:办公室全部 SCP 与 SSH 证据回读共用的计时、吞吐和失败尝试账本 moduleCountdown.ReleaseContract.psm1:构建、安装、部署和 Core tests 共用的发布资产分类与 SHA-256 契约tools/Countdown.BuildPreflight.psm1:构建前只读解析 SDK、构建目录和 safe-tree-delete 能力;Test-CountdownBuildPreflight.ps1用于从任意 cwd 做预检CountdownLauncher.cs:无控制台桌面启动器源码;仓库编译产物为CountdownLauncher.exeCountdownLauncher.exe:仓库中的启动器文件;安装后桌面名为敏敏子倒计时.exe,双击直接启动宿主countdown-icon.ico:窗口和桌面启动器图标sanrio-official-mymelody.png、sanrio-official-cinnamoroll.png、sanrio-official-kuromi.png:主窗口兼容回退与来源校验使用的三张官方透明角色立绘assets/floating-plush/*.png:悬浮窗现役视觉资产与旧 PowerShell 回归夹具;#231 起floating-plush-*-reference.png三张派生姿态参考图仅作视觉基线 sourceBinding 输入随仓库与验证包分发,不再安装到app;来源、处理边界、哈希和用途见 悬浮窗玩偶素材来源assets/main-decorations/*.png:主窗口暖色日间装饰资产;现役用法见 DESIGN.mdassets/ui-references/:用户生成的页面与悬浮窗参考图及机器可读manifest.json的固定位置,作为视觉复刻比对依据随仓库版本化;不会进入app的运行时资产清单- DESIGN.md:主窗口两页、悬浮窗两工作区与提醒中心的「暖粉日间」现役视觉、交互和单一日间主题合同
Install-Countdown.ps1:办公室 Windows 设备安装与更新脚本Deploy-OfficeCountdown.ps1:办公室设备的受校验部署入口Countdown.Core.Tests.ps1:核心与发布契约测试可直跑;含-ReleaseContractOnly时会嵌套验证套件窗口步骤(自行隔离),不要当成全程无窗口Countdown.CSharp.Tests.ps1、Countdown.Ui.Tests.ps1、Invoke-CountdownSourceValidation.ps1:窗口套件内层实现,仅由低影响启动器转发,直跑 fail-closedtools/Invoke-CountdownVerificationRun.ps1、tools/Invoke-DesktopLauncherLatencyProbe.ps1:标准化 13 步收口验证 runner 与桌面启动 T0–T4 分段时延探针;收口包含Countdown.TransferLedger.Tests.ps1,探针样本只用于归因,不汇入门槛样本池tools/Invoke-CountdownSuiteLowImpact.ps1:低影响官方套件启动器(BelowNormal + 默认不可见 Win32 桌面隔离 + 用户桌面泄漏监测 + 红即停),六阶段套件默认入口;Build 绿后 Core/CSharp/Ui/SourceValidation/InstallValidate 五阶段并行调度(-MaxParallel默认 2,范围 1-5;每阶段唯一隔离桌面),任一阶段红即取消在跑阶段并保留已完成日志与 summary。-IsolatedDesktop可显式传入(兼容旧命令);关闭隔离必须-AllowUnisolatedDesktop(用户正在用电脑时禁止)。Countdown.SuiteRun.psm1负责原子 run/summary、阶段超时、取消和失效 owner 的Interrupted回读;配套tools/Start-IsolatedSuiteProcess.ps1(隔离桌面进程启动)与tools/Watch-DesktopWindows.ps1(用户桌面窗口泄漏监测)tools/Test-CountdownTooling.ps1:无窗口自检 issue 验收 schema、回写 dry-run、PowerShell 解析、弹层验证夹具 C# 只编译和git diff --check;tools/Test-PopupValidationContract.ps1由低影响启动器的ValidationHarness阶段执行弹层真实动作与反例,夹具 C# 在tools/PopupValidationContract.csdocs/agents/issue-acceptance.md、docs/agents/issue-acceptance.json:按 docs / behavior / visual / release / office / gate 区分检查、证据和明确的 N/A 理由;tools/Invoke-IssueWriteback.ps1默认只生成可回读的评论计划,只有显式-Apply才写 GitHub
设置格式、迁移和持久化事务见 设置与持久化。 当前迁移决策、WPF module/seam 划分和 Tauri 闸门边界见 架构与语言迁移;父级 PRD 为 GitHub #189。 WPF 渐进升级批次、完成门和后置切片方案见 现代化重构方案;现行栈状态与候选闸门范围见 技术栈决策。Tauri/React/Rust 文档只描述可回滚的候选切片,不代表已批准的目标栈。 倒计时、便签与共享标签的产品证据、现役边界和后续候选见 倒计时、便签与标签协同调研。 悬浮窗参考图复刻的 GitHub 候选、采用路线、数值边界和明确不采用项见 悬浮窗视觉复刻 GitHub 方案调研。
硬约束:本项目的 PowerShell adapter、测试、安装和办公室部署只支持 PowerShell 7+(pwsh.exe),不支持 Windows PowerShell 5.1(powershell.exe)。WPF adapter 入口仍必须使用 -STA。
硬约束:套件的默认运行前提是用户正在使用这台电脑。Build / Core / CSharp / Ui / SourceValidation / InstallValidate 六个阶段仅启动器可跑,禁止把内层命令当复制模板直跑。启动器默认把整棵进程树放到 BelowNormal,并把控制台与 WPF 窗口放进不可见 Win32 桌面(窗口不上用户屏幕、不抢焦点);用户 Default 桌面若出现敏敏子 / MinminCountdown 可见顶层窗即红。任一阶段红即停,日志落在 logs\suite-runs\。CSharp / Ui / SourceValidation 若检测到自己不在 MinminSuiteIso-* 桌面会 fail-closed。关闭隔离必须显式 -AllowUnisolatedDesktop(用户正在用电脑时禁止)。
pwsh.exe -NoLogo -NoProfile -File ./tools/Invoke-CountdownSuiteLowImpact.ps1 -Stage Build,Core,CSharp,Ui,SourceValidation,InstallValidate候选构建完成后可先运行窗口短验证。GeometryPreflight 单独使用同一隔离启动器,复用主窗口工作区和确认框的正式断言,并报告候选 DLL 哈希、会话、桌面与原生工作区。失败后先修复候选或环境,再启动完整回归;它不替代完整套件。
$appPath = Join-Path $PWD 'app'
$dllHash = (Get-FileHash (Join-Path $appPath 'MinminCountdown.dll') -Algorithm SHA256).Hash
pwsh.exe -NoLogo -NoProfile -File ./tools/Invoke-CountdownSuiteLowImpact.ps1 -Stage GeometryPreflight -AppPath $appPath -ExpectedDllSha256 $dllHash -StageTimeoutSeconds 90构建前先做只读环境预检和无窗口工具自检;-RequireClean 只在当前 safe-tree-delete policy 登记了该 checkout 的正式清理路径时使用:
pwsh.exe -NoLogo -NoProfile -File ./tools/Test-CountdownBuildPreflight.ps1 -Json
pwsh.exe -NoLogo -NoProfile -File ./tools/Test-CountdownTooling.ps1 -JsonTooling 的发布差异检查同时覆盖基点到候选提交、候选到暂存区、暂存区到工作树。默认使用 origin/main 和 HEAD;集成树或手动验收须显式提供 -BaseCommit <发布基点>、-CandidateCommit <候选提交>,或通过 COUNTDOWN_DIFF_BASE、COUNTDOWN_DIFF_CANDIDATE 传给启动器。基点必须是候选祖先;旧提交的错误不能由工作树修正掩盖。CI 按 push / PR / 手动事件解析并固定实际 SHA,手动运行须填写 publication_base。
弹层验证和工具自检也可单独经官方入口运行,入口会写出 logs\suite-runs\*-run.json 与 *-summary.json;启动器异常、取消、超时和失效 owner 都以非成功终态保存,不能把缺少 summary 当成通过:
pwsh.exe -NoLogo -NoProfile -File ./tools/Invoke-CountdownSuiteLowImpact.ps1 -Stage ValidationHarness,ToolingValidationHarness 的生产动效检查必须在 300 ms 内取得真实的 10%–90% 中间帧,终态或缺帧都不算通过。只有某场景唯一的失败与实测卡顿重合时,才重跑该场景。卡顿指以下任一情况:采样窗口内最长无帧间隔不短于最短 90 ms token 的 10%–90% 区间(约 37 ms);或反转后的首帧到达时,整段动效时长已经过去。每个场景最多重跑 2 次,每轮最多 4 次。每次因卡顿失败的尝试都记入 Motion.Results[].StarvedAttempts;阈值、实际用量、注入卡顿自检和判定对照见 Motion.StallRetry。最终判定仍取自一次完整的真实通过。
视觉改动需要新基线时,先更新现役版本并构建当前源码,再单独运行生成阶段。该阶段在同一隔离桌面与泄漏监测下执行 app/MinminCountdown.exe,将 9 张主窗口与 5 张悬浮窗实拍绑定到实际 EXE(#235 新增便签多选及批量操作条,#236 新增下班收尾);已有基线目录拒绝覆盖,失败时保留生成现场。生成完成后还须另行运行 CSharp / Ui 复验,生成过程本身不替代回归。
pwsh.exe -NoLogo -NoProfile -File ./tools/Invoke-CountdownSuiteLowImpact.ps1 -Stage BaselineGenerateTauriGate 仅用于 #209 的既有 Tauri 原型实验,须在 WPF 改版验收后单独运行。通过同一启动器显式指定 -TauriExecutable(以 evidence feature 构建的 minmin-countdown-slice.exe 绝对路径)和 -TauriEvidenceDirectory(尚不存在的绝对路径),建议 -StageTimeoutSeconds 240。该阶段使用不可见桌面、BelowNormal、owned Job、取消/超时和桌面泄漏监测,拒绝关闭隔离;原型仅接触新目录内的 fixture state 与 WebView2 profile。退出后独立核对单个 520 x 390 窗口、四场景 PNG 尺寸/哈希和关键交互回执。该结果仅证明候选实验,不构成生产发布或离线 WebView2 部署验收。
兼容旧命令仍可显式传入 -IsolatedDesktop(与默认相同)。调试关隔离:
pwsh.exe -NoLogo -NoProfile -File ./tools/Invoke-CountdownSuiteLowImpact.ps1 -AllowUnisolatedDesktop -Stage Core标注:本文档命令的脚本路径统一用 ./ 前缀:该写法在 PowerShell、cmd 与 Git Bash 下均可直接执行;.\ 前缀会被 Git Bash 等 POSIX shell 当作转义符吃掉反斜杠,导致 pwsh -File 报找不到脚本。
标注:六阶段套件与 13 步收口 runner(tools/Invoke-CountdownVerificationRun.ps1)不在同一会话连跑:后者第 3/6/8/10/11/12 步与六阶段逐字相同,连跑等于整套跑两遍;第 9 步单独覆盖 Countdown.TransferLedger.Tests.ps1。收口 runner 的 CSharp/Ui/SourceValidation 走同一隔离启动器;desktop-launcher 与 instance-activation-matrix 默认拒绝前台跑,需要时显式 -AllowForegroundWindowedSteps(用户正在用电脑时禁止)。
标注:issue 关闭前按 docs/agents/issue-acceptance.md 生成结构化记录;candidate、dry-run、deployed 和 live verified 分开记录。tools/Invoke-IssueWriteback.ps1 不带 -Apply 时只生成评论和父票汇总计划,不发送 GitHub 请求。
标注:pwsh.exe -NoLogo -NoProfile -File ./Build-CountdownApplication.ps1 -Incremental 是开发者本地迭代手动工具(显式非默认开关:跳过受管清理、保留增量编译),不属于六阶段套件;直跑时须保持 BelowNormal 等低影响等价措施。增量产物不用于发布收口,收口仍走全量 -Clean + R2R 与六阶段套件。
启动器未覆盖的运行(verification\MinminCountdown.Verification.exe 直跑、-DesktopLauncherOnly、-InstanceActivationMatrix、Deploy-OfficeCountdown.ps1 -ValidateOnly)遵循同一前提;其中会渲染窗口的变体只在用户明确授权时前台运行(-AllowForegroundDesktopLauncher)。下方为启动器转发的实现细节(不是复制模板;CSharp/Ui/SourceValidation 直跑会 fail-closed):
pwsh.exe -NoLogo -NoProfile -File ./Build-CountdownApplication.ps1 -Clean
./verification/MinminCountdown.Verification.exe
pwsh.exe -NoLogo -NoProfile -STA -File ./Countdown.CSharp.Tests.ps1
pwsh.exe -NoLogo -NoProfile -STA -File ./Countdown.CSharp.Tests.ps1 -DesktopLauncherOnly -AllowForegroundDesktopLauncher # 2026-08-23 起冷≤4.7s / 暖≤4.5s;用户正在用电脑时禁止
& 'D:\Codex\tools\PowerShell\7.6.4\pwsh.exe' -NoLogo -NoProfile -STA -File ./Countdown.CSharp.Tests.ps1 -InstanceActivationMatrix -AllowForegroundDesktopLauncher # 诊断并发 probe 共享截止 38900ms(真实矩阵 8×100 强制 1MB 滚动写最差外推 32381ms +20%);用户正在用电脑时禁止
pwsh.exe -NoLogo -NoProfile -File ./Countdown.Core.Tests.ps1
pwsh.exe -NoLogo -NoProfile -STA -File ./Countdown.Ui.Tests.ps1
pwsh.exe -NoLogo -NoProfile -STA -File ./Invoke-CountdownSourceValidation.ps1
pwsh.exe -NoLogo -NoProfile -File ./Install-Countdown.ps1 -ValidateOnly
pwsh.exe -NoLogo -NoProfile -File ./Deploy-OfficeCountdown.ps1 -ValidateOnly正式安装结果默认只返回已安装文件数量和清单 evidence 路径;完整逐文件 SHA-256 清单写入该路径,避免把整份 inventory 回显到终端。
本机替换现有桌面版本继续使用 Install-Countdown.ps1 的正式事务入口;它返回 InstalledFileCount、InstalledFilesEvidencePath、启动器、计划任务和运行态回读字段,不需要临时替换脚本。
标注:InstallValidate 独立阶段与 Core 测试内联的安装器验证调用(Countdown.Core.Tests.ps1 与 Install-Countdown.ps1 -ValidateOnly)是有意双轨:前者是阶段级红即停门禁,后者带合同断言;重复成本约 10 秒,不合并。
标注:Countdown.Core.Tests.ps1(含 GitHub Actions「Test release contract」的 -ReleaseContractOnly)与 Install-Countdown.ps1 -ValidateOnly 调用 Invoke-CountdownValidationSuite。Core 逻辑不隔离;C#、兼容 UI、应用 -ValidateOnly 分别进 MinminSuiteIso-ValidateCSharp / MinminSuiteIso-ValidateUi / MinminSuiteIso-ValidateApp。windows-latest 与本机 Default 桌面一样会触发内层 fail-closed,不要在 Default 上关隔离直跑窗口步骤。
-DesktopLauncherOnly 的冷/暖门槛按 2026-08-23 现役探针五对 runId ca1179d53398413abb236fc0f4d7b490、58c35833a6bf4b5ebbab9e3dab973c2a、eb12765e030d413a8520bcbf78c4938c、9d6ff40ee86745aab70f4dd96522ce60、9cf91f34b4f242b5a93c3b04a2fe1f23 校准。口径是真实首帧 WPF ContentRendered(命名事件 Local\CountdownDesktopLauncherWindowReady);测量钟在首次 window-ready 之后才查询 Win32_Process。探针 stopwatch T0→T4 冷 p95/max=3776ms、暖 p95/max=3439ms,分段 Σp95+20% 取整为冷 4700ms、暖 4500ms。机器:BAKER / i5-14600KF / 可用内存约 7.3GiB / CPU 中低 / 2026-08-23 16:46–16:49 +08。样本只用于归因,不汇入门槛样本池。-InstanceActivationMatrix 的 38900ms 共享截止按真实矩阵 8×100 强制滚动写标定:2026-08-24 五次 Wait 完成 [1035, 1037, 1101, 1160, 1248];2026-08-23 超时证据 run 20260823T1510260920479Z 最慢写手 21/100 @ 6800ms,线性外推 32381ms,取最差 +20% 取整。样本只用于归因,不汇入门槛样本池。2026-08-23 连续三轮完整本机验证组合中诊断并发 probe 曾在 6800ms 内只完成约 43–86/100;不能把隔离绿灯当成矩阵或连续全套件绿灯。
以上命令只证明当前机器上的源码行为、发布包、安装与部署预检合同。Deploy-OfficeCountdown.ps1 -ValidateOnly 校验当前工作树候选的发布清单、IntegrityHashes 静态哈希和临时 ZIP,不要求工作树干净,也不执行 Git fetch;它不连接办公室设备,不上传或安装产物,更不构成办公室远端部署或验收。无开关入口优先识别当前提交的完整历史部署记录并只读复核;进入安装路径时仍只接受干净、已推送且与 origin/main 一致的 main 提交。历史查询、实时复核、显式重新安装和完成态合同见 办公室部署。安装路径在首次传输前会解析 Windows 内置 OpenSSH 或 PATH 中成对的 ssh/scp 绝对路径,并用选定 ssh 做约 32KB 只读 echo 行为探针;截断或找不到候选即闭锁。-ValidateOnly 不跑该解析和探针。构建产物 verification\MinminCountdown.Verification.exe 的字节由正式部署按本次构建锁定,不在 -ValidateOnly 里对照跨环境静态钉。
pwsh.exe -NoLogo -NoProfile -STA -File ./敏敏子倒计时.ps1启动链:桌面快捷方式 → CountdownLauncher.exe → 敏敏子倒计时.ps1 → app\MinminCountdown.exe --require-startup-request。宿主对 app\startup-request.json fail-closed(缺失或损坏即拒绝启动);构建脚本在发布后自动补写手动启动形态(state=none),安装器部署时重写为自己的请求。
安装前先运行 Build-CountdownApplication.ps1 -Clean。改了发布契约 IntegrityHashes 覆盖的源文件、测试或静态资产后,按当前提交 blob 更新 Countdown.ReleaseContract.psm1 里对应的 SHA-256:先 git add 改过的文件,再运行 tools/Update-CountdownIntegrityHashes.ps1(读暂存区 blob 改写钉值;-Check 只列出全部不一致项、不改文件);verification\MinminCountdown.Verification.exe 不进静态钉死,由构建和正式部署按本次产物字节锁定。安装器要求已安装 PowerShell 7+(pwsh.exe),缺失时会拒绝运行,不会回退到 Windows PowerShell 5.1。它会在全部预检通过后才取得全机安装事务锁:先记录计划任务和 Windows 时间服务状态,再冻结两份旧登录任务以阻止旧程序复活;旧程序静止后才快照安装目录与桌面启动器(含 .new 暂存文件),随后校准网络时间、运行测试、复制程序、把启动器安装到桌面,并另行注册登录任务。桌面双击 敏敏子倒计时.exe 直接启动宿主,不经过 schtasks、pwsh 或 adapter;登录任务仍执行 pwsh -STA -File 敏敏子倒计时.ps1。登录任务必须用本次启动令牌先写出“窗口首帧已渲染”的 window-ready 回执,安装器最多等待 30 秒;设置等价和提交前验收通过、事务进入仍可回滚的 accepted 后,应用还必须以同一令牌、进程、会话和应用路径写出 finalized-ready,安装器复核计划任务、受管 EXE 身份与运行环境后才把事务标记为 committed。正常失败会恢复快照(时间校准本身不可逆)。损坏 journal、缺少备份或用户在崩溃后替换桌面启动器时,安装器会保留证据并拒绝覆盖用户文件,而不是进行破坏性回滚。请在管理员 PowerShell 7 中从仓库根目录运行:
pwsh.exe -NoLogo -NoProfile -File ./Install-Countdown.ps1安装器只支持安装目录和交互用户桌面均位于 D:\ 的设备,这是当前办公室设备的安全边界。
办公室设备的稳定部署方式见 办公室部署。
pwsh.exe -NoLogo -NoProfile -File ./Build-Launcher.ps1重新生成 CountdownLauncher.exe 后,需要同步更新 Countdown.ReleaseContract.psm1 中对应的 SHA-256。
重新生成图标需要 Python 和 Pillow:
python -m pip install Pillow
python .\make_countdown_icon.py