Skip to content

Commit 6031266

Browse files
committed
feat(view): project linear history
Signed-off-by: Eli Ma <eli@patch.sh>
1 parent 7b48d0d commit 6031266

15 files changed

Lines changed: 2271 additions & 3 deletions

‎Cargo.lock‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mega2"
3-
version = "0.41.78"
3+
version = "0.41.79"
44
edition = "2024"
55
license = "MIT OR Apache-2.0"
66
description = "Monorepo engine and Git hosting server for AI agents: trunk-based storage, Git Smart HTTP, Git LFS, OCI registry, and Agent Session Capture"

‎docs/plan/plan-20261002.md‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
| 2026-10-05 | HP-01 执行与 ER-05 三轮复审 | 设计只增补齐治理章节与事实校准;refactoring 索引、PT-14 与日期计划索引建立;修正 README 原有 34 张卡的遗漏计数为 35。首两轮 P1 已关闭,第三轮 PASS,HP-01 进入 `locally-accepted`;C/D 仍由 HP-02 承载 | 无拆卡 | HP-01、计划状态、五个产物、Review log |
145145
| 2026-10-05 | HP-02 实施与 ER-05 复审 | 新增纯函数过滤器语法、canonical AST、filter_id 与加载复核;两轮 P1 复审关闭长 Chain 的二次方归约与错误分类边界,随后 Claude PASS 与 Codex 终审 PASS;按 ADR-HP-01 在设计 §6.5 登记 `PARSE_MAX_NESTING` 的加载期栈安全约束 | 无拆卡 | HP-02、设计 §6.5、计划状态、Review log |
146146
| 2026-10-05 | HP-02 发布并完成 HP-01 的 C/D 覆盖 | `v0.41.73` 承载提交 `ab68e20` 已推送;格式、Clippy、全量测试、构建门通过,`cargo build --tests` 只重现已登记的 macOS `__eh_frame` 平台提示;GitHub Release 已创建,D 组 `docker` run `37318412782` 成功 | 无拆卡 | HP-01、HP-02、计划状态 |
147+
| 2026-10-06 | HP-06 实施与五轮复审 | 新增线性投影内核、按层预取结果的 `project_with_output`、R8 检测和 Josh P0 正向夹具;设计 §4.3 明确错误分层、提交字节和 R8 的 §4.4 往返例外。四轮 FAIL 依次收紧空根遍历、所有写出段的字节断言、Josh 根历史忠实度、`filter_id.t` 来源登记及 R8 对照段;Claude R5 与 Codex R1 均 PASS。 | 无拆卡 | HP-06、设计 §4.3、Review log |
147148
| 2026-10-05 | HP-03 R1 实现复审 FAIL(P1×3) | `src_paths` 改为最终显示文本的 UTF-8 字节序排序;注册期源路径物化改为受 k 限制,活动候选集超过 k 时以 `K` 和 `actual = k + 1` 拒绝,优先于未物化完的相交检查;补上保留名与 ImportRepo 同时命中的顺序用例和嵌套 Compose / Chain 的受限展开用例。设计 §6.5 同步登记这个保守注册界限;它不改变过滤器代数。 | 无拆卡 | HP-03、设计 §6.5、Review log |
148149
| 2026-10-05 | HP-03 本地验收与 ER-05 复审 | Claude HP03-R3 PASS、Codex HP03-R4 PASS;8 条定向验证、格式、Clippy、全量测试与构建门通过。两次全量 SSH 夹具波动均由精确重跑通过;第三次完整套件以零退出码通过。 | 无拆卡 | HP-03、Review log、ER-04 C/D |
149150
| 2026-10-06 | HP-03 发布完成 | `v0.41.74` 承载提交 `0bad38b`、注释 tag 与 GitHub Release 已创建;rebase 后的 C 组在第六次完整套件通过,Docker D 组 run `37341422201` 成功。 | 无拆卡 | HP-03、计划状态、ER-04 C/D |
@@ -1523,7 +1524,7 @@ EMPTY_TREE 的依据:
15231524

15241525
**Task type:** `implementation`
15251526

1526-
**Lifecycle / Acceptance:** `pending` / 空
1527+
**Lifecycle / Acceptance:** `remote-pending` / `locally-accepted`(本地验收已完成;承载发布 `v0.41.79` 的 Docker D 组不等待、不重试)
15271528

15281529
**Description:** 本卡把线性根历史逐提交投影为视图段序列,唯一的行为轴是「线性根历史 → 视图段序列」:实现设计 §4.3 的 `project_commit(F, c, parent_tree, prev)` 与 `is_empty_root`,在内存夹具上移植 Josh `tests/filter/` 的线性正向用例。范围:
15291530
- 设计 §4.3 伪码的全部分支:s = 1 的空根规则;视图尚无提交时的 NULL 段、`None` 与首个无父提交;J3(原提交本身是空变更时保留);J4(过滤后 tree 不变时丢弃);视图被清空时写一个 tree 为 EMPTY_TREE 的提交。顶层 Chain 按复合 tree 函数套用这些规则(设计 §4.3「顶层 Chain」)。
@@ -5985,6 +5986,12 @@ Result 只允许 `PASS` 或 `FAIL`。`FAIL` 必须列出 P0/P1 条目,并在
59855986
| HP05-R1 | HP-05 初始实现与验收测试,Claude Code 只读审查 | FAIL | P0 0;P1:黄金夹具缺 armor 内部空行、mergetag 签名续行、签名剥离后不补末尾换行的定向证明。HP05-R2 关闭 | P2:多 parent 次序与裸 `gpgsig` 行作为 residual,其他测试完整性意见已采纳 | `target/tmp/hp05-review-r1.txt` |
59865987
| HP05-R2 | HP-05 修订实现与验收,Claude Code 独立复审 | PASS | P0 0;P1 0 | 发布者接受 P2 residual:尚未直接覆盖多 parent 次序;Git 生成路径不会产生裸 `gpgsig` 行 | `target/tmp/hp05-review-r2.txt`;7 条 HP-05 focused tests、ER-04 C 组 |
59875988
| HP05-R3 | HP-05 当前差异,Codex 独立复审 | PASS | P0 0;P1 0;P2 0 | 重建、签名剥离、错误分类、显式 hash kind 与 HP-06 接口一致 | `target/tmp/hp05-codex-r1.txt`、当前差异 |
5989+
| HP06-R1 | HP-06 初始实现,Claude Code 只读审查 | FAIL | P0 0;P1:Josh 用例非线性历史、`filter_id.t` 取舍和 rule_branches 覆盖不足。后续修订关闭 | P2:`is_empty_tree` 错误边界与文档细化一并修订 | `target/tmp/hp06-review-r1.txt` |
5990+
| HP06-R2 | HP-06 首轮修订,Claude Code 只读审查 | FAIL | P0 0;P1:空根层次遍历、完整写出段断言、Josh `exclude_compose` 忠实度与 `filter_id.t` 登记仍不足。后续修订关闭 | P2:夹具输出格式、末尾提交与 R8 日志级别一并修订 | `target/tmp/hp06-review-r2.txt` |
5991+
| HP06-R3 | HP-06 第二轮修订,Claude Code 只读审查 | FAIL | P0 0;P1:首次写入未比较提交字节,且上游原例与 mega2 规则适配标签混淆。后续修订关闭 | P2:逐项对齐 Josh 的实际根历史 | `target/tmp/hp06-review-r3.txt` |
5992+
| HP06-R4 | HP-06 第三轮修订,Claude Code 只读审查 | FAIL | P0 0;P1:R8 两个对照只断言提交存在,未断言复合 tree、id 与字节。后续修订关闭 | P2:`filter_id.t` 的 `:linear[::x/]` 逐项登记 | `target/tmp/hp06-review-r4.txt` |
5993+
| HP06-R5 | HP-06 最终实现,Claude Code 独立只读复审 | PASS | P0 0;P1 0 | P2 0 | `target/tmp/hp06-review-r5.txt` |
5994+
| HP06-R6 | HP-06 当前差异,Codex 独立复审 | PASS | P0 0;P1 0;P2 0 | 规则、错误分层、R8、Josh 夹具、静态纯计算边界均与卡片一致 | `target/tmp/hp06-codex-r1.txt`、当前差异 |
59885995

59895996
## 非目标与延后项
59905997

‎docs/refactoring/history-projection.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,7 @@ fn project_commit(F, c /* seq = s */, parent_tree, prev) -> Result<Option<Segmen
801801
return Some(Segment(s, rewrite_commit(F, c, t, [vp]), t)) # 含 t == EMPTY_TREE(视图被清空)
802802
```
803803
- `is_empty_root(T)` 的定义:T == EMPTY_TREE,或者 T 的全部条目都是 tree,且每个条目都递归满足 `is_empty_root`(Josh `history.rs::is_empty_root`)。递归读取经由 4.1 的 `read_tree`,缺对象时返回错误,不按非空或空处理。`project_commit` 返回 `Result<Option<Segment>, ProjectError>`,ProjectError 是以下三者之一:4.2 前提校验失败;4.1 `MissingObject`;根链行的 `mega_commit` 行缺失。最后一种只在 `rewrite_commit` 需要读该行时触发,在该处被 J4 丢弃的视图不受影响。
804+
- **线性投影的实现细化(HP-06)。** `project_commit` 返回 `Result<Option<Segment>, ProjectFailure>`,其中 `ProjectFailure::Data(ProjectError)` 承载前提校验失败、`MissingObject` 与根链提交行缺失,`ProjectError` 保持这三个变体不变;`ProjectFailure::Internal` 只承载调用方违反前提时的过滤器不变式违例,不对应数据状态,并由调用方整批回滚、水位不变;`MissingObject` 原样保留含未预取在内的读取原因,由调用方按原因分派;`Segment` 带视图提交的字节,供批末写对象;R8 检测在视图尚无提交且复合结果不写提交时逐级读取,超出按层预取范围的读取由调用方补预取后重算;中间级只含目录、子 tree 逐提交变化、复合结果为 EMPTY_TREE(如 `:/a:exclude[::b]` 且 `a/` 只含 `b/`)的罕见形态构成 §4.4「往返次数」的明示例外,可能使往返次数随批内提交增加,由 HP-24 计量。
804805
- 在单父情形下,以上规则与 Josh 的 `create_filtered_commit2` / `select_parent_commits` 一致【代码:`history.rs` 约 L697–721、L899–911】。
805806
- 【推断】在 mega2 中,trunk 根提交的 tree 总是与父提交不同(ADR-TP-16:净零推送不推进根),所以 `all_diffs_empty` 分支实际上不会触发;mega2 的初始化提交也不是空树。这两条规则仍然保留,用于与 Josh 对齐,并由测试覆盖。
806807
- **顶层 Chain。** Josh 按 `flatten_chain` 逐级做历史过滤(`filter/mod.rs::apply_to_commit2`)。在线性历史上,这与"先求复合 tree 函数,再套一次上述规则"等价,所以 P0 用复合 tree 函数。例外:L0 tree 中含有指向空树的条目时,逐级过滤的中间级可能触发空根规则,复合函数复现不了这种情形。这一点列入 R8,投影时检测到就告警。非线性情形见附录 E。

‎src/ceres/view/mod.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
pub mod commit;
22
pub mod filter;
3+
pub mod project;
34
pub mod tree;
45
pub mod tree_source;
56

0 commit comments

Comments
 (0)