Skip to content

Commit ea0b3a7

Browse files
committed
test(status): close P0-01 seven unmerged XY acceptance gaps (v0.18.91)
Pin DD/AU/UD/UA/DU/AA/UU mapping in unmerged/status unit tests and cover UD/DU/AA via merge fixtures so porcelain conflict codes cannot silently drift. Sync agent tracing doc-truth for Subagent checkpoints and findings run-dir GC; restore installer fallback and local lba alias with release. Signed-off-by: eli <eli@localhost> Signed-off-by: Eli Ma <eli@patch.sh>
1 parent c114388 commit ea0b3a7

12 files changed

Lines changed: 196 additions & 18 deletions

File tree

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 = "libra"
3-
version = "0.18.90"
3+
version = "0.18.91"
44
edition = "2024"
55
license = "MIT"
66
description = "AI agent-native version control system with Git on-disk compatibility, SQLite-backed metadata, and tiered cloud storage"

docs/development/plan/plan-20260708.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@
170170

171171
**P1-01 当前状态(2026-07-09)**:共享 pathspec engine 已完成并接入只读消费者 `ls-files`/`status`/`grep`/`diff`(v0.18.47)以及写命令 `add`/`rm`/`checkout`/`restore`(v0.18.48);`clean -f` 删除路径仍按 D-clean-pathspec 延后,不计入 P1-01 完成态。
172172

173+
**计划收口核对(2026-07-15)**:A0→CG→P0→P1→P2→IX 主线均已按任务卡落地并有对应 compat/指定测试;本轮补齐三处验收残留——(1) **P0-01** 七类 unmerged XY(单元钉死 DD/AU/UD/UA/DU/AA/UU + merge 覆盖 UD/DU/AA + 既有 UU 三路径);(2) **agent.md / INDEX** doc-truth:Subagent checkpoint 物化与 findings run-dir GC 不再误标 unfinished;(3) 发布安装步骤补 `lba` 相对 symlink(与 IX-01 `ensure_lba_alias` 一致)。其余 deferred/非目标保持:cloud tombstone 传播、fix bridge、scoped `--checkpoint` review、`clean` shared pathspec magic、`send-email` SMTP。
174+
173175
**实现进度**
174176
- ✅ **CG-01(v0.18.34,兼容分级 + 机器守卫)** — 命令级兼容等级重校准:`COMPATIBILITY.md` 顶层 `Tier` 列过粗(`partial`/`supported` 会掩盖 conflict/porcelain/config/plumbing 缺陷),新增「Sub-face compatibility grading (P0/P1-touched commands)」小节,把 44 个被 P0/P1 触达的命令按**固定五枚举子面**(`common-user-flow`/`porcelain-machine`/`conflict-aware`/`config-aware`/`plumbing-compatible`)分入「已支持 / 部分支持 / 明确不支持 / 有意差异」四栏;`docs/development/commands/_compatibility.md` 新增「子面兼容分级(CG-01)」登记,把每个 `unsupported` 子面挂到治理编号——`status`/`diff`/`ls-files` 的 `conflict-aware` 由 **P0-01** 治理,`check-ignore`/`check-attr` 的 `config-aware`(今天只读 `.libraignore`/`.libra_attributes`、不读 Git 标准来源,属真实缺口不是刻意分歧)由 **P1-02** 治理;`lfs`(D5)/`hooks`(D3)/`media`/`cloud` 的有意差异面单列。新增机器守卫 `compat_subface_labels`(`tests/compat/subface_labels.rs`,注册于 Cargo.toml + `tests/compat/README.md`):钉住五枚举(拒绝枚举外标签 + 定义表不得漂移)、分级命令集不脱离 `src/cli.rs::Commands`、**从计划 P0/P1 任务范围反向推导必须被分级的命令集**(漏 grade 即失败,`reset` 就是这条抓出来的)、同一命令一个子面不得进两档、每个 `unsupported` 面的治理编号必须解析到真实计划任务或 `D` 决策并与登记表**双向**一致、四栏表头顺序/跨文档锚点不得腐烂。验收:四栏齐全(✓)、unsupported 项均有计划编号(✓ P0-01/P1-02)、守卫 4 用例通过(✓)。
175177
- ✅ **P0-01(v0.18.35,unmerged/conflict 状态与 diff 展示)** — `status` 数据层现在从 index stage 1/2/3 收集 unmerged entries,并从 untracked 集合剔除同一路径;short/porcelain v1 输出七类 XY 映射(内容冲突为 `UU`),porcelain v2 输出 `u <XY> N... <m1> <m2> <m3> <mW> <h1> <h2> <h3> <path>`;默认长格式新增 `Unmerged paths:` 段且 `--exit-code` 把 unmerged 视为 dirty。`ls-files -u` 保持 stage 行,`ls-files -t` 不再隐藏 stage 1/2/3,按 Git 形状为每个 unmerged stage 输出 `M <path>`。默认 `diff` 对 unmerged path 移除 `/dev/null` 新增误报并追加 `diff --cc <path>` combined header(内容来自 stage/worktree 视图;删除类冲突缺工作树文件时不因读取失败中止)。`COMPATIBILITY.md` 将 `status`/`diff` 的 `conflict-aware` 上调到 partial,将 `ls-files` 的 `conflict-aware` 上调到 supported;`_compatibility.md` 的 unsupported 登记移除 P0-01,只保留 P1-02。测试:新增 `compat_conflict_status_diff`(merge/rebase/cherry-pick 内容冲突 × status v1/v2、ls-files -u/-t、diff --cc)。

docs/development/tracing/agent.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,7 +1042,7 @@ entire `cmd/entire/cli/agent/agent.go` 定义核心 `Agent`(identity 6 + trans
10421042
| entire CLI | libra 当前 | 差距说明 |
10431043
|---|---|---|
10441044
| `DispatchLifecycleEvent(ctx, ag, event)`:规范化 `agent.Event` → 框架动作 | `hooks/lifecycle.rs` 已有 `apply_lifecycle_event` + `LifecycleEventKind`(11 变体) | **Libra 已有 dispatcher 原语**;当前代码内置 provider parser(`providers/{claude,gemini}`)已只产 `LifecycleEvent`、不直接写 checkpoint(写入集中在 `runtime.rs`)。执行本文档时第一批目标是保留 Claude 路径并补 Codex/OpenCode provider;Gemini 只能作为历史实现事实,不进入 supported roster。AG-19 真实 delta 是 owner filtering + `SubagentStart/End`,并**约束未来 external-binary parser 维持同一边界** |
1045-
| 标准化 `EventType`:SessionStart/TurnStart/TurnEnd/Compaction/SessionEnd/**SubagentStart/SubagentEnd**/ModelUpdate/ToolUse(9 个) | `LifecycleEventKind` 已有 13 个变体并包含 `SubagentStart`/`SubagentEnd`;Codex provider parser/settings 已映射原生 subagent hooks;`CheckpointScope::Subagent` 物化为独立 checkpoint 仍未接通 | 已补 subagent 两事件;`CheckpointScope::Subagent` 继续作为后续 checkpoint-scope 扩展,不得误报已物化 |
1045+
| 标准化 `EventType`:SessionStart/TurnStart/TurnEnd/Compaction/SessionEnd/**SubagentStart/SubagentEnd**/ModelUpdate/ToolUse(9 个) | `LifecycleEventKind` 已有 13 个变体并包含 `SubagentStart`/`SubagentEnd`;Codex provider parser/settings 已映射原生 subagent hooks;**A0-02 已接通** `CheckpointScope::Subagent`:每个 subagent 边界物化独立 checkpoint`parent_checkpoint_id` 链回最近 committed) | 已补 subagent 两事件与独立 `scope='subagent'` checkpoint;后续仅剩 temporary-scope 等扩展 |
10461046
| Agent ownership filtering:按记录的 `AgentType` first-writer-wins,忽略非属主转发事件 |`make_dedup_key`,无 agent-kind 归属 claim | 多 provider 转发时可能重复 checkpoint;第一批仅需覆盖 Claude Code/Codex/OpenCode 的 owner claim(`SessionStart`/`TurnStart` 豁免),非首批 agent 不得触发 supported 写入路径 |
10471047
| Codex trust-gap detection:检测用户未本地批准的新 hook || 安全/透明性不足;补 `codex.HookTrustGaps` 等价(结构性 key-presence 比对,仅 Codex SessionStart banner 提示) |
10481048

@@ -1412,7 +1412,7 @@ AG-24a 合规实现与 AG-24 closeout 必须逐行核对本矩阵。若某项未
14121412
| hook 注册表 | `find_provider(name)``providers/mod.rs`,仅 `"claude"`/`"gemini"`| 字符串键、缺 codex/opencode | 当前 `providers/{claude,codex,opencode}` 已落地 first-batch provider;Gemini 仅 legacy compatibility | AG-19 |
14131413
| 能力声明 | **** `DeclaredAgentCaps`/`CapabilityDeclarer`(grep src/ 零命中,仅 E1 文档契约已冻结) | built-in 无统一能力面;external 无 8-bool 协商 | 落地 8-bool `DeclaredAgentCaps` + `CapabilityDeclarer`(E1) | AG-16/AG-18 |
14141414
| 可选能力 trait |`TranscriptTruncator``adapter.rs:242`)+ `TranscriptChunker``adapter.rs:251`,无 impl) | 缺 E1 其余能力 |`TranscriptAnalyzer/PromptExtractor/TranscriptPreparer/TokenCalculator/ModelExtractor/TextGenerator/TranscriptCompactor/HookResponseWriter/SubagentAwareExtractor/SkillEventExtractor` | AG-16/AG-21 |
1415-
| lifecycle 事件 | `LifecycleEventKind` 11 变体(`lifecycle.rs:35`|`SubagentStart`/`SubagentEnd`;未标 `#[non_exhaustive]` | 当前 13 变体 + `#[non_exhaustive]` 已落地subagent events 进入 metadata,`CheckpointScope::Subagent` 独立物化仍是后续扩展 | AG-19 |
1415+
| lifecycle 事件 | `LifecycleEventKind` 13 变体(`SubagentStart`/`SubagentEnd`)+ `#[non_exhaustive]` | | **A0-02 已落地**subagent events 进入 metadata,`CheckpointScope::Subagent` 在边界物化独立 checkpoint | AG-19 / A0-02 |
14161416
| roster | `STABLE_AGENT_SLUGS`=`claude-code`/`gemini``mod.rs:216`| 与第一批 `claude-code`/`codex`/`opencode` 不一致 | 当前删除独立常量,CLI roster 从 registry `supported_slugs()` 派生;Codex/OpenCode HookProvider 已落地,Gemini unsupported + uninstall-only | AG-17/AG-19 |
14171417
| external 安全 | `RpcAgent::spawn``rpc.rs:162``Stdio::inherit()`**`env_clear`** | 子进程继承 `*_API_KEY`/`LIBRA_STORAGE_*`/`LIBRA_D1_*` | 当前 `env_clear()` + allowlist、stderr capture/redact、settings gate、provenance、内置 slug 仿冒防护已落地;fd-exec 仍延期 | AG-18 |
14181418
| redaction | `RedactedSink``redaction.rs:219`)Phase-1 placeholder,未接 writer | 任何新持久化路径可绕过 redaction | 当前 hook ingest/checkpoint/export 路径有 redaction-before-persist 与 raw `--allow-raw` audit;未来新增 uploader/writer 仍必须保持类型/测试门禁 | AG-19/AG-20/AG-24a |
@@ -1763,15 +1763,15 @@ Special cases:
17631763
| AG-24 partial(已交付) | `compat_agent_run_non_exhaustive_guard`:已注册 | (见 `agent_run/``#[non_exhaustive]` 各 enum) | Wave 1;守卫内部 agent run 类型演进 |
17641764
| AG-17 | `command_test`:已注册 target;AG-17 五个测试已实现(2026-07-04,`tests/command/agent_roster_test.rs`| `command_test::agent_list_add_remove_aliases_parse`; `command_test::agent_list_json_contains_capability_fields`; `command_test::agent_add_non_hook_installable_returns_actionable_unsupported`; `command_test::agent_remove_gemini_uninstalls_legacy_hooks_idempotent`; `command_test::agent_remove_preserves_user_hook_entries` | `list` / `add` / `remove` alias 落地时补测试;未补前不得声称 AG-17 有 command coverage |
17651765
| AG-18 / E2 | `agent_rpc_external_test`:已注册(2026-07-04,A3 落地;顶层 tests/ 自动发现无需 [[test]]`agent.rpc.invoke` span 断言独立于 `agent_rpc_span_test`——单测试二进制规避 tracing callsite-cache 并发竞态) | `agent_rpc_external_test::info_success_registers_binary`; `agent_rpc_external_test::version_mismatch_is_skipped_with_reason`; `agent_rpc_external_test::timeout_and_oversize_are_fail_closed`; `agent_rpc_external_test::undeclared_capability_method_is_rejected`; `agent_rpc_external_test::stderr_is_capped_redacted_and_not_inherited` | Wave 1/2;原场景名 `agent_external_protocol_v2_matrix` 只作为目的说明,不再作为命令名 |
1766-
| AG-19 / E3 | `agent_lifecycle_event_test`:已注册(顶层 target,Cargo 自动发现) | `agent_lifecycle_event_test::invalid_hook_envelopes_are_rejected_before_checkpoint`; `agent_lifecycle_event_test::owner_claim_prevents_duplicate_checkpoint`; `agent_lifecycle_event_test::unknown_event_type_is_skipped_not_fatal`; `agent_lifecycle_event_test::kind_mismatch_still_fails_closed`; `agent_lifecycle_event_test::simultaneous_stop_race_yields_single_owner_checkpoints` | Wave 1;覆盖 owner claim、unknown event、kind mismatch、race closure、Gemini uninstall-only;SubagentStart/End 由 lifecycle/provider unit 与 Codex provider tests 守卫,当前不声明 `CheckpointScope::Subagent` 已物化 |
1766+
| AG-19 / E3 | `agent_lifecycle_event_test`:已注册(顶层 target,Cargo 自动发现) | `agent_lifecycle_event_test::invalid_hook_envelopes_are_rejected_before_checkpoint`; `agent_lifecycle_event_test::owner_claim_prevents_duplicate_checkpoint`; `agent_lifecycle_event_test::unknown_event_type_is_skipped_not_fatal`; `agent_lifecycle_event_test::kind_mismatch_still_fails_closed`; `agent_lifecycle_event_test::simultaneous_stop_race_yields_single_owner_checkpoints`; `agent_lifecycle_event_test::subagent_end_materializes_distinct_subagent_scope_checkpoint` | Wave 1;覆盖 owner claim、unknown event、kind mismatch、race closure、Gemini uninstall-only;**A0-02**SubagentStart/End 物化独立 `scope='subagent'` checkpoint |
17671767
| AG-19 redaction | `agent_checkpoint_redaction_test`:已注册(顶层 target,Cargo 自动发现) | `agent_checkpoint_redaction_test::raw_hook_input_is_redacted_before_persist`; `agent_checkpoint_redaction_test::tool_response_is_redacted_too`; `agent_checkpoint_redaction_test::assistant_message_is_redacted_too`; `agent_checkpoint_redaction_test::extractor_warning_does_not_include_secret_owner_or_prompt`; `agent_checkpoint_redaction_test::extraction_derived_strings_are_redacted_in_metadata` | Wave 1;与 lifecycle/checkpoint writer 同步,覆盖 prompt/tool_response/assistant/derived metadata redaction |
17681768
| AG-20 / E4 / E5 | `agent_checkpoint_export_test` / `agent_checkpoint_reader_test` / `agent_doctor_repair_test` / `command_test` agent clean/push/checkpoint slices:已注册 | `agent_checkpoint_export_test::writer_emits_all_six_e4_libra_entries`; `agent_checkpoint_export_test::content_hash_format_and_recompute`; `agent_checkpoint_export_test::chunking_large_transcript_splits_line_safe`; `agent_checkpoint_reader_test::checkpoint_list_walks_keyset_pages_without_overlap_or_gap`; `agent_checkpoint_reader_test::show_survives_missing_transcript_blob`; `agent_doctor_repair_test::class2_missing_catalog_row_detected_and_repaired`; `command_test::agent_checkpoint_rewind_dry_run_and_apply_restore_worktree_only` | Wave 1;E4 writer/export、metadata-first reader, pagination, doctor repair, prune/rewrite and push force-with-lease are split across focused targets in `tests/INDEX.md` |
17691769
| AG-20 existing rewind guard | `command_test`:已接入 | `command::agent_checkpoint_test::agent_checkpoint_rewind_dry_run_and_apply_restore_worktree_only` | `tests/command/agent_checkpoint_test.rs` 已在 `tests/command/mod.rs` 中 re-export;用 `cargo test --test command_test agent_checkpoint_rewind` 验证 |
17701770
| AG-21 | `agent_transcript_intelligence_test`:已注册(2026-07-05,A6 落地;顶层 tests/ 自动发现) | `agent_transcript_intelligence_test::claude_codex_opencode_fixtures_extract_metadata_or_partial`; `agent_transcript_intelligence_test::token_usage_mapping_uses_e6_wire_keys`; `agent_transcript_intelligence_test::missing_optional_files_return_partial_not_panic`; `agent_transcript_intelligence_test::skill_events_project_for_claude_and_codex` | Wave 2;新增时同步 `tests/INDEX.md`;若拆 target,矩阵必须同步 |
17711771
| A6.5 本地三 Agent 采集 smoke(plan.md §0.3) | `agent_local_capture_smoke_test`:已注册(2026-07-05,A6.5 落地;顶层 tests/ 自动发现无需 `[[test]]`,driver 在 `tests/harness/agent_local_capture.rs`) | `agent_local_capture_smoke_test::local_capture_smoke_codex`; `agent_local_capture_smoke_test::local_capture_smoke_claude_code`; `agent_local_capture_smoke_test::local_capture_smoke_opencode` — 每个均 `#[ignore]` + `#[serial]` + `LIBRA_RUN_LOCAL_AGENTS=1` env-gate;harness 固化 plan.md §0.3.2~§0.3.6 全流程(preflight/只读登录检查/pinned `$LIBRA_BIN` sha256/hook install 断言/真实会话(进程组超时 kill)/Libra 侧 session/checkpoint/traces/doctor 断言/卸载 smoke/redacted evidence) | Wave local-only(`tests/INDEX.md` Wave 7);CI 默认必须 skip;缺 binary/登录态时不发起付费会话、redacted 阻断原因落盘 summary.json,且(门控已显式开启时)测试以 BLOCKED panic 失败——blocked 与真实绿跑在退出码/通过数上机械可区分(2026-07-12 收敛,见 plan.md §0.3.6 失败分层);不得以 fake fixture 替代 |
17721772
| AG-22 / E8 | `agent_review_workflow_test`:已注册(顶层 target,Cargo 自动发现) | `agent_review_workflow_test::fake_reviewers_cover_success_error_cancel_and_slow_output`; `agent_review_workflow_test::review_sink_is_not_blocked_by_high_frequency_reviewer`; `agent_review_workflow_test::review_read_only_emits_findings_manifest_and_manual_attach`; `agent_review_workflow_test::review_fix_returns_unsupported_until_bridge_ready`; `agent_review_workflow_test::cancel_releases_reviewer_processes_and_locks`; `agent_review_workflow_test::review_list_cli_paginates_with_keyset_cursor_envelope` | Wave 1;fix bridge 源码锚点仍不存在,故 mandatory test 是 unsupported `LBR-AGENT-010``review_fix_bridge_enters_agent_runtime_mutating_path` 不属于当前必跑 |
17731773
| AG-23 / E8 | `agent_investigate_workflow_test`:已注册(顶层 target,Cargo 自动发现) | `agent_investigate_workflow_test::round_robin_reaches_quorum_and_max_turns`; `agent_investigate_workflow_test::stalled_cancelled_paused_and_continue_resume_are_pinned`; `agent_investigate_workflow_test::investigate_read_only_persists_state_and_findings_doc`; `agent_investigate_workflow_test::investigate_fix_returns_unsupported_until_bridge_ready`; `agent_investigate_workflow_test::concurrent_same_run_id_fails_closed`; `agent_investigate_workflow_test::investigate_list_cli_paginates_with_keyset_cursor_envelope` | Wave 1;fix bridge 源码锚点仍不存在,故 mandatory test 是 unsupported `LBR-AGENT-010``investigate_fix_bridge_enters_agent_runtime_mutating_path` 不属于当前必跑 |
1774-
| AG-24a / A8.5 compliance | `agent_audit_log_test` + command slices:已注册 | `agent_audit_log_test::audit_log_rejects_update_and_delete_but_allows_insert_select`; `agent_audit_log_test::denied_access_is_recorded`; `agent_audit_log_test::retention_defaults_are_documented_values`; `command_test::allow_raw_gate`; `command_test::agent_clean_gc_drops_expired_all_scopes_and_keeps_audit_log`; `command_test::erase_session_local_removes_rows_and_preserves_audit_log`; `command_test::agent_erasure_local_tombstone` | Wave 1/3;raw export audit, retention defaults, GC, and local erasure are implemented; findings-GC is explicitly deferred until run-state retention policy grows a deletion command |
1774+
| AG-24a / A8.5 compliance | `agent_audit_log_test` + command slices:已注册 | `agent_audit_log_test::audit_log_rejects_update_and_delete_but_allows_insert_select`; `agent_audit_log_test::denied_access_is_recorded`; `agent_audit_log_test::retention_defaults_are_documented_values`; `command_test::allow_raw_gate`; `command_test::agent_clean_gc_drops_expired_all_scopes_and_keeps_audit_log`; `command_test::erase_session_local_removes_rows_and_preserves_audit_log`; `command_test::agent_erasure_local_tombstone`; `command_test::agent_clean_findings_retention_gc` | Wave 1/3;raw export audit, retention defaults, transcript/stderr/findings run-dir GC, and local erasure are implemented**A0-09**findings run-dir GC 已落地;对象化 findings blob 的仓库级 object GC 仍 deferred |
17751775
| A0-10 cloud tombstone deferral | `compat_agent_docs_contract` doc-guard + `agent_cloud_tombstone_test`(L3):已注册 | `compat_agent_docs_contract::agent_doc_declares_cloud_tombstone_deferred`; `agent_cloud_tombstone_test::cloud_tombstone_propagation_is_deferred_for_agent_capture`(无 `test-live-cloud` + `LIBRA_D1_*` 时 skipped) | Wave 1/5;D1/R2 mirror 已生效(`cloud sync`/`restore`),deferred 的是 delete/tombstone propagation:本地 erasure 不删 D1/R2 mirror 行,`cloud restore` 会复活已擦除 capture;doc-guard 钉住此真相不可漂移 |
17761776

17771777
AG-24a/AG-24 交付时必须逐行核对:没有 target、没有具体 test function、没有 `Cargo.toml` / `tests/INDEX.md` 注册、或验收命令未覆盖,均视为测试方案未闭环。

install.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ INSTALL_DIR="${LIBRA_INSTALL_DIR:-$LIBRA_HOME/bin}"
1818
# user opts in with LIBRA_ALLOW_FALLBACK=1. Default behaviour is fail-fast so
1919
# offline installs cannot silently regress to a stale version. Bump this on
2020
# every release so the opt-in fallback remains useful.
21-
DEFAULT_VERSION="v0.18.88"
21+
DEFAULT_VERSION="v0.18.91"
2222

2323
# ─── theme (Dusk) ────────────────────────────────────────────────────────────
2424
if [ -t 1 ] && [ -z "${NO_COLOR:-}" ] && [ -z "${LIBRA_NO_TUI:-}" ] && [ "${TERM:-dumb}" != "dumb" ]; then

0 commit comments

Comments
 (0)