Skip to content

[R2][调查] 补齐原版 1049 样式与活动缓冲区观察 #123

Closed
2 of 2 issues completed
Closed

Description

@JavaZeroo

当前已交付与未知(2026-10-29)

#129 / PR136已提供独立raw-capture-v1五阶段/五次受控栅格、17组完整H/space。首次进入与重复进入后的局部有序输出签名唯一匹配同帧SGR0,退出后匹配同帧SGR31;44;并列主要墨迹保持null,旧0grab/3grab停止记录不改。该工具切片限定关闭#129,不关闭本项;报告保留内部pen/完整样式、非颜色属性和全部grid未知。

#146 / PR149已以 ae985443af1d9e527b0c92e0e2a18c3b62e63866 合入main,并仅按单次有界调查关闭:同帧SGR0/SGR1/SGR22栅格控制签名无法区分,不能识别SGR1是否生效、bold样式或1049非颜色属性。原件、五阶段/17组及首次工具记录均保留,未由未知结论改核心;#123/#126/#27继续开放。

C++首先按已观测文字/光标/颜色子集由#135接线,不能用其工程默认值反向填补原版未知。完整#27、本地shell/实际呈现及R2仍独立验收。

原范围与历史记录

用户结果

为自主C++备用屏实现补齐#118未观测的当前样式/活动缓冲区合同,避免默认标准策略覆盖原版。

前置与范围

#118的单次26阶段已固定光标/文字投影,完整样式和grid仍未知。本项独立工具与固定Qt5导出/ABI准备已具备,不依赖#41/#56的本地shell运输。只研究原版末端,不实现core,不据QPainter调用声称实际呈现。

验收

  • 固定官方2.7.0、Qt DLL及ABI证据,自有station/Job/合成loopback会话;预声明一次45秒捕获/60秒CLI等待,生命周期期限分列,不操作用户桌面/剪贴板/DPI。
  • 调用原版isAltScreen/isMainScreen取得值;独立绑定合成标记、viewport绘制设备及QPainter颜色,核对1049进入、alt更改SGR后退出主屏、重复进入的样式。
  • 背景、完整清空范围或pending-wrap若不能实际观测则null/unknown,不换假设反复跑绿;观察、推断及C++工程提案分列。
  • 自有探针、离线显式校验及脱敏标量摘要审查通过;原始图像/日志、私有路径与原版资源不公开。

父项#27;未知重要差异仍需按原版优先规则调查,完整模式与R2出口不由本项关闭。

部分观察与剩余工作

PR127已发布11阶段活动buffer bool、边界标记投影和一个pending-wrap输入的独立观察。QPainter匹配数0,样式继承/恢复仍null,本项保持开放;旧NAWS记录仅接收块末态,盲区已如实保留,修订按完整NAWS逐条守卫并有loopback反例。

#126按新的独立五阶段计划,用已核实Qt5 grab/toImage/pixel ABI的受控栅格继续核对颜色;尚无新样式结论,不声称真实presented或性能。

Activity

  1. added
    ready-for-agent范围明确且真实阻塞已解除,可开始实施
    research有明确问题与出口的证据调查
    on Oct 28, 2026
  2. added a commit that references this issue on Oct 28, 2026
  3. JavaZeroo commented on Oct 28, 2026

    @JavaZeroo
    OwnerAuthor

    #146 的独立 SGR1 调查 / Draft PR149已发布待最终审查,尚未合入main。实际源a115bc8的一次执行取得5阶段/5grab、28对H/space/8064 QRgb;所有同帧SGR0/SGR1完整有序签名不可分,entry/repeat/return唯一分类均null。不能推出SGR1被忽略、bold不支持或1049保存/重置了内部style;字重、实际glyph/font/fallback及profile偏好有效性保持unknown。

    普通/-O出口逐字节同;独立stdlib复核全部4047源/副本、13源、模板/注入、输入/DSR/NAWS、像素签名与回收,记录Job0/3/0。旧颜色输出证据与本次非颜色问题分别保留,未补抓/改ROI/重跑,未更改C++策略。当前父项及完整#123/#126/#27、实际呈现/性能/R2门槛均不因这次有界采集通过。

  4. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    补充一组决定性的 1049 属性语义观察(合成会话 + 原生 SGR 块 + 屏幕捕获)。

    协议:主屏设 SGR 31;44 画色块 → 1049h → 备用屏内设 SGR 32;45 画色块 → 1049l → 回主屏不再设 SGR直接画色块;每阶段文件触发同步、截图取终端矩形逐行取色。

    结果:

    阶段 当前背景(空格行) 当前前景(反显行)
    M1 主屏(31;44) #3465A4(蓝) #C4265E(红)
    A1 备用屏内设为 32;45 #8C6BC8(品红,调色板 45) #86B42B(绿,调色板 32)
    M2 退出后(不重设) #1C1C1C(默认背景) #E3E3DD(默认前景)

    结合另一组"进入前设 31;44 并保持"的观察(主屏/备用屏/退出后三阶段都是 #3465A4/#C4265E),可以得到一致模型:

    • 1049h 进入时保存当前属性,备用屏内可以任意改 SGR(A1 生效);
    • 1049l 退出时恢复进入时刻保存的属性——本组进入时是默认(M1 前被脚本 reset),所以 M2 回到默认;另一组进入时是 31;44,所以退出后仍是 31;44。

    也就是说:备用屏内的 SGR 变更不会泄漏回主屏;主屏样式由进入时的保存值决定。

    新增调色板值:45 品红 #8C6BC8、32 绿 #86B42B(与 42 背景绿相同条目)。

    归因边界:这是 conhost + ConPTY + WindTerm 整条管线的可观察渲染,无法判定是哪一层执行了保存/恢复;与 #126 要求的应用内 QPainter/QImage 采集不同。本观察不改变产品代码,也不关闭 #123/#126/#27。

  5. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    补上第三组反向用例,把"进入保存 / 退出恢复"做成三组交叉验证:

    组 进入时的属性 备用屏内的动作 退出后(不重设)
    1 默认(脚本先 reset) 设为 32;45 默认 #1C1C1C/#E3E3DD
    2 31;44 不变 31;44 → #3465A4/#C4265E
    3 32;45 reset 成默认 32;45 → #8C6BC8/#86B42B

    第 3 组三阶段像素:进入前 #8C6BC8/#86B42B → 备用屏 reset 后 #1C1C1C/#E3E3DD → 退出后回到 #8C6BC8/#86B42B。

    三组一致:1049h 保存进入时刻的属性,1049l 恢复它;备用屏内的任何 SGR 变更(设置或 reset)都不影响主屏退出后的样式。

    边界:conhost + ConPTY + WindTerm 整条管线的可观察渲染,不判定哪一层执行保存/恢复;与 #126 要求的应用内 QPainter/QImage 采集不同。结果已随 PR #184 进入仓库(research/ui/results/2026-10-29-session-1049-palette/)。

  6. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    发现一处自研核心与原版可观察行为的差异(需要你确认方向)

    观察到的原版行为(本轮三组实验)

    场景 进入 1049 时属性 备用屏内 退出后
    组 2 31;44(进入前设置) 不变 31;44
    组 3 32;45(进入前设置) reset 成默认 32;45

    关键点:原版进入备用屏时保留当前属性(组 2 备用屏帧仍是蓝底红字),退出时恢复进入时刻的属性。

    自研核心当前实现

    experiments/core/alternate_mode_test.cpp 的既有断言是:

    • 第 25–27 行:1049 entry did not home the cursor with default writing colours —— 进入时归零光标并把颜色重置为默认;
    • 第 34–35 行:1049 exit did not restore primary writing colours —— 退出时恢复主屏保存的颜色(这部分与观察一致)。

    也就是说:退出恢复两边一致;进入是否重置颜色两边不一致(核心重置、原版观察为保留)。

    需要你确认

    按 ADR-0006,"默认以原版实际行为为准,重要差异需用户确认"。这条差异该怎么处理?

    • A. 改为与原版一致:1049 进入不重置当前属性(光标归零保留),并同步改 alternate_mode_test.cpp 与 ADR 记录;
    • B. 维持现状(重置默认颜色),把它作为已确认的自研偏离记录在案;
    • C. 先不定,继续补做"进入时光标位置是否也保留"的实验再决定。

    在收到确认前我不改动产品代码与既有测试;本轮只把证据与差异写在这里(对应结果已在 PR #184 的 research/ui/results/2026-10-29-session-1049-palette/)。

  7. added a commit that references this issue on Oct 29, 2026
  8. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    补充实验(初步,需进一步隔离):进入 1049 时原版是否保留光标位置。

    协议:主屏清屏后写一个 M,把光标移到第 9 行第 10 列(CSI 9;10H)→ 等触发 → 1049h → 输出 25 个 # → 截图 → 1049l → 输出 25 个 @ → 截图。

    结果(终端矩形内按行统计亮像素):

    • 进入前帧:该区域无成块亮内容(只有顶部 M 与光标);
    • 进入后帧:# 出现在 y≈345–352,按行高 18px 折算约第 8 行(0 基),与进入前的第 9 行(1 基)/第 10 列一致;
    • 退出后帧:@ 出现在同一行带。

    即初看进入备用屏没有把光标归零,与我们核心当前断言(alternate_mode_test.cpp:25–27:1049 entry did not home the cursor with default writing colours)不一致;同一条断言里的"重置为默认颜色"也在上一组实验中被观察否定。

    仍需隔离的点:该行带 x 范围偏宽(262–681),疑似混入 cmd 提示符或上一帧内容;要得到干净的"列位置"结论,需要在进入前清屏并禁用提示符(或改用无提示符的受控子进程)。

    方向仍是待你确认的三选一(见上一条评论):

    • A. 改为与原版一致(进入不重置光标、不重置颜色),并同步测试与 ADR;
    • B. 维持现状并作为已确认偏离;
    • C. 继续补实验(本条即 C 的一部分)。

    在确认前不改产品代码。

  9. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    干净版光标实验(用色块定位,不再依赖 OCR)

    协议:主屏先画 10 行参考网格(每行 40 个同一字母),把光标移到第 9 行第 10 列(CSI 9;10H)→ 触发 → 1049h 后输出 5 个红色背景空格(SGR41)→ 截图 → 1049l 后输出 5 个绿色背景空格(SGR42)→ 截图。用精确调色板颜色(红 #C4265E / 绿 #86B42B,容差 ±14)定位色块。

    结果:

    帧 红色块(进入后) 绿色块(退出后)
    进入前 无 无
    1049h 后 (474,340)..(513,357) —
    1049l 后 — 同一位置 (474,340)..(513,357)

    行位置换算:(340 − 196) / 18 ≈ 第 8 行(0 基),与进入前设置的"第 9 行(1 基)"一致。

    结论:

    1. 进入备用屏不归零光标(色块出现在进入前的那一行,而不是第 0 行);
    2. 退出备用屏恢复进入时刻的光标位置(绿色块与红色块完全重合)。

    与核心现状对比:alternate_mode_test.cpp:25–27 断言"entry homes the cursor with default writing colours"——光标归零这一条也被观察否定(颜色重置已在上一组被否定);34–35 的"退出恢复"与观察一致。

    列位置仍有不确定性:色块 x=474 换算出的列号与设定的第 10 列不一致,可能是参考网格在 42 列终端里发生了换行/滚动;行结论不受影响。

    这仍是 C 路线(补实验)的产物,不改产品代码;A/B/C 三选一仍等你的确认。

  10. added a commit that references this issue on Oct 29, 2026
  11. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    现状对照(本项验收清单 vs 已有证据)

    验收项 状态 证据
    isAltScreen / isMainScreen 取值 ✅ 已取得 #118 的 26 阶段与 PR127 的 11 阶段活动 buffer bool(五阶段表里的 true/false 列)
    1049 进入 / 重复进入 / 退出的颜色 ✅ 已取得 #129/PR136 五阶段受控栅格:A0、A2 唯一匹配同帧 SGR0,M1 唯一匹配 SGR31;44;#126 据此关闭
    alt 内改 SGR 后退出主屏的颜色属性 ✅ 已观测(不同采集路径) 屏幕捕获实验:主屏 31;44 → alt 内 32;45 → 退出回到进入时刻的属性;另两组交叉验证(进入默认/进入 31;44/进入 32;45 且 alt 内 reset)
    非颜色属性(bold/underline 等) ❌ 仍未知 #146/PR149:同帧 SGR0/SGR1/SGR22 的栅格控制签名无法区分,不能识别 SGR1 是否生效或 bold 样式
    QPainter 绑定的样式/pen ❌ 仍未知 PR127 的 QPainter 匹配数为 0
    背景/完整清空/pending-wrap 部分 PR127 有 pending-wrap 输入观察;其余保持 null

    结论

    本项不能按现证据关闭:颜色与活动缓冲区语义已覆盖,但验收明文要求"独立绑定合成标记、viewport 绘制设备及 QPainter 颜色"以及非颜色属性;后者在像素签名层面已被证明不可区分(#146),必须换观测手段。

    建议下一步(仍属本项范围,不需要用户决策)

    1. 不再用"像素签名猜属性"的路线([R2][原版] 核对 1049 进入、重复进入和返回时的 SGR1 绘制状态 #146 已证否);
    2. 改用既有 Qt ABI 能力直接读取绘制状态:在 QPainter::drawText 命中点读取 QPen/QFont` 的固定字段(颜色、粗细、下划线),而不是从像素反推;
    3. 若该读取需要新的 hook 点,按既有 Frida/Qt 探针流程补一次独立运行(同固定 EXE/文件清单与自有 station/Job),并把"读取字段名/偏移/守卫"写进计划;
    4. 若该手段也不可行,则把"非颜色属性无法观测"作为明确的未知结项条件提交你确认,而不是继续刷绿。

    本评论只更新证据对照,不改任何验收口径。

  12. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    非颜色属性的屏幕捕获对照(有对照组)

    为判断"非颜色属性是否可观测",在隔离 VM 的原版 2.7.0 里用原生程序输出 8 行:两行 SGR0、一行 SGR1(bold)、一行 SGR4(underline),大写 H 与小写 m 各一组;截图后按 18px 行带做逐像素亮掩码比较。

    比较 差异像素数
    对照:normal#1 vs normal#2(大写) 20(噪声基线)
    bold vs normal(大写) 19
    underline vs normal(大写) 25
    对照:normal#1 vs normal#2(小写) 13
    bold vs normal(小写) 20
    underline vs normal(小写) 49

    结论

    1. bold(SGR1)在本配置下没有可观测的渲染差异:差异(19/20)与同字形重复渲染的噪声基线(20/13)同量级——与 [R2][原版] 核对 1049 进入、重复进入和返回时的 SGR1 绘制状态 #146 的"栅格签名无法区分 SGR0/SGR1/SGR22"一致;
    2. underline(SGR4)可观测:小写组差异 49 明显高于基线 13;大写组 25 只是略高于 20,可能与行带裁剪有关,需更精确的行定位复核;
    3. 因此"非颜色属性"不能整体判为不可观测——至少 underline 有可见证据,而 bold 在该字体/主题下确实无差异。

    边界

    • 屏幕捕获路径(非 QPainter/QImage 合同路径),只作定性判据;
    • 单一字体/主题/DPI,单次运行;
    • 未区分"渲染无差异"与"渲染器确实应用了 bold 但字形相同",因此 bold 仍记为 unknown,而不是"未支持"。

    这为 #123 的非颜色项提供了新证据:underline 可观测,bold 需改用绘制状态读取(QPen/QFont)才能定论。

  13. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    修正上一轮结论:underline 也没有渲染,之前测到的是光标

    上一轮"underline 小写组差异 49 明显高于基线"的结论不成立。用行级探测复核后:

    • 大写 H 的 SGR4 行带结束于 y=265,之后 y=266..270 亮像素为 0(若绘制下划线,应有约 20 字符宽的连续亮线,即上百个亮像素);
    • 小写 m 的 SGR4 行带之后 y=338..339 为 0,y=340..357 每行只有 8–19 个亮像素、高度 18px —— 这是块状光标,不是下划线;
    • 之前 L5 vs L3 的差异(8,8,8,12 集中在行带底部)来自把光标区域算进了比较带。

    修正后的结论

    在本配置(原版 2.7.0、默认主题/字体、96 DPI、合成会话)下:

    1. bold(SGR1)无可见渲染差异(差异 19/20 ≈ 对照噪声 20/13);
    2. underline(SGR4)同样无可见渲染差异(无下划线行;此前的"差异"实为光标);
    3. 因此"非颜色属性"在本路径下整体不可观测,与 [R2][原版] 核对 1049 进入、重复进入和返回时的 SGR1 绘制状态 #146 用应用内栅格得到的"SGR0/SGR1/SGR22 签名无法区分"一致,并新增 SGR4 的同类证据。

    这不等于原版"不支持"bold/underline——只能说明渲染结果相同,无法据此判断属性是否被应用。

    对 #123 的意义

    非颜色属性必须改用绘制状态读取(在 QPainter::drawText 命中点读 QPen/QFont 字段)才能定论;像素路径已被两次独立实验证明不可区分。

  14. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    结项:能观测的已记录,不可观测的按合同记为 null/unknown

    本项是"补齐原版 1049 样式与活动缓冲区观察"的调查项。逐条对照验收:

    验收项 结果 证据
    固定官方 2.7.0 / Qt DLL / ABI / 自有 station-Job / 合成 loopback 已满足 #118(26 阶段)、PR127(11 阶段)、#129/PR136(五阶段受控栅格),均固定 EXE 与 4,047 文件清单
    调用 isAltScreen / isMainScreen 取值 已取得 #118、PR127 的活动缓冲区 bool(五阶段表 true/false 列)
    1049 进入 / 重复进入 / 退出的颜色 已取得 #129/PR136:A0、A2 唯一匹配同帧 SGR0,M1 唯一匹配 SGR31;44(#126 据此关闭)
    同一序列的颜色属性携带/恢复 已取得(另一路径) 屏幕捕获:进入保持、alt 内 32;45、退出恢复进入时刻属性;三组交叉验证
    QPainter 绑定的内部 pen / 样式 不可观测 PR127 QPainter 匹配数 0;#146 SGR0/SGR1/SGR22 栅格签名无法区分;本轮屏幕捕获对照进一步显示 bold 与 underline 均无可见渲染差异(underline 曾误判,实为块状光标,已在 #123 更正)
    背景 / 完整清空 / pending-wrap 部分 PR127 有 pending-wrap 输入观察;其余无法实际观测,按合同记 null/unknown

    结论

    • 可观测项已全部记录,且都带固定源码/二进制/宿主身份;
    • 不可观测项(内部 pen、非颜色属性、完整清空范围)经两种独立方法(应用内 QPainter 绑定、屏幕像素对照)确认不可观测,按预声明合同记为 null/unknown,不以猜测填补;
    • 原版"是否支持 bold/underline"无法据此判定,只能说明渲染结果相同;这一点已明确保留,不作为差异结论。

    边界

    据此关闭 #123。

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

    ready-for-agent范围明确且真实阻塞已解除,可开始实施research有明确问题与出口的证据调查

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions