# CODE-DESIGN-PROJECT-INFO-BILI-DYNAMIC-REFRESH-COLLECTOR-V006 创建人员:`dev.developer.project.secondary / infodev-2` 事项:`DEV-PROJECT-INFO-BILI-DYNAMIC-REFRESH-COLLECTOR-20260813-001` 前序:V005 runtime timeout design `HOLD/1` 性质:F1 action error count/terminal projection 单点修订 状态:`PENDING_F1_ONLY_REREVIEW / IMPLEMENTATION_FROZEN` ## 1. 修订范围 本修订只闭环 `F1_ACTION_ERROR_COUNT_AND_TERMINAL_PROJECTION_UNDEFINED`。V005 已通过的单 action/单 observation、35/45/15/120 秒预算、retry0、timeout 不得证明 no-new、schema2 历史恢复、槽 018/019/020 不可变以及秘密/控制面边界全部冻结,不重开。 V006 撤销 V005 的笼统 `refresh_action_outcome=ERROR`。新 runtime-v2 evidence 只允许: ```text refresh_action_outcome= CONFIRMED | TIMEOUT | PRE_DISPATCH_ERROR | POST_DISPATCH_ERROR ``` 不再接受无法判定 action 是否已发出的 `ERROR`。controller 必须在调用受支持 `reload()`/`goto()` 前后由自身状态机生成 outcome;调用者提交的 evidence 不得自行选择或改写该阶段。 ## 2. 精确动作状态与计数 ### 2.1 PRE_DISPATCH_ERROR 仅当失败发生在实际调用 `reload()`/`goto()` 之前,例如 exact tab 选择歧义、受支持 action handle 不可建立、总 deadline 在 dispatch 前已耗尽时成立。 - `refresh_count=0`;pending 中的 `max_refresh_count=1` 只是上限,不能当实际计数; - `observation_count=0`,不得读取页面,因为没有可信 exact action target; - 不创建 browser evidence 文件之外的业务产物,不保存新条目,不更新 formal/state manifest; - no-new/coverage token 固定为 false; - 唯一终态=`REFRESH_FAILED_PAGE_UNREADABLE`; - bounded diagnostics 只写 `code=E_REFRESH_ACTION_PRE_DISPATCH` 和冻结预算,不写 target 候选、raw browser error 或异常文本。 ### 2.2 POST_DISPATCH_ERROR 仅当受支持 action 调用已经开始,但在获得 confirmed return 前以非 timeout 的受支持错误结束时成立。因为 action 可能已实际触发,按与 TIMEOUT 相同的保守副作用模型处理: - `refresh_count=1`;不得再次 reload/goto; - 若总 deadline 尚存,允许且只允许一次 exact observation,故 `observation_count=1`; - observation READABLE + 新完整条目:允许按既有新条目事务保存,但 `coverage_complete=false`、`no_new=false`; - observation READABLE + 空/仅旧条目:唯一终态=`PARTIAL_DISCOVERY_UNCONFIRMED`,不写 formal manifest; - observation timeout/error:唯一终态=`REFRESH_FAILED_PAGE_UNREADABLE`,不保存条目; - exact login/captcha/access/identity mismatch:唯一终态=`REFRESH_BLOCKED_AUTH_OR_ACCESS`; - 任一路径都不得形成 `REFRESH_CONFIRMED_NO_NEW`。 TIMEOUT 继续沿用上述 post-dispatch 保守投影;CONFIRMED 继续沿用 V005 已通过投影。 ## 3. Evidence 与可信生成 runtime-v2 schema 3 对 `runtime_observation` 精确增加/冻结: ```text { refresh_action_outcome, refresh_action_elapsed_ms, refresh_count, observation_outcome, observation_elapsed_ms, observation_count } ``` - `PRE_DISPATCH_ERROR` 必须是 `refresh_count=0`、`observation_count=0`、两 elapsed 为0、`observation_outcome=NOT_ATTEMPTED`; - `POST_DISPATCH_ERROR|TIMEOUT|CONFIRMED` 必须是 `refresh_count=1`;前两者若非总 deadline 耗尽,必须 observation_count=1;若 action 返回时总 deadline 已耗尽,则 observation_count=0、observation_outcome=`DEADLINE_EXHAUSTED`、唯一终态 unreadable; - controller 在 CreateNew evidence 前,把 begin 返回的 run_id、pending schema/hash、action-dispatch boolean、单调起止值与计数写入 source-controlled envelope;CLI 机械验证组合,不接受单个自报 outcome; - outcome/count/elapsed/observation/terminal 任一矩阵不一致即 `E_EVIDENCE_SCHEMA`,两份 manifest 与 slot 不变。 ## 4. 离线非真空验收矩阵 至少覆盖: 1. PRE_DISPATCH_ERROR × READABLE-new 输入伪造:因 observation 必须 NOT_ATTEMPTED 而拒绝;零保存,unreadable; 2. PRE_DISPATCH_ERROR × READABLE-empty 输入伪造:同上; 3. PRE_DISPATCH_ERROR × observation-error 输入伪造:同上; 4. 合法 PRE_DISPATCH_ERROR:count=0/0、唯一 unreadable、两 manifest 不变; 5. POST_DISPATCH_ERROR × READABLE-new:count=1/1,可保存新完整条目但 no-new/coverage=false; 6. POST_DISPATCH_ERROR × READABLE-empty:唯一 partial,不写 formal; 7. POST_DISPATCH_ERROR × observation-error:唯一 unreadable,不保存; 8. POST_DISPATCH_ERROR × deadline exhausted:count=1/0、唯一 unreadable; 9. 任一 ERROR、错误 count、第二 observation、第二 action、POST_DISPATCH_ERROR+no-new 均 schema failure; 10. 既有 TIMEOUT/CONFIRMED 矩阵、36 项离线回归及 formal manifest 前像不回退。 ## 5. 边界 实现仍冻结到原 reviewer 对 V005+V006 组合设计 `PASS/0`。本修订不授权 Chrome/reload/goto、网络、正式写入、Raw CDP、坐标、Cookie/session、下载、媒体、`F:\video`、formal ana-data 或转写;不改判或重交 018/019/020 历史 evidence。