| | |
| | | |
| | | ## 10. 动态页主动刷新协调层 |
| | | |
| | | 后继事项 `DEV-PROJECT-INFO-BILI-DYNAMIC-REFRESH-COLLECTOR-20260813-001` 增加两个离线协调入口: |
| | | 后继事项 `DEV-PROJECT-INFO-BILI-DYNAMIC-REFRESH-COLLECTOR-20260813-001` 的 runtime-v2 唯一产品入口为: |
| | | |
| | | ```powershell |
| | | 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-run |
| | | ``` |
| | | |
| | | 工具本身不控制 Chrome、不联网,也不读取 Cookie、token、localStorage 或页面源代码。一次受支持刷新产生的有限、无秘密 JSON evidence 必须写到 `refresh-begin` 返回的精确路径,再由 `refresh-commit` 校验。刷新身份固定为 `青枫浦上Q / 1420210197 / https://space.bilibili.com/1420210197/dynamic`,每个 run 最多刷新一次。 |
| | | `refresh-run` 由受信 controller 独占一次性密钥、deadline、action/evaluate dispatch、source-controlled extractor、evidence 签名与提交。其标准输入/输出是严格 JSONL 的 supported-Chrome 请求/响应协议;调用方不能读取 capability、注入自定义 adapter、手写 schema 3 evidence 或直接绑定成功终态。`refresh-begin`/`refresh-commit` 仅保留历史 schema 1/2 恢复边界,新 schema 3 run 不能从这两个公开入口创建。工具不读取、导出或持久化 Cookie、token、localStorage,也不提供 Raw CDP、坐标或截图降级。刷新身份固定为 `青枫浦上Q / 1420210197 / https://space.bilibili.com/1420210197/dynamic`,每个 run 最多刷新一次。 |
| | | |
| | | 页面 observation 合同与只读提取脚本以精确 hash 绑定。只有页面身份、正文、72 小时时间窗与终止标记共同证明完整覆盖时,空结果才可成为 `REFRESH_CONFIRMED_NO_NEW`。公开搜索/API 的空结果、`-412`、验证码、访问限制和不可读页面不能证明 no-new,分别落入 `REFRESH_FAILED_PAGE_UNREADABLE`、`REFRESH_BLOCKED_AUTH_OR_ACCESS` 或 `PARTIAL_DISCOVERY_UNCONFIRMED`。发现通过合同的新正文、原图或视频 metadata 时才产生 `NEW_ITEMS_SAVED`。 |
| | | |
| | |
| | | |
| | | ## 12. 主动刷新小时采集器的失败关闭边界 |
| | | |
| | | 主动刷新扩展入口使用 `refresh-begin` 与 `refresh-commit` 两阶段协议。可读页面的 observation cards 必须与提交 items 精确双向绑定;缺项、额外项、跨卡身份重叠或字段漂移均失败关闭,不能被当作无新增。历史目录会跨 schema 1/2 全量归并身份组件,并对状态优先级和 schema 2 artifact path/bytes/SHA-256 做严格验证。 |
| | | 主动刷新产品入口使用 `refresh-run`,并由产品级 `JsonLineSupportedChromeAdapter` 执行 controller→adapter→extractor→evidence→commit 单一路径。受信 key 只存在于 controller 进程内,pending 仅保存 SHA-256 commitment;产品模块不暴露签名/绑定 helper,任意调用方 adapter 在动作前以 `E_CONTROLLER_ADAPTER` 停止。可读页面的 observation cards 必须与提交 items 精确双向绑定;缺项、额外项、跨卡身份重叠或字段漂移均失败关闭,不能被当作无新增。历史目录会跨 schema 1/2 全量归并身份组件,并对状态优先级和 schema 2 artifact path/bytes/SHA-256 做严格验证。 |
| | | |
| | | 每个小时只写一个不可变终态 slot;`latest.json` 只是精确八键索引,可从已验证 slot 重建。无正式变化也必须形成 `NO_FORMAL_CHANGE` receipt。崩溃恢复会验证 pending 阶段、证据身份、formal-lock generation/attempt、同卷 quarantine owner marker 和 durable slot/latest readback;歧义状态不会写正式 manifest。HOLD/4 修复后的离线目标测试为 collector 13 项 + refresh 17 项,共 `30/30 PASS`。本能力仍不构成 Chrome、网络、正式采集或计划任务的运行授权。 |
| | | |
| | | HOLD/3 修复进一步冻结:schema 2 UID 必须是精确 string,schema 1 数字 stable ID 只允许 1—32 位 ASCII;pending→STARTED 崩溃只重建同 run,slot 第三内容不覆盖,TERMINAL_RECORDED 必须重新绑定 planned/receipt/manifest/slot。formal-lock 隔离采用 pending intent 先行、no-overwrite rename、目录 durable flush,并能在主锁已先删除后继续 exact cleanup。当前离线目标回归为 `34/34 PASS`。 |
| | | |
| | | runtime HOLD/3 后继修复冻结:新 schema 3 pending 的原始 `deadline_at` 必须在任何 adapter/open-tabs/reload/goto/evaluate 调用前校验,过期即 `E_OVERALL_DEADLINE`,协议请求数与 evidence 文件数均为 0;deadline 不得重置。五态产品测试通过真实 `refresh-run` 子进程和严格 JSONL transcript 覆盖 new/empty/unparsed/identity/access,不使用 Fake adapter。当前 refresh=`39/39 PASS`,collector+refresh=`52/52 PASS`;正式 manifest 保持 `51598 bytes / 48 lines / 0E69AF2AF1C4B0014D2033A21F3986E283ECFD758EA652E7F2416006736C8D73`。 |
| | | |
| | | ## 13. V009 本机 unpacked 自用入口(覆盖第 10、12 节旧运行口径) |
| | | |
| | | 调用方 JSONL 不再是可信运行入口。`refresh-run` 现在固定在创建 pending 或读取 stdin 前返回 `E_TRUSTED_ADAPTER_REQUIRED/SAFETY_STOP/exit3`,并明确 `authoritative=false,saved=false,no_new=false`。任何公开 index、fixture、caller transcript、unpacked 自报 ID/hash/enabled 或旧 evidence 都不能形成保存或 no-new。 |
| | | |
| | | 离线实现位于 `dev/project-dev/bili_dynamic_refresh_extension/` 与 `dev/project-dev/bili_dynamic_refresh_native_host/`。扩展是独立 cookie-free MV3,固定 ID=`gllihoanalkiollgpeggamfhajmmnmml`;Host=`com.project_info.bili_dynamic_refresh`,allowed origin 只有该 ID。源树、reviewer source approval、账户持有人在 Chrome 可见界面手工加载形成的 local-load approval、Host install receipt 和当前 Chrome 实例必须同时精确匹配。unpacked 路线是当前本机单用户的程序性信任,不等同于签名分发,也不声称抵御已控制本机账户的恶意进程。 |
| | | |
| | | 当前只完成源代码与离线合成测试。没有正式 source/load approval,没有 build/install/HKCU,没有打开 Chrome 或加载扩展。永久不使用 CWS upload/publish、ExtensionInstallForcelist、ExtensionSettings 或 Chrome policy;后续 Host 注册若获批也必须是独立 CreateNew、默认不执行、可回滚门禁,且不得修改完整视频扩展/Host。 |
| | | |
| | | ## 14. 30 分钟持续归档协调器(覆盖旧“小时运行”调度口径) |
| | | |
| | | 当前周期入口为 `dev/project-dev/bili_half_hour_pipeline.py` 与受管配置 `dev/project-dev/bili_half_hour_pipeline.config.json`。固定 creator 是 `青枫浦上Q / 1420210197 / https://space.bilibili.com/1420210197/dynamic`,固定周期 30 分钟;协调器本身不读取 Cookie、Profile、localStorage 或网络载荷,而由已登录 Chrome 的受控运行层完成页面刷新和采集,再读取现有 append-only formal/handoff 事实。旧第 10—13 节的小时/V009 离线入口仍作为历史合同与兼容实现保留,不再表示当前调度频率。 |
| | | |
| | | 每轮先 `initialize`(首次只建立当前 formal/handoff baseline),再 `begin`、页面刷新/采集、`reconcile`、outbox 分发与 `finish`。state 用非阻塞进程锁和确定性 half-hour slot 防重叠;cursor 同时冻结行数与完整前缀 SHA-256,历史重写、截断或并发漂移均 fail-closed。正文/原图形成 `GIT_DELIVERY_READY`,未完成视频形成 `VIDEO_DOWNLOAD_READY`,新的 processing `READY` 形成 `VIDEO_TRANSCRIPTION_READY`;转写 receipt 再形成 `MINUTES_READY` 与 transcript Git outbox,纪要 receipt 形成 minutes Git outbox。每个 outbox ID 同时绑定 source 与规范 payload;任何读取、派发、回执和 Git 消费都会从 exact formal/handoff/terminal 行重新投影并核对。角色状态严格单向为 `CREATED→DISPATCH_INTENT→OBSERVED→COMPLETE`,terminal 不得早于 observed,重启只恢复同一 envelope,不制造第二次 handoff。 |
| | | |
| | | 输出布局保持:正文、原图、manifest、转写、纪要在 `ana-data/news-青枫浦上Q/`;MKV 和 `.download.json` 只在 `F:\video\青枫浦上Q\`。Git 发布拒绝预存 staged changes;受管根、完整祖先链和最终文件均须 ordinary/non-reparse、严格解析包含,并在读/hash/commit 边界复核身份。文件内容由安全句柄读入后直接写入 Git blob,再通过任务自有临时 index 形成 exact tree;共享 index、无关 dirty changes在所有异常/进程中断窗口保持不变。持久 `GIT_COMMIT_INTENT` 绑定 parent/tree/files/message/author/time,重启确定性恢复 non-force push;禁止 `git add .`、空提交、force push、原视频/mapping/秘密入库。已登记 job/config 是连续执行授权,正常心跳不得逐轮索权。 |
| | | |
| | | 操作员可见状态区分:`RUN_STARTED/RUN_RESUMED`、`RECONCILED`、待分发 outbox、下游 terminal receipt、`RUN_COMPLETE/RUN_FAILED`。无新增仍须完成本轮并保留 cursor;有新增必须等相应 outbox/回执闭环,媒体已下载但后处理待补时继续沿分层结果报告,禁止重下载。 |
| | | |
| | | ### 14.1 统一用户可见命名与路径迁移 |
| | | |
| | | 正文、专栏、原图、视频转写和纪要统一采用 `YYYYMMDD-HHMMSS_<content-kind>_<sanitized-title>_<stable-id>`。视频的 transcript/minutes 分别放在同 basename 的 `.transcript/`、`.minutes/` 目录,目录内文件也使用同 basename。标题按 Windows 规则确定性清洗并限制 64 字符;时间和标题只来自冻结的 formal/mapping,BVID 始终为末尾稳定 ID。MKV、`.download.json` 和 FLAC 仍使用 BVID 内部名,分别留在视频根和 `intermediate/transcription/`,永不进入 Git。 |
| | | |
| | | `plan-video-artifact-migration` 只读生成确定性迁移计划;`migrate-video-artifacts` 先 CreateNew 内容寻址 report,再逐文件验证字节/SHA、无覆盖迁移并建立 Git outbox。`artifact-relocations/<batch>.json` 是不可变别名账本,历史 formal、terminal、receipt 不重写;旧路径缺失时,resolver 只有在 old/new/bytes/SHA 唯一绑定后才读取新路径。公开文件迁移提交同时精确删除旧 Git 路径,不能把新旧副本并存。 |
| | | |
| | | ### 14.2 共享 index 诊断 |
| | | |
| | | `git-preflight` 是只读入口:冻结 `.git/index` 的字节、SHA 和文件身份,比较当前 HEAD 的 staged path,报告 archive 范围“staged delete + worktree present”以及 `.git/index.lock` 身份。无论成功、失败或中断,共享 index 必须字节与文件身份不变;工具不执行 reset、checkout、add 或 lock 清理。交付继续使用任务临时 `GIT_INDEX_FILE`,共享 index 的用户原始 staged 集不能因 HEAD 移动而被重新解释或改写。 |
| | | |
| | | ### 14.3 运行与恢复命令 |
| | | |
| | | ```powershell |
| | | python -B dev/project-dev/bili_half_hour_pipeline.py --config dev/project-dev/bili_half_hour_pipeline.config.json git-preflight |
| | | python -B dev/project-dev/bili_half_hour_pipeline.py --config dev/project-dev/bili_half_hour_pipeline.config.json plan-video-artifact-migration |
| | | python -B dev/project-dev/bili_half_hour_pipeline.py --config dev/project-dev/bili_half_hour_pipeline.config.json migrate-video-artifacts |
| | | ``` |
| | | |
| | | 半小时失败若没有可验证 Host terminal,必须记为失败而非 no-new。恢复时保持同一 task/owner/reviewer,先解决受信 Host/浏览器生命周期问题,再从最后 accepted cursor 补采;每个 slot 仍只刷新一次。Codex Desktop signed bundle 的 Stdio `write EOF` 竞态属于上游客户端边界,项目侧只移除 recurring node_repl/globalThis 触发并固定脱敏 `E_NATIVE_PEER_CLOSED`,不能宣称已永久修复客户端。 |
| | | |
| | | ## 15. Codex 桌面 stdio 触发隔离(覆盖第 14 节的交互浏览器操作口径) |
| | | |
| | | 半小时页面刷新不再由 Codex 自动化通过持久 `node_repl`、`globalThis` 标签页对象或交互 Chrome 工具执行。独立 cookie-free MV3 扩展使用 `chrome.alarms` 在半小时边界触发,并通过短生命周期 Native Messaging port 完成握手、唯一刷新、观察和 Host 提交;Codex 自动化仅处理源控协调器和下游 handoff,不拥有浏览器 transport。 |
| | | |
| | | 每个槽位只创建一个 inactive 的任务自有标签页。标签页以 slot/lease 页面标记和 `chrome.storage.session` 记录双重绑定;Host commit 完成或失败/finally 后,扩展重新核对 tab/window/URL/标记,先退休持久所有权,再唯一执行一次 `tabs.remove`。已关闭是幂等成功;对象漂移、关闭失败只记录固定脱敏状态,禁止导航到 `about:blank`、禁止第二次 remove/update,也绝不关闭用户已有标签页或共享窗口。 |
| | | |
| | | Native port 在首次消息前安装 message/disconnect handler,写入按序执行;peer 在写前、写中、写后关闭统一为 `E_NATIVE_PEER_CLOSED`。Python Host 将单个 frame 合并为一次受互斥保护的写和一次 flush,只吞并确定的 pipe peer-close,其他 I/O 错误继续失败。连续 100 个槽位、service-worker 重启、同 ID 用户替换、关闭失败和 peer-close 竞态均由生产形状测试覆盖。 |
| | | |
| | | 本节只消除本项目制造的重复 stdio/tab 触发,不能修改已签名 Codex 桌面客户端的主进程写竞态。自动化 `q` 必须保持暂停,直到源审 `PASS/0`、可验证部署以及受控客户端重启清除旧管道;若可信扩展/Host 尚未可验证,返回固定 `E_TRUSTED_ADAPTER_UNAVAILABLE`,不得回退到旧交互循环。脱敏复现和上游边界见 `Codex桌面Stdio写EOF脱敏复现与项目侧缓解.md`。 |