v2.9.0: domain-level session + assertion-driven delivery + MCP v0.8.0

- Principle #5: no skipping degradation tiers (anti AI strategic surrender)
- Phase 0 step 4: start_reverse_session() zero-arg domain auto-detect
- Phase 0.5.-1: domain assertion reverify before fingerprint matching
- Phase 5: assertion-driven delivery (verify_against_session + add_assertion)
- Core weapon: MCP v0.8.0 (78 tools), domain session + assertion section
- Error handling: AI surrender degradation tier table (L1-L6)
- Experience rules: 40 -> 46 (domain persistence / reverify / assertion ROI)
- New: references/domain-session-guide.md
- New: CHANGELOG_v2.9.0.md
- Skip v2.8.0 (process-level session design rejected)
This commit is contained in:
白夜
2026-04-18 10:00:19 +08:00
parent 94f71bfcdb
commit a5228600f4
5 changed files with 430 additions and 10 deletions
+214
View File
@@ -0,0 +1,214 @@
# 域级 Session 档案指南
> v2.9.0 新增。每个目标域维护一份持久化 Session 档案,跨任务复用反爬类型判定、指纹基准、Cookie 归因结论,避免重复侦察。
## 1. 档案结构
每个域的 Session 档案存放在 `cases/_session_archives/<domain-hash>/` 下,包含以下文件:
```
cases/_session_archives/
└── <domain-hash>/
├── session.json # 核心档案(结构化元数据)
├── fingerprint.json # 浏览器指纹基准快照
├── cookie-attribution.json # Cookie 归因结论缓存
├── assertions.json # 断言集(通过/失败/跳过)
└── notes.md # 人工备注(可选)
```
### session.json 字段说明
```json
{
"domain_hash": "sha256(domain)[0:12]",
"created_at": "ISO8601",
"updated_at": "ISO8601",
"skill_version": "2.9.0",
"anti_crawl_type": "signature | behavioral | obfuscation | unknown",
"anti_crawl_evidence": {
"initial_status": 412,
"final_status": 200,
"redirect_chain_pattern": "412→412→200",
"vmp_script_url": "**/sdenv-*.js",
"vmp_case_count": 87,
"sdk_fingerprint": ["sdenv", "FuckCookie"]
},
"tool_chain": {
"primary": "instrument_jsvmp_source",
"mode": "ast",
"fallback": "hook_jsvmp_interpreter(mode=transparent)"
},
"hot_keys_snapshot": {
"top_10": ["userAgent", "plugins", "webdriver", "cookie", "platform", "language", "screen.width", "screen.height", "hardwareConcurrency", "deviceMemory"],
"total_count": 42,
"captured_at": "ISO8601"
},
"cookie_attribution_summary": {
"signature_cookies": ["acw_tc"],
"js_cookies": ["x-bogus-js"],
"mixed_cookies": ["NfBCSins"]
},
"assertions_passed": 12,
"assertions_failed": 0,
"assertions_total": 12
}
```
## 2. 生命周期
### 2.1 创建时机
Session 档案在以下时机自动创建:
1. **Phase 0 启动时**:`launch_browser` + `navigate` 成功后,检查 `cases/_session_archives/` 下是否已有该域的档案
- 已有 → 加载并验证(跑断言集,见第 4 节)
- 没有 → 创建空档案,后续步骤逐步填充
2. **反爬类型识别完成后**:将 `anti_crawl_type` 和 `anti_crawl_evidence` 写入档案
3. **Phase 0.5 指纹采集后**:将 `hot_keys_snapshot` 和 `cookie_attribution_summary` 写入档案
### 2.2 更新时机
- 每次成功完成 Phase 5 交付后,更新 `updated_at` 和断言结果
- Cookie 归因结论变化时(如新增 cookie 字段),更新 `cookie-attribution.json`
- 用户手动触发 `session refresh` 时,重新采集指纹基准
### 2.3 过期策略
- 档案默认 **7 天有效**(`updated_at` 距今超过 7 天视为过期)
- 过期档案不删除,但加载时会标记 `stale: true`,提示用户是否重新验证
- 断言集失败 ≥ 3 条时,自动标记为 `needs_refresh`
## 3. 与工作流的集成
### Phase 0 集成
```
Phase 0 步骤 4(新增):启动域级 Session 档案
① 计算目标域的 hash:sha256(domain)[0:12]
② 检查 cases/_session_archives/<hash>/session.json 是否存在
③ 存在且未过期 → 加载档案,输出摘要:
"已加载域级 Session 档案:反爬类型=签名型,上次分析于 2 天前,12/12 断言通过"
④ 存在但过期 → 加载档案 + 标记 stale,提示用户:
"域级 Session 档案已过期(7 天前),建议重新验证断言集"
⑤ 不存在 → 创建空档案,后续步骤自动填充
```
### Phase 0.5 集成
```
Phase 0.5.-1(新增前置步骤):本域断言 Reverify
如果 Session 档案存在且包含断言集:
① 逐条执行断言(见第 4 节)
② 全部通过 → 跳过 Phase 0.5 的指纹采集,直接进入 Phase 1
输出:"断言集 12/12 通过,目标站点技术栈未变,跳过重复侦察"
③ 有失败 → 标记失败断言,进入 Phase 0.5 正常流程重新采集
输出:"断言 #3(VMP case_count)失败:期望 87,实际 102。目标可能已更新,重新侦察"
```
### Phase 5 集成
```
Phase 5 交付时自动更新 Session 档案:
① 将本次分析的断言集写入 assertions.json
② 更新 session.json 的 updated_at 和 assertions_passed/failed/total
③ 如果是新域,提示用户:"已创建域级 Session 档案,下次分析同域时将自动复用"
```
## 4. 断言系统
断言是 Session 档案的核心验证机制。每条断言描述一个可自动检测的技术事实,用于快速判断目标站点是否发生了技术变更。
### 4.1 断言类型
| 类型 | 示例 | 检测方法 |
|------|------|---------|
| `script_exists` | VMP 脚本 URL 模式仍然存在 | `list_scripts` → 匹配 URL pattern |
| `script_size_range` | VMP 脚本大小在 ±20% 范围内 | `list_scripts` → 检查文件大小 |
| `dispatch_loop_count` | VMP 分发循环 case 数在 ±10 范围内 | `find_dispatch_loops` → 比较 case_count |
| `anti_crawl_type` | 反爬类型未变(仍为签名型) | `navigate` → 检查 redirect_chain 模式 |
| `cookie_names` | 关键 cookie 名称仍然存在 | `get_cookies` → 检查 name 列表 |
| `sdk_fingerprint` | SDK 特征关键词仍可搜索到 | `search_code` → 匹配关键词 |
| `hot_keys_stable` | hot_keys top 10 与快照重合度 ≥ 70% | `get_instrumentation_log` → 比较 hot_keys |
| `response_structure` | API 响应结构未变 | `get_network_request` → 检查 JSON 字段 |
### 4.2 断言格式
```json
{
"assertions": [
{
"id": 1,
"type": "script_exists",
"description": "VMP 脚本 URL 匹配 **/sdenv-*.js",
"params": { "url_pattern": "**/sdenv-*.js" },
"last_result": "passed",
"last_checked": "ISO8601"
},
{
"id": 2,
"type": "dispatch_loop_count",
"description": "VMP 分发循环 case 数在 77-97 范围内",
"params": { "expected": 87, "tolerance": 10 },
"last_result": "passed",
"last_checked": "ISO8601"
}
]
}
```
### 4.3 断言执行流程
```
对每条断言:
① 根据 type 选择检测方法(MCP 工具调用)
② 执行检测,获取实际值
③ 与 params 中的期望值比较
④ 记录结果:passed / failed / skipped(工具不可用时)
⑤ 更新 assertions.json 的 last_result 和 last_checked
```
## 5. 隐私与安全
- **域名哈希化**:目录名使用 `sha256(domain)[0:12]`,不直接暴露域名
- **已加入 .gitignore**:`cases/_session_archives/` 不纳入版本控制
- **敏感数据脱敏**:session.json 中不存储具体 Cookie 值、密钥、Token 等
- **fingerprint.json 仅存结构**:存储属性名和类型,不存储具体指纹值(如 canvas hash)
## 6. 手动操作
### 查看当前域的 Session 档案
```bash
# 计算域名 hash
echo -n "target-domain.com" | sha256sum | cut -c1-12
# 查看档案
cat cases/_session_archives/<hash>/session.json | jq .
```
### 强制刷新档案
在对话中告诉 Agent:"刷新当前域的 Session 档案",Agent 将:
1. 清空 assertions.json
2. 重新执行 Phase 0 + Phase 0.5 的完整流程
3. 重建断言集
### 删除档案
```bash
rm -rf cases/_session_archives/<hash>/
```
## 7. 与经验库(cases/)的关系
| 维度 | Session 档案 | 经验库案例 |
|------|-------------|-----------|
| 粒度 | 单个域 | 一类技术方案 |
| 内容 | 运行时状态(指纹、cookie、断言) | 方法论(定位路径、还原模板) |
| 生命周期 | 7 天有效,自动过期 | 永久,手动更新 |
| 隐私 | 哈希化,不入 git | 脱敏后入 git |
| 用途 | 跳过重复侦察 | 跳过重复分析 |
两者互补:Session 档案回答"这个域现在是什么状态",经验库回答"这类技术方案怎么破"。