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
13 changes: 13 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,18 @@ termforge_warnings(text_action_policy_test)
add_executable(core_measure experiments/measure/measure.cpp)
target_link_libraries(core_measure PRIVATE termforge_core)
termforge_warnings(core_measure)
foreach(target core_recovery_measure core_recovery_measure_noalloc)
add_executable(${target} experiments/measure/measure.cpp)
target_link_libraries(${target} PRIVATE termforge_core)
target_compile_definitions(${target} PRIVATE TERMFORGE_RECOVERY_MEASURE=1)
termforge_warnings(${target})
if(WIN32)
target_compile_definitions(${target} PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN)
target_link_libraries(${target} PRIVATE Psapi)
endif()
endforeach()
target_compile_definitions(core_recovery_measure PRIVATE TERMFORGE_MEASURE_ALLOCATOR_WRAPPER=1)
target_compile_definitions(core_recovery_measure_noalloc PRIVATE TERMFORGE_MEASURE_ALLOCATOR_WRAPPER=0)
if(WIN32)
target_compile_definitions(core_measure PRIVATE NOMINMAX WIN32_LEAN_AND_MEAN)
target_link_libraries(core_measure PRIVATE Psapi)
Expand Down Expand Up @@ -312,6 +324,7 @@ if(BUILD_TESTING)
termforge_add_python_test(windterm_raster_style_reference -m unittest research.ui.test_raster_style_reference -v)
# Pure offline regressions only; OwnedNodeTests and frozen batches are never launched here.
termforge_add_python_test(node_contract_export -m unittest research.ui.test_export_node_contract_deadline research.ui.test_node_contract_deadline.CheckpointTests research.ui.test_node_contract_deadline.LauncherVerdictTests -v)
termforge_add_python_test(recovery_measure_protocol -m unittest experiments.measure.test_recovery_measure -v)
if(WIN32)
termforge_add_python_test(node_contract_plan -m unittest research.ui.test_node_contract_deadline.PlanTests -v)
endif()
Expand Down
1 change: 1 addition & 0 deletions docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ python -m unittest experiments.shell.test_workflow_sessions -v
| 官方 WindTerm 生产端烟测 | [摘要](../benchmarks/results/2026-10-21-windterm-smoke/summary.json)、[基准规范](../benchmarks/PROTOCOL.md) | 7,732 字节写出、人工见到结束标记;没有全内容正确性、消费/呈现时间和正式重复批次,不是 C0 性能基线 |
| 接收批量与通知合并 | [实验协议](../experiments/receive/README.md)、[120 次实验报告](research/receive-experiment-2026-10-22.md) | 原创固定输入、字节顺序、队列边界与背压;机制实验不等于 WindTerm 路径或端到端收益 |
| 连续 CPU 区间与校准 | [计量协议和命令](../experiments/measure/README.md)、[批次 A](../experiments/measure/results/2026-10-23-v2-a/manifest.json)、[批次 B](../experiments/measure/results/2026-10-23-v2-b/manifest.json) | 48 个核心样本/4 次校准;尚缺解码/状态/历史独立归因、Unicode/大历史、无插桩对照和更严格环境控制 |
| 自主 C++ recovery 核心双构建准备 | [固定协议](../experiments/measure/RECOVERY-PREPARE.md)、[实际结果](../experiments/measure/results/2026-10-29-recovery-core-prepare/README.md)、[脱敏身份](../experiments/measure/results/2026-10-29-recovery-core-prepare/validation.json) | 同源 recovery 包装/无本工具包装的实际对象和命令核验;一次38进程含24短正确性/2identity/12拒绝,相关14项回归,25源/历史与18构建产物前后核对。旧strict/v2/calibration分列,不是Qt/ConPTY热路径、正式性能批次或数值预算 |
| 输入到状态/提交 | [shell 端点定义](../experiments/shell/README.md)、[呈现端点定义](../experiments/presentation/README.md) | 现有脚本中断/后续命令时段与绘制提交有明确名称;不能当单键延迟或真实呈现,带完整画面检查的样本不是低扰动性能样本 |

| 范围 | 结果与复现入口 | 可以支持的结论与限制 |
Expand Down
2 changes: 1 addition & 1 deletion docs/FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ Qt 构建显式准备并部署[固定微软 CRT 14.51.36247.0](../third_party/ms
| 自动正确性与构建 | **限定验收**:Windows shell/ConPTY/呈现及 Windows/Linux 核心 CI、差分/恢复/队列/生命周期场景 | 产品打包、干净机器使用、依赖升级、长期回归和更广平台矩阵;#40 的 CI 纯夹具超时、窄窗口选择 #73、四 shell 原事件 #80、hosted 准备 #81 和[复制夹具 OpenClipboard 5 #85](https://github.com/JavaZeroo/termforge/issues/85) 等独立失败仍未闭合;#72 保存判据与 #80 同步条件的限定修正不代替其他配置或未知根因验收 | R2 / R4 |
| Windows 产品交付 | **实现中,未验收**:首个 [v0.1.0-alpha.1 预发布](releases/v0.1.0-alpha.1.md)提供 Windows x64、静态 MSVC 运行库、附资源许可和构建身份的免安装 ZIP;未签名,已验环境限 Windows 11 本机与 Server 2025 CI,布局仍写入 LOCALAPPDATA | 这是 R1 体验包,尚非 R2 日常开发版;干净机器与更广平台矩阵、签名/安装、配置升级及持续运行仍待完成。Windows 10 未验收,Server 2022 已知资源门槛未过 | R2 / R3 |
| Linux/macOS 与其他架构 | **未实现**客户端;Linux 核心 CI 已有。[官方平台范围台账](../research/windterm-2.7.0-platform-scope.md)已固定 2.7.0 的 Windows x86/x64、macOS x64、Linux x64 资产及声明下限;这不是 TermForge 支持或实测结论 | 最终需真实 Linux/macOS 客户端;平台调查可提前进行,整合及完整验收排在 Windows 11 x64 完整版本之后。其他系统版本、最低版本和架构由用户后续明确;旧系统及 ARM 等保持调查记录,不自动承诺或排除,也不能由核心 CI 推断产品支持 | 持续调查;R5 全平台出口 |
| 吞吐、响应、内存与稳定性 | **实现中,未验收**:已有机制实验、连续 CPU 区间校准与合成回归;候选字素改动的受限诊断中 project/interactive 吞吐中位数约下降 16%/9%,由 [#54](https://github.com/JavaZeroo/termforge/issues/54) 跟踪 | 共享宿主、allocator 包装与缺少真实呈现/输入时延端点使该诊断不构成正式预算。仍需同负载/同正确性、无插桩对照、观测开销和长期/多会话公平性;可靠原版基线后提出逐项预算及允许波动范围,**由用户明确确认**。与 WindTerm 的实际差距**待取证** | 当前优先;贯穿 R1–R5 |
| 吞吐、响应、内存与稳定性 | **实现中,未验收**:已有机制实验、连续 CPU 区间校准与合成回归;自主C++ [recovery双构建准备](../experiments/measure/results/2026-10-29-recovery-core-prepare/README.md)已核对包装有无、构建/对象身份及24短正确性样本,旧strict结果分列。候选字素改动的历史受限诊断中 project/interactive 吞吐中位数约下降 16%/9%,由 [#54](https://github.com/JavaZeroo/termforge/issues/54) 跟踪 | 共享宿主、历史allocator包装与缺少真实呈现/输入时延端点使旧诊断不构成正式预算;新双构建仅为准备,未形成正式成本样本。仍需同负载/同正确性、受控对照、观测开销和长期/多会话公平性;可靠原版基线后提出逐项预算及允许波动范围,**由用户明确确认**。与 WindTerm 的实际差距**待取证** | 当前优先;贯穿 R1–R5 |
| 大历史与动态内存压缩 | **未实现**产品能力;WindTerm 压缩属于官方性能声明,内部机制尚未证实 | 1/10/100 万行等明确规模下的内存/滚动/搜索/淘汰实验;根据瓶颈决定独立存储/压缩实现 | R4 |
| 完整目标验收 | **待取证**:已有固定版本和局部观察,没有完整行为/性能对照矩阵 | 先在 Windows 11 x64 完整验收功能/行为/UI/性能及独立构建,再完成 Linux/macOS 全平台出口;重要差异和性能容差须有用户确认,Windows 通过不代表全平台完成;不依赖 WindTerm 二进制或专有资源 | R5 分平台出口 |

Expand Down
2 changes: 2 additions & 0 deletions experiments/measure/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# 核心连续区间计量与校准

当前正式 C++ 路线另有 [recovery 双构建协议与命令](RECOVERY-PREPARE.md)及[一次限定准备结果](results/2026-10-29-recovery-core-prepare/README.md):同源的包装/无本工具 allocator 包装、实际对象/构建身份与短正确性;不复用下面旧 strict 样本作为 recovery 数据,不扩展历史 Alacritty 成本路线,也不构成 Qt/ConPTY 或 WindTerm 性能验收。

`core_measure` 使用原创固定输入与独立状态检查。v2 修正了 v1 将很多短轮次 CPU 差值相加的计量问题;`compare.py` 另提供自研/候选 project 与 interactive 成本诊断。解码、屏幕更新、历史仍未完整独立归因,不能据此判断 WindTerm 性能差距。R2 流式字素成本的受控定位与预算由 [#54](https://github.com/JavaZeroo/termforge/issues/54)承接,完整产品性能和跨目标基线仍按 [R4 工作包 #9](https://github.com/JavaZeroo/termforge/issues/9)验收。

#54 的[测量前合同 v1](R54-COST.md)与 `r54_contract.py` 固定 `.3`/`.4` 源码、负载、相邻配对顺序、统计和预算决定程序;新增 Rust `--no-default-features` 测量构建可在编译期排除 allocator 包装。该准备仍缺实际两构建身份、受控重复测量和数值预算,不改变下述历史结果或性能边界。
Expand Down
59 changes: 59 additions & 0 deletions experiments/measure/RECOVERY-PREPARE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# 自主 C++ recovery 核心:双构建计量准备

本切片由 [#152](https://github.com/JavaZeroo/termforge/issues/152)承接,仅建立正确性和构建身份。正式路线见 ADR-0007/0008;性能容差尚未由用户确认。本工具不包含 Qt 事件调度、ConPTY、绘制或实际呈现,不称产品热路径基线或 WindTerm 性能等价。

## 构建与协议

三个可执行文件共享 `measure.cpp`。既有 `core_measure` 保留 strict、全局 allocator 包装、schema v2 及原 calibration;历史文件不修改。两个新增目标如下,源、编译/链接策略和核心参数相同;实际命令的目标路径/产物名自然不同,额外代码开关仅为 allocator 宏:

| 目标 | Parser / 初始屏幕 / history | 本工具自定义 new/delete |
|---|---|---|
| `core_recovery_measure` | recovery / 24×80 / 100 | 编译在内 |
| `core_recovery_measure_noalloc` | recovery / 24×80 / 100 | 不定义 |

这三个参数对应正式 Qt 的初始化,不代表包含 Qt 实际执行路径。新目标只接受 `project` / `interactive`;直接 state 路径未纳入新协议。`--identity` 先用非法 UTF-8 后接 ASCII 的独立小样例,实际核对 replacement、后继字符和 recovery 诊断;不是只返回一个模式标签。样例在计量区间外执行。

新协议为 `termforge-recovery-core-measure-v1`,明确记录 mode、网格、history、包装状态、route/chunk、负载及 observer 语义。旧 `calibrate` 在两个新目标均明确拒绝,不能用旧 runner 自动校准它们。

- observe=0:构造/前轮析构、feed、状态/历史维护与区间门槛;没有每轮投影。
- observe=1:还包括每轮完整投影与哈希检查。包装构建同时计数普通 new;无包装构建的分配指标始终 `null`,不能解释为零分配。
- 两种构建仍有计时、门槛、独立最终 oracle 和输出代码。关闭本工具 allocator 包装不证明整个 CRT 或产品没有插桩。

## 固定负载与区间

| route | 固定源字节 | SHA256 | 最终状态 FNV-1a64 |
|---|---|---|---|
| project | `(x×76 + CRLF)×1000`,78000B | `02ff60ca95c13ab3e41909685634ee6a800310dc39a07a98ac6965b0c57f2b14` | `5455070173120736870` |
| interactive | `(abcdefgh ESC[D ESC[D ESC[D Z BS Q CRLF)×1000`,22000B | `405d574c15d33d81e17745173dac95ed8c0082884e9692c71fbc67b5a588c148` | `8292075482910706113` |

复用已有独立逐格、宽度、样式、光标、历史数量/淘汰预期及完整状态摘要。预热和最后一轮检查不移入计量区间。区间仍是一次 CPU 结束减开始、每8轮墙钟门槛及至少约250ms的 CPU 查询间隔;不累加短轮次、不估算扣除观察开销。最后一次析构在区间外,实际计入 `rounds-1` 次析构。输入准备、recovery 身份小样例、oracle 和序列化在区间外。

原 v2 与新协议不得拼接样本或汇总。正确性与共享核心代码可复用,旧 strict/包装数据不转记为 recovery 数据;parse/state 两路径也不相减解释净 parser 成本。`receive_seconds` 和 `presented_done` 始终显式 `null`。

## 预声明的单次短 sanity

主代理释放构建/负载租约后,才运行此固定批次。此处记录执行前计划,不表示已经执行:

```powershell
# 使用明确的 Release 构建输出;三个目标的实际编译参数和对象另外留证。
cmake --build <build> --config Release --target core_measure core_recovery_measure core_recovery_measure_noalloc
python experiments/measure/recovery_sanity.py --wrapped <wrapped.exe> --noalloc <noalloc.exe> --out <new-local-directory>
```

`recovery_sanity.py` 没有重复、随机调度或性能汇总参数。固定为以下 **38 个核心进程**,每个最多一次:

1. 两个目标各一次 `--identity`,先全部通过才开始负载。
2. 每目标 project 的 chunk=1/4096/65536、interactive 的 chunk=1/16/22000,均各 observe=0/1、CPU floor=0.1s,共24次短正确性样本。
3. 每目标各拒绝一次 calibration、parse、state、chunk=0、observe=2、NaN duration,共12次反例。

floor=0.1s沿用既有短 sanity 参数,不是性能容差。核心内部连续区间上限仍60s,每个直接核心子进程外层期限90s;整批无独立硬时限,不将单进程期限称整程上限。不自动重试、补样、改负载或覆盖旧目录;首个身份/退出/字节/JSON/oracle/来源失败即停止。原始 stdout/stderr 先按字节保存,再解析和判定,保留失败及部分输出。此纯核心工具不产生子树,也不宣称原生 GUI/Job 验收。

旧 strict/v2/calibration 按现有 measurement 回归独立验证;其结果与新38进程批次分列。普通 CTest 仅新增纯协议测试,不自动执行新 sanity 或正式成本批次。

## 实际构建来源审计

构建前冻结 Git commit、CMake/三个核心头/测量源/校验器/执行器哈希,以及实际 generator、Release、架构、CRT、编译器/链接器路径、版本与可执行文件哈希。保留两份目标的完整真实编译/链接参数;仅本工具 wrapper 宏不同,不能依据目标名假定配置相同。

保留实际 `.obj` 与 EXE 的大小/SHA256。Windows 使用同一工具链的 `dumpbin /symbols <实际目标对象>`,核对全局普通/数组 `operator new` 的定义:包装对象应有本源定义,无包装对象不得有本源定义,外部 CRT 引用另列;不能只检查 `--identity` 的自报字段。对象路径从实际构建日志/项目文件取得,不猜路径。原始符号和绝对路径只留 local。

批次对源和两EXE逐次前后重算,完整批次后再核对全部冻结输入;对象/编译器身份由外层构建审计绑定,不由 runner 冒充已验证。公开前审查来源和隐私,仅发布合成负载与脱敏事实。正式空闲环境、重复测量、Qt调度/运输/绘制归因、原版对照和预算提案均另行准备。
Loading
Loading