DOCUMENTARY RESEARCH / EN-IE7 EVIDENCE RUNS · PUBLIC EVIDENCE REVIEWED
AXIALPROOF / RESEARCH LAB

MEASUREMENT SPECIFICATION

开放数据集与复现规范

测量并保证 AxialProof 全部指标数据集在「字段契约、缺失编码、时间与溯源、脱敏、完整性、版本与许可」六个维度上达到可验证水平,使第三方仅凭公开发布包(无需联系我们、无需任何账户或资金)即可重算出文章中出现的每一个数字,并把「这套数据到底有多可复现」本身量化成可发布的分数。

METRIC ID
AXP-REPRO-v1
PROCEDURES
7
RECORDED FIELDS
121
DATASET
NOT COLLECTED
DATASET / NOT COLLECTED

This page publishes a measurement specification, not results. No figure on it was produced by running the protocol against any venue. When a dataset exists it will be released separately, versioned against the metric identifier above, with the raw responses and their checksums attached.

RATIONALE

WHY THIS NEEDS A STANDARD

普通评测站发布结论,不发布让结论可被推翻的东西。即使发了表格,也常见四类病:①缺失值用「—」「N/A」「暂无」或 0 混编,读者分不清「我们没测」「平台确实为空」「不适用」「被拦截」——第四种恰恰是关于平台的发现,被当成数据空洞埋掉了;②时间戳无时区、无时钟校验,延迟与成本类数字跨平台不可比,半年后也无法判断变化是平台变了还是采集方式变了;③正文里的数字与附表对不上,因为从没有人在发布前做过「文章数字 ← 数据集重算」的一致性核验;④「数据」里混着从平台文档、条款、注册登记里抄来的声明,与实测值放在同一列,读者无从知道哪一行是我们做过的、哪一行只是平台自己说的。结果是:没有人能验证我们,也没有人能在下一个季度用同样的方法重做一遍看趋势。本基准的立场是——可复现性不是编辑美德,是一个可以被测量、可以打分、可以不及格的量。它是整个刊物区别于评测站的地基:其它所有 AXP-* 指标的数据都必须落进这份契约,否则不予发布。

OUTPUT

WHAT GETS PUBLISHED

发布两件物,互相用哈希绑定。 一、方法页 `/methodology/axp-repro-v1`(规范本体,可被其它所有 AXP-* 指标引用): - 规范全文与版本历史;schema 冻结时间与文件哈希 - 脊柱字段表(28 列,逐字段含中英文定义、类型、单位、值域、缺失时的合法状态) - 四类观测(measured / derived / documented / third_party)的定义与各自的证明边界 - status 七值词表与聚合规则表(哪些进分子、哪些进分母、null 是否等价于 0) - 时间与时钟纪律(RFC 3339 / 单调时钟 / 偏移阈值 250 ms 与 1000 ms) - 脱敏规则、扫描规则集版本、链上证据两级发布规则 - 发布前自检清单 C01–C20 及其闸门;25 种植入缺陷对照的检出明细 - 容差表规则、许可分层与第三方材料政策、勘误与右复权流程 - 复现能力仪表盘:历次发布的 R_c、TTFF、D_doc、外部尝试次数与结果 二、数据集 `axp-repro-v1_dataset_vX.Y.Z`(不可变路径 + `/latest` 指针 + 至少一个镜像): `datapackage.json`、`schema/*.json`、`vocabularies/*.csv`、`platforms.csv`、`runs.csv`、`clock_checks.csv`、`observations/<metric_id>.csv`(各指标观测表,共用脊柱列)、`extensions.csv`、`aggregation_rules.csv`、`coverage_summary.csv`、`na_justifications.csv`、`status_adjudication.csv`、`figures.csv`、`claims.csv`、`redaction_log.csv`、`leak_scan_report.json`、`preflight_report.json`、`seeded_defect_report.json`、`cell_audit.csv`、`reproduction_report.csv`、`drill_log.csv`、`availability_checks.csv`、`MANIFEST.csv`、`SHA256SUMS`(可选签名)、`CHANGELOG.md`、`ERRATA.md`、`THIRD_PARTY.md`、`LICENSE`、`REPRODUCTION.md`、`validate.py` / `preflight.py` / `build_bundle.sh` / `fixtures/`(含 valid 与 seeded 两套)、以及脱敏后的 `evidence/`。 `data/`(小、恒发布)与 `evidence/`(大、按可发布性筛选)分层打包,只下 `data/` 即可完成全部数值复算。`bundle_digest` 同时印在文章正文、方法页与 MANIFEST 头部。

PREREQUISITES

What must exist before a single measurement is taken.

A benchmark that skips these produces numbers, not evidence. Every item is a precondition of the protocol, not a recommendation.

P-01

两台隔离机器:采集机(执行测量)与复现机(干净系统,仅用公开发布包),二者由不同操作员使用、走不同网络出口,用于 P7 冷启动演练

REQUIRED
P-02

工具链(全部免费):Python ≥ 3.11、frictionless-py、pandas、jq、exiftool、tesseract-ocr、poppler(pdftotext)、sha256sum/certutil、git、age 或 minisign(签名)、Docker(可选,用于固定复现环境)

REQUIRED
P-03

仓库分离:私有仓库存放原始未脱敏数据、操作员身份映射表、哈希盐值;公开仓库/发布目录只存放脱敏后的发布包。二者不共用凭据、不共用远端、不互为 submodule

REQUIRED
P-04

在任何一次真实采集开始之前完成 schema 与词表冻结:冻结时刻的 UTC 时间戳与文件 SHA-256 写入 CHANGELOG,冻结后任何改动都要走版本号与迁移脚本

REQUIRED
P-05

操作员代号表 OP-01…OP-04(4 人上限),代号↔真实身份的映射离线加密保存,绝不进入任何仓库、任何截图、任何 CSV

REQUIRED
P-06

时钟同步能力:可查询公共 NTP 或 roughtime 源,会话前后各校一次并记录偏移量

REQUIRED
P-07

证据存储:本地 + 一份离线备份;按每平台每指标约 200 MB 预估,5 平台 × 20 指标量级需预留 ≥ 250 GB 冷存储

REQUIRED
P-08

法律与伦理红线的书面确认:每位操作员签署并记录 ethics_ack_ts —— 不伪造/借用证件、不做渗透或撞库、不跨账户对敲、不使用他人银行账户、HTTP 429 即停、不用 VPN 伪装地区规避限制、平台条款禁止自动化时改为人工采集并标注 collection_mode=manual

REQUIRED
P-09

一名不参与该批次数据采集的成员担任 preflight 签署人(两人规则);4 人团队中至少 2 人具备读写 CSV/JSON 与运行校验脚本的能力

REQUIRED
P-10

许可决策在首次发布前拍板:我方测量数据与分析文字的许可、第三方材料(平台界面截图、条款引文、标识)的处理方式,写入 LICENSE 与 THIRD_PARTY.md

REQUIRED
P-11

预算:本基准自身几乎不花钱(工具全免费,镜像与 DOI 可用免费额度),约 €0–120,成本主要是人力约 12–18 人日;不需要机构权限、不需要付费基础设施

REQUIRED

PROTOCOL

7 procedures, each with its own evidence boundary.

Every procedure states what its output can support and what it cannot. The second of those is the one that keeps a measurement honest.

AXP-REPRO-v1/P1

数据契约冻结:字段 schema、类型、受控词表与表间关系

  1. 定义「观测行脊柱」:所有指标表共享同一组前置列,顺序固定,任何指标表不得改名或改序。脊柱列为:obs_id, metric_id, spec_version, platform_id, platform_entity, run_id, operator_id, ts_utc, ts_local, tz_iana, observation_type, status, value_num, value_str, value_bool, unit, value_sd, value_n, unc_type, unc_k, resolution, evidence_ref, evidence_sha256, instrument, vantage, collection_mode, notes, row_hash。
  2. 规定 obs_id 生成规则:obs_id = metric_id + '|' + platform_id + '|' + run_id + '|' + zero_pad(seq, 6),ASCII,长度 ≤ 128,表内唯一。禁止随机 UUID(随机 ID 让第三方无法判断行的来源与顺序)。
  3. 规定 observation_type 四值受控词表,并写进方法页首屏:measured(我们亲手测得)| derived(由 measured 行按公开公式算出)| documented(来自平台自述、条款、登记簿等文档,我们只核实了「它在 T 时刻这么写」)| third_party(第三方出具的报告或审计,我们只核实了出处)。这是本刊的招牌区分,任何一行必须四选一,不允许空值。
  4. 规定类型与格式:CSV 遵循 RFC 4180;UTF-8 无 BOM;换行 LF;分隔符逗号;引号 \" 且内部双写;数值一律用点号小数、不加千分位、不加货币符号、不用科学计数法;金额单独用 unit 列表达币种(EUR/USD/USDT/BTC…),绝不写成 '€12.30' 这种值单位混写;布尔只允许 true/false 小写;文本字段不得含裸换行(用 \\n 转义)。
  5. 为每个字段写出:中文定义、英文字段名、类型、单位、允许取值或范围、是否必填、缺失时的合法 status。落成机器可读的 schema/*.json(Frictionless Table Schema 或 JSON Schema),并生成 datapackage.json 作为发布包入口。
  6. 建立 platforms.csv 作为唯一权威表:platform_id(小写 slug:baerx | coinbase | kraken | cryptocom | binance)、canonical_name(展示名,如 'Crypto.com')、legal_entity、entity_registry_id、entity_jurisdiction、serving_entity_for_IE_user。所有其它表只能引用 platform_id,禁止在别处再写一次展示名——这是防止 'Crypto.com' / 'CryptoCom' / 'crypto.com' 分裂成三个平台的唯一办法。
  7. 禁止平台专属列。某平台独有的事实写进 extensions.csv(obs_id, ext_key, ext_value, ext_unit, ext_note),由受控 ext_key 词表约束。理由:一旦某平台的表多出两列,跨平台可比性就在悄无声息中失效了。
  8. 冻结前用合成夹具自测:为每张表构造 ≥ 20 行 fixture,要求覆盖每一个 status 码至少 1 次、每一个受控词表条目至少 1 次、每一种边界值(最小值、最大值、空文本、最长文本、含引号与逗号的文本)至少 1 次。fixture 必须能通过校验器;不能通过说明 schema 与现实不符。
  9. 执行冻结:把 schema/*.json、vocabularies/*.csv、platforms.csv 的 SHA-256 与冻结 UTC 时间写入 CHANGELOG.md 的 v1.0.0 条目。此后任何字段改动必须:新增可空列 → MINOR;改类型/改语义/删列 → MAJOR,且必须附迁移脚本 migrate_vX_to_vY.py 与迁移前后行数对账。
  10. 在正式采集前跑一次 ≥ 30 行的真实试点(每个指标表、每个平台至少 2 行),只为暴露 schema 缺陷;试点数据标记 run_id 前缀 'PILOT-' 且不进入任何已发表统计。
Quantity measured
Schema 合规率 S = n_valid_rows / n_rows(校验器零错误的行占比),发布闸门 S = 1.000;词表闭合度 V = 1 − n_offvocab_cells / n_vocab_cells,闸门 V = 1.000;字段定义完备度 D = n_fields_with_definition / n_fields,闸门 D = 1.000;冻结后漂移 Δ_schema = 冻结日之后发生的 schema 变更次数(不设闸门,但必须逐条出现在 CHANGELOG,用于读者判断规范稳定性)。
Fixed parameters
CSV 方言固定:encoding=UTF-8(no BOM), newline=LF, delimiter=',', quotechar='\"', doublequote=true, escapechar=none。obs_id 序号位宽 6(单次 run 上限 999999 行,远超小团队产能)。fixture 行数下限 20 行/表(低于此覆盖不到全部 status 码)。试点行数下限 30 行/指标(够暴露类型与边界问题,又不至于烧掉预算)。unc_k 默认 2(约 95% 覆盖区间),偏离必须在行内注明。
Sample size
schema 本身不是抽样对象,是普查对象:所有表、所有列 100% 覆盖。夹具 ≥ 20 行/表且满足「每个 status 码 ×1、每个词表条目 ×1、每类边界值 ×1」的覆盖条件(这是覆盖设计,不是统计抽样,不涉及功效计算)。真实试点 ≥ 30 行/指标表、每平台 ≥ 2 行,时间跨度 1 个工作日内完成,目的只在暴露契约缺陷。
Control
五个平台共用同一份 schema、同一份词表、同一套校验器;任何一个平台需要新列,改的是所有平台的 schema 并触发版本号,而不是给它单独加列。合成夹具作为已知答案对照(fixture 的正确性由人工逐行确认一次,此后作为回归基线)。
Statistical treatment
S、V、D 三项都是比例,报告点估计并附 Wilson 95% 置信区间(n 通常较大,区间会很窄,但必须给 n)。Δ_schema 是计数,直接列出变更清单,不做统计推断。任何比例指标一律与其分母 n 同屏出现,禁止只报百分比。
Reproducibility check
第三方拿到发布包后执行 `frictionless validate datapackage.json`(或包内附带的 validate.py,二者结果必须一致),应得零错误。校验器自身的自校验见 P6 的植入缺陷夹具:若校验器抓不到植入缺陷,S=1.000 毫无意义。schema 文件哈希同时出现在方法页与 MANIFEST.csv,两处不一致即视为发布事故。
Known pitfalls
①Excel 会把 obs_id 里的长数字转成科学计数法、把 '2026-08-31' 转成本地日期格式、给 CSV 加 BOM —— 规定任何 CSV 不得用 Excel 保存回写,只用脚本读写,人工填写走模板并在导入时做格式回归检查。②把币种写进 value_str 而不是 unit,导致跨平台聚合时静默错算。③给某平台临时加列,几周后没人记得该列只有一个平台有数据。④用随机 UUID 当 obs_id,导致行序不可复现、diff 全红。
Risk
冻结过早会导致后续大量 MAJOR 版本;冻结过晚则数据边采边改、不可比。建议在试点后、正式采集前冻结,这是唯一正确的时点。schema 一旦公开发布就是承诺,改它的成本远高于事前多花半天讨论。

SUPPORTS / 可以确立:数据集在结构上自洽、类型正确、词表闭合、表间引用完整,且这份契约在采集开始之前就已冻结(因此不是事后为了迁就结果而调整的)。

DOES NOT SUPPORT / 不能确立任何一行的数值是否正确、是否真实、是否具有代表性——一个 100% 合规的数据集完全可能全部数值都是错的。schema 合规率不是准确率。特别地:observation_type=documented 的行,即使字段全部合规,也只能支持「平台/登记簿在 source_capture_ts 这一刻公开写着 X」,不能支持「平台实际执行 X」;文档、条款、注册登记本身无法确立行为,只能确立表述。(例如某司法辖区的 MSB 注册记录只能确立「存在一条注册记录且其某字段为空」,无法确立牌照、审批或背书。)

EVIDENCE RETAINED / schema/*.json 与其 SHA-256 · vocabularies/*.csv(code, label_en, label_zh, definition, valid_from, valid_to) · platforms.csv · datapackage.json · fixtures/valid/*.csv 与校验器输出 fixture_validation.json · CHANGELOG.md 中的冻结条目(含冻结 UTC 时间与哈希)
RECORDED FIELDS (14)
  • schema_file / path / 相对发布包根目录的路径
  • schema_sha256 / hex64 / 冻结时刻的文件摘要
  • freeze_ts_utc / RFC3339 / 冻结时刻,毫秒精度,Z 结尾
  • table_name / text / 对应的观测表名
  • n_columns / count / 含脊柱列在内的总列数
  • n_fields_with_definition / count / 有中英文定义+类型+单位的字段数
  • n_fixture_rows / count / 合成夹具行数,下限 20
  • fixture_status_codes_covered / count / 夹具覆盖到的 status 码数,须等于词表全集
  • validation_errors / count / 校验器报错数,发布闸门为 0
  • offvocab_cells / count / 落在受控词表之外的单元格数,闸门 0
  • n_pilot_rows / count / 试点真实行数
  • pilot_defects_found / count / 试点暴露的契约缺陷数,逐条列出
  • post_freeze_changes / count / 冻结后变更次数,须与 CHANGELOG 条目数一致
  • schema_version / semver / 规范版本,与行内 spec_version 对应
SPECIFICATION
AXP-REPRO-v1/P2

时间、时钟与观测溯源:让时间敏感的数字跨平台可比、跨季度可追

  1. 规定时间表示:ts_utc 一律 RFC 3339、UTC、毫秒精度、以 Z 结尾(例:2026-09-14T13:04:07.482Z)。同时必填 tz_iana(IANA 名,如 Europe/Dublin)与 ts_local(带偏移量,如 2026-09-14T14:04:07.482+01:00)。禁止只存本地时间、禁止只写 'GMT+1'、禁止依赖读者推断夏令时。
  2. 会话时钟纪律:每个采集会话开始与结束各做一次时钟校准,连续采集每 60 分钟加做一次。记录 clock_offset_ms(本机时间 − 参考时间)、clock_source(NTP 主机名或 roughtime 服务)、clock_check_ts_utc。判定:|offset| ≤ 250 ms 正常;250 ms < |offset| ≤ 1000 ms 打 clock_suspect=true 并在分析中做敏感性检验;|offset| > 1000 ms 时,该会话内所有时间敏感指标行(延迟、撮合、提现确认等)降级为 status=invalid(原始值保留在 raw 层,不进入已发表统计),非时间敏感行保留。
  3. 规定时长的测法:所有 duration 字段必须由单调时钟计算(Python time.monotonic_ns()、JS performance.now()),不得用两次墙钟时间相减。同时记录 t_start_utc 与 t_end_utc 供人工核对,但发布的 duration 以单调时钟为准,并用 duration_clock='monotonic' 标注来源。
  4. 区分「我方时钟」与「平台时钟」:ts_utc_client 是我们观测到的时刻,ts_platform_reported 是平台自己返回的时刻(订单回执、交易记录、邮件头)。两者必须分列,永不互相填补。同时计算并记录 platform_clock_skew_ms = ts_platform_reported − ts_utc_client,它本身是关于平台的一项观测。
  5. 时段分层:由 ts_utc 派生 tod_window ∈ {W1: 00:00–07:59Z, W2: 08:00–15:59Z, W3: 16:00–23:59Z} 与 is_weekend(按 UTC 判定)。该派生字段必须由发布的脚本重算得出,不得手填——凡是可派生的列,一律标注为 derived 并附带派生代码,否则第三方无法验证。
  6. 夏令时纪律:任何一组配对比较(同一指标在多平台之间的对照)不得跨越所在时区的夏令时切换日。若跨越,拆成两个 run_id 并在 runs.csv 标注 dst_boundary_crossed=true。
  7. 文档类证据的溯源三件套:observation_type=documented 的行必须填 source_url、source_capture_ts_utc、source_sha256(抓取当刻页面/文件的原始字节摘要),并记录 http_status、content_type、final_url(跟随重定向后的地址)。同时在证据包内保存本地副本供内部核验;对外只发布 URL + 哈希 + 必要的短引文,不发布整页转储(见 P5 第三方材料政策)。
  8. 顺序完整性:seq 在同一 run_id 内严格递增且无空洞;runs.csv 记录 run_start_utc、run_end_utc;校验时要求所有行的 ts_utc ∈ [run_start − 60 s, run_end + 60 s]。落在窗口之外的行说明存在事后补录或时钟错误,必须逐条解释或作废——这是发现「回填数据」的主要手段。
  9. 采集环境记录:vantage 用「国家 + 连接类别」的粗粒度描述(如 IE-residential-fixed、IE-mobile-4G),绝不记录也绝不发布 IP 地址。instrument 记录工具与版本(如 chrome/125.0.6422.112、python/3.11.9 pandas/2.2.2、curl/8.6.0)。同一指标跨平台对照时,vantage 与 instrument 必须一致,不一致则该组对照作废。
Quantity measured
时间戳合法率 T_v = 满足「可按 RFC 3339 解析 + 含时区 + 落在 run 窗口内」的行数 / 总行数,发布闸门 T_v = 1.000;时钟偏移 δ = t_local − t_ref(ms),按会话报告 median(|δ|) 与 max(|δ|);单调时钟纯度 M_p = 由单调时钟计算的 duration 字段数 / duration 字段总数,闸门 M_p = 1.000;溯源可解析率 P_r = evidence_ref 能在 MANIFEST 中找到且哈希匹配的行数 / 需要证据的行数,闸门 P_r = 1.000。
Fixed parameters
时钟校准频次:会话首、会话尾、每 60 min 一次(60 min 是消费级机器晶振漂移在毫秒量级内的经验安全区间,且不至于打断采集节奏)。偏移阈值 250 ms / 1000 ms:250 ms 取自「远小于我们关心的最小时间量级(页面与撮合延迟通常在 10^2–10^3 ms)」,1000 ms 取自「已足以改变结论」。run 窗口宽容度 ±60 s(覆盖记录写盘与人工填表延迟)。时段窗口按 UTC 三分,避免各平台所在时区不同导致分层不可比。
Sample size
时间戳字段是普查(100% 行必须合法)。时钟校准是抽样时点:每会话 ≥ 2 次,连续采集每 60 min 追加 1 次;6–8 周周期内按每周 3 个采集会话估算,约 40–60 次校准记录,足以给出偏移分布的中位数与极值。platform_clock_skew_ms 在每个平台上至少 20 个配对观测才报告分布(少于 20 只报单值并标注 n)。
Control
跨平台对照必须同 vantage、同 instrument、同 tod_window、同一天内完成;把这四项写进 runs.csv 并在分析时作为分组键强制校验。时钟参考源固定为同一个(不要今天用 NTP-A 明天用 NTP-B),参考源本身在 runs.csv 记录。
Statistical treatment
时钟偏移与所有时长类量均为长尾分布:只报 p50 / p90 / p99 / max 与 n,禁止只报均值;离群值不删除,单独列出并说明成因(若成因不明就写不明)。T_v、M_p、P_r 为比例,报点估计 + Wilson 95% CI + n。platform_clock_skew_ms 报中位数与 IQR,并说明它混合了平台时钟误差与网络往返时间,不能单独归因。
Reproducibility check
第三方可用发布的脚本重算三件事:①由 ts_utc 重算 tod_window 与 is_weekend,应与发布列逐行一致;②检查所有 ts_utc 是否落在 runs.csv 的窗口内;③对每条 documented 行重新抓取 source_url 并比对哈希——哈希不一致是正常的(页面会变),但此时第三方能确认的是「今天的内容与我们抓取时不同」,这本身就是有价值的复现结果,规范要求在 REPRODUCTION.md 中预先解释这一点。
Known pitfalls
①浏览器开发者工具的时间轴是墙钟,系统时间校正时会跳变,用它算时长会得到负数或离谱值。②截图文件的 mtime 不是拍摄时间,复制一次就变了——拍摄时间必须由脚本在拍摄当刻写进 evidence_index.csv。③平台导出的 CSV 常把时间改成本地格式且不带偏移量,这是最常见的静默损坏源;导入时必须显式指定时区并记录 tz_assumed=true。④夏令时切换当天的一小时会重复出现,本地时间排序会错乱——所以排序一律用 ts_utc。
Risk
抓取文档类证据时必须遵守速率限制与条款:遇 HTTP 429 立即停止该目标当日采集,并把受影响的行记为 status=blocked、block_reason=rate_limited,不得换 IP 重试。不使用 VPN 伪装地区来绕开地域限制——地域限制本身是应当被记录的观测结果。

SUPPORTS / 可以确立:每一行观测发生在何时、由谁在什么网络位置用什么工具做出、当时本机时钟偏差多少、该行依据的证据是哪一份文件;也因此可以确立跨平台比较是否在可比的时间条件下完成。

DOES NOT SUPPORT / 不能确立平台侧真实发生时刻——我们只能观测到自己看见的时刻加上一段未知的网络与队列延迟;platform_clock_skew_ms 不能拆分成「平台时钟误差」与「网络延迟」两部分。也不能确立所测时段具有代表性:分层保证了可比,不保证外推。对 documented 行,source_sha256 只能确立「该 URL 在某一刻返回过这段字节」,不能确立平台从未在其它时刻展示过不同内容,更不能确立文档所述行为真的发生过。

EVIDENCE RETAINED / runs.csv(run_id, run_start_utc, run_end_utc, vantage, instrument, operator_id, clock_source, dst_boundary_crossed) · clock_checks.csv(每次校准一行) · 各观测表中的 ts_* 列 · documented 行的 source_url / source_sha256 与证据包内本地副本
RECORDED FIELDS (21)
  • run_id / text / 格式 R-YYYYMMDD-NN
  • clock_check_ts_utc / RFC3339 / 校准时刻
  • clock_offset_ms / ms / 本机 − 参考,带符号
  • clock_source / text / 参考源主机名或服务名
  • clock_suspect / bool / |offset|>250ms 时为 true
  • ts_utc_client / RFC3339 / 我方观测时刻,毫秒
  • ts_platform_reported / RFC3339 / 平台自述时刻,缺失则 status 说明
  • platform_clock_skew_ms / ms / 平台自述 − 我方观测,含网络延迟,不可单独归因
  • tz_iana / text / IANA 时区名
  • tod_window / enum / W1/W2/W3,由 ts_utc 派生,须可重算
  • is_weekend / bool / 按 UTC 判定,派生字段
  • duration_ms / ms / 单调时钟计算
  • duration_clock / enum / monotonic/wall,闸门要求全为 monotonic
  • vantage / text / 国家+连接类别,禁止 IP
  • instrument / text / 工具名/版本号
  • collection_mode / enum / auto/manual/hybrid
  • source_url / url / documented 行必填
  • source_capture_ts_utc / RFC3339 / 抓取时刻
  • source_sha256 / hex64 / 抓取当刻原始字节摘要
  • http_status / count / 最终响应状态码
  • dst_boundary_crossed / bool / 该 run 是否跨夏令时切换
SPECIFICATION
AXP-REPRO-v1/P3

缺失与不适用的多态编码:把「没测到」「确实为空」「不适用」「被拦截」彻底分开

  1. 定义 status 受控词表(七值,互斥且穷尽):ok = 已测且有值;null_observed = 平台/登记簿在该处确实为空,这个「空」本身就是观测结果(例如某注册记录的 Website 字段为空);not_measured = 我们没有测(超出本次范围、时间或预算不足),是我们的缺口;not_applicable = 该概念对该平台不存在(例如现货专营平台的衍生品费率);blocked = 我们尝试了但被阻止(地域限制、KYC 被拒、429 限频、账户被限制),是关于平台的发现;withheld = 已测但因个人数据或法律风险不予发布;invalid = 已测但未通过质控(时钟异常、仪器错误),原始层保留、分析层剔除。
  2. 值与状态的硬约束:当且仅当 status=ok 时 value_num / value_str / value_bool 中恰有一个非空;status ≠ ok 时三者必须全部为「真正的空字段」(CSV 中零长度),严禁写 'NA'、'N/A'、'-'、'—'、'null'、'None'、'暂无'、'待补'、0、-1、9999 等任何哨兵值。理由:哨兵值会在读入时静默改变列的数据类型,把整列数值变成字符串,或把「没测」算成 0 拉低均值。
  3. 为 blocked 补子码 block_reason ∈ {geo_restricted, kyc_rejected, kyc_pending, rate_limited, account_restricted, feature_gated, requires_higher_tier, service_unavailable, other},other 必须在 notes 写明。为 withheld 补 withheld_reason ∈ {personal_data, third_party_ip, legal_risk, security_risk}。为 invalid 补 invalid_reason ∈ {clock_suspect, instrument_error, protocol_deviation, evidence_missing}。
  4. not_applicable 必须举证:任何 status=not_applicable 的单元格必须填 na_justification_ref(指向一份 documented 证据,证明该平台确实不提供该功能)。没有举证的一律降级为 not_measured。这条规则专门用来堵住「把做不出来的测试写成不适用」这个最常见的自我美化路径。
  5. 逐指标声明聚合规则(写进各自的方法页,且落成机器可读的 aggregation_rules.csv):not_applicable 从分母中剔除;not_measured 既不进分子也不进分母,但必须以覆盖率损失的形式披露;blocked 计入分母并单独报告(被拦截不是数据空洞,是结果);null_observed 是否等价于 0 或「无」由各指标显式声明,缺省不等价;invalid 与 withheld 一律剔除并披露数量。
  6. 禁止插补:发布的原始表中不得出现任何插补值。派生表若必须插补,须新增 imputed=true 标记列与 imputation_method 字段,且插补值永远不进入文章头条数字。
  7. 盲式复评:从 status ≠ ok 的单元格中按状态分层随机抽样(每个出现过的状态码至少 10 个,总计不少于 60 个;不足 10 个的状态码全取),交给未参与该行采集的第二名操作员,仅给证据不给原始 status,让其独立判定状态码,计算与原判定的一致性。
  8. 覆盖率闸门与差异覆盖检查:对每个指标表逐平台计算覆盖率 C;C < 0.80 的表在发布时必须带覆盖率横幅;C < 0.50 的表不得进入跨平台比较,只作为原始数据发布。此外计算 max(C) − min(C) 的平台间极差,> 0.20 时必须在文中专门讨论——差异覆盖本身就是可比性威胁:如果我们在 A 平台测到 95% 的项、在 B 平台只测到 60%,两者的均值不能直接并列。
Quantity measured
覆盖率 C = n_ok / (n_ok + n_not_measured + n_blocked)(分母为「适用单元格」);适用率 A = (N_total − n_not_applicable) / N_total;阻断率 B = n_blocked / (N_total − n_not_applicable);状态判定一致性用 Cohen's κ = (p_o − p_e) / (1 − p_e),其中 p_o 为两名操作员判定一致的比例、p_e 为按边缘分布计算的偶然一致概率;目标 κ ≥ 0.80,κ < 0.60 时该批次状态码全部重编。
Fixed parameters
覆盖率闸门 0.80(带横幅)与 0.50(禁止比较):取自「五分之一的项缺失时读者仍能理解整体,一半缺失时任何平均数都在误导」的编辑判断,写明是判断而非统计推导。平台间覆盖极差警戒线 0.20。复评抽样每状态码 ≥ 10 个:低于 10 个时 κ 的抽样波动过大,无法解释。κ 阈值 0.80 / 0.60 采用常见的实质一致 / 中等一致分档,需在方法页注明该分档是约定而非定理。
Sample size
状态编码本身是普查(每个单元格都必须有状态)。盲式复评抽样 n ≥ 60 且每状态码 ≥ 10(不足者全取):在 κ 真值 0.8 附近,n=60 的 κ 标准误约 0.06–0.09 量级,足以区分「≥0.80」与「<0.60」两档,再大的样本对 4 人团队不经济。覆盖率按指标 × 平台分别计算,最小分母 < 10 时不报比例、只报计数。
Control
复评者与原采集者不同人,且复评时只看证据不看原判定(盲式);同一批证据在两名操作员之间随机分配,避免「谁测的谁复评」。五个平台使用同一套状态词表与同一套举证要求,不因平台配合度不同而放宽。
Statistical treatment
C、A、B 均为比例:报点估计 + Wilson 95% CI + 分子分母原值(Wilson 区间在小样本与接近 0/1 时优于正态近似)。κ 报点估计与 95% CI(自举 2000 次,随机种子固定并发布)。所有涉及缺失的统计必须同时给出 n_ok 与分母构成,禁止只给一个百分比。绝不用插补值参与任何已发表统计量。
Reproducibility check
第三方可从发布的原始表直接重算 C、A、B——只要状态编码真实,覆盖率就是可复现的算术。校验器强制检查两条不变式:①status=ok ⟺ 恰有一个 value_* 非空;②status=not_applicable ⟹ na_justification_ref 非空且能在证据清单中解析。这两条能被机器验证,因此第三方无需信任我们的自律。仪器自校验:在植入缺陷夹具(见 P6)中放入「status=not_measured 但 value_num 有值」「用 −1 当哨兵」等样本,校验器必须 100% 命中。
Known pitfalls
①团队在时间压力下把「没做完」写成 not_applicable,这是本协议最需要防的行为,所以 not_applicable 必须举证。②把 blocked 当成缺失丢掉,等于把最有新闻价值的观测(我们被挡在门外)抹掉了。③pandas 默认会把空字符串、'NA'、'null' 一起读成 NaN,导致四种状态在分析阶段重新混成一种——所有读入必须显式 keep_default_na=False 并以 status 列为唯一真相来源。④用 0 表示「无费用」和「未测到费用」,这是成本类指标最经典的错误。
Risk
blocked 的记录必须诚实:不得为了把 blocked 变成 ok 而使用 VPN 伪装地区、借用他人证件或他人银行账户,也不得对限频接口反复重试。触发 429 即停并记为 blocked/rate_limited,是本协议的硬性红线。

SUPPORTS / 可以确立:每一个空格子为什么是空的,以及这个空是关于平台的发现还是关于我们的缺口;由此可以确立每张表的覆盖率与可比性边界,并让第三方独立重算这些覆盖率。

DOES NOT SUPPORT / 不能确立未测项的取值——覆盖率高不等于结论强,覆盖率低也不等于平台差。not_measured 的存在只说明我们的资源边界,不构成对平台的任何暗示,文中不得用「未能测到」暗示「有问题」。null_observed 只能确立「在我们观测的那一刻该字段为空」,不能确立该字段从未被填写过,也不能据此推断任何原因或动机。blocked 只能确立「在我们的 vantage、账户与时刻组合下被阻止」,不能确立平台对所有用户都如此。

EVIDENCE RETAINED / 各观测表的 status / block_reason / withheld_reason / invalid_reason 列 · na_justifications.csv(obs_id, na_justification_ref, source_url, source_capture_ts_utc) · aggregation_rules.csv(metric_id, status_code, in_numerator, in_denominator, treat_null_as) · status_adjudication.csv(复评记录:obs_id, operator_a_status, operator_b_status, agreed, notes) · 覆盖率汇总表 coverage_summary.csv(metric_id × platform_id)
RECORDED FIELDS (16)
  • status / enum / ok/null_observed/not_measured/not_applicable/blocked/withheld/invalid
  • block_reason / enum / status=blocked 时必填
  • withheld_reason / enum / status=withheld 时必填
  • invalid_reason / enum / status=invalid 时必填
  • na_justification_ref / text / status=not_applicable 时必填,指向 documented 证据
  • n_ok / count / 按 metric_id × platform_id 汇总
  • n_not_measured / count / 我方缺口
  • n_blocked / count / 平台侧阻断
  • n_not_applicable / count / 不适用,须全部有举证
  • coverage_C / ratio / n_ok/(n_ok+n_not_measured+n_blocked),4 位小数
  • coverage_C_ci_low / ratio / Wilson 95% 下界
  • coverage_C_ci_high / ratio / Wilson 95% 上界
  • coverage_gap_max / ratio / 平台间覆盖率极差,>0.20 触发讨论
  • kappa_status / ratio / 状态判定 Cohen's κ
  • kappa_n / count / 复评样本量
  • imputed / bool / 仅派生表允许为 true,原始表恒 false
SPECIFICATION
AXP-REPRO-v1/P4

脱敏、证据包处理与法律边界:发布得出去,且不伤到任何人

  1. 团队身份:对外只出现 OP-01…OP-04 与其角色(如「负责法币通道」),不出现姓名、邮箱、社交账号、所在城市。代号↔身份映射表离线加密保存,不进任何仓库。截图中的浏览器书签栏、用户名、系统托盘、桌面文件名一律裁掉或涂黑。
  2. 平台客服人员:客服姓名替换为 AGENT-{k},编号在单个工单内稳定、跨工单不复用(防止把同一名客服的跨工单画像拼出来)。不发布客服头像、工号、个人签名档。确需引用原话时,引文尽量短、归属于平台而非个人,且只在该引文对结论必要时保留。默认不发布人员姓名——这是降低个人数据处理风险的编辑默认值,不是法律意见。
  3. 账户与凭据:绝不发布账户号、注册邮箱、手机号、UID、API key、session token、cookie、设备指纹、我方 IP。测试账户使用专用邮箱别名,别名本身也不发布。
  4. 链上证据的两级发布规则:仅当该地址是为本次测量一次性创建、事后不复用、且不持有其它资金时,才可发布 txid + 区块高度 + 金额;否则只发布派生测量值(手续费、确认时延、到账差额)与承诺哈希 commit = SHA-256(txid || salt),salt 私有保存,仅在收到善意审计请求时按记录在案的流程释放。地址复用策略必须在方法页公开说明——因为「我们发布了什么、没发布什么」本身影响第三方能验证到什么程度。
  5. 图片与文档处理:所有截图用 exiftool -all= 清除 EXIF/XMP/GPS;PDF 先 flatten 再清元数据;涂黑必须是不可逆的栅格化涂抹(对图像重采样后再叠加实心块),绝不使用 PDF 图层或 CSS 覆盖的黑框(可被一键移除),涂黑后必须用 pdftotext / OCR 回读确认底下没有可选文本。
  6. HAR 与网络日志:原始 HAR 一律不发布。若必须发布,走文档化的清洗器:删除 Cookie / Set-Cookie / Authorization / Proxy-Authorization / 任何 X-*-Token 头、删除认证类请求体、默认删除所有响应体(仅白名单端点保留),并在清洗后用正则全量回扫确认。清洗器与其配置一并发布,使第三方知道我们删了什么。
  7. 发布前自动泄漏扫描:对发布包内所有字节执行正则扫描——邮箱、E.164 电话、IBAN、通过 Luhn 校验的卡号、JWT(eyJ[A-Za-z0-9_-]{10,})、常见 API key 形态、BTC/ETH 地址、公网 IPv4/IPv6、我方域名与测试别名、团队真实姓名表(从离线映射表读入,扫描过程在本地进行,不外发)。图片走 tesseract OCR、PDF 走 pdftotext 后同样扫描。命中数必须归零,或对每一条命中在 redaction_log.csv 中给出「为何保留」的裁定。
  8. 对抗性人工复核:由第二名操作员扮演攻击者,对随机抽取的发布文件尝试反脱敏——读元数据、抽 PDF 文本层、放大涂黑边缘、拼接多张截图的上下文、用公开信息反查代号。每成功一次记一个 reversible_redaction 并必须修复后重扫。
  9. 法律与伦理边界写进数据:collection_mode 记录是否自动化;若平台条款禁止自动化访问,则改人工采集并标注;robots_ok 记录抓取时 robots.txt 是否允许该路径。任何触发 429 的采集立即停止并按 P3 记为 blocked/rate_limited。不做渗透测试、不撞库、不跨账户对敲、不使用他人证件或银行账户——这些不是可选项,违反即整批数据作废。
Quantity measured
残余泄漏率 L = 修复后自动扫描仍命中且未被裁定的条目数 / 发布文件数,发布闸门 L = 0;脱敏可逆率 R_rev = 在既定攻击集(元数据读取、PDF 文本层抽取、图像图层分离、复制粘贴、OCR、跨文件上下文拼接)下可还原的涂黑处数 / 涂黑处总数,闸门 R_rev = 0;证据可解析率 E_r = evidence_ref 能解析且哈希匹配的行数 / 需证据行数,闸门 1.000;裁定留存率 = redaction_log 中「保留并说明理由」的命中数(无闸门,但必须逐条可见)。
Fixed parameters
扫描器正则集与其版本随包发布(scanner_rules.yml + 版本号),保证第三方能用同一套规则复扫。OCR 语言包固定 eng+chi_sim,图像扫描前统一放大 2×(低分辨率截图 OCR 漏检率高)。对抗性复核抽样比例 max(20 个文件, 全部文件的 10%)。承诺哈希用 SHA-256,salt 长度 ≥ 32 字节随机。
Sample size
自动扫描为普查:发布包内 100% 文件、100% 字节(含图片 OCR 与 PDF 文本)。对抗性人工复核抽样 max(20 文件, 10%),按文件类型分层(截图、PDF、CSV、JSON、Markdown 各至少 2 份)。诱饵对照文件固定 15 份,每次发布重跑。
Control
扫描器先在「植入敏感串」的对照文件上验证:构造 15 份含已知邮箱/IBAN/JWT/卡号/地址的诱饵文件(其中 5 份藏在图片里、3 份藏在 PDF 文本层下、2 份藏在文件元数据里),要求检出率 15/15,否则扫描器不合格、其零命中结果无效。对抗性复核者与脱敏执行者不得是同一人。
Statistical treatment
L 与 R_rev 是零容忍闸门,不做区间估计——它们要么是 0 要么发布中止。诱饵检出率报 15 份中的命中数与漏检明细。对抗性复核报「尝试次数 / 成功次数 / 手段清单」,成功案例逐条描述并说明修复方式(描述手段本身有教育价值,且不构成对他人的攻击指引)。
Reproducibility check
第三方可用随包发布的 scanner_rules.yml 与 scan.py 对发布包自行复扫,应同样得到零未裁定命中;也可自行对诱饵对照文件跑一遍确认扫描器有效。redaction_log.csv 让第三方看见「我们删了哪些类别的东西、为什么」,从而判断删减是否影响其复现能力——这比只说「已脱敏」可验证得多。
Known pitfalls
①用 PDF 阅读器画黑框、用 CSS 遮挡、用带图层的图片编辑器导出——三者都可逆,是最常见的脱敏事故。②忘了截图里的浏览器标签页标题、通知弹窗、书签栏。③CSV 的 notes 自由文本里混进客服姓名或邮箱。④把 HAR「简单删几行」当成清洗。⑤为了让链上证据「更硬」而发布长期使用的钱包地址,等于永久公开团队的资金图谱。⑥扫描器只扫文本不扫图片,等于没扫。
Risk
证据包中大量截图与条款引文属于第三方材料,我们无权对其重新授权;处理方式见 P5。发布团队自身的个人信息一旦泄漏无法撤回(会被镜像与索引),因此扫描器不合格时宁可延期发布。salt 与身份映射表若丢失,所有承诺哈希与代号都失去可核验性,需按季度做加密离线备份并记录备份校验结果。

SUPPORTS / 可以确立:发布包在既定攻击集下不含可直接识别自然人的标识,删减内容有逐条记录,且删减不是任意的;同时确立采集过程遵守了写明的法律与伦理红线(有签署记录、有 robots/条款记录、有 429 停止记录)。

DOES NOT SUPPORT / 不能确立绝对的不可再识别——脱敏只对既定攻击集与既有辅助信息有效,第三方掌握我们没有的背景信息时仍可能重新识别,方法页必须明说这一点。也不能构成任何法律合规声明:本协议不对数据保护、版权或平台条款做法律定性,只记录我们采取的措施与其理由。redaction_log 只能确立「我们记录了这些删减」,无法向第三方证明不存在未记录的删减——这是自我报告的固有边界,只能靠第二人签署与外部复核部分缓解。

EVIDENCE RETAINED / redaction_log.csv(file_path, hit_type, action, reason, decided_by, decided_ts_utc) · scanner_rules.yml 与扫描输出 leak_scan_report.json · 脱敏前后文件对照的哈希表(前者仅私有仓库留存) · adversarial_review.csv(复核者、尝试的攻击手段、结果) · ethics_ack.csv(operator_id, ethics_ack_ts_utc, 版本号) · har_scrubber 配置与清洗前后大小/字段差异报告
RECORDED FIELDS (16)
  • file_path / path / 发布包内相对路径
  • file_sha256 / hex64 / 脱敏后文件摘要
  • hit_type / enum / email/phone/iban/pan/jwt/apikey/onchain_addr/ip/team_name/other
  • hit_count_pre / count / 修复前命中数
  • hit_count_post / count / 修复后命中数,闸门 0(除非有裁定)
  • action / enum / redact/crop/drop_file/retain_with_reason
  • reason / text / retain 时必填
  • decided_by / text / 操作员代号
  • decided_ts_utc / RFC3339 / 裁定时刻
  • decoy_detection / count / 诱饵检出数 / 15
  • redactions_total / count / 涂黑处总数
  • redactions_reversible / count / 可还原处数,闸门 0
  • adversarial_attempts / count / 对抗性复核尝试次数
  • onchain_disclosure_level / enum / full_txid/commitment_only/none
  • robots_ok / bool / 抓取时 robots.txt 是否允许
  • ethics_ack_ts_utc / RFC3339 / 该操作员签署红线的时刻
SPECIFICATION
AXP-REPRO-v1/P5

完整性校验、版本化、许可与勘误:把文章和数据集用哈希绑在一起

  1. 生成 MANIFEST.csv:每个发布文件一行,字段 path, bytes, sha256, mime, n_rows(表格类), schema_ref, license, third_party(bool), generated_by, generated_at_utc。同时生成 SHA256SUMS(标准格式,便于 sha256sum -c 校验)。
  2. 定义并计算 bundle_digest:取 MANIFEST 中所有行的 'path\tsha256',按 path 的字节序升序排序,以 UTF-8 编码、LF 连接、末尾单个 LF,对该字节串取 SHA-256。把 bundle_digest 写进文章正文与方法页——文章从此与数据集在密码学上绑定,任何一方被改动都能被发现。
  3. 可选但推荐的签名:用 minisign 或 age 对 SHA256SUMS 签名,公钥同时发布在自有域名与至少一个独立位置(如公开代码仓库的 README),使第三方不必只信任一个来源。
  4. 版本语义(数据集版本独立于规范版本):MAJOR = schema 破坏性变更,或数值更正到足以改变已发表结论;MINOR = 新增行/平台/可空列,向后兼容;PATCH = 错别字、元数据、非数值修正。行内携带 spec_version(AXP-REPRO-v1 等规范版本),包级携带 dataset_version(semver)。
  5. 不可变发布路径:每个版本发布在 /data/axp-repro-v1/vX.Y.Z/ 这样的固定路径,永不覆盖;/latest 只是指针。CHANGELOG.md 每条记录:版本号、日期、变更类型、受影响文件、受影响 obs_id 范围、原因、执行人、新旧 bundle_digest。
  6. 勘误与撤稿:ERRATA.md 记录每一次更正。被撤回的行不删除,而是在新版本中把 status 改为 invalid 并填 superseded_by 指向替代行;文章同步标注更正。只有因个人数据或法律原因才允许真正删除,且必须留下墓碑行(obs_id、删除原因类别、日期),不重新发布被删内容。绝不静默改数——静默修改一旦被发现,整个刊物的可信度归零。
  7. 许可分层:我方产出的测量表与分析文字采用一个明确的开放许可(建议数据表用最宽松的一档以便再利用,文字用署名许可),在 LICENSE 与 MANIFEST 的 license 列逐文件标注。第三方材料(平台界面截图、条款引文、标识、第三方报告)不属于我们,不可被我们重新授权:这些文件在 MANIFEST 中标 third_party=true、license=third-party,并在 THIRD_PARTY.md 列出来源、抓取日期、纳入理由与引用范围。对第三方页面只发布 URL + 哈希 + 必要短引文,不发布整页转储或整份文件。欧盟语境下数据库可能另有权利归属,我们通过所选许可一并授出我方权利,但不对第三方材料的权利状态作任何法律判断。
  8. 分层打包:data/(小、恒发布:全部 CSV/JSON/schema/文档)与 evidence/(大、按可发布性筛选后发布)分开,各自有独立的 digest,使带宽有限的第三方也能只下载 data/ 完成全部数值复算。
  9. 可用性与镜像监测:发布后按周做一次可达性检查(HEAD 请求 + 下载 data/ 并重算 digest),持续 ≥ 12 周;至少布一个镜像,两处的 bundle_digest 必须一致,不一致立即告警并公示。
  10. 构建可重复性:打包时固定 SOURCE_DATE_EPOCH、固定文件顺序与权限位、zip 内时间戳归一,使同样的输入能产出字节相同的压缩包;把打包脚本一并发布。
Quantity measured
完整性通过率 I = 重算 SHA-256 与 MANIFEST 一致的文件数 / MANIFEST 列出的文件数,发布闸门 I = 1.000;清单完备度 M = 1 − |磁盘文件集合 △ MANIFEST 文件集合| / (两集合并集大小),闸门 M = 1.000(既不能有未登记的孤儿文件,也不能有登记了却不存在的幽灵条目);镜像一致性 = 1 当且仅当所有镜像的 bundle_digest 相同;可用性 A_t = 成功下载次数 / 尝试次数(每周 1 次,观测 ≥ 12 周);版本纪律 = 缺少 CHANGELOG 条目的已发布版本数,闸门 0。
Fixed parameters
哈希算法固定 SHA-256(广泛可用,命令行一行可验)。bundle_digest 的连接规则必须逐字节写死(UTF-8 / LF / path 字节序排序 / 末尾单 LF),否则不同实现算出的摘要不同、绑定失效。可达性监测周期 12 周(覆盖一个发布周期加缓冲),频率每周 1 次(足以发现失效,又不至于对镜像造成负担)。data/ 目标体积 ≤ 50 MB,超出时优先剔除可再生成的中间文件而非原始观测。
Sample size
完整性与清单核验为普查(100% 文件)。构建可重复性对照:每个发布版本 2 次独立构建。可用性监测:主站 + ≥1 镜像,每周 1 次 × ≥ 12 周 = ≥ 24 次观测;观测数少于 12 次时只报计数不报比例。
Control
同一个 bundle_digest 由两名操作员在不同机器上各算一次,必须相同;打包脚本在两台机器上运行应产出字节相同的压缩包(构建可重复性对照)。镜像与主站互为对照。
Statistical treatment
I、M、镜像一致性均为零容忍闸门,不做统计推断。A_t 是比例,报点估计 + Wilson 95% CI + n,并列出每次失败的时间与状态码(失效模式比失效率更有信息量)。版本历史用表格呈现,不做统计。
Reproducibility check
第三方的验证路径极短:下载包 → 运行 sha256sum -c SHA256SUMS → 按发布的规则重算 bundle_digest → 与文章正文中的 digest 比对。三步全部用通用工具完成,不需要信任我们的任何脚本。若我们后续静默修改了数据,读者手里的旧 digest 会立刻对不上——这正是把 digest 印进文章的意义。
Known pitfalls
①bundle_digest 的连接规则没写死,导致第三方算不出同一个值,绑定形同虚设。②覆盖发布:把 v1.0.0 的文件原地改掉,所有引用旧版的读者陷入不可解释的矛盾。③把平台整页 HTML 或整份 PDF 条款打包发布,越过引文边界。④许可栏留空或对第三方材料标成自有许可。⑤只发压缩包不发解压后的逐文件哈希,第三方无法定位是哪一份变了。⑥镜像用同步工具单向覆盖,主站被污染后镜像也被污染——所以镜像必须比对 digest 而不是盲目同步。
Risk
许可一旦发布事实上不可撤回(已被下载与镜像),因此首发前必须定稿。签名私钥丢失或泄漏都会破坏信任链,需离线保管并预先写好轮换与吊销的公告方式。发布第三方材料时宁可少发——被要求下架的成本远高于事前克制。

SUPPORTS / 可以确立:任何人拿到的这一份数据集,与我们发表文章时所用的那一份逐字节相同;可以确立版本沿革、每次更正的时间与原因;可以确立哪些文件是我方产出、哪些是第三方材料及其出处。

DOES NOT SUPPORT / 哈希只能确立完整性,不能确立正确性——一份被完美签名的错误数据仍然是错误数据。签名只能确立「持有私钥者发布了它」,不能确立发布者身份的真实性(除非公钥通过独立渠道被确认)。许可标注表达的是我们的意图与理解,不是关于第三方材料权利状态的法律判断;THIRD_PARTY.md 也无法确立第三方材料的引用一定被权利人接受。

EVIDENCE RETAINED / MANIFEST.csv、SHA256SUMS、可选的 SHA256SUMS.minisig · bundle_digest(同时出现在文章、方法页、MANIFEST 头部注释) · CHANGELOG.md、ERRATA.md、THIRD_PARTY.md、LICENSE · availability_checks.csv(check_ts_utc, url, http_status, digest_match, mirror_id) · 打包脚本 build_bundle.sh 与其输出日志
RECORDED FIELDS (18)
  • dataset_version / semver / 包级版本,独立于 spec_version
  • bundle_digest / hex64 / 按固定规则计算,须与文章正文一致
  • n_files_manifest / count / MANIFEST 登记文件数
  • n_files_disk / count / 磁盘实际文件数,须相等
  • integrity_pass / count / 哈希重算一致的文件数
  • orphan_files / count / 未登记的孤儿文件,闸门 0
  • ghost_entries / count / 登记却不存在的条目,闸门 0
  • data_bytes / bytes / data/ 体积
  • evidence_bytes / bytes / evidence/ 体积
  • license_id / text / 逐文件许可标识
  • third_party_files / count / 标记为第三方材料的文件数
  • changelog_entries / count / 须等于已发布版本数
  • errata_entries / count / 累计勘误条数
  • superseded_rows / count / 被替代的观测行数
  • tombstone_rows / count / 因法律/个人数据被删除的行数(只留墓碑)
  • mirror_digest_match / bool / 镜像与主站 digest 是否一致
  • availability_success / count / 可达性检查成功次数 / 总次数
  • rebuild_byte_identical / bool / 二次构建是否字节相同
SPECIFICATION
AXP-REPRO-v1/P6

发布前自检:用机器把「文章里的每个数字」按回数据集里

  1. 实现 preflight.py,输出机器可读的 preflight_report.json:每项检查一条记录(check_id, name, severity, result ∈ {pass, warn, fail}, n_checked, n_failed, examples[≤5], ts_utc)。severity=blocking 的任一 fail 即中止发布。
  2. 结构类检查:C01 所有表可按 RFC 4180 解析、UTF-8 无 BOM、LF 换行、列数恒定;C02 schema 校验零错误;C03 obs_id 唯一、非空、符合模式;C04 (metric_id, platform_id, run_id, seq) 组合无重复;C05 所有受控词表字段闭合。
  3. 值与状态一致性:C06 status=ok ⟺ 恰一个 value_* 非空,其余状态下 value_* 全空且无哨兵值;C07 unit 属于该指标允许的单位集合;C08 每列的值域检查(比例统一用 [0,1] 还是 [0,100] 必须在 schema 声明并强制执行);C09 ts_end ≥ ts_start、duration ≥ 0、seq 单调、ts_utc 落在 run 窗口内。
  4. 算术恒等式:C10 所有 derived 行按公开公式重算,与发布值在发布精度上完全一致(差值 ≤ 0.5×10^(−d),d 为发布小数位);例如任何总成本类字段必须等于其各分项之和,不得手动微调。
  5. 跨表引用:C11 观测表中的 platform_id 必须存在于 platforms.csv;每个 evidence_ref 必须在 MANIFEST 中存在且哈希匹配;每个 metric_id 必须有对应且版本一致的方法页。
  6. 文章 ↔ 数据集绑定:C12 文章中出现的每一个数字都必须在 figures.csv 中登记(figure_id, claim_text_zh, metric_id, query 或 script 路径, expected_value, decimals, tolerance),由 preflight 按登记的查询在数据集上重算并与文章值比对,不一致即 blocking fail。文章中不允许存在未登记的数字。
  7. 矛盾检测:C13 同一平台在 A 表被标 not_applicable、却在 B 表有该功能的 measured 行;证据日期晚于 run 结束时间;documented 行的 source_capture_ts 落在其声明有效期之外;同一 obs_id 在两个版本间数值变化却无 CHANGELOG 条目。
  8. 覆盖与不确定度:C14 按 P3 计算覆盖率并施加 0.80 / 0.50 闸门与 0.20 平台极差警戒;C19 有效数字检查——发布小数位不得超过 resolution 与不确定度允许的位数(例如 unc=±3 ms 时不得报到 0.1 ms)。
  9. 边界句检查:C20 每条结论在 claims.csv 中登记(claim_id, claim_text, evidence_type ∈ {measured, derived, documented, third_party}, supporting_obs_ids)。evidence_type=measured 的结论必须至少引用一条 measured 行;只有文档类支撑的结论必须携带边界句(形如「这只能确立平台在 T 时刻如此表述,不能确立其实际行为」),缺失即 fail。
  10. 继承 P4 的泄漏扫描(C15,闸门 0 命中)、P2 的时钟闸门(C16)、P5 的完整性与许可检查(C17:MANIFEST 每个文件有 license;第三方文件必须出现在 THIRD_PARTY.md)、C18 平台名规范化(正文与表格中的展示名必须来自 platforms.csv 的 canonical_name)。
  11. 植入缺陷自校验(仪器自校验):维护 fixtures/seeded/ 共 25 份,每份在合法夹具上只植入一种已知缺陷(加 BOM、去时区、用 −1 哨兵、重复 obs_id、哈希不匹配、孤儿 evidence_ref、单位错配、词表外取值、status=not_measured 却有值、把文章数字改动一位、把 not_applicable 的举证删掉、跨表矛盾、精度超限、许可留空、第三方文件未登记等)。要求检出率 25/25;漏检任何一种,视为校验器不合格,其「全绿」结果无效。
  12. 两人规则:preflight 必须由未参与该批次数据采集的成员运行并签署,记录 preflight_run_by 与 preflight_signed_by(二者可同人但都不得是数据生产者)。签署即对外承诺:所有 blocking 项为 pass,所有 warn 项已逐条给出接受理由。
  13. 人工抽验:从已发布单元格中随机抽 30 个(跨指标、跨平台分层),由未记录这些行的操作员仅凭证据独立复读其值,计算单元格级证据吻合率 E。E 的点估计 ≥ 0.95 且 Wilson 95% 下界 ≥ 0.85 方可发布,否则该批次全量复核。
Quantity measured
自检通过情况:blocking_fail = severity=blocking 且 result=fail 的检查项数,发布闸门 = 0;warn_accepted = 被接受的告警数(每条须有书面理由);植入缺陷检出率 D_seed = 被检出的植入缺陷数 / 25,闸门 = 1.000;文章数字重算一致率 F = |x_recomputed − x_published| ≤ 0.5×10^(−d) 的数字个数 / 文章中登记的数字总数,闸门 F = 1.000;单元格级证据吻合率 E = 复读与发布值一致的单元格数 / 30。
Fixed parameters
人工抽验 n=30:在真实吻合率 0.97 附近,n=30 的 Wilson 95% 下界约 0.85,恰好能把「几乎无误」与「系统性录入问题」区分开,同时约合 1.5–2 人日,符合 4 人团队预算。植入缺陷 25 种:覆盖本规范全部闸门类别各至少 1 种。数字比对容差 τ = 0.5×10^(−d)(d 为该数字在文章中的小数位),计数与字符串要求精确相等。
Sample size
C01–C20 全部为普查:覆盖发布包中每一行、每一个单元格、文章中每一个登记数字。植入缺陷对照固定 25 份。人工盲读抽验 n=30,按 metric_id × platform_id 分层随机(每个平台至少 4 个,保证不会有平台完全落空)。若首轮 E 未达闸门,第二轮改为 n=100 的全面复核。
Control
运行者与数据生产者分离(两人规则);人工抽验的复读者不得是原记录者且不看原值(盲读);植入缺陷夹具作为已知答案对照,用于验证校验器本身而不是数据。每次发布都重跑全部对照,不复用上次结果。
Statistical treatment
闸门类指标(blocking_fail、D_seed、F)不做统计推断,是发布前置条件。E 是比例:报点估计 + Wilson 95% CI + n,并列出所有不一致单元格的具体差异与成因分类(录入错、单位错、证据歧义、原值确实错)。warn 项逐条列出并附接受理由,不做汇总打分——把告警压缩成一个分数会让人不看细节。
Reproducibility check
preflight.py 与全部夹具随包发布,第三方可在自己的机器上对发布包重跑,应得到与 preflight_report.json 相同的结论(该脚本必须是确定性的:固定排序、固定 locale=C、固定浮点格式化)。第三方也可以只用 figures.csv 手工抽查几个数字——这是最低门槛的复现路径,不需要跑任何代码。
Known pitfalls
①校验器只检查「有没有值」不检查「值之间是否自洽」,于是内部矛盾的数据全绿通过。②文章后期改稿新增了一个数字却没登记进 figures.csv——所以 C12 必须扫描文章正文中所有数字形态的 token 并要求全部有登记,未登记即 fail。③把 blocking 降级成 warn 以赶发布时间:warn 的接受理由必须署名留档,让降级有成本。④用生产数据去测试校验器(数据全绿只能说明数据没触发规则,不能说明规则有效)——所以必须有植入缺陷对照。⑤preflight 由数据生产者本人运行签署,等于没有检查。
Risk
自检脚本本身可能有 bug 并给出虚假的全绿,这是本协议最危险的单点——植入缺陷对照与人工盲读抽验就是为此设置的双重保险,二者不得因赶工省略。若某次发布确实需要在 blocking 未清零时发出,正确做法是缩小发布范围(撤下未过闸的表)而不是放宽闸门。

SUPPORTS / 可以确立:发布包内部自洽(结构、值域、算术、跨表引用、时间、覆盖、精度、许可),文章中的每一个数字都能由公开数据集重算得出,且这套检查本身经过已知缺陷对照验证过是有效的;还可以确立检查由数据生产者之外的人执行并签署。

DOES NOT SUPPORT / 不能确立数据反映了外部现实——自洽不等于真实:一批采集方法有系统偏差的数据可以完美通过全部 20 项检查。也不能确立不存在我们未曾设想的缺陷类别:D_seed=25/25 只说明校验器能抓住我们已知的 25 种问题,检出率是对已知缺陷集的检出率,不是对全部可能缺陷的检出率,方法页必须这样表述。人工抽验的 E 只覆盖已发布单元格,对被记为 not_measured 的部分毫无信息。

EVIDENCE RETAINED / preflight_report.json(含每项检查的 n_checked / n_failed / 样例) · figures.csv(文章数字 ↔ 数据集查询的登记表) · claims.csv(结论 ↔ 证据类型 ↔ 支撑 obs_id) · seeded_defect_report.json(25 种植入缺陷的检出明细) · cell_audit.csv(30 个盲读抽验记录) · 签署记录 preflight_signoff.csv(run_by, signed_by, ts_utc, bundle_digest)
RECORDED FIELDS (19)
  • check_id / text / C01…C20
  • check_name / text / 检查项中文名
  • severity / enum / blocking/warning
  • result / enum / pass/warn/fail
  • n_checked / count / 该项检查覆盖的行或单元格数
  • n_failed / count / 未通过数
  • blocking_fail_total / count / 发布闸门 0
  • warn_accepted / count / 每条须有署名理由
  • seeded_defects_detected / count / 检出数 / 25
  • figures_registered / count / 文章中登记的数字个数
  • figures_recomputed_match / count / 重算一致数,闸门等于登记数
  • claims_registered / count / 登记结论数
  • claims_doc_only_with_boundary / count / 仅文档支撑且已带边界句的结论数
  • cell_audit_n / count / 盲读抽验样本量,默认 30
  • cell_audit_match / count / 吻合单元格数
  • E_ci_low / ratio / Wilson 95% 下界,闸门 ≥0.85
  • preflight_run_by / text / 操作员代号,不得为数据生产者
  • preflight_signed_by / text / 签署人代号
  • preflight_ts_utc / RFC3339 / 自检完成时刻
SPECIFICATION
AXP-REPRO-v1/P7

独立复现演练与《复现说明》:让一个陌生人在一台干净机器上重算出全部数字

  1. 撰写 REPRODUCTION.md,必须包含十项:①本数据集是什么、dataset_version 与 bundle_digest;②对应的规范版本与方法页链接;③环境要求(操作系统、Python 版本、依赖及其锁定文件 requirements.txt 带哈希或 uv.lock;可选 Dockerfile 并固定基础镜像摘要);④从原始数据到全部已发表数字的确切命令(目标是一条:make reproduce);⑤预期产物清单及其 SHA-256;⑥容差表:逐个 figure_id 给出判定一致的容差与理由;⑦本数据集无法复现什么(见下条);⑧如何重新测量(协议链接、所需账户与资金区间、风险提示);⑨勘误与联系渠道;⑩异议流程:任何平台或读者可提交证据请求更正,我们复核后以版本号 bump + ERRATA 条目的方式公开处理,不静默改数。
  2. 在 REPRODUCTION.md 首屏用一整段区分两个概念,且此后全刊物统一使用:计算可复现(computational reproducibility)= 同一份数据 → 同样的数字,是确定性的,闸门 100%;经验可重复(empirical replication)= 新的测量 → 相近的数字,本就会波动,不设闸门。把两者混为一谈是评测行业最常见的过度承诺,本刊物明确拒绝。
  3. 保证确定性:固定随机种子并写进配置、固定排序键(含并列时的次级排序键)、固定 locale=C、固定浮点输出格式(一律用定点字符串格式化后再写盘,不用平台默认的 repr)、避免依赖字典/集合的遍历顺序、打包固定 SOURCE_DATE_EPOCH。任何无法确定化的步骤必须在容差表中标明并给出容差来源。
  4. 阶段 A 冷启动内部演练:由未参与构建流水线的操作员,在一台干净机器(或全新容器)上,只用公开发布包,从零开始执行 REPRODUCTION.md。全程计时并记录:TTFF(拿到第一个数字所需分钟数)、总耗时、每一次卡壳、每一处需要口头询问才能继续的步骤。每一个「需要问人」的地方都记为一个文档缺陷 D_doc。
  5. 修复—重演循环:修完文档缺陷后,换另一名操作员再跑一次,直到 D_doc = 0 且两次运行输出的哈希一致。两次运行必须在不同机器上完成(排除某台机器的残留环境)。
  6. 阶段 B 外部尝试:邀请 ≥ 1 名团队之外的志愿者仅凭公开发布包复现,不提供任何私下协助(他们的每个提问都记为文档缺陷)。外部复现只涉及计算复现,绝不要求志愿者开户、充值或花任何钱。经其同意后原文发布其报告(含失败与吐槽),并公布尝试次数与结果。
  7. 逐 figure 比对:对 figures.csv 中的每个数字,用复现产物与已发表值比对,按容差表判定;输出 reproduction_report.csv(figure_id, published_value, reproduced_value, abs_diff, tolerance, verdict)。任何一个 verdict=mismatch 都必须在发布前解决——要么是脚本非确定,要么是发布值本身错了,两者都必须查清。
  8. 再测量的边界说明:如果条件允许做一次小规模再测量(例如同一指标隔 4 周重测),把结果作为「漂移」发布:报告差值分布与时间间隔,并明确写出漂移不等于错误——平台会变、市场会变,这正是我们要按版本发布数据集的原因。再测量不是对旧数据的否定。
  9. 把复现能力本身作为可发布指标:每个发布周期公布 R_c、TTFF、总耗时、D_doc、外部尝试次数与成功次数。这组数字随时间的变化,是这份刊物是否真的在变得更可复现的唯一诚实证据。
Quantity measured
计算复现一致率 R_c = 满足 |x' − x| ≤ τ_f 的数字个数 / 已发表数字总数,其中计数与字符串 τ_f = 0,浮点 τ_f = 0.5×10^(−d)(d 为发布小数位),含重采样的统计量在种子固定下应为 0 差异;发布闸门 R_c = 1.000。文档缺陷数 D_doc = 复现者需要额外询问或自行猜测才能继续的步骤数,二次演练闸门 D_doc = 0。冷启动耗时 TTFF 与 T_total(分钟),报告 ≥2 次独立运行的中位数。外部复现成功率 = 成功完成的外部尝试数 / 外部尝试总数(如实报告,无闸门)。
Fixed parameters
容差 τ_f 完全由发布精度决定,不允许为了让数字对上而放宽——若必须放宽,说明发布精度虚高,应减少小数位而非增大容差。内部冷启动演练 ≥ 2 次(不同人、不同机器)。外部尝试每个发布周期 ≥ 1 次。演练环境要求「干净」:全新容器或刚重装的系统,禁止使用采集机(采集机上残留的凭据与缓存会掩盖文档缺陷)。
Sample size
复现的单位是整个数据集与文章:R_c 覆盖 figures.csv 中 100% 的数字(普查,不抽样)。演练次数:内部 ≥ 2、外部 ≥ 1 每发布周期。若做再测量漂移,每指标每平台 ≥ 20 个配对观测才报告分布,少于 20 只报个案并明确标注 n。
Control
演练者与流水线构建者严格分离;演练者只能访问公开发布包,私有仓库对其关闭(用权限而非自觉来保证)。两次内部演练在不同机器上进行,互为对照。外部尝试是最强对照——它同时检验了发布包、文档与我们的自我认知。
Statistical treatment
R_c 是闸门型比例,报分子分母原值。TTFF 与 T_total 是长尾时间量:报中位数与全部原始观测(n 很小,画点而不是画箱线图,禁止只报平均值)。D_doc 报计数与逐条清单。再测量漂移报差值的中位数、IQR、p10/p90 与配对数 n,并明确声明这是漂移不是误差,不构成对任一平台的评价。
Reproducibility check
这一条本身就是给第三方的验证程序:他们做的正是我们在阶段 A/B 做的事。为让第三方能核对我们没有偷懒,drill_log.csv 与外部报告一并发布,读者可以看到我们的复现演练花了多久、卡在哪里。仪器自校验:在一次演练中故意使用一份被篡改的发布包(改动一个数值),流程应当在 reproduction_report 中产生 mismatch 并被发现——若发现不了,说明比对环节形同虚设。
Known pitfalls
①在采集机上做冷启动演练,机器里残留的凭据、缓存和环境变量让流程「看起来能跑」。②口头指导演练者,导致文档缺陷被消化在对话里而不是被记录。③承诺「任何人重测都会得到相同数字」——这是不可能的,也会在第一次被人重测时反噬。④浮点格式化随平台变化导致输出哈希不一致,被误判为数据问题。⑤要求外部志愿者开户或出资,这既不道德也会让复现变成少数人的特权。⑥容差表按「让结果通过」反推,等于取消了这项检查。
Risk
外部复现者可能公开指出我们的错误,这是设计意图而非风险;预先约定:外部报告原文发布、不删负评、发现的错误按勘误流程处理。真正的风险是把复现演练做成走过场(自己人跑一遍自己写的脚本),因此「演练者与构建者分离」与「干净机器」两条不可妥协。计算复现不涉及任何真实资金;一切需要真实资金的再测量属于其它 AXP-* 指标的范围,其金额区间与风险由那些协议各自声明,本协议只要求把金额、币种与风险提示随数据一并发布。

SUPPORTS / 可以确立:文章中的每一个数字都能由公开发布包在独立环境中被重算出来,重算路径已被至少两名未参与构建的人走通,并量化了走通所需的时间与文档缺陷数;也确立了我们对「哪些东西不能被复现」的说明是事先写明的而非事后辩解。

DOES NOT SUPPORT / 不能确立测量结论为真——计算可复现只保证从数据到数字这一段没有黑箱,不保证数据本身正确、方法本身无偏、样本本身有代表性。也不能确立后续重测会得到相同结果:市场、平台版本、费率与政策都会变,任何再测量的差异都不能自动解读为哪一方出错。对 documented 类结论,复现只能确立「我们当时抓到的文本被正确地转成了数据」,无法确立平台的实际行为——这条边界必须在 REPRODUCTION.md 与每篇文章中重复出现。

EVIDENCE RETAINED / REPRODUCTION.md 与 requirements.txt/uv.lock(可选 Dockerfile 及其基础镜像摘要) · reproduction_report.csv(逐 figure 比对结果) · drill_log.csv(每次演练:drill_id, operator_id, machine_id, start/end, TTFF, D_doc 明细) · 外部复现者的原始报告(经同意后原文发布) · 两次运行产物的 SHA-256 对照表
RECORDED FIELDS (17)
  • drill_id / text / 格式 D-YYYYMMDD-NN
  • drill_type / enum / internal_cold_start / external
  • operator_id / text / 演练者代号;外部为 EXT-01
  • machine_id / text / 机器/容器标识,须与构建机不同
  • bundle_digest_used / hex64 / 演练所用发布包摘要
  • ttff_min / min / 拿到第一个数字所需分钟
  • total_min / min / 完成全部复现所需分钟
  • d_doc / count / 文档缺陷数,二次演练闸门 0
  • figures_total / count / 待复现数字总数
  • figures_match / count / 在容差内一致的数字数
  • R_c / ratio / figures_match/figures_total,闸门 1.000
  • max_abs_diff / text / 最大绝对差及其 figure_id
  • output_hash_match / bool / 两次独立运行产物是否哈希一致
  • external_attempts / count / 外部尝试次数
  • external_success / count / 外部成功次数
  • replication_gap_days / days / 再测量与原测量的间隔(如做)
  • replication_delta_p50 / text / 再测量差值中位数,单位随指标,标注为漂移非误差
SPECIFICATION
RPT

Reporting rules for this benchmark

How results from this protocol may and may not be described once a dataset exists. Author: Axial Proof Editorial Team. Independent reviewer: Axial Proof Review Team.

CONSTRAINTS

1. 只发布 preflight 全绿(blocking_fail = 0)且由非数据生产者签署的表。未过闸的表若仍要发,必须带「未通过发布自检,不用于跨平台比较」的标注,且不得进入任何排名或对比图。 2. 任何比例必须与分母 n 和覆盖率同屏出现。禁止「平均值 12.3」这种脱离 n 与覆盖率的孤零零数字;长尾量(延迟、耗时、时长)只报 p50/p90/p99/max,不报均值。 3. 严格区分并始终使用两个词:计算可复现(同数据 → 同数字,我们承诺 100%)与经验可重复(新测量 → 相近数字,会波动,不承诺)。绝不写「任何人重测都会得到相同结果」。 4. 严格区分四类观测。documented 类证据只能支持「某方在 source_capture_ts 这一刻公开写着 X」,不能支持「某方实际执行 X」,也不能支持「某方一贯如此」。每一处只有文档支撑的结论必须携带边界句,这是本刊物的招牌,不是可选修辞。 5. 登记类事实按登记机构自己的措辞表述:注册 / 登记 ≠ 牌照 ≠ 批准 ≠ 背书。若某登记机构明确声明其注册不等于发牌、且不发放牌照或注册证书,则文中不得出现「持牌」「获批」「受监管认证」等表述;登记记录中某字段为空只能记为 null_observed,不得据此推断任何原因、动机或风险结论。 6. 不做法律定性:不判断任何平台是否合规、是否违法、是否需要或已获得某项欧盟授权。可以陈述「在欧盟框架下,该指标关系到用户能否事前知道成本 / 能否取回资产 / 能否行使数据权利」这类意义说明,但意义说明与合规判断之间的界线要在文中明写。 7. 缺失就是缺失:null_observed / not_measured / not_applicable / blocked / withheld / invalid 六种空各有各的含义,正文与图表中不得统一显示为「—」或 0。图例必须把这六种区分开;被拦截(blocked)要正面呈现为观测结果,不能悄悄消失。not_measured 不得被暗示成平台的问题。 8. 有效数字不超过不确定度与仪器分辨率允许的位数。跨平台差值必须给不确定度或明确标注为单次观测;差值落在不确定度范围内时,写「未能区分」而不是写谁更好。 9. 文章中的每个数字都带 figure_id、可在数据集中重算;文章同时标明 dataset_version 与 bundle_digest。任何更正都必须同时 bump 数据集版本、写 CHANGELOG 与 ERRATA,并在文中留下更正痕迹——绝不静默改数。 10. 异议处理公开进行:平台或读者提交证据后,我们复核、必要时发布勘误并说明改了什么、为什么;若不采纳,也公开说明理由。外部复现者的报告原文发布,包括对我们不利的部分。 11. 不因任何商业关系(赞助、联盟、导流、广告)调整数据、措辞或发布顺序;任何商业关系在文章与数据集中同时披露。数据集的许可与发布不设人群门槛,不做「注册后可下载」。 12. 本规范自身的所有闸门数字(0.80 / 0.50 / 0.20 / κ 0.80 / E 下界 0.85 等)在方法页必须标明哪些是统计推导、哪些是编辑判断的约定——把约定说成定理,是可复现性叙事里最隐蔽的一种失真。