# R2.7.10 任务报告

## 结果

已将 SuperAPI 捕获模式从客户端 header 触发改为服务端 YAML 控制的全量模式，并快进合并到 `/root/superapi` master，提交为 `338c4a4 feat: capture all gateway traffic to rolling JSONL`。正式服务已从 master 重启并通过普通 Codex 客户端真实验收。

## YAML 配置

`config/superapi.yaml#gateway.requestCapture` 当前声明：

- `enabled: true`
- `mode: all`
- `format: jsonl`
- `outputDir: /root/superapi/.state/captures`
- `maxDiskBytes: 4294967296`，即 4 GiB
- request 与 response 独立目录
- 存储分区时区固定 `UTC`，粒度为小时
- 查询默认时区 `Asia/Shanghai`
- 查询默认 20 条，最大 200 条

Codex 测试配置已移除 `X-SuperAPI-Capture-ID`，没有新增 Codex 全局变量或持久环境变量。

## 存储与滚动

- 请求记录同时保存入口请求和 skill 注入后的上游请求。
- 响应通过 `ReadableStream.tee()` 捕获完整同步或流式 body，客户端继续消费原支路。
- 请求和响应分别写入：
  - `requests/YYYY-MM-DD/HH/requests.jsonl`
  - `responses/YYYY-MM-DD/HH/responses.jsonl`
- 日期和小时均使用 UTC。
- 所有捕获文件共享 4 GiB 上限；写入前删除最旧文件，空目录随之清理。
- 单条记录超过上限时只记录捕获错误，不改变客户响应。
- 目录权限为 `0700`，JSONL 权限为 `0600`。
- Authorization、Cookie、API Key、token、secret 和已声明 profile Key 均在落盘前脱敏。

## CLI

- `capture status`：显示 enabled、模式、格式、上限、实际占用、文件数、request/response 文件数和最旧/最新文件。
- `capture list --kind request|response|all --time-zone <IANA> --limit <n>`：渐进披露时间、类型、profile、方法或状态、body 字节数和源文件，不展开 body。
- 查询时区只影响展示，不改变 UTC 存储路径和 `capturedAt`。

## L0

`bun scripts/superapi-cli.ts l0 probe` 通过：

- skill instructions 保留与注入通过；
- UTC 小时分区通过；
- request/response 双 JSONL 通过；
- disposable fixture 小容量滚动后实际占用不超过上限；
- `Asia/Shanghai` 查询把 UTC 10:00 转换为 18:00；
- 客户端 capture header 为 false。

## L1 与真实 Codex

正式 master native/public 均 ready，公网入口为 `https://superapi.hwpod.com`。真实 Codex CLI `0.144.5` 使用普通 SuperAPI provider 配置，未携带 capture header，返回：

`SUPERAPI_FULL_CAPTURE_MASTER_OK`

正式运行指标：

- requests：1
- injected：1
- capturedRequests：1
- capturedResponses：1
- captureErrors：0
- upstreamErrors：0

本次记录位于 UTC `11` 点目录：

- `/root/superapi/.state/captures/requests/2026-07-18/11/requests.jsonl`
- `/root/superapi/.state/captures/responses/2026-07-18/11/responses.jsonl`

内容核对：

- 请求没有 capture header；
- Authorization 已脱敏；
- 上游 request 包含 `pika-company-dev`；
- request 与 response 均包含验收 marker；
- response 状态 200 且包含 `response.completed`；
- 两侧均不含真实 profile Key。

同一记录通过 UTC 查询显示 `11:00`，通过 `Asia/Shanghai` 查询显示 `19:00`，源文件仍保持 UTC `11` 目录。
