dsh-notch 0.3.1 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.en.md +58 -47
  2. package/README.md +60 -55
  3. package/cordis.patch.yml +3 -0
  4. package/desktop/README.md +29 -0
  5. package/desktop/notch-lifecycle.mjs +120 -0
  6. package/desktop/restart-probe.mjs +61 -0
  7. package/docs/desktop-017rc2.md +23 -0
  8. package/docs/elastic-edge-dock.md +127 -0
  9. package/docs/motion-audit.md +1 -1
  10. package/docs/releases/v0.3.2.md +38 -0
  11. package/docs/releases/v0.3.3.md +9 -0
  12. package/docs/subagent-compatibility.md +51 -0
  13. package/docs/verification/elastic-algorithm-timing.json +337 -0
  14. package/docs/verification/elastic-attention.json +44 -0
  15. package/docs/verification/elastic-frame-timing.json +240 -0
  16. package/docs/verification/elastic-tension.json +59 -0
  17. package/docs/verification/elastic-tip-taper.json +181 -0
  18. package/dshx.yml +2 -0
  19. package/lib/client.js +112 -0
  20. package/lib/client.js.map +1 -0
  21. package/lib/index.mjs +990 -0
  22. package/lib/index.mjs.map +1 -0
  23. package/package.json +58 -10
  24. package/src/board.ts +178 -35
  25. package/src/client/index.ts +104 -0
  26. package/src/dsh-notch.ts +19 -2
  27. package/src/http.ts +17 -2
  28. package/src/session-state.ts +15 -1
  29. package/src/store.ts +3 -3
  30. package/src/types.ts +3 -0
  31. package/BASELINE.md +0 -13
  32. package/DESIGN.md +0 -34
  33. package/cordis.yml +0 -5
  34. package/macos/Package.swift +0 -17
  35. package/macos/STATUS-MOTION.md +0 -49
  36. package/macos/Sources/Client.swift +0 -139
  37. package/macos/Sources/IdleRobot.swift +0 -423
  38. package/macos/Sources/NotchMarkdown.swift +0 -266
  39. package/macos/Sources/Panel.swift +0 -153
  40. package/macos/Sources/Resources/Idle/balance.json +0 -1
  41. package/macos/Sources/Resources/Idle/blink.json +0 -1
  42. package/macos/Sources/Resources/Idle/cube-in.json +0 -1
  43. package/macos/Sources/Resources/Idle/dance.json +0 -1
  44. package/macos/Sources/Resources/Idle/hop.json +0 -1
  45. package/macos/Sources/Resources/Idle/nod.json +0 -1
  46. package/macos/Sources/Resources/Idle/satellite-in.json +0 -1
  47. package/macos/Sources/Resources/Idle/satellite-out.json +0 -1
  48. package/macos/Sources/Resources/Idle/scan.json +0 -1
  49. package/macos/Sources/Resources/Idle/sleep.json +0 -1
  50. package/macos/Sources/Resources/Idle/sneeze.json +0 -1
  51. package/macos/Sources/Resources/Idle/stretch.json +0 -1
  52. package/macos/Sources/Resources/Idle/tilt.json +0 -1
  53. package/macos/Sources/ReviewStudio.swift +0 -337
  54. package/macos/Sources/RootView.swift +0 -1093
  55. package/macos/Sources/StatusOrbit.swift +0 -642
  56. package/macos/Sources/main.swift +0 -153
  57. package/macos/Tests/ExpandedHeightProbe.swift +0 -108
  58. package/macos/Tests/GeometryProbe.swift +0 -98
  59. package/macos/Tests/IdleProbe.swift +0 -294
  60. package/macos/Tests/MotionProbe.swift +0 -106
  61. package/macos/Tests/OutcomeProbe.swift +0 -133
  62. package/macos/Tests/ScrollbarProbe.swift +0 -91
  63. package/macos/Tests/expanded-height.sh +0 -13
  64. package/macos/Tests/geometry.sh +0 -14
  65. package/macos/Tests/idle.sh +0 -14
  66. package/macos/Tests/motion.sh +0 -14
  67. package/macos/Tests/outcome.sh +0 -14
  68. package/macos/Tests/scrollbar.sh +0 -13
  69. package/tests/answer-lifecycle.test.mjs +0 -23
  70. package/tests/board.test.mjs +0 -7
  71. package/tests/browse-sync.test.mjs +0 -20
  72. package/tests/mirror.test.mjs +0 -4
  73. package/tests/peer-range.test.mjs +0 -21
  74. package/tests/session-state.test.mjs +0 -54
  75. package/tests/unread-hold.test.mjs +0 -90
  76. package/tools/desktop-shell/README.md +0 -56
  77. package/tools/desktop-shell/child-log.mjs +0 -6
  78. package/tools/desktop-shell/child-log.test.mjs +0 -14
  79. package/tools/desktop-shell/package-recovery.py +0 -78
  80. package/tools/desktop-shell/recovery-probe.cjs +0 -50
  81. package/tools/desktop-shell/renderer-recovery.mjs +0 -95
  82. package/tools/desktop-shell/renderer-recovery.test.mjs +0 -24
  83. package/tools/diagnostics/completion-watch.py +0 -101
  84. package/tools/diagnostics/completion-watch.test.py +0 -17
  85. package/tools/diagnostics/renderer-diagnostics.mjs +0 -56
  86. package/tools/diagnostics/renderer-diagnostics.test.mjs +0 -32
  87. package/tools/idle/LICENSE.open-bot-motion +0 -21
  88. package/tools/idle/export.mjs +0 -40
  89. package/tools/idle/index.html +0 -4
  90. package/tools/idle/motions.js +0 -83
  91. package/tools/idle/original.js +0 -1673
  92. package/tools/idle/renderer.js +0 -1673
  93. package/tools/recording/Client.swift +0 -76
  94. package/tools/recording/DemoCatalog.swift +0 -174
  95. package/tools/recording/README.md +0 -23
  96. package/tools/recording/build.sh +0 -41
  97. package/tools/recording/main.swift +0 -100
  98. package/tools/review/ReviewStudio.swift +0 -236
  99. package/tools/review/audit.sh +0 -19
  100. package/tools/review/build.sh +0 -7
  101. package/tools/review/main.swift +0 -158
  102. package/tools/review/render-audit.swift +0 -32
@@ -0,0 +1,127 @@
1
+ # 弹性边缘收纳
2
+
3
+ 向任意方向拖动 Notch,短距离二维 1:1 跟随鼠标,远距离阻力渐强。右端贴住屏幕,外壳向抓住的左端连续收窄;拉得越远,左端本身和里面的内容一起变细。松手后继承双轴速度,再回弹到边缘。收纳终点是将恢复原形的外壳平移进屏幕,留下左侧的一小截。悬停只改变露出的多少,再拉一次恢复当前任务。
4
+
5
+ 当前实现支持既有的右屏幕边缘。它不是任意位置的桌面窗口拖动,不改变会话状态或任务结果。
6
+
7
+ 隐藏时,普通运行和尺寸更新保持收纳;新完成、错误、审批或问题会沿同一弹簧轨迹完整恢复紧凑状态。提醒按会话与结果时间、请求 ID 区分;同一事件反复轮询不会打断再次手动收纳。拖动期间的新提醒只改变松手后的目的地,不抢走鼠标下的外壳。
8
+
9
+ ## 实现
10
+
11
+ - `EdgeDockModel` 保存外壳位置、尺寸、收纳进度、双轴释放速度和弹簧状态。回位时可轻微越过垂直终点;向屏幕内收纳的阻尼更大,保持残留部分可见。收纳和探出只做平移,不压缩宽高。
12
+ - `EdgePanGesture` 使用 4 pt 的二维距离判断拖动意图,不锁轴。坐标来自同一个鼠标事件并换算到屏幕,避免窗口本身变宽时反馈到拖动距离;原生文字编辑区保留选择行为。
13
+ - 手势识别器暂存主鼠标按键事件;普通单击在判定不是拖动后正常交给按钮,已识别的拖动不再把松手交给选项或审批。内容在拖动时同时禁用,避免已开始的按钮跟踪误触。
14
+ - `EdgeDockGeometry` 使用 RootView 同款的 16 pt 连续圆角。拉伸先取原外壳与完整边缘接触面的单一凸包,再从固定端到抓取端连续收窄;离开边缘的自由端也逐渐形成圆角。左端不会保留一个原厚度的头部。轮廓沿张力展开,内容使用同一形变。
15
+ - 收纳保留抓取时的原外壳高度,左侧露出 8 pt,悬停露出 14 pt。端点直接使用原始连续圆角的平移裁切。后台任务更新不会改变残留部分的形状,恢复时采用最新任务尺寸。AppKit 外层及玻璃内容层的额外圆角关闭,避免对这一小截二次裁切。
16
+ - 原有 AppKit 尺寸动画在拖拽开始时停止,避免旧展开动画继续覆盖鼠标驱动的尺寸。展开内容在收纳完成后才折叠。
17
+ - 机器人及任务视图保持同一个实例和逻辑排版尺寸。拖动时,原生图层将内容和局部裁切沿拉力的垂直方向压缩,压缩比例与左端外壳相同,回位后恢复原形。逐帧位移、形变和透明度不发布给 SwiftUI,避免每帧重新排版。隐藏时暂停待机及时间线绘制,任务数据继续更新。
18
+ - 状态更新使用窗口的 `CADisplayLink`,目标 60 Hz。拖动时提前预留能容纳轨迹与速度余量的画布,飞行中窗口尺寸保持不变;结束后才缩回真实命中区域。
19
+ - 外壳宽高不变的回弹,以解析弹簧按 120 Hz 生成候选采样,再合并误差预算内的尾段样本,一次提交到 Core Animation。轮廓、内容位移、透明度与局部裁切使用完全一致的采样时刻,避免主线程偶发阻塞打断回弹。重新抓取从这条轨迹的当前呈现位置接手。恢复过程中如需响应任务尺寸变化,改由显示同步回调继续排版,不把文字或机器人缩放拉伸。
20
+ - 到达终点后清零弹簧残余速度,防止上一轮尺寸变化影响下一次收纳。
21
+ - macOS 26+ 的收纳外壳由可复用的 `CAShapeLayer` 直接填充,收纳时暂停玻璃背景,避免对整个玻璃窗口做动态离屏裁切。内容使用独立的小型圆角蒙版,恢复后回到玻璃材质。HUD 兼容路径复用同一原生蒙版,不逐帧分配新层。
22
+ - 正式入口记住手动收纳偏好。减少动态效果时,直接跟手,释放后立即到终点。右键和可访问性操作也能恢复。
23
+
24
+ ## 验证记录 · 2026-09-21
25
+
26
+ - `npm test`:59/59 通过。
27
+ - `npm run test:edge-dock`:八方向抓取点、双轴速度继承、释放无位置跳变、反向打断、恢复时任务尺寸变化、后台更新不改变收纳形状、减少动态效果和真实窗口收纳范围通过。
28
+ - 本轮增加单一封闭轮廓、完整边缘接触面、收纳和悬停的原始连续圆角逐点对比;检查 60 帧中尺寸不变且残留部分持续可见。
29
+ - 本轮原生鼠标验证:斜向拉走后留下原形裁切,从残留边缘斜向拉回;展开问题从选项上拖走,恢复后仍为“等待决定 1”;重新展开并单击一次选项后变为“运行中 1”。
30
+ - 实机检查重现并修复了“从选项开始拖动后误提交”;上述同一路径在修复前变为运行中,修复后保留待决策。所有问题均为本地模拟,不会发送到 DSH。
31
+ - 第一轮回归重现了“开始拖动后旧 AppKit 展开动画仍在改尺寸”,修复后通过。
32
+ - 前一轮通过的独立回归包括原有展开、多灯高度、长内容高度、反向机器人转场、乱序响应及 40 次状态切换回放。
33
+ - 悬停的 8→14 pt 位移及准确端点通过模型回归;自动操作接口未产生真实悬停事件,鼠标停留的实际手感留给独立预览试用。
34
+
35
+ 这些检查使用本地模拟状态,未调用 DSH 模型。正式 DSH.app 尚未安装这个候选。独立预览见 [运行说明](../tools/elastic-preview/README.md);实际手感由预览试用确认。
36
+
37
+ 本轮生成原形、收纳、探出及四方向的原生轮廓样本和 60 帧回弹序列。上一版的细弯尾巴、接触压缩以及 6×28 pt、2 pt 圆角端点均已移除。
38
+
39
+ ## 帧诊断
40
+
41
+ 独立预览提供 `⌘T`,只记录下一次回弹;`⌘P` 会先恢复待机,再在 3 秒后自动执行一次固定的斜向收纳,并把结果写入 `/tmp/dsh-notch-motion/frames-*.json`。记录包含回调间隔、图层更新耗时、窗口改尺寸次数、轮廓层分配次数及 `compositorSamples` / `renderUpdates`。恒定外壳尺寸的回弹应有合成器采样,图层更新仅发生在开始和结束;不包含会话内容。测量时不要同时读取辅助功能树或截图,以免检查动作本身打断主线程。
42
+
43
+ 这些是应用的更新与提交耗时,不等于显示器最终呈现帧率。`CADisplayLink` 的目标频率也不是满帧保证;实际帧间隔仍须测量。Apple 接口依据:[NSWindow displayLink](https://developer.apple.com/documentation/appkit/nswindow/displaylink(target:selector:))。
44
+
45
+ ## 本轮性能复核 · 2026-09-21
46
+
47
+ - 旧版测量中,一次收纳有 29 次窗口改尺寸、73 次新建蒙版,曾出现超过一帧预算的原生提交;旧版间隔统计还受 50 ms 上限截断,不能当作精确最大卡顿值。
48
+ - 当前版本连续三次固定斜向收纳均进入合成器路径:120 个物理采样,应用只在开始和结束更新图层;松手不改窗口尺寸,仅终点收回命中区域;没有新增轮廓层。
49
+ - 三次应用回调间隔中位数都约 16.67 ms。P95 分别为 27.96 / 18.01 / 17.21 ms;仍有主线程回调延迟,最大 102.52 ms 出现在首次回调。动画在提交后由 Core Animation 播放,这些回调统计不能推导显示器实际呈现帧率,不能据此宣称锁满 60 fps。
50
+ - 原始数据:[三次帧诊断](verification/elastic-frame-timing.json)。记录了全部样本,没有只选最快一轮。
51
+ - `npm run test:edge-dock`、`npm run test:geometry`、59 项 JavaScript 测试通过。新增验证包括松手不改窗口尺寸、回弹期间固定画布、原生内容与外壳同帧对齐、当前呈现位置重新抓取、终点清零尺寸速度及轮廓复杂度约束。
52
+ - 原生预览实操通过:斜向收纳、从凸起拉回、展开问题后从选项拖走且仍保留待决策,再单击提交变为运行中。截图检查保留原形裁切;连续屏幕呈现帧率尚未取得独立采集证据。
53
+ - 本次只更新独立预览;正式 DSH.app 中的 Notch 二进制未替换。
54
+
55
+ ## 解析弹簧与轮廓复用 · 2026-09-21
56
+
57
+ 本次针对弹性收纳,不改机器人动作或任务状态转场。
58
+
59
+ - **解析弹簧**:用阻尼振子的闭式解直接求当前时间的位置与速度,取消逐小步积分和 50 ms 时间截断。30/60/120 Hz 附近及不规则回调描述同一条运动;主线程延迟后追上真实时间,不延长回弹。轨迹生成复用三组状态转移系数,避免每个样本重复计算三角函数。
60
+ - **同一条时间轴**:图层与状态从同一个时间原点出发;改变目标时接住当前可见位置和解析速度。合成器正在播放时,应用不重新提交每一帧。
61
+ - **轮廓复用**:在局部坐标计算连续圆角,缓存原始曲线、排序后的采样点和正文裁切路径。平移不再重新细分、重新排序;只将两个接触点插入有序轮廓,再线性求凸包。每个控制器最多保留 32 项,任务高度持续变化也会淘汰旧项。
62
+ - **尾段采样合并**:位移差不超过 0.025 pt、收纳进度差不超过 1/1024 时复用上一样本。所有图层共用同一时间表,保留精确起点和终点;不采用错误拓扑之间的路径插值。
63
+
64
+ 同机 Release 基准,预热后各测 9 次,比较中位数:
65
+
66
+ | 计算内容 | 原版 | 本版 | 耗时下降 |
67
+ | --- | ---: | ---: | ---: |
68
+ | 240,000 次弹簧轴更新(预计算采样) | 2.701 ms | 1.168 ms | 56.8% |
69
+ | 4,800 帧轮廓与正文裁切生成 | 52.842 ms | 33.343 ms | 36.9% |
70
+
71
+ 固定斜向回弹从 123 个候选样本保留 91 个,减少 26.0%;实际最大被合并位移差为 0.02498 pt。圆角缓存与无缓存输出完全相同;隐藏端点仍通过原始连续圆角逐点对比。
72
+
73
+ 三次原生回放的开始提交耗时为 5.94 / 5.56 / 2.00 ms,均只有开始和结束两次图层更新、一次终点窗口收缩、零新建轮廓层。回调间隔 P95 为 17.42 / 17.73 / 17.43 ms;最大值为 82.41 / 90.17 / 33.30 ms,说明仍存在回调延迟。以上计算耗时和回调统计都不能证明屏幕锁满 60 fps,也不能把两个时段的提交耗时差全部归因于算法。
74
+
75
+ 验证:59 项 JavaScript 测试、原生窗口几何、弹性手势回归通过;新增不同回调节奏、长暂停不慢放、双轴速度重定向、32 项缓存淘汰及逐样本误差检查。原生预览实际完成斜向收起、拉回、从选项拖走而不提交、恢复仍待决策、单击选项提交。正式 DSH 二进制未替换。
76
+
77
+ 原始数据与限制:[算法基准及三次原生回放](verification/elastic-algorithm-timing.json)。复现 CPU 基准:
78
+
79
+ ```sh
80
+ sh macos/Tests/edge-algorithm-bench.sh 31405c7 # 原版
81
+ sh macos/Tests/edge-algorithm-bench.sh # 当前版
82
+ ```
83
+
84
+ ## 首版收腰与软上限 · 2026-09-23(左端形状已被下一版替代)
85
+
86
+ 用户已认可原有回弹手感,本轮只增加变细和最大拉动距离。
87
+
88
+ 这一版只让中间变细,左端保持原厚度。用户在试用中明确指出这不符合抓住橡胶拉伸的直觉,所以下列首版形状和对应测试记录仅作为历史,不能视为当前形状的验收。
89
+
90
+ - 单次手势前 **128 pt** 保持原来的二维跟手。之后按 `128 + 112 × tanh((距离 − 128) / 112)` 增加阻力,逐渐接近 **240 pt**;两轴共用一个径向距离,不会斜拉时先卡住某一轴。每次重新抓取从当前显示位置开始,零位移不会跳动。
91
+ - 释放速度使用同一映射的雅可比换算。手已经拉到阻力很强的区域时,回弹不会突然接收到一份更大的原始鼠标速度。短距离沿用原有速度和解析弹簧。
92
+ - 外壳的中间部分越长越细,两端和正文所占区域不缩放。自由段的最薄比例为 `1 − 0.56 × L² / (L² + 75²)`,始终大于或等于原截面的 **44%**。以 `16t²(1−t)²` 从两端原厚度平滑过渡到腰部,端点切线连续。
93
+ - 收腰直接由当前位置计算。松手、反向和中途重新抓取都沿用同一轮廓函数,不另开一个“恢复厚度”的动画。中心轴保持笔直,不增加弯曲尾巴;径向缩放为正,原轮廓顺序保持不变。
94
+ - 曲线使用自适应三次贝塞尔拟合;原来的有界轮廓缓存、合并尾段采样和 Core Animation 播放继续生效。没有新增逐帧 SwiftUI 排版。
95
+
96
+ 验收通过:59 项 JavaScript 测试,原生弹性回归;新增短距离 1:1、径向最大位移、软边界导数连续、释放速度导数、长拉后重新抓取无跳变、收腰单调且不闭合、两端及正文不压扁。检查了 32 / 80 / 140 / 220 pt 横拉、斜向与向上/向下轮廓以及 60 帧回弹序列。原生预览执行长距离斜拉,收纳完成;随后读到预览已恢复正常待机。
97
+
98
+ 固定轨迹保留 90 / 122 个采样,最大合并位移误差 0.02479 pt。新增形变后,当前机器上 4,800 帧轮廓生成中位数 50.33 ms,约 10.49 微秒/帧。这个数据只衡量算法计算,不是实屏帧率;本轮没有以它宣称满 60 fps。原始基准见 [本轮验证记录](verification/elastic-tension.json)。
99
+
100
+ 独立预览已更新,正式 DSH 二进制未替换。此处的 240 pt 是单次手势的位移上限;正常隐藏/恢复的位置由原来的状态逻辑管理,不用此上限去裁断展开面板的宽度。
101
+
102
+ ## 抓取端随拉伸变细 · 2026-09-23
103
+
104
+ 修正首版只收腰、左端仍粗的错误。形变比例从右侧固定端向左侧抓取端单调增加,使用两端一、二阶导数为零的五次曲线。进入抓取端后保持最大压缩量,不再重新变粗。水平拉伸 220 pt 时,左端从 44 pt 降到约 22 pt;松手按当前位置恢复,不另设一条恢复厚度的时间轴。软上限与原来的解析回弹保持一致。
105
+
106
+ 机器人、文字和局部裁切沿拉力的垂直方向使用同一压缩变换。变换围绕外壳中心,并补偿 AppKit 实际图层锚点:首轮原生回归捕获了内容层偏移,补偿后通过。SwiftUI 保留逻辑尺寸和实例,拖动时不重新排版;到达收纳或正常端点后恢复原形。
107
+
108
+ 验证通过:弹性回归、原生窗口几何回归、Release 预览构建。新增检查覆盖左端实际厚度、沿长度不重新变粗、斜向内容与外壳对齐,以及原生图层边界。短、中、长距离原生预览截图确认机器人随左端一起变细;真实斜向拖动、凸起拉回、从选项拖走不误提交、恢复后单击提交均通过。用户对新形状的试用评价待确认。
109
+
110
+ 一次原生回弹使用 90 个合成器采样,只有开始和结束两次图层更新、一次终点窗口收缩、零新增轮廓层。纯算法基准约 13.73 微秒/帧;运行时有并行构建负载,不能用来做严格的前后性能比较。这些记录也不等同于屏幕实际帧率。详见 [原始验证记录](verification/elastic-tip-taper.json)。
111
+
112
+ 本次更新独立预览。正式 DSH 二进制哈希保持不变。
113
+
114
+ ## 隐藏定位与关注事件 · 2026-09-23
115
+
116
+ 用户认可抓取端变细后,上一版已安装到正式 Notch。随后发现隐藏凸起可能脱离边缘,本轮修复两处定位问题:屏幕重新定位先把窗口改成完整尺寸,再用旧的隐藏裁切反推锚点,会产生宽度差偏移;右侧系统 Dock 还可能令 `visibleFrame` 的右边界退进屏幕。现在直接传递物理屏幕右边缘坐标,保持当前裁切或在途轨迹,不重建隐藏姿态。
117
+
118
+ 旧代码的原生回归复现了重新定位后离边;修复后同一路径通过。截图当时的具体触发事件没有日志证明,不能据此认定所有任务更新都会触发旧故障。
119
+
120
+ 本轮验证:
121
+
122
+ - `npm run test:edge-dock`:通过隐藏后重新定位、不同系统 Dock 工作区、普通状态和尺寸更新保持隐藏、完成/错误/审批/问题完整弹回、重复事件不弹出、同数量的新问题弹回、旧快照忽略、拖动期间延迟恢复、打断正在收纳的轨迹及减少动态效果。
123
+ - `npm run test:geometry` 与 Release 构建通过。
124
+ - 原生独立预览确认隐藏后运行更新保持收纳,完成和错误完整恢复;手动重新隐藏后,同一完成事件不再次弹出。问题弹回及重复问题保持隐藏也经过原生预览检查。
125
+ - BoardModel 在接受完整快照后同步发布关注事件,避免排队的旧通知覆盖用户随后作出的隐藏操作。隐藏时的新决策先恢复紧凑指示,正文由用户随后悬停或点击展开。
126
+
127
+ 以上用本地模拟事件,不调用模型、不回答真实问题。测试与预览证明交互代码;正式安装另核对二进制哈希、唯一辅助进程、资源和 Host 状态,不能只凭构建成功认定已上线。原始结果摘要见 [关注事件回归记录](verification/elastic-attention.json)。
@@ -62,4 +62,4 @@ The tour disables only automatic action selection, retaining the real director t
62
62
  - 已替换本机 DSH.app 内的独立 helper 与资源;二进制 SHA-256 为 `dc5612a0c36133857f27892b8532151dadb5c71a1599cb407c3b472c004c2ba5`。旧二进制和资源已备份。演示进程关闭。
63
63
  - 新 helper PID 35639,确认到原 Host 43127 的 TCP 连接;只读状态请求 HTTP 200 / ok=true。DSH App PID 57838、Host PID 57873 均未变化,原生截图确认 DSH 页面正常显示。本轮未调用模型。
64
64
  - 原生 CUA 能检查 DSH.app,但无法选择无 app bundle 的独立 helper;因此本轮安装后机器人屏幕表现未通过 CUA 重新截图验收,动画证据为此前用户认可的演示与本轮原生渲染回归。
65
- - 本机安装与回滚证据:`/Users/wu/Documents/ChatGPT/dsgx/notch-install-proof/installation.json`、`previous-production/`、`host-status.json`。
65
+ - 本机安装与回滚证据:本地验收目录中的 `installation.json`、`previous-production/`、`host-status.json`(不随仓库分发)。
@@ -0,0 +1,38 @@
1
+ # DSH Notch 0.3.2 — DeepSeek Harness 0.1.7-rc.2
2
+
3
+ 发布日期:2026-09-27。社区插件正式适配 DSH **0.1.7-rc.2 Desktop / Web**。配套同步助手为 **dsh-notch-focus 0.1.1**。
4
+
5
+ ## 这次更新
6
+
7
+ - 修复在 DSH 前台打开已完成会话后,Notch 未读状态不消失的问题。桌面代理转发和 Web 同源请求均可同步,后台页面不能代替用户确认已读。
8
+ - 使用 RC2 的会话导航、未读状态和主视图保留接口;支持 API 创建的自定义会话 ID,单个自定义 ID 不再阻断整批侧栏同步。
9
+ - 普通、嵌套和后台子代理按主任务归并;用户手动 fork 的会话独立保留。子任务运行时不会提前清除主任务结果。
10
+ - 保留完整弹性边缘收纳:二维拖拽、端部变细、柔性拉伸上限、松手回弹,以及隐藏后遇到新完成、错误或待回答问题时自动弹回。
11
+ - 修复 Desktop 传入连接文件时被误判为演示模式而偏离屏幕边缘的问题;原生唤起优先使用官方桌面版。
12
+ - 辅助程序跟随 Host 生命周期,接管已有进程时检查身份,更新时避免重复启动。
13
+ - Host 与同步助手都提供官方 Bundle 声明和预编译包。安装无需 DSHX;源码构建保持在外部插件目录。
14
+
15
+ ## 下载与安装
16
+
17
+ [Release 下载](https://github.com/aa2246740/dsh-notch/releases/tag/v0.3.2)提供:
18
+
19
+ - `dsh-notch-0.3.2.tgz`
20
+ - `dsh-notch-focus-0.1.1.tgz`
21
+ - `dsh-notch-0.3.2-macos-arm64.tar.gz`(可执行文件、资源 bundle 和许可)
22
+ - `SHA256SUMS`
23
+
24
+ 按 [中文安装说明](../../README.md#安装)或 [English instructions](../../README.en.md#installation)安装。两个插件应一起更新,并使用相同 profile。已有手动挂载应更新原条目,避免再通过 Bundle 挂载第二份。
25
+
26
+ ## 验证范围
27
+
28
+ 本机 RC2 桌面环境(DSH Studio,使用官方 RC2 Host / Web)已完成真实模型任务验证:任务完成后 Notch 显示未读;随后从 DSH 侧打开该会话,Notch 清除该条结果,同时保留其他运行任务。验收数据与连接配置保留在本机,不随仓库发布。
29
+
30
+ 本次发布检查全部通过:
31
+
32
+ - `npm test`:67 项通过,覆盖 RC2 客户端导航、桌面 / Web 已读同步、自定义会话 ID、请求边界、子代理归属和辅助进程托管。
33
+ - Host 预编译构建、同步助手类型检查与构建、两个插件的 `dshx check` 通过。助手在隔离目录使用 npm 公共依赖重新构建,产物与本机构建一致,仓库附有依赖锁文件。
34
+ - 10 组原生回归通过:motion、geometry、outcome、presentation、edge-dock、idle、scrollbar、expanded-height、host-lifetime、desktop-launch。桌面入口的屏幕边缘间隙为 0 pt。
35
+ - 最终原生压缩包解压后通过 `IDLE_RESOURCES=10/10`、签名完整性检查和隔离生命周期测试:临时 HTTP 故障时保持运行,测试宿主退出后正常关闭。
36
+ - 两个插件包包含 Bundle patch 与预编译入口;助手包含 lazy-CJS 客户端。归档检查未发现安装脚本、凭据或本机绝对路径。
37
+
38
+ 原生程序面向 macOS 14+ / Apple Silicon;没有 Intel 预编译包或本轮跨架构验收。发布包不包含 Developer ID 公证。桌面客户端 HMR 和所有第三方壳的行为不在本次兼容承诺内;安装或更新后按插件管理器提示完成加载并重新打开页面。
@@ -0,0 +1,9 @@
1
+ # DSH Notch 0.3.3 — DeepSeek Harness 0.2.0-rc.2
2
+
3
+ 源码适配官方 `dsh-v0.2.0-rc.2`(SHA `639ed015397290b3745d163aafe02ffee4aa3f84`,包 `@deepseek-ai/dsh@0.2.0-rc.2`)。Host 插件升到 **0.3.3**,同步助手升到 **dsh-notch-focus 0.1.2**。
4
+
5
+ `@deepseek-ai/dsh` 与同线 `@deepseek-ai/dsh-*` peer 为 `>=0.2.0-rc.1 <0.2.1`,与 DSHX 0.9.2 相同。该范围接受 `0.2.0-rc.2` 和稳定版 `0.2.0`,拒绝 `0.2.0` alpha,也拒绝 `0.1.7-rc.2`。
6
+
7
+ 对照 `dsh-v0.1.7-rc.2`,Notch 实际调用的 Host 会话、Web 路由、提问、审批、任务、Home 路径,以及助手使用的 `openSession`、`sessionStatus.completionUnread`、侧栏快照,源码签名没有变化。`src/board.ts` 的构造函数没有因为这次 peer 调整而改写。
8
+
9
+ 本记录不包含 macOS Notch 视觉验收,也不打 tag、不发布 npm。已发布的 v0.3.2 仍是 0.1.7-rc.2 安装包。
@@ -0,0 +1,51 @@
1
+ # Harness subagent compatibility audit
2
+
3
+ Audited on 2026-09-21 against the installed Harness source at `fb2c4b9e698e30edb738bca4cf0618587db7d203` (`dsh-v0.1.5-rc.2`, local changes present). This is an audit of the named checkout and public service interfaces, not a guarantee about arbitrary third-party providers.
4
+
5
+ | Entry path | Harness source | Notch behavior |
6
+ | --- | --- | --- |
7
+ | Foreground spawn and agent fork | `packages/subagent/tool-subagent/src/index.ts`; `subagent-in-process-driver/src/index.ts`; `subagent/src/child-agent.ts` | Both use `childSessionMeta`, setting `origin: subagent` and `parentSession`. Fold into the owning conversation. An inherited prefix does not turn a delegated fork into an independent user task. |
8
+ | Workflow parallel, nested, and integration phases | `packages/workflow/workflow-worker-thread/src/host.ts` | Workers call `subagents.start` with the initiating parent. Count the owner once, including nested descendants. Worker outcomes do not become independent result indicators. |
9
+ | Ralph fresh-agent iterations | `packages/workflow/tool-ralph/src/index.ts` | Uses the workflow engine with its calling parent. Replacing each round's worker must not pulse the task count or result lamps. |
10
+ | Continuable children, messages, and cold resume | `packages/subagent/subagent/src/continuation.ts`; `continuation-activation.ts`; `control.ts` | Initial creation uses the same metadata; resume preserves the durable child header. Idle resident children add no blue count; active ones keep the owner active. |
11
+ | Experimental Agent Team | `packages/experimental/agent-team/src/roster.ts`; `mailbox.ts` | Teammates use `startContinuable` with the lead as parent. The same grouping applies. |
12
+ | Background one-shot subagents | `packages/subagent/tool-subagent/src/index.ts`; `packages/jobs/jobs-local/src/index.ts` | Official jobs have `kind: subagent` and `ownerSession`. Read active jobs for each live agent, then fold the owner into the conversation. `stopping` remains active until terminal settlement. |
13
+ | External Codex, Claude Code, ACP, DSH SDK | `packages/subagent/subagent-*/src/run.ts`; `subagent/src/out-of-process.ts` | `subprocessRunHandle` explicitly exposes no local Agent. Foreground work is represented by its busy parent; official background jobs supply the otherwise missing running signal. Remote process ids are not local sessions. |
14
+ | User-created conversation forks | `packages/api/session-controller/src/commands.ts`; `list.ts` | Have `parentSession`/`parentId` but no subagent origin. Keep separate both in Host grouping and the browser mirror, including cold completed sessions. |
15
+ | Goal continuation and scheduled reminders | `packages/goal/goal-round-driver/src/index.ts`; `packages/schedule/schedule/src/runtime.ts` | Use the original agent's `followup`; do not create another countable session. Later tool calls may of course delegate through the paths above. |
16
+ | Automatic title and compaction summary | `packages/session/session-title-llm/src/index.ts`; `packages/compaction/compaction-basic/src/summarizer.ts` | Call `llm.stream` directly; do not manufacture a subagent task for these calls. |
17
+ | New Webhook, SDK, or ACP user sessions | Corresponding `session.ts` / `server.ts` creation paths | Independent roots unless an actual delegation relationship is stamped. Do not group by title, model, provider, workspace, or process name. |
18
+
19
+ ## Confirmed defects and fixes
20
+
21
+ 1. Running local children were emitted as independent rows; stale browser rows could reintroduce filtered children. The Host now resolves conversation ownership before emitting rows.
22
+ 2. External background children have no local Agent. The Host now observes `jobs.list(agent)` and considers only owned subagent records in `running` or `stopping`. It does not call `read`, `wait`, `kill`, or mark notices reported. Unowned jobs and shell servers do not hold all conversations active.
23
+ 3. The browser mirror filtered every `parentId`, hiding ordinary forks and allowing an orphan marked `origin: subagent` through. The companion now follows the same origin discriminator as the official workspace sidebar. Its source is included under `companions/dsh-notch-focus`.
24
+
25
+ Questions retain their original request ids and resolvers after projection onto the owner. Cancelling a child removes its yellow action. Missing or cyclic lineage does not invent a running task; an actionable question remains visible rather than being discarded.
26
+
27
+ ## Verification and limits
28
+
29
+ `npm test` covers 59 cases, including sequential workers, resumed children with reversed load order, cancellation, nested questions, remote background jobs, stopping/terminal states, job ownership, the real browser companion's mirror submission, heartbeat interruptions, conflicting browser clients, and delayed reading acknowledgements. Reading an idle parent while its child or remote job still runs cannot prematurely acknowledge the eventual result. The original local-worker fix failed 7 of its 10 new regression cases. Before the follow-up fixes, background cases failed 5 of 6 and the browser fork/origin regression failed.
30
+
31
+ The opt-in probe uses the selected Harness's actual built Cordis, SessionStore, AgentRegistry, LocalJobRegistry, `childSessionMeta`, and `subprocessRunHandle`. It verifies metadata, idle-parent job activity, discovery after a late load, non-consuming observation, cancellation settlement, and ordinary versus delegated forks:
32
+
33
+ ```sh
34
+ DSHX_HARNESS=/absolute/path/to/deepseek-harness node --import tsx tools/check-harness-subagents.mjs
35
+ ```
36
+
37
+ The probe creates only an isolated in-memory registry and temporary Notch storage. It starts no model, provider process, second Host, or real user session. The real installed SkillHub workflow was separately observed without sending messages. External providers' actual CLI execution and their own approval UIs were not launched or certified. A third-party plugin that bypasses both official session metadata and the owned-job interface cannot be reliably attributed from its title alone.
38
+
39
+ ## Browser heartbeat stability
40
+
41
+ A browser heartbeat previously acted as both a five-second running lease and an unread-state lease. Expiration switched loaded sessions back to a different unread calculation and removed cold completed sessions; the next heartbeat reversed that decision. A background or throttled page could therefore animate a completed lamp repeatedly without any new result.
42
+
43
+ Unread decisions now survive heartbeat interruptions. Only running claims from an unloaded session expire. A retained completion remains openable. The regression checks repeat expiry/recovery, cold and loaded completions, stale running claims, and a newer completion arriving while an old browser snapshot is still fresh.
44
+
45
+ That expiry fix alone did not reconcile two pages: Harness's `completedNotifications` is local to each browser. Another page's missing reminder must not cancel a completion. Projection version 3 reports explicit reading acknowledgements only for the focused page's selected, inactive conversation. It captures the time of that observation before sending; the list's `updatedAt` is the user prompt time and is not a completion timestamp. The Host retains positive completion facts and a monotonic read-through timestamp. A delayed acknowledgement cannot clear a later turn, and an old positive browser flag cannot resurrect a read result. Host `turn/end` records short and failed root turns even when no polling request saw them running. A cold Host load no longer replays historical results based solely on an old read timestamp.
46
+
47
+ ## Native presentation interruption
48
+
49
+ A reversed robot entry could finish with a tiny positive visibility residue while still marked as entering. Its canvas then painted a solid origin-color disk over the status number. `IdlePresence` now commits exact endpoints, clears the departure direction, and invalidates queued timer ticks. Polling is serialized and rejects older snapshots so delayed HTTP responses cannot reverse a newer result.
50
+
51
+ `npm run test:presentation` verifies reversed entries, exact endpoints, late snapshots, and a 40-state interruption replay without a model or live session. It also renders before/after native PNGs (set `NOTCH_PRESENTATION_OUTPUT` to an output directory). `npm run test:outcome` separately exercises the existing outcome motion and layout. Authenticated `GET /dsh-notch/diagnostics` exposes a bounded, content-free trace of state sources and reading acknowledgements for future incident diagnosis; it contains no titles, message content, or credentials.
@@ -0,0 +1,337 @@
1
+ {
2
+ "date": "2026-09-21",
3
+ "baselineCommit": "31405c741d9a8db6b9b5a2f0415109334ac2ab1b",
4
+ "scope": "Independent native preview only; no DSH calls or production replacement.",
5
+ "benchmarkMethod": "Release swiftc -O, 9 measured repetitions after warmup. Same 480 fixed input poses, repeated 10 times. Spring benchmark: 1000 trajectories of 120 steps on two axes; candidate reuses transition matrices as production sampling does. These are CPU microbenchmarks, not screen FPS.",
6
+ "before": {
7
+ "checksum": 11374989.426233875,
8
+ "geometry4800Frames": {
9
+ "maxMs": 61.11825001426041,
10
+ "medianMs": 52.84204171039164,
11
+ "microsecondsPerUnit": 11.008758689664925,
12
+ "runsMs": [
13
+ 61.11825001426041,
14
+ 51.9814167637378,
15
+ 54.27529173903167,
16
+ 50.32345815561712,
17
+ 49.439916620031,
18
+ 50.37816660478711,
19
+ 53.32116666249931,
20
+ 56.36912491172552,
21
+ 52.84204171039164
22
+ ]
23
+ },
24
+ "solver240kSteps": {
25
+ "maxMs": 3.4785831812769175,
26
+ "medianMs": 2.7013332583010197,
27
+ "microsecondsPerUnit": 0.011255555242920915,
28
+ "runsMs": [
29
+ 2.644374966621399,
30
+ 2.5210417807102203,
31
+ 2.6633748784661293,
32
+ 2.66262493096292,
33
+ 2.8460000175982714,
34
+ 2.9409583657979965,
35
+ 2.7708334382623434,
36
+ 2.7013332583010197,
37
+ 3.4785831812769175
38
+ ]
39
+ }
40
+ },
41
+ "after": {
42
+ "checksum": 11375661.124222511,
43
+ "geometry4800Frames": {
44
+ "maxMs": 34.19966669753194,
45
+ "medianMs": 33.34341663867235,
46
+ "microsecondsPerUnit": 6.94654513305674,
47
+ "runsMs": [
48
+ 32.88120822981,
49
+ 33.44741673208773,
50
+ 34.19966669753194,
51
+ 33.009083243086934,
52
+ 33.34341663867235,
53
+ 33.86433329433203,
54
+ 33.55970839038491,
55
+ 32.60029177181423,
56
+ 33.20933319628239
57
+ ]
58
+ },
59
+ "solver240kSteps": {
60
+ "maxMs": 1.2817084789276123,
61
+ "medianMs": 1.167708309367299,
62
+ "microsecondsPerUnit": 0.004865451289030413,
63
+ "runsMs": [
64
+ 1.1887499131262302,
65
+ 1.1311250273138285,
66
+ 1.1629583314061165,
67
+ 1.1708333622664213,
68
+ 1.1663748882710934,
69
+ 1.2817084789276123,
70
+ 1.1920833494514227,
71
+ 1.167708309367299,
72
+ 1.1649166699498892
73
+ ]
74
+ }
75
+ },
76
+ "medianCostReductionPercent": {
77
+ "solver240kSteps": 56.772889617413625,
78
+ "geometry4800Frames": 36.8998328614634
79
+ },
80
+ "sampling": {
81
+ "denseSamples": 123,
82
+ "submittedSamples": 91,
83
+ "maxHeldTranslationErrorPt": 0.02497934974685793,
84
+ "concealmentErrorBudget": 0.0009765625,
85
+ "contourCacheCapacity": 32
86
+ },
87
+ "nativeMeasurement": "Three sequential Cmd-P replays; no concurrent build, screenshot or AX reads during each spring. Callback intervals and render costs do not measure screen-presented FPS. First callback includes display-link startup; render costs cover the start and end updates only.",
88
+ "nativeRuns": [
89
+ {
90
+ "clock": "display-link",
91
+ "compositorSamples": 91,
92
+ "frames": 58,
93
+ "intervalMaxMs": 82.41066662594676,
94
+ "intervalP50Ms": 16.66808337904513,
95
+ "intervalP95Ms": 17.422916600480676,
96
+ "intervalsMs": [
97
+ 9.963541757315397,
98
+ 16.794624971225858,
99
+ 16.48525008931756,
100
+ 16.784291714429855,
101
+ 82.41066662594676,
102
+ 17.422916600480676,
103
+ 16.661208355799317,
104
+ 16.718666767701507,
105
+ 16.668583266437054,
106
+ 16.66808337904513,
107
+ 16.650458332151175,
108
+ 16.669749980792403,
109
+ 16.849291510879993,
110
+ 16.61433349363506,
111
+ 16.52324991300702,
112
+ 16.66949992068112,
113
+ 16.679541673511267,
114
+ 16.772708389908075,
115
+ 16.569083323702216,
116
+ 16.658500069752336,
117
+ 16.66487497277558,
118
+ 16.778416698798537,
119
+ 16.55604154802859,
120
+ 16.72525005415082,
121
+ 16.64945832453668,
122
+ 16.61329180933535,
123
+ 16.670833341777325,
124
+ 16.643583308905363,
125
+ 16.66274992749095,
126
+ 17.28020841255784,
127
+ 16.075708204880357,
128
+ 16.697291750460863,
129
+ 16.64066663943231,
130
+ 16.780124977231026,
131
+ 16.573041677474976,
132
+ 16.636208398267627,
133
+ 16.690916614606977,
134
+ 16.676416620612144,
135
+ 16.675000078976154,
136
+ 16.659333370625973,
137
+ 16.650458332151175,
138
+ 29.24366667866707,
139
+ 16.606916673481464,
140
+ 16.729624941945076,
141
+ 16.60495833493769,
142
+ 16.697666607797146,
143
+ 16.625333344563842,
144
+ 16.66112500242889,
145
+ 16.697458224371076,
146
+ 20.984791684895754,
147
+ 12.296791654080153,
148
+ 16.69600000604987,
149
+ 16.65508351288736,
150
+ 16.84045814909041,
151
+ 16.48354181088507,
152
+ 16.734541626647115,
153
+ 16.624833224341273,
154
+ 16.802708385512233
155
+ ],
156
+ "intervalsOver20Ms": 3,
157
+ "maskAllocations": 0,
158
+ "renderCostsMs": [
159
+ 5.94462500885129,
160
+ 4.902458284050226
161
+ ],
162
+ "renderMaxMs": 5.94462500885129,
163
+ "renderP95Ms": 4.902458284050226,
164
+ "renderUpdates": 2,
165
+ "windowResizes": 1
166
+ },
167
+ {
168
+ "clock": "display-link",
169
+ "compositorSamples": 91,
170
+ "frames": 57,
171
+ "intervalMaxMs": 90.16849985346198,
172
+ "intervalP50Ms": 16.66083326563239,
173
+ "intervalP95Ms": 17.72633334621787,
174
+ "intervalsMs": [
175
+ 26.742416666820645,
176
+ 2.493708161637187,
177
+ 16.653750091791153,
178
+ 16.738166566938162,
179
+ 16.730208415538073,
180
+ 16.601041657850146,
181
+ 16.625500051304698,
182
+ 90.16849985346198,
183
+ 26.48741682060063,
184
+ 16.66274992749095,
185
+ 17.017833422869444,
186
+ 16.410833224654198,
187
+ 17.167458310723305,
188
+ 16.083666821941733,
189
+ 16.705249901860952,
190
+ 16.662916634231806,
191
+ 16.64212509058416,
192
+ 16.694666584953666,
193
+ 16.64375001564622,
194
+ 16.73062494955957,
195
+ 16.634541796520352,
196
+ 16.626583179458976,
197
+ 16.651666723191738,
198
+ 16.714291647076607,
199
+ 16.967791598290205,
200
+ 16.30091667175293,
201
+ 16.666874988004565,
202
+ 16.866666730493307,
203
+ 16.549541614949703,
204
+ 16.628500074148178,
205
+ 16.940791625529528,
206
+ 16.400375170633197,
207
+ 16.64766645990312,
208
+ 17.72633334621787,
209
+ 15.604500193148851,
210
+ 16.767999855801463,
211
+ 16.61566668190062,
212
+ 16.84012496843934,
213
+ 16.530166612938046,
214
+ 16.60987501963973,
215
+ 16.633291728794575,
216
+ 16.723250038921833,
217
+ 16.614083433523774,
218
+ 16.71904162503779,
219
+ 16.7215415276587,
220
+ 16.65950007736683,
221
+ 16.74445834942162,
222
+ 16.496374970301986,
223
+ 16.708374954760075,
224
+ 16.612041741609573,
225
+ 16.698000021278858,
226
+ 16.654416685923934,
227
+ 16.66083326563239,
228
+ 16.682750079780817,
229
+ 16.640708316117525,
230
+ 16.75912505015731,
231
+ 16.58145827241242
232
+ ],
233
+ "intervalsOver20Ms": 3,
234
+ "maskAllocations": 0,
235
+ "renderCostsMs": [
236
+ 5.557999946177006,
237
+ 5.86216663941741
238
+ ],
239
+ "renderMaxMs": 5.86216663941741,
240
+ "renderP95Ms": 5.557999946177006,
241
+ "renderUpdates": 2,
242
+ "windowResizes": 1
243
+ },
244
+ {
245
+ "clock": "display-link",
246
+ "compositorSamples": 91,
247
+ "frames": 61,
248
+ "intervalMaxMs": 33.29983330331743,
249
+ "intervalP50Ms": 16.65320829488337,
250
+ "intervalP95Ms": 17.42595830000937,
251
+ "intervalsMs": [
252
+ 12.799041578546166,
253
+ 16.53875014744699,
254
+ 16.611333237960935,
255
+ 16.76066662184894,
256
+ 16.59175008535385,
257
+ 16.59574988298118,
258
+ 16.864625038579106,
259
+ 16.513874987140298,
260
+ 33.29983330331743,
261
+ 23.522791685536504,
262
+ 9.782333392649889,
263
+ 16.663500107824802,
264
+ 16.671833116561174,
265
+ 16.672791680321097,
266
+ 16.721750143915415,
267
+ 16.624375013634562,
268
+ 16.73729158937931,
269
+ 17.353208269923925,
270
+ 15.97145851701498,
271
+ 16.69258321635425,
272
+ 16.612291568890214,
273
+ 16.825708327814937,
274
+ 16.61308342590928,
275
+ 16.605500131845474,
276
+ 16.556999878957868,
277
+ 16.690041637048125,
278
+ 16.65320829488337,
279
+ 16.66570850647986,
280
+ 16.68774988502264,
281
+ 16.667208401486278,
282
+ 17.42595830000937,
283
+ 15.935833333060145,
284
+ 16.616958426311612,
285
+ 17.204166622832417,
286
+ 16.152041498571634,
287
+ 16.645833384245634,
288
+ 17.592416610568762,
289
+ 15.789583325386047,
290
+ 16.628375044092536,
291
+ 16.65254170075059,
292
+ 16.888083424419165,
293
+ 16.495874850079417,
294
+ 16.64666668511927,
295
+ 16.67270832695067,
296
+ 16.619958449155092,
297
+ 16.693583223968744,
298
+ 16.68933336623013,
299
+ 16.64345827884972,
300
+ 16.672291792929173,
301
+ 16.901291674003005,
302
+ 16.451458213850856,
303
+ 16.663041664287448,
304
+ 16.676375176757574,
305
+ 16.653041588142514,
306
+ 16.639875015243888,
307
+ 16.73429156653583,
308
+ 16.732458490878344,
309
+ 16.588041558861732,
310
+ 16.63970830850303,
311
+ 16.688500065356493,
312
+ 16.62037498317659
313
+ ],
314
+ "intervalsOver20Ms": 2,
315
+ "maskAllocations": 0,
316
+ "renderCostsMs": [
317
+ 1.9963334780186415,
318
+ 4.957541590556502
319
+ ],
320
+ "renderMaxMs": 4.957541590556502,
321
+ "renderP95Ms": 1.9963334780186415,
322
+ "renderUpdates": 2,
323
+ "windowResizes": 1
324
+ }
325
+ ],
326
+ "verification": {
327
+ "edgeDock": "PASS including cadence invariance, long delay, velocity retargeting, bounded cache eviction, compact sample error, exact crop, cursor lock and native bounds",
328
+ "geometry": "FAILURES=0",
329
+ "javascript": {
330
+ "passed": 59,
331
+ "failed": 0
332
+ },
333
+ "nativeUserPath": "diagonal retract, pull restore, drag option without submitting, restore still waiting, one click submits"
334
+ },
335
+ "previewBinarySHA256": "5faf25c08410c0b23e472db48fd14bbc51c16e112482fdf19502c2f6fff0c182",
336
+ "productionBinarySHA256Unchanged": "2cdfe64bf7b4872dad9db81a0fa08cffab3d61da6cffa7cf513477e2ab3e2896"
337
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "date": "2026-09-23",
3
+ "scope": "Native hidden-edge positioning and attention reveal",
4
+ "before": {
5
+ "reproducedFailure": "screen reposition keeps a hidden cap exactly attached to the requested edge",
6
+ "failureCount": 1,
7
+ "screenshotTriggerRecorded": false
8
+ },
9
+ "after": {
10
+ "edgeDockFailures": 0,
11
+ "geometryFailures": 0,
12
+ "releaseBuild": "passed",
13
+ "sourceAndPreviewBinarySha256": "8097b553d74250c969b8f16eb8c32f3998b02b48d810f5f1811bd883c3b9bbbb",
14
+ "nativeRegressionCoverage": [
15
+ "hidden crop remains on an explicit physical screen anchor",
16
+ "right-side system Dock does not become the screen edge",
17
+ "ordinary running and size changes preserve hidden geometry",
18
+ "completion, failure, approval, and question reveal completely",
19
+ "repeated result and request snapshots respect manual hiding",
20
+ "new request identity wakes despite an unchanged count",
21
+ "stale snapshot does not wake",
22
+ "attention during drag waits for release",
23
+ "attention reverses tuck without a pose jump",
24
+ "Reduced Motion reaches final state immediately",
25
+ "hidden question restores compact view before expanding details"
26
+ ],
27
+ "nativePreviewObserved": [
28
+ "running update stays hidden",
29
+ "completion restores normal view",
30
+ "same completion after re-hide stays hidden",
31
+ "failure restores normal view",
32
+ "question restores normal view",
33
+ "same question after re-hide stays hidden",
34
+ "hidden cap touches preview edge"
35
+ ]
36
+ },
37
+ "modelRequests": 0,
38
+ "realTaskAnswers": 0,
39
+ "limitations": [
40
+ "Preview uses the release binary with local snapshots and a virtual screen edge.",
41
+ "These results do not alone establish installation or production UI acceptance.",
42
+ "No new measured display-frame-rate claim."
43
+ ]
44
+ }