# B 站动态主动刷新采集器 V001 编码方案 创建人员:`dev.developer.project.secondary / infodev-2` 文件职责:冻结 `DEV-PROJECT-INFO-BILI-DYNAMIC-REFRESH-COLLECTOR-20260813-001` 在实现前的页面刷新、证据、状态、正式保存、重跑和验收合同。 管理规范/模板:`../../../../common/dev-doc/编码规范.md`;`../../../../common/dev-doc/开发审计规范.md`;`../../../../common/dev-doc/编码方案范本.md`。 引用文件:`../../../开发事项总纲.md`;`../../../开发事项计划.md`;`../../../开发执行日志.md`;`../../../../ai-video-downloader/draft/2026-08-04-哔哩哔哩动态采集需求.md`;`../../../../dev/project-dev/bili_dynamic_collector.py`;`../../../../dev/project-dev/test/test_bili_dynamic_collector.py`。 记录方式:重型开发方案;本方案独立审核 `PASS/0` 前不得修改产品代码、测试、fixture、正式采集目录或小时任务。 ## 1. 事项、角色与重型判断 - 事项:`DEV-PROJECT-INFO-BILI-DYNAMIC-REFRESH-COLLECTOR-20260813-001`。 - 需求:`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;正式分派消息=`msg_20260813110304034_ea344f45`。 - 唯一 owner:`dev.developer.project.secondary / infodev-2 / 019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 原 reviewer:`dev.reviewer.project / inforev / 019fb7c5-e1fd-7df0-8ec9-c87edea4215d`。 - 请求方:`case_analysis.video_downloader / 019fcc5d-798f-7ea1-8325-3a4d1f2dc5a5`。 - 分类:重型。原因是新增真实页面控制编排、跨调用 durable run、正式正文/图片落盘、两个 append-only manifest 的事务协同、小时重跑和故障恢复;不是对原 `check` 的局部改名。 单一实施与审核链保持不变;原 MVP `DEV-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-20260804-001` 的 `PASS/0 / ACCEPTED_CLOSED` 是冻结历史,本事项不改写它。 ## 2. 问题与冻结基线 ### 2.1 真问题 现有小时流程在页面读取失效后,只使用公开搜索或 API 摘要;空结果被误表述为“无新增”。公开索引既不能证明页面已刷新,也不能证明身份、正文、72 小时覆盖和分页完整性,必须从权威 no-new 判定中移除。 ### 2.2 代码和文档基线 | 工件 | bytes | SHA-256 | |---|---:|---| | `dev/project-dev/bili_dynamic_collector.py` | 60090 | `67B2E6FB34F100C57BF50A4D3067D6FDD6E47C5D3FBEF58D2CF5D8796B07AB8B` | | `dev/project-dev/bili_dynamic_collector.example.json` | 1117 | `42A9AA7EE29ED061DC408C6C9A907FA7B20FD8C2B41605C54B6716A0FE388951` | | `dev/project-dev/test/test_bili_dynamic_collector.py` | 31303 | `D82BFF8AD9B78FD749A7536FF9FED0486CF87D6B9FDDEE7947202C2414AAE322` | | `dev/project-dev/test/fixtures/bili_dynamic_collector/dynamic_items.json` | 1216 | `0CD53C7C93D7E05B4A913EBF5223366E3A06A17E2474DF52BC64F0BB4EBEA71F` | | `dev-doc/project-doc/B站博主动态采集辅助工具.md` | 11950 | `2EE6B01528509D8D6E57D7800BF877FAB7C7F63AE83C1EE8E86D7D247FA730A2` | | `ai-video-downloader/draft/2026-08-04-哔哩哔哩动态采集需求.md` | 4114 | `DC5807D6325AA13B1E0C72C92B9534003CC4F8046A1789AA70FCC98DECC9AB87` | 原公开命令 `check / move-completed / handoff`、退出码、安全路径、secret gate、选择器、移动事务、terminal evidence 和 canonical handoff 均为已通过合同,不得回退。 ### 2.3 正式数据前像 - `ana-data/news-青枫浦上Q/manifest.jsonl=51598 bytes / 0E69AF2AF1C4B0014D2033A21F3986E283ECFD758EA652E7F2416006736C8D73 / 48 lines`。 - 48 行是事件,不是 48 条唯一动态;其中 `SAVED=16`,其余主要是同一视频的 blocked/pending/processing 状态。 - 最后一条事件 `collected_at=2026-08-10T00:41:10+08:00`;文件系统 manifest 写入时间约 `2026-08-10T00:41:54+08:00`。 - 最近正式业务文件为 `20260809-201835_video-cover_...BV1dwum6UEEq.jpg`。 - 新实现只在后续获准运行时追加新 schema 事件,不修改、删除、排序、压缩或迁移上述 48 行。 ## 3. 产品边界与唯一受支持控制面 ### 3.1 能力拆分 Python CLI 不假装能够直接调用 Codex Chrome 工具,也不引入 CDP、remote-debugging、profile 读取、Playwright 持久 profile、浏览器 Cookie 导出或未审核扩展。小时流程由两个已登记组件组成: 1. **受支持 Chrome 控制步骤**:由 `case_analysis.video_downloader` 的 Codex 小时任务使用项目可用的 Chrome 控制能力,对唯一 `creator.dynamic_url` 最多执行一次 `navigate` 或 `reload`,读取页面可见 DOM,并生成无秘密 `browser-evidence.json` 与本地 intake 附件。 2. **项目 CLI 持久化步骤**:`bili_dynamic_collector.py refresh-begin/refresh-commit` 创建运行合同、严格验证浏览器证据、统一标准化/去重、原子落盘并输出五种业务终态。 因此“主动刷新”属于小时任务编排的第一步,CLI 是其 durable begin/commit 与正式保存入口。文档必须明确:只运行 `refresh-commit` 或只查公开索引不等于完成刷新。 ### 3.2 禁止控制面 不得使用 `chrome://extensions`、开发者模式、`--load-extension`、Raw CDP、坐标脚本、profile 注入、Cookie/localStorage 读取、签名媒体 URL、HTTP 412 绕过、验证码处理、循环刷新或更换 header/参数规避平台限制。本事项不下载视频,不修改/发布扩展,不写 policy/HKCU。 ## 4. 配置增量 保留 schema version 1 和现有字段,新增必填 `refresh` object;缺少时只有旧三命令可用,调用 refresh 命令必须 `E_CONFIG`,避免旧配置静默获得正式写权限。 ```json { "creator": { "name": "青枫浦上Q", "uid": "1420210197", "dynamic_url": "https://space.bilibili.com/1420210197/dynamic" }, "refresh": { "archive_dir": "", "formal_manifest": "/manifest.jsonl", "intake_dir": "", "timeout_seconds": 30, "page_ready_timeout_seconds": 15, "dom_read_timeout_seconds": 8, "max_refresh_count": 1, "run_history_slots": 168, "max_items": 200, "max_images_per_item": 20, "max_image_bytes": 31457280, "max_text_bytes": 5242880 } } ``` 冻结规则: - creator name、UID 和 dynamic URL 必须精确为 `青枫浦上Q / 1420210197 / https://space.bilibili.com/1420210197/dynamic`;本事项不支持第二个账号。 - `archive_dir`、formal manifest 和 intake root 必须 lexical lstat 后位于配置允许根内,父链无 reparse;不得依赖个人机器绝对路径写进代码。 - archive/formal 路径只在正式运行配置中由视频下载员消费;示例和测试只使用 `dev/project-dev/tmp` 或 `TemporaryDirectory`。 - 允许调整 `window_hours`、超时、数量和大小上限,但 window 仍限定 `1..744h`,一次刷新仍固定为 1。 ## 5. 小时入口与 durable run ### 5.1 `refresh-begin` ```powershell python dev/project-dev/bili_dynamic_collector.py --config refresh-begin --now ``` 在现有 `StateLock` 下创建 `state_dir/refresh/pending.json`,schema 1 必含: - `run_id`:由 task、creator UID、started_at 和 128-bit OS random nonce 派生的 32 位小写十六进制;nonce 不属于认证秘密。 - `task_id`、`creator_name`、`creator_uid`、`creator_dynamic_url`。 - `started_at`、`deadline_at`、`window_start`、`window_end`。 - `config_sha256`、`formal_manifest_preimage_bytes/sha256`、`state_manifest_preimage_bytes/sha256`。 - `max_refresh_count=1`、`page_ready_timeout_seconds=15`、`dom_read_timeout_seconds=8`。 - `phase=BROWSER_REFRESH_REQUIRED`。 pending 采用 CreateNew + flush/fsync;已有 pending 时先按第 11 节恢复,不能覆盖。begin 不读取浏览器、不碰 archive 内容或两个 manifest。 ### 5.2 Chrome 步骤 小时任务取得 begin stdout 后: 1. 精确匹配现有目标 tab;没有时只导航一次到 exact URL。 2. 现有目标 tab 时只 reload 一次;navigate 和 reload 合计不得超过 1。 3. 等待页面 ready 最多 15 秒;成功后只读 DOM/可见页面最多 8 秒;整体不得超过 pending deadline。 4. 可在同一已刷新页面内做有界滚动/分页读取,但不得再次 reload/navigate;达到 window 下界或明确 end-of-feed 后停止。 5. 只生成第 6 节 evidence 和无秘密 intake 附件;不得提取 Cookie/token/localStorage/profile、网络 headers、签名请求 URL或媒体流地址。 ### 5.3 `refresh-commit` ```powershell python dev/project-dev/bili_dynamic_collector.py --config refresh-commit --input --now ``` commit 必须绑定唯一 pending run_id、config hash 和 deadline;没有 begin、run ID 不一致、deadline 超期或 refresh count 不等于 1均失败。它先完成证据/身份/覆盖/秘密/内容校验,再进行任何正式写入。 ## 6. 浏览器证据 schema 1 根 exact keys: ```text schema_version, run_id, transport, requested_url, final_url, refresh_action, refresh_count, refresh_started_at, refresh_finished_at, read_finished_at, page_outcome, page_title, creator, coverage, items, discovery_summary, safe_diagnostics ``` 固定合同: - `transport=codex_chrome_visible_page`。 - `refresh_action=navigate|reload`;`refresh_count=1`。 - `page_outcome=READABLE|UNREADABLE_TIMEOUT|UNREADABLE_ERROR|ACCESS_BLOCKED`。 - creator exact keys=`uid,name,profile_url`;READABLE 时必须精确匹配 UID/name/profile URL。 - coverage exact keys=`requested_window_start,requested_window_end,oldest_item_published_at,reached_window_start,end_of_feed,pagination_complete,page_truncated,all_cards_parsed,unparsed_card_count`。 - `items` 最多 200;每项 canonical fields=`dynamic_id,opus_id,bvid,content_type,published_at,title,source_url,body_text,body_complete,duration_seconds,artifacts`。 - artifacts 只登记 intake root 下相对路径、kind、sequence、extension、bytes、sha256 和去 query/fragment 的 canonical public source URL;不得登记网络请求 header 或原始带签名 URL。 - `discovery_summary` 只允许状态与计数,不携带响应体;公开搜索/API 不得给 `page_outcome=READABLE` 或 coverage complete。 - `safe_diagnostics` 只允许固定枚举、timeout 秒数和 bounded count,不接受 raw exception、HTML、header、response body 或 URL query。 所有未知字段、secret-like key、控制字符、绝对 intake 路径、reparse、hash/size 不符、超限或 URL credential/query 风险均在正式写前停止;错误 stdout 只含固定 code/path,不回显值。 ## 7. 五种终态的唯一判定 | status | 必要条件 | exit | 正式业务写入 | |---|---|---:|---| | `NEW_ITEMS_SAVED` | 页面 READABLE、身份匹配;至少一条完整新内容经事务保存。coverage 可完整或不完整,但 stdout 必须给 `no_new_confirmed=false` | 0 | 新 artifact、state event、formal event | | `REFRESH_CONFIRMED_NO_NEW` | READABLE、身份匹配、相对 formal/state catalog 无新增,且 coverage 全部硬门通过 | 0 | 无;只更新有界 run evidence | | `REFRESH_FAILED_PAGE_UNREADABLE` | 页面 ready/DOM/evaluate 超时或无可靠 DOM,且没有明确 access interstitial | 4 | 无 | | `REFRESH_BLOCKED_AUTH_OR_ACCESS` | 登录、验证码、会员/DRM/访问控制提示,或 UID/name/profile 身份不匹配 | 3 | 无 | | `PARTIAL_DISCOVERY_UNCONFIRMED` | 只有公开搜索/API 摘要;或页面可读但 coverage 不足且没有可安全保存的新完整内容 | 4 | 无 | `REFRESH_CONFIRMED_NO_NEW` 的 coverage 硬门全部为真:时间字段绑定 pending;`page_truncated=false`;`all_cards_parsed=true`;`unparsed_card_count=0`;`pagination_complete=true`;并且 `reached_window_start=true`,其依据必须是 `oldest_item_published_at<=window_start` 或 exact end-of-feed。空页面只有身份匹配且 explicit end-of-feed 才可 no-new。 优先级:creator mismatch/access blocked > unreadable > readable new items > readable complete no-new > partial。公开 discovery 永远不能提升 page 权威级别。 ## 8. 两份补充真实证据的冻结解释 ### 8.1 Chrome 单次刷新样本 - 日期:2026-08-13。 - exact URL=`https://space.bilibili.com/1420210197/dynamic`;tab title=`青枫浦上Q个人动态-青枫浦上Q动态记录-哔哩哔哩视频`。 - 受支持 Chrome 控制执行 reload 恰好 1 次;DOM content/snapshot 在 15 秒边界超时;对同一已刷新页面只读 evaluate 在 8 秒边界超时;没有第二次刷新。 - Cookie/token/localStorage 读取=0;正式 ana-data 写入=0。 - 唯一合法 replay 结果=`REFRESH_FAILED_PAGE_UNREADABLE / exit4`,不得是 no-new。该真实刷新已满足本事项验收 B 的“只允许一次”样本;实现阶段只把脱敏同构 fixture 送入 CLI,不重复真实刷新。 ### 8.2 公开 endpoint 样本 - 无 Cookie/token;仅普通 UA 与 `Accept: application/json` 请求 `https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=1420210197`。 - 15 秒内返回 JSON `code=-412,message=request was banned`;重试=0,header/参数绕过=0。 - 它只能形成 `discovery_summary=BLOCKED_412`,总体在页面不可读时仍为 `REFRESH_FAILED_PAGE_UNREADABLE`;如果本轮只有 discovery 证据则为 `PARTIAL_DISCOVERY_UNCONFIRMED`。不得用它证明 no-new,也不得再次尝试规避。 ## 9. 标准化、去重与混合历史 catalog ### 9.1 共享逻辑 新入口必须复用/抽取原代码的时间、URL、Windows stem、stable token、entity ID、atomic write、StateLock 和 manifest helper;不得复制一套不同的 dynamic/opus/BV/source URL 判定。 ### 9.2 formal manifest 只读兼容 新增私有 `load_formal_catalog()` 只读处理: 1. 历史 `schema_version=1` 事件:从 `stable_id`、`bvid`、`source_url`、可选 creator UID 抽 token。 2. 新 `schema_version=2,event_type=DYNAMIC_CONTENT_SAVED`:从 `dedupe_keys` 和 artifacts 抽 token。 3. 同 token 的多个状态事件合并为同一实体;事件行数和唯一动态数分别统计。 4. 非 JSON、关键 scalar 控制字符、同 token 映射到冲突身份、未知 creator 或损坏已保存 hash 一律 fail closed。 历史 48 行保持 byte prefix;不把历史 blocked 状态当新内容,也不因 `SAVED=16` 就推断唯一动态恰为 16。 ### 9.3 新 state events - text/article/image 完成保存后,在既有 state manifest 写 `CONTENT_SAVED` 并加入 `ACTIVE_OR_SUCCESS_STATUSES`,避免旧 `check` 再次生成待办。 - video 保存 cover/metadata 后仍写既有 `TODO_QUEUED`,继续走已通过的 move/handoff 主链;本事项不下载视频。 - `check/move-completed/handoff` 对既有状态和退出码不变。 ## 10. 正式内容与 manifest schema 2 ### 10.1 artifact 规则 - text/article:`body_complete=true`,正文按 LF 规范化、strict UTF-8、无 BOM、一个终止 LF,exact 1 个 `.txt`;不得保存 HTML 或摘要冒充全文。 - image:caption 可生成一个 `.txt`;原图为 `.jpg/.jpeg/.png/.webp`,逐件 magic/extension/size/hash、sequence 唯一,最多 20 张;不转码、不缩放。 - video:必须有 exact BVID、canonical Bilibili video URL、finite positive duration 和 exact 1 个 cover artifact;只保存 metadata/cover,不允许 video/audio artifact。 - 命名继续复用 `YYYYMMDD-HHmmss__` 和实体冲突后缀;正式目标 CreateNew/no-overwrite,同名异 hash 停止。 ### 10.2 formal event 每个新实体只追加一条 canonical schema 2 event: ```text schema_version=2, event_type=DYNAMIC_CONTENT_SAVED, creator, creator_uid, entity_id, dynamic_id, opus_id, bvid, dedupe_keys, content_type, published_at, title, source_url, collected_at, artifacts[{kind,sequence,path,bytes,sha256}], duration_seconds, page_run_id, coverage_complete, status=SAVED ``` 相同实体重跑不再追加 SAVED;no-new、unreadable、blocked 和 partial 不写 formal manifest。 ## 11. 原子提交、崩溃恢复与竞争写 ### 11.1 内容事务 在任何正式发布前,写 `state_dir/refresh/transaction.pending.json`,绑定:run、证据 hash、所有源/目标 bytes/hash、state/formal 两份 manifest preimage 和候选 after hash、created targets 列表、phase。阶段顺序: 1. validate all; 2. 创建 archive 内 owned staging,逐件 flush/fsync/hash; 3. 以 no-overwrite hard link 或等价 CreateNew 发布 artifacts;不支持安全语义即停止; 4. 原子提交 state manifest; 5. 再次复算 formal manifest 当前 bytes/hash 必须仍等于 preimage; 6. 原子提交 `old exact bytes + canonical new lines`,这是业务 commit point; 7. 写 final transaction receipt、更新 bounded run evidence、清理 staging/pending。 ### 11.2 恢复矩阵 - formal manifest 未到 candidate hash:验证没有外部漂移后,把 state manifest恢复至 preimage并只删除本 run CreateNew 且 hash 匹配的 artifacts;任一身份不明则 `E_RECOVERY_AMBIGUOUS`,不猜测删除。 - formal manifest 已到 candidate hash:artifacts/state 必须匹配 intent;匹配则只补 final receipt和 run status,不重复 append;不匹配则 `E_RECOVERY_FAILED`,不改业务文件。 - formal manifest 是第三个 hash/bytes 或旧 bytes 加了别的 writer 内容:`E_MANIFEST_RACE`,不覆盖,不删除别人的文件。 - ordinary exception、KeyboardInterrupt/SystemExit 在 Python 实现中按原类型/exit 收口;transaction pending 保留给下次恢复,异常消息不得含输入值。 ### 11.3 no-new 与失败状态有界化 不得把每小时 no-new/timeout/412 追加到 formal manifest。`state_dir/refresh/runs/latest.json` 加 168 个固定环形 slot(epoch hour modulo 168),每次原子替换对应 slot;最多 169 个状态文件。slot 必含 run_id/time/status/evidence hash/count/error code,不含正文或秘密。相同 run 重放字节一致;旧 slot 被新的小时证据覆盖是预期 bounded 状态,不是业务历史删除。 ## 12. 错误、stdout 与时间预算 - stdout 始终一行 canonical JSON,至少 `schema_version,ok,status,error_code,run_id,creator_uid,refresh_count,page_authoritative,coverage_complete,new_items,saved_artifacts,formal_manifest_changed,run_evidence_path`。 - `NEW_ITEMS_SAVED`、`REFRESH_CONFIRMED_NO_NEW` exit 0;unreadable/partial exit 4;access/identity/safety exit 3;输入合同 exit 2;内部失败 exit 1;用户中断 exit 130。 - Chrome 阶段由 pending deadline 限制;页面 ready 15s、DOM read 8s,总预算默认 30s。截止后不重试,不再发网络/Chrome动作;commit 只处理已落本地证据。 - 错误文本固定枚举:`E_PAGE_TIMEOUT/E_PAGE_UNREADABLE/E_ACCESS_BLOCKED/E_CREATOR_MISMATCH/E_PARTIAL_DISCOVERY/E_COVERAGE_INCOMPLETE/E_SECRET_FIELD/E_MANIFEST_RACE/E_RECOVERY_*` 等,不拼接 raw browser/API error。 ## 13. 实现落点 设计 PASS 后最小变更: 1. `dev/project-dev/bili_dynamic_collector.py`:增加 config、begin/commit CLI 和共享 helper 调用;保留原三命令。 2. `dev/project-dev/bili_dynamic_refresh.py`:页面 evidence schema、formal catalog、内容计划和事务/恢复;不包含浏览器/CDP/network client。 3. `dev/project-dev/bili_dynamic_collector.example.json`:仅加入开发 tmp refresh 配置。 4. `dev/project-dev/test/test_bili_dynamic_collector.py`:冻结原 13 项并补公开 CLI non-regression。 5. `dev/project-dev/test/test_bili_dynamic_refresh.py` 与 `fixtures/bili_dynamic_refresh/`:新增脱敏 fixtures。 6. `dev-doc/project-doc/B站博主动态主动刷新采集器.md` 与实现证据;原工具文档增加迁移说明,不改写旧验收结论。 不新增服务、常驻 daemon、数据库、浏览器扩展、API server、Web UI 或下载器。 ## 14. 离线测试与非真空验收 必须从 public CLI/main 入口覆盖: 1. READABLE + new text/article/image/video:正文/原图/cover exact bytes/hash、video 无媒体文件、formal/state 事件和 stdout。 2. READABLE + complete no-new:formal/state bytes 不变,仅 bounded run evidence 更新。 3. 15s/8s timeout fixture:`REFRESH_FAILED_PAGE_UNREADABLE`,不得出现 no-new,正式树和 manifest bytes 不变。 4. explicit login/captcha/access/DRM、UID/name/profile mismatch:blocked/exit3/零正式副作用。 5. search-only empty、API `-412 request was banned`、页面 partial/truncated/unparsed/pagination incomplete:不得 no-new。 6. empty page 只有 exact end-of-feed + identity + complete coverage 才 no-new。 7. 时间窗 72h 与可配置边界、future/old item、URL/BVID/dynamic/opus token 交叉去重。 8. 历史 48 行同构 fixture:事件数与 unique entity 数分开,blocked 重复不变成新动态;old bytes prefix 保留。 9. 同 evidence 重跑、formal already committed crash replay、state-only crash rollback、artifact partial、manifest race、target same/different hash、KeyboardInterrupt/SystemExit 全点注入。 10. body incomplete、image hash/magic/size/reparse/escape、video duration/cover/BVID 缺失均零正式提交。 11. 配置/evidence/formal/state/intake 的 secret-like key、synthetic unique secret sentinel 和 raw error 注入;stdout/log/manifest/receipt/tree 全域 sentinel 0。 12. 环形 168 slot 上界与相同 run 重放;小时 no-new 不增长 formal manifest。 13. 原 13 项目标测试完整通过;项目级 discovery 做比例回归。 测试只用 TemporaryDirectory、数十字节合成图片与短文本,不复制真实正文/图片/视频,不联网、不启动 Chrome、不写正式路径。 ## 15. 真实 smoke 验收口径 本事项已经取得第 8.1 节恰好一次真实 refresh timeout 样本,且公开 API 样本没有重试。实现后将用脱敏、字段等价 fixture 通过 public CLI 重放,断言 `REFRESH_FAILED_PAGE_UNREADABLE`、formal write 0、no-new token 0。为尊重“一次刷新、无重试”,开发/审核阶段不再次刷新目标页。 若请求方在实现 PASS 后另行运行正常小时采集,那是按既有用户授权的运营动作,不是本开发验收补跑;仍须每轮一次刷新和本方案全部状态门禁。 ## 16. 性能与小时运行 - 本地 commit 的目标:无新增 `<1s`,100 items/20 images 元数据规划 `<2s`(不含外部 Chrome/intake 下载时间)。 - formal manifest 目前 51KB,允许原子全文件重写;达到 10MB 前不引入数据库。超过阈值仅报告性能缺口,不在本事项自动迁移。 - overlap 继续由 StateLock + durable pending 拒绝;调度不得重叠启动或后台遗留 Chrome动作。 - 搜索/API discovery 可完全缺失;它不阻断可靠页面 new/no-new,只能作为非权威附证。 ## 17. 文档、证据与审核门 设计审核需一次检查全目标:状态优先级、支持的 Chrome 编排、evidence schema、覆盖充分性、formal mixed-history、两个 manifest、内容事务、恢复、secret、fixture 与真实样本解释。`PASS/0` 前实现/测试/fixture修改=0。 实现后证据至少包含: - 变更文件 bytes/SHA-256;原基线与正式 48 行前像 hash。 - targeted、原 13 项、project regression、compile/help、strict UTF8/no BOM/no trailing、secret scan、governance。 - fixture cold/rerun/crash/race/slot timing。 - 第 8 节真实样本 replay;真实 refresh/download/formal write=0。 - 工具调用方式、状态表、恢复与小时任务 choreography。 实现提交原 `dev.reviewer.project` 一次完整审核;只有实现 `PASS/0` 后,视频下载员才可把新入口用于正式小时运行。审核 PASS 不授权视频下载、扩展发布、policy/HKCU 或访问控制绕过。 ## 18. 当前终态 状态=`V001_DESIGN_COMPLETE_PENDING_ORIGINAL_REVIEWER_IMPLEMENTATION_FROZEN`。 当前动作计数:产品 code/test/fixture modification=0;真实 Chrome refresh 新增=0(只接收请求方既有单次证据);network retry=0;download/video=0;formal ana-data write=0;extension publish/policy/HKCU/session secret=0。