# nexify × pdf-inspector 跨语料健康/规模测试报告

- **日期**: 2026-09-02
> **注记（2026-09-03）**：验证基建已迁移，本文旧路径 `~/workspace/...` 现为 `~/clawspace/nexify-verify/...`（graphify-codewhale → comparison）。正文路径保留为历史事实。
- **对象**: `~/workspace/pdf-inspector-snapshot`(firecrawl/pdf-inspector,commit `65b7fa1`,27M,55 .rs,单 package + napi/wasm 子 crate,混合 napi/wasm/examples/tests 布局)
- **工具**: nexify release(extract_version=11,#M4-post-1~4 后,commit 8aeafca)
- **性质**: 单语料健康/规模验证(小代码量仓库对照)
- **运行环境**: 同 2C VPS,纯本地 tree-sitter

## 1. 规模与性能

| 指标 | codewhale | Zed | pdf-inspector |
|---|---:|---:|---:|
| workspace crate | 21 | 245 | **1(单 package)+ 2 子** |
| 代码文件 | 1,976 | 4,018 | **55 .rs** |
| 节点 | 153,640 | 209,822 | **13,349** |
| edges | 223,687 | 308,854 | **15,833** |
| calls 边 | ~103k | 127,110 | ~5.4k |
| **冷建图** | 33.5s | 89.0s | **1.5s** |
| extract | 26.1s | 48.8s | 1.26s |
| resolve | 7.3s | 40.1s | **0.21s** |
| pending | 128,392 | 241,473 | 9,028 |

**性能判定:小库 1.5s 冷扫,resolve 0.21s(9,028 pending)——性能与库规模线性合理。** 无异常。

## 2. 绑定质量总览

### calls 边按 confidence/state(pdf-inspector)

| confidence/state | 数量 | 占比 |
|---|---:|---:|
| EXTRACTED / extracted | 3,130 | — |
| INFERRED / extracted | 153 | — |
| INFERRED / resolved | 603 | — |
| AMBIGUOUS / resolved | 4 | — |
| UNRESOLVED / resolved | 1,553 | — |

### 跨文件绑定率(核心对照)

| | codewhale v11 | Zed | pdf-inspector(全) | pdf-inspector(仅 .rs) |
|---|---:|---:|---:|---:|
| 绑定率 | 38.7% | 38.1% | 27.9% | **39.1%** |
| AMBIGUOUS 占比 | 0.5% | 9.7% | 0.2% | 0% |

**✅ 核心结论:仅 .rs 调用方绑定率 39.1%,与 codewhale 38.7% / Zed 38.1% 完全持平——nexify 在小库上绑定能力同样正常。** 全量 27.9% 是被 tests/ 下 **Python 测试文件**(.py,nexify 不解析)的调用拉低的假象,非真实退化。

## 3. 发现的问题

### 🟠 漏绑面:单 package 非 workspace 的 crate 根路径解析缺失(233 条)

pdf-inspector 是**单 package**(根 Cargo.toml 无 workspace 段),`workspace_crates` meta 为空。nexify 的 crate 路径解析(M4 §6)依赖 workspace_crates 映射,对单 package 的 **`pdf_inspector::xxx` 根限定路径**不工作:

```
tests/integration_tests.rs:4  use pdf_inspector::extractor::group_into_lines;  // crate 根路径
src/lib.rs:36                  pub mod extractor;
src/extractor/mod.rs:40        pub use layout::{group_into_lines, ...};       // 模块级 re-export
src/extractor/layout.rs:2049   pub fn group_into_lines(...)                    // 真定义
```

- **26 个项目内符号、233 条漏绑**(扣除 std/Python 后的项目内 UNRESOLVED):
  - **167 条**:tests/examples 的集成测试从 crate 根 `pdf_inspector::xxx` 导入(crate 根模块路径解析缺失)
  - **66 条**:src 生产代码内部漏绑——`pub use layout::x` / `pub(crate) use layout::x` **模块级 re-export 链**未解析(同 crate 内跨模块上提),如 detect_columns、detect_tables、filter_markdown_page_numbers
- **机制**:这是第 4 类 re-export 缺口(#M4-post-3 处理跨 crate pub use、#M4-post-7 处理 glob,都没覆盖**同 crate 模块级 pub use/pub(crate) use**);加上单 package 根路径解析缺失
- **修复方向**:a) crate 根限定路径:非 workspace 单 package 时,把 package 名映射到 src/(`pdf_inspector::x` → src/x.rs);b) re-export 索引纳入同 crate 模块级 `pub use module::sym`

### ✅ 未复现的误绑簇(全部阴性)

| 簇 | 结果 |
|---|---:|
| Err 构造器 → type alias | **0** ✅ |
| 生产 → tests 目标 | **0** ✅ |
| contextual/snapshot/env_lock | **0** ✅ |

### ✅ 绑定正确性抽查(6/6 正确)

| 调用 | 目标 | 判定 |
|---|---|---|
| `extractor::extract_positioned_text_with_folio_context(...)` | extractor 模块 | ✅ 限定路径 |
| `FontCMaps::from_doc_pages_fast(...)` | tounicode | ✅ 关联函数 |
| `text_utils::effective_width(item)` | text_utils | ✅ 模块限定 |
| `Table::new(...)` | tables | ✅ 构造器 |
| `replace_file_atomic(...)` | (utils) | ✅ |
| `add_object(...)` | (测试辅助) | ✅ 测试内 |

**带限定路径/关联函数的调用全部正确,漏绑集中在"裸名 + re-export 导入"形态。**

## 4. 布局专项检查(napi/wasm/external/examples)

| 目录 | 发现 |
|---|---|
| `napi/`(napi crate) | 独立 crate,正常扫描,无夹具式误绑 |
| `wasm/` | 同上,正常 |
| `external/bcmaps` | 数据文件(非 .rs),无影响 |
| `examples/` | 少量 .rs/.py,调用漏绑(计入 233 条,同 crate 根路径问题) |
| `tests/` | **Python 测试文件占多数**(.py),nexify 不解析 → 产生 UNRESOLVED 假象(把绑定率从 39.1% 拉到 27.9%),非误绑 |

**未发现 Zed 那种夹具/假 crate 混入误绑**(pdf-inspector 无 test_fixture 类目录)。

## 5. 结论

- **小库泛化 ✅**:仅 .rs 绑定率 39.1% 三库持平;误绑簇零复现;限定路径/关联函数/构造器绑定全对;性能 1.5s 线性合理
- **发现一个漏绑面(233 条)**:单 package crate 根路径 + 同 crate 模块级 re-export 未解析——codewhale(纯 workspace 多 crate + 显式跨 crate re-export)和 Zed(245-crate workspace)都没暴露,是**小库单 package 形态专属缺口**
- **无精度问题**:零误绑簇复现,AMBIGUOUS 仅 4 条
- 修复优先级:中(233 条绝对量小,但机制通用——任何单 package 库都会踩;修复也便宜)

## 附:产物

- 缓存:`~/workspace/pdf-inspector-snapshot/.nexify/cache.db`(extract_version=11,1.5s)
- 归档:`~/workspace/nexify-cache-baselines/cache-pdf-inspector-65b7fa1-v11.db`
- 关联 issue:建议记 #M4-post-9(单 package crate 根路径 + 同 crate 模块级 re-export)
