rpdiag 方法论(v3.28.0)

rpdiag 评分由主理人 prehisle 主观加权得出,仅供 RelayPulse 平台内部参考。 本页公开当前权重表与版本规则,所有数值均与源码中的权重常量对应,可在仓库中追溯。

定位

  • 是什么:与对应服务官方 CLI 基线在 24 维协议/行为观测上的加权相似度(0–100)。
  • 不是什么: 不是"商家是否掺假"的判定,不是商誉评价,也不是购买决策依据。
  • 权重是主理人的主观判断; 每个维度的 0–10 评分是客观技术测量(任何人可用同样的抓包数据复现)。
  • 中转商在 RelayPulse 提交收录入驻即同意本方法论;详见 入驻协议

评分公式

overall_score = Σ(weight × dim_score) / Σ(weight) × 10
              ↑                          ↑
              主观加权                    24 维客观观测(每维 0-10)

基线对照:候选与官方近 3 次基线滚动窗口(有 1-2 次也直接使用)。无 eligible 历史基线时才回退到当组同跑的单次基线, 评分内嵌 baseline_window.samplesmethodology_version / weights_hash 字段,让历史排名行可追溯当时使用的权重快照。

多服务评分(Claude Code / Codex)

rpdiag 现在同时评分两个 CLI 服务,每个服务只与自己的官方基线对照、互不混算:

  • Claude Codeservice=claude):基线是官方 Claude CLI, 按请求模型配对对应官方模型(opus / sonnet / haiku 系)。下方权重表即此 profile, 也是维度最完整的一套。
  • Codexservice=codex,走 OpenAI /responses 协议): 基线是官方 Codex CLI(gpt-5.5 主 + gpt-5.4)。复用同一套维度库与方法论框架, 但底层不是 Anthropic wire,一批 Anthropic 专属维度对它标 N/A

N/A 维不计入分母、不是记 0——避免拿 codex 本就没有的协议表面去冤枉它。 对 codex 标 N/A 的包括:缓存族(cache_*,内嵌 Anthropic 5m/1h TTL 与上下文连续性语义)、 Anthropic 信封形状(anthropic_msg_id_format / anthropic_request_id_passthrough)、 响应体专属字段(service_tier_present / inference_geo_present)、 扩展思考表面(thinking_present / thinking_volume_match / self_identity_consistency)、 信封自报一致(envelope_self_report_match,依赖 Anthropic message_start 信封 + Claude 自报信号,codex /responses 两者皆无)、 Claude 分级知识题(world_knowledge_tier_match)、 Claude-CLI 档位判别题(tier_thinking_volume_match,数字计数题靠 step-6 思考量分档, gpt 无对应阶梯且 codex flow 无该步)、 以及口径仍是 Anthropic 风味的 stop_reason_present / sdk_consistency

codex 真正参与评分的是服务无关核心model_match(改读上游 response.completed 信封 model 而非请求回显, 抓「换了模型但信封仍诚实」的中转)、 identity_structured_match(vendor/brand 由基线自报推导、点版本容忍—— gpt-5.x 自报 gpt-5 不算降级;v3.25.0 起 brand 接受 codex/gpt 同义,治端点逐 run 自报抖动误扣官方基线)、 cutoff_matchsystem_prompt_cleanidentity_free_cleanknowledge_recall_match(跨版本知识召回,两服务共用的主力判别维,权重 12)、 buffer_dump_matchlatency_baseline_match

因为每个服务的 active 维度集与权重总和不同,分数在各自基线坐标系内归一化—— 跨服务比绝对分没有意义排名页按服务分板正是这个道理。 每条评分都内嵌 scoring_profile / profile_version / not_applicable_dimensions,可追溯当时用的是哪套 profile。

当前权重表(v3.28.0,合计 190)

下表是 Claude profile 的完整维度;codex 会把其中 Anthropic 专属维度标 N/A(见上节)。 权重是占比而非绝对分数——加强或弱化某一维只需改它自己的整数, 其余维度由后端按当前 active 维度的权重总和自动稀释或抬升。

模型与缓存

合计权重 76
维度 权重 说明(一句话中性术语)
cache_hit_ratio_match 20 与官方 baseline 比较缓存命中比例 sum(cache_read) / sum(total_input)(Claude 最多 5 步;codex 只取缓存连续的前 4 步、排除 fresh 召回步)。候选低于 baseline 20% 以内满分,低于 50% 记 0;体现 wrapper 是否在保留 cache_read 字面量的同时膨胀了未命中输入。
cache_continuity_intra 14 相邻步骤的后一步输入要覆盖前一步输入加输出的至少 85%,发现会话上下文丢失或缓存断裂。
model_match 14 所有步骤响应的 model 字段必须都等于请求模型;分数 0 直接拉低总分但不再触发 v2.5 时代的 cap。
cache_sliding_correctness 13 步骤 1/2/3 应有 cache_read,且步骤 2 的 carry-over 至少保留步骤 1 的一半(5 分钟 sliding 行为)。
cache_ttl_consistency 15 与官方 baseline 对齐 TTL 表面(5m/1h 键暴露);仅看协议形状,缓存命中比例从 v2.4 起拆分到 cache_hit_ratio_match。v3.1 把权重从 3 抬到 15:v3.0 删 cap 后,"中转商剥离 1h 缓存表面"必须靠权重来惩罚。

身份与知识

合计权重 60
维度 权重 说明(一句话中性术语)
self_identity_consistency 8 v2.5 新增:rpanalyze 从 SSE thinking_delta / text_delta 提取 Claude 自报模型 id,与 request.model family/major 比对;冲突记 0。Step 1 visible 已被 identity_structured_match 覆盖,自动跳过避免双算。
envelope_self_report_match 3 v3.21.0 新增(仅 claude):把同一响应内的「信封 release ⊕ 自报 release」按精确点版本互比(信封 message_start.message.model 被改写成请求版本时,第 1 步结构化身份回答仍可能泄露另一 release)。仅在同族同大版本下判定(不双算族/档信号);date-only 构建号经固定历史表解析;无可比对则跳过、不扣分。codex 等非 claude 服务 N/A。**v3.24.1 调轻(权重 6→3)并去除「实锤替换」口径**:同档位冲突无法区分「真同档降级」与「诚实删除 # Environment 系统块」——后者让真模型丢身份注入、自报更旧 release,触发同样的冲突,而 knowledge_recall + tier 在近版(如 sonnet-4-5 vs 4-6)上分不开。删官方提示词仍是保真度偏差、该扣,故保留惩罚但调轻;区分近版的重活交给 knowledge_recall。
thinking_present 4 v3.1 新增:thinking_detected 表示该步 SSE 是否开了 thinking content block(与 thinking_volume_match 看的 thinking_delta 流式量不同源,block 开了却 0 个 delta 是合法传输指纹)。当官方 baseline 至少一步开了 thinking block 而候选全流程都没开时记 0;两边都无 thinking block 时跳过维度(active_weight 归零)。检测中转商把 thinking-capable 模型替换为非 thinking 后端。
thinking_volume_match 6 v3.1 新增:候选 5 步 thinking_event_count 总和 vs 近 3 次官方 baseline 各自总和的中位数。0.5x-2x 满分;下侧 0.3x 线性降到 0(强相似度惩罚截断),上侧 3x 线性降到 0(容忍 Claude 推理变异);baseline 中位数=0 时跳过。
tier_thinking_volume_match 8 v3.20.0 新增(仅 claude):第 6 步数字计数题(数一段 72 位随机数字串里某几个数字的出现次数),在系统提示「只回最终紧凑 JSON、不要推理」+ fresh 单轮会话 + effort=low 下,用候选 step-6 output_tokens(思考体量)与近 3 次同条件官方基线的中位数比 ratio(复用 thinking_volume_match 的 0.5x-2x 满分、下侧 0.3x / 上侧 3x 归零分带)。opus 遵从「不要推理」秒答跳过数数(~19 tok)、sonnet/haiku 仍照数(数百~数千 tok),借此抓「中转商把 opus 通道静默降级成更便宜档位」的同厂降级。baseline-grounded:不硬编码绝对阈值(随模型代漂移),opus 绝对值漂了基线同步漂、诚实 opus 仍满分,只有 opus/sonnet 的体量 separation 本身崩了才失效。信号本质是指令遵从癖(条件敏感):指令必须走系统提示、且必须 fresh 单轮,正文放指令或续接多轮会话都会让 opus 也开始数数而塌进 sonnet 档。候选无第 6 步、或基线无同条件样本时跳过(active_weight 归零)。codex 等非 claude 服务 N/A。
identity_structured_match 7 v3.5 起 baseline-aware:仅当近 3 次官方 baseline 至少有一次产出合法 vendor/brand/model 三行时启用;baseline 全部拒答或破格式时该维度 skip,active_weight=0,不冤打那些"跟着官方一起拒答"的候选。启用后,候选结构化身份回答必须只有这三行,且与 Anthropic / Claude / 请求模型一致。
cutoff_match 5 v3.4 起:候选知识截止月份与近 3 次官方基线月份的 mode 对齐(平票取最新一次 baseline);偏差越大扣分。baseline window 内可解析月份不足 2 个时回退最新单次 baseline;baseline 完全不可用时跳过维度。v3.18.0 起探针只问「可靠知识截止(reliable knowledge cutoff)」框架:早先随机轮换里夹带的「训练数据截止 / training data cutoff」措辞会让真模型报出更宽的训练数据日期(而非烤进自我认知的可靠截止),在多轮会话+步间延迟的真实路径下被放大,造成基线 cutoff 双峰、误判 cutoff_match=0;裁剪到稳定的知识截止措辞后源头消抖,评分逻辑不变。v3.26.0 权重 7→5:这是自报的软信号,把判别重活让给 knowledge_recall / tier 等硬探针。
identity_free_clean 7 自由身份回答中出现强 wrapper 自称(如「我是 Kiro / Antigravity / Augment / RooCode / Windsurf / AnyClaude / Cline」)时记为 0;不再触发 cap,但 7 分权重的损失会直接体现在总分。v3.8 起列表扩到 10 项以覆盖 2026-05 后入榜的新 wrapper。
knowledge_recall_match 12 v3.14.0 起的第 4 步主力知识维度(服务无关):一组中性、带确切日期的公共事实,按 2024Q1→2025Q4 季度网格排布(每季度 2-3 题,纯体育/科学/奖项,已剔除选举/政府任命题以避免拒答被误读为无知),在工具/联网禁用下让模型仅凭参数化记忆作答,得到「召回向量」,与同版本官方基线的召回向量逐题对照。只惩罚「基线已知却答错/不知」(降级信号),「比基线知道得更多」不扣分;基线已知题(命中率 ≥ 0.6)不足 4 道、或跨度不足 3 个季度则跳过。任何联网/工具痕迹一律判 0(绝不跳过,防止中转商靠开搜索蒙混)。v3.16.0 起题集换成经真实 CLI 路径实证的季度网格(claude opus/sonnet/haiku + codex gpt-5.5/gpt-5.4 五个官方基线)。坑:codex 默认 medium 推理会让 gpt-5.4 把确知的旧事实「想」成不确定而误答 UNKNOWN(默认档下一度只召回约 3/17,并非真不知道),故 v3.17.0 起把召回步固定到最低推理档;2026-06-25 起 codex 统一发 `none`(真实 CLI 实证 `none` 与 `minimal` 在 gpt-5.4 上逐题判分一致,且兼容只认 `none` 的严格上游)。固定后 gpt-5.4 召回回升到约 12/17、与官方基线稳定对齐。评分始终是候选与同版本官方基线的逐题对照:声称为某版本却召回更少 late-window 事实的后端即露出降级;事实集与逐题公式不变(Claude 路径不受影响)。补上了 model_match 在「信封被改写」时无行为兜底的缺口。
world_knowledge_tier_match 12 (v3.14.0 起为遗留维度,仅对历史 {"a":[...]} 数据生效;新流程改用上面的 knowledge_recall_match,二者按第 4 步输出 schema 互斥,同一 flow 只有一个计入。)旧逻辑:第 4 步用 5 道公共事件硬事实题推断实测能力 tier(haiku / sonnet / opus),与请求模型声明的 tier 对照;低于声明 ≥ 2 档记为 0。codex 等非 Claude 服务对其 N/A。

上游协议表面

合计权重 34
维度 权重 说明(一句话中性术语)
anthropic_msg_id_format 8 响应 message_id 是否保持 Anthropic 原生 msg_01 前缀(中转改格式通常意味着 rebuild shim)。v3.1 从 4 抬到 8,作为 rebuild shim 的强信号。
service_tier_present 6 响应体 usage.service_tier 等字段是否稳定出现(Anthropic 原生通常带,wrapper 经常漏)。v3.1 从 3 抬到 6。
inference_geo_present 5 响应体的 inference geo 字段是否稳定出现(同上)。v3.1 从 2 抬到 5。
system_prompt_clean 8 比较候选与 baseline 的 step 0 输入体积,识别候选侧注入或剥离 system prompt 的情况。v3.2 从 4 抬到 8——与 anthropic_msg_id_format / self_identity_consistency 并列:实测 wrapper 可注入 +5207 tokens 或剥离 -16499 tokens 而原权重 4 仅与 stop_reason_present (3) 一档,与信号强度严重不匹配。
anthropic_request_id_passthrough 2 HTTP 响应 request_id_chain 中是否出现 Anthropic 原生 req_01 id。v3.10.0 起链中任意位置命中即满分(中转/CDN 把自己的 id prepend 到前面属正常链路形状,不算质量损失),命中位置以 req=True@N 留在 evidence 供取证;空链仍记 0。v3.1 权重从 1 抬到 4,v3.26.0 再调回 2——它是协议表面里最弱的信号,"header 透传缺失"比"rebuild shim"更常是无心 nginx 配置问题。
stop_reason_present 3 四步响应需要返回允许的 stop_reason 字段(end_turn / max_tokens / stop_sequence 等)。
sdk_consistency 2 四步的 sdk_name 需要一致且非空;陌生 SDK 名只作为提示,不直接扣高分。

流式投递

合计权重 5
维度 权重 说明(一句话中性术语)
buffer_dump_match 5 v3.19.0 新增、v3.22.0 重写的传输层维度:用第 4 步(knowledge_recall)的"可见文本投递跨度" visible_text_span_ms(最后一个 text_delta 时间 − 第一个 text_delta 时间,全程在 chunk 时间线内)与近 3 次官方 baseline 的中位数比较。真流式逐步吐可见文本、跨度宽;中转商"攒满整段再一次性 dump"(假流式)则把可见文本压在末尾一股脑发、跨度塌向 0。跨度纯按 text_delta 计、构造上排除 thinking 块——sonnet/haiku 会先流一大段思考再出文本,旧版用首个 content_block_delta(含 thinking)做窗口会把末尾文本 dump 误判成正常,新版不会。候选跨度 ≥ 70% baseline 满分、≤ 25% 记 0、中间线性,比 baseline 更慢/更分散不扣分;候选有实质输出却只有 1 个可见文本块即视为塌缩判 0。输出 < 100 token / 截断 / baseline 样本 < 2、以及 **baseline 自身可见跨度过小(< 500ms,如 haiku 在长思考后秒吐文本)都跳过**——那是观测信息不足、无渐进投递参照,而非可隐藏的信号。第 3 步过短("50 字以内")撑不起流式特征,故 v3.22 移到第 4 步并退役了配套的 stream_pacing_match(其 ≥5 text_delta chunk 的要求在 Claude 的投递粒度下基本不可达)。**这是传输层差异,不代表模型被替换或降级**——分低只说明"疑似攒批假流式",与模型真假是两回事。

延迟

合计权重 15
维度 权重 说明(一句话中性术语)
latency_baseline_match 15 用 HTTP TTFB(响应头到达)与总耗时相对官方 baseline 的比值评分(取前 4 个轻步骤的中位数,两项各占一半);候选比基线更快不扣分。v3.25.0 起对照的是「同一对比组内、同时刻测得的官方基线」(而非历史滚动基线)——延迟是唯一强时变量,同时刻共测才能抵消时段网络波动,避免某天基线偏慢就让所有通道虚高满分。满分门槛同步收紧到 ≤1.5×(≥3× 记 0、中间线性),让稳定明显偏慢的通道如实扣分。只取前 4 步是因为第 4/5 步重在模型思考耗时(属 tier 信号、另维评分),非传输延迟。v3.26.0 权重 5→15:v3.25.0 改用同时刻共测官方基线后,稳定偏慢已是可信的服务质量差距,值得重权。

版本治理

  • SCORING_VERSION bump 规则:维度增减或 scorer 内部聚合方式变化 → minor (v3.1);纯权重数值调整 → patch (v3.0.1)。每次 bump 同步更新前后端的常量与本页。
  • 历史可追溯:每个 fingerprint_assessment 内嵌 methodology_versionweights_hash。ranking 默认 ?scoring_version=all 混算各版本冻结分(cutover 期老分仍可见、不被洗掉),但只统计近 30 天内的样本,可加 ?scoring_version=current 切到仅当前版本的严格视图。
  • 方法论变更:按 入驻协议 第 6 条,评分迭代不视为重大变更,发布前会在 relaypulse.top 公告。
  • 权重 changelog:本文件 apps/web/src/data/methodology.ts 与后端 services/api/app/fingerprint_scoring.py 的 git history 即权重变更的完整记录。

不做什么

  • 不向用户输出 verdict / cap 等定性标签;UI 不显示"模型替换" / "包装层暴露"等结论。
  • 不做 Anthropic 漂移变点检测;上游策略变更期接受短期评分波动。
  • 不做下架审核:中转商对评分有异议,欢迎邮件 [email protected]