Skip to content
Closed
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
55 changes: 55 additions & 0 deletions .github/workflows/r54-cost.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Frozen R54 hosted cost batches

on:
push:
branches: ['perf/grapheme-hosted-r54']
paths:
- '.github/workflows/r54-cost.yml'
- 'experiments/measure/*.py'
- 'experiments/candidates/alacritty/Cargo.toml'
- 'experiments/candidates/alacritty/src/measure.rs'

permissions:
contents: read

concurrency:
group: r54-cost-${{ github.ref }}
cancel-in-progress: false

jobs:
fixed-cost:
# A code/evidence correction must not silently launch replacement samples.
if: github.event.created == true
runs-on: windows-2025
timeout-minutes: 30
env:
PYTHONUTF8: '1'
CARGO_HOME: ${{ github.workspace }}/local/r54-cargo-home
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false
- uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with:
python-version: '3.12'
- name: Install fixed host observer
run: python -m pip install -r benchmarks/requirements.txt
- name: Select fixed compiler
run: rustup default 1.92.0
- name: Verify runner and publication contracts before measurement
run: python -m unittest experiments.measure.test_r54_contract.CostPlanTests experiments.measure.test_r54_batch experiments.measure.test_r54_hosted -v
- name: Build audited pair and execute the two frozen batches
id: measure
run: python -m experiments.measure.r54_hosted --out local/r54-raw
- name: Prepare the reviewed synthetic artifact whitelist
if: always() && steps.measure.outcome != 'skipped'
run: python -m experiments.measure.r54_publish --raw local/r54-raw --out local/r54-public
- name: Preserve complete or failed synthetic evidence
if: always() && steps.measure.outcome != 'skipped'
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: r54-cost-${{ github.run_id }}-${{ github.run_attempt }}
retention-days: 30
if-no-files-found: error
path: local/r54-public/
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ if(BUILD_TESTING)
endif()
termforge_add_python_test(core -m unittest experiments.core.test_core experiments.core.test_unicode -v)
termforge_add_python_test(recovery -m unittest experiments.core.test_recovery -v)
termforge_add_python_test(measure -m unittest experiments.measure.test_measure experiments.measure.test_r54_contract.CostPlanTests experiments.measure.test_r54_batch -v)
termforge_add_python_test(measure -m unittest experiments.measure.test_measure experiments.measure.test_r54_contract.CostPlanTests experiments.measure.test_r54_batch experiments.measure.test_r54_hosted -v)
termforge_add_python_test(binary_paths -m unittest experiments.test_build_paths -v)
termforge_add_python_test(conpty_margin_contract -m unittest experiments.conpty.test_margin_contract -v)
termforge_add_python_test(benchmark_tools -m unittest discover -s benchmarks/tests -v)
Expand Down
1 change: 1 addition & 0 deletions docs/EVIDENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,5 +163,6 @@ python -m unittest experiments.shell.test_workflow_sessions -v
|---|---|---|
| 候选 `.3`→`.4` 字素改动 | [固定字素验证](../experiments/shell/results/2026-10-26-streaming-graphemes/validation.json)、[性能限制与原始样本身份](research/streaming-graphemes.md)、[#54](https://github.com/JavaZeroo/termforge/issues/54) | 同宿主交错诊断中 project/interactive 吞吐中位数约下降 16%/9%;共享宿主、allocator 包装、无真实呈现/输入时延,使其不能作为正式预算或性能通过。#54 受控定位仍阻塞 #34 的性能裁决。 |
| 固定字素成本的批次协议与执行 | [R54 v1 合同和构建/环境记录](../experiments/measure/R54-COST.md)、[执行器](../experiments/measure/r54_batch.py)、[合成进程回归](../experiments/measure/test_r54_batch.py)、[实际预检及限定验证](../experiments/measure/results/2026-10-27-r54-runner/validation.json) | 固定两个种子、各 112 个位置,字节原样保留、首错停止、完整批次后逐组配对统计。共享工作站十区间活动预检未通过,未启动成本样本;测量相关 26 项测试通过,首次 Linux 候选 CI 的采样依赖导入错误及修正分别留证。5% 是环境诊断护栏,并非产品性能容差;实际批次、扰动归因及用户预算确认由 #54 接续。 |
| 首次 hosted 字素成本批次 | [来源、停止位置与归档](../experiments/measure/results/2026-10-27-r54-hosted/README.md)、[机器可读记录](../experiments/measure/results/2026-10-27-r54-hosted/validation.json) | 两份固定构建与4次sanity通过,空闲预检通过;第24位置的未归属CPU活动估计5.410%触发原5%护栏,保留23个有效记录和1个失败记录,第二批未启动。全部24次输出正确,但批次不完整,不生成配对成本摘要;临时VM逐进程归因、完整受控批次和预算仍未完成。 |

目前没有足够证据判断 TermForge 距离 WindTerm 快或慢多少。正式结论必须同时提供负载/配置/环境身份、正确性、完成端点、观测开销、重复样本与限制。未知字段保持未知;历史校准未完成不转成要求用户反复手动运行的前置。执行规则见 [ADR-0002](adr/0002-automation-first-investigation.md),核心选型重审见 [ADR-0003](adr/0003-core-reference-and-reuse.md)。
2 changes: 1 addition & 1 deletion docs/FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@
| 自动正确性与构建 | **限定验收**: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) 跟踪。[冻结批次执行器](../experiments/measure/R54-COST.md#冻结批次执行器windows)核对构建来源、原始输出、停止规则与逐轮配对统计;其环境护栏和合成进程测试不构成正式成本样本 | 共享宿主、allocator 包装与缺少真实呈现/输入时延端点使该诊断不构成正式预算。仍需同负载/同正确性、无插桩对照、观测开销和长期/多会话公平性;可靠原版基线后提出逐项预算及允许波动范围,**由用户明确确认**。与 WindTerm 的实际差距**待取证** | 当前优先;贯穿 R1–R5 |
| 吞吐、响应、内存与稳定性 | **实现中,未验收**:已有机制实验、连续 CPU 区间校准与合成回归;候选字素改动的受限诊断中 project/interactive 吞吐中位数约下降 16%/9%,由 [#54](https://github.com/JavaZeroo/termforge/issues/54) 跟踪。[冻结批次执行器](../experiments/measure/R54-COST.md#冻结批次执行器windows)核对构建来源、原始输出、停止规则与逐轮配对统计;[独立 hosted 构建与实测](../experiments/measure/results/2026-10-27-r54-hosted/README.md)已验证来源和失败保留,但首批因环境护栏停止,尚无完整成本批次 | 旧诊断的共享宿主、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/R54-COST.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,3 +93,5 @@ Windows 1–64 逻辑 CPU 上使用 [GetSystemTimes](https://learn.microsoft.com
全部 112 个位置完整有效后才生成统计;缺失、重复、乱序或失败不能得到成功摘要。摘要逐批、逐 route/chunk 列出七个配对 CPU ns/B 比值,以及各源 CPU/墙钟 ns/B 全部值、中位数、范围和 MAD。合成进程测试覆盖整个顺序、原始字节和停止规则,其虚构时长只验证统计与进程协议,绝不作为性能样本。

实际受控重复样本、allocator/projection 扰动归因、预算提案和优化验收仍由 #54 接续;构建、短 sanity、执行器测试或环境预检均不关闭该 issue。

独立 Windows 虚拟机上的来源构建、顺序执行、白名单产物和宿主限制见 [R54 hosted 流程](R54-HOSTED.md)。该入口复用本合同,不把CI可运行或环境预检通过解释为产品性能验收。
40 changes: 40 additions & 0 deletions experiments/measure/R54-HOSTED.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# R54:独立 Windows 虚拟机上的固定批次

本流程接续 [#54](https://github.com/JavaZeroo/termforge/issues/54) 和 [v1 合同](R54-COST.md),不改变源码、负载、两批各112个位置、计时端点、统计或预算。主工作站已有一次活动预检拒绝;不在同一宿主循环等绿,改在一个新的 GitHub-hosted `windows-2025` 虚拟机上建立完整来源和环境记录。它是本次 headless 核心成本研究的环境,不代替 Windows 11 x64 产品或 WindTerm 性能验收。

## 运行与停止

[工作流](../../.github/workflows/r54-cost.yml)只在实验分支 `perf/grapheme-hosted-r54` 的创建 push 事件执行成本作业,不在 PR 事件或后续源码/证据修正时自动补跑,也不改变 main 的默认构建。每次工作流用独立 run ID、attempt、源码和输出目录;拒绝对旧 workflow run 的 attempt 2 及后续重跑。首次运行后,新的调查需先明确假设、范围和新身份,再审查执行入口,不能由导出器修正偷偷触发替代样本。

同一虚拟机依次完成固定 Python/Rust、纯合同测试、两份来源构建、四次短正确性检查,再运行原两个种子。构建和测试结束后才开始成本预检与计时。没有自动恢复、补样、重试或放宽5%环境诊断护栏的入口;第一批失败即保留当前位置,第二批不启动。两批成功也只写 `complete_diagnostic`,`performance_gate=not_evaluated`。

同一任务的新 `CARGO_HOME` 用于获取锁定依赖;两个编译目标目录独立。脚本拒绝未知编译环境覆盖与 Cargo 配置文件,只覆盖原 `.3/.4` 的 Cargo.toml/src/measure.rs。每份仍使用 Rust1.92.0、MSVC x64、Release、locked/offline、no-default-features和jobs=1。完整源码前后哈希、真实命令/日志、实际linker及EXE、编译模式和四次原状态摘要由 [builder](r54_build.py) 留证;由原 [输入校验器](r54_inputs.py)重新读取验证之后才进入测量。

构建/准备调用各有期限,构建为600秒、短正确性调用为10秒;这些不是产品性能门槛。构建超时终止直接子进程并阻止全部测量,不据此声称已回收其派生进程;虚拟机生命周期由CI提供者管理。实际成本仍使用原内部60秒/子进程90秒期限,整个job30分钟。正常构建返回后才允许成本入口,不能将超时残留视作空闲。

## 宿主限制

保留 GitHub事件、run ID/attempt、实际提交、runner类型、系统映像、OS build/UBR、CPU与电源策略。固定两个种子的同口径结果分别报告,不混入主工作站原构建或历史12样本。`hosted_identity` 只检查该流程需要的元数据;分析时还须从GitHub作业记录核对实际runner与源码身份,环境变量本身不是物理隔离证明。

GitHub runner服务、操作系统后台任务、虚拟机邻居、物理CPU频率和调度仍可能影响结果。原5%筛选只描述guest可观察CPU活动;它不是用户确认的数值性能容差,也不证明物理宿主独占。出现噪声、失败或两批不一致时保留全部观察,再提出下一项可检验的调查。

## 发布边界

[发布器](r54_publish.py)只接受本流程的真实GitHub-hosted首次作业,并使用固定文件白名单。它不递归上传工作目录、checkout、编译缓存或个人文件。仅保存本次公开源码/合成输入产生的结果;完整进程名称/PID记录与未知环境字段不导出,工作区、runner profile和临时路径前缀改为别名。没有读取完整进程命令行或任意环境变量的步骤。

Windows 长路径及实际8.3别名均纳入替换,兼容大小写、正斜杠和编译器转义形式;通过[GetShortPathNameW](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getshortpathnamew)查询,失败则不发布,不能猜测短名。首次作业导出曾漏掉两份构建日志中的短profile前缀;原包保留,审阅后的公开副本另列哈希及转换,不回填为旧运行使用了修正版导出器。

两个核心的成本及短正确性 stdout/stderr 按原字节保留,包括失败或无效编码;其生产者只接收公开固定合成负载。完整构建日志保留内容并替换宿主路径前缀。JSON/JSONL记录只做上述元数据筛选和路径处理,不改变时间、工作量、状态摘要、顺序或失败状态。中断留下的JSONL半行不修补、不删除,保留全部行和解析失败位置,独立样本原始流仍导出。`publication.json`列出每份原文件和发布文件的SHA、大小及处理方式。导出前核对原始 `hosted.json` 的run ID/attempt/SHA;空目录或另一次作业不生成成功包。发布目录在所有文件完成后才生效,上传仅指向该目录;未通过检查的半成品目录不会上传。

原始完整进程身份只在临时虚拟机内保留,公开结果保留全机CPU原计数、全部成本原始流及其来源。不能用未导出的逐进程字段做外部归因声明;后续若需要这种归因,另行预声明可公开的受控观测。所有CI结果须下载复核其清单、原始样本和统计后才能写入 #54 的成本结论。

## 手动入口(只供同一受控作业)

```powershell
python -m experiments.measure.r54_hosted --out local/r54-raw
python -m experiments.measure.r54_publish --raw local/r54-raw --out local/r54-public
```

本机不得伪造GitHub环境变量运行该流程。普通本地准备可使用 `r54_build --out <新目录>`,要求实际Windows、已提交的干净源码及显式任务缓存;本轮不重复已有主工作站成本预检。测试只验证既有构建输入/产物边界,正式成本样本来自上述实际作业。

首次真实作业的来源、全部原始产物、环境护栏停止位置和独立复核见[固定记录](results/2026-10-27-r54-hosted/README.md)。这是不完整批次,没有配对成本摘要或性能通过结论。
Loading