@zhushanwen/pi-cache-probe 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,11 +6,11 @@
6
6
 
7
7
  - `src/index.ts` — 探针工厂(9 个指纹 hash:7 个输入侧来自 `systemPromptOptions` + `getAllTools()`,`spFull`/`toolsSent` 来自 `before_provider_request` 的最终 payload)
8
8
  - `src/fingerprint.ts` — 指纹纯函数层(stable stringify / hash / entry 构建)
9
- - `analyze.py` — 归因分析脚本(只读,单数据源扫 session 文件)
9
+ - `analyze.py` — 归因分析脚本(只读,扫一个或多个 session 目录)
10
10
 
11
11
  ## entry schema v2(数据量精简,长期采集友好)
12
12
 
13
- - hash 为 sha256 前 16 hex;**baseline entry** 存全量 9 hash + cwd(约 250B);**normal entry** 只存变化项增量(约 120B);无变化 turn 零写入
13
+ - hash 为 sha256 前 16 hex;**baseline entry** 存全量 9 hash + cwd + startReason(实测单行约 550B,随 cwd 长度浮动);**normal entry** 只存变化项增量(单部位变化实测单行约 200B);无变化 turn 零写入
14
14
  - `seq` = 进程内 before_agent_start 触发计数,随 entry 落盘供人工排序诊断;当前无自动消费方(analyze.py 不读 seq)
15
15
 
16
16
  ## 挂载方式(长期采集)
@@ -28,14 +28,18 @@ pi --continue --extension <repo>/extensions/universal/cache-probe/index.ts "<pro
28
28
  ## 归因分析
29
29
 
30
30
  ```bash
31
- python3 extensions/universal/cache-probe/analyze.py ~/.pi/agent/sessions ~/.taiji/pi/sessions
31
+ # pi CLI 会话 + taiji runtime 会话(<dataDir>/agent/sessions,getSessionsDir 口径)
32
+ python3 extensions/universal/cache-probe/analyze.py ~/.pi/agent/sessions ~/.taiji/agent/sessions
33
+ # 可选 --since YYYY-MM-DD:只分析 mtime 在该日期之后的 session
32
34
  ```
33
35
 
34
36
  输出五部分:扫描概览 / 命中率基线 / 归因矩阵 / 进程边界漂移 / GO-NO-GO 决策建议。
35
37
 
38
+ 归因解读:第 3 部分只统计间隔 <30min、模型未切换、探针覆盖的 turn 首笔 miss,按前缀是否变化分档——「前缀变化(可修)」档指向可固化的前缀漂移;「前缀未变仍 miss」档指向服务端淘汰 / 链盲区(不可修)。第 5 部分:归因矩阵有效 turn 满 200 后,按「前缀变化贡献的 miss token 占比」给倾向——占比 ≥50% → GO,≤30% → NO-GO,之间为混合成因需人工决策。
39
+
36
40
  ## 已知限制(实测查明)
37
41
 
38
- - pi CLI 启动路径(`--session` / `--continue`)的 session_start reason 恒为 `startup`(`resume` 仅运行时 switch session 出现)——跨进程识别靠 baseline 标记 + 时间戳 gap,漂移检测靠 hash 对比,均不受影响。
42
+ - pi CLI 启动路径(`--session` / `--continue` / `--resume`)的 session_start reason 恒为 `startup`(pi 侧只做 SessionManager.open/continueRecent,不走运行时 switch 路径;`resume` / `new` / `fork` 仅运行时 switch/fork 出现,`reload` 仅 /reload 出现)——跨进程识别靠 baseline 标记 + 时间戳 gap,漂移检测靠 hash 对比,均不受影响。
39
43
  - 同进程内修改 AGENTS.md 不进 system prompt(pi 启动快照),contextFiles 漂移只出现在跨进程边界——pi 的行为,不是探针缺陷。
40
44
  - 真实环境实测发现:extension 链(如 subagent-workflow)存在每 turn 级的 system prompt 动态注入,由 spFull 单独捕获——这正是它存在的价值。
41
45
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhushanwen/pi-cache-probe",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Zero-impact Pi probe extension — records system prompt / tools fingerprint hashes into session custom entries (only on change) to attribute LLM prompt-cache miss to prefix drift vs server-side eviction.",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -26,14 +26,14 @@
26
26
  "analyze.py"
27
27
  ],
28
28
  "dependencies": {
29
- "@zhushanwen/pi-ext-guards": "0.4.1"
29
+ "@zhushanwen/pi-ext-guards": "0.4.3"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@vitest/coverage-v8": "^4.1.9",
33
33
  "vitest": "^4.1.8"
34
34
  },
35
35
  "peerDependencies": {
36
- "@earendil-works/pi-coding-agent": "^0.84.4"
36
+ "@earendil-works/pi-coding-agent": "^1.0.0"
37
37
  },
38
38
  "scripts": {
39
39
  "typecheck": "npx tsc --noEmit",
@@ -62,8 +62,9 @@ export function hashOf(value: unknown): string {
62
62
  * (pi 源码 ai/src/api/openai-completions.ts 的 useDeveloperRole 分支)
63
63
  * - Anthropic:顶层 system(数组)
64
64
  * - Google:顶层字段 systemInstruction 为对象形态——仅手工伪造的输入可达:
65
- * pi-ai 0.84.4 实装(google-generative-ai.js:294 / google-vertex.js:368)恒传
66
- * string(sanitizeSurrogates(context.systemPrompt)),isRecord 分支对 string
65
+ * pi-ai 1.0.0 实装(dist/api/google-generative-ai.js / google-vertex.js 的
66
+ * systemInstruction: sanitizeSurrogates(...))恒传
67
+ * string,isRecord 分支对 string
67
68
  * 恒不命中,故实装流量下 Google 侧返回 null(spFull 观测恒 no-system)。
68
69
  * 归因是「提取只认对象形态」而非「Google 请求没有 system」,勿把下方
69
70
  * isRecord(systemInstruction) 分支误读为 Google 口径主通路。