Skip to content

[R2-07][文字] 裁决并实现流式复杂字素聚类与宽度 #39

Closed

Description

@JavaZeroo

当前正式路线(2026-10-28)

用户已确认自主 C++ 终端核心+当前 Qt Widgets GUI+随包固定微软 ConPTY,依据见 ADR-0008。第一批整合由 #115 / PR #116承接。

本项限定完成的流式字素实现与证据属于 Alacritty 候选,保持关闭及原来源。正式核心改为自主 C++,其相应字素能力须由 #30 等责任项独立实现和验证,不将本项关闭解释成新核心通过。

以下原合同与固定检查点保留各自来源;路线确认不替代实现、完整R2或性能验收。

当前方向与确认边界(2026-10-26)

固定首批字素实现、依赖来源和回归结果保留。Alacritty 是候选;下文沿用 #26 当时路线的描述仅为历史实现背景。规范正确性不代表 WindTerm 运行时一致;原版行为优先,#30 接续取证与重要差异确认,#54 接续性能提案。

依据:已确认方向与决策权限。下文保留当时的限定范围与证据,原关闭状态不变;历史决定不作为当前用户确认。

用户结果

在固定的复杂 emoji/字素场景中,原始标量、字素聚类、单元格宽度、光标、选择和实际 glyph 符合明确合同,并在分块输入、resize 与退出恢复中保持一致。

已观察事实(不是验收结论)

  • 当前候选在真实 ConPTY 场景中将 👩‍💻 投影为 👩‍ 与 💻 两个宽单元格;1️⃣ 保留在一个单元格,宽度为 1。完整聚类与宽度合同尚未成立,不能把原文保留或 glyph 无缺字当作完成。
  • 固定源和 transport 保留原始标量。本机 Windows 11 26200 的原生子控制台将非 BMP 标量映射为 leading/trailing 两个 U+FFFD;不启动 TermForge 窗口的原始 ConPTY 探针得到相同源文件、控制台文本和 CHAR_INFO 哈希。这是限定平台的原生投影,不是候选或 WindTerm 等价证据。
  • 当前固定候选只有 unicode-width 0.2.2,没有 unicode-segmentation。现有 Term::input 按 scalar 处理宽度,zerowidth 追加不能替代流式字素分段。不得通过简单拼接 Cell 文本、隐藏失败或静默新增依赖来制造通过。
  • 固定 WindTerm 2.7.0 的只读 Ghidra 结果显示 0x1405fab20 在 Mark/肤色路径测量整个 QString,其他路径逐 scalar 累加;0x1405faef0 也有整段测量入口。现有导出没有证明调用方聚类、advance 到 cell 的转换或实际 ZWJ/keycap 宽度,target_executed=false。

待决定与实现

  • 用规范、独立参考与必要的定向二进制证据冻结首批 ZWJ/keycap 聚类、宽度、光标和选择合同;静态事实不冒充运行时行为。
  • 选择可维护的流式分段方案,审核依赖版本/许可/锁文件和性能。覆盖 UTF-8/CSI 分块、样式变化、查询回复、换行、历史、resize 与取消边界,遵守 [R2-03][核心] 测量候选成本并重审 ADR-0003 #26 已选候选路线,不扩展默认自研核心。
  • 保留原始标量,验证真实 ConPTY、独立模型、候选单元格、实际 glyph/fallback 和选择复制;保留本机原生替换投影与 TermForge 文本的区别。

验收

  • 首批合同有独立依据,未知 WindTerm 行为明确保留。
  • 固定 ZWJ/keycap 的 whole/分块/resize/选择/glyph 真实回归通过,非法宽度、缺字、丢标量和错误完成边界被拒绝。
  • R1 回归、FEATURES/EVIDENCE 与父 issue 同步;本次仅首批流式字素合同结项,不将父项或 R2 一起结项。

父项:#30。真实前置:#26 已完成;本项阻塞 #30 的完整字素验收,#35/R2 不得因此关闭。

实现候选与待核对出口

PR #49 已提供有界流式分段、完整原文/宽度/复制、真实DWrite emoji和单列resize修复;独立Standards/Spec复核通过,三条发现的边界反例已修。来源、依赖/许可、raw与Gitblob身份及实际正反见PR中的合同与proof。原始whole/逐字节4条失败均保留,新实现4条通过。

第一次候选CI因新增顶层grapheme_overflows:0改变完整状态哈希而失败,屏幕/历史/光标/样式逐字段相等。d8ac67c为固定1000行构造独立完整状态并验证旧/新digest迁移,不排除字段、不放松wrong-digest拒绝;原红保留。最终本地候选47/47 CTest通过(7个既有内部skip明确保留);最终默认Windows/Ubuntu完整CI和候选CI均通过。PR #49已合并。

性能成本与正式预算单独由 #54 阻塞 #34;本项的正确性不能豁免。#30及完整R2继续OPEN,WindTerm字素运行时行为仍未知。

本项按首批ZWJ/keycap、分块/样式/查询、宽度、历史/resize、原文复制与实际glyph合同结项。完整IME同次组合、真实系统输入/不同DPI与开发包出口继续由 #30/#31/#35承担;本项不豁免 #54 的性能成本,不声明完整 Unicode 或 WindTerm 等价。

Activity

  1. JavaZeroo commented on Oct 25, 2026

    @JavaZeroo
    OwnerAuthor

    当前证据明确保留了本项缺口,未将其关闭:

    • 候选真实场景仍观察到 👩‍ 与 💻 两个 Cell,keycap 为一格;这些不是已裁决的目标宽度或聚类合同。
    • 已通过的限定测试只要求原始标量保留、单元格连续、真实 glyph-run 无缺字和布局宽度适配,未把上述观察写成完整 ZWJ/keycap 通过。
    • 固定 WindTerm 的静态导出仍不能证明调用方聚类、advance 到 cell 的转换或运行时宽度。当前候选依赖中没有 unicode-segmentation,不能以简单拼接代替流式分段,也未静默新增依赖。

    证据已推送至 c73871e:experiments/shell/results/2026-10-26-unicode-renderer/validation.json。#39 与 #30 均保持 OPEN,完整流式字素、宽度、光标和选择验收仍需完成。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions