|
161 | 161 | | 2026-10-06 | HP-09 实施与 ER-05 复审 | 新增八张视图数据表、八个 SeaORM 实体及注册迁移;六条目录级迁移用例覆盖精确 schema、无外键、重放幂等、既有 schema 不变、实体往返、故障回滚和恢复。格式、Clippy、全量测试与两个构建门通过。Claude HP09-R1 与 Codex HP09-R2 均 PASS;`v0.42.1` 的 Docker D 组按发布者指令不等待、不重试。 | 无拆卡 | HP-09、Review log、ER-04 C/D | |
162 | 162 | | 2026-10-06 | HP-10 实施与 ER-05 复审 | 新增根链扩展、段事务与预算、SQLSTATE 锁超时处理、根链冲突核对、共享进程内告警去重、锁键和真实对象夹具;设计 §4.4 补 `hash32` 定义,§4.6 将 L_V(F) 的键改为 `(VIEW_FILTER_LOCK_NS, hash32(F.pk))`。六个定向用例覆盖首父链、预算/重启/双连接交错、不连续与冲突、等锁失败和锁键隔离。格式、Clippy、全量测试与两个构建门通过。Docker D 组按发布者指令不等待、不重试。 | 无拆卡 | HP-10、设计 §4.4/§4.6、Review log、ER-04 C/D | |
163 | 163 | | 2026-10-06 | HP-28 实施与 ER-05 复审 | 新增可嵌入单快照 SQL 的 `ROOT_CHAIN_HALTED_SQL` 与无锁 `root_chain_halted`,将五类根链不连续的停追、跨连接池复现、常数语句数、无写入、正常中间态和清空暂存表后的恢复/重新判定写入七个 lib 用例。格式、Clippy、全量测试与两个构建门通过。Claude HP28-R2/R3 与 Codex HP28-R4 均 PASS;`v0.42.3` 的 Docker D 组按发布者指令不等待、不重试。 | 无拆卡 | HP-28、事实校准第 7 项、Review log、ER-04 C/D | |
| 164 | +| 2026-10-06 | HP-29 实施与 ER-05 复审 | 新增可失败的 1000 条分块提交/tree 读取及数据库 `ViewTreeSource`;六个 lib 用例覆盖泛型连接/事务、失败隔离、缓存语义、查找顺序、显式 hash kind 与语句计数。设计 §4.4 登记分块语句数。Claude HP29-R3 与 Codex HP29-R4 均 PASS;`v0.42.4` 的 Docker D 组按发布者指令不等待、不重试。 | 无拆卡 | HP-29、设计 §4.4、Review log、ER-04 C/D | |
164 | 165 |
|
165 | 166 | ## 已决议设计决策 |
166 | 167 |
|
@@ -2361,7 +2362,7 @@ schema 与连接池:每类不连续、每种状态各用一个 schema;第 2 |
2361 | 2362 |
|
2362 | 2363 | **Task type:** `implementation` |
2363 | 2364 |
|
2364 | | -**Lifecycle / Acceptance:** `pending` / 空 |
| 2365 | +**Lifecycle / Acceptance:** `remote-pending` / `locally-accepted`(本地验收已完成;承载发布 `v0.42.4` 的 Docker D 组按发布者指令不等待、不重试) |
2365 | 2366 |
|
2366 | 2367 | **Description:** 自 HP-11 拆出。为视图路径提供不会 panic 的提交与 tree 读取,让「查询失败」「行不存在」「无法解析」「未预取」四种情形在返回值上可以区分(设计 §4.1「缺对象不等于路径不存在」、§0.5-21、§6.9 `batch_size` 行)。查询失败只出现在可失败批量读取与异步预取返回的 `Err(MegaError)` 中;后三种是 HP-04 的 `MissingObject { tree_id, reason }` 的三种原因。本卡遵守 HP-04 已定的 `TreeSource` 契约:读取方法对一个 tree id 返回 `Result<Tree, MissingObject>`,不做 I/O;数据库只在异步预取阶段访问。范围: |
2367 | 2368 | - `MonoStorage::get_commits_by_hashes_fallible` 与 `MonoStorage::get_trees_by_hashes_fallible`: |
@@ -2437,7 +2438,7 @@ schema 与连接池:每类不连续、每种状态各用一个 schema;第 2 |
2437 | 2438 | 以下 cargo 用例需要 Postgres 测试栈(ER-01),前置(环境准备,不单独计门):`source .env.test && docker compose -p mega2-it -f docker/docker-compose.test.yml up -d --wait`。Postgres 缺失时用例 panic,判为失败,不是跳过。两个计数用例之外,连接一律用 `test_db_connection` 加 `apply_migrations(&db, true)`,守卫随连接存活(GC-HP-10)。夹具行由测试直接写库(ADR-HP-06)。用例运行在 `#[tokio::test]` 的单线程运行时上。`view_tree_source` 的用例一律经 HP-04 的 `read_tree(kind, source, id)` 读取,以本卡实例为 `source`,传入的 kind 与构造本实例的 kind 相同。用例说明中标为「推出」或「计数核对」的断言,由所注明的条目或 HP-04 的契约推出,不是另立的谓词。 |
2438 | 2439 |
|
2439 | 2440 | - [ ] `source .env.test && cargo test -p mega2 --lib 'jupiter::storage::mono_storage::tests::fallible_batch_reads_rows_then_query_error' -- --exact`(new;判定第 1 条,以及第 3 条中的两个 `MonoStorage` 函数。先在未改动的测试 schema 中:两个函数的请求集分别混入库中不存在的 id、重复 id、跨越分块边界的 2500 个 id,返回 `Ok`,行与交集一一对应;每个函数在连接上与在 `begin()` 得到的 `DatabaseTransaction` 上各调用一次,结果相同。事务上的调用完成后先 `commit()` 或 `rollback()` 结束该事务,再改列名(未结束的事务持有表锁,ALTER 会无限等待)。再在本用例的测试 schema 内执行 `ALTER TABLE mega_commit RENAME COLUMN tree TO hp29_gone` 与 `ALTER TABLE mega_tree RENAME COLUMN sub_trees TO hp29_gone`,使两表的查询报错;只改列名、不改表名,也不用 `DatabaseConnection::default()`;请求 1 个与 2500 个 id 时,两个函数都返回 `Err(MegaError)`;用例不 panic) |
2440 | | -- [ ] `source .env.test && cargo test -p mega2 --lib 'jupiter::storage::mono_storage::tests::fallible_batch_reads_chunk_statement_count' -- --exact`(new;判定第 2 条中的两个 `MonoStorage` 函数:用 `test_db_config` 取得 `(db_config, _schema)`,守卫持有到用例结束;经 `database_connection(&db_config)` 建连接(内含迁移),在该连接上设 `set_metric_callback` 计数,每次计数前清零;不在 `test_db_connection` 返回的连接上替换回调(GC-HP-10)。n 取 0、1、1000、1001、2500,语句数依次为 0、1、1、2、3;1001 个不同 id 再混入 500 个重复 id 时仍为 2 条) |
| 2441 | +- [ ] `source .env.test && cargo test -p mega2 --lib 'jupiter::storage::mono_storage::tests::fallible_batch_reads_chunk_statement_count' -- --exact`(new;判定第 2 条中的两个 `MonoStorage` 函数:用 `test_db_config` 取得 `(db_config, _schema)`,守卫持有到用例结束;经 `database_connection(&db_config)` 建连接(内含迁移),在该连接上设 `set_metric_callback` 计数,每次计数前清零;不在 `test_db_connection` 返回的连接上替换回调(GC-HP-10)。n 取 0、1、1000、1001、2500,语句数依次为 0、1、1、2、3;1000 个不同 id 再混入 1 个重复 id 时仍为 1 条(不去重将为 2 条)) |
2441 | 2442 | - [ ] `source .env.test && cargo test -p mega2 --lib 'jupiter::storage::view_tree_source::tests::lookup_order_view_object_first' -- --exact`(new;判定第 5 条的查找顺序与解析方法:预取后经 `read_tree` 读取,只在 `mega_view_object`(kind = 2)中的脊柱 tree 与只在 `mega_tree` 中的 L0 tree 都能读到。该 L0 tree 行的 `sub_trees` 能按 kind 解析,但其 hash 不等于行的 `tree_id`:`read_tree` 返回 `Tree`,其 id 等于所请求的 `tree_id`,条目与该行字节的解析结果相同(读取不校验 hash,设计 §4.1「原样复用的 L0 tree」);同一 id 在 `mega_view_object` 中可解析、在 `mega_tree` 中是坏字节时,读到前者;`mega_view_object` 中同 id 的行 kind = 1 时,读到 `mega_tree` 中的 tree。sha1 与 sha256 各验一次,构造本实例与调用 `read_tree` 都显式传入该 kind;sha1 一例在 `set_hash_kind_for_test(HashKind::Sha256)` 的作用域内运行,sha256 一例在 `set_hash_kind_for_test(HashKind::Sha1)` 的作用域内运行,以此间接证明本卡代码不调用 `Tree::from_mega_model` 与 `get_hash_kind`(GC-HP-07);sha256 一例的实例在 `DatabaseTransaction` 上构造) |
2442 | 2443 | - [ ] `source .env.test && cargo test -p mega2 --lib 'jupiter::storage::view_tree_source::tests::read_tree_outcomes_over_db_source' -- --exact`(new;判定第 6、7、8 条。sha1 与 sha256 各一套夹具:sha1 夹具在 `set_hash_kind_for_test(HashKind::Sha256)` 的作用域内运行,sha256 夹具在 `set_hash_kind_for_test(HashKind::Sha1)` 的作用域内运行。预取后两表都没有的 id,得到原因为「行不存在」的 `MissingObject`。`mega_tree` 行的 `sub_trees`、`mega_view_object` 行的 `data` 各去掉最后一个字节(截在最后一个条目的 id 内部,不落在条目边界上),预取后得到原因为「无法解析」的 `MissingObject`。kind 为 sha256 时预取并读取 `mega_tree` 中一个 40 位 sha1 id 的行,kind 为 sha1 时预取并读取 `mega_tree` 中一个 64 位 sha256 id 的行,都得到原因为「无法解析」的 `MissingObject`。从未预取的 id 得到原因为「未预取」的 `MissingObject`,原因不是「行不存在」。各例的 `tree_id` 都等于请求的 id;用例不 panic。推出:为「行不存在」的 id 补上 `mega_tree` 行后,原实例再次预取并读取仍为「行不存在」,由第 2 条的待查 id 定义(已记入缺失集合的 id 不再查询)与第 6 条推出;新建实例预取后读到该 tree,由第 1、5 条推出) |
2443 | 2444 | - [ ] `source .env.test && cargo test -p mega2 --lib 'jupiter::storage::view_tree_source::tests::prefetch_statement_count' -- --exact`(new;判定第 2 条中 `prefetch` 对 `mega_view_object` 的读取:用 `test_db_config` 取得 `(db_config, _schema)`,守卫持有到用例结束;经 `database_connection(&db_config)` 建连接(内含迁移),各实例都构造在这条连接上;在该连接上设 `set_metric_callback` 计数,每次计数前清零;不在 `test_db_connection` 返回的连接上替换回调(GC-HP-10)。第一个实例预取 1500 个待查 id,其中 300 个只在 `mega_view_object`(kind = 2)、1000 个只在 `mega_tree`、200 个两表都没有,语句数为 ⌈1500/1000⌉ + ⌈1200/1000⌉ = 4。以下三个场景各新建一个实例:预取那 300 个 id 时为 1 条,不查 `mega_tree`;空请求为 0 条;只含 EMPTY_TREE 的请求为 0 条。第一个实例再次预取这 1500 个 id,语句数增量为 0。后四项按第 2 条的待查 id 定义计算。计数核对:第一个实例预取之后经 `read_tree` 逐个读取这 1500 个 id,语句数增量为 0,由 HP-04 的同步 trait 保证) |
@@ -6014,6 +6015,10 @@ Result 只允许 `PASS` 或 `FAIL`。`FAIL` 必须列出 P0/P1 条目,并在 |
6014 | 6015 | | HP28-R2 | HP-28 修订:同快照断言、正常态输入与文档,Claude Code 2.1.288 独立只读复审 | PASS | P0 0;P1 0;P2 0 | P3 1:覆盖文字可能被理解为所有正常态均读取计数;后续文字修订关闭 | Claude Code 2.1.288 只读输出 | |
6015 | 6016 | | HP28-R3 | HP-28 文档澄清复审,Claude Code 2.1.288 独立只读复审 | PASS | P0 0;P1 0;P2 0 | P3 1:内部状态标签脱离任务卡不够自明;后续文字修订关闭 | Claude Code 2.1.288 只读输出 | |
6016 | 6017 | | HP28-R4 | HP-28 最终差异、事实校准第 7 项、七项验证与门禁,Codex 独立复审 | PASS | P0 0;P1 0;P2 0 | SQL 的自包含性与有序判定、无锁单查询、跨连接池持久性、恢复/重新停追、同快照并发观察、文档锚点和所有门禁已逐项核对 | `libra diff --check`、七项 HP-28 Verification、格式、Clippy、构建门与全量测试 | |
| 6018 | +| HP29-R1 | HP-29 初始实现,Claude Code 独立只读复审 | FAIL | P0 0;P1 0;P2 3:去重边界、kind=1 回退区分和文档覆盖不足;均在后续修订关闭 | P3 3:单 id 错误、事务夹具与集合 A 覆盖;后续修订关闭 | Claude Code 只读输出;复审见 HP29-R2 | |
| 6019 | +| HP29-R2 | HP-29 修订,Claude Code 独立只读复审 | FAIL | P0 0;P1 0;P2 1:任务卡重复 id 样本与测试不一致;后续修订关闭 | P3:L0 条目比较与发布登记;前者在 R3 前关闭 | Claude Code 只读输出;复审见 HP29-R3 | |
| 6020 | +| HP29-R3 | HP-29 最终实现、任务卡与设计 §4.4,Claude Code 独立只读复审 | PASS | P0 0;P1 0;P2 0 | P3:连接路径行数断言和发布登记;行数断言在提交前补齐 | Claude Code 只读输出 | |
| 6021 | +| HP29-R4 | HP-29 最终差异、六项验证与文档,Codex 独立复审 | PASS | P0 0;P1 0;P2 0 | 泛型分块、局部预取提交、三种缺失原因、EMPTY_TREE、测试计数和设计/集成文档逐项核对 | 当前差异、六项 HP-29 Verification、`libra diff --check` | |
6017 | 6022 |
|
6018 | 6023 | ## 非目标与延后项 |
6019 | 6024 |
|
|
0 commit comments