# 开发审计报告 创建人员:management.admin 文件职责:记录 project-info 根级编码体系的独立审核结论与证据入口。 管理规范/模板:../../common/dev-doc/开发审计规范.md 引用文件:开发事项总纲.md;开发事项计划.md;开发执行日志.md;开发问题记录.md;../项目事项审计报告.md 记录方式:append-only;执行方只登记候选,独立审核角色追加正式结论。 ## DEV-AUDIT-PROJECT-INFO-DEV-ROOT-RESTORE-20260724-001 - 审计对象:`DEV-SMOKE-PROJECT-INFO-ROOT-20260724-001` - 关联事项:`DEV-ENV-RESTORE-PROJECT-INFO-20260724-001` - 执行方:management.admin - 独立审核方:management.observer - 检查范围:3 个根目录、8 份根文档、`systems.dev` 配置、目标映射、根级账本连通性和 no-code 边界。 - 候选执行状态:完成,等待独立执行复审。 - 审计状态:PENDING_INDEPENDENT_EXECUTION_REVIEW - 结论:尚未形成;本条不得解释为 PASS 或解除 blocker。 ### 2026-07-24T18:20:20.8456249+08:00 独立执行复审归因 - 外部独立审核:`management.observer / mgobs` - 管理审计:`AUDIT-20260724-PROJECT-INFO-DEV-TARGET-RESTORE-EXEC` - 审核终态:`PASS/issue_count=0/blocking_issue_count=0` - 本审计处置:`PASS` - 归因说明:本结论由 management.admin 严格依据 management.observer 的同一审计补充 PASS 终态追加,不是执行方自审;根目录、8 份根开发文档、配置、账本连通性和 no-code 边界均已独立复验通过。 - 权限边界:本 PASS 只关闭环境恢复 dry-run,不授权 V007 源码、测试、synthetic、数据库或业务执行。 ## DEV-AUDIT-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-DESIGN-20260801-001 - 记录时间:`2026-08-01T02:27:47+08:00` - 审计阶段:重型性能优化方案独立审核;本条不是实现审核或真实资源验收。 - 审计对象:`DEV-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-20260801-001` - 请求交接:`HANDOFF-INFODEV-INFOREV-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-DESIGN-REVIEW-20260801-001` - 执行方:`dev.developer.project / infodev` - 独立审核方:`dev.reviewer.project / inforev` - 需求:`ai-media-processor/draft/本地视频语音转写_4小时长视频性能与资源优化需求_v0.1.md`,SHA-256 `BB3030AD336CEE96194A26F691BF494D8D4976A4703D83BBF506BA3544CA0898` - 方案:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-V001.md`,`5697 bytes`,SHA-256 `23CD6FB7CE7D68283F4D1CAFEC6F09CB3318D5784BF2C1133D5B64308105453F`;与交接快照一致。 - 基线代码:`dev/project-dev/transcribe_media.py`,SHA-256 `98BF04135CFAA7E9ADDB8F7D5ED5B8141C4BDFCC6CABDB3EF3B757C85B39C91E` - 基线测试:`dev/project-dev/test/test_transcribe_media.py`,SHA-256 `07761E66E8499EA1206AE1FCBF93032E52742F86EED17C3428E2F24C2306F9D2` - 审核范围:模块边界、`1200 s` 核心块、双侧 `5 s` 重叠、分段中点归属、模型与语言复用、单临时块、失败清理和真实资源验收;未扩展 GUI、API、数据库、批处理、断点续跑或模型选择。 ### Findings #### F1 — BLOCKING / 代码与方案:用户中断可能留下部分正式输出 - 证据:V001 第 54 行要求正式输出提交和回滚逻辑保持不变;基线 `_commit_outputs`(`transcribe_media.py` 第 345—364 行)逐个移动四个文件,只捕获 `Exception`。`KeyboardInterrupt` 继承 `BaseException`,不会进入现有回滚分支。 - 只读诊断:在临时目录模拟第二次 `Path.replace` 前发生 `KeyboardInterrupt`,结果为 `moves_attempted=2`、`partial_formal_outputs=['x.audio.flac']`、`final_directory_exists=True`。 - 影响:违反需求第 61 行“失败不留下可误认为完成的正式输出”和第 92 行“用户中断时清理”,也与 V001 第 14、52、54 行的失败安全声明冲突。4 小时运行结束后的提交窗口虽短,但该合同是明确硬门禁。 #### F2 — BLOCKING / 测试与证据:4 小时验收口径不足以产生可复核结论 - 证据:V001 第 71—72 行只写“采样”Python/FFmpeg 工作集、GPU、块号和临时块大小,没有冻结采样器、采样周期、进程树归属、逐块峰值计算、证据文件或“前三块/最后三块”的判定公式;因此可能漏掉短生命周期 FFmpeg 子进程或把其他 GPU 进程计入本任务。 - 正确性证据缺口:V001 未明确要求按需求第 79、104、115—117 行输出全部 20 分钟边界前后各 `15 s` 抽查、`0 <= start <= end <= duration`、逐段排序/连续序号、前三块与最后三块 RAM 峰值比较,以及源视频测试前后大小、时间戳、SHA-256 三项一致。V001 第 69 行只冻结了源哈希。 - 影响:一次约 100 分钟的真实运行可能结束后仍无法证明 RAM/GPU/临时磁盘和全局时间轴合同,造成高代价重跑或错误放行。 ### Minimal required_fixes 1. 另建后继方案 V002,明确把提交阶段纳入中断安全:四文件移动过程中捕获并回滚 `KeyboardInterrupt` 等 `BaseException` 后原样重抛;设计对应单元测试,在第 1、2、3 次移动后分别注入中断并断言正式四文件均不存在、暂存目录最终清理。不得借此改动外部 CLI 或输出合同。 2. 在 V002 冻结一个外部只读资源采样与证据方案:绑定本次 Python 根 PID 及其 FFmpeg 子进程,按固定周期记录时间、块号、Python 工作集、FFmpeg 子进程工作集及合计、任务 GPU 显存、临时媒体数量与字节数,并生成逐块峰值表和汇总;明确 `max(last_3_block_ram_peaks) - max(first_3_block_ram_peaks) <= 2 GiB`(或由需求方确认的等价公式)。同时把全部边界 `±15 s`、合法时间范围、排序/序号、四文件一致性和源文件大小/时间戳/SHA-256 前后对照列为必交证据。 ### 已通过并冻结的方案合同 - 公开 CLI 和四文件名称不变;`duration <= 1200 s` 走原路径,`duration > 1200 s` 才分块。 - 每块核心 `1200 s`、两侧 `5 s` 重叠、首尾裁边、按全局分段中点归属非重叠核心区间的规则可实施。 - 单任务只加载一次 `large-v3 / CUDA / float16` 模型;显式语言全块复用,未指定语言时首块检测并复用语言与概率。 - 完整 FLAC 留在暂存目录,同时最多存在一个临时分块,块级和外层 `finally` 清理的模块边界合理。 - 不新增 CPU/模型降级、GUI、API、数据库、批处理、断点续跑或其他产品功能。 ### 审核命令与结果 - 方案哈希核验:与交接 `design_bytes`、`design_sha256` 一致。 - `python -B -m unittest discover -s dev/project-dev/test -p "test_*.py" -v`:`6 tests / OK`;仅证明现有基线测试通过,不覆盖上述两个阻断。 - 临时目录提交中断注入:稳定复现一个部分正式 FLAC;未写项目业务产物。 - 外部动作:源视频读取 `0`;FFmpeg `0`;GPU 转写 `0`;4 小时媒体生成 `0`。 ### Open questions - 无。required_fixes 均可在现有单脚本、测试和验收证据范围内完成,不需要扩展架构或产品范围。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`2` - 当前可读:V001 的有界分块、时间归属、模型/语言复用和单临时块方向成立。 - 当前不可读:不得据此开始实现,也不得把 V001 视为已通过方案。 - 复审条件:提交 V002 的路径、字节数、SHA-256,并逐项映射上述两项最小修复;复审只检查阻断闭环和已冻结合同是否回退。 ## DEV-AUDIT-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-DESIGN-REREVIEW-20260801-001 - 记录时间:`2026-08-01T03:08:38+08:00` - 审计阶段:V001 `HOLD` 后的必要方案复审;本条只复核原 `F1/F2` 闭环和已冻结合同,不是实现审核或真实媒体验收。 - 审计对象:`DEV-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-20260801-001` - 前序审计:`DEV-AUDIT-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-DESIGN-20260801-001=HOLD/2` - 请求交接:`HANDOFF-INFODEV-INFOREV-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-DESIGN-REREVIEW-20260801-001` - 执行方:`dev.developer.project / infodev` - 独立审核方:`dev.reviewer.project / inforev` - 复审方案:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-V002.md`,`10715 bytes`,SHA-256 `BB0A7478D0225467559E9AD46730FEC73DE7824C97FE445A5E179C723AFB5473`;与复审交接快照一致。 - 未提前实现核验:`transcribe_media.py` SHA-256 仍为 `98BF04135CFAA7E9ADDB8F7D5ED5B8141C4BDFCC6CABDB3EF3B757C85B39C91E`;`test_transcribe_media.py` SHA-256 仍为 `07761E66E8499EA1206AE1FCBF93032E52742F86EED17C3428E2F24C2306F9D2`,与前序审核基线一致。 ### Findings - 无新增 finding;限定复审范围内未发现仍未闭环的阻断。 ### F1 闭环结论:PASS - V002 第 20—28 行明确把提交捕获边界扩大到 `BaseException`,先回滚本次已移动正式文件和本次创建的空目录;`KeyboardInterrupt`、`SystemExit` 等非普通异常原样重抛,普通 `Exception` 继续包装为 `MediaTranscriptionError`,且回滚失败不得静默宣告“未提交”。 - V002 第 30—40 行冻结第 1、2、3 个文件成功移动后的 `KeyboardInterrupt` 注入测试,并要求正式四文件、本次创建目录和集成暂存目录均不存在;另保留普通 `OSError` 回滚回归。 - 该合同足以指导实现修复前序“中断留下部分正式输出”问题;具体代码和测试结果留待实现审核验证。 ### F2 闭环结论:PASS - V002 第 42—72 行冻结外部只读 PowerShell 采样器、`500 ms` 周期、根 Python PID 与递归 FFmpeg 后代归属、同一采样点合计工作集、任务 PID GPU 显存、块号和临时媒体采样,并规定缺字段时 `sampling_valid=false`、不得宣告 PASS。 - 逐样本、逐块和汇总证据文件及字段已经明确;RAM 增长公式固定为 `max(last_3_block_ram_peaks) - max(first_3_block_ram_peaks) <= 2 * 1024^3`,同时保留任务 RAM、GPU、临时块数量与大小门禁。 - V002 第 74—84 行补齐全部 20 分钟边界 `±15 s`、合法时间范围、排序和连续序号、四文件一致性、短视频 `705` 段回归,以及原视频大小、创建时间、修改时间、SHA-256 前后对照;缺证据即 FAIL。 - 该证据合同足以支撑后续 19:54 与约 4 小时真实验收;实际资源数值和正确性结论留待实现后运行验证。 ### 已冻结合同回退检查 - V002 第 14 行保持:公开 CLI 和四文件名称不变;`duration <= 1200 s` 原路径;长视频 `1200 s` 核心、双侧 `5 s` 重叠、首尾裁边和中点归属。 - 保持单任务一次加载 `large-v3 / CUDA / float16`、首块语言检测后复用、完整 FLAC 加最多一个临时块,以及禁止 CPU/模型降级、GUI、API、数据库、批处理和断点续跑。 - 未发现前序已通过合同回退,也未引入超出本事项的产品或架构范围。 ### 复审命令与外部动作 - 核验 V002 字节数、SHA-256、V001 SHA-256及代码/测试基线 SHA-256;结果均与交接或前序审计一致。 - 静态逐项对照 V002 第 1—6 节、前序 `F1/F2` 和需求第 61、79、92、95—117 行。 - 未运行代码或测试;未读取源视频;FFmpeg `0`;GPU 转写 `0`;4 小时媒体生成 `0`。 ### Open questions - 无。复审通过不要求继续修改方案,也不要求增加新审批层。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 原 `F1/F2`:均已在 V002 方案层闭环。 - 实现授权:允许 `dev.developer.project` 按 V002 开始最小实现、离线测试、19:54 回归和约 4 小时资源验收。 - 结论边界:本 PASS 只批准 V002 方案,不证明代码已实现、测试已通过或真实资源指标已达标;实现与验收证据完成后仍须按事项既定入口提交后续必要审核/验收。 ## DEV-AUDIT-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-WDDM-GPU-EVIDENCE-20260801-001 - 记录时间:`2026-08-01T04:16:06+08:00` - 审计阶段:V002 实现后的 WDDM GPU 资源证据口径等价性确认;本条不构成实现审核、19:54 回归验收或 4 小时验收。 - 审计对象:`DEV-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-20260801-001` - 前序方案复审:`DEV-AUDIT-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-DESIGN-REREVIEW-20260801-001=PASS` - 请求交接:`HANDOFF-INFODEV-INFOREV-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-WDDM-GPU-EVIDENCE-20260801-001` - 执行方:`dev.developer.project / infodev` - 独立审核方:`dev.reviewer.project / inforev` ### Findings - 无阻断 finding。Windows WDDM 下改用任务 PID 的 `GPU Process Memory(*)\Dedicated Usage` 作为显存数值来源,可与 V002 的“任务 PID 显存”证据目标等价,不属于门禁放宽。 ### 等价性依据 - V002 第 51 行要求的是根 Python 及后代 PID 的任务归属显存,不要求必须由 NVIDIA 驱动在 WDDM 下返回数值;系统全局显存仍不得替代任务归属值。 - NVIDIA 官方 `nvidia-smi` 文档明确说明 Windows WDDM 下按进程 GPU Memory Usage 不可用,因为显存由 Windows KMD 管理;因此任务 PID 可被列出但 `used_gpu_memory=[N/A]` 是该驱动模型的预期限制,不代表任务未使用显存。 - Microsoft 官方说明 WDDM 的 VidMm 负责 GPU 内存管理,任务管理器 GPU 数据直接来自 VidSch/VidMm,且覆盖 CUDA 等 API;离散 GPU 的 `Dedicated GPU memory` 对应板载 VRAM。因此同一任务 PID 的 `GPU Process Memory(*)\Dedicated Usage` 是本机 WDDM 下可归属、可量化的专用显存证据。 - 独立探针 `probe.json` 共 `12` 个样本;同一根 PID `20548` 在 `8` 个样本的 `nvidia-smi` 原始输出中出现且显存均为 `[N/A]`,Windows 专用显存计数器在 `9` 个样本中返回 `267214848..3387805696 bytes`(峰值 `3230.863 MiB`),数值随模型加载阶段上升,足以证明该本机口径可用。 ### 批准的最小采样器变更 1. 保持 `500 ms` 周期及每个采样点的根 Python PID、递归后代 PID 集不变;只筛选 `GPU Process Memory` 中实例名精确归属于该 PID 集的 `Dedicated Usage`,排除 `_Total`、`Shared Usage` 和系统全局显存。 2. 同一采样点按完整计数器实例去重后求和,再由 bytes 换算 MiB;保留实例名/计数器路径及逐 PID 数值,使多适配器或 PID 复用情形可追踪。 3. 每周期继续保存 `nvidia-smi` 对任务 PID 的原始出现状态和 `[N/A]` 状态;`nvidia-smi` 不再提供 WDDM 下的数值,但仍作为 NVIDIA GPU 任务 PID 归属旁证。 4. 若 GPU 阶段 `nvidia-smi` 从未出现根任务 PID、Windows 计数器查询/解析失败、任务 PID 实例无法归属,或整个 GPU 阶段任务专用显存始终为 `0`,必须写具体原因并令 `sampling_valid=false`。 5. V002 的任务 GPU 峰值 `< 10 * 1024 MiB` 门禁、同采样点取峰值、证据文件、RAM/临时块/正确性门禁全部保持不变。 ### 证据与外部动作 - 探针:`dev/project-dev/tmp/DEV-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-20260801-001/gpu-memory-probe/probe.json`,SHA-256 `5B9C54A9584BA48AB0E1A64CBCD9E8B78EC0E2E3B756BF134C97FDB2ADF15FC8`。 - 待修采样器:`dev/project-dev/test/monitor_transcribe_resources.ps1`,SHA-256 `BDC7F367B041182C820FEFEEC5C059EF6BE1221C46E02C33FA7DA35CA7E29262`;当前第 213—225 行仅接受数值型 `nvidia-smi` 行,会把 `[N/A]` 错记为 `0 MiB`,第 331 行也未据此判无效。 - 方案:V002 SHA-256 `BB0A7478D0225467559E9AD46730FEC73DE7824C97FE445A5E179C723AFB5473`;本确认只替换其第 51 行在 WDDM 下不可取得的数值来源,不修改其他冻结合同。 - 官方依据:Microsoft DirectX Developer Blog《GPUs in the Task Manager》;NVIDIA System Management Interface 文档的 WDDM GPU Memory Usage 限制说明。 - 本轮只读检查现有探针、方案和采样器;源视频读取 `0`,FFmpeg `0`,GPU 转写 `0`,4 小时媒体生成/运行 `0`。 ### 结论 - 审计状态:`PASS_EQUIVALENT_EVIDENCE` - 阻断问题数:`0` - 授权:允许开发员仅按上述口径修复外部采样器,先重跑 19:54 回归;资源证据有效后再生成并运行 4 小时验收。 - 边界:本结论不放行当前错误的 `0 MiB` 证据,也不预判后续 `<10 GiB`、4 小时资源门禁或实现审核结果;不得扩展产品、分块、模型或接口范围。 ## DEV-AUDIT-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-IMPLEMENTATION-EVIDENCE-20260801-001 - 记录时间:`2026-08-01T06:11:54+08:00` - 审计阶段:最终实现、离线测试、19:54 回归与唯一一次 4 小时真实资源/正确性证据审核。 - 审计对象:`DEV-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-20260801-001` - 请求交接:`HANDOFF-INFODEV-INFOREV-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-IMPLEMENTATION-EVIDENCE-REVIEW-20260801-001` - 前序方案:V002 必要复审=`PASS/0`;WDDM 任务 PID 专用显存等价口径=`PASS_EQUIVALENT_EVIDENCE/0`。 - 执行方:`dev.developer.project / infodev` - 独立审核方:`dev.reviewer.project / inforev` - 审核范围:只检查冻结合同、实现、离线测试、资源/正确性证据、源保护和范围;未运行媒体、FFmpeg 或 GPU 转写,未修改代码、测试或既有证据。 ### Findings #### F1 — BLOCKING / 数据与产物:两次正式证据包都缺少必交的空 `stderr.log` - 证据:权威短回归 `short-regression-wddm/evidence/` 和 4 小时 `four-hour-run/evidence/` 均存在 `command.json`、`stdout.log`、`resource_samples.csv`、`resource_block_peaks.csv`、`resource_summary.json`、`acceptance_evidence.json`,但两个目录都没有 `stderr.log`。 - 根因:冻结采样器 SHA-256 `B5F5AA582D68B8B53CCF217AF71748A0836B42DDEBCFB5E8F7FBD506DCAF8AD0` 第 96—97 行只定义日志路径,第 177—179、347—349 行仅在实际 dequeued stderr 行出现时才 `AppendAllText`;成功运行 stderr 为零行时不会创建文件。 - 合同:V002 第 59—66 行把 `stdout.log`、`stderr.log` 列为两次真实运行的固定最低证据;第 87—90 行规定采样或正确性任一必填证据缺失即 FAIL、不得推断补齐。现有退出码、资源 CSV、stdout 和产物可证明运行成功,但正式固定清单尚不完整。 - 影响边界:该问题不否定实现正确性、资源数值、源文件保护或唯一一次 4 小时运行本身;只阻断当前证据包作为完整正式交付被最终放行。 ### Minimal required_fixes(不运行媒体) 1. 仅修 `monitor_transcribe_resources.ps1`:在启动目标进程前用 UTF-8 无 BOM 预创建空 `stdout.log` 与 `stderr.log`,以后即使零行也能满足固定文件合同;不得改采样周期、PID 归属、资源公式或门禁。 2. 对两次既有成功运行各补录一个 `0 bytes` 的 `evidence/stderr.log`,SHA-256 应为 `E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855`。这是对当前“仅有 stderr 行时才创建文件”行为的等价规范化,不得改写其他冻结证据。 3. 在 `dev-doc/开发执行日志.md` 追加简短纠偏说明:列出两个补录路径、原采样器哈希、空文件哈希、补录原因、补录时间,并确认下列核心证据哈希保持不变;随后只需做 PowerShell parser 和现有离线测试,不需要也不得重跑 19:54 或 4 小时媒体。 4. 复审只核对本 F1:提交新采样器字节数/SHA-256、两个空日志 SHA-256、纠偏日志入口、parser/离线测试结果,以及核心证据哈希未变对照。 ### 已通过的实现与测试合同 - 生产入口 `transcribe_media.py`=`20996 bytes / 309166EEFE11A74472EA355CA4AF87F9432A15393B9ABE6D69F7F1054055DE35`;公开 CLI 和四文件名称不变,`duration <= 1200 s` 原路径,长视频 `1200 s` 核心/双侧 `5 s` 重叠/首尾裁边/中点归属实现与 V002 一致。 - 长路径只把单个块交给模型;模型任务内加载一次,未指定语言时首块检测后复用;块文件固定为一个并在 `finally` 删除;未引入 CPU/模型降级、GUI、API、数据库、批处理或断点续跑。 - `_commit_outputs` 捕获 `BaseException`、记录实际移动文件、先回滚再对非普通异常裸 `raise`;普通 `Exception` 保持 `MediaTranscriptionError`。第 1/2/3 次移动后中断和普通 `OSError` 路径均由测试覆盖。 - 审核员只读编译五个 Python 文件=`PASS`;PowerShell parser=`PASS / 3546 tokens`;CLI help=`PASS`;目标环境 unittest=`14/14 PASS`。测试文件 SHA-256:主测试 `87BD890436789BE2F813ADC57A37168A3C5A76C7815F2DA9B2FB04D4DE9D4512`,validator 测试 `9E04E9F819B69CD3C621BF6E98444630F400E08A1548991A94D3A37E8913A1F1`。 ### 已通过的 19:54 回归证据 - 权威路径:`dev/project-dev/tmp/DEV-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-20260801-001/short-regression-wddm/`。 - `exit=0`、`266.638 s`、`531` 样本、平均间隔 `0.500598 s`;无分块进度,证明 `1193.607125 s <= 1200 s` 走原路径。 - RAM 峰值 `3587469312 bytes`;同任务 PID WDDM 专用显存峰值 `4432.875 MiB`;GPU 原始 PID/N/A 与计数器实例归属有效。 - FLAC=`flac/16000 Hz/1 ch`;TXT/SRT/JSON=`705` 段逐项一致;四个文件 SHA-256 与此前 MVP 真实验收产物逐一相同。 - `resource_summary.json` 和 `acceptance_evidence.json` 哈希与交接一致;原视频四项指纹未变。 ### 已通过的 4 小时资源证据 - 生成媒体=`14400.014 s / 1168506449 bytes / C9369B48312E63E69B484D9D58CED46CCEA42B20EA46B331361F5DAC7B4DA033`,位于专属任务临时根。 - 唯一一次运行 `exit=0 / 3122.885 s`,小于 `6000 s`;stdout 进度严格为 `1..12` 且各一次。 - 审核员从 `6222` 行 `resource_samples.csv` 独立复算:根 PID 恒为 `8784`,elapsed 单调;`combined=python+ffmpeg` 全部一致;GPU 完整实例无重复、实例 PID 全在当点任务 PID 集内、实例 bytes 求和与 `task_gpu_memory_mib` 全部一致;`nvidia-smi` 根 PID 共出现 `6175` 个样本且均保留 `[N/A]`。 - 全局 RAM 峰值 `3344625664 <= 12884901888 bytes`;GPU 峰值 `4464.875 < 10240 MiB`;临时块峰值 `1 / 33869856 < 524288000 bytes`。 - 逐块 CSV 与原始样本的 12 组样本数和峰值逐项一致;前三块最大 RAM=`1818476544`,最后三块最大 RAM=`2007076864`,差=`188600320 <= 2147483648 bytes`。 - 交接列出的 `resource_samples.csv`、`resource_block_peaks.csv`、`resource_summary.json` 哈希均复核一致;无相邻暂存目录残留。 ### 已通过的 4 小时正确性与源保护证据 - 正式输出目录仅含四个文件;FLAC=`14399.050813 s / flac / 16000 Hz / 1 ch`,与媒体容差 `0.963187 s <= 1 s`。 - JSON=`large-v3/cuda/float16/vad_filter=true`;TXT/SRT/JSON 均为 `8732` 段,文本逐项一致,SRT 时间与 JSON 一致,序号严格 `1..8732`,时间合法并按 `(start,end,text)` 非递减,无完全重复段。 - `1200..13200 s` 共 `11` 个边界全部具有 `±15 s` 窗口,自动无完全重复/有序检查为 PASS;审核员逐项读取现有窗口,未发现整句重复、逆序或明显连续语音缺失。开发方人工记录含 reviewer/time/result。 - `acceptance_evidence.json`=`180CC1A3E52684BDB1437BD023A4601589BE802F9124A6BF162E24BEFE1DD6E2`,与交接一致。 - 审核时再次只读计算原视频:`96884891 bytes / 1647A9CCDCE0C728217C45A425B55697B2939733E506D1A4A06D5109ED61BEEE`,创建/修改时间与前置快照一致;未移动、重命名、覆盖或删除。 ### Open questions - 无。F1 的事实、根因和无媒体重跑闭环方式均已确定。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`1` - 已通过:冻结实现、F1 提交中断安全、离线测试、短回归、4 小时资源数值、正确性、源保护和范围控制。 - 未通过:固定证据清单缺少两个零行 `stderr.log`;完成上述纯证据/采样器最小修复前,不得向 `case_analysis.media_processor` 宣告最终实现与证据 PASS。 - 重跑边界:明确无需再次运行 19:54 或 4 小时媒体;不得以本 HOLD 为由生成第二份真实运行证据。 ## DEV-AUDIT-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-IMPLEMENTATION-EVIDENCE-F1-REREVIEW-20260801-001 - 记录时间:`2026-08-01T06:26:12+08:00` - 审核阶段:最终实现与真实证据审核之 F1 唯一阻断复审。 - 审核对象:`DEV-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-20260801-001` - 请求交接:`HANDOFF-INFODEV-INFOREV-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-IMPLEMENTATION-EVIDENCE-REREVIEW-20260801-001` - 前序审计:`DEV-AUDIT-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-IMPLEMENTATION-EVIDENCE-20260801-001=HOLD/1` - 执行方:`dev.developer.project / infodev` - 独立审核方:`dev.reviewer.project / inforev` - 复审范围:只核对空 `stdout.log`/`stderr.log` 预创建、两次既有成功运行的空 `stderr.log` 补录、纠偏日志、冻结核心证据哈希和无媒体验证;未重新审核已通过的实现、资源、正确性、源保护或范围合同。 ### Findings - 无阻断 finding。前序唯一 F1 已按批准的最小方式完整闭环,未发现合同回退或额外问题。 ### F1 闭环证据 - 采样器 `dev/project-dev/test/monitor_transcribe_resources.ps1`=`22930 bytes / 4D9912D558CDE3B51BBEBBB24013F51A9F52C1F0D99389BE1A5823F950F613C6`。第 103—104 行在目标进程启动前以 `UTF8Encoding(false)` 对 `stdout.log` 和 `stderr.log` 执行空 `WriteAllText`;仅补齐零行日志的固定产物,不改变 `500 ms` 周期、PID 归属、WDDM 显存口径、资源公式或门禁。 - 短回归 `short-regression-wddm/evidence/stderr.log`=`0 bytes / E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855`;4 小时运行 `four-hour-run/evidence/stderr.log`=`0 bytes / E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855`。两文件均为叶文件,修改时间为 `2026-08-01T06:19:02+08:00`,符合成功运行零 stderr 行的等价规范化。 - 纠偏记录 `DEV-LOG-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-STDERR-EVIDENCE-REPAIR-20260801-001` 已写入 `dev-doc/开发执行日志.md`;该日志=`64409 bytes / AE13F53E96F5194B2C8217D3A6006DA63E438088DB7365E37B5B5C407240EA1A`,记录前后采样器哈希、两条补录路径、空文件哈希、补录时间与原因、无媒体重跑及核心证据未变声明。 - 实现与测试基线未变:`transcribe_media.py`=`20996 bytes / 309166EEFE11A74472EA355CA4AF87F9432A15393B9ABE6D69F7F1054055DE35`;主测试=`87BD890436789BE2F813ADC57A37168A3C5A76C7815F2DA9B2FB04D4DE9D4512`;验收器=`546082ED5CC387B9394956C5C0704F78AD325BA0EEA8BAC67CE36539834C2C29`;验收器测试=`9E04E9F819B69CD3C621BF6E98444630F400E08A1548991A94D3A37E8913A1F1`。 ### 冻结核心证据未变 - 短回归 `resource_summary.json`=`4B7D8E068DE3B688C22659942973E63F2DA804779074A06764588157C366B73F`;`acceptance_evidence.json`=`AD864182A094985366AB444901857B6AC3BA601882C5B69329107CBF715D8938`。 - 4 小时 `resource_samples.csv`=`0EAD06CBA8AAD73AA24BE14F086FB3054C0612F338DDE516961D0678065C281F`;`resource_block_peaks.csv`=`0D8F33C15FDE9E9EFB3FF54888C3C1C0068E07FC1ADFA18213F664F7ADD2EE6B`;`resource_summary.json`=`73DC90C30991730CFFE868153B5007B907C9DE39CE3F10720EAEB77E92568534`;`acceptance_evidence.json`=`180CC1A3E52684BDB1437BD023A4601589BE802F9124A6BF162E24BEFE1DD6E2`。 ### 独立验证与外部动作 - PowerShell parser=`PASS`;目标环境 `D:/Anaconda/envs/project-info-media-transcribe/python.exe -B -m unittest discover -s test -p test_*.py -v`=`14/14 PASS`。 - 本复审只读计算文件大小与 SHA-256,并执行解析器和全模拟离线测试;媒体生成=`0`、媒体读取/转写=`0`、FFmpeg=`0`、GPU 转写=`0`。 ### Open questions - 无。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - F1 状态:`CLOSED`。前序实现、短回归、唯一一次 4 小时资源/正确性证据、源保护与范围控制的已通过结论继续有效。 - 放行:本事项可交 `case_analysis.media_processor` 做最终验收;无需且不得为本 F1 再次运行 19:54 或 4 小时媒体。 ## DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-DESIGN-20260801-001 - 记录时间:`2026-08-01T14:08:46+08:00` - 审核阶段:重型最小单工具 V001 编码方案审核。 - 审核对象:`DEV-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-20260801-001` - 原始消息:`msg_20260801135527958_2db4804b`;`correlation_id=msg_20260801135527958_2db4804b`。 - 恢复唤醒:`HANDOFF-INFODEV-INFOREV-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-DESIGN-MBX-INBOX-WAKE-20260801-001`,仅用于消费既有 inbox 消息,不构成第二次送审。 - 执行方:`dev.developer.project / infodev` - 独立审核方:`dev.reviewer.project / inforev` - 需求:`ai-media-processor/draft/会议录屏PPT页面提取方案_v0.1.md`=`7781 bytes / 1B5797C1408A172328D488EE1C66E92893053C892929437F7DB85239F404B2E7`。 - 方案:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-V001.md`=`7335 bytes / 67B04259A13657577EF9AF990461C062D00E56EFC29DB374A848E1C4B006C4DD`。 - 当前实现动作:脚本、测试和用法均不存在;真实业务视频读取=`0`,FFmpeg=`0`,合成视频=`0`。 ### Findings #### F1 — BLOCKING / 算法合同:相邻帧稳定判定会累积漂移,动画与全局去重的判定优先级又可能吞掉完整页替换 - V001 第 37 行只要求相邻样本差异低于阈值。相似关系不具传递性;渐变、慢速翻页或逐步动画可让每对相邻帧都“小变化”,但首尾已经完全不同,当前合同会把整段错误视为稳定段,并可能选出过渡中间帧。这不能满足需求第 84 行“不把翻页过渡、动画中间状态当作页面”。 - V001 第 42 行规定候选与“任一已确认页面”近似即跳过,第 43 行才规定与最近逻辑页比较并用更完整候选替换。`A初始 -> A完整` 恰可能同时满足近似重复和同页动画;如果先执行全局去重,`A完整` 会被跳过,直接违反需求第 107 行及 V001 自己第 68、75—77 行的预期。 - `内容分数` 仅被引用,未冻结其计算语义、比较方向和同分处理,开发者无法从方案唯一确定何时“更完整”、何时保留旧页。 最小 required fixes: 1. 稳定段除相邻差异外必须绑定段锚点或等价累计差异约束;候选窗口内样本既要相邻稳定,也要相对稳定段基准未漂移。增加“多帧缓慢渐变/慢速翻页不产出中间候选”的离线测试。 2. 冻结分类顺序:先对最近逻辑页判定同页动画并决定替换/保留,再对其余历史页做全局返回去重;或给出能证明等价且不会让同一候选同时命中冲突动作的互斥规则。 3. 定义不依赖 OCR 的 `content_score` 计算、容差和同分处理;至少保证内容明显增加时采用后一个稳定时间、明显减少时不覆盖、相同完整状态返回时不重复。保留现有 `A初始 -> A完整`、`A -> B -> A` 测试并补交叉阈值用例。 #### F2 — BLOCKING / 流程与恢复:4 小时 FFmpeg rawvideo 管道和 BaseException 下的子进程生命周期未形成可安全实现的合同 - V001 第 35—36 行只有“固定大小帧读取”的目标,没有规定 pipe 短读拼帧、干净 EOF、半帧 EOF、FFmpeg 非零退出和 stderr 消费方式。普通 pipe `read(frame_bytes)` 不保证一次返回完整帧;若按单次 read 解释帧,会错位,若 stderr 使用未消费的 PIPE,长时 FFmpeg 还可能阻塞。 - rawvideo 不携带时间戳,V001 第 38、50 行未冻结“输出样本序号如何映射回原视频时间”以及非零起始 PTS/VFR 时的归一规则,无法保证第二阶段提取的是第一阶段选中的原帧。 - V001 第 58 行只保证 `try/finally` 删除暂存目录,没有要求在 `KeyboardInterrupt`、读取异常或提取异常时先关闭管道、终止并等待 FFmpeg。Windows 下遗留子进程可能继续占用源或暂存文件,使清理失败;这不足以证明“用户中断不留正式目录/暂存”。 最小 required fixes: 1. 在单脚本内冻结一个统一的受管 FFmpeg 调用边界:`read_exact(frame_bytes)` 循环拼满一帧;零字节且无残片才是正常 EOF;半帧 EOF、非零退出或解码错误必须失败;stderr 采用不会填满管道的可追踪方案并检查退出码。 2. 冻结 PTS 归一和时间映射,例如扫描端显式归零时间基并令第 `n` 个 1 fps 输出映射到确定的源相对秒数;第二阶段使用精确定位方式提取该时间的帧。不得从无时间戳 rawvideo 隐式猜测。 3. 任一 `BaseException` 路径先关闭 stdin/stdout/stderr,终止子进程、限时等待、必要时 kill 并再次 wait,再清理暂存,最后原样重抛非普通异常;普通运行错误保持明确工具错误。 4. 增加不运行真实视频的假进程/桩测试:多次短读组成一帧、半帧 EOF、非零退出、stderr 较多、扫描/原图提取期间 `KeyboardInterrupt`;断言无孤儿进程、无暂存、无正式目录且原异常语义保留。 #### F3 — BLOCKING / 测试与证据:当前 PDF 门禁既不能证明页内容/顺序,也不能证明多页生成不累计全分辨率页面 - V001 第 52、69、78 行仅用 `pdfinfo` 证明 PDF 可打开和页数。`pdfinfo` 不能证明第 1 页对应 `slide_001.png`、第 2 页对应 `slide_002.png`,也不能发现空白页、错图或倒序页,故无法证明需求第 70 行“PDF 页面顺序与 PNG 编号一致”。 - V001 第 84—85 行的长迭代器测试只覆盖扫描帧不累计;两页 CLI 的 RSS 基线不能证明 PDF 在页数较多时只保留一张原分辨率图像。第 51 行虽声明流式写入,但没有相应可复验门禁。 最小 required fixes: 1. 合成视频验收中把 PDF 各页渲染或提取为图像,逐页与对应 PNG 的确定性颜色块/像素或允许容差的感知特征比对,明确证明 PDF 内容和顺序均为 `A完整,B`;继续保留页数与可打开检查。 2. 冻结 PDF writer 的内存合同:压缩后的当前页立即写入暂存 PDF,只允许保留页对象编号/偏移等小型元数据,不保存全页像素或全部压缩图像 payload 列表。 3. 增加多页离线测试,以受控图片 opener/writer 计数或等价证据证明任一时刻最多一个解码后的全分辨率页面处于存活状态;不要求真实业务视频或复杂性能矩阵。 ### 已通过且后续默认冻结的方案边界 - 单视频 CLI、默认/显式输出目录、Pillow+NumPy+FFmpeg/FFprobe、无 GPU 依赖及中文路径方向与需求一致;未扩展 PPTX、OCR、人像处理、裁剪、转写、批处理、GUI、API、数据库、Skill 或阈值 CLI。 - 扫描阶段不建立全部采样帧列表、只保留当前/前一帧、稳定段摘要及每个确认输出页的小尺寸特征,方向满足“内存不随采样帧累计”;确认页描述符按最终输出页数增长属于必要状态。 - 正式目录同级唯一暂存、既有输出/符号链接在 FFmpeg 前拒绝、完整后一次目录重命名、并发冲突失败以及源视频只读合同在方案层可接受;F2 只要求补齐子进程先回收再清理的顺序。 - 首次真实 PPT 录屏的启发式效果交由 `case_analysis.media_processor` 后续普通验收合理;本次不要求也不允许提前读取真实业务视频。 ### Open questions - 无。三个阻断均可在 V002 方案和离线测试合同中闭环,不需要改变需求、增加依赖、拆模块或扩大产品范围。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`3` - 当前不得开始实现。开发方应只提交覆盖 F1—F3 的 V002;复审只核对上述三项及已冻结边界是否回退,一次完成后即可决定是否放行实现。 ## DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-DESIGN-REREVIEW-20260801-001 - 记录时间:`2026-08-01T15:07:08+08:00` - 审核阶段:V001 `HOLD/3` 后的 V002 限定方案复审。 - 审核对象:`DEV-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-20260801-001` - 原始消息:`msg_20260801150116832_0f46183c`;`correlation_id=msg_20260801150116832_0f46183c`。 - 恢复唤醒:`HANDOFF-INFODEV-INFOREV-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-V002-MBX-INBOX-WAKE-20260801-001`,仅用于消费既有 V002 inbox 消息,不构成第二次复审请求。 - 前序审计:`DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-DESIGN-20260801-001=HOLD/3`。 - 执行方:`dev.developer.project / infodev` - 独立审核方:`dev.reviewer.project / inforev` - V002:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-V002.md`=`11772 bytes / F28F50AD07954B940684E6FA8E0ADB4EDD1EB6F9FA82DE74969C1BDC5B367F28`。 - 需求及 V001 未变:需求=`1B5797C1408A172328D488EE1C66E92893053C892929437F7DB85239F404B2E7`;V001=`67B04259A13657577EF9AF990461C062D00E56EFC29DB374A848E1C4B006C4DD`。 - 当前实现动作:脚本、测试和用法仍不存在;真实业务视频读取=`0`,FFmpeg=`0`,合成视频=`0`。 ### Findings - 无剩余阻断 finding。V002 只闭环前序 F1—F3,未发现已冻结合同回退或新增范围。 ### F1 闭环:PASS - V002 第 21—30 行为稳定段增加不可变 `segment_anchor`,同时要求相邻差异和相对锚点差异通过;至少 3 个样本才产出,锚点漂移中间帧不得入选,并冻结 `A稳定 -> 六帧渐变 -> B稳定` 只输出 `A,B` 的反例,闭环相邻相似的累计漂移风险。 - 第 34—44 行定义不依赖 OCR 的 `edge_density`、`contrast` 和 `content_score`,冻结增加、减少与容差内同分三种更新方向。 - 第 48—54 行把候选分类固定为“最近逻辑页动画 → 除最近页外历史返回去重 → 新页”,并同时比较最近页的可更新状态和不可变逻辑锚点;三个动作互斥,交叉阈值测试明确禁止全局去重吞掉完整页替换。 ### F2 闭环:PASS - V002 第 60—64 行冻结同源受管子进程边界:参数数组、`shell=False`、长时 stderr 写暂存文件、正常路径 wait/退出码检查,以及 `BaseException` 时关闭管道、terminate、限时 wait、kill、再次 wait、关闭句柄、清暂存、非普通异常原样重抛的顺序。 - 第 68—74 行完整定义 `read_exact` 的短读拼帧、干净 EOF、半帧 EOF 和非零退出行为,不再把单次短读误当完整帧,也不存在未消费 stderr PIPE 填满风险。 - 第 78—80 行以 `setpts=PTS-STARTPTS,fps=fps=1:start_time=0` 冻结 `n -> n.000 s` 映射,并规定输入级准确 seek、第一视频流映射、PNG 尺寸复核及 VFR/非零 PTS 合成测试。 - 第 84—87 行补齐短读、半帧、大 stderr、非零退出及扫描/截图阶段 `KeyboardInterrupt` 桩测试,验证无孤儿进程、无暂存/正式目录并保留异常语义。 ### F3 闭环:PASS - V002 第 93—100 行冻结逐页 PDF writer:只保留路径、对象编号和 xref 偏移;当前页 raw RGB 与压缩 payload 立即写入暂存 PDF并在下一页前释放,禁止任何全页图像或 payload 列表。 - 第 104—110 行规定按 Page Kids 顺序解压每页 `/DeviceRGB / 8 bits / FlateDecode` 图像流,与对应 PNG 的 RGB SHA-256、宽高和 `A完整/B` 标记逐页一致;`pdfinfo` 仅作为可打开/页数的并列检查,因此能够证明非空白、内容和顺序。 - 第 114—120 行以至少 20 页的可注入 opener 计数器证明 `max_active_decoded_images == 1`、上一页退出后才进入下一页,并再次逐页核对 RGB 哈希;不引入真实视频或复杂 RSS 矩阵。 ### 冻结边界回退检查:PASS - 单视频、默认/显式输出、1 fps、原分辨率 PNG、一个 PDF、Pillow+NumPy+FFmpeg/FFprobe、无 GPU、中文路径、同级唯一暂存和一次目录重命名均保留。 - PPTX、OCR、人像处理、裁剪/遮挡、会议界面移除、JSON、转写、批处理、GUI、API、数据库、Skill、阈值 CLI 仍全部排除;仍限一个脚本、一个测试文件和一页用法。 - 扫描不累计全部帧,PDF 不累计全部页面;正式输出预拒绝覆盖、并发冲突失败和源只读合同均未回退。 ### 已授权真实样本顺序:PASS - 项目消息账本确认 `msg_20260801144622354_1c75b06b` 由 `case_analysis.media_processor` 发给 `dev.developer.project`,授权只读使用 `G:\熊猫财经\20260729192357-2026小郑掘金产业链之算力行业付费直播-视频-1-共享屏幕.mp4`,已知 `H.264 / 2560x1440 / 12866.880 s / 1268392019 bytes`。 - V002 第 132—138 行正确保持顺序:方案 PASS 且离线/合成稳定后,先固定源四项指纹;仅在专属任务临时根可选生成一个短片副本;短片暴露具体问题时只做单一最小修复;稳定后完整视频只运行一次;输出和外部只读资源采样证据仍只写专属临时根;结束后再次逐项核对源指纹并保留产物供请求方只读复核。 - 该追加只改变实现后的验收输入与顺序,不改变产品 CLI、算法输出、阈值接口或正式产物合同;实现审核与最终请求方验收的既有角色分离仍有效。 ### 复审命令与外部动作 - 只读核对 V002/V001/需求字节数与 SHA-256、前序审计、项目账本、消息事件和实现文件不存在状态;未执行代码、测试、FFmpeg、合成视频或真实视频读取。 - 当前治理文档哈希与前序审核一致;复审未修改方案、实现、测试、执行日志或其他被审产物。 ### Open questions - 无。阈值真实效果是实现与已授权真实样本验收项,不构成继续阻断方案的理由。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 前序 `F1/F2/F3`:全部在 V002 方案层闭环。 - 实现授权:允许 `dev.developer.project` 严格按 V002 开始单脚本、测试和用法实现,并按既定离线 → 合成 → 可选短片 → 完整视频一次的顺序收集证据;不得扩大产品范围。 - 结论边界:本 PASS 仅批准方案,不证明代码已实现、测试已通过或真实样本结果已达标;实现与证据完成后仍须按既定入口提交必要实现审核,PASS 后再交 `case_analysis.media_processor` 最终功能验收。 ## DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-IMPLEMENTATION-20260801-001 - 记录时间:`2026-08-01T16:28:44+08:00` - 审核阶段:V002 实现、离线测试与合成证据的必要独立审核。 - 审核对象:`DEV-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-20260801-001` - 原始消息:`msg_20260801153518062_c0082f2e`;`correlation_id=msg_20260801153518062_c0082f2e`。 - 本轮提示只用于唤醒既有 MB-X inbox 消息,不构成第二次送审。 - 前序方案审计:`DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-DESIGN-REREVIEW-20260801-001=PASS/0`。 - 执行方:`dev.developer.project / infodev` - 独立审核方:`dev.reviewer.project / inforev` - V002:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-V002.md`=`11772 bytes / F28F50AD07954B940684E6FA8E0ADB4EDD1EB6F9FA82DE74969C1BDC5B367F28`。 - 实现:`dev/project-dev/extract_ppt_slides.py`=`24973 bytes / 9AC4A9D05B3779374104A2C5DD11A9B29922B645A4098F2DDE73D85E21371EBA`。 - 测试:`dev/project-dev/test/test_extract_ppt_slides.py`=`20201 bytes / F5040F9AC53195EE81184030608BA6D12F4FD6A0C3EC50B95815A42865F782B7`。 - 用法:`dev-doc/project-doc/会议录屏PPT页面提取工具.md`=`3235 bytes / 9C7896A6BEC446343A0DF2FFC5EBD46E83D14C3ECB27A4D42B3CE40B95FB8C83`。 ### Findings #### F1 — BLOCKING / 代码与正式产物合同:实现把已冻结的 `pages/` 与视频名 PDF 布局改成了输出根目录文件 - V001 第 13、56 行已冻结正式目录为 `pages/slide_001.png...` 与 `<视频名>.slides.pdf`,V002 第 13—15 行明确这些已通过边界继续冻结且不得增加或改写业务产物合同。 - 实现第 531 行把 PNG 直接写为暂存根的 `slide_*.png`,第 669 行把 PDF 固定写为 `slides.pdf`;用法文档第 27 行及合成产物也把这一回退固化为公开行为。当前合成证据实际为 `合成验收.slides/slide_001.png`、`slide_002.png`、`slides.pdf`,不是获批接口。 - 这是正式消费者可见的输出路径和文件名错误,不是命名偏好;即使 PNG/PDF 内容正确,也不能按错误接口放行真实验收。 最小 required fixes: 1. 仅调整暂存内布局:创建 `pages/` 并把连续编号 PNG 写入其中;PDF 写为 `<源视频 stem>.slides.pdf`,成功后仍以一次同级目录重命名提交,不改变算法或 CLI 参数。 2. 同步测试和一页用法;用合成视频重新证明正式目录只含获批的 `pages/` 与视频名 PDF、PNG 连续且 PDF 逐页 RGB/顺序不变。无需读取、截取或运行真实业务视频。 #### F2 — BLOCKING / 代码与路径安全:先 `resolve()` 再检查使“输出符号链接预拒绝”在断链场景失效 - V001 第 27 行及首次审计已通过边界要求:输出存在或为符号链接时必须在任何 FFmpeg 动作前拒绝;输入必须是普通文件。该边界在 V002 第 13 行继续冻结。 - `_validate_paths()` 第 639、643 行先对输入/输出执行 `resolve(strict=False)`,第 647 行才对解析后的目标调用 `lexists()`。这样会丢失调用者提供路径本身的链接身份:输入文件链接会被当作目标普通文件接受;输出若是指向尚不存在目标的断链符号链接,解析后的目标 `lexists=False`,随后可能在链接目标位置创建暂存并提交,而不是拒绝该链接路径。 - 当前 `test_existing_output_is_rejected_before_external_process` 仅覆盖已存在目录,没有覆盖存活/断链输出链接,也没有证明输入普通文件边界。 最小 required fixes: 1. 在跟随链接或规范化到目标之前,对调用者给出的绝对词法路径做 `lstat/is_symlink/lexists` 等价预检;拒绝输入链接/非普通文件以及任何已存在、存活或断链的输出链接,再进入 FFprobe/FFmpeg。父目录合法性和同级暂存规则保持不变。 2. 增加不依赖真实媒体的预检测试,至少覆盖已存在目录/文件、存活输出链接、断链输出链接和输入链接;环境不能创建 Windows 符号链接时可用受控桩证明分支,但不得以权限不足跳过合同。 #### F3 — BLOCKING / 代码与测试:失败包络未完整覆盖,V002 要求的两个阶段中断证据被拆散后没有证明主流程清理 - V002 第 60—64、82—87 行要求两个 FFmpeg helper 的整个受管边界都遵守 `BaseException` 清理/普通异常包装,并要求在扫描阶段和原图提取阶段分别注入 `KeyboardInterrupt`,同时证明子进程回收、暂存/正式目录不存在和原异常类型不变。 - `_run_file_command()` 第 137 行与 `scan_video()` 第 443 行在各自 `try` 之前打开 stderr 文件;打开失败不会进入该 helper 的普通异常包装。`extract_slides()` 第 657 行又在清理 `try` 之前创建暂存目录;第 676 行的并发提交 `OSError` 清理暂存后仍作为裸系统异常越过只捕获 `SlideExtractionError` 的 CLI。上述路径没有实现方案所称的统一明确工具错误/清理包络。 - 两个 `test_keyboard_interrupt_reaps_*` 只分别调用底层 helper,未断言正式目录和主流程暂存;`test_baseexception_removes_staging_and_leaves_no_formal_output` 又只在 `probe_video` 注入中断、没有子进程。三项测试拼在一起仍没有按 V002 门禁证明“扫描中断”和“原图提取中断”各自贯穿完整主流程后同时满足回收与目录清理。 最小 required fixes: 1. 把 stderr 文件打开、子进程启动/回收和句柄关闭纳入同一受管异常边界;把暂存创建与最终目录提交纳入可清理、可定位的主流程错误边界。普通文件/并发提交错误应转为含阶段的 `SlideExtractionError` 或等价用户可定位错误;`KeyboardInterrupt/SystemExit` 仍原样重抛,且清理错误不得替换原非普通异常。 2. 增加两个完整主流程离线测试:分别在扫描和原图提取期间注入 `KeyboardInterrupt`,记录 `close -> terminate -> timed wait -> 必要时 kill -> wait`,并在同一用例断言子进程已退出、暂存/正式目录不存在、原异常类型不变;再覆盖 stderr 文件打开失败和提交冲突的明确错误/清理。无需任何真实媒体重跑。 ### 已通过且冻结的实现部分 - F1 算法主体已按 V002 实现:不可变稳定段锚点、相邻/锚点双约束、`anchor_drift` 反例、`edge_density + 0.25 * contrast` 内容分数,以及最近页动画 → 历史去重 → 新页的互斥顺序均有对应测试。 - F2 的 `read_exact` 短读/干净 EOF/半帧 EOF、stderr 文件重定向、正常 wait/退出码、`setpts=PTS-STARTPTS,fps=fps=1:start_time=0`、输入级准确 `-ss` 和 VFR/非零 PTS 合成映射通过复验;本次 F3 只阻断尚未纳入完整失败包络与主流程门禁的路径。 - F3 PDF 主体已按 Page Kids 顺序写 `/DeviceRGB / 8 bits / FlateDecode` 图像流,逐页 RGB 与 PNG 一致;20 页 opener 的 `max_active=1` 通过。PPTX/OCR/人像/裁剪/JSON/GUI/API/数据库/批处理/转写/Skill 等排除项未回退。 ### 独立验证与证据 - Python=`3.12.7`,Pillow=`10.4.0`,NumPy=`1.26.4`;FFmpeg/FFprobe=`2024-12-19`。源码/测试 `compile()`=`PASS`,CLI help=`PASS`。 - `python -B -W error::ResourceWarning -m unittest dev/project-dev/test/test_extract_ppt_slides.py -v`=`15/15 PASS`;`python -B -W error::ResourceWarning -m unittest discover -s dev/project-dev/test -p "test_*.py" -v`=`34/34 PASS`。 - 既有合成源只读复核:`3875 bytes / 41BBCE50D3E5B28D82239A9061A27F4D8301ADD112C4D1154F05730542E5E06A`,FFprobe=`15.000000 s / 640x360`;PNG=`2`,PDF 解压页=`2`,两页 RGB SHA-256 均与对应 PNG 一致,尺寸均为 `640x360`。既有 PDF 渲染页目视为 `A完整/B`,无空白、错序或裁切。 - Windows 当前会话无创建符号链接权限(独立动态探针返回 `WinError 1314`);F2 依据已冻结合同、`Path.resolve(strict=False)`/`lexists` 的确定语义和缺失测试作静态判定,不把环境权限不足当作通过证据。 - 本轮只运行离线桩、临时 VFR/合成视频测试并只读检查既有合成证据;真实业务视频读取=`0`、截取=`0`、完整运行=`0`,未访问其路径或元数据。 ### Open questions - 无。三项阻断均可由单脚本、单测试文件、一页用法及合成证据的最小修复闭环,不需要修改 V002、扩展产品范围或运行真实业务视频。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`3` - 当前不得进入可选短片或完整真实视频验收。开发方只需完成 F1—F3 的最小代码/测试/用法修复并重跑离线与合成证据,再按原消息链提交限定复审;已通过的算法、时间映射和 PDF 内容合同不得回退。 ## DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-IMPLEMENTATION-REREVIEW-20260801-001 - 记录时间:`2026-08-01T17:33:14+08:00` - 审核阶段:首次实现 `HOLD/3` 后仅复审 F1—F3 的限定实现复审。 - 审核对象:`DEV-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-20260801-001` - 原始消息:`msg_20260801172720145_4e8aa710`;`correlation_id=msg_20260801172720145_4e8aa710`。 - 本轮提示只用于唤醒既有 MB-X inbox 消息,不构成第二次复审请求。 - 前序实现审计:`DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-IMPLEMENTATION-20260801-001=HOLD/3`;前序回执=`msg_20260801163131253_03ae58a1`。 - 执行方:`dev.developer.project / infodev` - 独立审核方:`dev.reviewer.project / inforev` - 实现:`dev/project-dev/extract_ppt_slides.py`=`26791 bytes / 96348DF5B9C88B79A4E401F160E76EC444A1D2DF302AE1A8A868F8DCD3BE3662`。 - 测试:`dev/project-dev/test/test_extract_ppt_slides.py`=`25590 bytes / 9D78AD3850D7864E46C6A10C1364AD463090EBBED224FB2BE57BD964A66DD162`。 - 用法:`dev-doc/project-doc/会议录屏PPT页面提取工具.md`=`3372 bytes / 8FA1335973D5F84070DF5706C53C8CDDED8F92CC97DADEECA96B0B64EE7F3052`。 ### Findings #### F3-R1 — BLOCKING / 代码与测试:stderr 句柄关闭失败仍会替换原 `KeyboardInterrupt/SystemExit` - 前序 F3 required fix 明确要求“`KeyboardInterrupt/SystemExit` 原样重抛且清理错误不得替换原非普通异常”。当前 `_attempt_reap()` 已保护子进程回收错误,但 `_run_file_command()` 第 173—175 行和 `scan_video()` 第 506—508 行仍在 `finally` 中直接执行 `stderr_handle.close()`,没有保存/合并关闭错误的保护。 - Python 的 `finally` 异常会覆盖正在传播的异常。独立桩让目标进程首次 `wait()` 抛 `KeyboardInterrupt`、回收成功、随后 stderr handle 的 `close()` 抛 `OSError("stderr close denied")`,实际观察为 `observed_exception_type=OSError`,原中断类型被替换。这是前序同一 F3 的未闭环分支,不是新增审核范围。 - 当前 `test_cleanup_error_does_not_replace_keyboard_interrupt` 只让 `terminate()` 抛清理错误,未让 stderr 关闭失败;20/20 因而没有覆盖该确定性反例。相同问题同时存在于文件输出 helper 与扫描 helper。 最小 required fixes: 1. 仅把两个 helper 的 stderr 关闭纳入与 `_attempt_reap` 等价的受保护清理:原异常为 `KeyboardInterrupt/SystemExit` 时,关闭失败不得替换原类型;原异常为普通异常时可附加有界清理错误;正常路径关闭失败必须转为含当前阶段的 `SlideExtractionError` 或等价明确工具错误。 2. 增加不使用媒体的关闭失败桩测试,至少证明文件输出 helper 和扫描 helper 在原 `KeyboardInterrupt` 下均保留原类型,并证明正常/普通失败路径的关闭错误不会以无阶段裸 `OSError` 泄漏。无需改 F1/F2、算法、PDF writer、CLI 或用法,无需重跑合成/真实媒体。 ### F1 闭环:PASS - 正式输出已恢复为 `pages/slide_001.png...` 与 `.slides.pdf`;`extract_original_pages()` 在暂存根创建 `pages/`,PDF 使用源视频 stem 命名,完整后仍只执行一次同级目录 `rename`。 - 新合成产物根只含 `pages/` 和 `合成会议录屏.slides.pdf`;2 张连续 PNG 与 2 个 PDF Page Kids 的 RGB SHA-256、顺序和 `640x360` 尺寸逐页一致。F1 不再阻断。 ### F2 闭环:PASS - `_absolute_lexical()` 使用 `abspath` 形成不跟随链接的绝对词法路径;输入先拒绝 `is_symlink`/非普通文件,输出在解析目标前以 `lexists` 拒绝已存在文件、目录及存活/断链链接,均发生在任何 `Popen` 前。 - 单测覆盖已存在文件/目录、存活/断链输出链接受控桩和输入链接,均断言外部进程未启动。F2 不再阻断。 ### F3 已闭环部分 - stderr 打开已移入 helper `try`;子进程回收普通错误不再替换原中断;暂存 `mkdir`、提交竞争和阶段错误已进入主流程包络。 - 扫描 read 与原图提取 wait 的两个完整 `extract_slides()` 中断用例均证明子进程 `close/terminate/wait`、无暂存/正式目录及原 `KeyboardInterrupt`;提交冲突与 stderr 打开失败均有明确错误测试。仅 `F3-R1` 所述句柄关闭失败分支仍未闭环。 ### 独立验证与外部动作 - `compile()`=`PASS`;CLI help=`PASS`。 - `python -B -W error::ResourceWarning -m unittest dev/project-dev/test/test_extract_ppt_slides.py -v`=`20/20 PASS`;`python -B -W error::ResourceWarning -m unittest discover -s dev/project-dev/test -p "test_*.py" -v`=`39/39 PASS`。 - 新合成证据只读复核:源=`3875 bytes / 41BBCE50D3E5B28D82239A9061A27F4D8301ADD112C4D1154F05730542E5E06A`,FFprobe=`15.000000 s / 640x360`;PNG=`1900/2290 bytes`,PDF=`4328 bytes / 5E6F5BFC5432045728967EF2A3B31C16CE9E4F0418891395C4C6B77013554F88`,根布局、2 页尺寸与逐页 RGB 均 PASS。 - 独立关闭失败反例只使用 Python 桩对象和 mock,无文件或媒体输入。真实业务视频读取=`0`、截取=`0`、完整运行=`0`,未访问其路径或元数据。 ### Open questions - 无。唯一剩余阻断可由极小 helper 清理修复和离线桩测试闭环,不需要修改方案、产品合同或证据顺序。 ### 结论 - 审计状态:`HOLD` - 剩余阻断问题数:`1` - F1=`CLOSED`;F2=`CLOSED`;F3=`PARTIAL / F3-R1 OPEN`。 - 当前仍不得进入可选短片或完整真实视频验收。开发方只需修复 `F3-R1` 并提交 F3-R1-only 限定复审;F1/F2、算法、时间映射、PDF 内容和排除项不得再改,且无需重跑合成或真实媒体。 ## DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-IMPLEMENTATION-F3-R1-REREVIEW-20260801-001 - 记录时间:`2026-08-01T18:23:01+08:00` - 审核阶段:前序 `HOLD/1` 后的 F3-R1-only 限定实现复审。 - 审核对象:`DEV-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-20260801-001` - 原始消息:`msg_20260801180914484_3f58002d`;`correlation_id=msg_20260801180914484_3f58002d`。 - 本轮提示只用于唤醒既有 MB-X inbox 消息,不构成第二次复审请求。 - 前序审计:`DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-IMPLEMENTATION-REREVIEW-20260801-001=HOLD/1`;前序回执=`msg_20260801174041344_38dc2a9e`。 - 执行方:`dev.developer.project / infodev` - 独立审核方:`dev.reviewer.project / inforev` - 实现:`dev/project-dev/extract_ppt_slides.py`=`27482 bytes / 052F5B3BA40EA6C1BB87AF9A7BB4E9C50A84C5A45929540F23606582D30D7D1B`。 - 测试:`dev/project-dev/test/test_extract_ppt_slides.py`=`29015 bytes / 35CB570ACC6C9EE3AB25EB9B1B15C11691F0902AE23314445B645A1BA3760484`。 - 用法未变:`dev-doc/project-doc/会议录屏PPT页面提取工具.md`=`3372 bytes / 8FA1335973D5F84070DF5706C53C8CDDED8F92CC97DADEECA96B0B64EE7F3052`。 ### Findings - 无剩余阻断 finding。仅核对 F3-R1;F1/F2、算法、时间映射、PDF、布局、链接和排除项未重新审核。 ### F3-R1 闭环:PASS - `_run_file_command()` 与 `scan_video()` 均新增 `active_error: BaseException | None`。主流程一旦进入 `except BaseException` 即记录原异常;`finally` 中 stderr `close()` 的普通错误只有在 `active_error is None` 时才转换为带阶段的 `SlideExtractionError`,已有 `KeyboardInterrupt/SystemExit` 或普通主异常不会被关闭错误替换。 - `_attempt_reap()` 的既有合同未回退:子进程清理普通错误不替换非普通主异常;正常或普通运行错误仍保留阶段语义。 - 新增离线桩同时覆盖文件输出 helper 与扫描 helper:`wait/read -> KeyboardInterrupt` 后 stderr `close -> OSError`,两者均保留 `KeyboardInterrupt`;正常成功后的 close 错误转为“关闭 stderr 失败”的阶段错误;非零 `exit=7` 后 close 错误仍保留含阶段的非零退出错误。 ### 独立验证与外部动作 - 两个提交文件 `compile()`=`PASS`。 - 仅运行三个无媒体目标桩:`test_cleanup_error_does_not_replace_keyboard_interrupt`、`test_stderr_close_error_preserves_interrupt_in_both_helpers`、`test_stderr_close_error_is_staged_on_normal_and_ordinary_failure`=`3/3 PASS`,并启用 `ResourceWarning` 作为错误。 - 独立桩复算:`wait -> KeyboardInterrupt`、回收成功、stderr `close -> OSError` 时 `interrupt_probe=KeyboardInterrupt`;无主异常且 `close -> OSError` 时 `normal_close_probe=SlideExtractionError`,消息含 `probe-stage关闭 stderr 失败`。 - 开发方提交的完整离线回归为目标 `22/22 PASS`、project `41/41 PASS`;本限定复审遵照请求未重跑包含合成/VFR 视频的完整套件,也未读取既有媒体证据。 - 真实及合成媒体读取=`0`、截取=`0`、运行=`0`;未访问任何媒体路径或元数据。 - 并发新增开发员的治理配置不属于本事项授权范围,本审核未修改或修复。复审结束前只读执行 `mbx validate --project project-info --governance` 时当前状态=`OK / warnings=0`,该瞬时结果不冒充对并发管理变更的审核。 ### Open questions - 无。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - F3-R1=`CLOSED`;结合前序 F1/F2 已关闭结论,首次实现审核的三个阻断均已闭环。 - 放行边界:允许 `dev.developer.project` 按 V002 已授权顺序进入真实样本验收;本 PASS 不替代 `case_analysis.media_processor` 对真实页面效果、资源、源指纹和最终功能的验收,也不授权本审核员或开发员处理并发治理配置。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-20260801-001 - 记录时间:`2026-08-01T22:41:43+08:00` - 审核阶段:project 级股票估值端到端协调层 V2 重型方案首次独立审核。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-DESIGN-V002-20260801-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 方案:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-V002.md`=`17465 bytes / D0F69CE0B1CD4338C4318D4B920E53412EA96E42CA28F814AFE41CEE3C07F3F3`,与交接快照一致。 - 接管记录:`ai-infodev-2/worklog/2026-08-01-stock-valuation-v2-takeover.md`=`1437 bytes / 09A634CF4B51F534C902C6D3C96B4C86856CB28B6154BDC7EE41B86CFA9606C5`。 - 前序方案:`dev-doc/ana-doc/开发方案/CODE-DESIGN-ANA-STOCK-VALUATION-PIPELINE-V2-V001.md`=`16980 bytes / 0F24A636E4C6E22E7792746447E3E837A11DFCCACC275E6936551762D44C574D`;无独立 PASS,本轮不把其视为已审核基线。 - 外部动作:V2 实现读取/创建=`0`;`ana-dev` 修改=`0`;网络请求=`0`;真实或 fixture 运行=`0`。本轮仅做静态方案、治理记录和既有 V1 公共合同的只读核对。 ### Findings #### F1 — BLOCKING / 单一实施权属:V002 声明已接管,但全局事项、计划和旧阻塞记录仍把同一 task 标成 ana 角色的活动事项 - V002 第 13—17 行已经正确选择 project 落点并把 V001 降为历史证据;但 `dev-doc/开发事项总纲.md` 第 697—705 行、`dev-doc/开发事项计划.md` 第 788—797 行仍把当前方案指向 V001,负责人/审核员仍为 `dev.developer.ana.cai / dev.reviewer.ana.cai`,状态仍为旧方案待审。 - `DEV-ISSUE-ANA-STOCK-VALUATION-V2-REVIEW-SESSION-20260801-001` 仍是 `OPEN_BLOCKING_IMPLEMENTATION`,关闭条件是管理员修复或正式改派;现有接管日志和本次原生交接证明已发生改派,但正式事项链尚未追加该事实。仅在 V002 内自称“取代”不足以让另一活动计划、旧 inbox 请求和新 project 实施形成单一真相,存在双实现或双审核风险。 最小 required fixes: 1. 以 append-only 方式在事项总纲、事项计划和问题记录追加同一 task 的正式接管/替代记录:引用本次原生委派或管理授权,固定新 owner/reviewer、project 代码/测试/文档/审计落点,标记 V001 与旧 ana 审核请求为历史/已替代、`ana-dev` 全部只读,并关闭旧会话阻塞记录。 2. 不改写历史 V001,不删除旧消息;V003 只引用上述唯一当前入口。若当前开发角色无权关闭管理记录,先由 `project.admin` 代写该最小治理闭环;闭环前不得实现。 #### F2 — BLOCKING / V1 只读桥接:方案点名了公共函数,却没有冻结实际可调用签名、注册表解析和退出码映射 - 只读核对当前 V1:`run_pipeline(snapshot_path, output_dir, source_registry_path, *, force=False)` 强制需要 `source_registry_path`;`compute_valuation(snapshot, registry)` 强制需要 registry。V002 第 86、125 行只说调用 `run_pipeline`、`load_snapshot`、`compute_valuation`,没有说明 V2 如何解析并传入 V1 的 `source_registry.json`,也没有冻结所加载模块必须来自 `dev/ana-dev/stock_valuation_pipeline/`。 - V1 `run_pipeline` 返回状态对象,不返回进程退出码;退出码 `0/2/3` 是 V1 `cli.py` 对成功、`InputError`、`OSError/json.JSONDecodeError` 的映射。V002 宣称“保留退出码”,但未给桥接异常表,因此不同实现可产生不兼容结果。若通过复制 CLI/公式来补洞,又违反单实现边界。 最小 required fixes: 1. 在 V003 冻结 `v1_bridge` 的完整调用表:从仓库相对路径解析 V1 包与默认 registry;记录实际加载模块路径、V1 版本/引擎指纹和 registry 哈希;分别列出 `--input` 的 `run_pipeline(..., source_registry_path, force)` 与 judgment 模式的 `load_snapshot -> load registry -> compute_valuation(snapshot, registry)` 参数、返回和异常映射。 2. 明确复现 V1 CLI 的 `0/2/3` 语义而不复制计算/校验/报告代码;测试同时证明加载路径确为只读 V1、V1 三件套及 `GENERATED/REUSED` 与直接 CLI 一致、judgment 数值对象与直接公共函数一致。V1 公共合同不匹配时 fail-fast 并停止,不做第二实现。 #### F3 — BLOCKING / 四类公开提供者:目前只冻结“类别”,未冻结可审计的 provider registry 与字段取得合同 - V002 第 147—161 行描述法定公告、行情、结构化财务、机构预测的职责,但没有列出实际 provider ID、域名/端点、请求参数、字段路径、日期字段、单位/缩放、支持市场、主备顺序或解析版本;计划中的 `provider_registry.json` 尚不存在,也未作为送审附件冻结。 - 当前 V1 registry 对 `quote_provider`、`professional_database`、`institution_aggregator` 仍是泛型且 allowed domains 为空,不能替代 V2 的网络 allowlist。由开发时临场选站会让 HTTPS 限制、A1 回链、4/3 forecast gap、90 秒请求数和真实 smoke 都不可预测,也无法在方案审核时确认未使用登录/付费/受限来源。 最小 required fixes: 1. 在 V003 内或以带 bytes/SHA-256 的随附 registry 草案冻结首期实际提供者:每类至少一个明确 provider,机构预测至多两个;列 provider ID、公开域名和协议、端点/方法/规范化参数、支持市场、权威日期、字段映射、原始单位与换算、响应类型/上限、adapter version、A1/B1/B2 等级、核心/非核心和确定的回退/停止顺序。 2. 对每个 provider 固定最小成功、空数据、4xx/5xx、字段漂移与 as-of 过滤 fixture;未知域名或未登记回退必须在发请求前拒绝。不得把“另一公开站点”作为运行时自由选择。 #### F4 — BLOCKING / 90 秒硬预算:方案允许截止后等待在途请求,与自身验收门禁直接冲突 - V002 第 169 行规定达到 90 秒后“等待中的请求依自身超时结束”,因此在截止前刚开始的请求仍可继续 20 秒并再叠加重试/退避;`ThreadPoolExecutor` 的普通退出也会等待运行中的 future。第 263 行却要求外站异常“必须在预算内结束”,两者不能同时成立。 - 连接 8 秒、读取 20 秒和最多两次重试只限制单次动作,不能自动形成 acquisition 级绝对截止;当前设计也未说明流式读取、DNS/连接、退避和重试如何扣减剩余预算。 最小 required fixes: 1. 用单调时钟冻结唯一 `network_deadline = network_started + 90s`;每次请求、读取循环、退避、重试和 provider 二次搜索都先检查剩余预算,并把本次总超时裁剪到剩余时间。截止后不得创建新请求,所有在途调用必须按同一 deadline 协作返回,协调层不得因 executor shutdown 再无界等待。 2. 遥测保存 budget start/deadline/end、每 provider/request 消耗和超时 gap;离线阻塞服务器/桩覆盖四 worker、截止前启动、重试退避和退出清理,证明整个机械网络阶段在冻结容差内结束,而非只证明“停止提交新 future”。 #### F5 — BLOCKING / 内容寻址缓存与公司基线:`complete=true` 不是可复用性的充分语义,指纹和负缓存合同缺失 - V002 第 194—198 行没有定义 request fingerprint 的规范化前像;不同参数顺序、请求体、provider/adapter、ticker/as-of 或 fixture/real 来源可能碰撞或误复用。 - 请求索引同时保存 HTTP/业务状态与 `complete=true`,但复用门禁没有要求 HTTP 成功、解析/schema 成功或 ProviderResult 可用。于是完整写下来的 404、5xx、超时页、字段漂移响应或 `GAP/BLOCKED` 也可能被永久视为有效命中,后续复评不会重新取得数据。 - 单个 `baseline.json` 的 schema/version、baseline as-of、watermark、字段来源集合及“自身哈希”前像未冻结;也未定义从较新基线回跑较旧 as-of、并发写同一公司或部分动态模块刷新失败时的保留/回退规则。 最小 required fixes: 1. 冻结 request fingerprint 的规范化字段和编码,至少覆盖 provider/adapter version、method、canonical URL/query/body、ticker、as-of、数据种类及 fixture 身份;原始 blob 可归档失败响应,但可复用逻辑索引必须把传输完成、允许的 HTTP 状态、内容类型、哈希、解析/schema、as-of 与 provider semantic status 分开记录。 2. 明确负结果只按有界 TTL/本次运行使用或必须重试,不得用 `complete=true` 永久复用;冻结 baseline schema/version/as-of/watermark/source hashes/data hash、原子并发提交和新旧 as-of 选择规则。增加 404/5xx/字段漂移、哈希篡改、较新基线回跑较旧 as-of、局部刷新失败及并发提交测试,始终保持字段到 A1 document ID/raw hash 的回链。 #### F6 — BLOCKING / `--force` 原子替换:只有目标描述,没有可验证的目录交换与 `BaseException` 回滚状态机 - V002 第 249—254 行说明 staging、manifest-last 和备份交换,但未冻结 Windows 下 `output -> backup -> staging -> output -> remove backup` 的逐步所有权,也未说明在第一次/第二次 rename 后遇到 `KeyboardInterrupt/SystemExit`、回滚自身失败或备份清理失败时哪个目录为正式结果、原异常如何保留。 - 失败目录命名和输出路径预检也未处理既有文件、符号链接/reparse point、同名 `.failed-*` 或 backup 冲突。实现者无法据此证明旧完整结果永不丢失、半成品永不冒充正式目录。 最小 required fixes: 1. 冻结 absent-output 与 force-output 两条目录状态机、每一步唯一 owner、预检和冲突处理;提交边界捕获 `BaseException`,在已移动旧目录而新目录未成功就位时优先恢复旧目录,清理失败不得替换原 `KeyboardInterrupt/SystemExit`,只有新目录成功就位后才允许清除备份。 2. 离线注入每个 mkdir/write/manifest/第一 rename/第二 rename/恢复/清理点,逐项断言旧输出字节哈希、正式目录唯一性、staging/backup/failed 归属、COMPLETE manifest 不外泄和原异常类型。默认拒绝存在的文件、目录及链接必须发生在网络前。 #### F7 — BLOCKING / 终态、正式产物与双墙钟:缺少可消费的状态矩阵,且 staged metrics 无法证明“到提交完成”的墙钟 - V002 分散列出部分产物,但没有按 `COMPLETE / COMPLETE_WITH_GAPS / DATA_READY_NEEDS_JUDGMENT / BLOCKED / FAILED` 冻结必有、可有、禁止文件及 manifest/status/CLI exit code;尤其无 judgment 虽禁止 V1 两件套,却未固定 16 节报告、QA、source evidence、gap、runtime 和 manifest 的确切文件名及成功退出语义。 - `--task-start` 只标为 ISO-8601 可选,没有时区、未来值、来源或默认策略;阶段耗时也没有要求单调时钟。任意未来 task-start 可制造负值,系统时钟跳变可破坏阶段和 task/process wall。 - `runtime_metrics.json` 在 staging 中、manifest 又必须最后哈希;若其终点是第 258 行的 `commit_ready_at`,就尚未包含目录 rename 的提交完成。提交后再改 metrics 又会破坏第 227 行的 manifest 哈希门禁。当前合同没有解释如何同时满足原子包与“所有终态记录到最终提交的 task/process wall”。 最小 required fixes: 1. 给出终态矩阵:每个状态的 CLI exit code、stdout 最小 schema、正式/失败产物精确文件名、manifest status/complete、必有/禁止项;固定 `DATA_READY_NEEDS_JUDGMENT` 是预期数据终态而非伪 COMPLETE,`BLOCKED/FAILED` 必须非零且不可留下正式 COMPLETE 包。 2. 冻结 `task_start` 的带时区解析、`arg|process_start` 来源、不得晚于 process start 的校验与原值留证;wall timestamp 用带时区 UTC/本地值,所有 duration/budget 用单调时钟。 3. 明确 `commit_ready_at` 与实际 `commit_finished_at` 的权威终点及落证方式,使提交后 task/process wall 可审计且不重写已被 manifest 哈希覆盖的文件;正常、data-ready、blocked、failed、force rollback 各测双墙钟非负、阶段和总耗时关系、最终 stdout/receipt 与 committed manifest 的关联。 #### F8 — BLOCKING / 验收可复算性:铖昌 fixture、V1 10/10 与真实 smoke 还没有冻结输入快照、期望值、命令和证据包 - V002 第 277—291 行只写“与既有 fixture 一致”和“001270.SZ 或另一只深市股票”,没有列基线文件哈希、关键期望值/容差、fixture request map 或真实两次运行的隔离缓存/输出命令。实现方可在生成 fixture 时同时改变输入与 expected,测试仍会自洽通过。 - 当前可用只读基线为:铖昌 snapshot=`10585 bytes / 4C27EE81A670BFA8BBD1E2DFB03A9730F6940D7A340D410D232585C57598A138`,V1 results=`9766 bytes / 27671D42A75C82125B893B3374E27497E33B929BB1AFEFA61A5D3370BC446559`;V1 测试=`7231 bytes / C1ECD2A8C8C0C9131C3E93B1E384616508314CB2843571D169876CA155D171CD`,长城 fixture=`7142 bytes / 06AB6A7C45C2E43F71654C616F15A826B21E468C4BA72AFB0B253C9DD89FACD8`。V002 未把这些或等价批准快照固定到验收前像。 最小 required fixes: 1. 在 V003 冻结铖昌 fixture 的来源文件 bytes/SHA-256、request fingerprint→fixture response 清单、judgment overlay、关键数值的精确值/容差,以及 4 汇总/3 明细只形成一个 gap 的 expected;expected 必须来自独立只读基线,不能由被测 V2 在测试时生成。 2. 冻结 V1 10/10 的测试入口和基线快照,并同时运行直接 V1 与 V2 bridge 比较。 3. 冻结 L4 的首选 ticker/as-of、空缓存冷跑与同缓存复跑的两条命令、允许换股的唯一条件,以及必须留存的 stdout/stderr/runtime、request indexes、raw hashes、provider/gap、A1 links、cache/baseline diff 和 90 秒证据;真实值可随站点变化,但来源身份、日期、单位、预算、复用与缺口真值不能省略。该修订只冻结后续验收,不授权现在联网或运行。 ### 已通过且冻结的方案部分 - project 代码/测试落点、`ana-dev` 只读、不复制 V1 公式的总体方向正确;F1/F2 要求的是把正式权属与可调用边界补成单一、可执行合同,不授权回到 ana 实现。 - 无 judgment 时固定 `DATA_READY_NEEDS_JUDGMENT`、不构造伪 V1 snapshot/results、不输出方向性价格结论;有 judgment 时禁止覆盖价格、股本、法定利润、日期和 A1 身份。这一两阶段边界通过,不得回退。 - 四类来源、可信信源停止条件、publish/data 双日期 as-of 禁止未来信息、字段级 A1 回链、机构汇总 4/明细 3 只形成一个 gap、16 节顺序、统一数值源和自动 QA 的业务方向通过;F3—F5 仅要求补足实际 provider/deadline/cache 可执行细节。 - 不扩展 GUI、API、数据库、服务、批处理、交易指令、付费/登录来源或 V1 公式修改;原操作手册仍须管理员单文件授权或代同步,该文档权限事项不阻断 project 方案返修。 ### Open questions - 无。上述八项均可通过 append-only 治理闭环和 V003 方案/随附 registry 的最小返修解决,不需要创建 V2 代码、读取网络或修改 `ana-dev`。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`8` - 当前不得创建 V2 代码、测试或 fixture,不得修改 `ana-dev`,也不得开始真实网络 smoke。开发方应一次闭环 F1—F8 后提交 V003 限定复审;已通过的无 judgment、16 节报告、A1/as-of、4/3 forecast gap 与范围排除项不得回退。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-REREVIEW-20260801-001 - 记录时间:`2026-08-01T23:40:10+08:00` - 审核阶段:前序 `HOLD/8` 后仅复审 F1—F8 的限定方案复审。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-DESIGN-V003-20260801-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序审计:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-20260801-001=HOLD/8`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 复审方案:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-V003.md`=`28030 bytes / 358C37EE1FE7F5F832FAF33EBDEB1B1714DE46F315A55A1C1D53AF43D687C61F`,与交接快照一致;strict UTF-8=`PASS`,尾随空白=`0`。 - 管理闭环:已只读核对 `HANDOFF-INFOADMIN-INFODEV2-STOCK-VALUATION-V2-TAKEOVER-LEDGER-CLOSE-TERMINAL-20260801-001` 及总纲第 710—721 行、计划第 803—813 行、问题记录第 362—369 行。 - 外部动作:V2 代码/测试/fixture 目录均不存在;`ana-dev` 修改=`0`;真实网络=`0`。本轮只运行既有 V1 只读回归命令的 `-B` 变体,`10/10 PASS / 0.208 s`,未产生字节码。 ### Findings #### F5-R1 — BLOCKING / 原 F5 未完全闭环:动态字段“未过期”仍是未定义判断,无法安全决定局部刷新失败后的复用 - V003 第 151—155 行已正确分离 raw archive 与 reusable index,冻结负缓存、baseline schema/hash/as-of 和并发提交;但第 155 行允许局部刷新失败时保留“未过期”的旧动态字段,却没有按 `price/shares/cash-debt/corporate-action/forecast` 定义 freshness predicate、最长允许年龄或必须成功完成的增量检查。 - 该缺口会让实现者自行决定旧价格、股本或预测是否仍可作为核心输入;只满足 `field_date<=requested_as_of` 并不能证明它是 requested as-of 的最近有效时点。相同 as-of 并发结果又只写“按 data_hash 字典序作幂等选择”,未冻结取最小还是最大,`current.json` 仍可能因实现选择不同而漂移。 - 这是前序 F5 对“局部刷新失败和新旧 as-of 选择规则”的同一未闭环分支,不是新增缓存功能要求。 最小 required fixes: 1. 在后继方案用一张小表为每种动态 data kind 冻结可执行 freshness predicate:需要哪些日期/成功增量检查、允许复用到哪个 requested as-of、失败时是核心阻断还是非核心 gap;核心价格/股本不得仅凭“日期不晚于 as-of”沿用旧基线。 2. 明确相同 as-of 并发 data_hash 的唯一选择方向(例如 ordinal min 或 max)及 current 更新条件;对应局部刷新失败与双提交测试直接断言选中的 baseline/data hash。 #### F7-R1 — BLOCKING / 原 F7 未完全闭环:stdout、正式产物和 task-start 三处权威合同仍不自洽 - V003 第 177 行冻结的 stdout schema 不含 `receipt_sha256`、`receipt_bytes`,第 205 行却要求两者写 stdout;`BLOCKED/FAILED` 明确无 manifest/receipt,但 stdout 的 `manifest_path/receipt_path` 未冻结为 `null`,消费者无法按同一 schema 解析所有终态。 - 第 179—185 行仍用“data snapshot、16 节报告、QA、gaps、sources、runtime、manifest”等类别描述正式目录,没有给出前序 required fix 要求的精确文件名;只有 `data_snapshot.json`、`snapshot_build_report.json`、`valuation_snapshot.json`、`valuation_results.json` 和失败包三件套在其他章节可定位,正式报告、QA、gap、source、manifest 的公共路径仍需实现时猜测。 - 第 258—265 行把两次真实 smoke 的 `--task-start` 固定为 `2026-08-01T00:00:00+08:00`。只读原生任务证据显示上游用户“按照这个思路去做”turn 起点为 `2026-08-01T21:20:48+08:00`,日常开发接管 turn 起点为 `21:54:15+08:00`;午夜值不对应任一任务起点,会使本事项要求的 user-task wall 成为人为放大的名义值。 - 这是前序 F7 对“可消费状态矩阵与权威 task/process wall”的同一闭环,不扩展 telemetry 范围。 最小 required fixes: 1. 统一 stdout schema 与 receipt:增加 `receipt_sha256/receipt_bytes`,并按状态冻结 `manifest_path/receipt_path/receipt_*` 的 string/null 规则;正常 stdout 的最终 wall 必须逐值复制已绑定 manifest 的 receipt,失败状态不得伪造 receipt。 2. 给状态矩阵中的正式类别各指定一个精确相对文件名,至少覆盖 16 节报告、QA、gaps、sources、runtime log/metrics 和 run manifest;各状态的必有/禁止项直接引用这些名称。 3. 两条 smoke 命令使用有原生证据的实际 task-start(并登记来源 turn),或省略参数而明确此次只能验 process wall;不得用任意午夜常量冒充用户任务起点。 #### F8-R1 — BLOCKING / 原 F8 未完全闭环:冻结的长城 V1 fixture 路径不存在 - V003 第 248 行写 `dev/ana-dev/test/stock_valuation_pipeline/fixtures/greatwall_example.json`,只读检查 `Test-Path=False`。 - 同一行给出的 `7142 bytes / 06AB6A7C45C2E43F71654C616F15A826B21E468C4BA72AFB0B253C9DD89FACD8` 实际对应 `dev/ana-dev/test/stock_valuation_pipeline/fixtures/great_wall_military_20260731.json`。冻结 hash 正确、路径错误;按当前 V003 执行直接 V1 与 V2 bridge 比较会在读取输入前失败,或诱使实现者创建一个不应存在的 alias。 - 既有 V1 测试入口的只读 `-B` 运行已证明 `10/10 PASS`,因此这里只需修正验收前像路径,不要求改 V1、复制 fixture 或增加测试范围。 最小 required fix: 1. 后继方案仅把第 248 行 fixture 路径改为现存的 `dev/ana-dev/test/stock_valuation_pipeline/fixtures/great_wall_military_20260731.json`,保留既有 bytes/hash、V1 10/10 和 direct-vs-bridge 比较合同;禁止创建 alias 或修改 `ana-dev`。 ### F1—F8 闭环状态 - F1=`CLOSED`:管理员三本 append-only 账、唯一 owner/reviewer/project 落点、旧 ana 会话关闭及条件单文件授权均已核实。 - F2=`CLOSED`:V1 路径、版本、四项哈希、registry、函数签名和 0/2/3 映射均与只读实物一致。 - F3=`CLOSED`:首期登记 provider、allowlist/endpoint/字段/日期/单位/fixture/停止顺序已冻结;运行时自由换站仍禁止。 - F4=`CLOSED`:唯一 monotonic deadline、remaining 裁剪、协作返回、91 秒上限、telemetry 与四 worker 阻塞测试已冻结。 - F5=`PARTIAL / F5-R1 OPEN`。 - F6=`CLOSED`:absent/force 状态机、BaseException、恢复真值、receipt 失败和全点注入已冻结。 - F7=`PARTIAL / F7-R1 OPEN`。 - F8=`PARTIAL / F8-R1 OPEN`。 ### 已通过且继续冻结的合同 - 无 judgment=`DATA_READY_NEEDS_JUDGMENT`,不生成伪 V1 snapshot/results 或方向性结论;judgment 不得覆盖价格、股本、法定财务、日期和 A1 身份。 - 16 节顺序、A1 回链、publish/data 双日期 as-of、forecast 汇总 4/明细 3 只一个 gap、V1 单一数值源、交易指令禁令均未回退。 - project 落点、`ana-dev` 只读、无第二套估值核心,以及 GUI/API/数据库/服务/批处理/付费登录来源/V1 公式修改等排除项未回退。 ### Open questions - 无。三项均为 V003 现有 F5/F7/F8 合同的局部确定性修正,可一次写入 V004;不需要创建代码、测试、fixture,修改 `ana-dev` 或运行真实网络。 ### 结论 - 审计状态:`HOLD` - 剩余阻断问题数:`3` - 当前仍不得进入实现。开发方只需一次闭环 `F5-R1 / F7-R1 / F8-R1` 并提交 V004 限定复审;F1—F4、F6 及所有已通过业务合同不得再改,且无需联网或运行新增测试。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-V004-REREVIEW-20260801-001 - 记录时间:`2026-08-01T23:57:01+08:00` - 审核阶段:V003 `HOLD/3` 后仅复审 `F5-R1 / F7-R1 / F8-R1` 的限定方案复审。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-DESIGN-V004-20260801-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序审计:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-REREVIEW-20260801-001=HOLD/3`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 组合方案基线:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-V003.md`=`28030 bytes / 358C37EE1FE7F5F832FAF33EBDEB1B1714DE46F315A55A1C1D53AF43D687C61F`。 - 限定修订:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-V004.md`=`12117 bytes / 50DE1F7E765E8B828DEF1C25D6D5BEA32C3C0B07FD034929542AAE0CB4E84799`,与交接快照一致;strict UTF-8=`PASS`;尾随空白=`0`。 - 外部动作:V2 代码目录和测试目录均不存在;本轮只读核对方案、账本、原生任务时间与既有 V1 fixture,未创建代码、测试或 fixture,未修改 `ana-dev`,未运行真实网络。 ### Findings - 无剩余阻断。V004 仅替换 V003 第 9、13、15、18、20 节中与三个开放 finding 对应的局部合同,未重开或回退 F1—F4、F6。 ### F5-R1 复审 - `CLOSED`。V004 第 22—57 行为每个可复用字段组冻结统一 freshness 输入、固定 `process_start` 判断时刻、`FRESH|STALE|MISSING` 三态,以及逐 `data_kind` 的 TTL、水位、刷新动作、核心阻断/非核心 gap 和停止规则。 - `STALE` 只保留诊断原始 blob,禁止进入正式字段;核心行情、股本和财务不得靠陈旧值降级,forecast 两个登记来源后以唯一 gap 停止。 - 同一 requested as-of 的候选选择固定为:最大 `baseline_as_of`,再取最大规范 watermark,最后取 64 位小写十六进制 `data_hash` 的 ASCII 字典序最大值;`current.json` 使用同一比较,且相反插入顺序测试必须得到同一结果。 - 结论:前序关于动态字段“未过期”语义和 data hash 选择方向的歧义已消除,满足可实现、可重跑和可验收要求。 ### F7-R1 复审 - `CLOSED`。V004 第 61—82 行冻结成功包、失败包和同级外部 receipt 的精确相对文件名及各终态必有/禁止集合;`manifest.json` 仍为包内最后写入文件,失败终态不得创建 manifest/receipt。 - 第 84—124 行冻结 ticker 模式六类终态的 stdout exact-key schema、JSON `null` 规则、exit/status 字段值和 manifest/receipt 路径、hash、bytes、双墙钟逐值关系;receipt 不自引用本体 hash/bytes,消费者不再需要猜测缺失字段。 - 第 126—139 行把真实 smoke 的 task-start 回链到 Codex task `019fb338-fe89-7d52-9ba6-513e82de54d8` / turn `019fbd7c-00c5-7962-8a80-3206ca5a58d9`。只读原生任务核对 `startedAt=1785590448`,对应 `2026-08-01T21:20:48+08:00`;两条 smoke 命令和 task/process 双墙钟不等式均使用该实际起点。 - 结论:前序 stdout/receipt 冲突、正式产物文件名缺失和任意午夜 task-start 三项不自洽均已闭环。 ### F8-R1 复审 - `CLOSED`。V004 第 141—147 行废止不存在的 `greatwall_example.json`,禁止创建 alias,并把 V1 与 bridge 的全部比较入口统一为 `dev/ana-dev/test/stock_valuation_pipeline/fixtures/great_wall_military_20260731.json`。 - 只读实物核对:实际文件存在,`7142 bytes / 06AB6A7C45C2E43F71654C616F15A826B21E468C4BA72AFB0B253C9DD89FACD8`;不存在旧 alias。路径、字节数和哈希与 V004 完全一致。 ### 已通过且继续冻结的合同 - F1—F4、F6 保持 `CLOSED`:project 单一实施权属/V1 只读桥接、公开 provider registry、唯一 90 秒单调 deadline、BaseException 原子状态机均不得回退。 - 无 judgment=`DATA_READY_NEEDS_JUDGMENT`,不得伪造 V1 snapshot/results 或方向性结论;judgment 不得覆盖价格、股本、法定财务、日期和 A1 身份。 - 16 节报告、A1 与 publish/data 双日期 as-of、forecast 汇总 4/明细 3 只形成一个 gap、V1 单一数值源、无交易指令保持冻结。 - project 级落点、`ana-dev` 只读、无第二套估值核心,以及 GUI/API/数据库/服务/批处理/付费登录来源/V1 公式修改等排除项保持冻结。 ### Open questions - 无。 ### 结论 - 审计状态:`PASS` - 剩余阻断问题数:`0` - `F5-R1 / F7-R1 / F8-R1` 全部关闭;结合前序已关闭的 F1—F4、F6,V003+V004 组合方案可作为唯一实施合同。 - 允许 `dev.developer.project.secondary / infodev-2` 按 V003+V004 开始创建 V2 代码、测试和项目级 fixture,并按冻结顺序完成离线测试、fixture 性能、受控真实网络 smoke、文档和实现独立审核。`ana-dev` 继续只读;本 PASS 不授权扩大 GUI/API/数据库/服务/批处理、付费登录来源或修改 V1 公式。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-V005-PROVIDER-DELTA-20260802-001 - 记录时间:`2026-08-02T00:44:29+08:00` - 审核阶段:V003+V004 方案 PASS 后,首次真实 smoke 触发的两请求限定 provider delta 方案审核。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-DESIGN-V005-20260802-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序方案结论:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-V004-REREVIEW-20260801-001=PASS/0`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 限定修订:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-V005.md`=`4028 bytes / B4ABD0456BFA0C219C8C2A7A2A92CBE8B40804901A984A69B941A92F87571B6D`,与交接快照一致;strict UTF-8=`PASS`;尾随空白=`0`。 - 继承基线:V003=`28030 bytes / 358C37EE1FE7F5F832FAF33EBDEB1B1714DE46F315A55A1C1D53AF43D687C61F`;V004=`12117 bytes / 50DE1F7E765E8B828DEF1C25D6D5BEA32C3C0B07FD034929542AAE0CB4E84799`。 - 审核动作:只读核对 V005、当前 provider/registry/test/fixture、失败包和原始 blob;未联网、未运行 smoke、未修改实现/测试/fixture/`ana-dev`。 ### 触发证据核验 - 首次真实 smoke 失败包 `dev/tmp/valuation-v2-real-smoke-001/cold.failed-b036e888ea644a1db66df5d967ffa26f/` 存在;`failure.json` 为 `BLOCKED / E_CORE_INPUT / 缺少非经营性金融资产组成字段`,`runtime_metrics.json` 记录 process wall=`1.4540000000270084 s`、task-start=`2026-08-01T21:20:48+08:00`,没有伪装成功。 - 简版 balance 原始 blob 可复算为 `30407 bytes / 819144DA9256200C0FEEB1B03BB2E3715B08827817EC58871C7761CA5DD60F81`;2026-03-31 行含 `MONETARYFUNDS/TOTAL_EQUITY/TOTAL_ASSETS/TOTAL_LIABILITIES`,但确实不含 `TRADE_FINASSET_NOTFVTPL/NONCURRENT_LIAB_1YEAR/LEASE_LIAB`。 - 当前实现仍使用 `RPT_DMSK_FN_BALANCE` 和 `beg=end=as_of`;当前 fixture 仍为前序聚合字段前像。V005 请求/fixture 变更尚未激活,符合 delta PASS 前门禁。 ### Findings #### F1 — BLOCKING / 数据合同:字段集合只以“任一字段存在”为成功条件,仍会把部分 schema 漂移静默计为 0 - V005 第 32—33 行对金融资产和有息债务都规定:列举字段中“一个字段都不存在”才 `BLOCKED`,只对实际存在字段求和;存在字段为 `null` 可按 0。这样只要响应保留任意一个候选键,即使其余可能承载非零金额的键因 schema 漂移被删除,也会继续求和并把缺失组成隐式当 0。 - 第 31 行的 `MINORITY_EQUITY|null→0` 同样没有区分“键明确存在且值为 null”和“键完全缺失”。这与本次真实 smoke 已证明的根因相同:摘要/漂移响应可能保留部分资产负债字段,但不能据此证明缺失明细为零。 - 第 43 行测试只覆盖“全部明细字段存在但均为 null”和“所有字段都不存在”,没有覆盖只缺一个或只保留一个字段的 partial-schema 情况;当前合同仍可能低估非经营性金融资产、有息债务或少数股东权益,进而污染估值输入。 最小 required fixes: 1. 在后继限定修订中,为 `RPT_F10_FINANCE_GBALANCE` 冻结可执行的 schema 完整性规则:明确每个经济组成是独立可加字段还是互斥 alias 组;每个必需组成/alias 组都必须在响应中有键,缺任何必需键即 `BLOCKED`。只有通过该键集合校验后,显式 `null` 才可按法定表无该项目计 0。 2. `MINORITY_EQUITY` 也必须区分 absent 与 explicit null:absent=`BLOCKED`,键存在且 null 才为 0。 3. 增加 partial-schema 反例(至少金融资产缺一个组成键、债务缺一个组成键、`MINORITY_EQUITY` 缺键)及 alias 双存在用例;断言缺键阻断、互斥 alias 不重复求和、完整键集合精确得到 `95338761.64 / 825466.20`。不需要新增 host/provider 或联网复跑。 ### 已通过的 delta 部分 - balance reportName 从 `RPT_DMSK_FN_BALANCE` 替换为同一登记 host 上的 `RPT_F10_FINANCE_GBALANCE`,保持 HTTPS/GET/filter/分页/排序/响应上限、B1+A1/as-of/预算与停止规则,方向合理;本 HOLD 不要求新增来源或 fallback。 - K 线 `beg=as_of-14 calendar days / end=as_of`、仅保留 `f51<=as-of` 并取最大日期、空窗口 `BLOCKED`,正确实现既有“取不晚于 as-of 的最近交易日”合同,`PASSED_AND_FROZEN`。 - 首次真实失败证据、不得以 0 掩盖缺失值、V003+V004 其余合同和 `ana-dev` 只读边界继续冻结。 ### Open questions - 无。唯一阻断可由字段键集合/alias 组合同和离线 partial-schema 测试闭环,不要求新网络来源或真实 smoke。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`1` - V005 provider delta 当前不得实施。开发方只需提交关闭 F1 的后继限定修订;K 线窗口和同 host 完整 balance 端点选择已经通过,不得回退。PASS 后再实施并按原计划重跑全套离线、fixture cold/warm 和真实 cold/warm smoke。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-V006-BALANCE-SCHEMA-REREVIEW-20260802-001 - 记录时间:`2026-08-02T01:18:41+08:00` - 审核阶段:V005 provider delta `HOLD/1` 后,仅复审 balance schema-completeness F1 的限定方案复审。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-DESIGN-V006-20260802-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序审计:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-V005-PROVIDER-DELTA-20260802-001=HOLD/1`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 复审方案:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-V006.md`=`3278 bytes / 0A997EFB1D8237EB4102E7BAD71BDADE7F0BD2C1178DDAC9F74117254E3FD209`,与交接快照一致;strict UTF-8=`PASS`;尾随空白=`0`。 - 继承方案:V005=`4028 bytes / B4ABD0456BFA0C219C8C2A7A2A92CBE8B40804901A984A69B941A92F87571B6D`;V003+V004 及 V005 已通过端点/K 线条款继续冻结。 - 审核动作:只读核对 V006、V005 F1 和当前 provider 实现;当前实现仍为 `RPT_DMSK_FN_BALANCE` 与 `beg=end=as_of`,证明 provider delta 尚未激活。本轮未联网、未运行 smoke、未修改实现/测试/fixture/`ana-dev`。 ### Findings - 无剩余阻断。 ### F1 闭环核验 - `CLOSED`。V006 第 13—20 行把非经营性金融资产冻结为一个完整互斥 alias 组和两个独立组成;全部键均为 schema 必需键,缺任一键即 `E_BALANCE_SCHEMA_DRIFT/BLOCKED`,只有完整性校验通过后 explicit null 才能计 0。 - alias 组 0/1/多非 null 的行为确定:全 null=0;单值采用;多值只有数值完全相等才计一次,不等即 `E_BALANCE_ALIAS_CONFLICT/BLOCKED`,消除了重复求和或漂移字段被静默忽略的风险。 - 经济口径明确排除长期战略性 `OTHER_EQUITY_INVEST`、债权投资和其他非流动金融资产,不把它们自动当现金等价物抵减企业价值;冻结完整响应仍精确得到 `non_operating_financial_assets=95338761.64`,没有扩大 V1 数值口径。 - 第 24—30 行要求六个债务键全部存在,缺任一键即 schema drift;完整后 explicit null=0、非 null 必须非负,精确债务=`825466.20`。 - 第 32—34 行明确 `MINORITY_EQUITY` absent=`BLOCKED`、present null=0、数值必须非负,不再由 `dict.get(...,0)` 混淆 absent/null。 - 第 36—44 行要求逐一删除每个金融资产、债务和 minority 必需键的反例,并覆盖 alias 相等/不等、全 null 与冻结精确总额;测试合同已覆盖前序 required fixes 的全部分支。 ### 已通过且继续冻结的合同 - V005 已通过的同 host `RPT_F10_FINANCE_GBALANCE` 端点选择和 K 线 14 日窗口保持 `PASSED_AND_FROZEN`;不新增 provider、域名、fallback 或网络预算。 - 首次真实失败证据、不得把缺失字段填 0、V003+V004 全部通过合同、project 落点和 `ana-dev` 只读边界均未回退。 - 本 PASS 只授权实施 V005+V006 provider delta;不替代后续离线、fixture、真实 cold/warm smoke 和最终实现独立审核。 ### Open questions - 无。 ### 结论 - 审计状态:`PASS` - 剩余阻断问题数:`0` - V005 F1 已由 V006 完整关闭。允许 `dev.developer.project.secondary / infodev-2` 按 V003+V004+V005+V006 组合合同实施 balance 端点/schema 与 K 线窗口变更,随后完成全套离线测试、V1 10/10、fixture cold/warm、真实 cold/warm smoke、文档和最终实现独立审核。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-IMPLEMENTATION-20260802-001 - 记录时间:`2026-08-02T02:11:28+08:00` - 审核阶段:V003+V004+V005+V006 组合合同下的完整实现、离线测试、project fixture、fixture cold/warm、真实 cold/warm smoke、工具文档与证据链独立审核。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-IMPLEMENTATION-REVIEW-20260802-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序方案结论:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-V006-BALANCE-SCHEMA-REREVIEW-20260802-001=PASS/0`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 审核边界:仅审核 project 级 V2 实现、测试、fixture、既有 smoke 证据和配套文档;`dev/ana-dev/` 全程只读;本轮未联网、未重跑真实 smoke、未修改实现/测试/fixture/输出或原操作手册。 ### 冻结快照与独立验证 - 交接声明的 12 个冻结工件均逐文件复算并匹配字节数/SHA-256:`workflow.py`、`providers.py`、`http_client.py`、`cache.py`、`v1_bridge.py`、`provider_registry.json`、`test_pipeline_v2.py`、project fixture manifest、工具文档、实现与验收证据、目录导读和接管 worklog;实现与测试/fixture 共 34 个非 `pyc` 文件纳入只读快照。 - V1 六个冻结文件与 V003/V004 记录的路径、字节数和 SHA-256 一致,`ana-dev` 未被本任务修改;V2 没有复制第二套 V1 估值公式。 - 审核员独立运行:V2 unittest=`24/24 PASS`(`5.679 s`);V1 readonly unittest=`10/10 PASS`(`0.180 s`);`compileall=PASS`;CLI help=`PASS`;治理校验=`OK / projects=1 / warnings=0`。 - 既有 fixture cold/warm/judgment 与 real cold/warm 的 manifest/receipt 哈希、manifest 内文件字节数与 SHA-256、成功包文件数和 task/process 双墙钟不等式内部一致;real cold=`6E905229...E0F0F6 / D5F9488F...B20B48`,real warm=`0DFFD45E...FEDD5D / 984B2566...FB0275`。 - 已通过并继续冻结:V1 bridge 的路径/哈希/直接与桥接单一数值源、V1 `10/10`;V006 balance 必需键/alias 完整性与精确总额 `95338761.64 / 825466.20`;16 节外形、无交易指令、现有工件哈希链及早期 `BLOCKED` 证据保留。上述通过项不抵消下列合同级阻断。 ### Findings #### F1 — BLOCKING / 历史 as-of 数据合同被伪满足,现有真实成功 smoke 不可作为正确性证据 - `providers.py:224-249` 对 K 线先过滤 `f51<=as_of`,但随后取 `eligible[-1]`,没有按冻结合同取最大 `f51`;审核员用乱序离线响应复核时错误选择了 `2026-07-31`,尽管响应中存在 `2026-08-01`。 - 同一实现直接采用实时 quote 的 `f84/f116`,未校验 `f124` 的数据日期,却把股本日期回填为所选历史交易日。既有 real cold quote 原始响应 `7963180...` 的 `f124=0`,因此不能证明请求日 `2026-07-31` 的历史股本/市值;按 V004 必须 `BLOCKED`,不得输出 `DATA_READY_NEEDS_JUDGMENT`。 - `providers.py:136-145` 把公告截止日的“本地日终”构造成 UTC 日终,实际可放入上海时区次日 `07:59:59` 前的信息;forecast `providers.py:470-536` 未按响应自身 `REPORT_DATE/UPDATE_DATE` 做 `<=as_of` 过滤,且在原始响应缺少这些日期时把 `publish_date/period_end` 伪造为 `as_of`。 最小 required fixes: 1. K 线在解析合法日期后按 `f51` 取不晚于 as-of 的最大日期,并补乱序、周末、空窗口、未来行反例。 2. 严格执行 V004 shares/market-cap freshness:只有 quote 的可证明本地数据日等于 requested as-of 才可直接采用;历史请求只能使用在该 as-of 合法取得并留痕的基线,否则核心输入 `BLOCKED`,不得把实时值回填到历史日期。 3. 公告使用 `Asia/Shanghai` requested-as-of 日终比较;forecast 必须从真实响应字段建立 publish/data 日期并过滤,缺失必要日期时形成阻断或既定非核心 gap,禁止以 requested as-of 代填来源日期。 #### F2 — BLOCKING / 核心字段血缘、A1 回链和自动 QA 仅有 provider 级外形,没有落实字段级证明 - finance provider 没有生成其核心财务字段使用的 `sources`;既有 real `snapshot_build_report.json` 中 `field_lineage.finance.source_ids=[]`,却仍通过构建和 QA。构建器只检查“任意 A1 source 含同报告期”,没有证明每个法定财务值实际来自哪一份 A1 原文及对应 raw hash。 - `snapshot_builder.py:89-92` 对缺失 `publish_date/period_end` 使用 requested as-of 兜底,未知日期因而会被判定安全;这与“不知道即不能证明 as-of safe”的冻结合同相反。 - `report_qa.py:16-55` 只检查 16 个标题、少量禁词、一个布尔位、存在任意 raw hash 和两个 V1 数值;未校验每个核心字段的 source_id→A1→raw hash 回链、全量数值一致性、表格/围栏/本地链接、受保护字段和 manifest。工具文档/证据文档关于“全部核心字段已回链且全部日期安全”的表述与实物不符。 最小 required fixes: 1. 生成可机读的字段级 lineage;价格、股本、法定财务、balance、日期与 A1 身份逐字段绑定 provider/source_id/raw hash/publish date/data date,财务字段必须回链到对应报告期的 A1 原文。 2. 缺失必要 publish/data 日期、source_id 或 raw hash 必须拒绝正式值;不得用 requested as-of 兜底。 3. 将 V003 自动 QA 清单落实为可执行校验和正反测试,并按真实能力纠正工具文档、证据文档与报告文字。 #### F3 — BLOCKING / 公司基线与 FRESH/STALE/MISSING 状态机未实现,warm 只复用了请求缓存 - `cache.py` 只有请求级 `load_reusable/store/promote_reusable` 和只写 `write_baseline`;workflow 每次仍调用全部 provider,未按 data-kind 读取/选择公司基线,也没有逐类 TTL/watermark/freshness、核心 stale 禁止入正式值、非核心 gap、局部刷新/停止规则。 - 既有 baseline 缺少冻结合同要求的逐 data-kind 数据日期、发布日期、fetched/expires、schema/as-of/semantic 状态等输入;`write_baseline` 对 `current.json` 的读-比-写无 ticker 锁,存在并发 TOCTOU,测试仅顺序写入,未覆盖逆序与并发确定性。 - 请求 fingerprint 未纳入冻结 headers,body 未按 content type 规范化,query 结构也不能充分保留重复值;工具文档却宣称已包含 headers。 最小 required fixes: 1. 实现 V004 的逐 data-kind 基线载入、共同 freshness predicate、确定性候选选择、FRESH/STALE/MISSING 行为、核心/非核心分流与 ticker 级并发安全 current 更新。 2. 实现冻结的 canonical fingerprint preimage、raw 与 reusable 索引、PENDING_PARSE→确认可复用、negative TTL,并补每个 data-kind 的 fresh/stale/missing、逆序、并发、篡改和 partial-write 测试。 3. fixture warm 必须证明公司基线语义复用,而不只是同一请求 blob cache 命中。 #### F4 — BLOCKING / provider allowlist 与单调 90 秒截止不能阻止越界请求或超时后后台写入 - `http_client.py:74-82` 只校验 provider/version、HTTPS host 和 method,未校验冻结 endpoint/path/query/reportName、响应 content type 和 provider 独立响应上限;读取统一允许 `20 MiB`。 - retry backoff 睡眠后不重新校验 remaining,且 timeout 下限强制 `0.05 s`;阻塞 read 继续沿用请求开始时的 socket timeout,不能保证 deadline+1 秒内退出。`acquisition.py:85` 使用 `shutdown(wait=False)`,截止后仍运行的任务可能继续写 cache。 - 现有“四 worker”测试只是合作式 stub 轮询 remaining,未覆盖真实 HttpClient 的阻塞 read/backoff、截止后 request count=0、无后台写入等合同。 最小 required fixes: 1. 按 registry 精确校验 host+path+method+固定 query/reportName、content type 与逐 provider 响应上限,拒绝重定向及所有未登记变体。 2. 让所有 retry、open、read 和 worker 收束于同一 monotonic deadline;睡眠后先复核,不得在剩余时间耗尽后创建请求,截止返回后不得再产生正式 cache/baseline 写入。 3. 增加可控阻塞 transport 测试,证明 task 内/外双墙钟、deadline+1 秒上界、request count 和无后台副作用。 #### F5 — BLOCKING / 路径预检与 force 原子提交状态机违反冻结 BaseException 合同 - `workflow.py:207-215` 在 `lstat`/reparse 检查前调用 `Path.resolve()`,会先消解词法 symlink/junction 身份;同时未逐级验证父链 reparse,不能证明输出/cache/fixture 落点安全。 - `workflow.py:381-406` 把备份清理失败纳入通用异常路径,继而删除新成功输出并恢复旧输出。审核员离线 fault probe 在 `cleanup_backup` 注入失败时得到 `exit=5` 且旧输出被恢复;冻结合同要求新输出/receipt 保持成功,备份保留并仅记 warning。 - rollback 再失败仅通过 `add_note` 附着,failure package/终端摘要不能可靠保留主异常和回滚异常双证据;`commit_finished` 在 receipt 写入/fsync 之前采集,声称的 final double-wall 没有覆盖实际 receipt commit。 - 现有 KeyboardInterrupt 仅覆盖一个注入点,没有逐点覆盖 SystemExit、receipt、cleanup 和 rollback 双失败。 最小 required fixes: 1. 在任何 resolve/mkdir/写入前对词法路径及父链执行 `lstat`/reparse 校验,之后再形成规范绝对路径;拒绝 symlink/junction/reparse 和类型冲突。 2. 按 V003/V004 重写 absent/force BaseException 状态机:备份清理失败保持新成功并报告 warning;提交失败回滚旧输出/receipt;主异常原样重抛或映射且双异常进入 failure evidence。 3. final receipt/summary 的 commit_finished 与 task/process wall 必须覆盖 receipt 的实际原子写入和持久化;补齐每个冻结故障点的 Exception/KeyboardInterrupt/SystemExit 与 rollback/cleanup 组合测试。 #### F6 — BLOCKING / 终态矩阵、离线测试与实现证据对未实现能力作了过度声明 - 无 judgment 时只有 forecast coverage gap;当 fixture 为 3/3 时可得到 `DATA_READY_NEEDS_JUDGMENT` 但 `gap_count=0`,违反 V004 要求的强制人工判断 gap。 - CLI parser 级输入错误仍走 argparse 的 stderr/SystemExit,不是冻结的单行 canonical JSON stdout `INPUT_ERROR` 合同。 - 24 个 V2 测试没有覆盖六种终态 exact stdout/file matrix、BLOCKED/FAILED 文件集、每类 baseline freshness、provider 4xx/5xx/空/schema/future、全部 force 故障点、cleanup/rollback 双失败及 V1 bridge success/reuse/force/input byte equivalence;所谓 future-source 测试没有调用 builder,属于空断言。 - 因 F1-F5,现有 real cold/warm 虽然工件内部哈希一致,但其 `DATA_READY_NEEDS_JUDGMENT` 正确性结论无效;实现与验收证据文档对覆盖面和 as-of/A1 成功作了过度声明。 最小 required fixes: 1. 无 judgment 终态始终加入独立 judgment gap;统一 parser 级和运行级六终态的 exact exit/stdout/artifact/receipt 合同。 2. 补齐 V003+V004+V005+V006 已冻结测试矩阵,删除或改成真正执行被测入口的空测试;独立重跑 V2、V1、fixture cold/warm/judgment。 3. 修复后在新隔离目录运行一组真实 cold+warm,保留旧 smoke 不覆盖。若冻结公开来源不能证明 requested as-of 的历史股本,正确结果应是诚实 `BLOCKED`,不得伪造成功或擅自新增 provider;真实来源变化如需新口径,先提交限定方案 delta。同步纠正工具文档、实现证据和有权限的正式执行日志。 ### 操作手册条件授权 - 当前结论为 `HOLD`,管理员的条件单文件授权尚未满足;不得同步 `outputs/20260730_stock_valuation_guide/股票价格合理性评估操作手册_v1.0.md`,也不得修改该目录其他文件。 - F1-F6 全部关闭并取得实现复审 `PASS` 后,可按管理员既有条件授权只同步上述一个操作手册文件;同步完成后必须提交一次“操作手册单文件限定确认”,只核对该文件与已通过实现/工具文档的一致性和变更边界,无需为该限定确认重跑网络或真实 smoke。 ### Open questions - 无。六组问题均可由组合合同内的代码、离线测试、文档修正和一次新的受控 real cold/warm 闭环;不授权新增 provider、修改 V1 公式或改动 `ana-dev`。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`6` - 当前实现与既有真实成功证据不得交最终交付或同步原操作手册。开发方应仅按 F1-F6 的最小 required fixes 修复,保持已通过的 V1/V006/工件哈希链边界,完成离线矩阵和一组新隔离 real cold/warm 后提交一次完整实现复审。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-IMPLEMENTATION-HOLD6-REREVIEW-20260802-001 - 记录时间:`2026-08-02T04:36:44+08:00` - 审核阶段:首次实现 `HOLD/6` 后,对 F1—F6 修复、最终代码/测试、fixture 与既有真实证据的完整限定复审。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-IMPLEMENTATION-HOLD6-REREVIEW-20260802-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序实现审计:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-IMPLEMENTATION-20260802-001=HOLD/6`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 审核边界:只复核前序 F1—F6 及更正后的测试、文档和证据;V003+V004+V005+V006 继续冻结,`dev/ana-dev/` 只读。本轮未联网、未运行真实 smoke、未修改实现/测试/fixture/输出或操作手册。 ### 冻结快照与独立验证 - 四份设计以及交接列明的实现、测试、fixture、工具文档、证据文档、目录导读、执行日志、worklog、操作手册均逐文件复算,字节数和 SHA-256 全部匹配交接快照;操作手册仍为 `68700 bytes / CCF534DB38F29AFCC61E55FAA47C06829E69E504BDE5CEFF771B10A9AF5AB6E6`,未进入本轮审核。 - 审核员独立运行:V2 unittest=`46/46 PASS`(`20.611 s`);V1 readonly unittest=`10/10 PASS`(`0.139 s`);`compileall=PASS`;CLI help=`PASS`。这些结果证明现有断言全绿,但不能替代下列冻结合同反例。 - 既有 fixture `valuation-v2-fixture-acceptance-003` 三态的 manifest/receipt、文件哈希、16 节、23 条核心 lineage、V1 数值及 cold/warm 请求计数均复算一致;既有 real `valuation-v2-real-smoke-006` 两次均诚实 `BLOCKED/E_HISTORICAL_SHARES_UNPROVEN`,各有 10 条 telemetry/raw,且无 OUT/manifest/receipt/current/market reusable。无需为本次复审重新访问真实来源。 - F1 的 K 线最大合法日期、`f124`/历史股本阻断、上海时区公告截止及 forecast 真实日期合同已闭环;真实 smoke 的诚实 BLOCKED 也与冻结合同一致。F1 状态为 `CLOSED`。 ### Findings #### F2-R1 — BLOCKING / “23 条核心血缘”仍未证明财务值与对应报告期 A1 一致 - `snapshot_builder.py:129-160` 只选取 annual A1 与 current A1;除 annual 外的所有财务路径都绑定 current A1。正式 fixture 中 `financials.prior_year_same_period.*` 的 `data_date=2025-03-31`、结构化来源为 `SRC-EM-FINANCE-*-20250331`,但 `a1_source_id=SRC-Q1-2026`、`a1_period_end=2026-03-31`。该 A1 source 的 `supports` 也不含 `financials.prior_year_same_period`。 - `test_29` 只断言 A1 ID/raw hash 出现在集合中,QA 也只校验存在性,因而上述期间错配仍得到 `QA PASS`。这不满足前序 F2 required fix 和 V003 第 7/11 节“财务字段回链对应/同报告期 A1”的硬门禁。 最小 required fixes: 1. 为 prior-year-same-period 每个核心字段绑定真正支持该比较期的 A1 证据;若采用 2026 Q1 报告中的同比列,必须从同一 A1/结构化记录的明确比较字段取值并记录可机读的比较期关系,不能把独立的 2025-03-31 行直接挂到 2026-03-31 A1。 2. QA 与正反测试逐字段断言 `data_date/A1 period/support/raw field` 的一致关系,加入当前 fixture 的期间错配反例;只检查 ID/hash 存在不足以放行。 #### F3-R1 — BLOCKING / data-kind 基线仍按 provider 全有或全无,局部刷新退回请求缓存 - `cache.py:fresh_provider_results` 只有当同一 provider 的所有 data-kind 都为 FRESH 时才复用整个 provider result;任一财务表 STALE/MISSING 就丢弃其余三个 FRESH 表的公司基线。 - 审核员离线反例:先形成合法公司基线,仅把 `finance_income` 设为 STALE,并移除 `eastmoney.finance` 的请求级 reusable index;第二次入口运行仍对 `finance_main/finance_income/finance_balance/finance_cashflow` 四个 reportName 全部执行 transport(`transport_count=4`),而冻结合同要求只请求缺项或陈旧 reportName。现有 warm=0 请求依赖整组 provider 或请求 cache,未证明逐 data-kind 公司基线语义复用。 最小 required fixes: 1. 从公司基线逐 data-kind 载入和合并 FRESH 值,只刷新 STALE/MISSING 表;刷新成功项独立提交,STALE 核心值不得进入正式结果。 2. 增加入口级 partial-refresh 测试:仅一个财务 data-kind STALE/MISSING、其请求索引不存在时只发生一个对应 transport,其余 FRESH 值来自公司基线;同时覆盖刷新失败和不更新 current 的合同。 #### F4-R1 — BLOCKING / HTTPError 响应体读取绕过唯一 monotonic deadline - `http_client.py:427-445` 的 `except urllib.error.HTTPError` 直接执行 `exc.read(max_bytes + 1)`;与正常 2xx 分块读取不同,它没有按 remaining 设置读超时、没有分块复核 deadline,也没有在读取中响应 cancel。 - 审核员离线慢 404 桩以 `deadline=0.5 s`、响应体 `read` 阻塞 `1.2 s` 复现:只创建 1 次请求,但 `fetch` 在 `1.453 s` 才以 `NetworkBudgetExceeded` 返回。即使后续拒绝归档,调用已越过共享截止及冻结容差;现有四 worker 测试只覆盖正常 response,不覆盖 HTTPError body。 最小 required fixes: 1. 让 HTTPError/4xx/5xx 响应体与正常响应共用分块读取、remaining socket timeout、大小上限和 cancel/deadline 检查;截止后不得重试、归档或提升 reusable。 2. 补慢 4xx 与慢 5xx(含 retry/backoff)离线 transport 测试,断言截止上界、请求计数和返回后 cache mutation 不增长。 #### F5-R1 — BLOCKING / final receipt 双墙钟仍早于实际最终持久化 - `workflow.py:457-487` 先写一次 provisional receipt,再在第二次最终 `atomic_write` 之前捕获 `commit_finished/task_wall/process_wall`;正式 receipt 与 stdout 虽逐值相等,但它们排除了第二次 receipt 写入及其持久化时间。 - 审核员在不改产物语义的离线桩中仅给第二次 receipt 写入增加 `0.25 s` 延迟,得到实际成功返回 `0.617 s`、receipt/summary `process_wall=0.359 s`,遗漏 `0.258 s`。因此前序 F5 required fix“权威 final wall 覆盖实际 receipt commit”尚未闭环。 最小 required fixes: 1. 重新定义并实现可验证的 receipt 完成协议,使 receipt 与 stdout 的权威终点确实不早于最终原子写入/持久化;若现有精确字段形成自引用时序,先提交只解决该时序的限定设计 delta,不得继续用写前时间冒充写后完成时间。 2. 用可控的最终写入延迟和写入/replace/fsync 失败桩证明:权威 wall 覆盖最终提交、receipt/summary/hash/bytes 一致,失败仍按 force 状态机恢复旧 output/receipt。 #### F6-R1 — BLOCKING / 46 个测试仍未覆盖已冻结的完整矩阵,证据文档继续过度声明 - `test_31` 只直接调用 `data_kind_state` 判断构造记录,没有对每个 data-kind 运行入口级 FRESH/STALE/MISSING、STALE 正式值排除、局部刷新/失败/current 行为;这也是 F3-R1 未被发现的原因。 - `test_42` 只对 `finance_income` 覆盖 404/500/schema/future,未落实 V003 第 6/19 节“每个 provider 成功/空/4xx/5xx/schema/future”的表驱动入口矩阵。 - `test_43` 的全点声明只包含无 judgment 的 staging writes、manifest 和一个 rename1 场景;未覆盖 judgment-only `valuation_snapshot.json/valuation_results.json`、每个 replace、第二阶段 receipt/最终 hash、restore/cleanup 组合,以及每个冻结点的 KeyboardInterrupt/SystemExit。`test_44` 也只比对 force 后三文件与无效输入返回码,没有完成 V1 无 force/复跑/force/输入错误的 stdout/stderr/0-2-3 与字节等价矩阵。 - 因此 `46/46 PASS` 不能支持工具/证据文档关于 F2—F5“完整合同已验证”的表述;当前发现均可由冻结范围内离线测试触达,无需新增 provider 或扩展产品范围。 最小 required fixes: 1. 按 V003+V004 已冻结 L1/L3 表补齐非空断言:每 provider 负 fixture、逐 data-kind 入口状态、全部提交故障点与非普通异常、六终态精确 stdout/文件/receipt、V1 直接与 bridge 四路径等价。 2. 让上述测试真正经过入口或被声明验证的 helper;修复 F2—F5 后重跑 V2/V1 及 fixture cold/warm/judgment,并把工具文档、实现证据和执行日志收敛到实际覆盖面。 ### 已关闭与保留结论 - F1=`CLOSED`;F2=`OPEN / F2-R1`;F3=`OPEN / F3-R1`;F4=`OPEN / F4-R1`;F5=`OPEN / F5-R1`;F6=`OPEN / F6-R1`。 - V1 只读 `10/10`、无第二套公式、V006 balance 完整键与精确总额、无 judgment 强制 gap、canonical argparse INPUT_ERROR、真实历史股本诚实 BLOCKED、16 节/无交易指令及既有 evidence 哈希链继续有效,不因本 HOLD 回退。 - 本轮问题均可先由代码与离线测试闭环;无需为这五项重复访问真实网络。若修复实际改变 real BLOCKED 路径,再由开发方在下次提交中明确说明证据等价性,不得擅自新增 provider 或伪造成功。 ### 操作手册条件授权 - 本轮结论为 HOLD,尚不满足管理员的条件单文件授权;不得同步 `outputs/20260730_stock_valuation_guide/股票价格合理性评估操作手册_v1.0.md`。 - 待 F2-R1—F6-R1 全部关闭并取得实现复审 PASS 后,才允许按既有管理员授权只同步该一个文件;同步完成后仍只需一次操作手册单文件限定确认,无需为该确认重跑网络或真实 smoke。 ### Open questions - 无。五个残余问题均已给出冻结范围内的可执行最小闭环;F5 若选择调整 receipt 自引用时序,唯一允许的范围扩展是先提交该点的限定设计 delta。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`5` - 当前实现不得交最终验收,不得同步操作手册。开发方只需关闭 F2-R1—F6-R1;F1 与其余已通过合同不得回退。完成后提交同一事项的完整限定实现复审。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-V007-RECEIPT-TIMING-DELTA-20260802-001 - 记录时间:`2026-08-02T04:49:57+08:00` - 审核阶段:实现复审 `F5-R1` receipt 自指时序阻断的单点限定方案审核;不是 F2/F3/F4/F6 实现复审。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-DESIGN-V007-20260802-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序结论:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-IMPLEMENTATION-HOLD6-REREVIEW-20260802-001=HOLD/5`;其中仅 F5-R1 获准提交 receipt 时序限定 delta。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 审核边界:只审核 V007 对 V004 第 3.3/4 节的 receipt 最终墙钟条款替换;F1、其他已通过合同及 F2/F3/F4/F6 均未重开。本轮未修改或运行代码/测试,未联网,未读取或修改操作手册内容。 ### 冻结快照 - V007:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-V007.md`=`7099 bytes / E6216F8986FE5DFB2DC5E8B6F9479A7D234214C5E59B8FEAC165D168B7FC74AC`,与交接一致;strict UTF-8=`PASS`;尾随空白=`0`。 - 继承设计未变:V003=`28030 / 358C37EE1FE7F5F832FAF33EBDEB1B1714DE46F315A55A1C1D53AF43D687C61F`;V004=`12117 / 50DE1F7E765E8B828DEF1C25D6D5BEA32C3C0B07FD034929542AAE0CB4E84799`;V005=`4028 / B4ABD0456BFA0C219C8C2A7A2A92CBE8B40804901A984A69B941A92F87571B6D`;V006=`3278 / 0A997EFB1D8237EB4102E7BAD71BDADE7F0BD2C1178DDAC9F74117254E3FD209`。 - worklog=`4848 bytes / 1C02372D15C7C18CAB49754CEE54B9CEA88FA724C28D9A42A175A531970A4E9A`;执行日志=`98948 bytes / CBFEF3E88BC37DE996F51DA3C7098EFF8E7757B5601CFE996F6510DBBAA7DAFE`;治理校验前像=`OK / projects=1 / warnings=0`。 - F5 现有实现仍为 `workflow.py=22564 bytes / 8ECA6CE2FEDAF8493EDB4BE855EEF6BB1567BA8643553BBB9CF8D7B4387A0074`,证明 V007 PASS 前没有提前实施 receipt 变更。 ### Findings - 无阻断 finding。V007 只修正已确认不可满足的 receipt 自指时序,没有改变正式目录、manifest、receipt 路径、ticker stdout schema、失败包、V1 模式或产品/数据范围。 ### F5-R1 限定方案核验 1. `PASS`:schema 2 receipt 只不可变绑定 run/status/output/manifest、提交准备时点和 receipt 写入开始下界,明确删除 `commit_finished_at/task_wall_seconds/process_wall_seconds`,不再让文件自报自身最终写后时刻,也不引入 receipt hash 自引用、第二次回写或 sidecar。 2. `PASS`:成功 stdout 保持 V004 schema 1;`terminal_at/task_wall_seconds/process_wall_seconds` 在一次 receipt 原子写返回、正式实物重读/hash/stat 校验及 backup cleanup 尝试之后捕获,成为唯一最终墙钟权威。包内 runtime 仍冻结在 `through_commit_ready`,不改写 manifest 已封存文件。 3. `PASS`:receipt temp write/flush/fsync/replace/final read/hash/stat 均属于真正提交边界;absent 不留伪成功,force 恢复旧 output+receipt 并保存次生 rollback 证据。已验证新 receipt 后的 cleanup 失败只保留新真值、剩余 backup 和 warning,不反向回滚。 4. `PASS`:限定测试覆盖最终写和 cleanup 的 `0.25 s` 延迟、每个 receipt 故障点的普通异常/KeyboardInterrupt/SystemExit、三种成功终态、force、hash/bytes 与时间不等式;足以离线证明 F5-R1,无需真实网络。 ### 继承解释与实现门禁 - V007 第 4 节的“FAILED/BLOCKED 失败包”按未被替换的终态矩阵解释:进入成功 receipt 提交阶段后的普通 I/O/校验故障固定为 `FAILED/5`;`KeyboardInterrupt/SystemExit` 原类型传播并保留失败/回滚证据。核心数据不足在更早阶段形成 `BLOCKED/4`,不会进入成功 receipt 写入。 - manifest-last 继续生效。cleanup warning 可写 stderr、外部命令捕获或未被 manifest 封存的审核证据;不得为补 warning 在成功提交后追加改写 OUT 内的 `runtime.log` 或其他 manifest 文件。 - `receipt_write_started_at` 只能解释为写入开始下界;消费者不得把它当完成时刻。最终耗时只能读取 ticker stdout 的 `terminal_at/task_wall_seconds/process_wall_seconds`。 ### 状态与授权 - V007 限定方案结论:`PASS/0`。允许开发方按 V007 第 2—5 节实施一次性 schema 2 receipt、最终 stdout 墙钟、失败恢复和离线故障矩阵,并同步工具说明、实现证据和其有权限的执行记录。 - F5-R1 仅在方案层具备实施授权,尚未在实现层关闭;必须随 F2/F3/F4/F6 离线修复一并提交下一次限定实现复审。 - 本 PASS 不授权真实网络重跑;F5 只需 fixture 与受控延迟/故障桩。也不授权新增 provider、修改 `ana-dev`/V1、扩大产品范围或同步操作手册。 - 操作手册继续 `NOT_AUTHORIZED_WHILE_IMPLEMENTATION_HOLD`;只有全部剩余实现阻断关闭并取得实现 PASS 后,才能使用既有管理员单文件条件授权并接受后续限定确认。 ### Open questions - 无。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 允许按 V007 开始 F5-R1 实现,并与 F2/F3/F4/F6 的离线闭环一起提交完整限定实现复审;无需真实网络。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-HOLD5-OFFLINE-CLOSURE-REREVIEW-20260802-001 - 记录时间:`2026-08-02T06:25:08+08:00` - 审核阶段:前序实现 `HOLD/5` 的 F2-R1—F6-R1 离线闭环及 V007 实施限定复审。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-HOLD5-OFFLINE-CLOSURE-20260802-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序结论:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-IMPLEMENTATION-HOLD6-REREVIEW-20260802-001=HOLD/5`;`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-DESIGN-V007-RECEIPT-TIMING-DELTA-20260802-001=PASS/0`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 审核边界:只复核 F2-R1—F6-R1 与 V007 实施;F1、V006、V1 只读结论及既有产品范围未重开。本轮未联网、未重跑真实 smoke、未修改实现/测试/fixture/输出或操作手册。 ### 冻结快照与独立验证 - 交接列明的 24 个设计、实现、测试、fixture、文档和记录工件均逐项复算,字节数与 SHA-256 全部匹配;操作手册仍为 `68700 bytes / CCF534DB38F29AFCC61E55FAA47C06829E69E504BDE5CEFF771B10A9AF5AB6E6`,本轮未读取正文。 - 审核员独立运行 V2 离线套件:`55/55 PASS`,`Ran 55 tests in 113.327s / OK`。测试覆盖了交接声明的比较期 A1、逐 kind TTL/MISSING、慢 404/500、receipt schema 2、六终态、12 文件原子边界和 V1 bridge 等矩阵;全绿结果不替代下述未覆盖的内容寻址损坏反例。 - F2-R1 已关闭:上年同期字段绑定 2026 Q1 A1 同响应比较列,structured source、period/publish/support/raw field 和 `same_response_comparative_row` 在 builder 与 QA 双重校验。 - F4-R1 已关闭:HTTPError 4xx/5xx body 使用与 2xx 相同的 remaining deadline、分块读取与取消路径;独立套件中的 0.5 秒 deadline/1.2 秒慢 404、500 均为单请求、无归档和无返回后 cache mutation。 - F5-R1/V007 已关闭:schema 2 receipt 一次写入,写后 read/hash/stat 和 backup cleanup 尝试完成后才捕获 stdout 最终墙钟;receipt 八个边界、普通异常/KeyboardInterrupt/SystemExit、force 恢复和 0.25 秒延迟探针通过。 - F6-R1 已关闭:六终态 exact key/null/file、四类 provider 六种响应、12 文件五个原子边界及 V1 direct/bridge 0/2/3 等价矩阵均由实际入口执行。既有 `valuation-v2-real-smoke-006` 继续是诚实 `BLOCKED/E_HISTORICAL_SHARES_UNPROVEN`;本轮修复不改变该前置终态,无需联网重跑。 ### Findings #### F3-R2 — BLOCKING / 单个 data-kind blob 损坏会击穿整份公司基线,且刷新不能修复被污染的内容寻址对象 - `cache.py:209-224` 的 `_baseline_valid` 在选择候选基线前遍历并读取全部 `source_hashes`;任意一个 blob 缺失或哈希错误就让 `select_baseline` 丢弃整个候选。随后 `baseline_states` 无法逐 kind 判定,所有十类数据统一变成 `MISSING`。这违反 V004 的逐 `data_kind` hash predicate,以及 F3-R1“只有 STALE/MISSING kind 运输、其余 FRESH 从公司基线复用”的合同。 - 审核员使用临时目录完成入口级反例:先由冻结 fixture 生成合法 cold 基线,只把 `market_close.raw_hash` 指向的一个 blob 改为不同 bytes;随后 `selected_after_one_blob_tamper=false`,十类状态均为 `MISSING`,refresh 实际运输 `10` 类而不是 `1` 类。现有 `test_31` 只通过改 TTL 或删除 metadata entry 构造 STALE/MISSING,没有覆盖 blob 缺失/哈希损坏,所以 `55/55 PASS` 未发现该退化。 - `cache.py:151-165` 的 `store` 仅在 digest 路径不存在时写 blob;若该内容寻址路径已存在但内容哈希错误,重新取得正确响应也不会覆盖/隔离坏对象。独立反例中的 refresh 虽返回 `DATA_READY_NEEDS_JUDGMENT`,目标 blob 仍保持错误哈希,刷新后的候选仍无法被选择,十类状态继续全部 `MISSING`。因此污染会跨运行持续,不能由一次成功局部刷新闭环。 最小 required fixes: 1. 将 baseline envelope/data_hash 校验与逐 kind blob 校验分开:单个 entry 的 blob 缺失或哈希错误只把对应 `data_kind` 判为 `STALE`(无 entry 才为 `MISSING`),不得使其余通过 provider/fingerprint/date/schema/semantic/hash 校验的 kind 一并失效;STALE 值仍禁止进入正式结果。 2. `ContentCache.store` 遇到目标 digest 路径已存在时必须复算实物哈希;不一致时以安全原子方式修复或隔离坏对象后写入正确 bytes,不能因 `exists()` 跳过。写后需复验 digest,失败不得提升 reusable 或推进 company current。 3. 增加入口级非空回归:对每个 data-kind 分别删除/篡改其 blob,断言仅目标 kind 运输、其余九类从公司基线复用;成功刷新后十类全为 FRESH、blob/source hashes 可复算,失败刷新仍不推进 current/活动基线。同步纠正实现证据、执行日志和 worklog 中“十类 hash 失败也已逐类闭环”的过度声明。 ### 已关闭与保留结论 - F2-R1=`CLOSED`;F3=`OPEN / F3-R2`;F4-R1=`CLOSED`;F5-R1/V007=`CLOSED`;F6-R1=`CLOSED`。 - F1、V006、V1 只读、历史股本诚实 BLOCKED、无 judgment、16 节、无交易指令和范围排除继续保持,不因本次 HOLD 回退。 - F3-R2 可完全通过缓存代码、离线 fixture/故障测试与文档更正闭环;不需要真实网络,不授权新增 provider、修改 V1/`ana-dev` 或扩展产品范围。 ### 操作手册条件授权 - 本轮结论仍为 `HOLD`,尚不满足管理员的条件单文件授权;不得同步 `outputs/20260730_stock_valuation_guide/股票价格合理性评估操作手册_v1.0.md`。 - F3-R2 关闭并取得限定实现复审 `PASS` 后,才允许使用既有管理员授权只同步该一个文件;同步后只需操作手册单文件限定确认,无需重跑网络。 ### Open questions - 无。唯一剩余阻断已有冻结范围内的确定复现与最小闭环路径。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`1` - F2-R1、F4-R1、F5-R1/V007、F6-R1 已关闭;当前只需关闭 F3-R2。不得同步操作手册;修复后提交同一事项的 F3-R2-only 限定实现复审,无需真实网络。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-F3-R2-ONLY-REREVIEW-20260802-001 - 记录时间:`2026-08-02T06:55:46+08:00` - 审核阶段:前序唯一阻断 `F3-R2` 的限定实现复审。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-F3-R2-ONLY-20260802-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序结论:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-HOLD5-OFFLINE-CLOSURE-REREVIEW-20260802-001=HOLD/1`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 审核边界:只复审 F3-R2;F2-R1、F4-R1、F5-R1/V007、F6-R1 维持关闭,F1、V006、V1/`ana-dev` 只读结论及产品范围未重开。本轮未访问真实网络、未重跑 real smoke、未读取或修改操作手册正文,未修改受审代码、测试、fixture 或项目说明。 ### 冻结快照与独立验证 - 交接列明的七个变更文件均逐项复算并匹配字节数/SHA-256:`cache.py=16558/FAC33193549DCD800FF94FB732449216A9F2D5A40F2F6073897787F84E2DAD46`,`test_pipeline_v2.py=83792/9734C2E74C2A24BE5A3D4665080F141A4AB15FF29244CFED292868A95EDA7AAD`,工具文档=`11348/E1AF3895D568D5E5B8B08B58225AB3DD77E0263640568676E75068A2F8B8837F`,实现证据=`14105/27D7264F31206F41798B3A7CFC51B9A7EDF321CD53D1128200EAA6F503C5A36D`,目录导读=`4274/4DF1415F08EF3FBB308CE86AD5297431B3EFA2765ABE084335B299459416CDCC`,worklog=`7303/16829F9D00FDD6291F3AF1CAB5EDC6D8DEA338184B8A281DE1B93AEECC50A27B`,执行日志=`103967/CA12F771715553BDB129CE98D0D240D73B7713BDC6A07BB90CC68AC0666EB2E6`。 - 操作手册仍为 `68700 bytes / CCF534DB38F29AFCC61E55FAA47C06829E69E504BDE5CEFF771B10A9AF5AB6E6`,与前序冻结值一致。 - 审核员独立运行新增聚焦用例:`2/2 PASS / Ran 2 tests in 16.278s`;独立运行 V2 全套离线测试:`57/57 PASS / Ran 57 tests in 127.851s / OK`。这些结果证明成功修复路径,但现有失败用例只覆盖核心 `market_close`,未覆盖同一修复失败在非核心 forecast 降级路径中的基线副作用。 - `cache.py:151-199` 已在已有 digest 路径复算实物 SHA-256、必要时原子重写并写后复验;`cache.py:220-383` 已把 envelope/data_hash 与逐 kind blob 校验分开。`test_56` 的十类删除/篡改成功矩阵证明仅目标 kind 运输、其余九类 FRESH、刷新后 10/10 FRESH,F3-R2 的成功路径已经闭环。 ### Findings #### F3-R2-R1 — BLOCKING / 非核心 blob 修复失败仍提交新 company current/活动基线 - `test_57_blob_repair_failure_does_not_promote_or_advance_baseline` 只向核心 `market_close` 注入 blob 原子修复失败。核心 provider 异常会令运行 BLOCKED,因而测试虽断言 current/活动基线不变,却没有覆盖 forecast 非核心降级分支,也不能证明交接和文档所称“修复/复验失败均不推进 current/活动基线”。 - `acquisition.py:39,77` 将 forecast provider 异常固定降级为非 blocking `GAP`;`workflow.py:443` 随后不区分普通预测缺口与内容寻址 blob 完整性修复失败,仍无条件执行 `cache.write_baseline(...)`。因此 `ContentCache.store` 虽正确阻止目标 raw/reusable 提升,company baseline 的提交门仍未闭合。 - 审核员入口级离线反例:先形成合法 cold 基线,仅篡改 `forecast_detail` blob 并移除其 reusable index,再只对目标 blob 的 repair `atomic_write` 注入失败。结果为 `code=0 / status=DATA_READY_NEEDS_JUDGMENT / output_exists=true / reusable_exists=false / blob_still_corrupt=true`,但 `current_changed=true`,活动基线由 `2026-08-01-2562051e84009218e4b6ca8cf03522d19e16663483f2e00f9898b5401c090da8.json` 替换为 `2026-08-01-d5b82c2a2b120ffdc241e94267e90c1f20b91425ef5b6981a72f27ec0517c015.json`。这直接违反前序 required fix 2/3 和本次交接第 2/3 项的“修复/复验失败不推进 current/活动基线”。 - 工具文档第 117 行、实现与验收证据第 36/93 行、worklog 第 43 行及执行日志第 851 行均把核心单例测试结果泛化为所有 data-kind 的修复失败保证;在非核心反例存在时属于过度声明。 最小 required fixes: 1. 在缓存/采集/工作流之间保留“内容寻址 blob 修复或写后复验失败”的可判定信号;`workflow.py` 提交 company baseline/current 前若本次任何 data-kind 出现该类完整性失败,必须跳过 `write_baseline`,无论该 provider 在产品语义上属于核心阻断还是非核心 gap。核心仍可 BLOCKED;forecast 仍可按冻结合同返回带 gap 的成功输出,但不得新建、替换或归档活动 company baseline/current。 2. 增加真实入口故障回归,至少分别覆盖一个核心 kind 和一个 forecast 非核心 kind,并覆盖 repair 写失败与写后 read/hash 复验失败:断言目标 reusable 不存在,修复失败对象不被当作健康值,`current.json` 字节和活动基线完整集合均保持不变。非核心场景若按合同保留成功/gap 输出,可允许正式输出存在,但不得据此推进 company baseline。 3. 将工具文档、实现与验收证据、worklog 和执行日志中“修复失败均不推进 current/活动基线”的表述收敛到实际实现和上述非核心入口证据;完成后只提交 `F3-R2-R1-only` 限定复审。 ### 已关闭与保留结论 - F2-R1=`CLOSED`;F3=`OPEN / F3-R2-R1`;F4-R1=`CLOSED`;F5-R1/V007=`CLOSED`;F6-R1=`CLOSED`。F3-R2 的 envelope/逐 kind 隔离、已有 digest 安全修复以及十类成功矩阵继续有效,不因本次 HOLD 回退。 - 修复与验证均可离线完成;无需真实网络或 real smoke,不授权新增 provider、修改 V1/`ana-dev`、修改冻结产品语义或扩展范围。 ### 操作手册条件授权 - 本轮为 `HOLD`,不得使用管理员既有条件授权同步操作手册。 - 仅当 F3-R2-R1 关闭并取得限定实现复审 `PASS` 后,才允许只同步既有授权指定的唯一操作手册文件;同步后仅需该单文件限定确认,无需网络重跑。 ### Open questions - 无。唯一剩余问题已由冻结范围内的非核心入口反例确定复现,并给出最小离线闭环路径。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`1` - 仅 F3-R2-R1 未关闭;开发方完成上述三项最小修复后提交 `F3-R2-R1-only` 限定实现复审。当前不得同步操作手册,无需真实网络重跑。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-F3-R2-R1-ONLY-REREVIEW-20260802-001 - 记录时间:`2026-08-02T07:39:50+08:00` - 审核阶段:前序唯一阻断 `F3-R2-R1` 的限定实现复审。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-F3-R2-R1-ONLY-20260802-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序结论:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-F3-R2-ONLY-REREVIEW-20260802-001=HOLD/1`,审计文件前序冻结值=`140865 bytes / EB3898F146200A7AE6536503E36D4AA323EC44E9BD1815541D4EE2F850023C12`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立审核方:`dev.reviewer.project / inforev` - 审核边界:只复审 F3-R2-R1;F3-R2 的成功路径以及 F2-R1、F4-R1、F5-R1/V007、F6-R1 继续冻结,F1、V006、V1/`ana-dev` 只读结论和产品范围未重开。本轮未访问真实网络、未重跑 real smoke、未读取或修改操作手册正文,未修改受审代码、测试、fixture、执行日志或项目说明。 ### 冻结快照 - 交接列明的十个变更文件均逐项复算并匹配字节数/SHA-256:`cache.py=17353/84E0AE46C4A3E3AFFC495D4328D82C0CB59C62E2CAA1396A11EFCB05E357E6F0`,`acquisition.py=5344/BA693F152A5AEDB6EB5A525398EA5D1D2E97431C0FBA67BCD44078F0006E2C4B`,`providers.py=35661/90749F6596483CF7DB5DC861A108146D1716580BDE89038E3C28044275EDAACB`,`workflow.py=24131/36F958758A5DBA168B68334C6F3D715268C57188E1E2F7A009A49B36F8DEB11D`,测试=`89292/E45672F51D2F84ECC33AFE3EC25EFF384BE31FCAE6CD8A626A185152787106DC`,工具文档=`11630/A8DBCDD010512A37E691A012183BAE10005F9D2F1A3DABD9D8D87048B2A99BAF`,实现证据=`14355/8CE7343CC50C6EF7864888EEE573DEA483C29225B19A248159D99FA0BEF1D214`,目录导读=`4262/C2415C6DD59B0578499C8B7EE88ED4B84E66958F72FF8C78702DD8328C992B2D`,worklog=`8111/A240AFA0F5A5C40D2FEE68205EEE07E556703278A20945B4962AB5FF893061E4`,执行日志=`105925/FE351CF19A6AE7BCBAAF8A3FA51A9140E0DC273328521FED11596235A1DA9246`。 - 操作手册仅复算实物,仍为 `68700 bytes / CCF534DB38F29AFCC61E55FAA47C06829E69E504BDE5CEFF771B10A9AF5AB6E6`;本轮没有读取正文或执行同步。 ### F3-R2-R1 闭环核验 1. `PASS`:`cache.py:82,155-187` 新增 `BlobIntegrityError`;已有 digest 对象的 repair 原子写失败和写后 read/hash 不一致均在 raw-index/reusable 提升之前成为明确的内容完整性失败,不再退化为不可区分的普通 provider 缺口。 2. `PASS`:`acquisition.py:39-65` 对线程外抛的 `BlobIntegrityError` 保留 `cache_integrity_failure=true`;`providers.py:793-825` 对 forecast-detail 内部允许降级的异常也单独保留同一信号。因此普通 forecast coverage gap 继续为非阻断缺口,内容对象完整性失败则具有独立提交语义。 3. `PASS`:`workflow.py:443-455` 在调用 `write_baseline` 前同时要求所有 provider 均无 `cache_integrity_failure`,并要求十类 data-kind 条目集合完整且其 `raw_hash` 对应实物全部复算可信。任一核心或非核心完整性失败均跳过 company baseline/current 提交;forecast 仍可按冻结合同保留带 gap 的成功正式输出。 4. `PASS`:`test_57`、`test_58`、`test_59` 从真实入口分别覆盖核心 `market_close` 与非核心 `forecast_detail` 的 repair 写失败和原子写返回后哈希不一致。每例断言目标 reusable 不存在、current 字节与完整活动基线文件集合不变;非核心场景保持 `DATA_READY_NEEDS_JUDGMENT` 并保存 `cache_integrity_failure=true`,核心场景保持诚实 BLOCKED 且无正式输出。原 F3-R2-R1 反例不能再复现。 5. `PASS`:工具文档、实现与验收证据、worklog 和开发执行日志已区分普通 forecast coverage gap 与 cache integrity failure,且只声明实际入口矩阵已经证明的 baseline/current 行为;没有继续保留前序过度声明。 ### 独立执行结果 - F3-R2-R1 聚焦入口:`3/3 PASS / Ran 3 tests in 3.256s / OK`。 - V2 完整离线回归:`59/59 PASS / Ran 59 tests in 131.288s / OK`;`test_36` 只出现冻结的 cleanup warning,测试本身通过。 - V1 只读回归:`10/10 PASS / Ran 10 tests in 0.164s / OK`。 - CLI help=`PASS`;五个变更 Python 文件 strict UTF-8 与只读 `compile(...)`=`PASS`;十个变更文件行尾空白=`0`。 - 治理校验:`mbx validate --project project-info --governance=OK / projects=1 / warnings=0`。 - `fixture-004` 与 `real-smoke-006` 仅保持前序冻结事实;本轮离线修复不改变真实 smoke 的诚实 `BLOCKED/E_HISTORICAL_SHARES_UNPROVEN`,故没有依据要求网络重跑。 ### Findings - 无阻断 finding。F3-R2-R1 已按前序三项最小 required fixes 完整关闭,没有新增审核范围。 ### 已关闭与保留结论 - F2-R1=`CLOSED`;F3-R2-R1=`CLOSED`,因此 F3=`CLOSED`;F4-R1=`CLOSED`;F5-R1/V007=`CLOSED`;F6-R1=`CLOSED`。 - F1、V006、V1 只读桥接、无 judgment 终态、16 节、无交易指令、未来信息保护、历史股本诚实 BLOCKED 和既有真实证据限制继续保持;本次 PASS 不把 real-smoke-006 改写为成功 smoke。 ### 操作手册条件授权 - 本轮实现复审已取得 `PASS/0`,满足项目管理员既有条件单文件授权的触发条件。允许开发方只同步 `outputs/20260730_stock_valuation_guide/股票价格合理性评估操作手册_v1.0.md`;不得借此修改其他 `outputs`、provider、V1/`ana-dev`、代码、测试或产品范围。 - 同步完成后只需向本审核任务提交该操作手册单文件限定确认,列明同步前后 bytes/SHA-256、实际差异、UTF-8/行尾与相关文档链接一致性;无需重跑真实网络、fixture、V2/V1 全套或既有 smoke。 ### Open questions - 无。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - F3-R2-R1 关闭;允许按管理员既有条件授权只同步唯一操作手册文件。同步后提交单文件限定确认即可,无需网络重跑。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-OPERATION-MANUAL-SINGLE-FILE-CONFIRMATION-20260802-001 - 记录时间:`2026-08-02T08:02:30+08:00` - 审核阶段:最终实现 `PASS/0` 后的操作手册单文件限定确认。 - 审核对象:`DEV-ANA-STOCK-VALUATION-PIPELINE-V2-20260801-001` - 原生交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-PIPELINE-V2-OPERATION-MANUAL-SYNC-20260802-001`;来源任务 `019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序依据:`DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-PIPELINE-V2-F3-R2-R1-ONLY-REREVIEW-20260802-001=PASS/0`,前序审计文件=`146931 bytes / E2E4F0BB85F09056874DFDD14EC55E593AF1B4D38CCDB0B0224A28577C331D7B`。 - 执行方:`dev.developer.project.secondary / infodev-2` - 独立确认方:`dev.reviewer.project / inforev` - 限定边界:只检查 `outputs/20260730_stock_valuation_guide/股票价格合理性评估操作手册_v1.0.md` 的实物、唯一差异、新增章节、编码/行尾和三个本地链接。本轮未重开实现、网络、provider、V1/`ana-dev`、fixture、smoke 或其他 `outputs`,未运行 V2/V1 测试,未修改受审操作手册或其他正式产物。 ### 单文件实物与差异 - 同步前冻结值:`68700 bytes / CCF534DB38F29AFCC61E55FAA47C06829E69E504BDE5CEFF771B10A9AF5AB6E6`。 - 同步后复算值:`74401 bytes / 89FF988050A6148755F4B95DF95171DCE7439AD015094561690195B992636CA7`,与交接完全一致;strict UTF-8=`PASS`,无 BOM,全文件统一 LF。 - 新增章节的实际标题为 `## 三十一、端到端协调层 V2`,位于当前文件第 1949—2012 行,共 64 行、5701 bytes。删除该完整插入块后,重建文件精确恢复为 `68700 bytes / CCF534DB38F29AFCC61E55FAA47C06829E69E504BDE5CEFF771B10A9AF5AB6E6`,从字节层证明旧章节未被改写。 - 新增 64 行的行尾空白=`0`;全文件仅第 3、4、5 行存在三处历史行尾空白。因重建前版哈希完全一致,可确认这三处在同步前已经存在且本次未改变。 - 以 `2026-08-02T07:40:00+08:00` 为本次同步窗口起点只读扫描 `outputs/`,窗口内仅该操作手册一个文件发生修改;没有发现其他 `outputs` 同步。 ### 内容与链接一致性 1. `PASS`:新增章节准确说明 project 级 V2、只读 V1 bridge、`ticker + as-of` CLI、`--judgment` 门禁、无 judgment 的 `DATA_READY_NEEDS_JUDGMENT` 和 V1 `--input` 兼容;未把数据就绪状态写成方向结论。 2. `PASS`:登记公开来源、字段级 A1/raw-hash 回链、上海 as-of、14 日 K 线窗口、历史股本诚实 BLOCKED、4 汇总/3 明细有界 gap 和共享 90 秒 deadline 与已通过工具说明一致。 3. `PASS`:十类 `FRESH/STALE/MISSING`、单 blob 损坏隔离、原子 repair/写后复验,以及任一完整性失败禁止推进 company current/活动基线的表述,与 F3-R2/F3-R2-R1 最终实现审计一致。 4. `PASS`:六终态/退出码、正式包、manifest、schema 2 receipt、stdout 最终 task/process 双墙钟,以及 fixture 冷/热目标、V2 `59/59`、V1 `10/10` 和 real-smoke-006 的 `E_HISTORICAL_SHARES_UNPROVEN` 限制均未夸大为真实成功验收。 5. `PASS`:章节明确不输出交易指令,也没有新增 provider、操作步骤或产品承诺。 6. `PASS`:三个相对链接均从操作手册目录正确解析且实物存在:`../../dev-doc/project-doc/股票估值端到端协调层V2.md`=`11630 bytes`,`../../dev-doc/project-doc/股票估值端到端协调层V2实现与验收证据.md`=`14355 bytes`,`../../dev/project-dev/stock_valuation_pipeline_v2/README.md`=`1445 bytes`。 ### Findings - 无阻断 finding。同步严格限于管理员已授权的唯一操作手册文件,内容与最终 `PASS/0` 实现及其限制一致。 ### Open questions - 无。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 操作手册单文件同步确认完成;无需重跑网络、fixture、V2/V1 测试或 smoke。本事项的开发审核与授权后单文件确认链已闭环。 ## DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-V003-DESIGN-20260803-001 - 记录时间:`2026-08-03T02:07:13+08:00` - 审核阶段:请求方真实验收 `HOLD/1` 后的 V003 限定方案审核。 - 审核对象:`DEV-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-20260801-001` - 恢复请求:`meeting_slide_v003_design_review_resume_request`,来源任务=`019fb7a4-bdfd-79f2-bd6b-e67e2b7d8efd`,前序消息=`msg_20260801225701882_593be603`。 - 请求方反馈:`msg_20260801214538194_7196a0fa=HOLD/1`;合格主体固定为旧输出 `slide_002..slide_038`,旧 `slide_001` 与 `slide_039..slide_053` 必须排除。 - 执行方:`dev.developer.project / infodev`;独立审核方:`dev.reviewer.project / inforev`。 - 需求:`ai-media-processor/draft/会议录屏PPT页面提取方案_v0.1.md`=`9764 bytes / A9FCB3AD03FEC637E287D53C16DB0D22A40156F94579377F2D83324AA630A740`。 - V003:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-V003.md`=`9128 bytes / C9EB544A7F0E1A160237E3F9C9E426B093AD37D82F22808E8B6A792BE92D1051`。 - 实现基线保持未改:`dev/project-dev/extract_ppt_slides.py`=`27482 bytes / 052F5B3BA40EA6C1BB87AF9A7BB4E9C50A84C5A45929540F23606582D30D7D1B`;测试基线=`29015 bytes / 35CB570ACC6C9EE3AB25EB9B1B15C11691F0902AE23314445B645A1BA3760484`。 - 审核外部动作:源视频读取=`0`,既有 PNG/PDF 图像读取=`0`,FFprobe/FFmpeg=`0`,媒体重跑=`0`,测试运行=`0`;仅做方案、需求、前序审计、执行账本和代码接入点的静态只读核对。 ### Findings - 无阻断 finding。V003 在既有稳定段、动画合并和全局去重之后、原分辨率 PNG 提取之前增加单一确定性主序列选择,没有重开或改写已通过的 V002 主链。 ### 限定合同核对 1. `PASS`:512 箱 RGB 紧凑直方图只随最终逻辑页保存,每页固定约 2 KiB;不保存扫描 RGB 帧,不引入 OCR、人像/人脸识别、语义模型、区域裁剪、遮挡、新依赖或新系统,符合 4 小时流式资源边界。 2. `PASS`:主题标记覆盖、单页间隙、最少标记、全局占比和区间密度均有命名常量;分组、门禁、胜出排序及无合格组原样保留均为确定性规则,不按人物或文字语义猜测裁页。 3. `PASS`:现有 53 页离线特征证据得到唯一主组:标记旧页 `2,4..8,10..38`,闭区间为旧页 `2..38`,`35/37=0.946` 密度、`35/53=0.660` 全局占比;由区间保留旧 `slide_003`、`slide_009` 两个单页主题偏离,同时排除旧 `slide_001` 与 `slide_039..053`。该证据只冻结规则和预期,不冒充修改后产品验收。 4. `PASS`:保留页继续从原视频提取整幅原分辨率画面;算法不分析或修改页面区域,因此有效 PPT 上的小型人物窗口随整页保留,不裁剪、不遮挡。 5. `PASS`:实现门禁覆盖直方图合法性、53 页结构桩、各阈值反例、全主题/无合格组保守行为、过滤只调用一次且位于原图提取前、连续重新编号,并要求既有目标/project 回归、中断、原子提交、合成 A完整/B 和短片 5 页合同不得回退。 6. `PASS`:实施阶段先只读复用旧 53 张 PNG,通过产品同一 helper 和 `select_main_sequence` 证明选中旧 `2..38`,再生成独立 37 页离线 PNG/PDF 与联系表;用户手工生成的 37 页 PDF 不被用作代码实现或产品主链通过证据。 7. `PASS`:V003 方案、离线测试和限定实现审核 PASS 前不得运行真实源;实现审核 PASS 后仅允许在独立 `real-full-v2.slides` 最多完整运行一次。旧 53 页输出、资源证据及归档 PDF保持只读,唯一复验失败即停止媒体重跑,不调参、不扩架构。 ### 后续人工 PDF 状态隔离 - 本次恢复审核时已知:请求方后来按用户明确指令,人工用旧 `slide_002..038` 重新生成并替换了 `ana-data/news-小郑/` 下的归档 PDF。该人工 37 页文件只解决用户当下阅读需求,不是 V003 代码实现、离线回放或真实产品验收证据。 - V003 实施仍必须以任务临时根保留的原始 `real-full.slides/pages/` 53 张候选 PNG 为离线回放输入;开发员不得读取人工 37 页 PDF 反推索引、不得再次改写该归档文件,也不得以其页数冒充自动过滤通过。 ### 已冻结且不重审的合同 - V002 稳定段防漂移、动画更新、历史去重、FFmpeg 时间映射与 BaseException 回收、逐页 PDF、正式目录原子提交继续有效。 - 前序实现审核 `PASS/0`、目标测试 `22/22`、project 回归 `41/41`、完整运行耗时/资源、PNG/PDF RGB 顺序和源四项指纹保护继续冻结;本轮 PASS 不替代 V003 实现审核或请求方最终真实验收。 - 产品仍为单视频 CLI、一个脚本/一个测试文件/一页用法;不新增 PPTX、JSON、GUI、API、数据库、批处理、转写联动、Skill、GPU 或用户可调阈值。 ### Open questions - 无。V003 已把本轮唯一真实样本失败映射为可实现、可离线复验、可失败停止的最小自动规则;无需在方案阶段运行媒体。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 实现授权:允许 `dev.developer.project / infodev` 严格按 V003 修改既有单脚本、对应测试与用法,完成全部离线单元/回归及旧 53 页只读回放后提交限定实现审核。 - 真实媒体门禁:实现审核 PASS 前不得读取或运行源视频;实现审核 PASS 后最多运行一次完整源视频,输出到全新独立目录,由 `case_analysis.media_processor` 最终验收。 ## DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-V003-IMPLEMENTATION-20260803-001 - 记录时间:`2026-08-03T20:44:14+08:00` - 审核阶段:V003 `PASS/0` 后的限定实现、离线测试与旧 53 页只读回放审核。 - 审核对象:`DEV-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-20260801-001` - 开发提交消息:`msg_20260803025656382_a037bf27`;handoff=`HANDOFF-INFODEV-INFOREV-MEETING-SLIDE-V003-IMPLEMENTATION-REVIEW-20260803-001`。 - 恢复请求:`meeting_slide_v003_implementation_review_resume_request`,来源任务=`019fb7a4-bdfd-79f2-bd6b-e67e2b7d8efd`。 - 前序方案审计:`DEV-AUDIT-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-V003-DESIGN-20260803-001=PASS/0`。 - 执行方:`dev.developer.project / infodev`;独立审核方:`dev.reviewer.project / inforev`。 - 冻结设计:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-V003.md`=`9128 bytes / C9EB544A7F0E1A160237E3F9C9E426B093AD37D82F22808E8B6A792BE92D1051`,与方案 PASS 快照一致。 - 实现:`dev/project-dev/extract_ppt_slides.py`=`32133 bytes / 9C4F57ED56B01C9EE2BD68CDC532BC865F73EB3662E01B6600410C5660F1F605`。 - 测试:`dev/project-dev/test/test_extract_ppt_slides.py`=`35037 bytes / 63298A48F4F7944514301D0BC0AC619C58464651ABF8F53C23E15E85565106FA`。 - 用法:`dev-doc/project-doc/会议录屏PPT页面提取工具.md`=`6729 bytes / C883E7A37846621E9889DDA584D5EC16066A85848A732C3C92CDE891A0485D6C`。 - 开发执行记录:`DEV-LOG-PROJECT-INFO-MEETING-RECORDING-SLIDE-EXTRACTION-MVP-V003-OFFLINE-IMPLEMENTATION-20260803-001`。 ### Findings - 无阻断 finding。 ### 实现与冻结合同核对 1. `PASS`:`_palette_histogram` 在既有最大 320 像素宽 RGB 扫描帧上生成归一化 `float32[512]` 颜色直方图;只随最终页候选保留约 2 KiB 特征,不保存 RGB 扫描帧,不改变长视频流式资源模型。 2. `PASS`:颜色特征按 `FrameFeature -> PageCandidate -> LogicalPage.current_palette` 传递;稳定段采用其最终 committed best 的直方图,同页动画只有在页面状态更新时同步替换 palette,保留旧态或历史重复时不会污染最终页特征。 3. `PASS`:`select_main_sequence` 严格实现覆盖率 `0.12`、最多一个非标记页间隙、至少 8 个标记、全局占比 `0.50`、区间密度 `0.80`,并按标记数、区间长度、区间覆盖和、早起点、小颜色箱确定性排序;无合格组或胜出区间覆盖全部候选时原样保留。 4. `PASS`:所有逻辑页 palette 在选择前统一检查 512 维、有限、非负和归一化;非法特征显式 `SlideExtractionError`,空候选显式失败,不存在空列表或静默裁页 fallback。 5. `PASS`:产品主链在 `scan_video` 形成稳定/动画/去重候选后只调用一次序列过滤,并在任何原分辨率提取前完成;下游仍按筛选列表从 `slide_001` 连续重编号并逐页写 PDF。保留页继续输出整幅原画面,小型人物窗口不裁剪、不遮挡。 6. `PASS`:代码差异仅增加颜色特征、纯函数序列过滤和一次主链调用;V002 的稳定段、动画/历史去重、FFmpeg 时间与回收、PDF writer、路径预检、原子目录提交、BaseException 清理、两个公开 CLI 参数均未回退。 7. `PASS`:未新增 OCR、人像/人脸识别、语义模型、区域识别、裁剪/遮挡、新模块、新依赖、新参数、JSON、GUI/API、批处理、数据库、Skill、GPU 或额外产品产物;改动文件和开发账本均在 V003 授权范围内。 ### 测试与独立离线复验 - 审核侧使用捆绑 Python,先把子进程 `PATH` 置空,从物理上禁用 FFmpeg/FFprobe;`py_compile=PASS`,CLI help=`PASS`,公开参数仍只有 `video` 与可选 `--output`。 - 目标测试:`29 discovered / 26 PASS / 3 SKIP / 0 FAIL`。三个 SKIP 精确对应既有 `large stderr`、VFR/非零 PTS 和中文路径合成视频三项 FFmpeg 集成测试;V003 新增颜色量化、旧 53 页结构、三个保守门禁、全主题保留、非法 palette、主链调用顺序和连续重编号全部实际执行并通过。 - project 完整离线回归:`48 discovered / 45 PASS / 3 SKIP / 0 FAIL`;其余工具测试使用桩对象,没有外部媒体动作。 - 审核侧独立读取旧 `real-full.slides/pages/` 的 53 张候选 PNG,以当前产品 `_gray_feature` 和 `select_main_sequence` 复算:`selected_count=37`,原索引严格为连续 `2..38`,无多页、少页或乱序。 - 开发离线证据:`sequence-filter-offline-v003-evidence.txt`=`16268 bytes / A12AF6E0F1B3D4E7CBB2874924E07CA929CF22CE80BC3D7AE7D9E3527B7CDA60`;证据声明源视频读取、FFprobe、FFmpeg 均为 `0`。 - 审核侧对新输出 37 张 PNG 做物理哈希复核:逐页与旧候选 `slide_002..038` 对应 SHA-256 完全一致,mismatch=`0`;新 PDF 实物=`58570040 bytes / 71C508E94852FBE36AA49DA1B17DDD3F634A82463A06E8AB029709517BB68535`,与提交证据一致。 - 旧 53 页开发 PDF 实物仍为 `112814367 bytes / FD289013234317F5D93EA41475C96794581E33CE2C466311E1E3A0DC2F6B299E`;请求方人工 37 页归档仍为 `58570040 bytes / 71C508E94852FBE36AA49DA1B17DDD3F634A82463A06E8AB029709517BB68535`,创建/修改时间未变。新离线 PNG 的物理来源映射已独立证明,不以人工 PDF 页数冒充自动实现。 - strict UTF-8=`PASS`,范围内 `git diff --check=PASS`;治理校验=`OK / projects=1 / warnings=0`。 - 审核外部动作:源视频读取=`0`,FFprobe=`0`,FFmpeg=`0`,真实/合成视频运行=`0`;只读取代码、文本证据和旧候选 PNG 做离线特征复算及哈希核对,没有查看或更改任何源视频。 ### Open questions - 无。真实扫描帧与旧 PNG 离线缩放的细微编码差异按 V003 约定留给唯一一次完整源视频验收;这不是继续阻断已正确实现且离线闭环的理由。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - V003 限定实现、离线测试、53→37 自动选择、连续重编号和证据保护均通过;人工 37 页 PDF未替代代码实现。 - 真实运行授权:允许 `dev.developer.project / infodev` 对授权的完整源视频最多运行一次,输出必须进入全新独立 `real-full-v2.slides` 与证据目录;不得覆盖旧 53 页开发输出或人工归档 PDF,不得先做额外短片/预跑,不得在失败后重试或调参。 - 运行后必须记录 exit、耗时、进程树资源、候选数/最终页数、PNG/PDF RGB 与顺序、联系表、暂存残留及源大小/创建时间/修改时间/SHA-256 前后一致,并沿原任务链交 `case_analysis.media_processor` 最终验收。本 PASS 不替代最终页面效果验收。 ## DEV-AUDIT-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-V001-DESIGN-20260804-001 - 记录时间:`2026-08-04T11:35:07+08:00` - 审核阶段:本地媒体主机响应保护 V001 重型方案独立审核。 - 审核对象:`DEV-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-20260804-001` - 审核请求:`HANDOFF-INFODEV-INFOREV-MEDIA-HOST-RESPONSIVENESS-V001-DESIGN-REVIEW-20260804-001`;前序授权=`HANDOFF-MEDIA-INFODEV-MEDIA-HOST-RESPONSIVENESS-20260804-001 / AUTHORIZED_MINIMAL_IMPLEMENTATION`;来源任务=`019fb7c5-b721-7332-b5c3-7120176fe016`。 - 执行方:`dev.developer.project / infodev`;独立审核方:`dev.reviewer.project / inforev`。 - V001:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-V001.md`=`13606 bytes / 7F0F5505EF1D92C73FBE6EDFF382F6E25D95A0ABE6D28A7A366353B88CA80273`。 - 产品基线保持冻结:`dev/project-dev/extract_ppt_slides.py`=`32133 bytes / 9C4F57ED56B01C9EE2BD68CDC532BC865F73EB3662E01B6600410C5660F1F605`;`dev/project-dev/transcribe_media.py`=`20996 bytes / 309166EEFE11A74472EA355CA4AF87F9432A15393B9ABE6D69F7F1054055DE35`。 - 审核依据:上游原生授权、项目/common 编码与开发审计规范、项目配置、开发事项总纲/计划/执行日志、V001 及两个产品脚本真实接入点。 - 审核外部动作:业务源读取=`0`,FFprobe/FFmpeg=`0`,合成或真实媒体运行=`0`,真实片段生成=`0`,产品代码/测试/用法修改=`0`;仅做静态只读核对与一次 `nvidia-smi` 只读字段可用性检查,确认本机 decoder utilization 查询可返回数值。 ### Findings #### F1(阻断,流程/失败合同):CPU 回退触发边界过宽,会把页面算法或业务判定错误伪装成“NVDEC 不可用” - V001 第 4.3 节第 91 行把“硬件路径非零退出、无完整帧或其他普通扫描失败”全部纳入一次 CPU 回退。当前扫描函数同时包含 rawvideo 读取、稳定段 detector、页面 classifier 和“未发现稳定页面”等业务判断;“其他普通扫描失败”因此可吞入特征/分类器缺陷、合法的空业务结果、内存或清理异常。 - 这会改变既有错误语义并用 fallback 掩盖主路径错误,违反上游“硬件路径不可用才回退”及冻结页面算法/失败合同。即使 CPU 第二次扫描成功,首轮算法错误也会被错误宣告为硬件不可用;若第二次失败,原始根因还会被 CPU 错误覆盖。 - `required_fix`:在修订方案中冻结硬件可归因的内部失败边界。只有硬件 decoder/transfer 的启动失败、FFmpeg 非零退出、零帧或半帧管道失败等外部 NVDEC 失败才允许触发一次 CPU 扫描;完整解码后的 detector/classifier/页面合法性、文件/日志、清理及其他业务异常必须原样传播,不得回退。“完整扫描但无稳定页面”继续走既有业务失败,不得改跑 CPU。补桩测试分别证明:硬件失败恰好一次 CPU;算法/分类器/空业务结果/`KeyboardInterrupt`/`SystemExit` 均为零次 CPU;CPU 再失败无第三次尝试且保留可定位根因。 #### F2(阻断,业务合同/测试):现有门禁只证明 NVDEC 命令能启动,没有证明 H.264/H.265 下页面结果不漂移 - V001 冻结稳定段、动画合并、去重、主课件序列、PNG/PDF 和时间映射不变,但第 6.3 节只要求一个 2 秒 H.264 NVDEC `exit=0` 探针;这只能证明 decoder/filter 管道可执行。NVDEC 与软件解码在色彩转换、像素舍入和帧输出上可能有差异,而当前页面算法使用 MAD、changed-ratio、颜色直方图等阈值,单纯复跑既有单元测试不能证明切换 decoder 后逻辑页、时间戳和最终顺序不变。H.265 实际路径也只有静态映射,没有实际合成链路证据。 - 这不满足 common 性能规范“优化必须证明结果不漂移”和上游业务输出冻结合同,且唯一真实 590 秒运行不能同时再跑 CPU 基线来补足差分证据。 - `required_fix`:不读取业务源,在实现阶段增加短小、确定性的 H.264 与 H.265 合成页序列(至少覆盖稳定页、动画更新、重复页和页面切换);分别用实际 NVDEC 与强制受限 CPU 路径执行同一 `_scan_once`/主序列链,断言采样数、逻辑页数、选中页顺序和相对时间戳一致,并验证最终 PNG/PDF 页数、顺序和 RGB 尺寸合同。命令测试同时断言 `-hwaccel/-hwaccel_output_format/-c:v/-threads` 位于输入 `-i` 之前,CPU 的解码线程参数同样属于输入侧;H.264/H.265 均须留下实际 decoder 路径证据。像素级允许的非业务差异无需逐字节冻结,但任何页面/时间/顺序漂移必须阻断。 #### F3(阻断,证据/采样):500 ms 门禁可在采样密度不足时形成零滚动窗口并空通过,10 秒条件也未按实际时间计算 - V001 第 7.3 节要求 5 秒窗口至少 10 个连续样本,却仅把单次间隔 `>1500 ms` 判无效;如果实际间隔持续为 0.8—1.5 秒,任一 5 秒区间都可能不足 10 个样本,从而没有“完整窗口”,而“所有完整窗口 `<85%`”会成为空集合真值。固定“连续 20 个样本≈10 秒”在允许的抖动范围内也可能覆盖 10—30 秒,不能严格证明上游的连续 10 秒门禁。 - 当前合同没有冻结首个性能计数器样本的 warm-up、有效窗口非空和扫描阶段覆盖率;因此采样器可生成字段齐全但 CPU gate 不可判定的假 PASS。 - `required_fix`:以实测时间戳冻结非空、非空过的采样合同。至少要求:丢弃并标记 counter warm-up;从扫描 FFmpeg 被观察到至其退出形成连续覆盖;每个进入判定的 5 秒尾窗必须有不少于 10 个有效样本,窗口数必须 `>0`,任何密度不足/缺口直接 `sampling_valid=false`;高 CPU 连续段按样本实际起止时间累计,持续时间达到 `10.000 s` 即失败,而不是按固定 20 行近似。`resource_samples.csv/resource_summary.json` 必须保存窗口数、窗口成员、最大间隔、高 CPU 段起止/持续时间,并用合成 CSV 单测覆盖临界 `<85/==85`、恰好 10 秒、稀疏采样和零窗口反例。 ### 已通过且冻结的合同 1. `PASS`:只修改两个现有产品脚本、对应测试/说明与一个测试侧只读采样器,不增加服务、API、GUI、数据库、调度器、产品 package 或公开参数;共享保护 owner 放在既有 `transcribe_media.py` 的模块边界可实施。 2. `PASS`:两个 CLI 在外部动作前共用非阻塞 Windows named mutex,根 Python 与默认 FFprobe/FFmpeg BelowNormal,异常退出释放 mutex、恢复失败不覆盖业务异常或已提交成功的生命周期方向正确;实现审核仍需核对精确错误映射和句柄回收。 3. `PASS`:4 个输入解码线程、2 个扫描滤镜线程及所有 FFmpeg 入口覆盖范围明确;转写模型/参数、页面算法、公开 CLI、业务输出、源保护、原子提交和失败清理均声明冻结。 4. `PASS`:实现审核前只允许离线/合成测试;实现审核 PASS 后才可只读生成一个 `<=600 s` 独立片段并运行一次 PPT 提取,禁止 3.57 小时/4 小时媒体、并行转写、重试、调参或覆盖旧证据,真实资源验收顺序合理。 5. `PASS`:资源证据同时要求整机 CPU、任务树 CPU/RAM、根与后代优先级、GPU/decoder 利用率、全局及任务 PID 专用显存、原始命令和 stdout/stderr;硬件路径以 decoder 命令/日志为主证据,未把显存变化冒充 NVDEC。 ### Open questions - 无。三个问题均可在方案与离线/合成测试合同内最小闭环,不需要业务源、真实片段或产品代码预实施。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`3` - 根因分类:流程/失败合同 `1`;业务合同/测试 `1`;证据/采样 `1`。 - 实现授权:`DENIED`。`dev.developer.project / infodev` 不得修改两个产品脚本、不得生成真实片段、不得运行业务媒体;只允许修订方案并补足 F1—F3 的离线/合成验收合同后提交一次限定复审。 - 复审边界:只复审 F1—F3 闭环及本记录“已通过且冻结的合同”是否回退;不得新增产品范围或要求真实媒体。 ## DEV-AUDIT-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-V002-DESIGN-REREVIEW-20260804-001 - 记录时间:`2026-08-04T12:09:02+08:00` - 审核阶段:V001 `HOLD/3` 后的 V002 限定方案复审。 - 审核对象:`DEV-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-20260804-001` - 复审请求:`HANDOFF-INFODEV-INFOREV-MEDIA-HOST-RESPONSIVENESS-V002-DESIGN-REREVIEW-20260804-001`;前序回执=`HANDOFF-INFOREV-INFODEV-MEDIA-HOST-RESPONSIVENESS-V001-DESIGN-REVIEW-RESULT-20260804-001`;来源任务=`019fb7c5-b721-7332-b5c3-7120176fe016`。 - 执行方:`dev.developer.project / infodev`;独立审核方:`dev.reviewer.project / inforev`。 - 前序方案:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-V001.md`=`13606 bytes / 7F0F5505EF1D92C73FBE6EDFF382F6E25D95A0ABE6D28A7A366353B88CA80273`。 - 前序审计:`DEV-AUDIT-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-V001-DESIGN-20260804-001=HOLD/3`;当时审计文件=`171737 bytes / C9857D954230147A316DD72E2EAC0798C13865859125C566FCC14196AABB6D28`。 - V002:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-V002.md`=`14551 bytes / 5BCA39F8B397364E10682780515BCA7983EAC8F003DF54D6A268D852545BC332`;strict UTF-8=`PASS`,BOM=`NO`。 - 产品与测试继续冻结:`extract_ppt_slides.py=32133/9C4F57ED56B01C9EE2BD68CDC532BC865F73EB3662E01B6600410C5660F1F605`;`transcribe_media.py=20996/309166EEFE11A74472EA355CA4AF87F9432A15393B9ABE6D69F7F1054055DE35`;对应测试=`35037/63298A48F4F7944514301D0BC0AC619C58464651ABF8F53C23E15E85565106FA` 与 `17227/87BD890436789BE2F813ADC57A37168A3C5A76C7815F2DA9B2FB04D4DE9D4512`。 - 复审边界:仅检查前序 F1—F3 及 preserved contracts 是否回退;未重开 V001 已通过的模块边界、产品范围或真实验收次数。 - 复审外部动作:业务源读取=`0`,FFprobe/FFmpeg=`0`,合成/真实媒体运行=`0`,真实片段生成=`0`,产品代码/测试修改=`0`;只读检查 V002、前序审计、账本和冻结实物哈希。 ### Findings - 无剩余阻断 finding。 ### F1—F3 闭环 1. `PASS / F1`:V002 第 2 节新增的私有 `HardwareDecodePathError` 只覆盖 NVDEC `Popen` 启动、非零退出、零帧和半帧四类硬件可归因失败;页面特征、detector/classifier、动画/去重/主序列、完整扫描无稳定页、文件/提交/暂存/清理以及 `KeyboardInterrupt/SystemExit` 均原类型传播且 CPU 调用数为 0。外层只捕获该私有类型并恰好执行一次全新 4/2 CPU 扫描,CPU 失败后没有第三次尝试;首个硬件根因留在唯一告警、CPU 根因保持最终失败,关闭了“算法错误伪装成硬件不可用”的前序缺口。 2. `PASS / F1 tests`:启动失败、非零、零帧、半帧、detector、classifier、空结果、文件/清理、中断和 CPU 二次失败均有明确调用次数、对象身份/退出码、异常类型/因果链及无第三次尝试断言;测试合同足以验证异常包络而不要求真实媒体。 3. `PASS / F2`:V002 第 3 节固定同一 `320x180 / 1 fps` RGB 页序列,包含稳定页、动画更新、页面切换和历史重复;H.264/H.265 分别实际编码后,各自执行 NVDEC 与 forced 4/2 CPU 的同一扫描、稳定/动画/去重、主序列、PNG/PDF 链。两种 codec 都必须在当前验收主机实际 PASS,能力缺失只能诚实 SKIP,不能伪造通过。 4. `PASS / F2 assertions`:每种 codec 均比较采样数、稳定候选/动画更新、逻辑页、选中标识/顺序、相对时间戳 `<=0.001 s`、PNG 连续编号/RGB/尺寸和 PDF 页序/RGB 尺寸;不把压缩字节差异升级为业务阻断,但任何页数、时间、顺序、模式或尺寸漂移都阻断。硬件 decoder、输出格式和输入解码线程均明确位于目标 `-i` 前,CPU 路径无硬件参数且保留 4/2 上限,关闭了“只证明命令能启动”的前序缺口。 5. `PASS / F3`:V002 第 4 节把首次性能计数器行标为 warm-up 无效行,以扫描 FFmpeg 的实际出现和退出限定连续采样区间;每个有效样本代表真实时间区间,非递增、间隔 `>1.5 s`、读取/归属/字段缺失均令 `sampling_valid=false`。 6. `PASS / F3 windows`:5 秒尾窗按样本区间重叠秒数加权,要求完整覆盖 `5.000 s`、至少 10 个不同有效成员、窗口最大间隔 `<=1.5 s`、严格 `<85.0` 且 `window_count>0`;密度不足或零窗口不能空通过。连续 `>=85.0` 按实际区间累计,`>=10.000 s` 即失败,不再用固定 20 行近似。 7. `PASS / F3 evidence`:逐窗成员/覆盖/最大间隔/加权 CPU、最差窗口以及高 CPU 段起止/时长均固定落盘;合成 CSV 覆盖 `<85`、`==85`、`9.999/10.000 s`、0.8—1.5 秒稀疏、零窗口、warm-up、首末覆盖、倒序和大缺口,足以证明非空性、边界值与无假 PASS。 ### Preserved contracts 1. `PASS`:V002 只修订 F1—F3;V001 中与之不冲突的公共 owner、两个 CLI 共用非阻塞 Windows named mutex、根 Python 与默认 FFprobe/FFmpeg BelowNormal、4 decode/2 filter 线程及其异常释放/优先级证据继续有效。实现审核仍必须验证 V001 已冻结的双进程 mutex、句柄清理、默认 `run/Popen` creation flags 和外部动作前失败门禁。 2. `PASS`:公开 CLI/业务函数签名、页面稳定/动画/去重/主题算法、PNG/PDF、转写模型/分块/时间轴、FLAC/TXT/SRT/JSON、源保护、拒绝覆盖、原子提交和失败清理均未修改或放宽。 3. `PASS`:不新增产品模块、依赖、参数、服务、API、GUI、数据库、批处理或调度器;唯一新文件仍限测试侧只读资源采样器。 4. `PASS`:方案 PASS 后只开放产品最小实现和离线/合成测试;独立实现审核 PASS 前仍禁止读取业务源、生成真实片段或运行真实媒体。后续真实门禁继续是至多一个 `<=600 s` 独立片段和一次 PPT 提取,禁止长媒体、并行转写、重试、调参或覆盖旧证据。 ### Open questions - 无。V002 已在纯方案和离线/合成证据边界内完整闭环 F1—F3,不需要提前触发真实媒体。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 方案基线:后续实现必须同时遵守未冲突的 V001 与 V002;发生冲突时以 V002 第 2—4 节为准。 - 实现授权:允许 `dev.developer.project / infodev` 严格按 V001+V002 修改两个现有产品脚本、对应测试/说明及测试侧只读采样器,完成 F1 桩、H.264/H.265 合成差分、F3 合成 CSV、目标测试和 project 全回归后提交限定实现审核。 - 真实媒体门禁:本 PASS 不授权业务源读取、真实片段生成或真实媒体运行;只有后续独立实现审核 PASS 后,才可执行已冻结的一次 `<=600 s` 片段和一次 PPT 运行。 ## DEV-AUDIT-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-V002-IMPLEMENTATION-20260804-001 - 记录时间:`2026-08-04T13:09:05+08:00` - 审核阶段:V001+V002 组合合同的限定实现与离线证据审核。 - 审核对象:`DEV-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-20260804-001` - 审核请求:`HANDOFF-INFODEV-INFOREV-MEDIA-HOST-RESPONSIVENESS-V002-IMPLEMENTATION-REVIEW-20260804-001`;前序方案回执=`HANDOFF-INFOREV-INFODEV-MEDIA-HOST-RESPONSIVENESS-V002-DESIGN-REREVIEW-RESULT-20260804-001`;来源任务=`019fb7c5-b721-7332-b5c3-7120176fe016`。 - 执行方:`dev.developer.project / infodev`;独立审核方:`dev.reviewer.project / inforev`。 - 组合方案:V001=`13606 bytes / 7F0F5505EF1D92C73FBE6EDFF382F6E25D95A0ABE6D28A7A366353B88CA80273`;V002=`14551 bytes / 5BCA39F8B397364E10682780515BCA7983EAC8F003DF54D6A268D852545BC332`。 - 实现实物:`extract_ppt_slides.py=38111/9AD12F95C0615034B1BB9C72F79DFC5F1150DE33E2DD8889CFF14534509BB41A`;`transcribe_media.py=25087/E889D78DEEEFBC061CD0F952157C83997704CD46AF833AAF452293B7434D96FD`。 - 测试/采样器:`test_extract_ppt_slides.py=55492/C18A2ACB79A4C74E5D93184723E17E4C13683CA52B0CD86B2AD47AFB6DD75CEA`;`test_transcribe_media.py=19507/1C58C4C9ED45A1276A7CFF4D7E376F133446F506CB1A4890D231D00A229B82AC`;`monitor_media_host_responsiveness.ps1=28062/EAB0479662C29EA52CE56619EA9E27491DDE40AC6656E2391E82DE2356B27AB7`。 - 用法说明:`会议录屏PPT页面提取工具.md=10145/BEA0B27D2B3CFA38B896963A9C1327A86EAECCA6110052D89EF489D6CFE61FA4`;`本地视频语音转写工具.md=6788/286F3395ADA8FCEC3DDA04185929D99A773E4A1B7250508254B2F645647804E5`。 - 开发账本:`DEV-LOG-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-V002-OFFLINE-IMPLEMENTATION-20260804-001`;提交时 `dev-doc/开发执行日志.md=122695/274511B4FF5C3DA021DF52D1490B8097EEFEA761CE3321FC4E42C65D2E14A623`。 - 独立复跑:py_compile=`PASS`;两个 CLI help=`PASS`;PowerShell parser=`PASS`;目标测试=`38+14=52/52 PASS`;project discover=`59/59 PASS`;H.264/H.265 的 NVDEC/forced CPU 四链均在当前主机实际执行且返回成功,业务摘要均为 `19 samples / 5 stable candidates / animation_updated 1 / historical_duplicate 1 / new_page 3 / selected 6,10,18 s`。 - 文本/治理:范围内文件 strict UTF-8=`PASS`、BOM=`NO`;`mbx validate --project project-info=OK / projects=1 / warnings=0`。 - 审核外部动作:业务源读取=`0`,业务 FFprobe/FFmpeg=`0`,真实片段生成=`0`,真实媒体运行=`0`,长媒体运行=`0`;独立复跑只执行获授权的离线桩与临时目录 H.264/H.265 合成媒体。 ### Findings #### F1(阻断,失败合同):业务异常与子进程清理异常同时发生时,业务根因仍会被替换 - `extract_ppt_slides.py` 的 `_scan_video_once` 在捕获任意普通 `Exception` 后,只要 `_attempt_reap` 返回清理错误,就统一新建 `SlideExtractionError`。这会把 detector/classifier/特征计算等业务异常的对象、类型、消息和 traceback 改写,与 V002 第 2.1 节“清理异常只作诊断附注、不得覆盖业务根因”冲突。 - 独立故障注入以 `_gray_feature -> ValueError('business-root')` 与 `_attempt_reap -> OSError('cleanup-failed')` 同时发生,实际得到 `caught_type=SlideExtractionError / same_object=False / cause_type=ValueError`,证明现有绿色用例没有覆盖组合失败。 - `required_fix`:按活动异常域处理 reap/close 失败。业务/算法异常及 `KeyboardInterrupt/SystemExit` 必须传播原对象、原类型和原 traceback,清理错误只能使用 note/只读诊断属性附加;纯清理失败可以保持既有用户错误;硬件失败叠加清理失败仍须禁止 CPU 回退并保留双重诊断。补充“feature/detector/classifier + reap 失败”“CPU 根因 + reap 失败”“KeyboardInterrupt/SystemExit + reap 失败”和“硬件根因 + 清理失败”离线桩,逐项断言对象身份、CPU 调用数和无第三次尝试。 #### F2(阻断,冻结合同回退):H.264/H.265 的 codec-only NVDEC 映射被未经方案批准的像素格式 allowlist 改写 - V001 第 4.2 节冻结 `h264 -> h264_cuvid`、`hevc -> hevc_cuvid`,V002 第 2.2 节继续规定 H.264/H.265 先进入硬件尝试;只有其他 codec 才直接使用受限 CPU。当前 `_decoder_for_codec` 新增 `pix_fmt` allowlist,并由测试明确断言 `h264/gbrp -> None`,从而让仍属于 H.264/H.265 的输入在没有发生硬件失败时直接跳过 NVDEC。 - 用法说明同步写成“像素格式受本机验证支持时”才优先 NVDEC,说明这不是单纯记录字段,而是已经改变了通过审核的产品选择合同;10-bit HEVC 映射又没有对应 10-bit 合成链证明固定 `hwdownload,format=nv12` 可用。 - `required_fix`:最小修复是恢复 codec-only 决策:所有 `h264/hevc` 都先组装并尝试相应 cuvid 命令,实际不支持的 surface/filter 失败再严格通过 `HardwareDecodePathError` 做唯一一次 4/2 CPU 回退;`pix_fmt` 可以只作证据字段,不得改变选择。同步删除相反测试/说明,并增加非 `yuv420p` 的 H.264/HEVC 命令选择桩。若确需像素格式 allowlist,必须先提交限定方案修订及各 allowlist 分支的实际合成证据,不能在本实现复审中默认接受。 #### F3(阻断,资源采样正确性):采样器不能唯一识别稳定页扫描 FFmpeg,CPU 窗口和 NVDEC 主证据均可能错归属 - 采样循环把任务树中所有进程名为 `ffmpeg` 的 PID 都设为 `scan_ffmpeg_present`,没有利用命令区分长扫描 `rawvideo/fps=1` 与后续逐页 `-frames:v 1` 提取。真实 PPT 运行至少包含这两类 FFmpeg,故 `scan_end` 可能被后续逐页进程延长,或在多个短进程之间形成错误阶段;当前分析器也只取所有 active 行,未固定唯一扫描 PID及其退出后的同一采样周期。 - `resource_acceptance_pass` 的 NVDEC 判定只匹配 stdout 的 `NVDEC/CUDA (...)` 文本,没有核验捕获到的扫描 argv 是否含 `-hwaccel cuda`、正确 cuvid decoder、输入侧 `-threads 4`、`-filter_threads 2/-filter_complex_threads 2` 与 `hwdownload`;因此日志文本存在但实际命令不满足合同时仍可假 PASS。运行模式在资源门禁失败但目标进程 exit=0 时仍以 0 退出,也没有把门禁失败提升为可靠终态。 - `required_fix`:以首次匹配产品稳定扫描命令形状的唯一 FFmpeg PID 为 scan owner,冻结其完整 argv/decoder,连续记录至观测到该 PID 退出的同一采样周期,后续逐页 FFmpeg 不得重新打开或延长 scan 区间。`resource_acceptance_pass` 必须同时核验 stdout 和该唯一 argv 的 NVDEC/线程/滤镜结构;资源门禁失败时采样器返回明确非零,同时在 summary 保留原目标 exit。增加纯离线进程时间线/命令桩,覆盖“扫描进程 -> 间隔 -> 多个逐页进程”、CPU 回退告警、伪造 stdout 和缺少硬件参数,证明阶段及主证据不能误归属。 #### F4(阻断,证据模式):逐样本与汇总缺少 V001+V002 固定的必填资源证据 - `resource_samples.csv` 只保存解析后的三个 GPU 数值和 PID 专用显存总数,没有 V002 要求的 GPU 原始查询状态、显式 decoder 字段,也没有 V001 要求的 `nvidia-smi` 原始行、任务 PID 的 `GPU Process Memory` 原始实例名和逻辑处理器数。 - `resource_summary.json/run_summary.json` 没有有效扫描样本数、最长高 CPU 段的起止对象、任务 CPU/RAM 峰值、GPU/decoder 利用率峰值、全局显存峰值和任务 PID 专用显存峰值;这不足以完成 V002 第 4.4 节和 V001 第 7.2—7.3 节规定的真实资源证据包。 - `required_fix`:在逐样本中落盘原始 `nvidia-smi` 行/解析状态、任务 PID GPU 实例名、decoder、逻辑处理器数及完整必填字段;在汇总中落盘有效扫描样本数、扫描 PID/decoder/完整命令、最大间隔、最差窗口、最长高段起止/时长以及上述 CPU/RAM/GPU/decoder/显存峰值。任何查询/字段/解析缺失都必须 `sampling_valid=false`,并增加 schema 完整/缺字段反例。 #### F5(阻断,离线门禁覆盖):已冻结的 F3 边界与双 CLI mutex 入口没有被提交测试完整执行 - F3 合成 CSV 当前覆盖 `<85/==85`、`9.999/10.000 s`、稀疏、零窗口和 `1.6 s` 缺口,但没有 V002 第 4.4 节明确要求的时间戳倒退、首/末覆盖归属以及必填字段缺失反例;分析器还直接信任 CSV 的 `interval_seconds`,未验证它与相邻时间戳/`previous_valid_timestamp_utc` 一致。 - Windows 双进程测试只在子进程直接调用共享 `media_host_guard()`,没有按 V001 第 6.2 节分别执行两个真实 CLI 入口,因而没有证明 PPT 与转写各自在路径解析、暂存、FFprobe/FFmpeg、模型动作之前由 busy 错误抢先终止;Win32 获取/优先级失败时的 Release/Close 也没有故障桩。 - `required_fix`:补齐时间戳倒退、首/末覆盖、interval/previous 不一致、必填字段缺失的 Analyze 反例;真实两进程无媒体测试应由 A 持锁,B 分别调用两个 CLI 并断言各自固定 busy 退出/错误且外部动作和暂存均为 0,随后证明锁可重取、优先级恢复。再以 Win32 wait/get/set 失败桩验证句柄关闭和无外部动作。全部仍是离线测试,不需要业务源或真实媒体。 ### 已通过且冻结的实现 1. `PASS`:两个 CLI 复用 `transcribe_media.py` 中同一个 `media_host_guard`、mutex 名和 creation-flags helper;guard 位于业务函数调用外层,静态顺序满足 busy/优先级错误先于路径、暂存、FFprobe/FFmpeg和模型动作。 2. `PASS`:默认 `subprocess.run/Popen` 均使用 BelowNormal creation flag;完整音轨、音频块、PPT 扫描和逐页提取均含输入侧 `-threads 4`,扫描还含 `-filter_threads 2/-filter_complex_threads 2`。 3. `PASS`:H.264/H.265 `yuv420p` 合成链在当前主机实际完成 NVDEC 与 forced CPU 差分,采样/候选/动画/去重/主序列/时间/PNG/PDF 合同一致;这项通过结果不抵消 F2 的选择合同回退。 4. `PASS`:公开 CLI、页面/转写算法阈值、PNG/PDF、FLAC/TXT/SRT/JSON、large-v3 CUDA/float16/VAD、1200 秒核心块/5 秒重叠、源保护、拒绝覆盖、原子提交和失败清理的其余路径未发现回退;未新增产品模块、依赖、参数、服务、API、GUI、数据库或调度器。 5. `PASS`:提交哈希、UTF-8、语法、CLI help、52 个目标测试、59 个 project 测试和治理校验均可独立复现;绿色测试只能证明现有覆盖通过,不能覆盖 F1—F5 指出的缺失组合与真实证据误归属。 ### Open questions - 无。五项均可通过最小代码/采样器/离线测试修复闭环,不需要读取业务源、生成真实片段或运行真实媒体。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`5` - 根因分类:失败合同 `1`;冻结产品合同 `1`;采样阶段/主证据 `1`;证据模式 `1`;离线覆盖 `1`。 - 真实媒体授权:`DENIED`。不得读取业务源、生成 `<=600 s` 真实片段、运行 PPT 真实资源验收、重试、调参、并行转写或改跑长媒体。 - 最小修复授权:只允许在既有两个产品脚本、对应测试、测试侧采样器和两份用法说明内闭环 F1—F5;不得扩展产品范围。修复后提交一次 F1—F5 限定实现复审,继续保持业务媒体动作=0。 ## DEV-AUDIT-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-V002-F1-F5-IMPLEMENTATION-REREVIEW-20260804-001 - 记录时间:`2026-08-04T14:12:57+08:00` - 审核阶段:前序实现 `HOLD/5` 的 F1—F5 限定实现复审;只检查修复闭环与已通过合同是否回退。 - 审核对象:`DEV-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-20260804-001` - MB-X 请求消息:`msg_20260804135235824_b43d3af0`;请求交接=`HANDOFF-INFODEV-INFOREV-MEDIA-HOST-RESPONSIVENESS-V002-IMPLEMENTATION-REREVIEW-20260804-001`;前序回执=`HANDOFF-INFOREV-INFODEV-MEDIA-HOST-RESPONSIVENESS-V002-IMPLEMENTATION-REVIEW-RESULT-20260804-001`;来源任务=`019fb7c5-b721-7332-b5c3-7120176fe016`。 - 执行方:`dev.developer.project / infodev`;独立审核方:`dev.reviewer.project / inforev`。 - 组合方案保持:V001=`13606 bytes / 7F0F5505EF1D92C73FBE6EDFF382F6E25D95A0ABE6D28A7A366353B88CA80273`;V002=`14551 bytes / 5BCA39F8B397364E10682780515BCA7983EAC8F003DF54D6A268D852545BC332`。 - 复审实物:`extract_ppt_slides.py=38070/DCA04653CB349CB6DE449A6D291344E3E5788FB035F07A6BB2670EBE1F11D30A`;`transcribe_media.py=25245/0A485447578DB24DEA84CB887041F6D0CCB3E00F3F40745965228F2D06EEED8F`;`test_extract_ppt_slides.py=65196/50FCDCE8FF75711CF75599D9207C376DE8575C8EF193B9F81CC0F5B50CF02A4E`;`test_transcribe_media.py=23080/1BD0D8B1392BD69F72CBCE1A279BBEF2B36B813E03147E298D366FEBC4524E95`;`monitor_media_host_responsiveness.ps1=43771/6B038A4A44F874A93DAA5B10F6B59CD5BD9DD246A5ADFA0BD109F7CAFF8AFEAE`。 - 用法说明:`会议录屏PPT页面提取工具.md=10630/5A0AC2B050E6E441D49E82AD55F4F1B12761EE9D26FC50C50F38784E5402C64E`;`本地视频语音转写工具.md=6788/286F3395ADA8FCEC3DDA04185929D99A773E4A1B7250508254B2F645647804E5`。 - 开发账本:`DEV-LOG-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-V002-HOLD5-REPAIR-20260804-001`;提交实物=`126430 bytes / 5CEEF9820AC9BB7352FB1481110B26EF857494F16F45D485C7420FFCAA47DBC4`。 - 独立复跑:py_compile=`PASS`;PowerShell parser=`PASS`;两个 CLI help=`PASS`;目标测试=`55/55 PASS / 21.715 s`;project discover=`62/62 PASS / 22.899 s`;项目测试使用 `PYTHONUTF8=1` 保证父测试进程与中文路径子 CLI 的一致 UTF-8 解码。 - 合成证据:H.264/H.265 的 NVDEC/forced CPU 四条授权合成链均实际返回成功,继续得到 `19 samples / 5 stable candidates / animation_updated 1 / historical_duplicate 1 / new_page 3 / selected 6,10,18 s`,PNG/PDF 页数、顺序、RGB 和尺寸一致。 - 治理:`mbx validate --project project-info=OK / projects=1 / warnings=0`。 - 复审外部动作:业务源读取=`0`,业务 FFprobe/FFmpeg=`0`,真实片段生成=`0`,真实媒体运行=`0`,长媒体运行=`0`;只运行获授权的离线桩、临时合成 H.264/H.265 和合成 CSV。 ### Findings #### F3-R1(阻断,采样主证据与运行态离线门禁):NVDEC argv 校验仍可放行缺失冻结输入参数的命令,运行模式的阶段/日志/终态也未形成提交测试 - V002 第 3.3 节冻结 `-hwaccel`、`-hwaccel_output_format`、`-c:v ` 和输入侧线程参数必须位于目标 `-i` 之前;V002 第 4.4/5 节又要求真实验收以该唯一扫描 argv 作为 NVDEC 主证据。当前 `Test-NvdecScanCommand` 只验证 `-hwaccel cuda`、cuvid、`threads=4`、两个滤镜线程参数和 `hwdownload`,没有验证 `-hwaccel_output_format cuda`,因此主证据判定不完整。 - 提交的“有效低 CPU”合成 CSV 命令本身只有 `-hwaccel cuda -c:v h264_cuvid ...`,缺少 `-hwaccel_output_format cuda`,但 `low["sampling_valid"]` 仍断言为真并在独立 `55/55`、`62/62` 复跑中通过;这是可复现的假放行,不是仅有测试缺口。 - 前序 F3 的 `required_fix` 还明确要求纯离线覆盖“稳定扫描 PID -> 间隔 -> 后续逐页 FFmpeg”、CPU 回退日志、伪造 NVDEC stdout、缺硬件参数以及“目标 exit=0、资源失败时采样器 exit=3 且保留 target exit”。当前唯一采样器测试只调用 `-AnalyzeSamplesPath`;没有运行模式桩或进程时间线桩证明 `$ScanPid/$ScanPhaseClosed/$NvdecLogEvidence/$ResourcePass` 的组合终态。静态实现方向合理,但未满足已冻结的非空执行证据门。 - `required_fix`:在 `Test-NvdecScanCommand` 中把 `-hwaccel_output_format cuda` 纳入唯一输入 `-i` 前的强制校验,并增加删除/错值/置于 `-i` 后的合成 CSV 反例;再用无业务媒体的进程/命令桩执行采样器 Run 控制流,覆盖上述扫描后逐页进程、伪 stdout/CPU 回退和 exit=3/target-exit 保留。不得读取或运行真实媒体。 #### F4-R1(阻断,schema 完整性门禁):采样器已写出的冻结必填列没有全部进入缺失校验 - V002 第 4.1 节把任务 PID 集、任务树 CPU/RAM、优先级、GPU 原始状态和实际命令列为逐样本必填字段;前序 F4/F5 的 `required_fix` 要求任何必填列缺失都使 `sampling_valid=false`。当前采样行实际写出 `task_pids`、`ffmpeg_command_lines` 和 `nvidia_smi_compute_task_rows`,但 `Analyze-ResourceSamples` 的 `$RequiredColumns` 没有这三列;删除任一列仍不会产生 `required_column_missing_*`。 - 现有缺列反例只删除 `gpu_query_raw_rows`,不能证明上述冻结列的 schema 门禁。实际 Run 生成器目前会写这些列,但验收分析器仍允许证据包被删列后继续判有效,故“缺列即无效”没有闭环。 - `required_fix`:把 `task_pids`、`ffmpeg_command_lines`、`nvidia_smi_compute_task_rows` 纳入 `$RequiredColumns` 和扫描阶段非空校验,并逐列增加最小 Analyze 反例;不改变资源阈值,不需要真实媒体。 ### 已关闭且继续冻结 1. `F1=PASS`:活动业务/CPU/`KeyboardInterrupt/SystemExit` 异常与 reap/close 失败并发时保留同一异常对象,清理诊断只作 note;硬件根因叠加清理失败时禁止 CPU,CPU 二次失败无第三次。 2. `F2=PASS`:恢复 codec-only;所有 H.264/H.265 分别先选 `h264_cuvid/hevc_cuvid`,`pix_fmt` 仅作证据,非支持 surface 由实际硬件失败进入唯一一次 4/2 CPU。 3. `F5=PASS`(除上列仍依赖 F3/F4 的采样器运行态/schema 证据外):时间戳/interval/previous 重算反例、首末覆盖、两个真实 CLI busy 抢先终止以及 Win32 wait/get/set 句柄释放桩均通过。 4. 已通过合同继续冻结:共享非阻塞 named mutex、根 Python/默认 FFprobe/FFmpeg BelowNormal、4/2 线程;公开 CLI、页面/转写算法与业务输出、large-v3 CUDA/float16/VAD、1200 秒核心块/5 秒重叠、源保护、拒绝覆盖、原子提交和失败清理未发现回退;无新增产品模块、依赖、参数或服务。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`2`(F3-R1=`1`;F4-R1=`1`)。 - 真实媒体授权:`DENIED`。当前不得读取业务源、生成 `<=600 s` 真实片段、运行 PPT 真实资源验收、重试、调参、并行转写或改跑长媒体。 - 最小修复授权:只修复测试侧采样器及对应离线测试/说明中的上述两项;产品脚本和已关闭 F1/F2/F5 合同继续冻结。修复后只提交 F3-R1/F4-R1 限定复审,业务媒体动作继续保持 `0`。 - Open questions:无;两项都可由最小采样器/离线测试修改闭环,不需要外部输入或真实媒体。 ## DEV-AUDIT-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-F3-R1-F4-R1-REREVIEW-20260804-001 - 记录时间:`2026-08-04T14:39:28+08:00` - 审核阶段:前序 `HOLD/2` 后的 F3-R1/F4-R1-only 限定实现复审。 - 审核对象:`DEV-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-20260804-001` - MB-X 请求消息:`msg_20260804143248490_0303f8fc`;请求交接=`HANDOFF-INFODEV-INFOREV-MEDIA-HOST-RESPONSIVENESS-F3-R1-F4-R1-REREVIEW-20260804-001`;前序回执=`HANDOFF-INFOREV-INFODEV-MEDIA-HOST-RESPONSIVENESS-V002-F1-F5-IMPLEMENTATION-REREVIEW-RESULT-20260804-001`;来源任务=`019fb7c5-b721-7332-b5c3-7120176fe016`。 - 执行方:`dev.developer.project / infodev`;独立审核方:`dev.reviewer.project / inforev`。 - 审核边界:只复审 F3-R1/F4-R1;两个产品脚本、F1/F2/其余 F5 和全部 preserved contracts 均按前序结论冻结。本轮未读取业务源、未生成真实片段、未运行真实媒体或长媒体。 - 冻结产品:`extract_ppt_slides.py=38070/DCA04653CB349CB6DE449A6D291344E3E5788FB035F07A6BB2670EBE1F11D30A`;`transcribe_media.py=25245/0A485447578DB24DEA84CB887041F6D0CCB3E00F3F40745965228F2D06EEED8F`;`test_transcribe_media.py=23080/1BD0D8B1392BD69F72CBCE1A279BBEF2B36B813E03147E298D366FEBC4524E95`;`本地视频语音转写工具.md=6788/286F3395ADA8FCEC3DDA04185929D99A773E4A1B7250508254B2F645647804E5`,均与前序冻结哈希一致。 - 本轮实物:`test_extract_ppt_slides.py=72307/425F4C5D2C00F2E7260343CD961DCE0DC635184AE93F79446D12A8D4D489B06C`;`monitor_media_host_responsiveness.ps1=43995/8BAFFCE83980542F2FA7ED8BC939114CB09E77E7DB880E4DAD2CD66367B9D040`;`会议录屏PPT页面提取工具.md=10884/E9ABE70093728A92653CF8C8E14C59725E5CDF9BD5285648695F0B178E78BA3B`。 - 开发账本:`DEV-LOG-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-F3-R1-F4-R1-REPAIR-20260804-001`;提交实物=`129939 bytes / 21B3CB9383114082B3AD7F7CF849A0B4E8495F9AC550F4B0B1450165BD3EAE8F`。 - 静态核验:`Test-NvdecScanCommand` 已要求 `-hwaccel_output_format cuda` 位于首个目标 `-i` 前;合成有效命令已补齐;删除/错值/后置和缺 `hwdownload` 反例齐备。`task_pids`、`ffmpeg_command_lines`、`nvidia_smi_compute_task_rows` 已进入 `$RequiredColumns` 和扫描阶段非空门禁,四类缺列反例齐备。 - 独立基础检查:py_compile=`PASS`;PowerShell parser=`PASS`;`mbx validate --project project-info=OK / projects=1 / warnings=0`。 - 独立聚焦复跑:首次两项套件=`1 PASS / 1 FAIL / 31.589 s`;其中 Analyze/F4 用例通过,Run/F3 用例在 `active_indexes=[]` 处失败。随后单独重跑同一 Run 用例=`1/1 PASS / 10.671 s`,证明现有用例随冷热启动时序变化而不稳定。 ### Findings #### F3-R1-R1(阻断,离线证据可复验性):Run 桩在冷启动时可于采样循环就绪前结束扫描,必要阶段证据非确定性 - 失败首跑的 `resource_samples.csv` 共 6 行,第一行已经只观察到带 `-frames:v 1` 的逐页 `ffmpeg.exe`;`scan_ffmpeg_pid` 全部为空,`scan_phase_active` 全部为 false,`run_summary` 为 `scan_ffmpeg_seen=false / valid_scan_sample_count=0 / target_exit_code=0 / resource_acceptance_pass=false`。因此断言 `active_indexes >= 2` 实际失败。 - 同一代码、同一命令随后的单项重跑通过。差异来自 Run 桩把扫描进程只保持 `3.0 s`,而采样器在启动目标进程之后才构造整机 CPU 与 `GPU Process Memory` 计数器;冷启动初始化耗时可超过“3 秒扫描 + 1.5 秒间隔”,使首个进程树快照只看到后续逐页进程。该竞态使前序 F3-R1 要求的扫描 PID/退出周期/逐页排除/exit=3 证据不能稳定复验。 - 这不是要求真实媒体或放宽资源门禁;聚焦用例本身是实现审核的必要离线证据,首跑失败即不能用一次暖态 PASS 关闭 F3-R1。 - `required_fix`:消除目标启动至采样就绪之间的盲区,优先在启动被测进程前完成可能阻塞的性能计数器/GPU 类别初始化,或使用明确的 sampler-ready 握手后再让 stub 启动扫描;Run 桩不得依赖 3 秒睡眠恰好覆盖主机冷启动。修复后应稳定证明唯一扫描 PID、退出后同周期、后续逐页不延长、伪 stdout/CPU 回退不能假通过,以及 `target exit=0 / sampler exit=3`。仅需采样器与无媒体离线测试,不得修改产品脚本或运行真实媒体。 ### 已关闭且继续冻结 1. `F4-R1=PASS`:三项遗漏列已纳入 schema 与非空门禁,`gpu_query_raw_rows/task_pids/ffmpeg_command_lines/nvidia_smi_compute_task_rows` 删除反例均由同一 Analyze 用例执行并通过。 2. `F3-R1 argv 子项=PASS`:`-hwaccel_output_format cuda` 的位置/值校验及四个反例已闭环;仅 Run 证据的冷启动可复验性仍开放。 3. F1、F2、其余 F5、共享 mutex、BelowNormal、4/2 线程、公开 CLI、页面/转写算法与业务输出、长转写、源保护、原子提交和失败清理继续冻结;产品脚本与冻结文件哈希未回退。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`1`(F3-R1-R1=`1`;F4-R1=`CLOSED`)。 - 真实媒体授权:`DENIED`。不得读取业务源、生成 `<=600 s` 真实片段、运行 PPT 真实资源验收、重试、调参、并行转写或改跑长媒体。 - 最小修复授权:只允许修改测试侧采样器、无媒体 Run 桩及必要说明以消除上述启动竞态;产品脚本、F4-R1 和其他冻结合同不得重开。修复后提交 F3-R1-R1-only 限定复审。 - Open questions:无;无需开发员或外部输入,按上述最小同步/初始化修复即可闭环。 ## DEV-AUDIT-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-F3-R1-R1-REREVIEW-20260804-001 - 记录时间:`2026-08-04T15:18:25+08:00` - 审核阶段:前序 `HOLD/1` 后的 F3-R1-R1-only 限定实现复审。 - 审核对象:`DEV-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-20260804-001` - MB-X 请求消息:`msg_20260804150032663_852b38d9`;请求交接:`HANDOFF-INFODEV-INFOREV-MEDIA-HOST-RESPONSIVENESS-F3-R1-R1-REREVIEW-20260804-001`;前序回执:`HANDOFF-INFOREV-INFODEV-MEDIA-HOST-RESPONSIVENESS-F3-R1-F4-R1-REREVIEW-RESULT-20260804-001`;来源任务:`019fb7c5-b721-7332-b5c3-7120176fe016`。 - 执行方:`dev.developer.project / infodev`;独立审核方:`dev.reviewer.project / inforev`。 - 审核边界:只复审采样器冷启动时性能计数器/GPU 类别同步初始化及 sampler-ready 握手;F4-R1、F3 argv 子项、F1/F2/其余 F5、两个产品脚本和全部 preserved contracts 均冻结,不重开。 - 本轮实物:`monitor_media_host_responsiveness.ps1=44142/E5909D0E3A3DEA875755E054EB10F78A530A54D08946C6DFE18AFFA52E429DF2`;`test_extract_ppt_slides.py=73191/E9654F1B5D8832CE0CA925EC391BB3E733EA325DEE1B8D193CCD3612A9B63981`;`会议录屏PPT页面提取工具.md=11125/53D824CB5B371F7C2A913842DB2C19C4AE0374FF848E2DDC0B6439D790926705`。 - 开发账本:`DEV-LOG-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-F3-R1-R1-REPAIR-20260804-001`;提交实物 `dev-doc/开发执行日志.md=132152/C7D8DF3D61E0006691CD59D22841B30C7EBA3C4E73E110DF666DB58EF5FE9EDD`。 - 冻结实物复核:`extract_ppt_slides.py=38070/DCA04653CB349CB6DE449A6D291344E3E5788FB035F07A6BB2670EBE1F11D30A`;`transcribe_media.py=25245/0A485447578DB24DEA84CB887041F6D0CCB3E00F3F40745965228F2D06EEED8F`;`test_transcribe_media.py=23080/1BD0D8B1392BD69F72CBCE1A279BBEF2B36B813E03147E298D366FEBC4524E95`;`本地视频语音转写工具.md=6788/286F3395ADA8FCEC3DDA04185929D99A773E4A1B7250508254B2F645647804E5`,均与提交及冻结值一致。 - 静态闭环:采样器在 `Process.Start()` 前依次创建并预热 `Processor(_Total)\\% Processor Time`、创建并枚举 `GPU Process Memory`,随后写入子进程继承环境变量 `MBX_MEDIA_SAMPLER_READY=1`,最后才启动目标;无媒体 stub 在 ready 缺失时直接失败。测试同时静态断言上述初始化、ready 标志均位于 `Process.Start()` 前,消除了前序“目标先启动、采样器后冷初始化”的盲区。 - 独立冷启动复验:使用 3 个相互独立的 Python 进程分别启动全新 PowerShell 进程执行同一 Run 用例,结果连续 `3/3 PASS`;各次总耗时约 `18.557 s / 14.508 s / 14.260 s`,不依赖失败后的进程内重试或暖态复用。用例稳定证明唯一扫描 PID、扫描退出周期、后续逐页进程不延长扫描阶段、伪 NVDEC stdout/CPU 回退不能假通过,以及 `target exit=0 / sampler exit=3`。 - 独立回归:PowerShell parser=`PASS`;py_compile=`PASS`;两个 CLI help=`PASS`;project discover=`63/63 PASS / Ran 63 tests in 46.365 s`;H.264/H.265 NVDEC/forced CPU 合成链继续得到冻结的 `19 samples / 5 stable candidates / 3 selected pages / 6,10,18 s` 一致结果;`mbx validate --project project-info=OK / projects=1 / warnings=0`。 - 审核外部动作:业务源读取=`0`,业务 FFprobe/FFmpeg=`0`,真实片段生成=`0`,真实媒体运行=`0`,长媒体运行=`0`;仅执行获授权的无媒体桩、离线回归及临时合成媒体测试。 ### Findings - 无阻断 finding。 ### F3-R1-R1 闭环与冻结合同 1. `PASS / F3-R1-R1`:可能阻塞的性能计数器与 GPU 类别初始化已前移至目标启动前,显式 sampler-ready 握手又把测试 stub 的扫描启动约束在采样器就绪之后;全新进程三连跑稳定通过,前序冷/暖启动竞态已消除。 2. `PASS / preserved contracts`:F4-R1、F3 argv 子项、F1/F2/其余 F5、共享 named mutex、BelowNormal、4/2 线程、公开 CLI、页面/转写算法与业务输出、源保护、原子提交和失败清理均未发现回退;产品脚本及冻结文件哈希保持不变。 3. 本次修复仅涉及测试侧只读采样器、无媒体离线用例和对应说明/账本,没有新增产品模块、参数、服务或依赖,也没有触发任何业务媒体动作。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - F3-R1-R1:`CLOSED`;本任务实现审核的既有阻断至此全部关闭。 - 真实资源验收授权:`AUTHORIZED_EXACTLY_ONCE_UNDER_V001+V002`。允许开发员按冻结方案对既有源只读校验指纹后,仅生成一个独立 `<=600 s` 片段(既定目标为从 `00:30:00` 起约 `590 s`,必须复核实际时长不超过 600 秒),并仅运行一次 PPT 提取及资源采样,写入新的独立输出/证据目录。 - 授权限制:不得运行 3.57 小时源或 4 小时媒体,不得重试、调参、覆盖旧证据、并行转写或扩大范围;若生成、运行或资源门禁失败,应如实返回唯一失败证据,不得自行再次运行。完成后沿原任务链提交真实资源验收结果并交 `case_analysis.media_processor` 最终验收。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-IMPLEMENTATION-20260804-001 ## DEV-AUDIT-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-IMPLEMENTATION-20260804-001 - 记录时间:`2026-08-04T22:48:20+08:00` - 审核阶段:`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001` 对应 project 工具的独立实现审核;按上游即时收尾约束,本记录为当前冻结快照的一次性终态,不创建后继设计、返修复审或外部动作。 - 审核对象:`DEV-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-20260804-001` - 原生请求:`HANDOFF-INFODEV2-INFOREV-BILI-DYNAMIC-COLLECTOR-MVP-IMPLEMENTATION-20260804-001`;来源任务/回传任务:`019fbcbb-bed7-7c90-83ab-f50610f80d3a`;执行方=`dev.developer.project.secondary / infodev-2`;审核方=`dev.reviewer.project / inforev`。 - 需求:`ai-video-downloader/draft/2026-08-04-哔哩哔哩动态采集需求.md=4114/DC5807D6325AA13B1E0C72C92B9534003CC4F8046A1789AA70FCC98DECC9AB87`。 - 实现:`bili_dynamic_collector.py=49357/FFEA819A53DF15CFD2D92305F6926A4CCF3E261F436C315D9F0332EA8501918F`;示例配置=`658/0BF9F65C6AD08145EB933152CA44A4BA91742620540C7838B5E6A486760D9D6A`;测试=`10904/52E8269D82C676F4AB499F0A116B06E56F0FE4234D3EC36FA9BBA3137171E24A`;fixture=`1216/0CD53C7C93D7E05B4A913EBF5223366E3A06A17E2474DF52BC64F0BB4EBEA71F`;用法=`8763/1692918402CACF7A220F17E82C81825A2DFE500EBA86AE8F46BAFC6158509598`。 - 开发证据:worklog=`3714/A35C1F370ACF24561688609DE74D5B9C4741ACC4AE3BF9284963842DE7B60709`;selfcheck=`3624/A403750607C6BB91A67FDCB27B96C5855D32A8C0B57F9038A990DE69B6CB4D92`;执行账本=`DEV-LOG-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-IMPLEMENTATION-20260804-001`。 - 独立正向复验:py_compile=`PASS`;CLI help=`PASS`;目标 unittest=`6/6 PASS / 0.642 s`;project discover=`69/69 PASS / 51.946 s`;git diff check=`PASS`;交付文件 strict UTF-8=`PASS`、BOM=`NO`;`mbx validate --project project-info --governance=OK / projects=1 / warnings=0`。 - 独立反例全部只使用 `TemporaryDirectory`、脱敏 JSON 和数十字节非媒体文件;网络=`0`,浏览器=`0`,扩展=`0`,真实媒体=`0`,`F:\\video` 读写=`0`,正式 `ana-data` 读写=`0`。 ### Findings #### F1(阻断,流程/分类):当前事项具备重型合同,却以“无并发的轻量实现”绕过了编码方案门 - common 编码规范第 5.3 节把“多个阶段”“正式数据链路”“并发”“失败后代价较高”列为重型实现;本地规范也明确涉及重跑、并发或断点/恢复时应先有编码方案。 - 当前实现不是单一无状态小脚本:它有 `check / move-completed / handoff` 三阶段、append-only manifest 状态机、跨调用重跑/失败恢复、`StateLock` 并发互斥、跨目录复制/哈希/hard-link/manifest/源删除事务和正式原生交接草稿。开发计划第 850 行及总纲第 759 行声明“不含并发”,与 `StateLock` 第 130—164 行及所有命令统一持锁的第 1153 行直接矛盾。 - 因此“一个 Python 文件”不能替代重型判断;当前没有经独立审核的状态、事务、恢复和交接合同,已实现代码不能取得正式实现 PASS。 #### F2(阻断,代码/测试):`move-completed` 没有形成“每个已提供选择器都精确一致 + 一个源文件只对应一个实体”的批次预检 - `resolve_entity()` 只汇总能在历史 token map 中命中的选择器,未知选择器被静默忽略。独立反例给同一映射同时提供正确 BV 和错误 `dynamic_id=definitely-wrong`,实际仍返回 `exit=0 / COMPLETE / VIDEO_MOVED`;这违反需求中的“下载文件无法对应动态或目标不唯一立即停止”和交接声明的 exact queued-video mapping。 - 批次只检查目标路径重复,不检查规范化/解析后的源文件重复。独立反例把同一个 `one.mp4` 映射给两个不同视频实体,预检未停止;工具先把源提交给第一个实体并删除源,随后第二项以 `FileNotFoundError` 失败,最终 manifest 为“第一个 `VIDEO_MOVED`、第二个 `MOVE_FAILED`”,且已经产生一个目标文件。这是发生文件副作用后的迟发失败,不是批次 fail-fast。 - 现有 6 项测试没有覆盖混合正确/错误选择器、未知 selector、同一源对应多实体及“失败前零文件/零 manifest 副作用”。 #### F3(阻断,状态/重跑):`VIDEO_MOVED_SOURCE_RETAINED` 在原映射重跑时被降级成普通成功 - 首次源删除失败会正确返回 `exit=4 / COMPLETE_WITH_RETAINED_SOURCE / VIDEO_MOVED_SOURCE_RETAINED`,但 `preflight_move()` 把该状态直接折叠为 `ALREADY_MOVED`;汇总又只检查本次结果是否含 `VIDEO_MOVED_SOURCE_RETAINED`。 - 独立故障注入证明:首次为 `4 / COMPLETE_WITH_RETAINED_SOURCE` 且源仍存在;相同映射第二次变成 `0 / COMPLETE / ALREADY_MOVED`,源仍然存在。定时调用方会把未关闭的源保留告警误判为已完成,违反失败/重跑状态不得被掩盖的合同。 - 现有测试没有覆盖源删除失败后的同映射重跑。 #### F4(阻断,安全边界):秘密字段门禁没有覆盖工具自身持续读取的 manifest 状态 - `load_json()` 会对配置、动态导出和 mapping 调用 `reject_secret_keys()`,但 `load_manifest()` 解析每个事件后只检查 schema,不检查 secret/session 字段。 - 独立反例在 manifest 事件加入 `cookie=forbidden-value` 后再次运行 `check`,实际返回 `exit=0 / NO_NEW_ITEMS`,没有 `E_SECRET_FIELD` 安全停止。manifest 是三个命令共同读取的输入状态;这与事项总纲“不得读取或保存账号口令、cookie、token、验证码或浏览器会话”及提交所称“any secret/session field name is safety-stopped”冲突。 - 现有秘密测试只覆盖动态导出根字段,未覆盖 manifest、mapping/config 嵌套状态的统一门禁。 #### F5(阻断,正式交接合同):生成物使用 `` 标记却不是本项目可发送的原生交接 - 当前 917 字节草稿只有 project、message type、source/target role、status 和视频列表;缺少本项目工作说明规定的 `handoff_id`、source/target AI 与精确 thread、`reply_thread_id`,也缺少显式 `scope:`、`evidence:`、`expected_action:`。 - 文件虽标记 `DRAFT_REQUIRES_VIDEO_DOWNLOADER_CONFIRMATION / sent=false`,但用法明确让视频下载员确认后把正文作为 Codex 原生任务发送;直接发送会违反 canonical envelope 和 one-exact-target 合同。草稿应当生成可验证的完整 envelope,或改成不冒充 `` 的中性证据摘要并由发送方另行构造完整交接。 - 现有测试只断言草稿包含 DRAFT/local path 且可内容复用,没有校验原生必填字段和三个必填区段。 ### 已通过且可保留的部分 1. 时间窗上下界、offset-aware 时间、动态/opus/BV/URL 基础去重、Windows 安全 stem、相同输入不生成空待办,以及目标已存在不覆盖的正向合同有非真空测试并通过。 2. happy-path 的 partial → flush/fsync → SHA-256 → 同目录 hard-link no-overwrite → manifest → 源删除顺序合理;handoff 前重新核对本地文件范围和 SHA-256 的方向正确。 3. 代码没有网络、浏览器、扩展控制或原生发送实现;示例配置仅指向开发 tmp;本轮及开发证据均未触碰真实媒体、`F:\\video` 或正式 `ana-data`。 ### 当前冻结快照的安全使用边界 - `可安全保留`:源代码、说明、fixture、自检和现有测试可作为隔离开发样例留在当前工作区;可在一次性 `TemporaryDirectory` 或 `dev/tmp` 中,用完全可信、无秘密、人工核对且单实体单源的脱敏输入运行现有单元测试和演示性 `check`。 - `不可安全使用`:不得把当前快照交付为可用采集工具;不得对真实下载目录或正式视频执行 `move-completed`;不得用于定时/重叠生产调用;不得把生成的 Markdown 直接作为 Codex 原生 handoff 发送;不得依赖它对既有 manifest 的秘密字段或 retained-source 重跑给出可靠终态;不得写 `F:\\video` 或正式 `ana-data`。 - 正式输出路径未获授权是独立外部边界,不计入上述五项 finding;即使未来获得路径授权,也不能抵消当前代码/流程阻断。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`5` - 当前可向请求方交付的内容:仅限“冻结实现快照 + 离线测试结果 + 本 HOLD 风险清单”的终态开发摘要,不得宣称工具已通过或可正式运行。 - 后继动作:按上游即时收尾约束,本审核不创建设计请求、返修复审、外部授权、网络/浏览器/下载或正式数据动作;事项如在未来另行恢复,应由责任方重新建立明确授权和审计入口,本轮不自动续接。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-SAMPLER-ONLY-REPAIR-REREVIEW-20260804-001 - 记录时间:`2026-08-04T17:13:13+08:00` - 审核阶段:唯一真实 r1 资源验收失败后的 sampler-only 限定独立复审。 - 审核对象:`DEV-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-20260804-001` - MB-X 请求消息:`msg_20260804170453363_a3bf1918`;关联消息:`msg_20260804160056055_13e286dd`;请求交接:`HANDOFF-INFODEV-INFOREV-MEDIA-HOST-RESPONSIVENESS-SAMPLER-ONLY-REPAIR-REREVIEW-20260804-001`;前序授权:`HANDOFF-MEDIA-INFODEV-MEDIA-HOST-RESPONSIVENESS-SAMPLER-REPAIR-AUTH-20260804-001`;来源任务:`019fb7c5-b721-7332-b5c3-7120176fe016`。 - 执行方:`dev.developer.project / infodev`;独立审核方:`dev.reviewer.project / inforev`。 - 审核边界:只复审测试侧 `monitor_media_host_responsiveness.ps1`、对应无媒体/桩测试和必要说明中的首窗密度、FFmpeg 消失竞态、CSV previous/interval 一致性与 NVDEC 完整日志证据;两个产品脚本、公开 CLI、媒体算法/输出、r1 媒体/输出/证据和其他冻结合同均不重开。 - 本轮实物:`monitor_media_host_responsiveness.ps1=46515/A53BA7CD9806028460CF60AE6025624EB9BFA42E209A991CF1DDE7E899785177`;`test_extract_ppt_slides.py=76255/9FF695DAC3B819E7F3DCDF2EB48EE0EDB37D6E625BAC7F248BFAB9C4A537BC19`;`会议录屏PPT页面提取工具.md=12430/DE3B684093A6773CA4C39FF014B041CCD88A2A8ABA81EF94F372126AD956EC74`。 - 开发账本:`DEV-LOG-PROJECT-INFO-MEDIA-HOST-RESPONSIVENESS-SAMPLER-ONLY-REPAIR-20260804-001`;提交实物 `dev-doc/开发执行日志.md=138539/A9466E9F9241ADA8BE6303E10CCE5D6174A5D7C7A46E15F841B8AC4E348A24B1`。 - 冻结产品:`extract_ppt_slides.py=38070/DCA04653CB349CB6DE449A6D291344E3E5788FB035F07A6BB2670EBE1F11D30A`;`transcribe_media.py=25245/0A485447578DB24DEA84CB887041F6D0CCB3E00F3F40745965228F2D06EEED8F`,与 sampler 修复前冻结值一致。 - r1 保护核验只计算文件实物哈希、未读取媒体内容:`resource_samples.csv=162404/F85B2B90EF2F57245AC5BFD625AB7C3C09F09B3B06F11855D3E460561B58A839`;`resource_windows.csv=9264/E33DA3CF90AD23360183661E263E528185A13295BB5B7442D7E8D2FFC5E532C1`;`resource_summary.json=2650/4479CCB89A152693DCC39EF74569489E457440A896782BE7D0B02896545AAE29`;`run_summary.json=3257/A088EA2F244283CF996D4AE7B3D8B1AC3BD1E28C1B4DA112E22D8C37498C4045`,均与 r1 冻结值一致。 - 独立聚焦复验:以 3 个相互独立的 Python 进程分别启动全新 Windows PowerShell 进程执行同一 Run 桩,结果连续 `3/3 PASS`;总耗时约 `24.625 s / 19.369 s / 19.350 s`,用例自身耗时约 `22.700 s / 18.759 s / 18.746 s`,没有失败后重试或进程内暖态替代。 - 独立回归:PowerShell parser=`PASS`;py_compile=`PASS`;两个 CLI help=`PASS`;project discover=`63/63 PASS / Ran 63 tests in 46.941 s`;H.264/H.265 NVDEC/forced CPU 四条离线合成链继续为 `19 samples / 5 candidates / 3 pages / 6,10,18 s`,PNG/PDF/RGB/顺序/尺寸一致;范围内文件 strict UTF-8=`PASS`、BOM=`NO`;`mbx validate --project project-info=OK / projects=1 / warnings=0`。 - 审核外部动作:业务源读取=`0`,真实片段生成=`0`,真实媒体运行=`0`,重试=`0`,调参=`0`,长媒体运行=`0`;只执行无媒体桩、静态检查和获授权的离线临时合成测试。 ### Findings - 无阻断 finding。 ### 四项 sampler-only 闭环 1. `PASS / 首窗密度`:目标启动前已完成 CIM `Win32_Process`、nvidia-smi GPU/decode 与 compute-process 预热;500 ms 调度落后时仅将下一次安排为 `elapsed+1 ms` 做单次受控追赶,未修改 500 ms 周期、每个完整窗至少 10 个成员、最大间隔 1.5 秒、CPU 严格 `<85%` 或连续高段 `10.000 s` 门禁。三个全新 Run 桩均只报告预期的 `nvdec_scan_argv_invalid`,没有首窗密度问题或 9 成员窗。 2. `PASS / FFmpeg 消失竞态`:只有 Toolhelp 快照已识别 FFmpeg,且命令行/进程属性读取出错后二次确认 PID 已退出时才计入 `command_line_disappearance_race_count` 并容忍;仍存活但 CIM 无行、命令行空或属性不可读时继续硬失败。24 个短命逐页 FFmpeg 加 100 ms CIM 延迟稳定产生 `race_count>0`,但没有额外 sampling error,也没有延长已关闭的扫描阶段。 3. `PASS / CSV previous/interval`:`PreviousCounterTimestamp` 与 `FirstCounter` 只在 `$Samples.Add(...)` 成功后推进;扫描结束后注入的唯一一次提交前异常不会污染下一条已提交行。聚焦用例逐行复算并证明 `previous_valid_timestamp_utc` 等于上一条已提交 `timestamp_utc`,`interval_seconds` 与两者差值一致,Analyze 没有 previous/interval 问题。 4. `PASS / NVDEC 日志证据`:目标 stdout/stderr 自启动后即以 `ReadToEndAsync()` 消费,并在目标退出后完整 `GetResult()`、一次写入 UTF-8 无 BOM 文件;NVDEC 正式日志门禁使用 ASCII `NVDEC/CUDA ()`。桩证明完整日志证据为 true,但缺失 `-hwaccel_output_format cuda` 的 argv 证据仍为 false,最终 `target exit=0 / sampler exit=3 / resource_acceptance_pass=false`,日志不能绕过命令合同。 ### 冻结合同 1. `PASS`:两个产品脚本及产品合同未修改;F1/F2/F3-R1-R1/F4-R1/其余 F5、共享 named mutex、BelowNormal、4/2 线程、公开 CLI、页面/转写算法与业务输出、源保护、原子提交和失败清理均未发现回退。 2. `PASS`:r1 的媒体、输出及四份核心资源证据保持原 bytes/SHA-256,r1 的 `BLOCKED_RESOURCE_SAMPLER_EVIDENCE_INVALID_NO_RERUN` 历史事实没有被覆盖或改写。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - sampler-only 修复:`CLOSED`。 - r2 授权:`AUTHORIZED_EXACTLY_ONCE_REUSE_EXISTING_CLIP`。允许按请求方既有授权只复用已经生成并冻结的 `593.120 s` 独立片段执行唯一一次 PPT 提取与资源采样,输出到全新的 r2 目录;不得重新截片、读取或运行长业务源、覆盖 r1、重试、调参、并行转写或扩大范围。 - r2 失败处理:若目标、采样或任一资源/证据门禁失败,必须保留并回传该唯一 r2 的真实失败证据,不得再次运行。完成后沿原任务链提交给 `case_analysis.media_processor` 最终验收。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V001-DESIGN-20260804-001 - 记录时间:`2026-08-04T23:38:23+08:00` - 审核阶段:前序实现 `HOLD/5` 的最小重型修复方案独立审核。 - 审核对象:`DEV-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-20260804-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`。 - 请求交接:`HANDOFF-INFODEV2-INFOREV-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V001-DESIGN-20260804-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`;执行方=`dev.developer.project.secondary / infodev-2`;审核方=`dev.reviewer.project / inforev`。 - 设计:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V001.md=11917/16C14FB2751A0EAB63F76371E75D0569FF8EF5B47FDD8724BE861314B6062733`;strict UTF-8=`PASS`;BOM=`NO`;引用目标=`8/8 EXISTS`;目录导读、总纲、计划和开发员 worklog 均已有设计待审入口。 - 前序审核:`DEV-AUDIT-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-IMPLEMENTATION-20260804-001=HOLD/5`。 - 角色/路由核验:`dev.reviewer.project` 有权写本审计入口;`case_analysis.video_downloader / video-downloader / 019fcc5d-798f-7ea1-8325-3a4d1f2dc5a5` 与 `case_analysis.media_processor / media-processor / 019fb7a4-bdfd-79f2-bd6b-e67e2b7d8efd` 均与当前 `mbx.project.yaml`、项目配置清单一致。 - 冻结基线独立复核:实现仍为 `49357/FFEA819A53DF15CFD2D92305F6926A4CCF3E261F436C315D9F0332EA8501918F`;测试仍为 `10904/52E8269D82C676F4AB499F0A116B06E56F0FE4234D3EC36FA9BBA3137171E24A`;实际 fixture 为 `dev/project-dev/test/fixtures/bili_dynamic_collector/dynamic_items.json=1216/0CD53C7C93D7E05B4A913EBF5223366E3A06A17E2474DF52BC64F0BB4EBEA71F`。代码、测试和 fixture 与前序审计冻结实物一致,本轮实现变化=`0`。 - 提交证据校正(非阻断):本次原生请求中的 frozen code/test SHA-256 被错误抄写,且把 fixture 写成不存在的 `dev/project-dev/test/fixtures/bili_dynamic_export.json`;因审核员已用实物和前序审计逐项恢复唯一正确基线,本次不把可校正的交接录入错误升级为方案阻断,但后续复审交接必须使用上述真实路径与哈希。 - 外部动作:网络=`0`;浏览器=`0`;下载=`0`;真实媒体=`0`;`F:\\video`=`0`;正式 `ana-data`=`0`;实现/测试/fixture 修改=`0`。 ### Findings #### F1(阻断,设计/重跑):F2 批次源身份预检与 F3 终态重跑表的执行顺序互相冲突 - V001 第 4.2 节要求“每项预检解析源文件后形成 source identity”,并以 `resolve(strict=True)`/`stat` 为整个 mapping 批次执行重复源检查;第 5 节同时冻结 `VIDEO_MOVED / COMPLETE -> ALREADY_MOVED / exit 0`,以及 `VIDEO_MOVED_SOURCE_RETAINED -> 原告警 / exit 4`。第 3 节还明确:即使 retained source 被人工删除,工具也不能猜测告警已解决。 - 正常 `VIDEO_MOVED` 成功后原源文件按合同已经删除;retained source 也允许后来被人工删除但告警仍必须粘性。若照第 4.2 节的“每项严格解析源”先执行,这两类重跑都会因源不存在提前失败,无法到达第 5 节的 `ALREADY_MOVED` 或粘性 exit 4;若先按状态短路,第 4.2 节“一切 mapping 均参与 source identity”的文字又不成立。 - 测试矩阵只冻结 retained source 仍存在时的同 mapping 重跑,没有冻结普通成功移动后源已删除的 mapping 重跑,也没有覆盖 retained source 已被人工删除后的粘性重跑,因此不能靠验收矩阵消除该实现分叉。 ### 最小 required fix 1. 明确冻结预检顺序:所有 mapping 先做完整 selector exact resolution 和批次 entity 唯一性;随后按最新状态分类。 2. `VIDEO_MOVED / COMPLETE` 必须在不要求 `source_file` 仍存在、不做物理 source identity 的情况下返回 `ALREADY_MOVED / exit 0`;`VIDEO_MOVED_SOURCE_RETAINED` 必须同样不依赖源仍存在,直接复用 manifest 的 local file/hash/failure reason 返回粘性 `exit 4`,且不追加事件。 3. 只有需要实际移动的 `TODO_QUEUED / MOVE_FAILED` 项进入源存在性、下载目录、reparse、age、扩展名、物理 source identity、重复源、目标唯一性和零副作用批次预检;明确终态 no-op 项不参加物理源重复判定。 4. 增加三组非真空入口回归:普通成功移动后源已删除的同 mapping 重跑;retained source 仍存在的同 mapping 重跑;retained source 已被人工删除的同 mapping 重跑。三组分别断言 exit/status、目标/hash、manifest bytes 和无额外副作用;并保留 active move 的同源/同实体混合批次零副作用反例。 ### 已闭环且冻结的部分 1. `PASS / F1`:事项已纠正为重型,代码/测试门禁、模块职责、状态/事务/失败范围和分层验收入口明确;计划、总纲和目录入口已同步,V001 PASS 前实现保持冻结。 2. `PASS / F2 其余部分`:每个已提供 selector 必须存在、唯一且指向同一实体;mapping URL 走登记 host 规范化;active move 的同源、同实体和目标批次唯一性以及预检错误零正式文件/零 manifest 副作用方向正确。 3. `PASS / F4`:manifest 每行 JSON parse 后、schema/identity/state 消费前递归走共同 secret-key gate;三个命令共享,错误只泄露字段路径、不泄露值且不改写业务状态。 4. `PASS / F5`:精确 source/target/reply 路由与当前项目配置一致;完整 envelope 的必填身份、`scope/evidence/expected_action`、稳定内容寻址 handoff ID、JSON 转义视频证据、不同 `--now` 字节稳定复用及 `sent=false` 边界足以指导实现。 5. `PASS / preserved boundaries`:公开 CLI、时间窗/基础去重/Windows 命名、no-overwrite、copy/fsync/hash/link/manifest/delete happy path、handoff 文件范围与哈希复核,以及无网络/浏览器/下载/自动发送/正式路径动作均未被方案回退。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`1` - 实现授权:`DENIED_PENDING_F1_CLOSURE`;代码、示例配置、测试和 fixture 继续冻结。 - 复审边界:只需提交上述“终态分类先于 active source identity”的单点闭环及对应测试矩阵;已通过部分不重开,不增加网络、浏览器、下载、调度、正式数据或产品能力。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V002-F1-DESIGN-REREVIEW-20260805-001 - 记录时间:`2026-08-05T00:08:59+08:00` - 审核阶段:V001 `HOLD/1` 的 `F1_DESIGN_RERUN_PREFLIGHT_ORDER_CONFLICT` 限定方案复审。 - 审核对象:`DEV-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-20260804-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`。 - 请求交接:`HANDOFF-INFODEV2-INFOREV-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V002-F1-DESIGN-20260804-001`;前序=`HANDOFF-INFOREV-INFODEV2-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V001-DESIGN-REVIEW-RESULT-20260804-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 组合设计:V001=`11917/16C14FB2751A0EAB63F76371E75D0569FF8EF5B47FDD8724BE861314B6062733`;V002=`6342/DA3B3DDAA3C8B8EE33E2C0B6857B962754D740EB4BEE075E3BFB0F0FD4382736`;V002 strict UTF-8=`PASS`、BOM=`NO`、trailing whitespace=`0`;目录导读已登记 V002。 - 冻结基线:代码=`49357/FFEA819A53DF15CFD2D92305F6926A4CCF3E261F436C315D9F0332EA8501918F`;测试=`10904/52E8269D82C676F4AB499F0A116B06E56F0FE4234D3EC36FA9BBA3137171E24A`;fixture=`1216/0CD53C7C93D7E05B4A913EBF5223366E3A06A17E2474DF52BC64F0BB4EBEA71F`,均与前序冻结值一致;实现/配置/测试/fixture 变化=`0`。 - 治理校验:`OK / projects=1 / warnings=0`。 - 外部动作:网络=`0`;浏览器=`0`;下载=`0`;真实媒体=`0`;`F:\\video`=`0`;正式 `ana-data`=`0`。 ### Findings #### F1-R1(阻断,设计/状态安全):V002 用“或没有移动终态”重新扩大了 `ACTIVE_MOVE` 状态集合 - V001 第 5 节已冻结的精确状态表只允许 `TODO_QUEUED / MOVE_FAILED` 进入实际移动,其他状态必须安全停止;该合同在上一轮已通过且本轮声明不重开。 - V002 第 2.1 节第 4 项却把 `ACTIVE_MOVE` 定义为 `TODO_QUEUED`、`MOVE_FAILED`“或没有移动终态”,第 3 节矩阵再次写成 `TODO_QUEUED / MOVE_FAILED / 无终态`。这会允许实现者把 `PROCESSING_HANDOFF_CONFIRMED`、`PROCESSING`、`PROCESSING_FAILED`、缺失或未知状态等“尚无移动终态”的行误送入源/目标预检和移动事务,而不是沿 V001 的 `E_STATUS` 安全停止。 - 该问题不是重开已通过状态合同,而是 V002 新增分类文字造成的真实回退;V001 原文没有该扩大项,因此上一轮无法报告。若不消除,终态分类先于源预检虽已闭环,状态准入仍存在两种相反实现。 ### 最小 required fix 1. 删除 `ACTIVE_MOVE` 定义和矩阵中的“或没有移动终态 / 无终态”;明确只有最新状态严格等于 `TODO_QUEUED` 或 `MOVE_FAILED` 才可进入阶段 B。 2. 明确 `PROCESSING_HANDOFF_CONFIRMED`、`PROCESSING`、`PROCESSING_FAILED`、缺失状态和任意未知状态均为 `E_STATUS / SAFETY_STOP`,在阶段 B、复制、目标创建、源删除和 manifest 追加前终止,所有业务文件与 manifest raw bytes 不变。 3. 增加一个参数化 CLI/main 入口反例覆盖上述非允许状态,断言 exit 3、`E_STATUS` 和零业务副作用;不得借此改变 V001 其他状态、退出码或范围。 ### 已闭环且继续冻结 1. `PASS / 原 F1 顺序冲突`:V002 已明确 all-selectors + entity uniqueness → latest-state classification → terminal projection;只有 active rows 进入物理源/目标预检。普通 moved 源已删除、retained 源存在、retained 源人工删除三组入口测试均明确比较原始 manifest bytes 和无额外副作用。 2. `PASS / terminal projection`:`TERMINAL_MOVED` 与 `TERMINAL_RETAINED` 均不依赖当前源存在,不参加 source identity/目标写入集合;retained 告警粘性、整体 exit 4 与不追加事件明确。 3. V001 已通过的重型分类、F2 精确选择器与 active 批次唯一性、F4、F5 以及全部 preserved boundaries 不重开。 ### 第三轮 HOLD 收敛说明 - 本事项已达到本地审计规范的连续第三轮 `HOLD` 收敛节点。本记录已一次列全当前组合设计可发现的剩余阻断,并说明该项源于 V002 新增文字。 - 后续只允许一次性删除上述状态扩大并补对应参数化反例;不得再以微观字段逐轮追加设计。若相同事实仍未闭环或出现无新关键事实的继续分叉,应按规范升级管理/人工裁决或缩小范围,不继续串行加码。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`1` - 实现授权:`DENIED_PENDING_F1_R1_CLOSURE`;实现、配置、测试和 fixture 继续冻结。 - 复审边界:仅核对 `ACTIVE_MOVE` 严格 allowlist、所有其他状态 fail-fast 和参数化零副作用反例;原 F1 顺序闭环及所有已通过合同不重开。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V003-ALLOWLIST-FINAL-DESIGN-REREVIEW-20260805-001 - 记录时间:`2026-08-05T00:31:40+08:00` - 审核阶段:连续第三轮 HOLD 收敛后的 `F1_R1_ACTIVE_MOVE_ALLOWLIST_REGRESSION` 最终单点方案复审。 - 审核对象:`DEV-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-20260804-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`。 - 请求交接:`HANDOFF-INFODEV2-INFOREV-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V003-ALLOWLIST-DESIGN-20260805-001`;前序=`HANDOFF-INFOREV-INFODEV2-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V002-F1-DESIGN-REREVIEW-RESULT-20260805-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 组合设计:V001=`11917/16C14FB2751A0EAB63F76371E75D0569FF8EF5B47FDD8724BE861314B6062733`;V002=`6342/DA3B3DDAA3C8B8EE33E2C0B6857B962754D740EB4BEE075E3BFB0F0FD4382736`;V003=`3197/D5812302D994C9D1835E5EA5BEEF305FAEDEBA892CDCAC0E545EF82EC1BDEBDA`。 - V003 质量:strict UTF-8=`PASS`;BOM=`NO`;trailing whitespace=`0`;目录导读已登记 V003。 - 冻结基线:代码=`49357/FFEA819A53DF15CFD2D92305F6926A4CCF3E261F436C315D9F0332EA8501918F`;测试=`10904/52E8269D82C676F4AB499F0A116B06E56F0FE4234D3EC36FA9BBA3137171E24A`;fixture=`1216/0CD53C7C93D7E05B4A913EBF5223366E3A06A17E2474DF52BC64F0BB4EBEA71F`;实现/配置/测试/fixture 变化=`0`。 - 治理校验:`OK / projects=1 / warnings=0`。 - 外部动作:网络=`0`;浏览器=`0`;下载=`0`;真实媒体=`0`;`F:\\video`=`0`;正式 `ana-data`=`0`。 ### Findings - 无阻断 finding。 ### F1-R1 闭环 1. `PASS / 精确 allowlist`:V002 的“或没有移动终态 / 无终态”已显式废止;只有最新状态严格等于 `TODO_QUEUED` 或 `MOVE_FAILED` 才分类为 `ACTIVE_MOVE` 并进入阶段 B。 2. `PASS / fail-fast`:`PROCESSING_HANDOFF_CONFIRMED`、`PROCESSING`、`PROCESSING_FAILED`、缺失/空白 status 和任意未知状态均在阶段 A 返回 `E_STATUS / SAFETY_STOP / exit 3`,不得 stat/resolve 源、进入阶段 B、复制、创建目标、删除源或追加 manifest。 3. `PASS / 非真空验收`:参数化 CLI/main 入口逐项覆盖六类禁止状态;每例冻结 stdout、exit、manifest raw bytes、哨兵源、业务目录树、文件哈希、partial、lock 和新增事件断言,足以证明零业务副作用。 4. `PASS / 组合一致性`:V003 只修正 V002 的活动状态分类,不改变 V001/V002 已通过的终态投影、selector、批次唯一性、secret gate、canonical handoff 或范围边界。 ### 冻结实施合同 - 唯一实施依据:V001 + V002 + V003 组合;发生文字冲突时,V003 的 ACTIVE_MOVE 精确 allowlist 优先于 V002 被废止的两处宽泛表述。 - 允许开发员一次性实现前序 HOLD/5 五项并执行获授权的纯离线目标测试、参数化反例、新鲜 TemporaryDirectory smoke 和 project 回归。 - 不授权网络、浏览器、扩展、下载、真实媒体、调度、自动原生发送、`F:\\video` 或正式 `ana-data`;实现完成后仍须提交一次限定独立实现审核,PASS 前不得宣称工具可正式使用。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 方案状态:`V001+V002+V003_APPROVED_FOR_LIMITED_IMPLEMENTATION`。 - 管理升级:`NOT_REQUIRED`;第三轮收敛节点的唯一剩余阻断已完整关闭,没有继续串行设计分叉。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-IMPLEMENTATION-20260805-001 - 记录时间:`2026-08-05T01:28:48+08:00` - 审核阶段:V001+V002+V003 `PASS/0` 合同下的 HOLD/5 限定独立实现复审。 - 审核对象:`DEV-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-20260804-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`。 - 请求交接:`HANDOFF-INFODEV2-INFOREV-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-IMPLEMENTATION-20260805-001`;前序=`HANDOFF-INFOREV-INFODEV2-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-V003-ALLOWLIST-DESIGN-REVIEW-RESULT-20260805-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 冻结设计:V001=`11917/16C14FB2751A0EAB63F76371E75D0569FF8EF5B47FDD8724BE861314B6062733`;V002=`6342/DA3B3DDAA3C8B8EE33E2C0B6857B962754D740EB4BEE075E3BFB0F0FD4382736`;V003=`3197/D5812302D994C9D1835E5EA5BEEF305FAEDEBA892CDCAC0E545EF82EC1BDEBDA`。 - 实现实物:code=`56152/9B5C6FCE647C8E18822AB53488A57B6048A09997B62024B8FD2B593F0196DABF`;config=`1117/42A9AA7EE29ED061DC408C6C9A907FA7B20FD8C2B41605C54B6716A0FE388951`;tests=`24767/684F78F944F045C1352E4C09BFAFE598B7B5E9B5195EC944F5AF87D70EACC0D3`;fixture=`1216/0CD53C7C93D7E05B4A913EBF5223366E3A06A17E2474DF52BC64F0BB4EBEA71F`(未修改)。 - 文档/证据:工具说明=`10763/E976BDECE48D952B29AC65438C2E5891A67E29D1500DDD1D4B54889CDA224B48`;实现证据=`4648/D484E2CCED3213F257C2CCC819EBD4643AF818BE878C3E0D15F42BCBA10FB784`;selfcheck=`2223/34FD25217F3E0AE094B08C56C731AFAE49F648B85F634E5A58C8FAC5E467AB7F`;worklog=`7622/FD0F0A5B7B6F2D5BF01DFEC23CEFB1C3C4B58E673703252F03F4DCD558B258E2`。 - 独立正向复验:py_compile=`PASS`;CLI help=`PASS`;目标 unittest=`11/11 PASS / 1.426 s`;独立 fresh smoke=`1/1 PASS / 0.228 s`;project discover=`74/74 PASS / 48.897 s`;git diff check=`PASS`;交付文件 strict UTF-8=`PASS`、BOM=`NO`;治理=`OK / projects=1 / warnings=0`。 - 独立反例只使用 `TemporaryDirectory`、净化 JSON 和数十字节非媒体文件;网络=`0`、浏览器=`0`、扩展=`0`、下载=`0`、真实媒体=`0`、调度=`0`、native send=`0`、`F:\\video`=`0`、正式 `ana-data`=`0`。 ### Findings #### F1(阻断,代码/状态证据):terminal projection 没有验证被称为“可信”的持久化字段 - `classify_move_mapping()` 只按 status 把 `VIDEO_MOVED / COMPLETE` 和 `VIDEO_MOVED_SOURCE_RETAINED` 归为终态;`move_completed()` 第 1086、1097 行随后用 `event.get()` 直接投影 `local_file`、`sha256` 和 `failure_reason`,没有检查这些字段是否存在、非空或符合状态合同。 - 独立入口反例构造 schema version 正确、selector 可解析但 `VIDEO_MOVED` 的 `local_file=null / sha256=null` 的 manifest;源文件按正常成功重跑场景不存在。实际结果为 `exit=0 / COMPLETE / ALREADY_MOVED / target=None / sha256=None`,把不完整持久状态错误宣称为成功,违反 V002“直接使用 manifest 中已经持久化的可信字段”和需求的 manifest 可追溯性。 - 同一缺口会让 retained 状态在缺少目标、hash 或失败原因时仍返回 exit 4,而不是对坏 manifest fail closed。现有三组重跑测试只覆盖字段完整的工具自产事件,未覆盖缺失/畸形终态证据。 #### F2(阻断,代码/正式交接安全):canonical native handoff 可被 manifest 证据字段注入额外 envelope 行 - `load_manifest()` 只检查 schema version、entity_id 为字符串及 dedupe_keys 类型,没有重新验证 terminal/handoff 事件中的 `entity_id`、`bvid`、`published_at` 等消费者字段。`handoff_markdown()` 第 1218—1220 行把这三个值原样插入行文本;只有 title、source URL 和 local path 使用 JSON 转义。 - 独立入口反例保留合法本地视频和真实匹配 SHA-256,只把 manifest `bvid` 改为 `BV1SAFE00000\nstatus=FORGED`。`handoff` 实际返回 `exit=0` 并生成文件,其中出现独立的 `status=FORGED` 行。内容寻址 ID 和 `sent=false` 不能消除正文注入;该文件不再是可直接发送的 canonical native envelope。 - 路由字段换行注入测试只覆盖 config;现有 handoff 正向测试没有覆盖 persistent manifest evidence injection,也没有证明全部未转义标量均满足安全格式。 ### 最小 required fixes 1. 在共同 manifest 消费边界增加状态感知验证,或在 terminal projection 前执行等价共同验证:`VIDEO_MOVED / COMPLETE` 必须有非空 `local_file` 和 64 位小写十六进制 SHA-256;`VIDEO_MOVED_SOURCE_RETAINED` 还必须有非空 `failure_reason`。缺失、空白或畸形字段统一 `E_MANIFEST / SAFETY_STOP / exit 3`,不得返回 ALREADY/retained 成功、不得写业务文件或 manifest。 2. 在生成 handoff 前验证所有原样插值的 manifest 标量,至少冻结内部 entity_id、可选 BV、offset-aware canonical published_at 和 SHA-256 的安全格式;或把所有证据标量改为不会产生新行的规范 JSON 序列化。任何控制字符、换行或格式不合法必须在创建 handoff 文件前安全停止,错误输出不得回显注入值。 3. 增加非真空 CLI/main 反例:参数化缺失/空白/畸形 terminal `local_file/sha256/failure_reason`;参数化 `entity_id/bvid/published_at` 换行或控制字符注入。每例断言 exit 3、明确错误码、manifest/source/target/handoff 原始 bytes 与目录树不变、无 partial/lock/event,stdout 不含注入值。 4. 修复后复跑现有 11 项目标测试、fresh smoke 和 project discover,并同步工具说明、实现证据、自检、执行日志及冻结哈希;不需要新设计或任何外部/真实运行。 ### 已通过且冻结的部分 1. `PASS / F1 重型门禁`:实现确在 V003 PASS 后开始,设计、实现、测试和证据入口齐全。 2. `PASS / F2 mapping`:所有 selector 独立唯一且同行一致;全批 entity 唯一先于分类;只有 TODO/MOVE_FAILED 进入阶段 B;同物理源/同实体/目标冲突均在业务写入前停止,预检不追加 MOVE_FAILED。 3. `PASS / F3 正常路径`:字段完整的 moved 与 retained 事件在源存在/删除三类重跑中保持 exit/status、目标/hash/失败原因和 manifest raw bytes;sticky 语义正确。 4. `PASS / F4`:manifest 每行 parse 后即递归 secret gate,三个命令共享,字段值不出 stdout,状态不改写。 5. `PASS / F5 其余部分`:route 必填/格式/配置注入门禁、完整 source/target/reply 与三段正文、稳定 24-hex handoff ID、跨 `--now` bytes 复用、文件范围/hash 复核和 `sent=false` 均符合合同。 6. 公开 CLI、窗口/去重/命名、no-overwrite、copy/fsync/hash/link/manifest/delete happy path以及无网络/浏览器/下载/自动发送/正式路径范围未回退。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`2` - 正向测试:全部通过,但未覆盖上述两个 fail-closed 反例,不能据此放行。 - 实现授权:`DENIED_PENDING_F1_F2_CLOSURE`;当前代码仍只可作为隔离开发快照,不得对真实下载目录执行移动,不得把生成 handoff 发送或宣称正式可用。 - 复审边界:只复审状态感知 manifest 证据验证、handoff 标量防注入、对应反例及更新后的冻结证据;已通过部分不重开,无需新设计、网络、浏览器、下载、真实媒体或正式路径动作。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-HOLD2-FAIL-CLOSED-LIMITED-IMPLEMENTATION-REREVIEW-20260805-001 - 记录时间:`2026-08-05T15:36:35+08:00` - 审核阶段:前序实现 `HOLD/2` 的 F1/F2 fail-closed 限定独立复审。 - 审核对象:`DEV-PROJECT-INFO-BILI-DYNAMIC-COLLECTOR-MVP-20260804-001`;需求:`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`。 - 请求交接:`HANDOFF-INFODEV2-INFOREV-BILI-DYNAMIC-COLLECTOR-MVP-HOLD2-FAIL-CLOSED-REREVIEW-20260805-001`;前序交接:`HANDOFF-INFOREV-INFODEV2-BILI-DYNAMIC-COLLECTOR-MVP-HOLD5-REPAIR-IMPLEMENTATION-REVIEW-RESULT-20260805-001`;来源/回传任务:`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 审核边界:只复审 F1 terminal persisted evidence fail-closed、F2 native handoff manifest scalar CR/LF/格式注入 fail-closed,以及已冻结合同是否回退;不重开此前通过项,不新增设计、产品或外部能力。 - 实现实物:code=`60090/67B2E6FB34F100C57BF50A4D3067D6FDD6E47C5D3FBEF58D2CF5D8796B07AB8B`;tests=`31303/D82BFF8AD9B78FD749A7536FF9FED0486CF87D6B9FDDEE7947202C2414AAE322`;config=`1117/42A9AA7EE29ED061DC408C6C9A907FA7B20FD8C2B41605C54B6716A0FE388951`;fixture=`1216/0CD53C7C93D7E05B4A913EBF5223366E3A06A17E2474DF52BC64F0BB4EBEA71F`,均与提交值一致。 - 文档/证据:工具说明=`11553/63E5AE5E431B3D9647A2CA2BF3A39061D97B2935A7C43B55ECAA9958DF5BB0F5`;实现证据=`7323/00DE95503724AC47EA3D1383DCAA10A37567031F98C4710B1F52A651C7D9FA5C`;selfcheck=`3183/986B2F1706BE2253D8AA37CC3E4A69E4913C3465F456EFCC8FCD41DC8E825331`;worklog=`8717/0EB09F474F3A8BB2A0637D31A086257C9CF376D3D607FCDFB9F772881673DD40`,均与提交值一致。 - 独立验证:前序两组原始阻断反例=`2/2 PASS / 0.919 s`;目标 unittest=`13/13 PASS / 2.452 s`;project discover=`76/76 PASS / 58.021 s`;`py_compile`、CLI help、`git diff --check`、范围文件 strict UTF-8/no BOM 均 `PASS`;治理=`OK / projects=1 / warnings=0`。 - 外部动作:network=`0`;browser=`0`;extension=`0`;download=`0`;real media=`0`;schedule=`0`;native send=`0`;`F:\video`=`0`;正式 `ana-data`=`0`。 ### Findings - 无阻断 finding。 ### F1/F2 闭环 1. `PASS / F1`:`validate_terminal_manifest_evidence()` 在 `load_manifest()` 共同消费边界验证全部视频 `VIDEO_MOVED`、`COMPLETE` 与 `VIDEO_MOVED_SOURCE_RETAINED` 事件,`classify_move_mapping()` 在终态投影前再次防御性验证。非空且无控制字符的 `local_file`、64 位小写十六进制 SHA-256,以及 retained 必需的非空无控制字符 `failure_reason` 均已成为 fail-closed 前置条件;缺失、空白、控制字符或错误格式统一返回 `E_MANIFEST / SAFETY_STOP / exit 3`,不再投影 ALREADY/retained 成功。 2. `PASS / F1 反例`:9 组 CLI/main 参数化用例覆盖 terminal 字段缺失、空白、控制字符及非小写 hash;逐例证明完整业务树、manifest raw bytes、目标、事件与锁保持不变,污染值不进入 stdout。前序 `local_file=null / sha256=null` 成功误投影根因已关闭。 3. `PASS / F2`:`validate_handoff_manifest_evidence()` 在 handoff 文件创建前验证 24 位小写内部 entity ID、可选 BV 格式、canonical UTC `published_at`、64 位小写 SHA-256,以及无控制字符的 title/source URL/local path;任何 CR/LF、其他控制字符或格式异常均安全停止,错误只报告字段路径,不回显污染值。 4. `PASS / F2 反例`:10 组 CLI/main 参数化用例覆盖 entity ID/BV/time 格式错误及 entity/BV/time/title/source URL/local path/hash 的 CR/LF 注入;逐例均为 `E_MANIFEST / exit 3`,不创建 handoff/partial/event、不残留锁,manifest、目标与完整业务树不变。前序 `bvid` 注入独立 `status=FORGED` 行的根因已关闭。 5. `PASS / preserved contracts`:本轮代码变化限定于上述共同验证及对应测试/说明;此前通过的 mapping、状态 allowlist、retained-source 重跑、secret gate、route/canonical envelope、公开 CLI、去重/命名、no-overwrite、原子移动/manifest 顺序及无外部能力边界未发现回退。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 前序 HOLD/2:`CLOSED` - 交付边界:该冻结实现可向请求方作项目工具交付;本 PASS 不等同于 `F:\video`、正式 `ana-data`、网络、浏览器、下载、自动 native send 或调度授权,正式输出路径及外部动作仍须由既有责任方另行明确授权。 - 后继评审:`NOT_REQUIRED_FOR_THIS_CLOSURE`;无需新增设计、真实运行或继续追加评审链。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-CHROME-DOWNLOAD-BRIDGE-DURATION-GATE-LIMITED-REREVIEW-20260805-001 - 记录时间:`2026-08-05T18:22:39+08:00` - 审核阶段:既有审核任务恢复后的时长一致性 fail-closed 限定独立实现/输出复审。 - 审核对象:`DEV-PROJECT-INFO-BILI-CHROME-DOWNLOAD-BRIDGE-20260805-001`;需求:`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`。 - 恢复交接:`HANDOFF-INFOADMIN-INFOREV-BILI-BRIDGE-DURATION-GATE-REREVIEW-RECOVERY-20260805-001`;correlation message:`msg_20260805173417306_68438e3d`;来源管理任务:`019fbb4d-2ccb-7bd2-93bc-f57332d484a9`;开发员任务:`019fb7c5-b721-7332-b5c3-7120176fe016`;请求方任务:`019fcc5d-798f-7ea1-8325-3a4d1f2dc5a5`。 - 审核边界:只复审 B 站完整视频下载桥的远端/本地时长一致性 fail-closed 修复,以及相关 multi-P/preview/authentication 边界;不创建替代任务、审计链或管理复审层,不重开已验收首个视频。 - 冻结实物:code=`22229/541CD9A57E23976614B80CF731C6D4D49361A29BFBC029E9053C8E7093EC18F1`;tests=`15416/BDE24A5BE26BC10F534EA1BF7235B8066EDA6425BB432C06AC67BBD560EFA168`;example=`410/1581168C73BD0C320E46D42FE104CCB3594A3BF3D216098671794B2FB69868CC`;usage=`4423/40794C7933E8C6715DE558893D920B24652C494B100A7EDA3B34D9C6C97D750D`;worklog=`3262/F4CA408D1499A8CCDA536E462BE0F3EF3AF02E9ED993B50C01BE54FE98C68AC5`;需求=`4114/DC5807D6325AA13B1E0C72C92B9534003CC4F8046A1789AA70FCC98DECC9AB87`,均与冻结值一致。 - 独立验证:`py_compile=PASS`;CLI help=`PASS`;目标 unittest=`15/15 PASS / 0.096 s`;project discover=`91/91 PASS / 54.533 s`;目标文件 `git diff --check=PASS`;交付文件 strict UTF-8/no BOM=`PASS`;治理=`OK / projects=1 / warnings=0`。 - 独立定向反例:远端 `3133.95 s`、本地 `600.133313 s` 在任何发布预检与正式输出前抛出时长一致性错误;远端 `1206.067 s`、本地 `1206.067664 s` 通过,差值约 `0.000664 s`、门限 `3.0 s`;`needs_auth`、`premium_only`、`private`、`subscriber_only`、playlist 与 entries 六类状态均 fail closed。 - 外部动作:network=`0`;Chrome=`0`;extension=`0`;download=`0`;real media=`0`;`F:\video`=`0`;正式 `ana-data`=`0`;schedule=`0`;cookie/token/credential access=`0`;实现/测试/fixture 修改=`0`。 ### Findings - 无阻断 finding。 ### 闭环结论 1. `PASS / duration gate`:`validate_duration_consistency()` 对远端与本地时长执行正数/有限值校验,固定容差为 `max(3 seconds, remote_duration * 0.1%)`;超过容差即失败,等于容差允许通过。发布路径在目标预检、正式媒体链接与 mapping 写入前调用该门禁,缺陷样本不会产生正式输出;端到端反例同时证明暂存目录完成清理。 2. `PASS / evidence`:通过样本的 mapping 固定记录 remote duration、local duration、delta 与 tolerance 四项;远端 `1206.067 s`/本地 `1206.067664 s` 的正常样本符合门限。metadata probe 仅声明 `METADATA_PASS_ONLY`,不表示下载或发布完成。 3. `PASS / multi-P and auth`:playlist、非空 entries、多 P/带 query 的非规范 URL,以及 `needs_auth`、`premium_only`、`private`、`subscriber_only` 均不能进入正式发布;未发现通过 preview、认证或会员边界绕过时长门禁的路径。 4. `PASS / preserved contracts`:无 cookie/浏览器凭据、no-overwrite、FFprobe 视频/音频流校验、SHA-256、BaseException 回滚与暂存清理合同未发现回退;代码、测试和证据保持冻结。 5. `PASS / quarantine boundary`:已隔离的约 600 秒 preview 继续排除且不得转写;已验收首个视频不在本次范围,本结论不重新检查或改写其既有状态。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 交付结论:冻结修复可由开发员按原链交付请求方;请求方只能在其另行具备的真实路径/下载授权下使用,任何实际下载仍必须逐项通过时长、multi-P 与认证状态门禁。 - 审核动作:本轮不授权、也未执行网络、Chrome、扩展、下载、真实媒体、`F:\video`、正式 `ana-data`、调度或凭据访问。 - 后继评审:`NOT_REQUIRED_FOR_THIS_CLOSURE`;不创建替代任务、平行审计链或新增管理审核层。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-LEDGER-MVP-IMPLEMENTATION-OUTPUT-20260805-001 - 记录时间:`2026-08-05T19:28:39+08:00` - 审核阶段:股票估值每日台账 MVP 唯一一次必要实现/输出独立审核。 - 审核对象:`DEV-STOCK-VALUATION-LEDGER-MVP-20260805-001`;权威需求=`ana-doc/股票估值/股票估值每日台账业务需求_v1.0.md`。 - 请求交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-LEDGER-MVP-IMPLEMENTATION-REVIEW-20260805-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`;请求方=`case_analysis.analyst.valuation / 019fb338-fe89-7d52-9ba6-513e82de54d8`。 - 审核边界:核对四表、正式 JSON 幂等导入、V1 四档、完整交易日/来源日期、单股隔离与整批回滚、版本有效期、V2 只读行情桥、查询/导出、单次运行脚本及正式库;不新增 provider,不修改 `dev/ana-dev`,不联网、不安装计划任务、不生成交易指令。 - 冻结实现:core=`37237/2F914E94110ACDB2676BC26733CE2ABD8A6B5E8C63836D42242867D3B022124C`;market=`3977/D43675B41D92ED2382B967DD530E7364778F236A69B9459306EA30925A255561`;cli=`5583/A2350F34C86B9CBB35AF82273F8419A1F87775ACF64D09C3D85468ECD6974A34`;schema=`2707/47E505DAB5F8D71BA3200F35AA00EDBCE3C243FA99936D3C0C208EC8AF41D1F6`;run_daily=`1049/5937CD5C2E46D008A1C6B4C9F8DDF49BF87BB778CCFAAD9AFED59BD6CBDFA18B`;tests=`20818/90FC283156767BA9733C5391BB8ADA33057BFF458880FC51E42F8307A0C6A7D4`,均与交接值一致。 - 正式输出只读复核:数据库=`163840/48AF0F2277FC43D98480D330BE49A43173404EDEDC2AF3666CBA473AAD24699C`;`quick_check=ok`;外键错误=`0`;四业务表;`security=125`、`valuation_version=136`、`daily_price=0`、`daily_judgement=0`;同日重复/有效期重叠/多开口版本=`0`;136 个 snapshot/report 路径、snapshot SHA-256 与 valuation_id 全部可复算。缺口=`325/7761E1A028C5FD46F6A8E412D4B01CD827D861AD0DC6F78D763402C207EFA132`,内容为一条确定性低优先级同日版本跳过。 - 独立正向验证:目标 unittest=`15/15 PASS / 6.280 s`;project discover=`106/106 PASS / 60.799 s`;正式输入临时冷导入=`136 inserted / 1 gap / 1.343 s`;同库热导入=`0 inserted / 136 unchanged / 1.266 s`;CLI help、strict UTF-8/no BOM、行尾空白和治理=`PASS / OK / warnings=0`。 - 外部动作:network=`0`;provider real call=`0`;schedule install=`0`;正式数据库写入=`0`;实现/测试/fixture 修改=`0`;`dev/ana-dev` 修改=`0`。 ### Findings #### F1(阻断,需求/集成合同):V2 只读桥没有证明“未复权且已完整收盘”的价格 - 权威需求第 24、86、122—123、209 行要求最新完整交易日的未复权收盘价,且盘中值不得进入台账;冻结 V2 registry/provider 固定 `fqt=1`,而 ledger `market.py` 第 60 行无条件写 `is_complete_trading_day=True`,没有从适配器证据证明复权口径,也没有阻止当日收盘前的 K 线被硬标为完整。 - `test_10` 只 mock 一个已经整理好的价格对象,未断言复权参数或同日盘中拒绝,因此不能证明该主合同。按当前实现运行真实 `daily` 可能把不符合需求口径的价格写入正式库并改变四档标签。 #### F2(阻断,代码/版本时序):新复评在估值日当天生效,而需求规定次日起生效 - `core.py` 第 502 行把每个版本 `active_from` 直接写为 `valuation_date`,第 529—532 行据此关闭上一版本。独立临时库反例导入 2026-08-04 旧版与 2026-08-06 新版后,对 2026-08-06 价格计算,实际绑定的新版本估值日为 `2026-08-06`;需求第 171 行要求“次日起每日判定使用新版本”。 - 现有 `test_04` 只检查 2026-08-07,未检查复评当日,因而遗漏了生效日 off-by-one。 #### F3(阻断,代码/幂等证据):导入版本只用 snapshot 哈希,计算 JSON 变化会被静默计为 unchanged - 估值区间、方法和多数指标实际来自 `calculation/valuation_results.json`,但 `core.py` 第 270 行仅以 snapshot SHA-256 生成 `source_hash/valuation_id`;`INSERT OR IGNORE` 后也未逐字段核对既有不可变版本。 - 独立临时库反例保持 snapshot 不变,只把 calculation 的 `base_low` 从 10 改为 11;第二次导入实际为 `inserted=0 / unchanged=1`,数据库仍保存 10,且没有冲突缺口。形式上通过幂等,实质上未识别已导入输入变化,违反正式 JSON 可追溯和同一输入幂等的前提。 #### F4(阻断,代码/正式输出提交):失败日仍发布空 latest,且 Markdown/CSV 不是成对原子提交 - `cli.py` 第 112—116 行无论日更状态均调用 `export_latest()`。独立空行情 fixture 反例得到 `status=FAILED / exit=4 / failure_count=1`,但仍创建 `latest.md`、`latest.csv`,两者均为 0 行;这与本次证据声明“首次验证完整日成功前保持 absent”冲突,也会把无有效日价的文件误当最新总表。 - `core.py` 第 845、866 行先后独立替换 CSV 与 Markdown。注入第二次写失败后,实际为新 CSV 已发布、旧 Markdown 保留;数据库虽按需求保留提交,但 `list/show/export` 和两份正式输出不再一致,不满足需求第 160、196 行的原子输出/导出失败合同。 ### 最小 required fixes 1. `F1`:先由需求所有者/项目管理员冻结可实施口径。若坚持未复权,必须授权并审核一个能证明未复权的登记 V2 行情合同;不得继续把现有 `fqt=1` 输出宣称为未复权。ledger 桥必须基于明确证据设置 complete-day,至少对上海当日收盘前 fail closed,并增加复权参数与同日盘中/收盘后入口测试;不得新增自由 provider 或真实联网验收要求。 2. `F2`:对已有上一版本的新复评,冻结 `active_from=valuation_date+1`、上一版本 `active_to=valuation_date`;首次版本可保持能覆盖其首个有效日。增加复评当日仍用旧版、次日切换新版及历史判定不回写测试。 3. `F3`:不必破坏正式库现有 ID;在命中既有 `ticker+valuation_date+source_hash` 时逐字段核对所有导入不可变值及路径,任何 calculation 变化不得计为 unchanged,必须 fail closed/形成明确冲突缺口。补 calculation 单字段变化反例;如改为组合 fingerprint,必须同时给出已初始化正式库的兼容迁移口径。 4. `F4`:只有至少一个可信 daily judgement 成功写入时才发布新 latest;首轮全部失败不得创建空 latest,已有 latest 在全失败时保持原 bytes。把 Markdown/CSV 改为成对提交,捕获 `BaseException` 并在任一临时写、flush/fsync、replace 或第二文件提交失败时恢复旧二文件/保持二文件均缺席。补全失败、第一/第二文件提交失败及 KeyboardInterrupt/SystemExit 注入测试。 5. 修复后复跑目标测试、project discover、V1/V2 只读回归和正式输入的临时冷/热导入;更新工具说明、实现证据、worklog 与冻结哈希。无需联网、真实日更或安装计划任务;正式运行库在复审前继续保持只读且不得写入价格/判定。 ### 已通过且冻结的部分 1. 四业务表与约束、正式库结构完整性、125/136 初始化事实及唯一诚实缺口通过。 2. V1 四档边界、83 只离线日更、单股行情失败隔离、SQLite 非业务异常整批回滚、同日价格/判定不可变和无有效估值版本不留价格半状态通过。 3. `list/show` 查询与正常 export 内容一致,200 行暖查询小于 1 秒;`run_daily.ps1` 不含计划任务安装原语。 4. 没有修改 `dev/ana-dev`、新增 provider、真实联网、安装计划任务或生成交易指令;正式库没有伪价格/判定,现状可安全保留为只读初始化快照。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`4` - 当前安全边界:代码与正式初始化库可继续作为隔离开发/只读审计快照;不得执行正式 `daily`,不得把空或部分提交的 `latest.md/latest.csv` 作为交付完成。 - 复审边界:只复审 F1—F4、对应非真空反例、更新后的冻结证据及合同未回退;不新增方案链、provider、网络或计划任务验收。 - Open questions:`F1` 的未复权口径与冻结 V2 `fqt=1` 合同冲突,需需求所有者/项目管理员明确选择后才能编码闭环。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-BACKHALF-LIMITED-IMPLEMENTATION-REVIEW-20260805-001 - 记录时间:`2026-08-05T21:09:44+08:00` - 审核阶段:已登录会话产生的完整本地媒体文件接管后半程限定独立实现审核。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求:`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`。 - 请求交接:`HANDOFF-INFODEV-INFOREV-BILI-AUTHENTICATED-SESSION-BACKHALF-IMPLEMENTATION-REVIEW-20260805-001`;来源/回传任务:`019fb7c5-b721-7332-b5c3-7120176fe016`;请求方:`case_analysis.video_downloader / 019fcc5d-798f-7ea1-8325-3a4d1f2dc5a5`。 - 审核边界:只审核 `accept-browser-file` 在完整媒体已由用户合法界面落盘后的本地接管、验证和发布;不读取 Chrome profile/Cookie/token,不使用签名媒体 URL,不运行网络、浏览器、扩展、下载或真实媒体,不访问 `F:\video`、隔离 preview 或正式 `ana-data`,不修改实现、测试、文档或其他工作区文件。 - 冻结实物:code=`28500/749FC486B0F42315BD463F11771FE2A7C71CAB53DD9AC2E411CE82E1175DFF13`;tests=`22553/80D8C94DF6922820AA4643984E91209C16046364C20A6A04F6ADA22C8DC36C8B`;usage=`6931/8103EA6F2077BF6BB30B31BCDFB3786B057306A747C18286E2622D19F8393687`,均与交接冻结值一致;worklog=`2351/5FA13EE55EAE69D90E8BE933885BB1D2B7C5A61F02FD931A7A271BEEED23A08B`。 - 独立验证:内存编译=`PASS`;根 CLI help 与 `accept-browser-file` help=`PASS`;目标 unittest=`21/21 PASS / 0.143 s`;owner 范围 project 回归=`97/97 PASS / 53.846 s`;目标文件 `git diff --check=PASS`;strict UTF-8/no BOM/尾随空白=`PASS`;治理=`OK / projects=1 / warnings=0`。 - 独立定向反例:空文件、伴随 `.crdownload`、增长中文件、目标碰撞、约 `600.133313 s` preview 对 `3133.95 s` 远端时长、发布期间 `KeyboardInterrupt`、映射脱敏与源/副本 SHA-256 绑定均按合同 fail closed 或通过;碰撞发生在外部命令前,失败后正式输出和暂存为零,源文件原 bytes 保持不变。 - 外部动作:network=`0`;Chrome=`0`;extension/service/token=`0`;download=`0`;real media=`0`;signed media URL=`0`;credential access=`0`;`F:\video`=`0`;quarantine=`0`;正式 `ana-data`=`0`;实现/测试/文档修改=`0`。 ### Findings - 无阻断 finding。 ### 审核结论 1. `PASS / exact binding and ingress validation`:命令只接受 batch 中唯一精确 BVID;本地输入必须已存在、非空、后缀属于 AV 容器、没有 `.crdownload/.part` 伴随文件,且在固定等待前后大小和修改时间稳定。非 AV、partial、增长、BVID 不匹配或目标碰撞均在正式发布前停止。 2. `PASS / read-only copy and integrity`:源文件仅以只读方式打开;复制在目标目录的随机同卷暂存内以 CreateNew 完成,复制过程中计算源流 SHA-256、复核源大小/修改时间,并重新计算暂存 SHA-256。异常捕获覆盖 `BaseException`,暂存清理且不移动、重命名或删除源文件。 3. `PASS / completeness and preview gate`:本地接管只复用公开无凭据 metadata probe,不调用下载命令;FFprobe 必须确认正时长且同时具有视频流和音频流,随后按 `max(3 s, remote duration × 0.1%)` 比较远近端时长。约 600 秒 preview 对约 3134 秒完整视频不能进入发布。 4. `PASS / no-overwrite and mapping`:媒体用硬链接 CreateNew 发布,映射用 CreateNew 写入;映射创建或其他发布异常会回滚本次正式媒体并清理暂存。映射保存 canonical source、发布时间、字节数、媒体 SHA-256、远近端时长证据和 codec,并标记 `authorized_browser_file_handoff`;不记录原本地绝对路径、Cookie、token、Chrome profile 或签名分片地址。 5. `PASS / preserved contracts`:既有公开 `probe/download` 的 `--ignore-config --no-cache-dir --no-cookies --no-cookies-from-browser --no-playlist`、multi-P/playlist、认证/会员状态、FFprobe AV、时长一致性、no-overwrite 和失败清理合同未发现回退;metadata probe 仍只表示 `METADATA_PASS_ONLY`,不表示下载或完整媒体已取得。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 授权范围:仅批准冻结实现作为“用户已通过合法界面取得单个完整本地 AV 文件之后”的自动接管后半程;不得据此宣称 Chrome/扩展完整文件入口已解决,也不授权读取认证状态、签名 URL、下载、真实媒体、`F:\video`、隔离 preview、正式 `ana-data` 或转写动作。 - 入口阻断:`PRESERVED`。当前 Chrome/扩展没有满足安全边界的完整 AV 文件出口;TXT、MP3、封面、`.m4s`、partial、扩展任务完成状态及 600 秒 preview 均不得作为完整原件或交付完成证据。 - 后继评审:本限定实现无需新增评审链;请求方只有在另行合法取得完整文件并具备对应真实路径/动作授权后,方可按文档运行后半程,且仍须逐项通过全部门禁。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-LEDGER-MVP-MYSQL-HOLD4-REREVIEW-20260805-001 - 记录时间:`2026-08-05T21:49:43+08:00` - 审核阶段:用户变更后的 MySQL 单后端实现/输出集中独立复审,仅核对当前 MySQL 合同、前序 HOLD/4 的 F1—F4 闭环及已冻结业务边界。 - 审核对象:`DEV-STOCK-VALUATION-LEDGER-MVP-20260805-001`;权威需求=`ana-doc/股票估值/股票估值每日台账业务需求_v1.0.md`;管理员冻结决定=`HANDOFF-INFOADMIN-INFODEV2-STOCK-VALUATION-LEDGER-MVP-MYSQL-F1-DECISION-20260805-001`。 - 请求交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-LEDGER-MVP-MYSQL-HOLD4-REREVIEW-20260805-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`;请求方=`case_analysis.analyst.valuation / 019fb338-fe89-7d52-9ba6-513e82de54d8`。 - 当前合同:写库仅 `stock_valuation`;行情只读源仅 `trading_xuntou`;不得读取/写入 `tianxia`,不得使用 V2/provider/network fallback,不保留 SQLite 后端或把旧 SQLite 作为迁移源;凭据仅环境变量或未跟踪本机配置;公开 CLI 固定为 `init/daily/list/show/export`。 - 冻结实物核验:提交列出的 package、schema、实现、测试、fixture、工具说明、证据、worklog 与权威需求共 16 项 bytes/SHA-256 均与实物一致;其中 core=`46772/875D29EF68007E6370A80E7D1399680C196AECE10874BE2FBB838899980C39B6`、market=`10906/5B4DC4CD8798C58073F1A0E25A9DC180F73330C5FAEF2ADF242A6AFD7D90D32F`、database=`4074/0CAD60E8ED76A96A5D9B05D653596497A9755A60C3BC01CF3DA6331769CC0B8B`、tests=`25112/099F796477D78539054A68D74994B5EE9D188DDBBDC96EB40C924908D76BC81A`。 - 独立静态/入口核验:根 CLI help=`PASS`;PowerShell 5.1 parser=`PASS`;治理=`OK / projects=1 / warnings=0`;`market.py` 无 V2 导入/调用并通过只读连接读取 `trading_xuntou`;`database.py` 将生产写库限定为 `stock_valuation`、测试写库限定为显式开关下的 `stock_valuation_test_*`;未发现 `tianxia`、SQLite 产品后端、provider fallback、计划任务安装或交易指令回退。 - 独立测试说明:当前 reviewer 进程没有配置 MySQL 测试凭据,提交的 MySQL 集成类按自身门禁安全跳过;本轮实际执行的纯单元项=`1 PASS / 1 integration class skipped`。因此不把开发员申报的 `19/19` 当作 reviewer 重跑结果;阻断结论来自冻结代码逐行检查与两个不需要数据库/外部动作的确定性故障注入。 - 外部动作:network=`0`;生产 MySQL read/write=`0`;`trading_xuntou` read/write=`0`;V2/provider=`0`;production daily=`0`;formal latest publish=`0`;schedule install=`0`;`tianxia`=`0`;`dev/ana-dev` 修改=`0`;实现/测试/fixture 修改=`0`。 ### Findings #### F4-R1(阻断,双文件提交失败清理):staging 写入/fsync 位于 BaseException 状态机之外 - `core.py:1006-1016` 先创建两份 `.pair-stage-*`、写入、flush、fsync;捕获/回滚 `BaseException` 的 `try` 直到 `core.py:1017` 才开始。因此任一 `mkstemp/fdopen/write/flush/fsync` 故障不会进入 `core.py:1029-1048` 的清理分支。 - 独立临时目录反例在第二次 `fsync` 注入原样 `KeyboardInterrupt`:正式 pair 首次运行仍双缺席、已有 pair 仍保持 `old-csv/old-md`,但两种场景均实际遗留两份 `.pair-stage-*`。这没有闭合前序 required fix 明确包含的“任一临时写、flush/fsync”边界,也不符合本次交接和工具文档声称 staging/fsync 已纳入 BaseException 回滚的证据。 - `test_14_latest_pair_rolls_back_first_second_and_baseexceptions` 只在 `.pair-stage-* -> latest.csv/latest.md` 的 `os.replace` 注入三类异常,并且只比较旧正式 pair;没有注入 stage create/write/flush/fsync,也没有断言 stage/backup 零残留,因此提交的 `19/19` 不能排除该反例。 #### P1(阻断,冻结数据库原子性回退):单股判定失败会提交只有 daily_price 的半状态 - 权威需求第 197 行要求数据库失败不得留下“价格已更新但判定未更新”的半状态,工具说明第 75 行进一步冻结“个别行失败则该证券零写入,`daily_price` 与 `daily_judgement` 不会出现价格半状态”。 - `_candidate_from_package()` 只校验区间顺序(`core.py:218-225`),没有拒绝 `base_low<=0`;schema 也没有相应正数约束。`apply_daily_prices()` 在 `core.py:807-817` 先插入 `daily_price`,之后才在 `core.py:818-821` 调用会因 `base_low<=0` 抛出 `E_RANGE` 的 V1 判定;该 `LedgerError` 被 `core.py:874-875` 按单股缺口吞下,外层事务随后在 `core.py:876` 正常 commit。 - 独立无数据库 cursor/connection 桩反例得到 `status=FAILED / failure=E_RANGE / reported_inserted_prices=1 / daily_price INSERT=1 / daily_judgement INSERT=0 / commit=true / rollback=false`。现有 `test_07` 仅覆盖“在插入价格之前发现无有效版本”,`test_18` 仅覆盖 MySQL 底层异常导致整批回滚;都没有覆盖价格插入后的业务 `LedgerError`,所以不能证明逐证券零写入合同。 ### 已关闭且冻结的部分 1. `F1 PASS`:行情模块不再引用 V2;源 schema 在目标写入前证明;逐行验证 A 股身份、CNY、有限正收盘价、`trade_date<=as_of`、未复权、开市日/日历覆盖、上海 15:05 后最终加载时间及来源标识。实际源最大日期 `2026-02-24` 保持原日期且未伪装为当前日;正式日表/latest 仍为空。 2. `F2 PASS`:首次估值版本从估值日生效;已有版本后的复评从估值日次日生效,上一版本结束于复评日;同日旧版、次日新版和历史判定不回写路径已在冻结实现/测试中闭合。 3. `F3 PASS`:命中既有 valuation identity 时逐项比较所有导入不可变字段,包括 results-derived ranges/metrics/paths;同 snapshot 下计算结果变化形成 `E_IMMUTABLE_VERSION_CONFLICT` 并保留旧值。 4. `F4 partial PASS`:全失败首次运行不创建正式 latest,已有成功 pair 在后续全失败时保持原字节;两次正式 replace 的 OSError/KeyboardInterrupt/SystemExit 回滚可由代码和测试证明。只有上述 staging 前半程失败清理仍阻断。 5. MySQL 单后端、`trading_xuntou` SELECT-only、凭据不落盘/不回显、五个 CLI、无 V2/SQLite/tianxia/provider/计划任务/交易指令边界未发现回退;本结论不把历史 SQLite/V2 实现视为当前合同。 ### 最小 required fixes 1. `F4-R1`:把两份 stage 的 create/write/flush/fsync 全部纳入统一 `BaseException` 所有权状态机;任何阶段失败都原样传播非普通异常、清理本次 stage/backup,并保持正式 pair 双缺席或恢复旧双文件。增加第一/第二文件的 create/write/flush/fsync `OSError`、`KeyboardInterrupt`、`SystemExit` 注入,逐例断言正式 pair、stage、backup 的完整终态和原异常。 2. `P1`:确保每只证券的 price 与 judgement 作为不可分割单元。最小做法可在任何 INSERT 前完成版本区间/V1 判定及所有会抛业务错误的校验,或为每只证券使用 savepoint 并在任一 `LedgerError` 时回滚该证券;同时在正式估值导入/schema 层拒绝非正的判定区间。增加 `base_low<=0` 等“价格插入后才会失败”的入口反例,断言该证券 `daily_price=0`、`daily_judgement=0`,其他有效证券仍可提交并报告精确 gap。 3. 修复仅需离线/隔离 MySQL 测试:补齐上述非真空矩阵,复跑目标套件和 project discover,更新工具说明、实现证据、worklog 与冻结 hashes。不得运行生产 daily、发布正式 latest、访问真实行情/provider、安装计划任务或修改 `dev/ana-dev`。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`2` - 当前安全边界:正式 MySQL 初始化数据及空 `daily_price/daily_judgement` 可继续保持只读;代码可用于隔离开发与无生产输出的修复验证。不得执行生产 `daily`,不得把当前实现或任何 partial/latest 临时实物作为完成交付。 - 复审边界:仅复审 F4-R1、P1 两项最小修复与其非真空反例,并确认本次已经关闭的 F1—F3、F4 已通过子项和单后端边界未回退;无需网络、正式 daily/latest 或计划任务。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-LEDGER-MVP-MYSQL-F4-R1-P1-REREVIEW-20260805-001 - 记录时间:`2026-08-05T22:29:42+08:00` - 审核阶段:前序 HOLD/2 的 F4-R1/P1-only 限定实现复审;复审进行中收到权威需求变更,因此只保留两个原阻断的快照子结论,不形成最终实现 PASS。 - 审核对象:`DEV-STOCK-VALUATION-LEDGER-MVP-20260805-001`;请求交接=`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-LEDGER-MVP-MYSQL-F4-R1-P1-REREVIEW-20260805-001`;需求变更通知=`active_review_requirement_change_notice`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 原限定快照核验:core=`47078/5D6644CF745B76F8710D3B83B75260FD41959BFDCB5B30FF3AD282B959CE8D45`;tests=`30000/9960BDA0A803050724264665FE9969C6F9898F3B7C55083ACAC397C6E8EAADB4`;tool doc=`9380/0EC0EB4690D1BC75FBF89A0C7EA0FA656739317BD2140B096F0271710C4AC53B`;evidence=`9741/BEBFBA7DAB2769BBD91EF68377D249557A213B70382AE5DFEFDA434CA08CD413`;worklog=`4610/D40E9D5ACCE26AAAA1889E676CAA6655F70FB536F7973E1D59560EFF039B8589`,均与交接一致。 - 需求变更事实:权威需求现为 `14710/64625A19A5FF1948014A3F9F1BDABED2379F5A15D44F0E9B2004B5EDE481DA41`,已把生产 `daily` 唯一价格来源改为 `trading_xuntou.cn_stock_kline_1d_front`;禁止读取 `cn_stock_kline_1d`、禁止 `dividend_type` 推断及 V2/network fallback,并新增专表最大日期必须满足请求日的合同。当前受审 market/tests/docs 正在被后续 delta 替换,故不再是最终交付快照。 - 外部动作:production daily=`0`;formal latest=`0`;production MySQL read/write=`0`;market/provider/network=`0`;schedule install=`0`;实现/测试/正式输出修改=`0`;本审核仅写审计入口。 ### F4-R1/P1 子结论 1. `F4-R1 CLOSED_IN_SUPERSEDED_SNAPSHOT`:`_write_pair` 的两份 stage create/write/flush/fsync 已进入统一 `BaseException` 状态机。审核员独立执行 24 组“第一/第二 stage × create/write/flush/fsync × OSError/KeyboardInterrupt/SystemExit”矩阵全部通过;旧正式 pair 原字节保持且 stage/backup 均为 0。原第二次 fsync 反例在首次 pair 双缺席和已有 pair 两种状态下也均为零残留、正式状态正确。 2. `P1 CLOSED_IN_SUPERSEDED_SNAPSHOT`:`apply_daily_prices` 在任何 `daily_price` SELECT/INSERT 前转换区间并调用冻结 V1 判定。审核员无数据库桩以 `base_low=0` 重放原反例,结果为 `FAILED/E_RANGE / inserted_prices=0 / inserted_judgements=0 / price SELECT=0 / price INSERT=0 / judgement INSERT=0`;原“价格已写但判定未写”的半状态不能再复现。 3. 本轮未独立重跑 MySQL 集成套件:reviewer 进程仍无本机测试凭据;开发员申报的 focused=`2/2`、target=`21/21`、project=`118/118` 仅作为冻结提交证据,不冒充 reviewer 重跑结果。两个子结论由代码、测试矩阵静态核对及独立无外部动作反例支撑。 ### 结论 - 审计状态:`SUPERSEDED_REQUIREMENT_CHANGE` - 当前快照阻断问题数(仅 F4-R1/P1):`0` - 最终实现结论:`NOT_ISSUED`。不得把本记录解释为整体实现 PASS,也不得沿用旧 F1/market 结论;新需求已实质改变行情表、口径证明和日期门禁。 - 后续入口:开发员完成专表 delta、离线验证并冻结新的 code/tests/docs/evidence hashes 后,提交一次新的集中实现复审;该复审应组合核对新 market 合同、F4-R1/P1 子结论未回退及全部正式边界。 - 当前安全边界:继续禁止生产 `daily`、正式 latest、真实行情/provider、计划任务和任何正式数据写入。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V001-DESIGN-20260805-001 - 记录时间:`2026-08-05T23:01:39+08:00` - 审核阶段:exact `青枫浦上Q / BV1HA3o6oEJJ` 已登录会话扩展入口 V001 合并安全设计独立审核;实现、真实认证和下载继续冻结。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;管理授权=`HANDOFF-INFOADMIN-INFODEV-BILI-PLUGIN-FULL-VIDEO-NARROW-SCOPE-ASSIGN-20260805-001`。 - 请求交接:`HANDOFF-INFODEV-INFOREV-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V001-DESIGN-REVIEW-20260805-001`;来源/回传任务=`019fb7c5-b721-7332-b5c3-7120176fe016`;请求方=`case_analysis.video_downloader / 019fcc5d-798f-7ea1-8325-3a4d1f2dc5a5`。 - 设计实物:`dev-doc/project-doc/开发方案/CODE-DESIGN-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V001.md=22418/665DDDFE4247DEFEE69B6DD1E0CBBD128EDD75B8A32BA609C90C718AC7C97C71`;strict UTF-8/no BOM/trailing whitespace=`PASS`。 - 冻结基线:bridge=`28500/749FC486B0F42315BD463F11771FE2A7C71CAB53DD9AC2E411CE82E1175DFF13`;tests=`22553/80D8C94DF6922820AA4643984E91209C16046364C20A6A04F6ADA22C8DC36C8B`;usage=`6931/8103EA6F2077BF6BB30B31BCDFB3786B057306A747C18286E2622D19F8393687`,均与交接一致;冻结后半程审计=`DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-BACKHALF-LIMITED-IMPLEMENTATION-REVIEW-20260805-001 / PASS/0`。 - 独立依赖核验:隔离环境 yt-dlp=`2026.07.04`;其 `globals.py` 默认 `plugin_dirs=['default']`,`YoutubeDL.__init__` 在首次实例化时调用 `load_all_plugins()`;`download(url_list)` 会再次调用 `extract_info()`;下载器映射中 `m3u8 -> FFmpegFD`、`m3u8_native -> HlsFD`、`http_dash_segments -> DashSegmentsFD`。V001 对这些真实行为尚未冻结对应阻断机制。 - 治理:`OK / projects=1 / warnings=0`。设计提交后的根级 outline/plan/execution log 因其他 owner 追加事项而继续增长;V001 设计、工作日志和冻结产品基线未漂移,不把并发 append-only 账本哈希差异作为方案 blocker。 - 外部动作:real Cookie/token/signed URL=`0`;Chrome/extension install or modification=`0`;Native Host registry=`0`;network/download=`0`;real media/quarantine=`0`;`F:\video`=`0`;formal `ana-data`=`0`;product code/tests/config changes=`0`。 ### Findings #### F1(阻断,Native Messaging 身份与秘密输入合同):唯一 origin 没有绑定到可复算的项目扩展身份,Cookie/page schema 也未冻结到可实现字段 - V001 第 58、144—153 行只要求安装时检查一个“32 位 Chrome ID”并写入唯一 `allowed_origins`,没有把该 ID 绑定到项目扩展固定公钥/manifest key、构建实物哈希或编译期 expected ID;安装脚本若接受任意格式正确的 ID,就可能把 host 授给错误扩展。主机协议也未要求校验 Chrome 启动时传入的 origin 参数与同一 pinned ID 一致。 - 第 114—130 行宣称 unknown field fail-closed 和 exact field set,但没有枚举 `page_proof` 与 Cookie record 的完整键、类型、nullability、数值范围和 canonical 规则。Chrome Cookie 对象的 `hostOnly/session/expirationDate/secure/httpOnly/storeId/partitionKey/sameSite` 如何投影、当前 tab cookie store 如何绑定、partitioned cookie 如何处置、session/expiry 如何转成 Netscape 字段均未冻结;实现无法从方案得出唯一安全 wire schema,也无法写出非自证的 unknown-field/过期/分区反例。 #### F2(阻断,yt-dlp 同进程秘密边界):设计声称“禁止插件加载”,但冻结版本默认加载用户插件,且 logger 不能覆盖全部第三方输出面 - V001 第 172、253 行把“无插件”和 synthetic sentinel 作为硬门,却未定义在 import/首次 `YoutubeDL` 前如何关闭全局 plugin directories。冻结 yt-dlp 的实际默认值为 `['default']`,首次 API 实例化会执行 `load_all_plugins()`;用户插件可在持有内存 CookieJar/info_dict 的同一进程运行,直接破坏“只有受信任 host/yt-dlp 核心可见秘密”的威胁模型。 - 第 134 行只配置 yt-dlp custom logger。冻结库仍有不经该 logger 的直接 stdout/stderr 写入路径(例如 CookieJar 解析告警),FFmpeg/其他子进程也必须显式重定向;当前测试只列 fake yt-dlp/CookieJar,不能证明真实冻结包在成功和畸形 Cookie/格式/异常路径上不会把 sentinel 写到协议 stdout、stderr 或 traceback。 #### F3(阻断,metadata-to-download 绑定与签名 URL):预检对象没有绑定到实际下载,且“内置 HTTP”不足以阻止 FFmpeg 下载器接收 URL - V001 第 164 行先 `extract_info(download=False)`,第 174—182 行再描述下载,但没有冻结调用方式和对象所有权。冻结 API 的 `download([url])` 会重新 `extract_info()`;若实现走该自然路径,前一次通过 id/duration/DRM/AV 的 info/selected formats 与实际下载对象之间存在第二次解析窗口,门禁并未约束真正下载的格式。 - 仅“不配置 external downloader”并不能证明签名 URL 不进 FFmpeg argv:冻结版本会为 `m3u8` 自动选择 `FFmpegFD`。方案没有冻结 selected/requested formats 的允许协议、实际 downloader class、fragment/manifest 拒绝规则或在第一媒体字节前的断言;fake yt-dlp 只检查 opts,不能证明真实调度器选择。 - `merge_output_format='mkv'` 只约束合并路径;`bestvideo+bestaudio/best` 的单文件 fallback 未冻结必须 remux 为 MKV或 fail-closed。由此“同一已验证对象、仅本地 FFmpeg 输入、最终唯一 MKV”三个合同目前不能同时验收。 #### F4(阻断,取消/断连与后代清理):没有可在 Windows/阻塞网络下兑现的有界进程所有权状态机 - V001 第 83、126、208—213 行要求 cancel、Native Host 断连、Chrome 关闭和 BaseException 都结束后代并清空秘密,但未定义协议 reader 与阻塞 yt-dlp worker 的并发关系、socket/read timeout、retry/fragment retry、总墙钟、取消检查点、grace/kill 时限或 join 终点。若主线程阻塞在 metadata/HTTP,`cancel`/EOF 可能不能及时被消费,CookieJar 生命周期也无上界。 - Python `finally`/顶层 `BaseException` 不能在 Chrome 强制终止 Native Host 或进程崩溃时运行;V001 没有 Windows Job Object `KILL_ON_JOB_CLOSE` 或等价的 OS 级后代所有权。第 257 行仅要求 fake yt-dlp/FFmpeg 后“后代=0”,无法证明真实 sleeping child/FFmpeg 在 pipe EOF、host kill、cancel 和超时时已退出。 ### 已通过且冻结的设计部分 1. 单一 exact BVID、用户可见二次点击、无通用下载/批处理/自动触发、无外部消息、无 loopback/HTTP/WebSocket/token 文件的范围正确。 2. Cookie 不进入 argv/env/config/storage/mapping/evidence、只使用内存 `io.StringIO` 的总体方向正确;Python 不承诺物理擦除的限制已诚实披露。 3. 页面/full-duration、认证 metadata、single video、multi-P/live/DRM、AV、600 秒 preview、partial、候选唯一性及冻结 backhalf 的多层 fail-closed 顺序合理;正式媒体/mapping 仍由已 PASS 的后半程门禁发布。 4. 实现审核前仅允许离线/合成测试,真实安装、Cookie、下载、注册表、`F:\video`、正式 `ana-data` 和转写继续为 0;冻结 bridge/tests/usage 及现有 TXT 扩展不得修改。 ### 最小 required fixes 1. `F1`:在 V002 固定项目扩展 manifest key/public identity 与唯一 expected extension ID;installer 不接受任意 ID,只比较实际 ID 与 pinned ID,并生成 exact origin;host 启动时再校验 Chrome origin 参数。逐字段冻结 page proof/start/cookie schema、当前 store/partition 规则、canonical domain/path/session/expiry 转换及所有字节/数量上限;扩展只投影允许字段,不序列化原始 Cookie 对象。 2. `F2`:冻结在 import/首次实例化前关闭 yt-dlp 全局插件的实际机制,并断言 plugin maps/directories 为空;Native protocol 使用独立保存的二进制句柄,真实 yt-dlp/CookieJar/FFmpeg 的 stdout/stderr 全部进入不持久化的丢弃 sink。用冻结真实包做无网络 synthetic sentinel 测试,覆盖合法与畸形 Cookie、direct warning、异常和关闭路径,而非只测 fake logger。 3. `F3`:冻结“一次解析、同一对象下载”的具体 API 状态机,例如在真实下载前的 match-filter 中验证将被下载的同一 processed info,或把经验证的唯一对象直接交给下载处理;禁止再次按 URL 解析。逐个 requested format 校验 id、protocol、DRM、A/V、duration 和实际 downloader class,只允许不会把 URL交给子进程的内置类;任何 FFmpeg argv 含 URL/header/Cookie 即安全停止。明确单文件 fallback 的 MKV remux 或拒绝合同,并增加真实调度器选择/单次解析计数测试。 4. `F4`:冻结可并发消费 status/cancel/EOF 的协议 reader、单 worker/cancel event、网络/metadata/fragment timeout 与 retry 上限、总任务墙钟和有界 grace/kill/join;所有子进程置于 Windows kill-on-close Job Object 或等价 OS 所有权。增加无网络真实 sleeping-child 测试,在 cancel、pipe EOF、host disconnect、KeyboardInterrupt/SystemExit、超时和模拟 host kill 后证明 PID 全灭、Cookie stream 关闭清零、stage 可安全回收且协议无 sentinel。 5. V002 仍只允许修改设计与账本;四项闭环并独立 PASS 前,不得创建实现、测试、extension、Native Host、构建/安装脚本,不得执行任何真实认证或下载动作。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`4` - 当前安全边界:V001 可作为范围/威胁模型草案继续修订,但不是可安全实施合同;现有 TXT 扩展、localhost/token/SQLite/Cookie 文件链、冻结 backhalf 和全部正式产物保持原状。 - 复审边界:仅复审 F1—F4 的 V002 闭环及已通过边界是否回退,一次返回剩余完整阻断;无需真实 Chrome、Cookie、下载、注册表或媒体。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-STOCK-VALUATION-LEDGER-MVP-FRONT-ADJUSTED-CONSOLIDATED-REREVIEW-20260805-001 - 记录时间:`2026-08-05T23:18:00+08:00` - 审核阶段:MySQL 单后端、首次 HOLD/4、后续 HOLD/2 修复及前复权专表 delta 的合并独立实现/输出复审。 - 审核对象:`DEV-STOCK-VALUATION-LEDGER-MVP-20260805-001`;权威需求=`ana-doc/股票估值/股票估值每日台账业务需求_v1.0.md=15012/ACD0EBABA5BF424513A139A736C5A62B2AF1E3EAE80B616E57DA2ECC22FF0F95`。 - 请求交接:`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-LEDGER-MVP-FRONT-ADJUSTED-CONSOLIDATED-REREVIEW-20260805-001`;替代冻结交接=`HANDOFF-INFODEV2-INFOREV-STOCK-VALUATION-LEDGER-MVP-FRONT-ADJUSTED-REPLACEMENT-20260805-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`;请求方=`case_analysis.analyst.valuation / 019fb338-fe89-7d52-9ba6-513e82de54d8`。 - 当前冻结实现:core=`47078/5D6644CF745B76F8710D3B83B75260FD41959BFDCB5B30FF3AD282B959CE8D45`;market=`10087/F990ED84206FC66144F36500332BA57B229638D1371FC548E26F06A1D022E961`;tests=`31925/4E19DE08C46AD0367FD88C82C64D3622EA94114515CBA0030D8C10AAF8BA0723`;database/schema/cli/run_daily/README/fixture 均与 replacement handoff 冻结值一致。 - 文档与证据:工具说明=`10074/9C75A5F84259C2EF41D92A2CCE5CE1C149A17F01DB39035E579CA29B3EB2B64B`;实现证据=`12168/F96E219DB571F2BDE2699AF2EB1F7293714CC752454A18F2DDFF3143B1155ADE`;worklog=`5601/7796A6C7DDAE6EF172CAE77535F4E6C1CB8003EECB01CF632C3433E8B41012DE`。 - 独立静态/纯离线验证:replacement 哈希=`PASS`;`compileall=PASS`;CLI help=`PASS`;PowerShell 5.1 parser=`PASS`;纯单元 `MarketSchemaUnitTests=2/2 PASS`;目标文件 diff check=`PASS`。本 reviewer 无本机 MySQL 测试凭据,未把开发员申报的 `22/22`、project `119/119` 冒充为独立重跑。 - 正式输出只读核验:`latest.csv=31060/C88986DF9CD008BF010623A3BF9BED49D675CF72975FF8E0B31DE3E54216E0A2`,共 124 个唯一 A 股 ticker、全部 `CNY`、全部交易日 `2026-08-05`;四档为偏低 3、基本合理 39、偏贵 39、明显偏贵 43,逐行按 close/base/optimistic 区间重算 mismatch=`0`。`latest.md=32890/98ECF8A0C7FE3141484A589A9533B8618BF1DEA5FDFE91614CE53F29ABE1F0F4` 声明 124 条且正文有 124 行;`latest_gaps.csv=192/E5BBD897B4A3BBE5A256C9E747F08DD2BEB4C23A1ACFB860D3184B20FDD555F7` 诚实记录唯一 `09880.HK` 不支持缺口。未查询或改写生产数据库,数据库四表规范哈希采用需求 owner 已交付、开发员只读复核的冻结证据。 - 外部动作:production daily=`0`;formal latest write=`0`;network/provider=`0`;trading_xuntou DDL/DML=`0`;tianxia=`0`;schedule install=`0`;ana-dev change=`0`;实现/测试/正式输出修改=`0`。 ### Findings #### F1(阻断,完整交易日日历水位):滞后的 current 日历资产仍可把旧行情接受为请求日的最新完整交易日 - 权威需求第 122—128 行要求 `cn_stock_kline_1d_front` 只有在其最大行情日期满足请求日时才可作为价格来源,日期滞后不得冒充当前价;工具说明第 71 行也声明正式日历必须证明“请求日以前最大开市日”。 - `market.py` 第 176—203 行从 `status='current' / is_current=1` 的同一日历资产内计算 `MAX(c.trade_date<=as_of)`,但没有要求该资产的 `window_end` 覆盖请求 `as_of`。第 118—120 行仅要求 `window_end>=trade_date`,因此一个水位只到 8 月 4 日、但仍标记 current 的日历资产会自行证明 8 月 4 日是 8 月 5 日请求的“最大开市日”。 - 审核员纯函数反例:`as_of=2026-08-05`、`trade_date=2026-08-04`、`window_end=2026-08-04`、`status=current/is_current=1`、`is_open=1`、`source=xtquant`、`updated_at=2026-08-04T16:10:00+08:00`,实际 `_record_from_row()` 成功返回 `PriceRecord(trade_date='2026-08-04')`。现有 test 10 反而把同类 `window_end=2026-08-10` 作为正例,test 21/22 只检查列名,没有覆盖 stale window。 - 这不会推翻已发布 2026-08-05 正式输出的只读事实:该批文件本身全部为 2026-08-05 且标签重算一致;但当前实现若用于后续生产日更,可能在正式日历资产滞后时写入旧日价格或把旧日期当作当前可接受水位,违反 fail-closed 合同。 ### 最小 required fixes 1. 在任何行情行投影及 `stock_valuation` 写入前,把正式日历资产的请求期覆盖作为全局硬门:所选唯一 current 资产必须满足 `window_end>=as_of/cutoff`,否则整体抛出明确的日历水位错误并保持目标四表与 `latest.md/latest.csv` 原 bytes;不能从同一滞后资产内部自证最大开市日。 2. 在已证明覆盖请求期的 current 日历资产中再计算 `MAX(is_open=1 AND trade_date<=as_of)`,要求每只证券的专表行精确等于该日期;逐股缺行继续只产生显式 gap,不能回退旧表、`dividend_type`、V2/network 或静态证券表。 3. 增加非真空入口反例:日历 `window_end=cutoff`,参数顺序与 SQL 占位一致。 - 开发员冻结证据:target=`22/22 PASS / 86.679s`;project=`119/119 PASS / 140.964s`;compileall/CLI help/PowerShell parser/diff/UTF-8/secret scan/governance=`PASS`。本限定终审未重跑 MySQL 集成套件,不把开发员结果冒充 reviewer 重跑。 - 正式只读证据未变:2026-08-05 `125/136/124/124`、A 股覆盖 `124/124`、四档 `3/39/39/43`、唯一 `09880.HK` 缺口及 `latest.md/latest.csv/latest_gaps.csv` 哈希均与前序审计一致;修复未重跑、未改写生产 daily/history/output。 - 外部动作:production daily=`0`;formal output write=`0`;network/provider=`0`;schedule=`0`;trading_xuntou DDL/DML=`0`;tianxia/ana-dev=`0`;reviewer implementation/test modification=`0`。 ### Findings - 无阻断 finding。 ### 审核结论 1. `F1 PASS`:正式日历资产在派生请求日以前最大开市日前必须先证明 `window_end>=as_of/cutoff`;同一条件在 outer join 重复约束,纯函数行投影也独立拒绝 stale window。滞后 current 资产不能再自证旧日价格为当前可接受水位。 2. `休市/周末语义 PASS`:门禁要求日历资产覆盖请求期,而不是强制价格日期等于请求日;覆盖已证明后,仍可选择 `MAX(is_open=1 AND trade_date<=as_of)`,不会误拒绝休市日的最近完整交易日。 3. `preserved contracts PASS`:case-sensitive exact ticker/source/suffix、前复权专表-only、15:05、CNY/正数、行级 gap、MySQL 单后端、F2/F3/F4-R1/P1、双文件原子提交、无 V2/network/SQLite/tianxia/provider 回退均未发现回退。 4. `output PASS`:本结论确认当前实现与 2026-08-05 正式只读输出证据可作为本 MVP 的完整实现/输出交付;不授权或要求重复生产执行。未来 daily 仍须逐次通过当前专表、日历水位和行级证据门禁。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 交付状态:`IMPLEMENTATION_AND_EXISTING_OUTPUT_ACCEPTED` - 后续评审:`NOT_REQUIRED`;如未来新增港股来源、provider、SQLite/V2 回退、网络路径、计划任务安装或交易指令,须作为新需求另行治理,不属于本次 PASS。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V002-DESIGN-REREVIEW-20260805-001 - 记录时间:`2026-08-05T23:33:00+08:00` - 审核阶段:V001 HOLD/4 的 F1—F4 限定安全设计复审;V001+V002 组成唯一合同,冲突处 V002 优先。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;目标仅限 `青枫浦上Q / BV1HA3o6oEJJ`。 - 请求交接:`HANDOFF-INFODEV-INFOREV-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V002-DESIGN-REREVIEW-20260805-001`;前序审计=`DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V001-DESIGN-20260805-001 / HOLD/4`;来源/回传任务=`019fb7c5-b721-7332-b5c3-7120176fe016`;请求方=`case_analysis.video_downloader / 019fcc5d-798f-7ea1-8325-3a4d1f2dc5a5`。 - 设计实物:V001=`22418/665DDDFE4247DEFEE69B6DD1E0CBBD128EDD75B8A32BA609C90C718AC7C97C71`;V002=`23356/8526D942228B77C8A13FE8D6AC57B33925C59547FF25273E4A668DF2677564C2`,均与交接一致;V002 strict UTF-8/no BOM/trailing whitespace=`PASS`。 - 冻结后半程:bridge=`28500/749FC486B0F42315BD463F11771FE2A7C71CAB53DD9AC2E411CE82E1175DFF13`;tests=`22553/80D8C94DF6922820AA4643984E91209C16046364C20A6A04F6ADA22C8DC36C8B`;usage=`6931/8103EA6F2077BF6BB30B31BCDFB3786B057306A747C18286E2622D19F8393687`,均未漂移。 - 独立身份复算:manifest `key` 严格 Base64 解码为 294-byte SPKI DER;SHA-256=`E83C2B2AF3CF011543FBA13FBC524D1122EEA68548F9F27B9F7A82B5D594666C`;前 128 bit nibble `a..p` 映射得到 `oidmclckpdmpabbfedplkbdplmfcenbb`,与 pinned ID 和 exact origin 一致。 - 独立冻结依赖核对:yt-dlp `2026.07.04` 实物中 `globals.plugin_dirs` 默认确为 `['default']`;`plugins.load_plugins()` 在 `YTDLP_NO_PLUGINS` 或空 `plugin_dirs` 时立即返回,首次 `YoutubeDL` 初始化调用 `load_all_plugins()`。V002 的“stdlib 启动→NUL→设置环境→import→清空目录→真实加载并断言 maps/directories 全空→READY→才发送 secret”顺序可闭环前序 F2,而非继续依赖 custom logger。 - 治理:`OK / projects=1 / warnings=0`。共享 outline/plan/execution log 可被并行 owner 继续 append;设计、worklog 和冻结后半程哈希一致,不把共享账本随后追加视为设计漂移。 - 外部动作:implementation/tests/extension/host=`0`;real Cookie/token/signed URL=`0`;Chrome/registry/network/download/media=`0`;quarantine/F:\video/formal ana-data=`0`。 ### Findings - 无阻断 finding。 ### 审核结论 1. `F1 PASS / fixed identity and wire schema`:manifest public key、DER hash、expected extension ID、exact origin、extension/host build identity 和 artifact manifest 形成可复算固定身份;安装器只能比较 observed ID,不能用任意 ID 铸造 origin;host 在 stdin/worker/secret 前复核 Chrome origin argv。协议 v2 对 frame、duplicate key、类型、整数/bool、page proof、start、cookie store/partition、domain/path/session/expiry 和 Cookie 数量/字节上限给出 exact fail-closed 合同。 2. `F2 PASS / plugin and output isolation`:broker 不 import yt-dlp,worker 在任何 secret 进入前关闭真实插件入口并报告 `READY_PLUGIN_DISABLED`;协议 handle 独立、不可继承,fd1/fd2、worker、真实 CookieJar/yt-dlp/FFmpeg 输出统一进入非持久化 NUL。冻结真实包、畸形 Cookie、默认目录 sentinel plugin 与 sleeping FFmpeg 的无网络测试足以验证前序“真实包而非 fake logger”阻断。 3. `F3 PASS / one extraction and downloader binding`:exact processed info 只解析一次;唯一 selected format 合并到同一 `download_info`,验证与 `process_info()` 使用同一对象并设置第二解析 guard。实际叶只允许 HTTPS `HttpFD/DashSegmentsFD`;FFmpegFD/HlsFD/ExternalFD/m3u8/未知协议在首媒体字节前拒绝。audit hook 禁 URL/header/Cookie 进入子进程,双流和单文件都只对本地文件生成唯一 MKV。 4. `F4 PASS / bounded ownership`:reader/coordinator/worker 分工、阶段/总墙钟、retry、grace/kill/join 均有固定上限;worker 在 suspended 状态加入独立 `KILL_ON_JOB_CLOSE` Job Object 后才恢复,不能建立所有权即在 secret 前停止。具体实现必须按第 5.3 节由 worker 产生 yt-dlp/FFmpeg/bridge 后代并继承同一 job;broker 的“调度”不得实现为 job 外直接启动 bridge。真实 worker/child/grandchild 覆盖 cancel、EOF、disconnect、BaseException、timeout 和 host kill,可验证强杀时不依赖 Python finally。 5. `preserved boundaries PASS`:exact BVID、第二次用户点击、无通用/批量下载、无 external messages/loopback/token 文件、内存秘密、页面/full-duration/DRM/multi-P/live/600 秒 preview/partial 门禁、冻结 backhalf 和实现审核前 offline-only 边界未回退。 ### 实现授权与验收边界 - 允许新增既定 `dev/project-dev/bili_authenticated_extension/`、对应 test 子目录与一页用法,按 V001+V002 实现最小离线 extension/native host、synthetic AV 和真实 sleeping-child 测试。 - 实现必须固定 yt-dlp 版本及相关模块哈希、pinned FFmpeg/host/bridge executable、worker-spawned job inheritance、秘密 sentinel 全树扫描和冻结 bridge 回归;任何从 broker 直接在 task job 外启动 bridge、二次 metadata 提取、URL 进入 FFmpeg argv或插件 maps 非空均为实现阻断。 - 本 PASS 不授权读取真实 Cookie、真实 Chrome/会话、安装/修改扩展或 Native Host、写 HKCU、联网下载、读取隔离 preview、写 `F:\video`/正式 `ana-data` 或启动转写;上述真实动作仍须等实现审核 PASS 后由既有权限链另行明确授权。 ### 结论 - 审计状态:`PASS` - 阻断问题数:`0` - 设计状态:`V001_PLUS_V002_IMPLEMENTATION_READY_OFFLINE_ONLY` - 下一入口:完成最小实现、全部冻结离线/合成/真实 sleeping-child 测试并提交同一 reviewer 的必要实现审核;不创建平行任务或真实下载链。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V002-IMPLEMENTATION-REVIEW-20260806-001 - 记录时间:`2026-08-06T03:14:51+08:00` - 审核阶段:已通过 V001+V002 组合安全设计后的 offline-only 限定实现审核;真实安装、认证会话和下载继续冻结。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;唯一目标=`青枫浦上Q / BV1HA3o6oEJJ`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`。 - 请求交接:`HANDOFF-INFODEV-INFOREV-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V002-IMPLEMENTATION-REVIEW-20260806-001`;前序审计=`DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V002-DESIGN-REREVIEW-20260805-001 / PASS/0`;来源/回传任务=`019fb7c5-b721-7332-b5c3-7120176fe016`;请求方=`case_analysis.video_downloader / 019fcc5d-798f-7ea1-8325-3a4d1f2dc5a5`。 - 设计基线:V001=`22418/665DDDFE4247DEFEE69B6DD1E0CBBD128EDD75B8A32BA609C90C718AC7C97C71`;V002=`23356/8526D942228B77C8A13FE8D6AC57B33925C59547FF25273E4A668DF2677564C2`,均与交接一致。 - 冻结实现清单:`source-artifact-manifest.json=2510/91E5E28CC21F9E214FE3A6D351D883AF3F12DA11C4DD9828D79934108D9367EC`;清单所列 15 个产品文件的 bytes/SHA-256 全部复算匹配,实际产品目录除清单自身外无漏项。测试树聚合=`7 files/612 bytes/1A97EF2CD9A4D7FA64D49A3890F22730622087C09DCFD5990A25B95230C7471B`;用法=`10499/9789F2B7CE0141E726A47CA396D89873BCCFD4260C1AA4210C766A92FB0ABCCA`;worklog=`5269/62C789E3271D821550BBC51A194E75CC9B546E581F6F00380C536BE6B3384AEF`,均与提交一致。 - 冻结后半程未漂移:bridge=`28500/749FC486B0F42315BD463F11771FE2A7C71CAB53DD9AC2E411CE82E1175DFF13`;tests=`22553/80D8C94DF6922820AA4643984E91209C16046364C20A6A04F6ADA22C8DC36C8B`;usage=`6931/8103EA6F2077BF6BB30B31BCDFB3786B057306A747C18286E2622D19F8393687`。 - 独立执行:目标环境=`28/28 PASS / Ran 28 in 12.273s`,无 skip;冻结 bridge=`21/21 PASS / Ran 21 in 0.152s`;全项目=`127 tests / OK / 6 skipped / Ran 127 in 65.865s`。Python compile、Node check、PowerShell parser、scoped diff、strict UTF-8/no BOM/no trailing whitespace=`PASS`;治理=`OK/projects=1/warnings=0`。 - 外部动作:real Cookie/session/Chrome/extension install/native host install/HKCU=`0`;network/download/real media/quarantine=`0`;`F:\video`/formal `ana-data`/transcription=`0`;reviewer 对实现、测试、说明和冻结 bridge 的修改=`0`。 ### Findings #### F1(阻断,实际 worker 无法建立固定 stage):环境清理删除了运行时必需的 `LOCALAPPDATA` - `worker.py:195-204` 把固定运行根定义为 `%LOCALAPPDATA%\project-info\bili-auth-ingress\BV1HA3o6oEJJ`,缺少 `LOCALAPPDATA` 即抛 `E_STAGE`;但 `worker.py:477-481` 的 sanitized environment allowlist 不含 `LOCALAPPDATA`,而 `_worker_main` 在 `native_host.py:452-455` 清空整个环境后才读取 secret、加载配置并进入 `run_authenticated_task()`。 - reviewer 在目标环境按实际清空顺序执行,得到 `LOCALAPPDATA_present False` 和 `fixed_stage_root_error E_STAGE`。现有真实 worker 测试因源码目录没有 `config.json`,在更早的 `E_CONFIG` 处结束,没有走到 stage 根,因此 28/28 绿灯未发现此必现故障。当前快照即使未来合法安装并提供完整配置,也不能开始下载。 #### F2(阻断,秘密前预检):第二次点击没有建立新的无秘密 ready/lease,陈旧 stage 清理也发生在 secret 进入之后 - `background.js:233-258` 的第二次 `start` 仅复用第一次校验时的 `nativeReady`,随后立即调用 `cookies.getAll()` 并发送 secret start;它没有在 Cookie 读取前请求一次 fresh preflight。若 config/hash/正式输出碰撞在两次点击之间变化,broker 直到收到含 Cookie 的 start 后才在 `native_host.py:637-644` 复查并拒绝,违反“E_EXISTS/config/hash 在 Cookie 读取前失败”的冻结合同。 - V002 要求 host crash 后的固定 stage 清理在任何新 secret 前完成;实际 `cleanup_stale_runs()` 位于 `worker.py:757-760`,只在 broker 已收到 start、worker 已报告 READY、broker 已把 secret frame 写入 pipe 后执行。stage 重解析点、未知残留或清理错误因此都只能在 secret 已进入 worker 后发现。 #### F3(阻断,取消与正式发布竞态):本地验证后到 frozen bridge 提交前没有取消检查,coordinator 又过早把任务标为 CANCELED - `worker.py` 只在 766、797、800 行检查 cancel;进入 802—825 行的本地 remux/FFprobe/bridge 链后没有设计要求的 FFmpeg 前后、bridge 前后检查。`WorkerTask.cancel()` 又在 `native_host.py:312-319` 立即把任务设为 terminal CANCELED,然后才给予 worker 3 秒 grace;bridge 可在这段窗口内完成 CreateNew 正式媒体和 mapping。 - reviewer 纯临时桩反例在 `probe_mkv()` 返回时把 cancel 置 true;当前 `run_authenticated_task()` 仍调用 `run_frozen_bridge()` 一次,并返回 `('BV1HA3o6oEJJ.mkv','BV1HA3o6oEJJ.download.json',True)`。这证明“UI 已收到 CANCELED”与“正式输出已提交”可同时发生;现有测试只证明 Job 能杀真实 sleeping descendants,没有覆盖产品入口的 cancel/commit 仲裁。 #### F4(阻断,构建/安装产物不完整):构建为 one-directory,安装却只复制一个 EXE - `build_host.ps1:28-37` 明确使用 PyInstaller `--onedir`;这种输出由 EXE 与同目录依赖树共同组成。当前 build manifest 在 46—55 行只记录主 EXE,未绑定其余运行文件;`install_native_host.ps1:174-177` 也只复制该 EXE 和 config,不复制或复验 one-directory 依赖树。 - 因此即使后续授权操作者完成真实构建,安装目录也不是可运行的已审核 host;同时未绑定依赖树使构建输出无法按 source artifact 证据做完整性验收。现有测试只验证“缺少固定 PyInstaller 时输出根不创建”,没有验证可运行的完整安装树。 #### F5(阻断,安装 fail-closed/供应链):安装器接受任意自洽清单并可覆盖既有 HKCU 注册,失败时不回滚注册表 - V002 要求安装器在 HKCU 前核对实现审核冻结的 artifact manifest。实际 `install_native_host.ps1:57-95` 只检查调用方提供清单的通用 schema/identity 与相互引用,没有固定本次 15 文件集合或审核冻结清单。现有 `test_installer_validation_only_has_no_registry_or_install_output` 正例反而构造仅含 `source.txt` 的一文件 source manifest、任意 `sys.executable` host 及自签 build manifest并成功得到 `VALIDATION_PASS_ONLY`,直接证明冻结实现身份未被安装门禁绑定;`build_host.ps1` 在 PyInstaller 前也未逐项复验 source manifest。 - 安装路径 `install_native_host.ps1:188-190` 使用 `New-Item -Force` 和 `Set-Item`,会覆盖同名既有 Native Messaging 注册;catch 只删除 `$root`,不恢复或删除本次 HKCU 变更。重复安装或注册表中途失败不能满足 no-overwrite/原状态恢复。测试从未执行 `-Install` 的临时 registry provider 正反例,故没有覆盖设计冻结的 CreateNew、第二 origin/wildcard、首/中途失败和重复运行矩阵。 ### 已通过且冻结的实现部分 1. extension public key/SPKI hash/expected ID/exact origin、manifest 权限、protocol v2 exact request schema、duplicate key/bool-as-int/frame 上限、page/cookie store/partition/domain/path/session/expiry 门禁均与设计一致。 2. broker 在 origin 校验后才读 stdin;worker suspended→AssignProcessToJobObject→resume,broker Job handle non-inheritable且 kill-on-close。真实 worker/child/grandchild 七类终态与 abrupt owner death 均证明 PID 全灭,未发现 breakaway 或 broker 在 job 外启动 bridge。 3. yt-dlp `2026.07.04` 模块哈希、import 前 `YTDLP_NO_PLUGINS`、plugin dirs/maps 全空、NUL 输出、内存 CookieJar、单次 `extract_info`、同一 `download_info`、HTTPS `HttpFD/DashSegmentsFD`、二次解析 guard和本地 MKV路径均通过现有实现与非真空测试。 4. 冻结 `accept-browser-file` 后半程 21/21 通过;600 秒 preview、multi-P/auth、AV/时长/SHA-256/CreateNew/BaseException 合同未漂移。上述通过项不因 F1—F5 重开。 ### 最小 required fixes 1. `F1`:保留并严格验证一个非秘密、绝对、本地且无重解析链的 `LOCALAPPDATA`/固定 stage 根,或在环境清理前用 Win32 known-folder 得到同一固定根;加入真实 worker 入口正例,必须越过 config 和 stage 创建而不是继续以 `E_CONFIG` 提前结束。 2. `F2`:在第二次点击读取 Cookie 前增加一次无秘密 prepare/lease 状态机,原子完成 fresh config/hash/正式碰撞、固定 stage 陈旧运行清理、Job 分配和 plugin READY;任何失败保持 Cookie read/start-secret/network/stage-new=`0`。增加“第一次 READY 后 config/输出/stage 被改变”的入口反例。 3. `F3`:按 V002 补齐每个本地 blocking stage 与 bridge 前后的 cancel 检查,并让 coordinator 只在 worker 确认 pre-commit cancellation 后宣告 CANCELED;定义 bridge 已进入/已提交时 cancel 与 COMPLETE 的唯一仲裁,保证任何 CANCELED 终态正式输出恒为 0。增加 probe 后 cancel、bridge 前 cancel、bridge 中 cancel、EOF/disconnect/timeout 的非真空入口测试与正式目录断言。 4. `F4`:二选一闭环:改成经过冻结验证的单文件 host;或保留 `--onedir` 并对完整依赖树生成 name/bytes/SHA-256 清单,安装时 CreateNew 复制整树、复读复验后才生成 host manifest。增加合成 one-directory 多文件树的完整/缺件/篡改/中途失败测试;本修复复审不要求真实构建或安装。 5. `F5`:让安装入口绑定本轮最终冻结 source/build receipt 和 exact 文件集合,禁止任意自签/缺件清单;构建前逐项复验 source 清单。HKCU 路径必须预检不存在、禁止 `-Force` 覆盖,并把 root 与 registry 首/中途 `OSError`/`BaseException` 纳入同一回滚状态机;用临时 registry provider 覆盖成功、重复、错误 origin/ID/hash、首/中途失败和原状态恢复,不写真实 HKCU。 6. 修复仅限当前 extension 源、对应离线测试、用法/证据和账本;冻结 bridge 三文件不得改。冻结新 hashes 后只提交 F1—F5 限定复审;不得把修复过程扩展为真实 Chrome/Cookie、构建安装、HKCU、network/download、real media、`F:\video`、formal `ana-data` 或转写。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`5` - 当前安全边界:当前实现只可用于 F1—F5 的离线修复与临时测试;不得构建/安装扩展或 Native Host,不得读取真实 Cookie/会话、联网下载、读取隔离 preview、写正式媒体/数据或启动转写。冻结 bridge 与既有已验收第一条视频继续保持原状。 - 复审边界:仅复审 F1—F5、补充的非真空离线证据及上述 passed contracts 是否回退;无需也不得进行任何真实认证、安装或下载动作。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V002-IMPLEMENTATION-F1-F5-REREVIEW-20260806-001 - 记录时间:`2026-08-06T04:27:47+08:00` - 审核阶段:前序实现审核 `HOLD/5` 的 F1—F5 限定独立复审;V001+V002 已通过设计合同、前序 passed-and-frozen 结论及冻结 `accept-browser-file` 后半程不重开。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;唯一目标=`青枫浦上Q / BV1HA3o6oEJJ`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`。 - 请求交接:`HANDOFF-INFODEV-INFOREV-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V002-IMPLEMENTATION-F1-F5-REREVIEW-20260806-001`;前序审计=`DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V002-IMPLEMENTATION-REVIEW-20260806-001 / HOLD/5`;来源/回传任务=`019fb7c5-b721-7332-b5c3-7120176fe016`。 - 修复快照:source manifest=`2511/CE43F1BD7AB87EFAA6B98EB456EC3938E4DDFEBBAB36268E774746F307EF7C0A`,所列 15 个产品文件 bytes/SHA-256 独立复算全部匹配、无缺件;build script=`6322/7A6528C4F5019F59D59D7FD92E753CE8A9B62E8FDA1ABB6CD98004B032D56129`;installer=`15542/783A3E0227B11C1023684522A9BA54222781B926668361939002A6889A269EAB`;测试树聚合=`7 files/612 bytes/8BDA96E3CFE867E0E2906BE9CEF13B1CD39AAF1D5969A7B0A63EC38630D4A0E1`;用法=`11513/C4B6B0F2E4EE32D4FFA3E4AA633C56E701777B9ABD6EA3DC9012D80BC8915D69`;worklog=`6736/FA5169F52D841D37776CEA1A593F2E71457F009BD45E39875973372E3DAC7E35`。 - 冻结后半程未漂移:code=`28500/749FC486B0F42315BD463F11771FE2A7C71CAB53DD9AC2E411CE82E1175DFF13`;tests=`22553/80D8C94DF6922820AA4643984E91209C16046364C20A6A04F6ADA22C8DC36C8B`;usage=`6931/8103EA6F2077BF6BB30B31BCDFB3786B057306A747C18286E2622D19F8393687`。 - 独立执行:目标环境=`30/30 PASS / Ran 30 in 27.473s`;冻结 bridge=`21/21 PASS / Ran 21 in 0.182s`;全项目=`129 tests / OK / 6 skipped / Ran 129 in 78.568s`;Python compile、Node check、JSON parse、PowerShell parser、strict UTF-8/no BOM/no trailing whitespace、scoped diff=`PASS`;治理=`OK/projects=1/warnings=0`。 - 外部动作:真实 Cookie/session/Chrome、正式 extension/native host build/install、HKCU、network/download、quarantine/real media、`F:\video`、formal `ana-data`、transcription=`0`;reviewer 对实现/测试/说明/冻结 bridge 修改=`0`。仅使用 `TemporaryDirectory`、fake PyInstaller、mock Chrome 和临时文件 registry provider 做离线反例。 ### Findings #### F2-R1(阻断,prepare/secret 并发仲裁):同一可见第二次点击可并发进入两条 start,导致 Cookie 读取和 secret frame 各发生两次 - `sidepanel.js:45` 在点击处理开始时不立即禁用按钮或取得本地 in-flight lease;`background.js:202-220` 的 `freshNativePrepare()` 使用全局 `nativeRevision/lastNativeType/preparedTaskNonce`,没有 request/lease correlation;`background.js:260-305` 也没有在第一个 `await` 前原子设置 start-in-progress。两个并发 `start` 因而可以共享/交错 prepare 状态。 - reviewer 将 mock `getAllCookieStores()` 延迟 20 ms 后并发执行 `Promise.all([dispatch('start'), dispatch('start')])`,当前实现实际得到 `cookieReads=2`、`prepareCount=3`(含前序失败 prepare)、`startCount=2`;两个 start 均已携带 Cookie secret,其中一个最终 `E_EXTENSION`。在真实 broker 中第二个 `start` 还会使 `WorkerTask.start()` 抛 `E_PREPARE`,`native_host.py:722-727` 随即 `task.terminate()`,可中止第一个合法任务。 - 现有 `background_contract.mjs` 只覆盖顺序单击,故 30/30 绿灯未验证“一个 prepare lease 只能消费一次、一个用户动作最多一次 Cookie read/start secret”。这仍违反 F2 的 secret-free prepare/lease 和单任务合同。 #### F4-R1(阻断,正式用法未同步):构建合同已改为 onefile,但交付说明仍两处声明 one-directory - `B站已登录会话完整视频扩展入口.md:31` 仍写 `PyInstaller 6.15.0,one-directory`,第 41 行仍称 `build_host.ps1` 生成 one-directory host;同一文件第 74、80、92 行和实际 `build_host.ps1:78-103` 则冻结为 `--onefile`、唯一 EXE。 - 这是未来获授权操作者的正式构建/安装入口,互相矛盾的包装合同会使验收对象和文件完整性口径不唯一。F4 的代码路径与 fake builder 状态机已通过,但交付文档尚未闭环原阻断。 #### F5-R1(阻断,审核快照没有外部信任锚):bundled source manifest 仍可与被改产品一起重签并被 build/installer 接受 - `build_host.ps1:11-55` 与 `install_native_host.ps1:96-173` 只要求 source manifest 与脚本同目录、文件集/字段固定且内部 bytes/hash 自洽;两者均未比较本次审核冻结的 source manifest SHA-256 `CE43F1BD...7C0A` 或其他 reviewer/admin 发出的外部 receipt。build receipt 又由同一未锚定 build script 根据当前 manifest 自行生成,因此不能把“当前自洽”提升为“本轮已审核”。 - reviewer 在纯临时复制中给 `worker.py` 追加 synthetic 字节、把 15 项 source manifest 重新计算为新哈希 `C8887646...6F14`,再用测试同类 fake PyInstaller 6.15.0 运行复制的 build script;结果 `returncode=0`,生成唯一 EXE 与 schema 2 receipt。随后复制的 installer 对该未审核 manifest/receipt 返回 `VALIDATION_PASS_ONLY`,而正式安装目录和临时 registry 均未创建。被改 worker=`877A79D8...913CE`,与本审计冻结物不一致但门禁仍通过。 - 现有测试只覆盖“修改产品但不更新 manifest”和“把相同 manifest 复制到外部路径”;没有覆盖攻击者/误操作同时刷新同目录 manifest 与 build receipt 的反例。V002 第 2.1 节要求 HKCU 前核对实现审核冻结 artifact manifest hashes,当前仍未实现该信任来源。 ### 已通过并冻结的闭环 1. `F1 PASS`:`LOCALAPPDATA` 在环境清理前按绝对本地、既有链无 reparse 校验并唯一保留;真实 job-owned worker 使用有效 config 越过旧 `E_CONFIG`,secret=0 时完成 stale cleanup/lease,EOF 后 stage/正式输出均为 0。 2. `F3 PASS`:下载后、本地 remux/rename/候选/FFprobe 与 bridge 前均有 checkpoint;commit event 使 pre-commit cancel 终态正式输出为 0、bridge 已进入时 cancel 被拒绝并由 bridge 终态决定。现有 probe/commit/bridge 桩、coordinator timeout/cancel 及真实 Job 后代测试通过,未复现前序 CANCELED+正式输出并存。 3. `F4 code PASS`:实际构建脚本固定 PyInstaller `6.15.0 --onefile`,输出根只允许唯一 EXE+schema 2 receipt;fake builder 成功/失败和 work/spec 清理通过。仅正式用法的两处 one-directory 陈述未同步。 4. `F5 transaction PASS`:installer 已禁止 `-Force` 覆盖,root/registry 预检不存在,host/config/manifest 使用 CreateNew+复读,临时文件 registry provider 覆盖成功、重复及六个失败点并恢复空状态;当前剩余阻断仅是未绑定外部审核哈希的供应链身份。 5. 前序 public key/SPKI/ID/origin/wire schema、插件禁用/NUL/内存 Cookie、单次解析/同一对象、downloader allowlist、本地 MKV、Job Object 后代所有权以及冻结 bridge 21/21 均未发现回退。 ### 最小 required fixes 1. `F2-R1`:在 side panel/background 的第一个异步边界前取得不可重入的 start lease并立即禁用 start/retry;给 prepare 响应绑定一次性 request/lease ID,broker 原子消费一次且 duplicate prepare/start 只返回 `E_BUSY/E_PREPARE`、不得终止已启动的合法任务。新增延迟 Cookie-store 的并发双击入口反例,必须证明第二条在 Cookie 读取前失败、总 `cookieReads=1`、start secret frame=`1`、首任务不被终止。 2. `F4-R1`:把正式用法第 31、41 行统一为 `PyInstaller 6.15.0 --onefile / no UPX / 唯一 EXE+schema 2 receipt`;全文件不得再出现 one-directory/onedir,且不改变真实动作冻结边界。 3. `F5-R1`:为 build 和 install 增加来自本次正式审计/管理员确认、位于可变 source/build 树之外的 reviewer-approved source-manifest hash 信任锚,并在解析 manifest、调用 builder或复制产物前比较;真实 build 完成后、HKCU 前还须对 exact build receipt/EXE 做一次 hash-only 限定确认或使用等价的外部批准 receipt。新增“修改产品并同步重算同目录 source manifest/build receipt”的反例,给定原审核哈希时必须在 build/install 输出前失败。文档明确实现 PASS 最多授权 build,install/HKCU 仍须等 exact build receipt 确认。 4. 仅修复 F2/F4/F5 对应 extension、离线测试、用法/证据/账本;F1/F3 和冻结 bridge 不重开。不得执行真实 PyInstaller 构建、安装、HKCU、Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或转写。 ### 结论 - 审计状态:`HOLD` - 阻断问题数:`3` - 当前安全边界:当前快照仅可用于 F2-R1/F4-R1/F5-R1 的离线修复与临时测试;不得据此构建或安装正式 Extension/Native Host,不得读取真实 Cookie/session、操作 Chrome/HKCU、联网下载或触碰真实/正式媒体数据。冻结 bridge 与既有已验收视频保持原状。 - 下一复审:只复审上述三项及本轮已通过合同是否回退;一次提交完整冻结哈希和纯离线证据,不新增任务或审核链。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-HOLD3-MINIMAL-OFFLINE-REPAIR-REREVIEW-20260806-001 - 记录时间:`2026-08-06T12:18:05+08:00` - 审核阶段:同一事项、同一审核链内,前序 `HOLD/3` 的 F2-R1、F4-R1、F5-R1 限定实现复审;F1/F3、V001+V002 已通过合同及冻结 `accept-browser-file` 后半程不重开。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;唯一目标=`青枫浦上Q / BV1HA3o6oEJJ`。 - 请求交接:`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-HOLD3-MINIMAL-OFFLINE-REPAIR-REREVIEW-20260806-001`;管理员 owner 续派=`HANDOFF-INFOADMIN-INFOREV-BILI-AUTHENTICATED-SESSION-HOLD3-OWNER-CONTINUATION-20260806-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序审计:`DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-EXTENSION-INGRESS-V002-IMPLEMENTATION-F1-F5-REREVIEW-20260806-001 / HOLD/3`。 - 修复快照:source manifest=`2511/039BE7791B517290F13458151A19B400C8DE516963FADB7354E22C680BE89709`,所列 15 个产品文件 bytes/SHA-256 独立复算全部匹配、文件集无差异;background=`13201/27C0598DD8D70659B1E518C841F2CC5908165458F99E8531D58A6B15F767BDE8`;sidepanel=`2364/88794C840C0491E0017E7E8D15A956E4AA28DCEB71950A991F4A40399C2449B4`;protocol=`11393/8E8A1BBB742B37358A2848B28D2A7B10ACA9B20167844388455CAAB59DBE422D`;native host=`29843/41CA31D688F39E53B5C7A11ACE1390C3BEA1D8E08D0FFFF49C4C62D320F42937`;build=`8303/78EFFE9D2704F8FB5680C191BD9F014CDAF7F60A3F20F000569B88453527F5B1`;installer=`19477/3016CE524AFDC3FD9A9F4DD4810F39BFAEE0A211A79DEA306FA54069C6C1490C`。 - 测试/说明证据:测试树=`7 files/612 aggregate-manifest bytes/DA738E0155939CD668FED75E4B15C47D47D7CC4D1B00EA21EE4A7BACF45F1476`;用法=`15739/3B7EE09DA09DFE6ECCF313B976A7FE9A827E5A3DDD9A04C22E11F3E29BF99FB8`;secondary worklog=`1636/5A08AA001FC6BADBE0726A8D84AED1916786DE94D5A9C627AF905A0C341E22F6`。 - reviewer-owned 树外批准回执:`ai-inforev/worklog/2026-08-06-bili-authenticated-session-source-approval.json=373/F6A56C14ED8DB1DFF7918F72CC5316D65866CED9B2D98368A88DF47D338FCBAA`;其 exact schema 绑定 source manifest=`2511/039BE7791B517290F13458151A19B400C8DE516963FADB7354E22C680BE89709`,位于 source/build 树外,`approved_by_role=dev.reviewer.project`,批准范围仅为 `controlled-build-source-manifest`。 - 冻结后半程未漂移:bridge code=`28500/749FC486B0F42315BD463F11771FE2A7C71CAB53DD9AC2E411CE82E1175DFF13`;tests=`22553/80D8C94DF6922820AA4643984E91209C16046364C20A6A04F6ADA22C8DC36C8B`;usage=`6931/8103EA6F2077BF6BB30B31BCDFB3786B057306A747C18286E2622D19F8393687`。 ### Findings - 阻断 findings:`0`。 ### 原 HOLD/3 闭环 1. `F2-R1 PASS`:side panel 在第一次异步边界前同步取得不可重入 UI lease并立即禁用 start/retry/validate;background 在任何 await/Cookie store 读取前同步取得唯一 start lease,prepare/start 以唯一 32 位小写十六进制 `prepare_id` 定向关联。延迟 Cookie-store 并发双击反例实际证明一成功一 `E_BUSY`、`cookieStoreReads=1`、`cookieReads=1`、携密 start=`1`;broker 的 duplicate/mismatch start 只返回 `E_PREPARE`,不再 terminate 已启动任务。 2. `F4-R1 PASS`:正式操作口径已统一为固定 PyInstaller `6.15.0 --onefile --noupx`、唯一 EXE+schema 2 build receipt;原第 31/41 行矛盾已消失。全文仅剩一处明确声明“不再提供或暗示 onedir/one-directory”的否定性闭环说明,不构成可执行构建口径或验收歧义;真实 build=`0`。 3. `F5-R1 PASS`:build 在解析 source manifest、调用 builder或创建 output 前,install 在解析 manifest、复制或 HKCU 前,均要求 source/build 树外批准回执;installer 还要求 exact EXE/build receipt 的独立 build approval。篡改产品并同步重算同目录 source manifest/build receipt 的离线反例,在旧外部 source approval 下于 output/install/registry 前 fail closed。开发员没有创建、自签或自批正式 trust receipt;本审计由 reviewer 对 exact source manifest 独立复算后生成上述 source approval。 4. `passed/frozen 未回退`:F1 stage 环境、F3 cancel/commit 仲裁、public key/SPKI/ID/origin/wire schema、插件禁用/秘密内存边界、单次解析/下载器 allowlist、本地 MKV、Job Object 后代所有权及冻结 bridge 均未发现回退。 ### 独立验证 - 目标环境:`31/31 PASS / Ran 31 in 32.841s`,无 skip;冻结 bridge:`21/21 PASS / Ran 21 in 0.231s`。 - 全项目:`130 tests / OK / 6 skipped / Ran 130 in 83.965s`;skip 为非目标环境集成条件,不影响本轮目标测试的无 skip 结论。 - Python compile、Node syntax、PowerShell parser、JSON、strict UTF-8/no BOM/no trailing whitespace、U+FFFD、scoped diff=`PASS`;治理=`OK/projects=1/warnings=0`。 - 外部动作:正式/真实 build、install、HKCU、Chrome、Cookie/session、network/download、real media、`F:\video`、formal `ana-data`、transcription、secret persistence=`0`;reviewer 未修改产品、测试、用法或冻结 bridge。 ### 结论与后续门禁 - 审计状态:`PASS` - 阻断问题数:`0` - 实现结论:`HOLD3_MINIMAL_OFFLINE_REPAIR_ACCEPTED`。 - 授权边界:允许获授权操作者仅使用本审计冻结 source manifest 与 reviewer-owned source approval 执行一次受控 build;本 PASS 不授权安装、HKCU、真实 Chrome/Cookie/session、网络下载、正式媒体/数据或转写。 - 安装门禁:受控 build 完成后必须提交唯一 EXE 与 schema 2 build receipt 的 exact bytes/SHA-256,先由 `dev.reviewer.project` 或 `project.admin` 完成 hash-only 限定确认并形成树外 `install-exact-build` approval;在该后续确认 PASS 前,install/HKCU 继续冻结。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-EXACT-BUILD-HASH-ONLY-CONFIRMATION-20260806-001 - 记录时间:`2026-08-06T14:53:29+08:00` - 审核阶段:同一事项、同一审核链内,已通过实现的唯一一次 exact-source 受控 build 的 hash-only 限定确认;不重开 HOLD/3 实现、F1/F3、冻结 bridge 或产品合同。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;请求=`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-EXACT-BUILD-HASH-ONLY-CONFIRMATION-20260806-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序实现审计:`DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-HOLD3-MINIMAL-OFFLINE-REPAIR-REREVIEW-20260806-001=334024/C063BD046AE56B1D24A6167623DFA696206E4EA17DE645253F89398ADECC3FDD / PASS/0`。 - reviewer source approval:`ai-inforev/worklog/2026-08-06-bili-authenticated-session-source-approval.json=373/F6A56C14ED8DB1DFF7918F72CC5316D65866CED9B2D98368A88DF47D338FCBAA`;绑定 source manifest=`2511/039BE7791B517290F13458151A19B400C8DE516963FADB7354E22C680BE89709`。 - 管理预置链:builder Python=`262144/5912D0884B23C0343983A864C6064242391E2265536F50B88624857E353882C9`;PyInstaller EXE=`108469/D5DC4427C5E5D417457DAE6FD8B50EF2AFA0A4CE5FDFD5767AB20C5B56555C39`;wheelhouse manifest=`792/7A05B7637F8254ECE6C5B38D9C54D870FC3F62877C66C1FD52BC8766C9D64529`;provision receipt=`2027/B65F4184E8782394F2CC27C47CB8656C942E366FD80E8FA7A548CE5A3367BACF`,均与提交一致。 - build script=`8303/78EFFE9D2704F8FB5680C191BD9F014CDAF7F60A3F20F000569B88453527F5B1`;开发执行证据记录 build count=`1`、exit=`0`、wall=`20.839s`、PyInstaller `6.15.0 --clean --noupx --onefile`、network/dependency install=`0`。 ### Findings - 阻断 findings:`0`。 ### Hash-only 独立确认 1. 输出根 `dev/tmp/bili-auth-controlled-build-20260806-001` 恰好包含两个普通、非 reparse 文件,目录=`0`、`.build/.spec=0`: - `project-info-bili-auth-native-host.exe=8608281/F0D3CE2EF12D7D305B8F765169CBF5430DF9F0D36D03FF4447A85378AFF8A26F` - `build-artifact-manifest.json=995/9B989A32C92A4EB89911C9D5151F31B416BA8F265785CE575FDD1A23FBEDF63D` 2. receipt strict UTF-8/no BOM/no trailing whitespace、无 duplicate key,exact schema 2;`target/extension_id/build identities/packaging=pyinstaller-onefile/pyinstaller_version=6.15.0` 均匹配。builder Python、build script、source manifest 的 bytes/SHA-256 全部复算一致。 3. receipt 的唯一 `files[0]` 精确绑定上述 EXE 的 name/bytes/SHA-256;reviewer 仅静态读取首两字节确认 `MZ`,未加载或执行 EXE。 4. source manifest 所列 15 个产品文件 bytes/SHA-256 复算 `15/15 PASS`,实际文件集无差异;source approval→source manifest→build receipt→EXE 链完整。 5. 开发执行日志、工具说明与 secondary worklog 分别为 `191404/2BE532490D536BD54521B560F1DE7EB5CDFDD7DA5794F3483A124A673135B9F5`、`18047/A338B2D75296181162DD7498879067C39D7A33B271A8D200044156D2E9392F95`、`4048/3FD25884CD4AAA9D6041F435ED9DC535D1915803063D9B4AC0FB406AEBF29397`;均声明 EXE execution/install/HKCU/Chrome/Cookie/session/network/download/media/`F:\video`/formal `ana-data`/transcription=`0`。输出根无日志、秘密或额外 sidecar;治理=`OK/projects=1/warnings=0`。 ### Reviewer-owned exact-build approval - 已生成 source/build 树外回执:`ai-inforev/worklog/2026-08-06-bili-authenticated-session-build-approval.json=594/244097BC466D969E046F0E64E9D3A1213F5AB64E12C9358DF0807B4BA0F8F816`。 - exact schema 1:`approval_scope=install-exact-build`、`approved_by_role=dev.reviewer.project`、`status=APPROVED`;精确绑定 source manifest SHA-256、build receipt bytes/SHA-256 与 EXE bytes/SHA-256,位置不在 source/build 树内。 ### 结论与边界 - 审计状态:`PASS` - 阻断问题数:`0` - 结论:`EXACT_BUILD_HASH_ONLY_CONFIRMED`。 - 上述 exact build 已满足 installer 的独立 build-identity 前置门禁;只允许未来获明确授权的操作者将同一 source approval、同一 build approval、同一 receipt 和同一 EXE 作为不可替换输入。任何 bytes/hash/path/output-set 漂移均须失败关闭并重新审核。 - 本 hash-only PASS 未执行或自动授权当前回合的 install/HKCU,也不授权 Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或 transcription;是否启动实际安装仍由项目管理员/请求方按原任务链另行明确调度。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-BUILD-CONTRACT-REPAIR-SOURCE-REVIEW-20260806-001 - 记录时间:`2026-08-06T23:04:24+08:00` - 审核阶段:同一事项、同一审核链内,旧 exact build 被静态证明不可安装后的 yt-dlp 依赖/source/build-contract 限定复审;不重开 HOLD/3 实现 PASS、F1/F3、冻结 bridge 或产品合同。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;请求=`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-YTDLP-BUILD-CONTRACT-REPAIR-SOURCE-REVIEW-20260806-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 管理授权:`HANDOFF-INFOADMIN-INFODEV2-BILI-AUTHENTICATED-SESSION-YTDLP-BUILD-CONTRACT-REPAIR-ASSIGN-20260806-001`;旧 EXE/receipt/approval 保持原 bytes/SHA-256,但状态仅为历史证据、`NOT_INSTALLABLE/SUPERSEDED_FOR_INSTALL`。 - 提交快照:source manifest=`3029/D1CE8C00A50CF17E45FB915577369BADA4AD9937335290852F393DC6BD053FCF`;dependency manifest=`723/2943A0EF7968523A342C28824CACC16E2E0D8324D36DEEEE2E6FBABB910AC27D`;yt-dlp wheel=`3184705/F11F2B11D5A8AC4059F9BDF29FA4407DC7C6BB00C5097E95CA22A7A9DB518266`;build script=`16099/8AC31F601FA71712154FCEC5B72E40BECAC32D8943F1B24E5D0B2D7E71E8666B`;installer=`20876/ECEC7AB1C8B6AB5D36CC686251C67990B2BCFEEA03165C6827B128C4664DD3FA`。 - 证据:测试树=`7 files/612 aggregate-manifest bytes/BAF8F96215FFCF83A8B40A42B0B53ACC1766C5392EE768EEE19B8460CD107278`;工具说明=`22353/C730ADDEAA268AB31103A73E5D7AC5E43A93E8EEEE780DD35F018EC4033E33C6`;machine evidence=`4339/7E3E9E61D8CB7B1E91F5701365FD038068F218594197579AAD4BB552FD0072F5`。 ### Findings #### F1(阻断,exact-source 门禁只核对 manifest 自述集合,未核对实际源树集合) - `build_host.ps1:59-97` 只把硬编码的 17 个路径与 `sourceManifest.files` 比较并逐项复算;没有递归枚举 `sourceRoot` 的实际普通文件、目录/reparse 状态。因此,批准后新增但未列入 manifest 的文件不会被拒绝。`test_protocol.py:101-115` 同样只枚举根目录直接文件与 `dependencies/` 直接文件,忽略额外子目录和递归文件。 - reviewer 在系统临时目录复制当前 source,新增未列入 manifest 的根级 `yt_dlp.py`,保持 source manifest 原字节,并生成仅供反例使用的临时 reviewer-style receipt;使用管理员预置 Python 调用 `build_host.ps1 -ValidateOnly`,实际 `exit=0`、返回 `VALIDATION_PASS_ONLY`、output absent。该未批准文件可在构建脚本目录进入 Python/PyInstaller 搜索面,违反“exact source manifest/17 项唯一集合”合同。 - 当前真实源树在 reviewer 独立枚举下为 `17/17 PASS`,但批准回执只绑定 manifest bytes/SHA;若 build 门禁不能在实际执行前重新核对真实树,批准后的额外文件漂移无法 fail closed。 #### F2(阻断,PyInstaller 版本门禁可由外部 `PYTHONPATH` 伪造,pinned builder 身份不成立) - `build_host.ps1:148-150` 通过继承环境的 `python -c importlib.metadata` 判断 PyInstaller 版本;`216-220` 明确保留并拼接调用方原 `PYTHONPATH`;`225` 再以同一受污染解释器执行 `python -m PyInstaller`。脚本没有使用 isolated mode,也未绑定管理端预置的 PyInstaller executable/provision receipt exact bytes/SHA。 - reviewer 在系统临时目录放置伪造 `PyInstaller` package 与 `PyInstaller-6.15.0.dist-info`,只设置 `PYTHONPATH`,再对未改当前 source 运行 `-ValidateOnly`;实际 `exit=0` 并返回 `pyinstaller_version=6.15.0`。因此任意同名模块/metadata 可冒充获准 builder。 - 现有 `test_native_host.py:658-718` 正是通过 `PYTHONPATH=fake-site` 注入伪 PyInstaller,并把脚本接受该 builder、生成 receipt 断言为成功;测试虽通过,却非真空地证明生产门禁可被绕过。相同入口还可能替换 `python -m pip`,破坏“仅离线固定 wheel / 固定 builder”供应链边界。 ### 已通过并冻结的检查 1. 当前 source manifest 严格 JSON、无 duplicate key;所列 17 项与当前实际普通文件集合一致,bytes/SHA-256=`17/17 PASS`;dependency manifest 的 bytes/SHA 与 source manifest 绑定一致。 2. wheel strict ZIP 检查通过:CRC、1059 项唯一名称、无路径逃逸/符号链接、RECORD 对全部非 RECORD 文件的 size/SHA-256 复算均 PASS;`Name=yt-dlp`、`Version=2026.7.4`、`Tag=py3-none-any`。38 条 `Requires-Dist` 全部带 extra 条件,非条件运行依赖=`0`。 3. build/installer 的新 receipt 字段已绑定 dependency manifest、yt-dlp wheel、archive anchors 和 metadata;旧 source/receipt/approval 因 source hash/新字段不匹配不能满足新安装合同。该子结论不替代 F1/F2 的构建前门禁。 4. reviewer 聚焦运行 source-manifest、build-contract、installer transaction 三项测试=`3/3 PASS / Ran 3 in 103.170s`;PowerShell/Python 静态检查与提交证据一致。上述绿灯不消除两项已实际复现的反例。 5. replacement build、install、HKCU、EXE execution、Chrome/Cookie/session、media network/download、`F:\video`、formal `ana-data`、transcription=`0`;reviewer 未修改业务代码、测试、wheel、manifest、说明或冻结 bridge。 ### 最小 required fixes 1. `F1`:在读取外部 source approval 后、任何 Python/pip/PyInstaller/output 动作前,递归枚举真实 source tree;除 source manifest 自身外,普通文件路径集合必须与 manifest 的 17 项逐项、大小写敏感完全一致,并拒绝额外根文件、额外/嵌套目录文件以及 source/dependencies 路径链上的 reparse。build 与 installer 共用或等价执行该 exact-tree gate。新增根级额外 `yt_dlp.py`、嵌套额外文件、reparse(本机支持时)反例,均须在 output/install/registry 前失败。 2. `F2`:生产构建路径不得从调用方 `PYTHONPATH/PYTHONHOME/user-site` 解析 Python 模块,也不得把旧 `PYTHONPATH` 拼回构建环境。所有版本探针、pip、PyInstaller、archive viewer 使用隔离解释器/清洁环境;同时绑定并复算管理员批准的 exact Python、PyInstaller executable 或等价 tree-external provision receipt。新增伪 `PyInstaller`/伪 `pip` 的 `PYTHONPATH` 注入反例,必须证明伪模块未执行且不能形成 accepted receipt;当前 fake-builder 成功测试须改用不会被生产参数选择的明确测试 seam。 3. 只修 F1/F2 及对应离线测试、说明/证据/账本;已通过 wheel 内容、receipt 新字段、installer transaction、HOLD/3 实现与冻结 bridge 不重开。修复后 replacement build 仍保持 0,先提交本 reviewer 做 F1/F2-only source 复审。 ### 结论与边界 - 审计状态:`HOLD` - 阻断问题数:`2` - 结论:`SOURCE_APPROVAL_NOT_CREATED`;当前 source/dependency/build-contract 快照不得用于 replacement build。 - 当前安全边界:旧与新 build 均不得安装;replacement build/install/HKCU/EXE execution 继续冻结。不得接触真实 Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或 transcription。 - 下一复审:只复审 F1/F2、相应非真空离线反例及已通过合同是否回退;不得新增任务或审核链。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-BUILD-CONTRACT-HOLD2-SOURCE-REREVIEW-20260807-001 - 记录时间:`2026-08-07T01:07:09+08:00` - 审核阶段:同一事项、同一审核链内,仅复审前序 HOLD/2 的 F1 actual source-tree exact set/reparse 与 F2 clean exact-builder/no inherited `PYTHONPATH`;F1/F3 runtime、HOLD/3 已通过合同、冻结 bridge 与产品范围未重开。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;请求=`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-YTDLP-BUILD-CONTRACT-HOLD2-SOURCE-REREVIEW-20260807-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 提交快照:source manifest=`3029/E01C1320F8C7677B7435B4C8B87EA3688BA652585648D7CFD1F88D0DADB26958`;build script=`20430/3B0552ADA09D279D08FF89A84F59847C8F86BBC7606257DE8B26203CCBD42F92`;installer=`22247/F127BAE512BEE03AD78780BB1C98065398EF910EF1A6F9D59EE42463F4E2A62D`;dependency manifest=`723/2943A0EF7968523A342C28824CACC16E2E0D8324D36DEEEE2E6FBABB910AC27D`;yt-dlp wheel=`3184705/F11F2B11D5A8AC4059F9BDF29FA4407DC7C6BB00C5097E95CA22A7A9DB518266`。 - 构建信任输入:exact Python=`262144/5912D0884B23C0343983A864C6064242391E2265536F50B88624857E353882C9`;exact PyInstaller executable=`108469/D5DC4427C5E5D417457DAE6FD8B50EF2AFA0A4CE5FDFD5767AB20C5B56555C39`;tree-external provision receipt=`2027/B65F4184E8782394F2CC27C47CB8656C942E366FD80E8FA7A548CE5A3367BACF`。 ### Findings - 阻断问题:无。 - F1 已闭环:reviewer 独立递归枚举当前实际 source tree,除 manifest 自身外为大小写敏感 `17/17` 精确集合,逐文件 bytes/SHA-256 全匹配,source root、`dependencies/` 与全部子路径 reparse=`0`。`build_host.ps1:36-53,82-121` 与 `install_native_host.ps1:70-87,193-231` 均在 Python/build output 或 install/copy/HKCU 之前执行 actual-tree exact-set 与 reparse fail-closed 门禁。 - F2 已闭环:`build_host.ps1:166-217` 在首次 Python 调用前复算 exact Python、PyInstaller executable 与 tree-external provision receipt 的固定 bytes/SHA-256及相互绑定,随后清除所有继承 `PYTHON*`;版本探针、pip、PyInstaller 与 archive viewer 均使用同一 exact Python 的 isolated 调用,不再拼回调用方 `PYTHONPATH`。schema 2 receipt 记录 PyInstaller executable/provision receipt,installer 在任何正式副作用前强制核对;旧 receipt/approval 不能满足新 source/hash/字段合同。 - reviewer 重新执行前序反例与聚焦门禁:额外根级 `yt_dlp.py`、嵌套额外文件与 junction/reparse 均在 output 前失败;伪 `PyInstaller`/伪 `pip` 的 `PYTHONPATH` marker 未执行,`-ValidateOnly` 只由 exact builder 返回且不创建 output;installer transaction/source-manifest 复核通过。测试=`3/3 PASS / Ran 3 in 106.392s`。 - machine evidence=`5519/EBB72CDFC9A389F8D57AAA2F9A4F5E068D49B9CD0CD337F29C43C0F62ED1C8AC`;提交的说明/worklog 与冻结哈希一致。旧 EXE=`8608281/F0D3CE2EF12D7D305B8F765169CBF5430DF9F0D36D03FF4447A85378AFF8A26F`、旧 receipt=`995/9B989A32C92A4EB89911C9D5151F31B416BA8F265785CE575FDD1A23FBEDF63D` 仅保留历史证据,继续 `NOT_INSTALLABLE/SUPERSEDED_FOR_INSTALL`。 ### Reviewer-owned source approval - 已创建 source/build 树外 approval:`ai-inforev/worklog/2026-08-07-bili-authenticated-session-ytdlp-build-source-approval.json`=`373/26AF51848717C47A2915D633B258269EA79213A94BAFEFF9CE7D30CDC2A77F96`。 - approval 仅绑定 source manifest=`3029/E01C1320F8C7677B7435B4C8B87EA3688BA652585648D7CFD1F88D0DADB26958`,scope=`controlled-build-source-manifest`;未创建、复用或更新 install-exact-build approval。 ### 结论与边界 - 审计状态:`PASS` - 阻断问题数:`0` - 结论:`HOLD2_F1_F2_CLOSED_SOURCE_APPROVED`。 - 仅允许管理员已授权的唯一 owner 使用本次 exact source manifest、上述 reviewer approval、exact Python/PyInstaller/provision receipt,在新的不存在 output 目录执行一次 clean replacement build;任何 bytes/hash/path/tree/output-set 漂移均须失败关闭并重新审核。 - 本 PASS 不授权 install/HKCU/EXE execution,也不授权 Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或 transcription。replacement EXE/schema 2 receipt 形成后仍须沿同链做 hash-only 限定确认并取得新的 install-exact-build approval。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-METADATA-REPAIR-SOURCE-REREVIEW-20260807-001 - 记录时间:`2026-08-07T02:37:42+08:00` - 审核阶段:同一事项、同一审核链内,仅复审前次受控 replacement build 因 `copy_metadata('yt-dlp')` 无法发现临时 `.deps` distribution 而失败后的 metadata-discovery source 修复;前序 F1 actual source-tree/reparse、F2 exact Python/PyInstaller/provision receipt、HOLD/3 已通过合同、冻结 bridge 与产品范围不重开。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;请求=`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-YTDLP-METADATA-REPAIR-SOURCE-REREVIEW-20260807-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 管理授权:`HANDOFF-INFOADMIN-INFODEV2-BILI-AUTHENTICATED-SESSION-YTDLP-METADATA-REPAIR-REBUILD-AUTH-20260807-001`;前次失败证据=`3253/34EEC108F0F27384F605C67AB4529682463196B8C0A5F03CC96E595DD61D19FA`,失败 output 保持不存在,repair build count=`0`。 - 提交快照:source manifest=`3029/AC852D40CF2B6FE891BE25D2E6E068A876EAC60E07EE6E9DB6826AC1064B29B8`;build script=`25586/F5E9FC58313B2CB765772BF3A5C8605BCA9DD91A1FF74D0F03DBEB3174949845`;installer=`22247/F127BAE512BEE03AD78780BB1C98065398EF910EF1A6F9D59EE42463F4E2A62D`;dependency manifest=`723/2943A0EF7968523A342C28824CACC16E2E0D8324D36DEEEE2E6FBABB910AC27D`;yt-dlp wheel=`3184705/F11F2B11D5A8AC4059F9BDF29FA4407DC7C6BB00C5097E95CA22A7A9DB518266`。 - 独立快照复核:上述文件 bytes/SHA-256 全部匹配;实际 source tree 为大小写敏感 exact `17/17`、逐文件 hash 全匹配、reparse=`0`;候选 output `dev/tmp/bili-auth-controlled-build-ytdlp-20260807-002` 不存在;旧 reviewer approval 仍只绑定前一 manifest,未创建绑定本次 manifest 的新 approval。 ### Findings #### F1(阻断,未验证的 `.deps` 代码在完整性门禁前被执行) - `build_host.ps1:263-275` 将 pinned wheel 安装到 output-owned `.deps` 后,`build_host.ps1:276-279` 立即把该目录插入 `sys.path` 并执行 `import yt_dlp`;实际 `.deps` 的 canonical direct-child/owner、递归 no-reparse、wheel 派生精确文件集与 hash、`RECORD`、确定性 `INSTALLER/REQUESTED` 以及唯一 distribution/version 校验直到 `build_host.ps1:280-397` 才执行。因此,当前顺序违反“只有已验证 `.deps` 才可进入解释器并执行”的修复合同。 - reviewer 在系统临时目录复制当前 source,仅修改临时脚本,使 pip 安装后、上述 legacy import probe 前向 `.deps/yt_dlp/__init__.py` 追加 marker 写入代码,并同步临时 manifest/临时 reviewer-style receipt;实际执行结果为 `exit=1`、`marker_executed=true`、`output_exists=false`、最终 exact-tree gate=`true`。这证明恶意或损坏的依赖代码已在后续 fail-closed 门禁发现篡改之前执行,output 回滚不能消除该前置代码执行风险。 - 提交的 missing metadata/tampered package/wrong owner/extra distribution 用例与 reviewer 聚焦运行均能在最终门禁处失败,但没有断言“被篡改的 import-executed module 在门禁前未执行”。独立运行两个相关测试=`2/2 PASS / Ran 2 in 122.812s`,不构成对上述 marker 反例的闭环。 ### 已通过并冻结的检查 1. source actual-tree exact set/reparse、exact Python/PyInstaller/provision receipt、继承 `PYTHON*` 清理及旧 F1/F2 修复未发现回退;dependency manifest 与 pinned wheel 的提交 hash 匹配。 2. 前次 build failure 被如实保留,前次失败 output 与本次候选 output 均不存在;旧 EXE/receipt/approval 继续仅作历史证据且 `NOT_INSTALLABLE/SUPERSEDED_FOR_INSTALL`。 3. 当前 repair build、install、HKCU、EXE execution、Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data`、transcription=`0`;reviewer 未修改产品、测试、wheel、manifest、说明或冻结 bridge。 ### 最小 required fixes 1. 删除 `build_host.ps1:276-279` 的 pre-validation executable import probe,或将所有对 `.deps` 的 `sys.path` 注入/模块导入严格移到 exact-tree、reparse、wheel 派生 bytes/hash、`RECORD`、`INSTALLER/REQUESTED` 与唯一 `yt-dlp==2026.7.4` distribution 全部验证成功之后。现有 post-validation PyInstaller launcher 已可在执行 PyInstaller 前检查 `importlib.metadata.version('yt-dlp')`,不得保留第二条更早的可执行依赖入口。 2. 增加非真空反例:在 pip install 后篡改 `.deps/yt_dlp/__init__.py`(或其他首次 import 必执行模块)写 marker;断言构建在完整性门禁失败、marker 不存在、output/receipt 不存在。保留既有 missing metadata、wrong owner、extra distribution 与最终清理断言。 3. 仅修复上述顺序和对应离线测试/说明/证据;replacement build 继续为 `0`,先回到同链做 metadata-repair-only source 复审。不得安装、执行 EXE 或触发任何真实认证、联网、媒体和正式路径动作。 ### 结论与边界 - 审计状态:`HOLD` - 阻断问题数:`1` - 结论:`SOURCE_APPROVAL_NOT_CREATED`;本次 source manifest=`3029/AC852D40CF2B6FE891BE25D2E6E068A876EAC60E07EE6E9DB6826AC1064B29B8` 不得用于 replacement build。 - 当前安全边界:replacement build/install/HKCU/EXE execution 继续冻结;不得接触真实 Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或 transcription。 - 下一复审:仅复审本 F1 顺序闭环、marker 非执行反例及已通过合同是否回退;不新增任务、审核链或产品范围。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-PREVALIDATION-F1-SOURCE-REREVIEW-20260807-001 - 记录时间:`2026-08-07T03:25:02+08:00` - 审核阶段:同一事项、同一审核链内,仅复审前序 HOLD/1 的 `F1_PREVALIDATION_DEPS_CODE_EXECUTION`;F1/F2 source/provision gates、HOLD/3 runtime contracts、冻结 bridge 与产品范围不重开。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;请求=`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-YTDLP-PREVALIDATION-F1-SOURCE-REREVIEW-20260807-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序审计:`DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-METADATA-REPAIR-SOURCE-REREVIEW-20260807-001 / HOLD/1`。 - 提交快照:build script=`25093/43816E7932A785321B545073FEAD9EB38198E5ED3B07F2469062895ADC41238F`;source manifest=`3029/463182C6980734B72831BDF9B387160F8AD21A03B52CBAB4AC74CA98CEB1B7AE`;test=`59374/55F7F4ECA14E370BAB1D5D1CA154BE8BFD1E602C5460B69670A376751C5E08EA`;dependency manifest=`723/2943A0EF7968523A342C28824CACC16E2E0D8324D36DEEEE2E6FBABB910AC27D`;wheel=`3184705/F11F2B11D5A8AC4059F9BDF29FA4407DC7C6BB00C5097E95CA22A7A9DB518266`。 - 说明/证据:工具说明=`31945/7A9D76F77A497A02366306659E24EA50EBA3270ACE1876B05DF563133E562F92`;secondary worklog=`12524/0512E88954B1972E26DDBC5C6552FA562A541014EE4CD6F117BB9930C3F1907C`;machine evidence=`2686/A3BA1EDB3C5C236C886B17821095481541DA1CAA7A349C3F4C25D279AF6BADF2`。 ### Findings - 阻断问题:无。 ### F1 闭环 1. `build_host.ps1:263-275` 仅执行 isolated/no-index/no-deps/no-compile 的 pinned wheel 安装;旧的 pip 后 executable `installedProbe/import yt_dlp` 已删除。静态检索确认校验前不存在 `.deps` 的 `sys.path` 注入或模块 import。 2. `build_host.ps1:276-393` 在执行任何 `.deps` 代码前,依次验证 `.deps` 为 output 的 canonical direct child、目录与递归子项均非 reparse、实际文件集合/bytes/SHA-256 与 pinned wheel 派生集合一致、`RECORD` 全路径/hash/size 一致、`INSTALLER/REQUESTED` 为确定值、distribution 恰为唯一 `yt-dlp==2026.7.4`,且拒绝 PyInstaller 注入。 3. 首次把 `.deps` 放入 `sys.path` 的位置为 `build_host.ps1:394-411` 的 post-validation PyInstaller launcher;其先确认路径归属和 metadata version,再调用已批准 PyInstaller。未发现第二条提前 executable dependency 路径。 4. 新反例在 TemporaryDirectory 的脚本副本中,于 pip 后向 `.deps/yt_dlp/__init__.py` 注入 marker 写入代码;integrity gate 非零、output absent、receipt absent、marker absent。reviewer 独立复跑该完整测试=`1/1 PASS / Ran 1 in 53.791s`。 ### Passed/frozen 未回退 - reviewer 独立复算 actual source tree:除 source manifest 自身外大小写敏感 exact `17/17`,逐文件 bytes/SHA-256 全匹配,reparse=`0`;候选 output `dev/tmp/bili-auth-controlled-build-ytdlp-20260807-002` 不存在。 - 冻结 bridge 保持:code=`28500/749FC486B0F42315BD463F11771FE2A7C71CAB53DD9AC2E411CE82E1175DFF13`;tests=`22553/80D8C94DF6922820AA4643984E91209C16046364C20A6A04F6ADA22C8DC36C8B`;usage=`6931/8103EA6F2077BF6BB30B31BCDFB3786B057306A747C18286E2622D19F8393687`。 - 提交的 extension=`32 tests/OK/5 skipped`、bridge=`21/21 PASS`、project=`134 tests/OK/6 skipped` 及 parser/compile/UTF-8/governance 证据与冻结工件一致;本限定复审未重跑 build、安装或真实链路。 - replacement build/install/HKCU/EXE execution/Chrome/Cookie/session/network/download/media/`F:\video`/formal `ana-data`/transcription=`0`。 ### Reviewer-owned source approval - 已创建 source/build 树外 approval:`ai-inforev/worklog/2026-08-07-bili-authenticated-session-ytdlp-prevalidation-source-approval.json`=`373/54514FCD70D2ED85F33E48433B13241F845A329A3DBD2C089AF416F1D67B2CEB`。 - approval exact schema 1,仅绑定 source manifest=`3029/463182C6980734B72831BDF9B387160F8AD21A03B52CBAB4AC74CA98CEB1B7AE`,scope=`controlled-build-source-manifest`,`approved_by_role=dev.reviewer.project`;未创建、复用或更新 install-exact-build approval。 ### 结论与边界 - 审计状态:`PASS` - 阻断问题数:`0` - 结论:`F1_PREVALIDATION_DEPS_CODE_EXECUTION_CLOSED_SOURCE_APPROVED`。 - 仅允许管理员已授权的唯一 owner 使用本次 exact source manifest、新 reviewer approval、既有 exact Python/PyInstaller/provision receipt,在新的不存在 output 目录执行一次 clean replacement build;任何 bytes/hash/path/tree/output-set 漂移均须失败关闭并重新审核。 - 本 PASS 不授权 install/HKCU/EXE execution,也不授权 Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或 transcription。replacement EXE/schema 2 receipt 形成后仍须沿同链做 hash-only 限定确认并取得新的 install-exact-build approval。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-ARCHIVE-METADATA-CONTRACT-SOURCE-REREVIEW-20260808-001 - 记录时间:`2026-08-08T13:44:23+08:00` - 审核阶段:同一事项、同一审核链内,仅复审 archive-metadata contract source 快照;前序 source tree、prevalidation、HOLD/3 runtime contracts、冻结 bridge 与产品范围不重开。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;MB-X 消息=`msg_20260807042629035_d5f27466`;请求=`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-YTDLP-ARCHIVE-METADATA-CONTRACT-SOURCE-REREVIEW-20260807-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 提交冻结快照:source manifest=`3029/508F69CE49224F0B79BA24E25F47CE84E598C3D6747FF284A7B4FD32E7E19910`;build script=`32216/4E25D57D8133670D25BACF0E2A38D1C673DB9576413B22EBDC28304CAB6B2A33`;installer=`22467/DBF1A828DC343DCA4B52283B8EE189962007581E42D03D213A55461CE05CFEF6`;test=`62074/66B70D38E983806B82A2D00A1F741A79445E9C9CF80EA2C0951EED2935C1CC2B`;dependency manifest=`723/2943A0EF7968523A342C28824CACC16E2E0D8324D36DEEEE2E6FBABB910AC27D`;wheel=`3184705/F11F2B11D5A8AC4059F9BDF29FA4407DC7C6BB00C5097E95CA22A7A9DB518266`;machine evidence=`2513/F885984DB369081F374AB1E655F70F63169B2612A77190C790B8B205DD4E47AE`。 ### Findings - 阻断问题:无。 ### Archive metadata contract 闭环 1. 前序独立检查已确认 actual source tree 大小写敏感 exact `17/17`、逐文件 bytes/SHA-256 全匹配、reparse=`0`;本 continuation 未重做该检查。 2. `build_host.ps1` 使用 PyInstaller `6.15.0 CArchiveReader` 结构化遍历顶层 CArchive 与嵌套 PYZ,规范化路径分隔符并拒绝重复归一化路径;固定要求 worker、`yt_dlp` 及 downloader/globals/plugins/version 模块锚点。 3. metadata root 必须唯一为 `yt_dlp-2026.7.4.dist-info`,类型、Name/Version、精确 7 文件集合、逐文件 bytes 与固定 tree hash 均须匹配已验证 `.deps`;installer 同步强制 schema 2 receipt 的 archive verification、source/dependency/build 绑定与 exact EXE 绑定,旧 receipt/approval 不可复用。 4. 既有离线实物树 `dev/tmp/bili-auth-ytdlp-build-contract-repair-20260806-001/metadata-install-layout-probe-no-compile/yt_dlp-2026.7.4.dist-info` 只读复算为精确 7 文件:`INSTALLER`、`METADATA`、`RECORD`、`REQUESTED`、`WHEEL`、`entry_points.txt`、`licenses/LICENSE`;reparse=`0`;按正式算法所得 tree SHA-256=`7C9ABE2387AF3594593BB162C29757B10693F90DD61606272089DB9815C2105C`,与 machine evidence 一致。 5. 前序已完成的聚焦 archive 合同测试=`1/1 PASS / Ran 1 in 156.385s`,覆盖模块缺失、metadata 缺失、归一化重复、Name/Version 错误、不完整/额外 metadata 路径、替代内容及 Windows 分隔符正例;本 continuation 未重跑测试。 6. 候选 output `dev/tmp/bili-auth-controlled-build-ytdlp-20260807-003` 保持不存在;build/install/HKCU/EXE execution/Chrome/Cookie/session/network/download/media/`F:\video`/formal `ana-data`/transcription=`0`。 ### Reviewer-owned source approval - 已创建 source/build 树外 approval:`ai-inforev/worklog/2026-08-08-bili-authenticated-session-ytdlp-archive-metadata-source-approval.json`=`373/A46A8D29A42B85E0DB83AA4EC5153B298BE9C24684637C6B7864AD23EF5B41E8`;其 exact schema 1 仅绑定 source manifest=`3029/508F69CE49224F0B79BA24E25F47CE84E598C3D6747FF284A7B4FD32E7E19910`,scope=`controlled-build-source-manifest`,`approved_by_role=dev.reviewer.project`。 - 未创建、复用或更新 install-exact-build approval;后续 exact EXE/schema 2 receipt 仍须沿同链做 hash-only 限定确认。 ### 结论与边界 - 审计状态:`PASS` - 阻断问题数:`0` - 结论:`ARCHIVE_METADATA_CONTRACT_CLOSED_SOURCE_APPROVED`。 - 仅允许管理员已授权的唯一 owner 使用本次 exact source manifest、上述 reviewer approval、既有 exact Python/PyInstaller/provision receipt,在新的不存在 output 目录执行一次 clean replacement build;任何 bytes/hash/path/tree/archive/output-set 漂移均须失败关闭并重新审核。 - 本 PASS 不授权 install/HKCU/EXE execution,也不授权 Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或 transcription。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-ARCHIVE-METADATA-TYPE-CONTRACT-SOURCE-REREVIEW-20260808-001 - 记录时间:`2026-08-08T16:23:14+08:00` - 审核阶段:同一事项、同一审核链内,仅复审 build-003 的 `E_ARCHIVE_METADATA_TYPE` 假阴性及管理员授权的 exact `x` / Windows-promoted `b` metadata type 合同;前序 source-tree/reparse/dependency/clean-environment/prevalidation/path/file-set/bytes/identity/tree-hash gates、冻结 bridge/runtime 与产品范围不重开。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;请求=`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-YTDLP-ARCHIVE-METADATA-TYPE-CONTRACT-SOURCE-REREVIEW-20260808-001`;MB-X 消息=`msg_20260808155805146_193e6c84`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 管理授权:`HANDOFF-INFOADMIN-INFODEV2-BILI-AUTHENTICATED-SESSION-YTDLP-TYPE-CONTRACT-REPAIR-BUILD004-AUTH-20260808-001`;build-004 在本复审前保持 attempt=`0`、output absent。 - 冻结快照:build script=`33020/3739436920FCEA8BA68DC04BBDAB0F346C08216F49D89A097C50075912A258A0`;installer=`22741/53A1D1AFD9E4571A2491AE66C5E721E77A2201DBFAA29C9094E42CE0CB684C2A`;source manifest=`3029/21009AADBAC3F25AAA15712948232796E813A5973FDE497B11A334915A3C7EB3`;test=`69608/2E7D6BE3B9607A34A90B283F2CDDBC65A31CD2AF02026EB97E8CED6C153075AB`;machine evidence=`4012/5880E90521F1B382C8B546A5814CBEC5DDEC826897F1EC498EEDE0C18C4263EB`。 - build-003 原始失败证据:`dev/tmp/bili-auth-ytdlp-build-contract-repair-20260806-001/replacement-build-003-blocked-20260808.json=3516/0FA8D0D9719D19C819F607E383D12B93021CE718489A742F740FBFEE13BBCC73`;attempt=`1`、retry=`0`、accepted EXE/receipt=`0/0`,失败 output 已回滚不存在。 ### Findings - 阻断问题:无。 ### Metadata type contract 闭环 1. reviewer 独立复算 source manifest 与当前 actual source tree:大小写敏感 exact `17/17`,missing/extra/bad hash=`0/0/0`,source root 及递归子路径 reparse=`0`;提交的 build/installer/test/evidence bytes/SHA-256 均匹配。 2. `build_host.ps1` 仅在唯一候选 metadata root 已锁定为 `yt_dlp-2026.7.4.dist-info` 且七个精确相对文件集合已冻结后,对这些成员接受 CArchive type `x` 或 Windows 因 `os.access(source, X_OK)` 提升的 `b`;`b` 不会扩展为任意路径、模块、脚本或其他数据许可。 3. type `Z/a/d/l/m/n/o/s/z` 继续 `E_ARCHIVE_METADATA_TYPE` fail closed;错误 metadata 路径上的 `b` 不能成为合法根并以 `E_ARCHIVE_METADATA_DUPLICATE_OR_PATH` 失败。逐文件 bytes、Name/Version、固定七文件集合与 tree SHA-256 继续独立绑定。 4. schema 2 receipt 新增实际 `archive_verification.metadata_type_codes`;builder 只接受非空且为 `b/x` 子集,installer 同步验证该字段以及固定 metadata tree hash、source/dependency/build/EXE 绑定。旧 receipt 与旧 source approval 不能满足本快照。 5. reviewer 独立运行真实 PyInstaller CArchiveWriter 的 `x/b` 合同与 installer/receipt 事务两项窄测:`2/2 PASS / Ran 2 in 17.027s`。测试覆盖实际 writer 生成的两种类型、receipt type codes、installer 强制绑定与事务回滚;未运行正式 build。 6. 提交证据中的 complete type/build gate 矩阵覆盖其他类型、错误路径 `b`、路径/文件集/bytes/Name/Version/tree-hash 漂移;bridge=`21/21 PASS`、project=`135 tests OK / 6 skipped` 与静态/治理证据未发现冻结合同回退。 ### Reviewer-owned source approval - 已创建 source/build 树外 approval:`ai-inforev/worklog/2026-08-08-bili-authenticated-session-ytdlp-archive-metadata-type-source-approval.json`=`373/102B30405B81137BD3AC9B81CFA39A6A7BB21531115FB3F361F821B2A093335E`。 - approval exact schema 1,仅绑定 source manifest=`3029/21009AADBAC3F25AAA15712948232796E813A5973FDE497B11A334915A3C7EB3`,scope=`controlled-build-source-manifest`,`approved_by_role=dev.reviewer.project`;未创建、复用或更新 install-exact-build approval。 ### 结论与边界 - 审计状态:`PASS` - 阻断问题数:`0` - 结论:`ARCHIVE_METADATA_TYPE_CONTRACT_CLOSED_SOURCE_APPROVED`。 - 仅允许管理员已授权的唯一 owner 使用本次 exact source manifest、上述 reviewer approval 与既有 exact Python/PyInstaller/provision receipt,在新的不存在 output 目录执行一次 build-004;任何 bytes/hash/path/tree/archive/type/output-set 漂移均须失败关闭并重新审核。 - 本 PASS 不授权 install/HKCU/EXE execution,也不授权 Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或 transcription。build-004 形成 exact EXE/schema 2 receipt 后仍须沿同链做 hash-only 限定确认并取得 install-exact-build approval。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-REPLACEMENT-BUILD-004-HASH-ONLY-CONFIRMATION-20260808-001 - 记录时间:`2026-08-08T17:14:35+08:00` - 审核阶段:同一事项、同一审核链内,对 build-004 唯一 EXE 与 schema 2 receipt 做 exact-build hash-only 限定确认;不重开已通过 source/runtime 合同,不执行 EXE,不安装,不操作 HKCU 或任何真实认证、联网、媒体路径。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;MB-X 消息=`msg_20260808170546380_8f0fb84f`;请求=`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-YTDLP-REPLACEMENT-BUILD-004-HASH-ONLY-CONFIRMATION-20260808-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序 source 审核:`DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-ARCHIVE-METADATA-TYPE-CONTRACT-SOURCE-REREVIEW-20260808-001 / PASS/0`;reviewer source approval=`ai-inforev/worklog/2026-08-08-bili-authenticated-session-ytdlp-archive-metadata-type-source-approval.json=373/102B30405B81137BD3AC9B81CFA39A6A7BB21531115FB3F361F821B2A093335E`,精确绑定 source manifest=`3029/21009AADBAC3F25AAA15712948232796E813A5973FDE497B11A334915A3C7EB3`。 - build-004 提交实物:EXE=`dev/tmp/bili-auth-controlled-build-ytdlp-20260808-004/project-info-bili-auth-native-host.exe=21343775/DBF155BCC05B4DF55592D0A4B56612F8BE9C990B3B9AF7691F6A11648866B0B0`;schema 2 receipt=`dev/tmp/bili-auth-controlled-build-ytdlp-20260808-004/build-artifact-manifest.json=2874/0B36AA7DCA3AD80F8A370E96D50CAAFB386291EE2741305C7797ED663F5C2B27`;machine evidence=`3842/82F2DCAEC8F79E44AA73B740BAEEA84FF2F2FCC02EE0E003C2D71E3B632F8057`。 ### Findings #### F1(阻断):build-004 receipt 的 metadata tree hash 与同一 source-approved installer 的 preinstall 身份门禁不一致 - reviewer 只读复算确认 receipt 的 `archive_verification.metadata_tree_sha256=32F1DC23F6704966AE4511CB173318CD11FCBA031323028D268D9F2488589E70`。使用获批 PyInstaller 6.15.0 的 `CArchiveReader` 静态读取 EXE,得到唯一 `yt_dlp-2026.7.4.dist-info` 的精确七文件集合、type codes=`[b]`,按冻结算法复算 tree SHA-256 同为 `32F1DC23F6704966AE4511CB173318CD11FCBA031323028D268D9F2488589E70`;该检查未加载或执行 EXE。 - 但同一 source manifest 所冻结的 `install_native_host.ps1=22741/53A1D1AFD9E4571A2491AE66C5E721E77A2201DBFAA29C9094E42CE0CB684C2A` 在第 259 行只接受 `archive_verification.metadata_tree_sha256=7C9ABE2387AF3594593BB162C29757B10693F90DD61606272089DB9815C2105C`,否则在复制产物或 HKCU 前抛出 `Build artifact receipt identity mismatch.`。 - 因而当前 exact EXE/receipt 虽然自身 bytes/hash 与静态 archive 内容一致,却无法通过其获批源快照自身的 installer preinstall 合同;为其签发 `install-exact-build` approval 会把已知不可安装的构建错误提升为安装许可,属于阻断。 ### 已通过的 hash-only 检查 1. output root 恰好包含两个普通、非 reparse 文件,目录与 `.build/.spec/.deps` 均为 0;EXE 前两字节为 `MZ`,未执行。 2. EXE、receipt、machine evidence、source manifest、source approval、build script、dependency manifest、pinned wheel、exact Python/PyInstaller 与 provision receipt 的提交 bytes/SHA-256 均与实物匹配。 3. receipt 为 strict UTF-8/no BOM/no trailing whitespace、无 duplicate key,schema 2、target/build identity、source/dependency/builder 绑定及唯一 EXE name/bytes/SHA-256 均匹配。 4. 文档=`42401/387FEF1D591264AA0B412C82F8A187E161A38BF5F3674057D5B8A20FD9DDCB5D`、secondary worklog=`22062/E7A1E5ECC26C1835F239ADBC884F0024CEF0420F694BCD37DB030EC24BFE80F0`、执行日志=`215555/4BC01DB6C402A6CE00E205122E1A6A982EF166CEF8FC438E718792F23BF08272` 与提交一致;提交证据记录 install/HKCU/EXE execution/Chrome/Cookie/session/network/download/real media/`F:\video`/formal `ana-data`/transcription=`0`。 ### 最小 required fixes 1. 保持当前 build-004 不安装、不执行、不签发 install approval。仅在同一任务/审核链内修正 build/installer 的 metadata tree hash 合同,使二者基于同一套已验证 metadata 七文件和同一 canonical tree-hash 算法得出并强制同一个值;不得放宽精确文件集、逐文件 bytes、Name/Version、type `b/x`、source/dependency/builder/EXE 绑定。 2. 增加非真空离线反例:把生产等价 schema 2 receipt 交给 installer 的 preinstall validation,证明正确 current tree hash 在任何 copy/HKCU 前通过;旧 `7C9ABE...105C` 或任意漂移值必须在同一位置 fail closed,且 install root/HKCU/临时残留为 0。 3. installer/source manifest 变更后,当前 build-004 receipt 的 source-manifest 绑定即过期;必须先完成同链 source 限定复审与新的 reviewer-owned source approval,再经管理员授权生成一个新的 absent-output exact build,最后重新提交 hash-only 确认。不得复用本轮未签发的 install approval,也不得在复审前重试安装。 ### 结论与边界 - 审计状态:`HOLD` - 阻断问题数:`1` - 结论:`BUILD004_NOT_INSTALLABLE_NO_INSTALL_APPROVAL` - reviewer 未创建、复用或更新任何 `install-exact-build` approval。 - 当前边界:build-004 EXE/receipt 仅可保留为冻结失败证据;install/HKCU/EXE execution 继续冻结,也不得触发 Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或 transcription。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-CANONICAL-TREE-HASH-SOURCE-REREVIEW-20260808-001 - 记录时间:`2026-08-08T19:55:10+08:00` - 审核阶段:同一事项、同一审核链内,仅复审 build-004 `HOLD/1` 的 canonical seven-file tree-hash source 修复;冻结 bridge/worker/runtime 及既有 source-tree/reparse/dependency/clean-environment/prevalidation/path/file-set/bytes/Name/Version/type `b|x` 合同不重开。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;MB-X 消息=`msg_20260808194541817_31967104`;请求=`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-YTDLP-CANONICAL-TREE-HASH-SOURCE-REREVIEW-20260808-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 前序审计:`DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-REPLACEMENT-BUILD-004-HASH-ONLY-CONFIRMATION-20260808-001 / HOLD/1`。 - 冻结 source:build script=`35414/6184EBA087470BB5DBD6FEC29EB22068F8119FBDE2ED640715E8317B5A928C04`;installer=`24079/AA9667A3CD765B21058F234FD82DFDB9621161246041EC595E4BCB17DDCFDE86`;source manifest=`3681/333BA59512C5F68B35C00B8C9738C8B26FB78285F05851F9F35BA3FC44819535`;test=`70133/8913DC78EBB1780C29A518D7AC4DE90E4C8B0E8B8FF82106A3461326A3389045`;machine evidence=`3862/20F83A539477F0514BAB087F88036D3324F4BCD9950FF5C1409492CD17472CFB`。 ### Findings - 阻断 findings:`0`。 ### Canonical tree-hash 合同闭环 1. reviewer 独立复算 actual source tree:除 source manifest 自身外大小写敏感 exact `17/17`,missing/extra/bad hash=`0/0/0`;source root、子目录与文件 reparse=`0`。dependency manifest=`723/2943A0EF7968523A342C28824CACC16E2E0D8324D36DEEEE2E6FBABB910AC27D`、pinned wheel=`3184705/F11F2B11D5A8AC4059F9BDF29FA4407DC7C6BB00C5097E95CA22A7A9DB518266` 未漂移。 2. `source-artifact-manifest.json#archive_metadata_contract` 是单一 golden definition,精确冻结 root=`yt_dlp-2026.7.4.dist-info`、七个 relative files、Name=`yt-dlp`、Version=`2026.7.4`、types=`[b,x]`、`SOURCE_DATE_EPOCH=1786207924`、canonical 算法及 tree SHA-256=`32F1DC23F6704966AE4511CB173318CD11FCBA031323028D268D9F2488589E70`。 3. build 与 installer 均先对该合同做 exact key/value/file-set 校验,再从同一 manifest 读取 canonical tree hash;build 对已验证 `.deps` 与静态 CArchive 分别复算并强制相等,receipt 只写入经复算通过的值;installer 在任何 copy/HKCU 前把 receipt 与同一 manifest 的 canonical 值精确比较。产品 build/installer 中历史 `7C9ABE...105C` 匹配数=`0`。 4. build 仅在 pinned wheel 的 pip 子进程期间设置 `SOURCE_DATE_EPOCH`,并在 `finally` 中恢复原进程值。已有隔离实物树精确七文件、reparse=`0`,`RECORD=91484/433ED247B6625B8960AD19676BD04EC689640CCE050604A925A3EC013AF07D4F`;reviewer 按冻结算法复算 tree SHA-256=`32F1DC23F6704966AE4511CB173318CD11FCBA031323028D268D9F2488589E70`,Name/Version 唯一且匹配。 5. reviewer 限定运行 installer production-equivalent receipt 与真实 CArchive writer `x/b` 两项窄测:`2/2 PASS / Ran 2 in 22.169s`。正例 canonical `32F1...E70` 返回 `VALIDATION_PASS_ONLY` 且 install root/registry 为 0;历史 `7C9...105C`、全零、任意漂移均在 copy/HKCU 前 fail closed;真实 writer 的 `x`、Windows-promoted `b` 均维持七文件 bytes/identity/tree 门禁。两次先行 unittest loader 调用因 hyphen 路径与 `-I` 排除 cwd 在测试体执行前报 import error,修正为目标测试目录非隔离模块加载后上述两项均通过,不构成产品或合同失败。 ### 其他静态与边界检查 - PowerShell parser、Python in-memory compile、strict UTF-8/no BOM/no trailing whitespace、JSON parse、scoped diff=`PASS`;治理=`OK/projects=1/warnings=0`。 - 提交的 synthetic exact-builder seam=`1/1 PASS / 348.093s`、frozen bridge=`21/21 PASS`、final project=`135 tests OK / 6 skipped` 证据与冻结工件一致,本限定复审未重跑长矩阵或正式 build。 - build-004 EXE/receipt 保持 immutable `NOT_INSTALLABLE` 历史;build-005 attempt=`0`,`dev/tmp/bili-auth-controlled-build-ytdlp-20260808-005` 不存在。install/HKCU/EXE execution/Chrome/Cookie/session/network/download/media/`F:\video`/formal `ana-data`/transcription=`0`。 ### Reviewer-owned source approval - 已创建 source/build 树外 approval:`ai-inforev/worklog/2026-08-08-bili-authenticated-session-ytdlp-canonical-tree-hash-source-approval.json=373/E0D621EB2C5E8149FE9B775CF7EA2F2ECB17C3FC3A6D4911D67CF2D24ACBD3EF`。 - approval exact schema 1,仅绑定 source manifest=`3681/333BA59512C5F68B35C00B8C9738C8B26FB78285F05851F9F35BA3FC44819535`,scope=`controlled-build-source-manifest`,`approved_by_role=dev.reviewer.project`;未创建、复用或更新 `install-exact-build` approval。 ### 结论与边界 - 审计状态:`PASS` - 阻断问题数:`0` - 结论:`CANONICAL_TREE_HASH_CONTRACT_CLOSED_SOURCE_APPROVED` - 仅允许管理员已授权的唯一 owner 使用本次 exact source manifest、上述 reviewer source approval 与既有 exact Python/PyInstaller/provision receipt,在新的不存在 output 目录执行一次 build-005;任何 source/dependency/tree/archive/type/receipt/output-set 漂移必须 fail closed。 - 本 PASS 不授权 install/HKCU/EXE execution,也不授权 Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或 transcription。build-005 形成 exact EXE/schema 2 receipt 后仍须同链 hash-only 限定确认并取得新的 `install-exact-build` approval。 - Open questions:无。 ## DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-REPLACEMENT-BUILD-005-HASH-ONLY-CONFIRMATION-20260808-001 - 记录时间:`2026-08-08T20:34:29+08:00` - 审核阶段:同一事项、同一审核链内,仅对管理员授权的唯一 build-005 EXE、schema 2 receipt、source/dependency/builder 绑定、canonical metadata tree contract 与精确输出集合做静态 hash-only 限定确认;不重开已通过 source/runtime 合同,不执行 EXE,不安装,不写 HKCU,也不触发任何真实认证、联网、下载、媒体或正式路径动作。 - 审核对象:`DEV-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-DOWNLOAD-20260805-001`;需求=`REQ-BILI-DYNAMIC-COLLECTOR-20260804-001`;请求=`HANDOFF-INFODEV2-INFOREV-BILI-AUTHENTICATED-SESSION-YTDLP-REPLACEMENT-BUILD-005-HASH-ONLY-CONFIRMATION-20260808-001`;来源/回传任务=`019fbcbb-bed7-7c90-83ab-f50610f80d3a`。 - 管理授权:`HANDOFF-INFOADMIN-INFODEV2-BILI-AUTHENTICATED-SESSION-YTDLP-CANONICAL-TREE-HASH-REPAIR-BUILD005-AUTH-20260808-001`。 - 前序 source 审核:`DEV-AUDIT-PROJECT-INFO-BILI-AUTHENTICATED-SESSION-YTDLP-CANONICAL-TREE-HASH-SOURCE-REREVIEW-20260808-001 / PASS/0`;reviewer source approval=`ai-inforev/worklog/2026-08-08-bili-authenticated-session-ytdlp-canonical-tree-hash-source-approval.json=373/E0D621EB2C5E8149FE9B775CF7EA2F2ECB17C3FC3A6D4911D67CF2D24ACBD3EF`,精确绑定 source manifest=`3681/333BA59512C5F68B35C00B8C9738C8B26FB78285F05851F9F35BA3FC44819535`。 - build-005 提交实物:EXE=`dev/tmp/bili-auth-controlled-build-ytdlp-20260808-005/project-info-bili-auth-native-host.exe=21343716/CABE09ACC0CC151B3C537F68B9AF1544D6CB5BCAF64FE3B3DB12055D52C732EE`;schema 2 receipt=`dev/tmp/bili-auth-controlled-build-ytdlp-20260808-005/build-artifact-manifest.json=2874/CC6663A15CDEB375167900730A9F956C9B09839558586E5DFC3D7FC57728ACC0`;machine evidence=`dev/tmp/bili-auth-ytdlp-build-contract-repair-20260806-001/replacement-build-005-success-20260808.json=4496/3FB4557AD81556068B27F6EBA10017883B511C52DDD66AA505150AAD4977CF57`。 ### Findings - 阻断 findings:`0`。 ### Hash-only 独立确认 1. output root `dev/tmp/bili-auth-controlled-build-ytdlp-20260808-005` 恰好包含上述两个普通、非 reparse 文件,目录=`0`,`.build/.spec/.deps=0`;EXE 前两字节静态读取为 `MZ`,审核中未加载或执行该 EXE。 2. reviewer 独立复算 EXE、receipt、source approval、source manifest、dependency manifest、pinned wheel、exact Python、exact PyInstaller、provision receipt、build script 与 machine evidence 的 bytes/SHA-256,均与提交值一致。receipt 的唯一 `files[0]` 精确绑定 EXE name/bytes/SHA-256;source approval→source manifest→receipt→EXE 链完整。 3. receipt 为 strict JSON、无 duplicate key、schema=`2`、UTF-8/no BOM/no trailing whitespace;target/build identity、`pyinstaller-onefile`、PyInstaller=`6.15.0`、yt-dlp=`2026.7.4`、source/dependency/wheel/Python/PyInstaller/provision/build-script 字段均与冻结实物精确一致。 4. reviewer 使用获准 PyInstaller `CArchiveReader` 对 EXE 做纯静态读取:唯一 `yt_dlp-2026.7.4.dist-info` 恰好包含冻结七文件,实际 type codes=`[b]` 且属于允许集合 `[b,x]`,Name=`yt-dlp`、Version=`2026.7.4`;按 source manifest 冻结算法独立复算 metadata tree SHA-256=`32F1DC23F6704966AE4511CB173318CD11FCBA031323028D268D9F2488589E70`,与 source contract 和 receipt 完全一致;receipt 所列 required modules 缺失数=`0`。 5. build 证据记录 attempt=`1`、retry=`0`、exit=`0`、wall=`66.8s`;历史 build-004 EXE/receipt hash 未变且继续仅为 `NOT_INSTALLABLE_HISTORY`,本次未复用其 approval。提交证据声明 install/HKCU/EXE execution/Chrome/Cookie/session/network/download/real media/`F:\video`/formal `ana-data`/transcription=`0`,静态实物检查未发现反证。 ### Reviewer-owned exact-build approval - 已创建 source/build 树外 approval:`ai-inforev/worklog/2026-08-08-bili-authenticated-session-ytdlp-replacement-build-005-install-approval.json=596/4D18A32DE9DFEB6B90C1A398087BD36CEAE09418D54E1F0DC485D6B95C962A44`。 - approval exact schema 1:`approval_scope=install-exact-build`、`approved_by_role=dev.reviewer.project`、`status=APPROVED`;精确绑定 source manifest SHA-256、build-005 receipt bytes/SHA-256 与 build-005 EXE bytes/SHA-256。该 approval 不在 source/build 树内,且与历史 build-004 approval 不可互换。 ### 结论与边界 - 审计状态:`PASS` - 阻断问题数:`0` - 结论:`BUILD005_EXACT_BUILD_HASH_ONLY_CONFIRMED` - build-005 已满足 installer 的独立 exact-build identity 前置门禁;未来只有获得另行明确安装调度的操作者,才可把同一 source approval、上述 build-005 approval、同一 schema 2 receipt 和同一 EXE 作为不可替换输入。任一 bytes/hash/path/output-set 漂移均须 fail closed 并重新审核。 - 本 hash-only PASS 与 approval 本身不授权当前回合实际 install/HKCU,不授权 EXE execution,也不授权 Chrome/Cookie/session、network/download、real media、`F:\video`、formal `ana-data` 或 transcription。 - Open questions:无。