Skip to content

[R2][核心基础] 封装行结构发布并解耦稳定身份与文档顺序 #169

Closed

Description

@JavaZeroo

用户结果与前置

父项 #27,关联 #29 / #164。main 05f04d0222c06bed958f6894a27d2a1b0708d270 已包含 PR166 / PR168 的独立正确性与有限成本实验。原 caller 把行 ID 当文档顺序,局部重排会导致定位、选择、Find 与高亮错误。本项把这一内部假设收敛到 Screen 的结构发布与精确查询,为后续已取证的终端模式准备基础。

两个实验未选定永久 history 容器;H10000 Search、RSS、完整跨重排增量 Search 与无序缺失 anchor 的原版行为仍未知。这些不阻塞本项保持既有行为的内部正确性改造,不据此宣称性能等价、模式完成或 R2 通过。已确认自主 C++/Qt/固定 ConPTY 路线内的例行实现,无新增重大依赖或验收门槛。

实施边界

  • Screen 拥有行存储及可替换 ID→rank 查询。外部仅短期只读访问;导入/回放使用拥有值的校验后发布口,不能留下可变容器或“改完手动 bump”的旁路。
  • ID 是身份,rank 是当前文档位置;missing 必须精确,稳定行搬移不改 ID/version,删除不复活。epoch 0 合法;内容 version、结构 revision、buffer epoch 各负其责。
  • 覆盖构造、追加/淘汰、自动换行、两帧 resize、buffer 切换/reset、candidate 导入/normalize/恢复及 Screen copy/move。校验/提交失败不留下已发布的陈旧索引;副本不得保留其他 owner 的引用。
  • TextDocument/selection/viewport 活 anchor 使用同一定位;不可变无序文档的 Find、导航和真实 shell overlay 使用 rank。保留当前有序增量 Find 的 notify/audit/prune/预算/取消/no-wrap 语义,不以重启 Search 或清空所有 reader 代替修复。
  • 不新增 VT 模式、区域 LF 或用户可触发的无序变化;不猜无序缺失 anchor 的 UI 回退,不把静态 Search 实验替换成生产增量实现。开放新无序行为前,跨重排增量 Search 需另行完整验收。

验收

  • 固定当前源码的全部生产写入口与实际 caller;至少包含 candidate_terminal 的 assign/恢复、shell search_interactions 数值 ID 裁剪和 Qt session。
  • 生产结构只能经 owner 发布,精确查询在同大小/同 ID 集合重排、导入、淘汰、隐藏帧及副本变化后无陈旧结果。
  • [1,3,4,5,7,6]:7→rank4、6→rank5、2→missing;真实 selection/copy、fresh Find 7→6/no-wrap、宽字符/软链/硬 LF、overlay 一致,ID/version/text 不因搬移而变。
  • 既有有序追加/覆写/淘汰期间的增量 Find、query 替换/取消、部分结果/上限/步数、selection 与 schema 保持;不声称已覆盖运行中任意重排。
  • 现有核心/候选/真实 caller 与 Qt 编译的针对性回归,来源/配置/实际 pass/fail/skip 分列;两轴审查后整合 main,更新当前能力和证据入口。

本项没有性能数值通过线,不改变原版优先原则。完成仅解除内部结构前置;#164 的剩余成本、#27/#29/#28 与 R2 继续开放。

Activity

  1. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    首片已按 #169 边界实现并提交审查:PR #170(分支 feat/core-order-query-r169,源码 33b58fa),本项保持开放。

    本片实际交付

    • Screen::publish(history, live):导入/回放显式提交拥有值行镜像,先校验宽度/非零唯一 ID/上限,成功才替换存储并推进结构 revision;失败不留半状态。
    • Screen::locate(id):精确 ID→rank,缺失返回空不再退化到邻行;仅可证有序时二分,否则逐行精确扫描;mark_order_unknown() 供绕过发布口的直接写入声明失效。
    • Screen::order_revision():只随下滚、物理 resize、缓冲切换、结构发布前进;单元格写入、仅移动光标的新行、同尺寸 resize、同结构重复发布都不前进。
    • TextDocument::index_of 改用 locate,新增 compare 按文档序比较;HistoryViewport 活 anchor 用精确 rank(淘汰 anchor 的 lower_bound 回退保留);TextSearch::navigate 改文档序;CandidateTerminal 导入改经 publish,回放直接恢复后声明 order 未知。

    固定夹具与结果:[1,3,4,5,7,6] → locate(7)=4、locate(6)=5、locate(2) 缺失、文档序 7 先于 6、强制 Find previous(6)→7 / next(7)→6;核心 CTest 8/8、完整默认 Release 构建 exit0。证据见 合同 与 验证身份。候选路径本机未启用适配器,仅 /W4 独立编译通过,不构成候选行为验证。首轮新测试两次失败均为夹具/期望缺陷,只改测试,未记作产品红绿。

    仍未闭合(下一片)

    1. Screen::lines/history 仍公开可写:封口 + 迁移 shell/presentation/measure/trace 与全部测试写入口。
    2. 有序增量 Find 的 emit_from_id_/prune/rewind 与 match() ID 区间筛选仍假设有序,运行中任意重排未验收。
    3. 无区域 LF、新 VT、reflow 或用户可达重排;Qt/固定 ConPTY/GUI/性能均未由本片运行。
  2. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    审查与 CI 后的修复(PR #170 已更新)

    首个推送版本 33b58fa 的 CI 在 alacritty-headless 两个 Ubuntu 作业真实失败:candidate_core 报 published row width differs from the screen。原因是回放保留历史仍是上一帧宽度(111 列)被发布进 149 列新帧;旧的直接 assign 掩盖了混合宽度。修复按 Screen::resize 的物理行策略适配保留行(缩窄置 cropped、宽带尾格清空),没有放宽发布校验;本地同配置复跑 candidate_core 1/1。

    两轴只读审查的 1 blocker / 13 should-fix 中,已处理并复验:publish 光标夹取与 attachment 失效(blocker)、先准备后交换消除半提交、active_history_limit()、回放改 restore_frame() 取代手工标记旁路、find_line 改用 locate、match() 在顺序不可证时整体校验、候选侧光标/样式移到发布成功之后。

    当前源码 d5116e2:完整默认 Release 构建 exit 0、筛选的 8 项核心 CTest 8/8、本地 candidate_core 1/1。仍未做:封住公开 lines/history 与 caller 迁移、有序增量 Find 的 emit/prune/rewind、区域 LF/新 VT、Qt/固定 ConPTY 与性能;本项保持开放。

  3. added a commit that references this issue on Oct 29, 2026
  4. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    首片已合入 main(85eb5a0,PR #170),本项保持开放,剩余范围如下。

    已交付(限定):Screen::publish(history, live) 校验后一次提交、locate(id) 精确 rank(缺失不落邻行)、order_revision() 只随结构变化前进、mark_order_unknown() 保守回退、restore_frame() 回放恢复;TextDocument::index_of/compare 改用精确 rank,HistoryViewport 活 anchor 精确、淘汰 anchor 保留原回退,TextSearch::navigate 改文档序,CandidateTerminal 导入/回放改经发布口并对保留历史做物理行宽适配。固定夹具 [1,3,4,5,7,6]:locate(7)=4、locate(6)=5、locate(2) 缺失、文档序 7 先于 6、Find previous/next/no-wrap 均按文档序。证据:README · validation.json;独立复核:在该 head 的隔离构建里默认 Release 构建 exit 0、核心 CTest 8/8 通过。

    仍未闭合(本项不接受以首片代替):

    1. Screen::lines/history 仍是公开成员,直接写入未封;当前只有 publish/restore_frame 两条显式口,绕过它们的赋值仍会留下陈旧 rank。
    2. 验收要求逐项列出的真实 caller 只迁移了一部分:candidate_terminal 已迁,experiments/shell/search_interactions.hpp 的数值 ID 裁剪与 src/qt/terminal_session.hpp 的 GUI 侧读写仍未迁。
    3. 有序增量 Find 的 emit_from_id_/prune/rewind 与 match() 区段假设仍在;运行中跨重排的结果顺序/失效/有界进度未验收,不能接可触发无序的模式。

    另外记录:分支 feat/owned-line-order-r169(29d773b,26 文件)是同一内部的另一种更完整实现(私有存储 + FrameImage/FrameStamp + 定位表),当时未开 PR。它与已合入的 publish/locate 方向不同:若后续采用其存储封装思路,需要以当前 main 为基重做,不直接叠加。

    下一片计划:把行存储封为私有、提供只读访问口,迁移 search_interactions 与 Qt session,并让全部结构性写入只经 owner 发布。

  5. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    首片已合入 main(PR #170)

    合并提交 85eb5a0(源码 d5116e2 + 证据 9ceb3ab),main 工作树干净。本项保持开放,下一片是封住公开 lines/history 与 caller 迁移。

    CI 结果(两轮 run 一致)

    • External core candidate:Ubuntu 2m34s / 2m40s、Windows 4m40s / 6m5s,全部 success。首个推送版本(33b58fa)该项在两个 Ubuntu 作业为红,报 published row width differs from the screen;修复后同一作业转绿,红→绿只属于候选适配器配置。
    • Qt C++ fixed ConPTY build and smoke:success。
    • Build and synthetic regression:Ubuntu 57s/48s、Windows 8m6s/8m20s,success。
    • 合并后在 main 复跑筛选的 8 项核心 CTest:8/8。

    本片实际覆盖的验收(相对 #169 清单)

    • 验收 2(结构只经 owner 发布、重排/导入后无陈旧 rank):重排、导入、拒绝、淘汰、copy 已有独立夹具;隐藏帧与回放恢复走 restore_frame() 并推进 revision。仍缺隐藏帧的导入测试。
    • 验收 3([1,3,4,5,7,6]):rank/文档序比较/强制 Find(含 no-wrap)已覆盖;selection/copy、宽字符、软链/硬 LF 与 overlay 未覆盖。
    • 验收 1(固定全部生产写入口与 caller)与验收 5(Qt 编译/完整回归矩阵):未做,属下一片。

    下一片边界(按本项原文)

    1. Screen::lines/history 改为私有 + 只读视图;迁移 experiments/shell(含 search_interactions 140/144 的数值 ID 过滤与 overlay)、presentation、measure、trace 与全部测试写入口。
    2. 回放/导入只保留 restore_frame/publish 两个口;副本不得携带他人引用。
    3. 运行中跨重排的增量 Find 需另立验收,不在封口片宣称通过。
  6. added a commit that references this issue on Oct 29, 2026
  7. JavaZeroo commented on Oct 29, 2026

    @JavaZeroo
    OwnerAuthor

    本项按两片合入 main 后结项:PR #170(85eb5a0)发布精确行序,PR #172(6bb123b)封存行存储。

    验收对照

    合同 结果
    生产结构只能经 owner 发布 Screen::lines/history 已私有化;结构只经 resize/newline/activate_buffer/publish/restore_frame 改变。首片为旁路保留的 mark_order_unknown() 在存储私有后没有调用者,已删除——不存在“改完手动 bump”的后门
    固定实际写入口与 caller 23 文件 / 363 处只读访问改经 visible_lines()/history_lines();CandidateTerminal 导入经 publish()、回放经 restore_frame();ShellWindow::search_overlay 的可见范围裁剪与覆盖行判定由数值 ID 比较改为文档 rank;Qt 读取(terminal_widget、两个 smoke)同步迁移;r164 冻结研究树保持原样、不随主线迁移
    精确查询与夹具 order_query_test 固定 [1,3,4,5,7,6]:locate(7)=4、locate(6)=5、locate(2) 缺失、文档序 7 先于 6、Find previous(6)→7 / next(7)→6 / no-wrap 同向;同大小同 ID 集合重排、导入、淘汰、隐藏帧与副本变化后无陈旧 rank
    既有有序增量 Find 保持 notify_change/audit/prune/预算/取消/no-wrap 语义未改;未以“重启 Search 或清空 reader”取绿
    回归与整合 本机独立复核:默认 Release 构建 exit 0、核心 8/8、扩展快测 20/20、candidate_terminal.cpp /W4 独立编译 0;两轴审阅后 PR #170 / #172 的 10 项 hosted 检查全部通过并合入 main

    证据:首片结果 · 封存结果 · EVIDENCE

    明确不在本项、仍为未知

    • 运行中跨重排的增量 Search(结果顺序、已扫元数据、失效、有界进度):未验收。按本项原文,开放任何新无序行为前必须另行完整验收,归后续 [R2-04][终端] 实现备用屏、滚动区域及关联模式 #27 的区域/margin 模式工作。
    • H10000 Search/RSS、永久 history 容器、无序缺失 anchor 的原版 UI 回退行为:未取证。
    • 无新 VT 模式、无区域 LF、无 reflow、无 GUI/TUI/固定 ConPTY 运输或任何性能结论。

    另记:分支 feat/owned-line-order-r169(29d773b)是同一问题的另一套更完整实现(FrameImage/FrameStamp),未合并;若后续需要其存储封装思路,应以当前 main 为基重做。

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

    enhancementNew feature or request

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions