Repository navigation
Confirmed alerts: a project's confirmed.json for detector findings that are intended - #110
Merged
Merged
Conversation
…at are intended bin/vh check's isolated-frame scan and bin/vh qa's scan (dropouts, pumping, click spans) read <project>/confirmed.json (tools/confirm.py). An entry names the finding's time, why it is intended, the project file that shows it, and the key the tool printed: a coarse fingerprint of the picture or sound there. A confirmed finding stays listed, marked confirmed, and no longer fails; it lapses when the picture or sound there changes, and an entry with nothing at its time is listed as unused. Floors (digital silence, the reading floor, the gates, the spec), cue-check OFFs and motion warnings are not confirmable; an unreadable file fails the check. check --allow stays for one run only and says so. qa's dropout scan now leaves out a dip the music stem has too, the rule pumping already used. Keys measured on the 31 style swatches: copies (CRF 16, 1080p CRF 18, CRF 28, AAC 128k -3 dB, AAC 96k) keep them; a frame 0.5 s later matches 8 % of the time, a 6 dB dip inside a span never.
…must be a file inside the project qa scan: a short dip of the music stem no longer excuses a longer dropout or pumping dip; the comparison is window by window (frame by frame for pumping) and what is left is still reported. confirmed.json: evidence must be a regular file inside the project once symlinks are resolved. Docs say the picture key is coarse.
# Conflicts: # CHANGELOG.md
# Conflicts: # CHANGELOG.md # tools/audio/README.md # tools/audio/qa.py
# Conflicts: # CHANGELOG.md
ZLHad
marked this pull request as ready for review
October 18, 2026 14:18
ZLHad
enabled auto-merge (squash)
October 18, 2026 14:19
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why · 改了什么、为什么
检测器按阈值判断,有些结果是有意的:分镜要的一帧闪、谱子里写好的留白。以前没有能留下来的说法:每次
check都报同样几条,--allow只管一次运行;作品被改过去迁就误报。这个 PR 给这类结果一条正规的路,范围很窄,要证据,内容一变就失效。底线不在里面。<project>/confirmed.json(新的tools/confirm.py,只用标准库):每条写出结果的时间或区间、为什么是有意的(why)、项目里证明它的文件(evidence),以及工具印出的key,也就是那里画面或声音的粗指纹。bin/vh check的孤立帧扫描(check.iso),bin/vh qascan 的掉音、抽吸和按区间的 click(qa.dropout、qa.pump、qa.click,click 要写n,即确认时有几处)。confirmed (已确认),不计入退出码;那里的画面或声音变了,标LAPSED (已失效),重新算失败;那个时刻已经没有结果,标unused。没确认的每处印一行confirm? {…},可以直接粘贴。check --allow保留,只管这一次运行,输出里也这么写(declared (--allow, this run only)),并指出长期保留要写进哪里。qascan 的掉音在给了--stems时,不再算音乐 stem 自己也一样深的凹陷(按它自己的段中位数比,差不超过 1 dB),和抽吸早就用的规则一样。谱子里写好的稀疏段落以前会被报成掉音。playbook/02-verification.md加了一小节"确认告警"(standard 读量 +456 字符,quick 不变);tools/audio/README.md、qa.py和isoframes.py的帮助、bin/vh的帮助行、CHANGELOG。Measured thresholds · 量过的阈值
在 31 个风格样片(
styles/*/media/swatch.mp4,720p30,各 5 s,共 4650 帧,带 AAC 音轨)上量的:pic::联系表那次解码(192×108 灰度)里,结果前一帧和差得最大的一帧,各取 8×6 的格子均值,64 级(每级 4 个灰度);没有格子差超过 1 级、平均不超过 0.25 级算同一个scratched-type、neon-step-print里设计好的两处闪env::那段前后各 0.5 s,每 0.1 s 一个 RMS,减去中位数,1.5 dB 一档;90 % 的点差不超过一档算同一个调过的取舍:16 级的缩略图在拷贝下也是 100 %,但"0.5 s 之后"能有 19 % 被当成同一个;3 dB 一档、截在 ±24 dB 的声音 key,在一段更深的凹陷上不会失效(中位数跟着移,截断吃掉了差别)。所以画面改成 64 级,声音改成 1.5 dB 一档、±45 dB。
How it was verified · 怎么验证的
tools/ci.sh --committed(VH_BASH=/bin/bash,shellcheck、pyflakes 按 CONTRIBUTING 的办法真的跑了)通过,193 项;跳过 1 项(这份检出里没有 HyperFrames 运行时,以前就是这样)。tools/ci.sh,跟在check --allow那几条后面):confirm?;粘贴进去以后通过,标"已确认",CRF 28 的拷贝也通过;同一时刻换一种闪是已失效、退出 1;闪挪到 1.5 s,原来那条是 unused、新的那处退出 1;没有 evidence 文件、没有 why、写了check.static的条目都不收;文件写坏,check 失败;--allow输出 "this run only"。confirm?;确认以后通过,AAC 128k 降 3 dB 的拷贝也通过;qa.silence不收;凹陷更深是已失效、退出 1;多出第 4 个 click,区间失效(只是警告)。qa scan在 WAV、m4a、CRF 16/28、1080p 拷贝上都跑了,结果是上面四种状态。Review fixes · 按 Codex 的评审改的(4fb1a17,并合入 main dd786af)
--stems报一处掉音 3.05–5.95 s,给了以后一处都不报。现在逐个 0.1 s 窗口比,只排除 stem 自己的凹陷解释得了的窗口,剩下的照样是掉音(需要时拆成几段):结果是1 (1 more that the music stem has too),掉音 3.35–5.95 s。抽吸有同样的毛病:混音 3.0–3.25 s 降 10 dB,stem 只在 3.0–3.06 s 有凹陷,以前整段放过。现在逐帧(10 ms,±2 帧)比,剩下 60 ms 以上的照样报,结果是 3.06–3.23 s 深 10.0 dB。两处各有一条 CI 用例。"evidence": "out/")也能确认一处掉音。现在先去掉定位部分(STORYBOARD.md S12、STORYBOARD.md#S12、out/check/strip.png#t=8.5),解析符号链接以后,必须是项目里的普通文件;文件夹、../跑到项目外、链接指到项目外,都列成 not taken 并写出原因。CI 用例:文件夹、../outside.md、指到项目外的符号链接。isoframes.py的帮助、playbook/02 和 CHANGELOG 都写明了:画面 key 很粗(8×6 的格子),帧里的小改动(错一个字、一条细线)可能不会让确认失效。tools/ci.sh自动合并成功。完整 CI 通过:shellcheck、pyflakes 都真的跑了,195 项;HyperFrames 运行时那一项照旧跳过。Review focus · 请重点看
tools/isoframes.py里的PIC_*,tools/audio/qa.py里的ENV_*):认得拷贝和发现改动之间怎么取舍。画面 key 是 8×6 的粗格子,有意不管很小的改动(错一个字的帧认不出来);挪了时间靠位置那一项抓。tools/confirm.py里的KINDS和NOT。底线和运动警告不收,cue check 先不开放。--stems以后就看不到了。抽吸早就是这样取舍的,评审时看一下能不能接受。confirm?行会不会招来盖章式的确认:提示里写了"捕获出错要修,不要确认"、"一个故障要修,不要确认",还有 5 处以上的提示;reviewer 读确认清单这一步是下一个 PR。Not in this PR · 不在这个 PR 里
subcheck退出 1,check却只当警告(bin/vh的 subtitles 那一段);而清单 Document auto-merge; match the ruleset file to the live ruleset #5 把字幕的 1.8 s 下限列为底线。Checklist · 自查
tools/ci.sh --committedpasses · 通过CHANGELOG.md→ Unreleased · 已记进 CHANGELOGCLAUDE.mdunchanged · 没改 CLAUDE.md,不用 sync-agents