事项:DEV-PROJECT-INFO-BILI-DYNAMIC-REFRESH-COLLECTOR-20260813-001
需求:REQ-BILI-DYNAMIC-COLLECTOR-20260804-001
实施者:dev.developer.project.secondary / infodev-2
审核员:dev.reviewer.project / inforev
python -B dev/project-dev/bili_dynamic_collector.py `
--config dev/project-dev/bili_dynamic_collector.example.json `
refresh-begin
python -B dev/project-dev/bili_dynamic_collector.py `
--config dev/project-dev/bili_dynamic_collector.example.json `
refresh-commit `
--input <refresh-begin 返回的 evidence_path>
refresh-begin 与 refresh-commit 是离线协调入口,不控制 Chrome、不联网,也不读取 Cookie、token、localStorage 或页面源代码。页面操作者必须把一次受支持刷新产生的有限、无秘密 JSON evidence 写到 refresh-begin 返回的精确路径,再由 refresh-commit 校验和落账。
刷新身份固定为 青枫浦上Q / 1420210197 / https://space.bilibili.com/1420210197/dynamic,每个 run 最多刷新一次。页面 evidence 由 bili_dynamic_page_observation_contract.json 与 bili_dynamic_page_extract.js 的精确哈希绑定;cards 与 unparsed nodes 按 DOM 位置互斥。只有页面身份、正文、时间窗与终止标记共同证明覆盖完整时,空结果才可成为 REFRESH_CONFIRMED_NO_NEW。公开搜索或 API 只能作非权威补充发现,空结果、-412、验证码、访问限制和不可读页面永远不能证明 no-new。
五个正式终态为:
NEW_ITEMS_SAVED:有通过合同的新正文、原图或视频 metadata,内容与 state/formal 两份 manifest 一致提交;REFRESH_CONFIRMED_NO_NEW:页面观察完整且所有已解析实体均被历史 catalog 去重;REFRESH_FAILED_PAGE_UNREADABLE:刷新后页面就绪或只读提取超时/失败;REFRESH_BLOCKED_AUTH_OR_ACCESS:页面明确登录、验证码、访问控制或等价阻断;PARTIAL_DISCOVERY_UNCONFIRMED:页面覆盖不完整或只有非权威公开发现,不能确认无新增。PASS/0。dev/project-dev/bili_dynamic_collector.pydev/project-dev/bili_dynamic_refresh.pydev/project-dev/bili_dynamic_page_observation_contract.jsondev/project-dev/bili_dynamic_page_extract.jsdev/project-dev/bili_dynamic_collector.example.jsondev/project-dev/test/test_bili_dynamic_collector.pydev/project-dev/test/test_bili_dynamic_refresh.pydev/project-dev/test/fixtures/bili_dynamic_refresh/README.md原采集器的 check、move-completed、handoff 与终态证据合同保留;只新增 refresh 配置、两个 CLI 子命令和独立 refresh 模块。
正式前像 ana-data/news-青枫浦上Q/manifest.jsonl 为 48 行事件账。离线 catalog 验收复算为 22 个 identity component、16 个已保存实体、5 个视频跟踪实体和 1 个可重试实体。
refresh-begin 创建 schema 2 pending 和一小时一个的 durable slot,绑定 run/config/contract/extractor/evidence path 与进程 identity;同一 UTC 小时不重复启动。refresh-commit 严格校验 duplicate-key、UTF-8、路径、run、时钟、页面身份、观察计数、cards/unparsed 位置互斥、终止标记和安全发现状态。-412 分别重放为 REFRESH_FAILED_PAGE_UNREADABLE 与非权威 partial/access evidence;两者都不能进入 no-new。python -B -m py_compile `
dev/project-dev/bili_dynamic_collector.py `
dev/project-dev/bili_dynamic_refresh.py
python -B -m unittest `
dev/project-dev/test/test_bili_dynamic_collector.py `
dev/project-dev/test/test_bili_dynamic_refresh.py
python -B dev/project-dev/bili_dynamic_collector.py --help
结果:22/22 PASS;py_compile=PASS;CLI help 显示 check / move-completed / handoff / refresh-begin / refresh-commit 五个入口。
refresh 九项非真空测试覆盖:真实 timeout/-412 状态、no-new 终止标记硬门、cards/unparsed 互斥与位置冲突、正文双 manifest 提交、168 小时 slot 与 pending 恢复、kernel-backed state lock、正式 48/22/16/5/1 catalog、dead formal lock 同卷接管。原 13 项继续覆盖既有采集器安全合同。
项目回归按文件拆分后,本任务两份测试均通过。发现的项目级异常不属于本任务:
bili_authenticated_extension/test_protocol.py 1 项和 test_native_host.py 6 项被独立产品源码树中的四个 __pycache__/*.pyc 触发 exact-source-set fail closed;本事项未删除或修改该独立产品缓存/源码。bili_authenticated_extension_managed_load/test_managed_load.py 在有界单文件运行中长期未终止;仅停止已确认属于该测试命令的子进程,未杀其他 Python/MCP 进程,也未修改该独立产品。项目回归结论是 本任务通过;整库受两个独立环境/长时问题阻断,已精确归因,不宣称整库全绿。
51598 bytes / 0E69AF2AF1C4B0014D2033A21F3986E283ECFD758EA652E7F2416006736C8D73 / 48 lines;最终检查必须仍完全一致。TemporaryDirectory 和示例 tmp/ 路径运行。正式 ana-data 写入为 0。REFRESH_FAILED_PAGE_UNREADABLE;无凭据公开 endpoint 返回 code=-412,只支持 partial/access 附证。F:\video、扩展/policy/HKCU、转写均为 0。当前状态:IMPLEMENTATION_COMPLETE_PENDING_ORIGINAL_REVIEWER。本文件记录开发者冻结证据;最终可用结论以同一 task、同一 dev.reviewer.project / inforev 实现复审终态为准。
HOLD/4,MB-X 结果消息为 msg_20260813173933589_7efe75d8。本节仅闭环该结果列出的 F1—F4,不重开 V001+V002+V003+V004 已通过设计,不扩大产品或真实动作范围。page_observation.cards 与 items 现在按规范化 dynamic_id/opus_id/bvid/dedupe_keys/content_type/published_at/source_url 精确双向绑定;重复绑定漂移、跨卡 token 重叠、缺项、额外项和内容属性不一致均以 E_EVIDENCE_ITEM_BINDING 失败关闭,不能投影为无新增。latest.json 冻结为精确八键索引;无正式变化显式记录 NO_FORMAL_CHANGE receipt;slot/latest 均写后读回。EVIDENCE_BOUND 与 TERMINAL_RECORDED 重开可复算终态、重建缺失/较旧 latest 并清理自身 pending,冲突 latest 不覆盖。CREATE_PLANNED 在持有进程死亡或 PID reuse 时按同 generation、attempt+1 换绑;已存在失败 claim 先移动到同卷 quarantine,并写入/验证 owner marker,成功恢复后只清理本次所有权范围。30/30 PASS;py_compile=PASS、CLI help exit 0。整库 discover 未作为本事项通过证据:已确认的 authenticated-extension __pycache__ exact-set 失败与 managed-load 长时项属于独立产品,本修复未修改或清理它们。51598 bytes / 0E69AF2AF1C4B0014D2033A21F3986E283ECFD758EA652E7F2416006736C8D73 / 48 lines。Chrome、网络、下载、正式采集、F:\video、Cookie/session、扩展/HKCU 与转写动作均为 0。HOLD4_FOCUSED_REPAIR_COMPLETE_PENDING_LIMITED_REREVIEW;最终结论仍以原 task、原 dev.reviewer.project / inforev 限定复审为准。HOLD/3,MB-X 结果消息为 msg_20260813204949399_274b6660;F1 observation/items 已关闭,本节只修 F2—F4。creator_uid 必须是与配置精确相等的 string;schema 1 数字 stable_id 仅接受 1—32 位 ASCII digits,33 位和全角数字均失败关闭。schema 1 冻结历史 UID 兼容口径保持不变。TERMINAL_RECORDED 重开会复算 planned schema、receipt、当前双 manifest identity 和 exact terminal slot bytes,再补 latest/cleanup。MoveFileExW(MOVEFILE_WRITE_THROUGH) 且不带 replace;rename 后 flush/readback 目录项。主 lock 已删除时 terminal cleanup 仍继续删除 exact quarantine/failed claims/owner marker,空目录崩溃点可重开完成并 flush 父目录。34/34 PASS;py_compile=PASS。正式 48 行 catalog 仍只读通过 48 events / 22 components / 16 saved / 5 video / 1 retryable。51598 bytes / 0E69AF2AF1C4B0014D2033A21F3986E283ECFD758EA652E7F2416006736C8D73 / 48 lines。Chrome、网络、下载、正式采集、F:\video、Cookie/session、扩展/HKCU 与转写动作均为 0。HOLD3_F2_F4_REPAIR_COMPLETE_PENDING_LIMITED_REREVIEW。msg_20260814002856995_85f04dca 为 HOLD/1;F2/F3 保持关闭,本轮只关闭 F4_NEW_FORMAL_CLAIM_CREATE_NOT_READBACK_OR_DIRECTORY_DURABLE。_durable_formal_lock_claim 门:所有 formal-lock CreateNew 均先完成文件 flush/fsync,再做 lexical lstat、精确 bytes/length/SHA-256 回读、父目录 fsync,并在持久化后再次精确回读;只有全部成功后才允许写入 HELD/NEW_LOCK_HELD。PLANNED/CREATE_PLANNED;第三内容不覆盖。精确 lock 已创建但目录 fsync 失败时,同一 pending 可在重开后重新验证/持久化并晋升。NEW_LOCK_HELD 后两个断点 kill;重开均沿 durable pending 恢复,正式 manifest 和第三内容保持不变。2/2 PASS;目标全量 collector 13 + refresh 23=36/36 PASS;refresh 单文件 23/23 PASS;py_compile=PASS、CLI help exit 0、governance=OK/projects1/warnings0。51598 bytes / 0E69AF2AF1C4B0014D2033A21F3986E283ECFD758EA652E7F2416006736C8D73 / 48 lines;Chrome/network/download/formal write/F:\video/Cookie/session/extension/HKCU/media/transcription 均为 0。F4_DURABLE_CREATE_REPAIR_COMPLETE_PENDING_LIMITED_REREVIEW;最终结论以原 task、原 dev.reviewer.project/inforev 限定复审为准。msg_20260814015709581_78422206 获 PASS/0。随后生产槽 018/019/020 连续投影为 REFRESH_FAILED_PAGE_UNREADABLE;这些槽与 evidence 保持不可变,未改判、覆盖或重交。HOLD/1,消息=msg_20260814050003153_4b3b36b1;V006 精确拆分 PRE/POST dispatch error 后组合设计于 msg_20260814051716904_5ebc133f 获 PASS/0。120/35/45/15s 总体/action/observation/internal-settle 预算,只允许一次 supported reload/goto 和一次 source-controlled evaluate,retry=0;runtime contract bytes/SHA、pending/evidence schema3、实际 action/observation count 与 elapsed 墙钟机械绑定。PRE_DISPATCH_ERROR 固定 0/0、零保存、unreadable;POST_DISPATCH_ERROR 固定 action count1,若可读新完整条目可保守保存但不得 coverage/no-new,可读空为 partial,读取失败为 unreadable。TIMEOUT 同样永不确认 no-new;CONFIRMED 才能结合旧 coverage 硬门产生 no-new。E_CONFIG,example 已改为四个 exact runtime-v2 常量。44/44 PASS,py_compile=PASS、CLI help exit0。51598 bytes / 0E69AF2AF1C4B0014D2033A21F3986E283ECFD758EA652E7F2416006736C8D73 / 48 lines。实现与测试期间 Chrome/reload/goto/network/download/formal write/Raw CDP/Cookie/session/F:\video/media/transcription=0。V005_V006_RUNTIME_REPAIR_COMPLETE_PENDING_LIMITED_IMPLEMENTATION_REVIEW;首次新 runtime smoke 必须在本实现复审 PASS 后由 requester/admin 另行调度。msg_20260814065631653_4be06bb5 / HOLD/5,对应 DEV-AUDIT-PROJECT-INFO-BILI-DYNAMIC-REFRESH-COLLECTOR-V005-V006-RUNTIME-LIMITED-IMPLEMENTATION-REVIEW-20260814-001。旧消息 msg_20260814015709581_78422206 仅关闭 V004 formal-lock durability;误发撤回 msg_20260814080254352_57428c14 不撤销、不覆盖 runtime HOLD/5。bili_dynamic_refresh_controller.py。controller 独占 tab 选择、dispatch 前后状态、单调计数、HMAC capability attestation、CreateNew partial→file fsync→no-overwrite rename→parent fsync→readback;begin 不回显 capability,调用者手写/篡改 outcome 无法绑定成功终态。AWAITING_EVIDENCE。bind_controller_evidence 另以 pending wall deadline 拒绝迟到绑定;CLI deadline+ε 不保存、不推进 manifest。AWAITING_EVIDENCE × slot present/missing × deadline before/after 矩阵不会返回 BROWSER_REFRESH_REQUIRED,controller 在任何 browser adapter 调用前拒绝。REFRESH_BLOCKED_AUTH_OR_ACCESS/E_CREATOR_MISMATCH/exit3;terminal slot/latest 完成、pending 清理、no-new=false、正式 manifest 不变。6/6 PASS / 7.427s,其中包含 F2 五态链、F4 12 组合和 F5 4×3 矩阵;refresh 全量=37/37 PASS / 15.384s;collector+refresh=50/50 PASS / 20.114s;py_compile=PASS、CLI help exit0、strict UTF-8/no BOM/trailing whitespace=PASS、secret literal scan=0、governance=OK/projects1/warnings0。Ran 191 tests in 172.129s / failures=46 / skipped=6。本任务 collector+refresh 零失败;7 个 failure records 位于独立 authenticated-extension(既有 __pycache__ exact-source 漂移),39 个位于独立 managed-load(fixture 在 E_BUILD_CONTRACT 审计/批准门失败)。本事项不删除缓存、不改这些产品,也不把整库宣称为全绿。51598 bytes / 48 lines / 0E69AF2AF1C4B0014D2033A21F3986E283ECFD758EA652E7F2416006736C8D73。本轮 Chrome、network、refresh-begin 正式调用、formal write、Cookie/session、Raw CDP、download、media、F:\video、transcription 均为 0。RUNTIME_HOLD5_F1_F5_REPAIR_COMPLETE_PENDING_ORIGINAL_REVIEWER;只接受原 task、原 dev.reviewer.project/inforev 的新实现复审终态。