Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ R1 固定总出口的源码为 `ce9b24d`,早期 `2dc8d6d` / `9b16acc` 仍分
| 范围 | 结果与复现入口 | 可以支持的结论与限制 |
|---|---|---|
| 行存储封存与结构单一发布(#169 第二片) | [固定结果](../experiments/core/results/2026-10-29-sealed-row-storage/README.md)、[验证身份](../experiments/core/results/2026-10-29-sealed-row-storage/validation.json) | `Screen::lines/history` 私有,只读口 + 23 文件/363 处迁移;Find overlay 改文档 rank;默认 Release 构建 exit 0、核心 8/8、扩展快测 20/20、candidate 源 /W4 编译 0。无新 VT/重排行为;运行中跨重排 Search、Qt 与候选运行由宿主作业复核。 |
| 原版合成会话的 UIA 可见性(#155 辅助) | [固定记录](research/windterm-synthetic-session-uia.md) | 隔离 VM 上确认:profile 被读取、组名进入主窗口与新建会话对话框,但**会话叶不在 UIA 树**(raw_children=0、无展开/选择模式);参数与累积状态均已排除;未发现命令行开会话入口。菜单与新建会话对话框可枚举/可写,但没有命令行字段。结论:UIA 不能作为驱动原版合成会话的前提。 |
| 每屏 margin 的原生 gap:路径结论(#56) | [决策记录](research/conpty-margin-path-decision.md)、[合同与四阶段 oracle](research/conpty-native-margin-path.md)、[fork 构建/运行](https://github.com/JavaZeroo/termforge/pull/98) | 固定上游源码根因(共享 _scrollMargins)、hash 与 20 次同源运行(baseline red→patched 四阶段绿、412/412 adapter、17/17 回归)已固定;结论是“推荐 MIT fork,采纳需用户在 #34 确认”。不改变 ADR-0007 现状、#41 开放状态与产品后端。 |
| 保留历史的内存与单次 Search 成本(#164 剩余项) | [固定结果](../experiments/core/results/2026-10-29-history-memory/README.md)、[验证身份](../experiments/core/results/2026-10-29-history-memory/validation.json) | 生产 `Screen`/`TextSearch` 在 H=100/1000/10000、各 3 个新进程样本:每行私有增量收敛 ~5.8–6.9 KB,H=10000 私有提交 ~59 MB;整文档 Search ~54 ms/199 步。不是 r164 fork 对照,也不是性能预算;不关闭 #164。 |
| 结构重排下的增量 Search(#169 延期项 / #27 前置) | [固定结果](../experiments/core/results/2026-10-29-search-reorder/README.md)、[验证身份](../experiments/core/results/2026-10-29-search-reorder/validation.json) | `TextSearch` 以文档 rank 维护扫描前缀:order revision 检测、局部 `repair_order`、rank 化 `rewind`/`match`/`prune`。新 `search_reorder_core` 覆盖扫描中重排、重排后导航、淘汰与有序回归;核心 10/10。无 UI/Find 集成、无重排成本测量,不声明 #27/R2 通过。 |
Expand Down
40 changes: 40 additions & 0 deletions docs/research/windterm-synthetic-session-uia.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# WindTerm 2.7.0 合成会话:UIA 可见性与可驱动入口

本页记录驱动原版 2.7.0 做合成会话观察时的一条死胡同与可用入口,供 [#155](https://github.com/JavaZeroo/termforge/issues/155) 的 harness 与后续 [#123](https://github.com/JavaZeroo/termforge/issues/123)/[#126](https://github.com/JavaZeroo/termforge/issues/126) 观察复用。全部结论来自一处隔离 Windows 11 VM 上的固定 2.7.0 发行包(EXE SHA 与仓库其它记录一致),没有修改产品代码、没有 Frida 注入。

## 合成 profile 的加载状态

固定布局是 profiles.config 指向唯一 profile 目录,profile 下放 .wind/profiles/default.v10/terminal/user.sessions,其中一条合成会话(group/label/protocol/system/target/uuid/process.arguments/process.workingDirectory)。

| 检查 | 结果 |
|---|---|
| profile 是否被读取 | 是:原版在同一目录写出 user.config、global/reopen.history、terminal/reopen.history,且不改写我们的 user.sessions |
| 组名是否进入界面 | 是:主窗口 UIA 树与“新建会话”对话框的分组下拉里都出现 TermForge Lab |
| 会话叶是否进入 UIA 树 | **否**:整棵树里只有一个 TreeItem(组),该节点 raw_children=0、无 ExpandCollapse/SelectionItem |
| 是否与会话参数有关 | 否:把 process.arguments 换成已验证的 /d /q 后结果完全相同 |
| 是否与累积状态有关 | 否:删掉 user.config 与两份 reopen.history、只留 user.sessions 后仍只有组 |
| 是否有命令行开会话入口 | 未发现:-s / --session / -n / --new-session / -h 都会普通启动,且不拉起会话目标进程 |

## UIA 可用的部分

- 菜单栏可展开:会话 / 编辑 / 搜索 / 选择 / 转到 / 查看 / 模式 / 工具 / 窗口 / 帮助;会话菜单含 新建会话、新建窗口、断开会话、重新连接会话、打开会话...、最近打开、保存会话、日志、关闭视图、退出。
- “新建会话”对话框可完整枚举:主机、端口、OneKey、标签、分组(下拉已含合成组)、终端、系统(linux/cmd/dumb)、字符集、描述,以及完整设置树(会话/终端/Bell/模式/键盘/安全/日志/窗口/选择/SSH/连接/代理/验证/SFTP/X11/X-Y-Z Modem)。
- 文本字段可用 ValuePattern 写入;列表项可用 SelectionItemPattern 选中。
- 该对话框没有“命令行/参数”字段;受控命令只能来自会话的 process.arguments。

## 已知的 UIA 限制

- QComboBox 的“系统”没有暴露 ExpandCollapsePattern,选中列表项后 ValuePattern 仍显示旧值(linux),未验证为真正生效;
- 对菜单项调用 InvokePattern(如新建会话)会进入模态事件循环,脚本需改用快捷键或异步方式,否则阻塞到超时;
- 截图可用(VM 侧 screenshot 产出 1024×768 PNG),但本会话的记录者无法直接读图;用 Windows.Media.Ocr 可读到大字标题(如 TermForge Lab),不足以判定叶节点是否存在。

## 对 harness 的含义

1. **不能把“UIA 暴露会话叶”当作驱动原版的前提**:组能进模型,叶不保证出现。
2. 仍可继续不注入的路线:用对话框新建并保存会话,让原版自己写出规范 user.sessions,再与合成条目逐字段比对;或用“打开会话...”配合预制文件。
3. 若要直接读 widget 树/触发动作,已验收的 [research/ui/launch.py](../../research/ui/launch.py) 走的是 Frida + Qt 探针,而不是 UIA;切换过去需要显式记录注入身份与回收证据(当前 bootstrap 计划把 frida_deploys 固定为 0)。

## 边界

- 单 VM、单发行包、单一合成 profile 配置;未覆盖 WinPTY/ConPTY 本地 shell、真实输入法、多显示器或性能。
- 本页不改变任何产品行为、优先级或 #155/#165 的状态;它只把“UIA 不是可靠入口”这一事实固定下来,避免后续重复探索。
Loading