## 用户结果与前置 父项 #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
JavaZeroo commentedon Oct 29, 2026
首片已按 #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独立编译通过,不构成候选行为验证。首轮新测试两次失败均为夹具/期望缺陷,只改测试,未记作产品红绿。仍未闭合(下一片)
Screen::lines/history仍公开可写:封口 + 迁移 shell/presentation/measure/trace 与全部测试写入口。emit_from_id_/prune/rewind与match()ID 区间筛选仍假设有序,运行中任意重排未验收。fix(core): 校验发布宽度并修正候选回放帧恢复 refs #169
docs(core): 记录发布宽度校验与候选帧恢复证据 refs #169
JavaZeroo commentedon Oct 29, 2026
审查与 CI 后的修复(PR #170 已更新)
首个推送版本
33b58fa的 CI 在alacritty-headless两个 Ubuntu 作业真实失败:candidate_core报published row width differs from the screen。原因是回放保留历史仍是上一帧宽度(111 列)被发布进 149 列新帧;旧的直接assign掩盖了混合宽度。修复按Screen::resize的物理行策略适配保留行(缩窄置cropped、宽带尾格清空),没有放宽发布校验;本地同配置复跑candidate_core1/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_core1/1。仍未做:封住公开lines/history与 caller 迁移、有序增量 Find 的emit/prune/rewind、区域 LF/新 VT、Qt/固定 ConPTY 与性能;本项保持开放。Merge pull request #170 from JavaZeroo/feat/core-order-query-r169
JavaZeroo commentedon Oct 29, 2026
首片已合入 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 通过。仍未闭合(本项不接受以首片代替):
Screen::lines/history仍是公开成员,直接写入未封;当前只有publish/restore_frame两条显式口,绕过它们的赋值仍会留下陈旧 rank。candidate_terminal已迁,experiments/shell/search_interactions.hpp的数值 ID 裁剪与src/qt/terminal_session.hpp的 GUI 侧读写仍未迁。emit_from_id_/prune/rewind与match()区段假设仍在;运行中跨重排的结果顺序/失效/有界进度未验收,不能接可触发无序的模式。另外记录:分支
feat/owned-line-order-r169(29d773b,26 文件)是同一内部的另一种更完整实现(私有存储 + FrameImage/FrameStamp + 定位表),当时未开 PR。它与已合入的publish/locate方向不同:若后续采用其存储封装思路,需要以当前 main 为基重做,不直接叠加。下一片计划:把行存储封为私有、提供只读访问口,迁移
search_interactions与 Qt session,并让全部结构性写入只经 owner 发布。JavaZeroo commentedon Oct 29, 2026
首片已合入 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。本片实际覆盖的验收(相对 #169 清单)
restore_frame()并推进 revision。仍缺隐藏帧的导入测试。[1,3,4,5,7,6]):rank/文档序比较/强制 Find(含 no-wrap)已覆盖;selection/copy、宽字符、软链/硬 LF 与 overlay 未覆盖。下一片边界(按本项原文)
Screen::lines/history改为私有 + 只读视图;迁移experiments/shell(含search_interactions140/144 的数值 ID 过滤与 overlay)、presentation、measure、trace与全部测试写入口。restore_frame/publish两个口;副本不得携带他人引用。Merge pull request #172 from JavaZeroo/feat/seal-line-storage-r169
JavaZeroo commentedon Oct 29, 2026
本项按两片合入 main 后结项:PR #170(
85eb5a0)发布精确行序,PR #172(6bb123b)封存行存储。验收对照
Screen::lines/history已私有化;结构只经resize/newline/activate_buffer/publish/restore_frame改变。首片为旁路保留的mark_order_unknown()在存储私有后没有调用者,已删除——不存在“改完手动 bump”的后门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 集合重排、导入、淘汰、隐藏帧与副本变化后无陈旧 ranknotify_change/audit/prune/预算/取消/no-wrap 语义未改;未以“重启 Search 或清空 reader”取绿candidate_terminal.cpp/W4 独立编译 0;两轴审阅后 PR #170 / #172 的 10 项 hosted 检查全部通过并合入 main证据:首片结果 · 封存结果 · EVIDENCE
明确不在本项、仍为未知
另记:分支
feat/owned-line-order-r169(29d773b)是同一问题的另一套更完整实现(FrameImage/FrameStamp),未合并;若后续需要其存储封装思路,应以当前 main 为基重做。