## 0.31.1 需要 DSH 0.2.1-rc.2 或 0.2.1-rc.3。 - 修正工作台「Keil 设置已绑、工作台仍显示未绑定」:设置 → Corn 在 Keil 构建改用内置 Node UV4 运行器、去掉 Python 字段后,编译门控仍要求 `health.python` 就绪,导致 UV4 已绑定时也恒显示「未绑定 Keil UV4」且编译按钮禁用(构建链路只需要 UV4 绑定)。门控与按钮禁用条件改为只看 UV4;自检里 `keilProject` 能力不再由 Python 推导(工程扫描/解析本就是纯 Node)。 - 修正调试 → 工程结构右侧源码预览只显示上半、下半空白:编辑器主题把 `.cm-scroller` 写死 `max-height:320px`,且预览卡片的高度链没有确定高度,文件后半段滚不到。现在编辑器撑满卡片高度并在内部滚动(无 CodeMirror 的 `
` 兜底同样处理),预览正文/代码框/编辑器容器统一 `flex:1 1 auto; min-height:0`。

## 0.31.0

需要 DSH 0.2.1-rc.2 或 0.2.1-rc.3。**破坏性改名**:DSH 会把它当作新插件,需卸载旧插件后重新安装。

- 修正 DSH 0.2.1-rc.3 上的误报:设置页原本会提示「Corn模式 按 DSH 0.2.1-rc.2 的 standard 预设生成,已安装 DSH 0.2.1-rc.3;工具集可能不同,请升级插件」。在 0.2.x 上,注册时已经拿当前 DSH 的 standard 预设逐行比对过;比对确实执行且没有差异时,不再退回到版本号比较。rc.2 → rc.3 的预设注册表、UI 插槽、connection、tools、persona 包内容完全相同。
- README 支持范围更新到 `0.2.1-rc.3`,并说明新版的「更多」菜单。

- 品牌改为 **Corn**,技术名称一并改名:包名 `dsh-corn-bench`、GitHub 仓库 `xingyingyuzhui/dsh-corn-bench`、预设 id `corn-bench`(「Corn模式」)、工具 `corn_bench` / `corn_debug`、Agent loader `dsh-corn-bench-tools`、Fetch 路由 `/api/corn-bench/dispatch`、数据目录 `$DSH_HOME/corn-bench/`、环境变量 `CORN_BENCH_*`,源码文件和函数名同步改名。
- 升级迁移:Host 和 Agent 首次启动时把旧数据目录整体改名为 `$DSH_HOME/corn-bench/`(已存在则不动);界面首次加载时把旧 localStorage 偏好(导航、上次打开的页面)迁到 `dsh-corn-bench:` 前缀。旧名只保留在 `src/shared/legacy-names.mjs`。DSH 会把它当作新插件:需要卸载旧插件后重新安装,新建 Session 选 Corn模式。
- 设置 → Corn 顶部加玉米图标、作者 [xingyingyuzhui](https://github.com/xingyingyuzhui) 与仓库、授权链接。DSH 的 `settings.section` / `conversation.view` 插槽没有图标字段,所以图标只出现在插件自己的页面里;源图在 `assets/corn-icon.png`。
- 授权从 MIT 改为 **PolyForm Noncommercial 1.0.0**(`LICENSE.md`,含 Required Notice)。`package.json` 的 `license` 改为 `PolyForm-Noncommercial-1.0.0`,补 `author` / `homepage` / `bugs`。0.30.2 及更早版本仍是 MIT。
- 原合集仓库已并入本仓库:现行工程计划移到 `docs/plans/suite/`,历史计划和合集 CHANGELOG 在 `docs/archive/suite/`;已移除的旧 harness 插件(0.2.1,仅适用 DSH ≤ 0.1.6)源码快照作为 Release 附件 `harness-0.2.1-legacy.tar.gz` 保存。

## 0.30.2

需要 DSH 0.2.1-rc.2。

- 修正 Desktop 下 DSH 安装位置解析错误:原先用 `process.execPath` 反推安装前缀,而 Electron 的 `execPath` 是应用主程序,算出的 `Contents/lib/node_modules/@deepseek-ai/dsh` 并不存在,解析于是落到无关的全局 CLI(本机是 0.1.7)。后果是 `readInstalledDshVersion()` 报错版本,设置页出现误导性告警「Corn模式 按 DSH 0.2.1-rc.2 的 standard 预设生成,已安装 DSH 0.1.7-alpha.2;请升级插件」。
- 改为优先用 Electron 的 `process.resourcesPath` 定位应用自带的 `Resources/app.asar/dsh` —— 那才是 Host 真正在跑的 DSH;`execPath` 推导和前缀路径退到其后。
- 同一修复让 `loadOfficialPersonaConfig()` 在 Desktop 下重新可用(此前无法解析 `@deepseek-ai/dsh-persona`)。
- 回归测试覆盖 Electron 情形,并验证「应用自带副本排在 execPath 推导之前」;该用例在修复前失败。

## 0.30.1

需要 DSH 0.2.1-rc.2。

- 修正安装文档:桌面插件窗口**接受** Git 地址、tarball 和本地绝对路径,不只是 registry 包名。此前 README 与验收矩阵都写成「`file:` / `link:` / `github:` / tgz 一律被拒绝」,与实际应用行为不符。按本机 DSH 0.2.1-rc.2 解包 `app.asar` 后 `@deepseek-ai/dsh-plugin-manager` 的 `install-spec.js` 核对。因此已发布的版本可以填 `github:xingyingyuzhui/dsh-corn-bench#v0.30.1` 或 tgz 绝对路径直接装;只有裸包名仍需 npm。
- 修正一条假通过的测试:`write-task-lifecycle` 依赖 `fs.renameSync` 的 mock,但 `write-file-atomic` 在 rename 前会做 `fs.realpathSync`,macOS 上 `$TMPDIR` 的 `/var/...` 会解析成 `/private/var/...`,mock 从不命中,「保存失败必须关掉写任务」从未被真正验证。改为比对解析后的路径。
- 该文档修正位于 `files[]` 内,因此 `buildId` 变化;安装包内的文档说明以本版为准。

## 0.30.0

Requires DSH 0.2.1-rc.2.

- 对齐 DSH 0.2.1-rc.2:契约钉改为 `0.2.1-rc.2`;Corn模式 重述 0.2.1 的 standard 预设(新增 time-context、tool-schedule、plugin-market 工具,persona 只保留 prefix)。按注册表能力选快照,DSH 0.1.7 继续用冻结快照。DSH 0.2.x 上与实时 standard 比对,不一致在设置页提示。CI 增加 Node 24。
- 设置 → Corn 新增「Agent 权限」:可关闭 Agent 写点批准(默认开,关闭需确认)。关闭后写点结果带 `approval: 'policy-disabled'`;`status` 返回 `agentWriteApproval`。
- 安全:Agent HTTP 命令桥一律按 Agent 执行,请求体不能自称 user 绕过写点批准。
- 安全:调试启动不再伪造固件(工作区不存在、只有哈希、`allowMissingArtifact`);OpenOCD 接口/目标白名单无论工作区是否存在都生效;GDB/OpenOCD/UV4 路径只取设置里的绑定,不接受请求指定。
- 稳定窗口校验在时钟越过窗口终点而最新采样差 1ms 时会等下一采样,不再误报采样不足。
- `bindings/save` 未带 `bindings` 时不再清空工具路径。
- 测试:两个 CI 失败修复(verify 超时定时器、`chflags` 仅 macOS);调试测试改用真实工作区与固件。
- UI 边界:Corn 嵌在 DSH 会话面板里,宽度与窗口无关。告警、操作记录、串口报文、调试、通用分栏改用面板容器查询,窄面板改为上下排列;工程结构页在窄面板把函数详情和预览放到文件树下方,不再截掉右侧(如「MDK-」链接);筛选栏、子工具栏、分页、调试子标签改为换行,不再把搜索框和重置按钮藏进横向滚动。
- 深色模式跟随 DSH 自己的外观设置(`body[data-ds-dark-theme]`),不再跟随系统;工程图谱、函数详情的配色在深色下不再白底白字,函数图标与 TX/RX 标签在深色下用浅色调。
- 运行调试在没有调试会话时只显示一张说明卡(如何启动、需要准备什么),不再是六张空卡片;断点和监视需会话存在才能添加,空闲时不再显示会失败的添加按钮。
- 告警、操作记录表格为空时说明「当前筛选条件下没有…」;详情提示不再写「左侧」,并提高对比度。
- 点位表查看时只显示名称、监视、功能码、地址、当前值、单位、告警,告警列附阈值摘要(如 `<10 · >50`);倍率、偏移和阈值列在编辑点位时显示。表宽按实际渲染列计算(之前漏算告警回差)。
- 行内写入浮层标明写入的点位和地址;工程树根节点只显示工程名,代码预览去掉重复的路径标题。
- 视图切换(树形/图谱、协议报文/原始数据、HEX/Text)改为分段控件;按钮里的文字符号(▶ ↻ + ⛶ ⚠️ 等)换成统一线条图标;「+连接」改为「新建连接」。
- 浅色模式下选中标签文字加深到约 5:1 对比度;串口报文默认只露连接、方向、状态,其余筛选收进「更多筛选」并显示仍生效的数量;禁用的编译、下载固件按钮悬停显示原因。

## 0.29.30

- RPC 工作区、状态与配置响应统一过滤运行值、告警、趋势、报文和会话日志;共享配置不开放其他会话的私有任务。
- points get/list、status 和可视化当前值核对采样几何与代次,旧采样保持在磁盘但不再显示为当前有效值。
- 调试命令只接受信封身份,显式调试 ID 不能绕过会话/工作区校验;禁止匿名访问调试状态和事件。
- 调试 ID 在启动期间独占保留,停止/退出等待后端清理,防止覆盖会话与泄漏租约。
- 断点/观察点在后端确认后更新权威状态,失败不伪造成功状态或事件。
- 图表 HTML tooltip 转义点位名称、单位和标题,保留 ECharts 自带标记。

## 0.29.29

- 采样身份按点位自己的连接和设备解析。两个会话即使复用相同的 deviceId,也各自使用自己的 unit 和端点。
- 点位几何、归属或端点变化会立即换新的采样代次。旧值留在原处,但不再当作当前值。归属不唯一时没有当前代次;恢复唯一后重新发代次。
- 仿真写入保持仿真连接,只更新被写的点。切到真实模式后,旧仿真值不能通过校验,要等新的真实采集。
- 缺章、错章或时间超前的采样不能进入校验。调用方的工作区、状态和配置响应不再带出内部采样代次表。

## 0.29.28

- Agent `points` get/list:分层运行值隔离;结果带 `valueStatus`(available|missing|unavailable);`unavailable` 不授权改写。
- get 超预算裁剪后 `returned === points.length`;预算丢弃进 `omittedIds`,不与配置缺失的 `missingIds` 混用。
- get/list 只读:不持久化 workspace claim,不把点搬进会话私有层。
- Host 进程内 throw/reject/非法响应统一为可关联的 `HOST_DISPATCH_FAILED`(含 `commandId`)。

- 进行中的轮询只回写采集时间与成败,不再把已停止的连接重新打开,也不再覆盖采集间隔。
- 告警回差默认改为触发阈值绝对值的 1%。点位可单独设置回差;显式填 0 表示无回差。原先隐式的 1 个工程单位回差不再使用。
- 仿真写入保存失败或总线抛错时,写入任务会结束,不再挡住下一次写入。同一工作区已有写入时,后一次返回 `WRITE_BUSY`。
- 一次从站超时不再关掉同一条串口上的其他设备。Host 退出后,I/O 进程会放开 COM 口。
- 批准写入时会再核对点表与端点;对不上则原批准失效。总线忙时该请求仍留在待批准列表。
- Agent 写点待批准返回 `APPROVAL_PENDING`,并说明等待界面批准、不要重试。相同未过期写点复用原批准。
- DSH 0.1.7+ 上 `node scripts/seed-preset.mjs` 不再报错退出:Corn模式由 Host 声明注册。热重载后预设会等上一份 Host 注销完成再注册。
- 模态框支持 Tab 焦点循环;危险确认默认聚焦取消,且默认不可点遮罩关闭。
- 折线图改为只使用 ECharts。客户端不再打包 uPlot。

## 0.29.27

- 适配 DSH 0.1.7 声明式 Agent 预设:Corn模式 经 `agentPresets.register()` 注册为 `corn-bench` 声明,重新出现在预设选择器(旧版本仍走目录式 seed)。
- 预设子插件清单改为随包快照重述 0.1.7 `standard` 并追加 `dsh-corn-bench/agent` 工具行;漂移由 `scripts/gen-standard-preset-snapshot.mjs --check` 把关。
- 旧目录式预设在声明通过 roster 校验后整体改名备份到 `.corn-bench.backup.`,不删除用户文件。旧会话 `corn-bench` 身份的 Desktop 复验待做(见 011 §7)。
- 契约钉升至 `0.1.7-alpha.2`(静态契约核对 + lab 安装;Desktop 复验待做(见 011 §7))。

## 0.29.26

- 共享发布/撤销时同层重复 deviceId 被明确拒绝并给出冲突明细,不再静默去重丢设备。
- 设备冲突提示标注实际写回层(shared / private / top 及所属会话),诊断指向不再错位。

## 0.29.25

- 操作详情「原始记录」固定展开,去掉图标和折叠箭头。
- 仿真连接在「原始数据」页也能列出并展示报文。

## 0.29.24

- 折线图在点位断连/失败后不再用墙钟空点把 X 轴往右拉;轴停在最后一条有效样本。

## 0.29.23

- 串口报文列表从上到下按时间从新到旧;自动滚动跟随顶部新报文。

## 0.29.22

- 协议报文筛选行用「过滤关键字」输入框撑满剩余宽度,重置与上方导出按钮右对齐。

## 0.29.21

- 告警详情去掉「确认表示已知悉,不代表故障恢复。」说明。

## 0.29.20

- 告警页筛选栏与列表之间不再显示确认/复制等通知条。

## 0.29.19

- 操作记录每页最多 50 条,按时间从新到旧。

## 0.29.18

- 操作详情去掉底部「添加到 Agent 输入」和说明,右上角复制改为 AI。

## 0.29.17

- 设置页去掉「页面导航」下的两行说明。

## 0.29.16

- 「重试连接」改为「重试」。
- 运行调试源码预览去掉外层滚动条,只留编辑器一条。
- 「+连接」留在全部连接页并打开下方连接编辑框。
- 仿真轮询写入串口报文(SIM TX/RX)。

## 0.29.15

- 全部连接:连接为蓝色、断开为红色;端点列用绿灯/红灯表示状态。
- 报文详情:去掉「AI 辅助分析」和顶栏复制,改为右上角 AI;筛选栏「重置」不再被挤成竖排。

## 0.29.14

- 全部连接表操作列:连接/断开合成一个按钮;去掉已连接的禁用按钮。

## 0.29.13

- 报文详情 HEX / Text 框内文字与「复制」按钮垂直居中。

## 0.29.12

- 串口报文筛选下拉从 140px 收到 112px,与告警/操作记录工具条对齐。

## 0.29.11

- 可视化卡片三点菜单按内容收窄(不再固定 218px 宽),右对齐 ⋯ 按钮。

## 0.29.10

- 可视化卡片右上角三个按钮收成 DSH 风格三点菜单(AI / 编辑 / 删除)。数值卡去掉组件内标题和「更新于」时间。Client 体积上限 1 675 000 bytes。

## 0.29.9

- 可视化组件操作栏「让 Agent 分析」改为与上位机点位相同的紧凑 **AI** 按钮。

## 0.29.8

- 折线图数据点改为实心圆(ECharts `symbol: 'circle'`,uPlot 点填充与线同色),不再用默认空心 `emptyCircle`。

## 0.29.7

- 折线图 Y 轴上限对齐 1/2/5×10ⁿ 刻度,不再把 `峰值×1.08` 的原始浮点(如 6.6464)画成轴顶标签。Client 体积上限 1 672 000 bytes。

## 0.29.6

- 编辑组件卡片边框不再只依赖 `--dvb-bdr` 继承:`border` 带字面 fallback,挂到 `document.body` 后类型卡 / 配置卡 / 预览 / 筛选胶囊仍有线框。

## 0.29.5

- 编辑组件弹窗挂到 `document.body` 后仍继承 `--dvb-bdr`,类型卡 / 配置卡 / 预览 / 筛选胶囊线框不再消失。

## 0.29.4

- 编辑组件弹窗挂到 `document.body`,不再被会话区 `container-type` 和底部输入框(z-index 7)盖住。Keil 工程选择器同样处理。

## 0.29.3

- 折线图时间轴在窗口未填满时从第一条样本起算(从左往右长),不再把十几秒数据拉满整轴、把最新点贴在右边缘裁掉。关闭「自动滚动」会钉在起点窗口。Y 轴自动范围给峰值留出余量。

## 0.29.2

- 监控二级 tab 切走再回来时,可视化页保持挂载(`visibility` 隐藏,不用 `display:none`),折线图不再按 140px 占位高度重算 Y 轴。
- 图表等到容器有真实宽高再 `init`;ECharts 与 uPlot 都跟 ResizeObserver。GridStack 关闭 one-column 折叠。

## 0.29.1

- 监控/调试二级 tab 在渲染时再取文案,避免 Host 中文偏好落地前被浏览器临时英文冻结成 Charts / Alarms / Serial Frames / Operation Log。
- Client 体积上限随 locale tick 调至 1 667 000 bytes。

## 0.29.0

结构与测试重构收口(计划 P0–P6):

- `src/**` 禁止导入根目录 `bench-*`(dependency-cruiser 四条 error);门面仅保留 ≤80 行 re-export。
- 生产大文件按职责拆分;structure-budget allowlist 清空。
- 测试按领域目录重组,结构/源码断言/包闭包进 `npm run quality`。
- 补齐 ADR-019~023(debug/写点会话所有权、告警模型、verify 真实性、Windows 验收边界);ADR-024 标 Completed。
- Client 体积上限随模块边界税上调至 1 665 000 bytes。

## 0.28.7

- 修复 `normalizeCwd` 相对路径单测:用 `path.isAbsolute`,不再假设 POSIX `/` 前缀(Windows CI 绿)。

## 0.28.6

- 删掉一批源码/CSS 字符串锁和重复 import 检查;行为测和写点/I/O/preset 保险丝保留。

## 0.28.5

- 工程结构页拆成 `use-project-session`(会话/地图/预览)和 `project-toolbar`,workspace 只拼布局。

## 0.28.4

- 合并 8 个单测 debug 文件到主题文件(批准、RPC、事件游标、探针租约)。工程结构图与运行时图共用同一套 fit/zoom 相机 hook。

## 0.28.3

- TemperatureDemo 源码/工程树/调用图/调试会话收到 `src/ui/debug/fixtures/`,工程结构和运行调试页不再内嵌同一份 demo。

## 0.28.2

- Client 第一刀:空间/圆角/描边 token,`Panel`/`Tabs`/`Hint` 原语,运行调试面板改走共用壳。UI 引用 `bench-*` 门面改为 cruiser warn(ADR-024)。

## 0.28.1

- 工程结构树形页:修复 `PROJECT_CSS` 未插值 `data-dsh-corn-bench`,左右栏卡片框丢失。右侧「示例源码 / 文件符号」补上独立卡片框;去掉树下「当前文件」卡片。树形/图谱切换去掉外围框线和工具栏底部分割线,并收紧工具栏上下间距。源码预览标题与函数/跳转收成一行,去掉复制/搜索按钮和标题栏底部分割线,并收紧标题栏与源码卡片之间的间距。去掉「示例源码」「文件符号」左侧箭头。图谱页去掉底部图例、统计和操作提示。缩放条贴在画布右下角,层级锁在图谱内,不再盖住会话输入框。函数详情:标题栏关闭按钮回到右侧,源码片段用真实行号而不再写死 ReadTemperature;调用图谱默认打开焦点函数详情。图谱画布铺满容器、绕视口中心缩放,不再在选中节点或 Resize 时把相机打回 35%。点击函数节点打开详情卡片,不再被画布拖拽吃掉。函数详情把名称、文件和行号收成一行。去掉树形源码预览底栏状态行。图谱工具栏只保留「适应画布」。运行调试页按理想稿对齐:会话条、已暂停状态、源码执行行/断点槽、两条 demo 断点、可折叠事件表。去掉运行调试页顶部会话条(目标名和 GDB/OpenOCD)。

## 0.28.0

Requires DSH `0.1.5-rc.1`. Repair release: native DSH contract, upgrade migration, no long-term framework patches.

- Preset overlay migrates `text → prefix` and the tool row to `dsh-corn-bench/agent`, validates with official `dsh-persona` Config, and copies shipped `standard` on first install.
- Settings preset health uses the same schema/tool-row contract, not YAML parse alone.
- Host stays `connection` + `webServer`. Agent is `./agent` (`dsh-corn-bench-tools`) with required `tools` + `systemPrompt`.
- Default bundle no longer inserts `standing-guard` / `scan-guard`. Those remain an optional sibling `dsh-corn-harness` with an explicit DSH version pin, not a production dependency.
- Debug page still does one state query; event wait parks for Agent-started sessions instead of 1 Hz polling.
- Debug wait/wake require owner session id and workspace cwd. Watch values survive pause/step. Host dispose waits for the same RPC unregister promise. Preset health uses official `dsh-persona` Config.

## 0.27.2

Requires DSH `0.1.5-rc.1`. Preset compatibility and standing-mount isolation.

- Migrate Corn persona `config.text` → `config.prefix` and rewrite the managed tool row to `dsh-corn-bench/agent` (no leftover `role`). Overlay validates with the official `dsh-persona` Config before write.
- First install copies the shipped `standard` preset when `agentPresets.copy` is unavailable, then overlays and validates. Failures are not swallowed as success.
- Failed standing mounts are cached by composition digest: deterministic schema errors remount once per generation; transient errors back off; explicit retry and file changes remount.
- Host RPC registration that resolves after dispose still runs the disposer. Shared debug runtime dispose is identity-checked. Agent guidance is a required `systemPrompt` effect and no longer imports the YAML migrator.
- Debug page keeps one state query, parks on `waitEvents` while idle, and wakes when Agent starts a session. Scan flush snapshots the plugin tree once per dirty batch.

## 0.27.0

Requires DSH 0.1.2-alpha.3. Install from an `npm pack` tarball.

Major stabilization, debug runtime hardening, and verification release (PR-A through PR-F):

- **Debug Runtime Authority & Event Contract (PR-A)**:
  - `DebugRuntime` is now the single authoritative state reducer for embedded debugging.
  - Replaced ad-hoc backend state mutations with strict `DebugBackendEvent` contracts (`backend.running`, `backend.stopped`, `backend.console`, `backend.exited`, `backend.error`).
  - True asynchronous pause and stepping semantics: step/pause actions await genuine native target stop events before reporting completion, eliminating fake synchronous stepping.
  - Canonical event naming shared between Host and UI via `src/shared/debug-events.mjs` (`DEBUG_EVENT_TYPES`), eliminating unverified string checks.
- **Host Launch Spec & Session Ownership (PR-B)**:
  - Host resolves immutable `ResolvedDebugLaunchSpec` based on workspace, Keil target, build artifact hash, OpenOCD profile, and probe serial. Agent parameters simplified to `{ action: "start" }`.
  - Removed insecure boolean `payload.approved = true`; debug startup enforces expirable `approvalRequestId` tickets tied to artifact sha256. Stale tickets are rejected with `APPROVAL_STALE`.
  - Target lease identity hardened to physical probe identity (`probeSerial`) rather than workspace directory.
  - Replaced fixed GDB port 3333 with dynamic loopback port allocation (`allocateLoopbackPort`).
- **Windows + STM32 Hardware Smoke Fixture (PR-C)**:
  - Added dedicated minimal STM32 test fixture in `fixtures/stm32-debug-smoke/` (`main.c`, `system_stm32.c`, `openocd.cfg`, `stm32_smoke.axf`).
  - Added formal Windows acceptance checklist template in `docs/WINDOWS_ACCEPTANCE_0.27.md`.
- **Keil UVSC Binary Protocol & Simulator Rewrite (PR-D)**:
  - Replaced legacy mock JSON protocol with genuine 16-byte fixed-header UVSC binary framing (`0x43535655`).
  - Added managed background `UV4DebugProcess` capable of dynamically spawning UV4 without user GUI interaction.
  - Implemented request-response matching and asynchronous event routing (`UV_DBG_CALLBACK`, `UV_ASYNC_MSG`, `UV_DBG_CMD_OUTPUT`).
- **ProgramModel AST & Archify Boundary Decoupling (PR-E)**:
  - Introduced Lezer/Tree-sitter C AST source analyzer (`tree-sitter-c-analyzer.mjs`) with `confidence: 'ast'`.
  - Demoted regex analyzer to heuristic analyzer (`heuristic-c-source-analyzer.mjs`) with `confidence: 'heuristic'`.
  - Decoupled graph traversal algorithms (`findUpstream`, `findDownstream`, `findCausalPath`) into `src/domain/program/graph-analysis.mjs`.
  - Added `runtime-correlation-service.mjs` to map runtime execution locations to ProgramModel function nodes, callers, callees, variable dependencies, and nearest conditions.
- **Verify Productization & Live Telemetry (PR-F)**:
  - Added `TelemetryReader` abstraction reading from live value stores rather than static workspace layout.
  - Removed 2-second hardcoded clamp on `stable-for-duration`; supports dynamic sampling and unconstrained durations bounded by scenario timeouts.
  - Added cancellation support via AbortSignal and distinguished result statuses (`pass`, `fail`, `error`, `timeout`, `cancelled`).
  - Enriched evidence binding firmware hash, artifact sha256, debug session ID, target identity, and telemetry sample series.
  - Exposed `verify` action directly in `corn_debug` agent tool and RPC handler.
  - Added architectural decision records: ADR-016, ADR-017, ADR-018.


Requires DSH 0.1.2-alpha.3. Install from an `npm pack` tarball.

Security and integration fixes (no new product features):

- Browser business operations use authenticated `connection.rpc` on `/corn-bench`; loopback Origin no longer substitutes for capability on the Agent HTTP bridge (`POST /dsh-corn-bench/command` only).
- Agent focus requests are preserved when Corn pages are not mounted; `viewRequest` is not dropped while workspace cwd is still loading.
- Project workspace state is isolated by session, cwd, Keil project, and target; stale map/file responses are rejected.
- Project graph layout, truncation hints, keyboard navigation, and `/` search shortcut guards are corrected.
- `npm run test:full` and `npm run pack:check` pass.

Windows serial / Modbus / OpenOCD device-chain acceptance remains **not** signed off. See `docs/archive/WINDOWS_ACCEPTANCE_0.26.md`.

## 0.26.0

Requires DSH 0.1.2-alpha.3. Install from an `npm pack` tarball. This is an integration migration, not a visualization schema change.

Breaking Harness integration:

- Session workspace path comes from `useWorkspaces` items by `sessionId`. `useSessions` is gone.
- Cross-tab navigation uses `openView` + `dvb1:` focus tokens and `viewRequest`. `slots.select` is gone.
- Client inject is `slots` + `locale` + `connection` (authenticated RPC).
- Plugin notices include a `randomUUID` `id` and the alpha.3 `source` contract.
- Browser Host calls no longer use a static `X-DSH-Corn-Bench` header. Loopback Origin is required; Agent HTTP uses a process-lifetime capability. Official Typert Remote is not available to this thin-JS plugin (ADR-012).
- Corn preset changes apply to **new sessions**. Open sessions keep their generation.

Windows serial / Modbus / OpenOCD device-chain acceptance is **not** signed off. See `docs/archive/WINDOWS_ACCEPTANCE_0.26.md`.

Profile risk (not Corn bugs): `dsh-excel-panel` 0.6.1 and `@omdsh-dev/dsh-genui` 0.8.4 may still fail on alpha.3. Isolation Profile + Corn tarball is the compatibility evidence.