# B 站博主动态采集辅助工具 HOLD/5 修复实现与验证证据 创建人员:dev.developer.project.secondary / infodev-2 文件职责:记录 `DEV-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-20260804-001` 五项审核阻断的获批设计、实现映射、离线测试和外部动作边界。 管理规范/模板:../../项目规范.md;../编码规范.md;../开发审计规范.md 引用文件:开发方案/CODE-DESIGN-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V001.md;开发方案/CODE-DESIGN-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V002.md;开发方案/CODE-DESIGN-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V003.md;B站博主动态采集辅助工具.md;../../dev/project-dev/bili_dynamic_collector.py;../../dev/project-dev/test/test_bili_dynamic_collector.py 记录方式:重型实现证据;审核结论或冻结实物变化时更新。 ## 1. 设计门禁 - V001:`11917/16C14FB2751A0EAB63F76371E75D0569FF8EF5B47FDD8724BE861314B6062733`。 - V002:`6342/DA3B3DDAA3C8B8EE33E2C0B6857B962754D740EB4BEE075E3BFB0F0FD4382736`。 - V003:`3197/D5812302D994C9D1835E5EA5BEEF305FAEDEBA892CDCAC0E545EF82EC1BDEBDA`。 - 最终设计回执:`HANDOFF-INFOREV-INFODEV2-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V003-ALLOWLIST-DESIGN-REVIEW-RESULT-20260805-001`,`PASS/0`。 - 实现在该 PASS 后开始;未修改 fixture,未扩大 provider、网络、浏览器、下载、调度、自动发送或正式数据范围。 ## 2. HOLD/5 实现映射 | finding | 闭环实现 | 非真空证据 | |---|---|---| | F1 重型设计门禁 | V001+V002+V003 冻结状态/事务/恢复/handoff 合同 | 三轮独立限定设计审核,最终 PASS/0 | | F2 mapping/批量预检 | 每个 selector 单独命中且全一致;全批 entity 唯一后再分类;只有 `TODO_QUEUED`/`MOVE_FAILED` 进入物理源/目标预检;同物理源拒绝;预检不追加失败事件 | 未知 selector、跨实体 selector、重复实体、相对/绝对 alias 同源反例;manifest/source/target bytes 不变 | | F3 retained 重跑 | `VIDEO_MOVED_SOURCE_RETAINED` 从 manifest 投影原 local_file/hash/failure_reason,固定 exit 4,不 stat 源、不追加事件 | 源仍在重跑与人工删源后重跑;两次 manifest raw bytes 均不变 | | F4 manifest secret gate | 每行 parse 后、schema/identity/status 前调用递归 `reject_secret_keys` | 三个命令、根层 cookie 与嵌套 token;E_SECRET_FIELD 且值不出 stdout | | F5 canonical native handoff | 必填 route,thread/标识格式校验,内容寻址 ID,完整 source/target/reply 与三段正文,不含运行时生成时间 | 不同时钟同 route/evidence 得到同一文件/bytes、REUSED;路由缺失/格式/换行注入均 E_CONFIG | ## 3. 冻结实物 | 文件 | bytes | SHA-256 | |---|---:|---| | `dev/project-dev/bili_dynamic_collector.py` | 56152 | `9B5C6FCE647C8E18822AB53488A57B6048A09997B62024B8FD2B593F0196DABF` | | `dev/project-dev/bili_dynamic_collector.example.json` | 1117 | `42A9AA7EE29ED061DC408C6C9A907FA7B20FD8C2B41605C54B6716A0FE388951` | | `dev/project-dev/test/test_bili_dynamic_collector.py` | 24767 | `684F78F944F045C1352E4C09BFAFE598B7B5E9B5195EC944F5AF87D70EACC0D3` | | `dev/project-dev/test/fixtures/bili_dynamic_collector/dynamic_items.json` | 1216 | `0CD53C7C93D7E05B4A913EBF5223366E3A06A17E2474DF52BC64F0BB4EBEA71F` | | `dev-doc/project-doc/B站博主动态采集辅助工具.md` | 10763 | `E976BDECE48D952B29AC65438C2E5891A67E29D1500DDD1D4B54889CDA224B48` | ## 4. 离线验证 ```powershell python -B -m py_compile dev/project-dev/bili_dynamic_collector.py dev/project-dev/test/test_bili_dynamic_collector.py python -B -m unittest dev/project-dev/test/test_bili_dynamic_collector.py python -B -m unittest dev.project-dev.test.test_bili_dynamic_collector.BiliDynamicCollectorTests.test_safe_move_hash_manifest_and_handoff_are_idempotent -v python -B -m unittest discover -s dev/project-dev/test -p 'test_*.py' ``` - py_compile=PASS;CLI help=PASS。 - 目标=`11/11 PASS / 1.393s`。 - 新鲜 `TemporaryDirectory` 闭环=`1/1 PASS / 0.226s`。 - project discover=`74/74 PASS / 48.657s`。 - diff check=PASS;治理=`OK/projects=1/warnings=0`(在提交复审前复算)。 开发自检:`dev/tmp/bili-dynamic-collector-mvp-hold5-repair-20260805/selfcheck.md`。 ## 5. 安全与交付状态 验证期间网络、浏览器、扩展交互、下载、真实媒体、调度、自动 native send、`F:\video` 和正式 `ana-data` 动作为 0。 限定实现复审回执 `HANDOFF-INFOREV-INFODEV2-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-IMPLEMENTATION-REVIEW-RESULT-20260805-001` 为 `HOLD/2`。审核员独立复跑目标 `11/11`、新鲜闭环 `1/1`、project `74/74` 均 PASS,但另以纯临时反例确认: 1. `VIDEO_MOVED`/retained 终态缺少必需 `local_file`、64 位小写 SHA-256 或 retained `failure_reason` 时仍可能投影成功;应以 `E_MANIFEST`/exit 3 零副作用停止。 2. manifest 的 `entity_id`、`bvid`、`published_at` 等未校验标量可能以换行注入 canonical handoff;应在生成前验证或统一 newline-safe JSON 序列化,并补参数化入口反例。 其余设计门禁、mapping 预检、完整字段 retained 粘性、secret gate、route/稳定 ID/sent=false 及无外部动作边界均已通过并冻结。当时状态=`HOLD_2_ISOLATED_DEVELOPMENT_SNAPSHOT_ONLY`;该状态已由第 7 节的限定复审 `PASS/0` 终态替代。 ## 6. HOLD/2 fail-closed 限定返修 请求方明确持续授权后,仅实施审核列明的两项: 1. 新增共享状态感知 terminal validator。视频 `VIDEO_MOVED`/`COMPLETE` 必须有非空无控制字符 `local_file` 与 64 位小写 SHA-256;retained 还必须有非空无控制字符 `failure_reason`。`load_manifest` 和 terminal projection 均 fail-closed。 2. handoff 创建前验证所有消费标量:`entity_id` 为 24 位小写十六进制,BV 为合法可选标识,`published_at` 为 canonical UTC,title/source URL/local path 无控制字符,SHA-256 为 64 位小写十六进制。任何污染都返回 `E_MANIFEST`/exit 3,stdout 不回显值且不创建 handoff。 3. 新增两个参数化 CLI/main 测试:terminal 缺失/空白/控制字符/错误 hash 共 9 组;handoff entity/BV/time/title/URL/path/hash 控制字符或格式错误共 10 组。每组比较调用前后完整业务树、manifest raw bytes、目标和锁/partial/event 状态。 返修冻结实物: | 文件 | bytes | SHA-256 | |---|---:|---| | `dev/project-dev/bili_dynamic_collector.py` | 60090 | `67B2E6FB34F100C57BF50A4D3067D6FDD6E47C5D3FBEF58D2CF5D8796B07AB8B` | | `dev/project-dev/test/test_bili_dynamic_collector.py` | 31303 | `D82BFF8AD9B78FD749A7536FF9FED0486CF87D6B9FDDEE7947202C2414AAE322` | | 示例配置 | 1117 | `42A9AA7EE29ED061DC408C6C9A907FA7B20FD8C2B41605C54B6716A0FE388951` | | fixture(未修改) | 1216 | `0CD53C7C93D7E05B4A913EBF5223366E3A06A17E2474DF52BC64F0BB4EBEA71F` | 返修验证:py_compile/CLI help PASS;目标=`13/13 PASS / 2.294s`;新鲜闭环=`1/1 PASS / 0.227s`;project discover=`76/76 PASS / 61.424s`;diff check PASS。网络、浏览器、扩展、下载、真实媒体、调度、native send、`F:\video`、正式 `ana-data` 动作继续全部为 0。 ## 7. HOLD/2 fail-closed 限定复审终态 - 回执:`HANDOFF-INFOREV-INFODEV2-BILI-DYNAMIC-COLLECTOR-MVP-HOLD2-FAIL-CLOSED-REREVIEW-RESULT-20260805-001`。 - 结论:`PASS/0`;F1 terminal persisted evidence fail-closed 与 F2 native handoff manifest 标量防注入均 `CLOSED`,前序冻结合同未回退。 - 审核员独立复验:原始阻断反例=`2/2 PASS / 0.919s`;目标 unittest=`13/13 PASS / 2.452s`;project discover=`76/76 PASS / 58.021s`;py_compile、CLI help、diff、strict UTF-8/no BOM 和治理均 PASS。 - 审计:`DEV-AUDIT-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-HOLD2-FAIL-CLOSED-LIMITED-IMPLEMENTATION-REREVIEW-20260805-001`;审计文件在该回执时为 `250254 bytes / 43FD12548388E3760DCB52644273E54318591D44CE3D83E42013E1699F8D64B2`。 - 交付状态:`PASS_0_PROJECT_TOOL_DELIVERABLE`。冻结实现可作为项目级本地辅助工具交付;本结论不授权真实网络、浏览器、扩展、下载、自动 native send、调度、`F:\video` 或正式 `ana-data`。 ## 8. 请求方接收关闭 - 回执:`HANDOFF-VIDEO-DOWNLOADER-INFODEV2-BILI-DYNAMIC-COLLECTOR-PASS0-ACK-20260805-001`;关联交付=`HANDOFF-INFODEV2-VIDEO-DOWNLOADER-BILI-DYNAMIC-COLLECTOR-MVP-PASS0-FINAL-20260805-001`。 - 结论:`ACCEPTED`;请求方确认两项 fail-closed 阻断及独立复审证据完整,本开发事项终态关闭,后续新缺陷另行回传。 - 外部边界:请求方确认当前博主真实浏览器、下载、`F:\video\青枫浦上Q`、正式 `ana-data`、原生转写交接及每小时调度已有用户与项目配置授权,无需由开发员重新申请;这些动作由视频下载员按现有授权执行,工具不被解释为浏览器或下载授权来源。 - 最终状态:`ACCEPTED_CLOSED`;本轮未追加功能、未运行任何外部动作、未修改代码/测试/配置/fixture。