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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ An independent, fully open-source terminal project targeting WindTerm 2.7.0 feat

## 项目地图

新的[自主 C++ / Qt 会话入口](src/qt/README.md)以显式构建开关提供固定 80×24 的最小本地会话;当前默认入口和上面的操作说明仍属于既有 Win32 原型。Qt 工作区、完整文字交互及动态 resize 尚待迁移,不能据此声明完整开发版。
新的[自主 C++ / Qt 会话入口](src/qt/README.md)以显式构建开关提供固定 80×24 的 cmd 标签,可新增、切换、独立关闭并在应用退出前核对会话回收;[限定验证](experiments/shell/results/2026-10-28-qt-tabs/README.md)不继承旧配置能力。当前默认入口和上面的操作说明仍属于既有 Win32 原型。分屏、其他 shell、工作区恢复、完整文字交互及动态 resize 尚待迁移,不能据此声明完整开发版。

| 要了解什么 | 唯一入口 |
|---|---|
Expand Down
1 change: 1 addition & 0 deletions docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

| 配置 | 证据定位 |
|---|---|
| Qt cmd 标签与退出前回收 | [固定结果](../experiments/shell/results/2026-10-28-qt-tabs/README.md)、[验证身份](../experiments/shell/results/2026-10-28-qt-tabs/validation.json):双 cmd 隔离、失败页、关闭与四个实际事件循环边界;Qt 1 项和其他 49 项诊断及内部跳过分列,旧中断轮不拼接 |
| Qt 正式入口的独立 hosted 构建 | [固定结果](../experiments/shell/results/2026-10-28-qt-cpp-ci/README.md)、[验证身份](../experiments/shell/results/2026-10-28-qt-cpp-ci/validation.json):固定 SDK、VS 2026 hosted 与真实 cmd 的 offscreen / OwnedJob 检查;原依赖换行和 generator 失败保留。没有原生上屏、完整部署哈希或产品包验收 |
| 自主 C++ + Qt Widgets + 固定微软 ConPTY 正式目标 | [ADR-0007](adr/0007-bundled-microsoft-conpty.md) / [ADR-0008](adr/0008-cpp-core-qt-widgets.md) 记录用户确认;新组合的实现与验证另行留证,不引用旧默认或 Alacritty 通过结果代替 |
| 既有默认/Alpha:自主 C++ + 系统 ConPTY + Win32 | R1 限定总验收和有限 VT/Unicode 子集;与当前 Qt/固定后端目标组合分列 |
Expand Down
2 changes: 1 addition & 1 deletion docs/FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

| 新路线迁移入口 | 当前状态与边界 | 目标差距 | 路标 |
|---|---|---|---|
| 自主 C++ / Qt / 固定微软 ConPTY | **实现中,未验收**:[显式 Qt 入口](../src/qt/README.md)提供固定 80×24 的单个真实 cmd、有界输入/输出、基本 ASCII/16 色绘制及错误/关闭处理;与旧 Win32/Alacritty 配置分别验证 | 完整工作区、动态 resize、历史/选择/Find、Unicode/IME、真实 DPI、应用兼容与性能仍需实现或迁移;当前为本地构建,不是可发布开发包 | R2 |
| 自主 C++ / Qt / 固定微软 ConPTY | **实现中,未验收**:[显式 Qt 入口](../src/qt/README.md)提供固定 80×24 的 cmd 标签、基本 ASCII/16 色及各会话独立有界队列;双 cmd 输入、关闭和错误隔离及真实事件循环退出前回收有[限定验证](../experiments/shell/results/2026-10-28-qt-tabs/README.md)。Qt 1 项与其余 49 项既有/独立诊断分列 | 分屏、其他 shell、工作区恢复、动态 resize、历史/选择/Find、Unicode/IME、真实 DPI、应用兼容与性能仍需实现或迁移;应用/标签退出策略沿原型合同,完整 WindTerm 标签行为对照未完成;当前不是可发布开发包 | R2 |

官方参考的基础文字行为已按 [R1-01 合同](research/windterm-r1-text-contract.md)完成两组各两轮的自动取证;这为独立实现提供行为依据,产品能力仍按下表分别验收。

Expand Down
2 changes: 1 addition & 1 deletion docs/TRACKING.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
| 工作 | 责任任务 | 硬前置或联合条件 |
|---|---|---|
| 正式路线最小单会话与专用 CI | [单会话 #115](https://github.com/JavaZeroo/termforge/issues/115)、[Qt CI #117](https://github.com/JavaZeroo/termforge/issues/117) | 均已限定合入 main;固定依赖的 Windows Qt 构建与会话结果独立验证,不能由默认/参考 CI 代替 |
| Qt 多 cmd 标签迁移 | [会话隔离 #124](https://github.com/JavaZeroo/termforge/issues/124) | #115 已解除前置;先验证输入/输出、关闭和错误隔离,完整工作区/恢复与复杂输入仍另验 |
| Qt 多 cmd 标签迁移 | [会话隔离 #124](https://github.com/JavaZeroo/termforge/issues/124) | 固定 cmd 双会话的输入/输出、关闭和错误隔离及应用退出前回收已有[限定验证](../experiments/shell/results/2026-10-28-qt-tabs/README.md);完整工作区/恢复、原版标签交互与复杂输入仍另验 |
| 原版备用屏可观察合同 | [1049 取证 #118](https://github.com/JavaZeroo/termforge/issues/118)、[样式/活动缓冲区 #123](https://github.com/JavaZeroo/termforge/issues/123) | #118 已限定合入 main,提供原版光标/文字投影;#123 补剩余观察。末端、local-shell transport 和未知项分别记录 |
| 原版本地输出正确性自动化 | [小负载完整文本 #119](https://github.com/JavaZeroo/termforge/issues/119) | 已作为 #3 的独立切片合入 main;生产事件、全文与回收绑定,尚不验收 C0、消费/呈现端点、扰动或正式 #4 基线 |
| 历史候选/官方后端联合基线 | [联合配置基线 #55](https://github.com/JavaZeroo/termforge/issues/55) | 保留原固定源码与红/绿结果;可复用输入和接入经验,不替代自主 C++/Qt/固定 ConPTY 的新配置验收 |
Expand Down
4 changes: 2 additions & 2 deletions docs/milestones/R2-local-terminal.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

## 当前站位

R2 的平台调查、有限会话与恢复及 Alacritty 参考实验已有各自限定交付。当前正式路线为**自主 C++ 核心、Qt Widgets 与随包固定微软 ConPTY**;[最小可构建单会话入口 #115](https://github.com/JavaZeroo/termforge/issues/115)与[固定依赖专用 CI #117](https://github.com/JavaZeroo/termforge/issues/117)已合入 main,完成固定 80×24、本地 cmd 输入输出、错误和关闭回收的限定验证。接续补 C++ 核心能力、Qt 多会话和完整用户工作流。[原版模式 #118](https://github.com/JavaZeroo/termforge/issues/118)与[本地 cmd 正确性工具 #119](https://github.com/JavaZeroo/termforge/issues/119)已分别交付限定证据,剩余样式、C0 和性能端点继续调查。现有 C++ 核心仍是有限子集;候选的首批字素、TUI 与重排成功不转记为 C++ 能力。已有 Alpha、Win32 原型、Alacritty 和 Draft 后端保留固定身份,新组合需要自己的证据。
R2 的平台调查、有限会话与恢复及 Alacritty 参考实验已有各自限定交付。当前正式路线为**自主 C++ 核心、Qt Widgets 与随包固定微软 ConPTY**;[最小可构建单会话入口 #115](https://github.com/JavaZeroo/termforge/issues/115)与[固定依赖专用 CI #117](https://github.com/JavaZeroo/termforge/issues/117)已合入 main,完成固定 80×24、本地 cmd 输入输出、错误和关闭回收的限定验证。Qt 固定 cmd 多标签已有[会话隔离与退出前回收的限定验证](../../experiments/shell/results/2026-10-28-qt-tabs/README.md),接续补 C++ 核心能力、工作区恢复和完整用户工作流。[原版模式 #118](https://github.com/JavaZeroo/termforge/issues/118)与[本地 cmd 正确性工具 #119](https://github.com/JavaZeroo/termforge/issues/119)已分别交付限定证据,剩余样式、C0 和性能端点继续调查。现有 C++ 核心仍是有限子集;候选的首批字素、TUI 与重排成功不转记为 C++ 能力。已有 Alpha、Win32 原型、Alacritty 和 Draft 后端保留固定身份,新组合需要自己的证据。

历史联合源码 `3e5b96d` 的三配置[真实基线](../research/joint-conpty-baseline.md)及其后续限定修复继续用于复用输入、接入经验和复验原失败;它们不证明新的 C++/Qt/固定后端组合已通过。Draft #50 的后端成果接入当前路线后仍须验证原合同,路线确认不解除失败或跳过项。

Expand Down Expand Up @@ -43,7 +43,7 @@ flowchart LR

## 下一批的任务边界

1. **从正式路线最小整合接续 Qt 多会话和后端复验。** #115 已限定验证固定 80×24 单会话,#117 已完成固定依赖的独立 Windows CI;[#124](https://github.com/JavaZeroo/termforge/issues/124)迁移多 cmd 标签和关闭隔离。动态尺寸、C++ 核心模式和 Qt 交互缺口继续保留。#55 已交付含红的真实基线;#51 原生 viewport resize、#63 工作区原生 viewport,以及 #62 的[真实 writer 持块、取消与停止夹具](../research/sender-fence.md)和 #53 原 UI/3MB/八会话 data-only 合同均已在各自范围验证并整合到实验父分支。接续 #52 GUI Vim 与 #47 的完整官方矩阵、同次真实 CF/IME;限定切片关闭不等于联合验收通过。未完成项可以用原冻结输入独立定位,最终修复验收须在联合配置重建;期限、负载和原失败保留,一次未复现不自动构成因果修复。
1. **从正式路线最小整合接续工作区和后端复验。** #115 已限定验证固定 80×24 单会话,#117 已完成固定依赖的独立 Windows CI;[#124](https://github.com/JavaZeroo/termforge/issues/124)已限定验证 cmd 标签输入/关闭隔离与事件循环退出前回收,完整工作区和恢复仍另行迁移。动态尺寸、C++ 核心模式和 Qt 交互缺口继续保留。#55 已交付含红的真实基线;#51 原生 viewport resize、#63 工作区原生 viewport,以及 #62 的[真实 writer 持块、取消与停止夹具](../research/sender-fence.md)和 #53 原 UI/3MB/八会话 data-only 合同均已在各自范围验证并整合到实验父分支。接续 #52 GUI Vim 与 #47 的完整官方矩阵、同次真实 CF/IME;限定切片关闭不等于联合验收通过。未完成项可以用原冻结输入独立定位,最终修复验收须在联合配置重建;期限、负载和原失败保留,一次未复现不自动构成因果修复。
2. **并行处理原版对照、平台语义与性能。** [原生语义处理路径 #56](https://github.com/JavaZeroo/termforge/issues/56)先明确 #41 原合同需要什么、哪些路径可支持;保留必要的上游或独立实现工作,不用“平台不同”豁免缺口。#3/#4 优先建立原版 Windows 本地终端基线;#54 现在冻结重复方法与完成端点并定位吞吐成本,数值预算作为提案交用户确认,不等到 #34 才补性能。
3. **按原版合同补自主 C++ 能力。** #29 核对极窄/极短、软硬行、历史/淘汰、选择/Find、连续 resize 和 child ack;#30 核对 IME 组合/提交/取消与输出/resize/切换、应用键盘/粘贴接收、实际复制及同次八会话。已验收的 #39 提供的是参考实现与固定场景;自主 C++ 是否具备同等字素能力必须独立实现和验证。
4. **补终端模式和应用矩阵。** #27 明确 DECOM/DECAWM、pending-wrap、保存恢复、异常序列与 margin×resize;#28 先固定应用版本/入口/动作及协议字节预期,再逐应用完成进入、操作、resize、退出、主屏恢复。Vim 的一个修复不替代完整 TUI 验收。
Expand Down
80 changes: 80 additions & 0 deletions experiments/shell/results/2026-10-28-qt-tabs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# Qt 独立 cmd 标签最小切片(#124)

状态:**固定 80×24 双 cmd 标签切片及应用退出前回收检查通过;完整 R2 未验收**。本记录绑定源码 `cf8b40b2e44f9e475cfc42b5008d46c670ff1756`,后续整理证据的文档提交不改变该运行身份。

按 [ADR-0008](../../../../docs/adr/0008-cpp-core-qt-widgets.md)使用自主 C++ 核心和 Qt Widgets,后端为[随包固定微软 ConPTY](../../../../third_party/conpty/README.md)。标签外观、最后会话结束和应用退出策略沿当前有限原型入口的工程合同;**尚未完成 WindTerm 2.7.0 完整标签交互对照**,不据此宣布原版行为一致或新策略已获用户确认。

## 固定配置与完整运行

Windows 11 Pro 10.0.26200、x64 Release;Qt **6.10.3 / win64_msvc2022_64**,应用动态链接 Core/Gui/Widgets,测试另用 Test;MSVC **19.42.34433.0**、Windows SDK **10.0.26100.0**、Python **3.12.10**;固定微软 ConPTY **1.25.260930003**。候选适配器关闭。Qt 检查使用 **offscreen** 平台及独立取得的 OFL Roboto Mono,`presented_done=null`。

| 同一最终源码的检查 | 结果 | 解释 |
|---|---|---|
| 完整构建 | 退出 **0** | 根代理直接执行,并在冻结前以显式退出码守卫核对;没有独立 build-exit JSON,不补造附件 |
| 完整 CTest | **50/50,退出 0,325.94 秒** | 1 项 Qt 产品入口与其他 49 项既有/独立 core、system、离线诊断分列;不能合成 Qt 的全部能力验收 |
| 其中 `qt_cpp_shell` | **1/1,1.53 秒** | 外层未超时、native exit=0;自有 Job active=0、total=26、terminated=0 |
| 冻结后核对 | **7151 项全部匹配** | 源码 2694、Qt 产品运行时 25、smoke 运行时 27、旧诊断运行时 47、Qt SDK 4358;`changed=[]` |

完整运行由根代理在自己的监督进程中执行至终态。`final-reviewed-build.log`、`final-reviewed-ctest.log`、`LastTest.log`、`final-reviewed-exit.json`、`frozen-inputs.json` 和 `frozen-after.json` 的实际字节数与 SHA-256 见 [validation.json](validation.json)。它同时保留 20 项精选源码/部署身份和完整本地 manifest 的哈希,**不是完整部署清单副本**。SDK 的 4358 文件树摘要为 `a35ab6fe76b62e4d9bd6d3c6b0d476c63583070cea5c9118ef5bb02042ffe266`,与原始官方归档、aqt 修补 SDK 的身份分别对待。

完整构建仍有未部署翻译的警告。当前只是本地构建输出;未包含编译器运行库部署,完整许可及对应源码审计、干净机器验证和可分发包均未验收。依赖来源及准备方法见 [Qt 依赖说明](../../../../third_party/qt/README.md)。

## Qt 实际执行的行为

保留原单会话检查:向真实 cmd 输入 `set /a 731+19`,独立字面期望 **750**,结果三格有新增正文墨迹;自然退出 **37**、启动失败可见错误和人工关闭回收均执行。

多标签检查实际点击 `+`、标签及关闭按钮,核对当前输入焦点。两个真实 cmd 分别执行 `731+19` 和 `401+26`,独立期望 **750 / 427**,命令与结果不串入另一个会话;父窗口图像中对应正文格有新增墨迹。关闭一个标签后,存活页继续得到 **778**,自然退出 **41** 后完成容器。另一个场景中,启动失败标签显示错误且不妨碍存活页得到 **147**;父窗口关闭回收全部会话,单独失败启动页在用户关闭前保留可见错误。

应用退出另使用 smoke 内真实 `QApplication::exec()`,沿产品相同的 `SessionTabs`、`quitOnLastWindowClosed(false)` 及 `on_all_exited → app.exit` 策略覆盖四条边界:

1. 关闭含两个活动 cmd 的父窗口。
2. 关闭最后一个活动标签。
3. 关闭单独的启动失败页。
4. 关闭已自然结束的标签。

在统一完成回调、`aboutToQuit` 和 `exec` 返回三个检查点,核对所有会话模型已结束、回收可验证且各自 Job active=0。已移除页若已被延迟删除,采用其仍存活时取得的回收记录;不使用 `exec` 返回后的模型析构或仅外层 Job=0 来替代退出前证明。这是与产品相同入口合同的应用窗口测试,**不是另行黑盒操纵产品 EXE 的完整交互验收**。

人工关闭成功返回 0;源码对“模型已结束但回收不可验证”返回 1,不等待一个不会再变化的标志。失败状态分支由源码及最终审查核对,未声称另做应用级回收失败注入。成功启动的最后会话自然结束沿原型入口的退出路径和状态;启动失败页由用户关闭。外层期限仍为 **25 秒**,CTest 期限仍为 **35 秒**。

## 分次红绿与身份缺口

| 片段 | 实际运行红 | 随后局部绿 | 身份边界 |
|---|---|---|---|
| 新增/选择双 cmd | 5.64 秒:新增动作未创建独立标签 | 0.78 秒 | 保留红源码快照;缺当时 EXE 身份及独立 at-run 绑定记录 |
| 关闭单个标签 | 0.73 秒:缺少标签关闭动作 | 0.83 秒 | 红的部分源码及 smoke EXE 哈希有保存 |
| 关闭父窗口 | 6.10 秒:继续泵事件仍未回收全部会话 | 1.00 秒 | 红的部分源码及 smoke EXE 哈希有保存;该绿不能证明真实应用退出前已回收 |
| 最后会话结束 | 5.78 秒:容器未完成 | 1.08 秒 | 红的部分源码及 smoke EXE 哈希有保存 |
| AppExec Spec P2 | 1.33 秒:事件循环先于回收检查退出 | 1.34 秒首次绿;1.45 秒四边界绿;提交后 1.51 秒局部绿 | 红及首次绿有部分源码/EXE 身份;提交后局部绿绑定 `76070a6`;最终完整运行另绑定 `cf8b40b` |

前四条局部 green 没有独立保存的源码/EXE 身份;历史中间工作树的精确提交身份也不从后来的提交倒推。JSON 对这些缺口明确保留 `null`/unknown,已保存的源码快照、身份记录、运行及构建日志分别列出实际哈希。以上秒数均为测试耗时,不是终端性能指标。

另保留两类**编译失败**:`interface-red` 的 C1083 缺少头文件,及 `all-exited-green-build` 的 C2662 const getter 错误;后者补 const 重载后才完成后续构建和运行绿。它们不能计作已复现的运行红,也没有“失败编译生成的新 EXE”。

AppExec P2 的原缺口是 smoke 关闭窗口后继续泵事件,而 main 默认随最后窗口关闭退出;原通过不足以证明主入口退出前的 timer 排空。新红实际复现了退出时序合同失败,**未据此认定泄漏或死锁**。红的外层最终 active=0 不会把失败检查改判为通过。

## 内部跳过与中断旧轮

完整 50 项运行中另有 **12 条内部 skip**,逐条测试标识和原始原因见 JSON:

- 4 个可选参考整类:`CandidateComparisonTests`、`CapabilityMatrixTests`、`FuzzMatrixTests`、`RealApplicationMatrixTests`。
- 7 个实际系统剪贴板场景:actions 1、shell 3、selection_bytes 2、selection_context 1。
- 1 个未启用的原版失败注入:`test_suspended_target_is_reclaimed_if_job_assignment_fails`。

跳过不计为对应能力通过;整类跳过也不等于执行了一个测试。Qt 单项的上述断言均实际执行。原版研究/旧 Win32、system 或参考配置的独立成功不转记给 Qt 产品入口。

较早源码 `aa068c99b2198a76f230e101ea25c95f5d3fc6a5` 的整轮预期 49 项,**仅 29 项完成,停在第 30 项 `workflow_fixture` 开始,退出码未知**。监督会话无法恢复,未观察到完成页脚;当轮 7143 个冻结文件虽全部匹配,也不能将中断轮写为通过。其封存原件及摘要哈希单列保留,不与新的 50 项运行拼接。

最终 Standards/Spec 两轴运行时代码审查的未解决项均为 0,依据根代理的最终汇总;没有独立审查报告附件,因此不伪造报告哈希。

## 复现及公开边界

配置模板与完整参数见 JSON 和 [入口说明](../../../../src/qt/README.md)。本次完整构建及测试主体命令为:

```powershell
cmake --build build/qt-tabs --config Release --parallel 2
ctest --test-dir build/qt-tabs -C Release --verbose
```

根代理仅在本次 PowerShell 进程中为既有诊断加入 Git 工具目录,并设置 `PYTHONUTF8=1`、`TERMFORGE_REQUIRE_SYSTEM_CLIPBOARD=0`。Qt offscreen 由该 CTest 项的环境设置生效;没有改全局环境、剪贴板或 DPI。本证据整理只读取既存原件,未重跑构建或测试。

双会话结果不继承八会话、分屏、持久化、动态 resize、完整键盘/IME、DPI、实际上屏、物理输入或性能验收,也不证明 Linux/macOS、日常使用版本或可分发包。公开内容仅含合成断言、脱敏汇总及精选哈希;原始日志、图片、私人路径、进程标识、完整部署/SDK 清单和 WindTerm 私有材料均不随记录发布。
Loading