# Trace API 覆盖矩阵门禁 本文件用于解决“Trace 已经命中 WebAPI,但补环境阶段仍反复遇错新增 WebAPI”的流程问题。只要存在 RuyiTrace NDJSON、Node trace、`missing-env.json`、Hook 环境访问日志或等价环境日志,进入第一版 Node.js 补环境实现前必须读取本文件。 ## 核心原则 - Trace 不是调试参考,而是首轮补环境范围的主输入。 - 已在 Trace 中命中的 WebAPI 不得等到 `ReferenceError`、`undefined.prototype`、writer 不触发或 body 长度异常时再临时补。 - Node probe 只用于验证覆盖、发现 Trace 未覆盖的新动态分支和定位行为差异;不得把 probe 当作主要 WebAPI 发现机制。 - Trace 能确认“访问了什么”,但不一定能确认“真实返回值是什么”。需要真实值或浏览器行为语义的 API 必须在矩阵中标为“需要同 baseline 采样”,不得先挂空壳。 - inventory 不能证明 runtime 正确。第一轮实现后必须继续按 `trace-runtime-conformance.md` 生成可执行行为契约、运行 no-send Node audit 并完成 P0/P1 深度 diff。 - `implemented-first-pass` 不是人工状态;只有实现文件存在、runtime 实际加载且 Trace-runtime audit 通过后才能使用。 ## 必须产物 进入第一版 `env` / `node-runtime` / signer probe 前,必须生成并写入: ```text case/notes/trace-api-inventory.json case/notes/env-coverage-matrix.md case/notes/missing-env-priority.md case/notes/trace-runtime-contract.json case/tmp/node-trace-runtime-audit.json case/notes/trace-runtime-diff.md ``` `trace-api-inventory.json` 至少包含: ```json { "schemaVersion": "trace-api-coverage/v1", "source": "RuyiTrace NDJSON / Node trace / Hook", "baselineId": "fp-example-001", "apis": [ { "api": "navigator.userAgent", "category": "navigator", "priority": "P0", "accessTypes": ["get"], "count": 12, "evidence": ["stack.file:line:col"], "traceStatus": "complete", "implementationStatus": "planned-first-pass", "implementationFile": "result/src/node-runtime/env/browser-objects/navigator.js", "samplingRequired": false, "reason": "Trace 命中,基础 navigator 字段必须首轮实现" } ] } ``` `env-coverage-matrix.md` 至少包含: - Trace 来源、日志覆盖范围、`baselineId`、是否存在 profile / baseline 冲突。 - P0/P1/P2 分类规则。 - 每个 Trace 命中 API 的处理状态。 - 首轮必须实现清单。 - 需要同 baseline 采样后实现清单。 - 暂不挂载清单及原因。 - native 能力缺口清单。 - 计划外新增 WebAPI 记录方式。 ## API 状态枚举 每个 Trace 命中的 API 必须选择一个状态: | 状态 | 含义 | 是否允许进入第一版 env | |---|---|---| | `planned-first-pass` | Trace 已命中,首轮必须实现 | 允许,但必须在第一版 env 实现后再 probe | | `implemented-first-pass` | 已在第一版 env 中实现 | 允许 | | `needs-baseline-sampling` | 需要同一 `baselineId` 下采样真实值或行为 | 允许作为阻塞采样项,不允许挂空壳 | | `deferred-not-mounted` | 暂不挂载,且有明确证据说明目标路径不需要或挂载会扰动 writer | 允许,但必须写原因 | | `native-capability-gap` | 纯 JS / addon / xbs 当前能力都无法可靠表达 | 阻塞,进入 native 能力缺口闭环 | | `unplanned` | 未规划 | 不允许进入补环境实现 | | `live-discovered` | Trace 未覆盖,后续 live probe 新分支发现 | 允许后续新增,但必须说明为什么 Trace 未覆盖 | | `missed-from-trace` | Trace 已命中但前置矩阵遗漏 | 流程缺陷;必须修正矩阵并记录防回退 | ## 优先级规则 P0:影响 JS 能否执行、writer 是否可达、Cookie / Storage / XHR / fetch / sendBeacon / window / document / location / navigator 基础字段 / Function.toString / Node 泄露阻断的 API。 P1:影响高强度检测分支、指纹结构、DOM / CSSOM / 事件 / performance / time / random / screen / Permissions / Plugins / MimeTypes 的 API。 P2:业务页分支、第三方脚本、低频能力、非当前 writer 路径的 API。 P0/P1 中 Trace 已命中的基础 WebAPI 不允许“先不补,遇错再补”。如果暂不实现,必须是 `needs-baseline-sampling`、`deferred-not-mounted` 或 `native-capability-gap`,并写清证据。 进入 signer probe、真实请求或 final writer 判断前,所有 P0/P1 必须进一步通过: ```bash node scripts/build_trace_runtime_contract.js --case-dir case --baseline-id --markdown node scripts/run_trace_runtime_audit.js --case-dir case --entry case/result/final.js --markdown node scripts/check_trace_runtime_conformance.js --case-dir case --markdown node scripts/check_trace_api_coverage.js --case-dir case --require-runtime-closure --markdown ``` 具体契约字段、audit-only 环境变量和哈希失效规则见 `trace-runtime-conformance.md`。 ## 真实值类 API 以下 API 不允许先挂空壳或随机值: - Canvas:`toDataURL`、`getImageData`、`measureText` - WebGL / WebGPU:`getParameter`、`readPixels`、adapter / renderer 信息 - Audio:`getChannelData`、OfflineAudioContext 渲染结果 - DOM 几何:`getBoundingClientRect`、`offsetWidth`、`clientWidth`、字体测量 - Speech / voices、Storage estimate、Permissions 状态、Plugins / MimeTypes 处理方式: 1. Trace 已命中但值缺失、截断、baseline 不一致时,矩阵标为 `needs-baseline-sampling`。 2. 在同一 `baselineId` 下采样完整值或短行为。 3. 接入 fixture 回放。 4. 输出 `fingerprintReplayMisses` 或等价 miss 明细。 5. miss 非空时不得声明指纹回放闭环。 ## 后续阶段新增 WebAPI 规则 阶段报告中不得再笼统写“本阶段新增 / 修改的 WebAPI”而不解释来源。必须拆成: 1. Trace 计划内首轮实现 / 调整的 WebAPI。 2. 计划外新增 WebAPI 与原因。 如果新增 / 调整涉及 `XMLHttpRequest`、`fetch`、`sendBeacon`,阶段报告还必须记录 XHR/fetch Session Bridge 模式;如果涉及浏览器对象内部状态、属性枚举或 descriptor,阶段报告还必须记录对象形状审计矩阵和 `_` / `__` 私有状态泄露检查结果。 计划外新增只能属于以下原因之一: - `trace-not-covered`:原 Trace 没覆盖该动态分支。 - `dynamic-resource-new-branch`:运行时刷新到新的动态 JS / chunk / challenge 分支。 - `baseline-mismatch`:Trace profile 与 fixed baseline 不一致,需重新采样后实现。 - `trace-truncated`:Trace 字段疑似 4000 / 4096 截断,需补采。 - `native-gap`:前置矩阵已标记为 native 能力缺口。 - `missed-from-trace`:Trace 已命中但矩阵遗漏。该项必须标为流程缺陷,补写矩阵和代码变更记忆后才能继续。 如果计划外新增 WebAPI 的真实原因是 `missed-from-trace`,不得把它写成普通能力增量。 ## 检查命令 存在 Trace 的 case 在进入 signer probe 前和交付前都应运行: ```bash node scripts/check_trace_api_coverage.js --case-dir case --markdown node scripts/check_trace_api_coverage.js --case-dir case --require-stage-audit --require-runtime-closure --json ``` 检查失败时,下一阶段只能修复 Trace 覆盖矩阵或补齐首轮实现,不能继续新增 signer、发送请求或宣称阶段验证通过。