## 用户结果 / Spec 缓存和证据能够识别「根包版本未变,但传递依赖/补丁/实际 bundler 已变」。身份来自实际消费项目与安装结果,不只抄 package.json 声明的 vite-plus 字符串。 ## 审计依据 / 证据边界 基线 cacheHitAnswersThisRun 检查根包版本、Vite+、target/smoke;readToolchainIdentity 读声明字符串。未在本次审计运行完整升级实验,因此本票先构造确定性复现,不把风险写成已经发生的用户数据错误。 ## Plan 1. 根包 A 保持版本,分别改变 B 传递版本、pnpm patch、实际 rolldown 版本,记录当前指纹是否变化。 2. 先采用保守身份:安装锁文件内容摘要、补丁内容摘要、影响解析的项目配置及实际使用的工具版本;缺失信息显式未知。 3. 标明摘要范围与无关依赖变化导致的保守失效;以后优化可达子图,本票不做自研包管理器。 4. 路径可移植,不把绝对机器路径/凭证写入 lock;相同真实输入在不同目录得到相同身份。 5. 提供统一身份输出供缓存/lock freshness 消费,避免 dev/CLI/build 各自读取一套版本。 ## 验收 - [ ] 修改传递依赖、补丁或实际构建工具,身份必变;仅换绝对项目目录不变。 - [ ] 记录具体实际 Rolldown/Node/Vite+ 等必要版本,不混淆 Vite+ 自带与独立依赖版本。 - [ ] 不可确认安装状态时不能生成貌似完整的验证身份。 - [ ] 类型、序列化和兼容策略有测试与明确交接;旧 lock 仍可诊断读取。 ## 范围 dependency-resolver identity/install-graph/fingerprint 与最小 core 类型扩展。与 ESM 定位票协调复用入口。无需真机;不改策略、不删除旧证据、不为语义未变的重构无理由升级协议。 ## Dependencies Parent: #81 Depends on: none. Acceptance depends on: none. Related: #8, #17, #24, #89. <!-- fgc-board {"schemaVersion":1,"kind":"task","track":"cache","parent":81,"dependsOn":[],"acceptanceDependsOn":[],"related":[8,17,24,89],"externalBlockers":[]} -->
Activity
fix(probe): make install identity independent of checkout and path sp…
fix(test): supply the install-graph axis where the example's graph is…
fix(probe): close three identity gaps review found (#94)
fix(probe): stop guessing which lockfile owns the install (#94)
fix(probe): stop trusting the declared package manager (#94)
fix(probe): an ancestor lockfile is not proof it owns this install (#94)
fix(probe): record what the manager installed, not only its inputs (#94)
fix(probe): compare one canonical spelling when attributing an install (
fix(probe): close three gaps review found in the install-result axis (#…
fix(test): place the spelling case under the cwd, and assert what it …
fix(probe): digest artifact identities, not only paths and layout (#94)
fix(probe): digest link targets and the exact Node version (#94)
fix(probe): reach transitive links, and keep the identity out of its …
fix(probe): an incomplete link walk says so instead of reporting a va…
fix(probe): read the store pnpm recorded, and the files an injected c…
fix(probe): read a built slot's files, and normalize an absolute copy…
fix(probe): an empty build record means unknown, not "nothing was bui…
fix(probe): a build policy that left no record is answered from the d…
test(probe): pin the unreadable external tree the round-12 fix left u…
fix(probe): match pnpm's build triggers, and match the stat seam by t…
fix(probe): file build triggers apply without a manifest, and a failu…
fix(probe): union the record's built slots with the disk's, not one o…