Skip to content

Commit ee7b916

Browse files
committed
fix(review): 审查修复 A+B 组 6 项(bbox 守卫/override eprintln/locked 解锁/edit_distance 返回 n+m/dead_code 版本/FIFO 100)
1 parent bd10436 commit ee7b916

4 files changed

Lines changed: 35 additions & 10 deletions

File tree

‎app/src-tauri/src/live_keyframes.rs‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ pub fn handle_full_frame(
136136

137137
/// 变化区域文本(v0.11.5 Task 2):kept 过滤后仅保留与 grid_diff 变化包围盒
138138
/// 相交的块文本(帧坐标)。防御降级:无变化(bounds=None)/缺 bbox → 整帧。
139+
/// v0.11.5 审查修复(A1):bbox 物理约束守卫——w/h 非正(异常数据)的块跳过
140+
/// (不参与变化区域过滤,也不触发整帧降级——缺 bbox 才降级,非法值按损坏
141+
/// 数据逐块丢弃)。
139142
fn changed_region_texts(
140143
kept: &[&crate::types::OcrBlock],
141144
grid: &crate::capture::grid_diff::GridDiff,
@@ -148,6 +151,11 @@ fn changed_region_texts(
148151
kept.iter()
149152
.filter_map(|b| {
150153
let tb = b.bbox.as_ref()?;
154+
// v0.11.5 审查修复(A1):bbox 物理约束守卫——w/h 非正(异常数据)
155+
// → 跳过该块(不参与变化区域过滤,也不触发整帧降级)
156+
if tb.w <= 0.0 || tb.h <= 0.0 {
157+
return None;
158+
}
151159
// TextBox(x/y/w/h,帧坐标)→ Rect(left/top/right/bottom,相交口径)
152160
// Minor #2 修复:bottom/right 用 ceil() 防止亚像素截断漏判
153161
// (left/top 用 floor 语义已由 trunc 隐含满足——x/y 非负时

‎app/src-tauri/src/live_session_frame.rs‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,10 +329,13 @@ pub fn run_screen_worker(
329329
tier_applied_tier.map(|t| t.as_str()).unwrap_or("medium"),
330330
);
331331
// v0.11.5(Task 6):OCR 文本累计(去重→领域检测用)
332+
// v0.11.5 审查修复(A6):FIFO 上限 50→100——领域检测信号缓存
333+
// 保守放大,避免 B站选集证据(`P3/12`/`第3集/共12集`)在
334+
// 150s 重评窗口前被 FIFO 淘汰而丢失平台证据
332335
for t in &last_changed_texts {
333336
if !accumulated_ocr_text.contains(t) {
334337
accumulated_ocr_text.push(t.clone());
335-
if accumulated_ocr_text.len() > 50 {
338+
if accumulated_ocr_text.len() > 100 {
336339
accumulated_ocr_text.remove(0);
337340
}
338341
}
@@ -423,6 +426,11 @@ pub fn run_screen_worker(
423426
changed = true;
424427
}
425428
if let Some(f) = po.form { current_form = Some(f); changed = true; }
429+
// v0.11.5 审查修复(A3):domain 为 None(用户未选领域)→
430+
// 重置锁定,重新启用自动检测(领域重评不再跳过覆盖)
431+
if po.domain.is_none() && domain_user_locked {
432+
domain_user_locked = false;
433+
}
426434
if let Some(d) = po.domain {
427435
current_domain_kind = Some(d);
428436
// 用户手动覆写 → 锁定该维度(重评不覆盖)
@@ -441,6 +449,10 @@ pub fn run_screen_worker(
441449
"tier": tier_applied_tier.map(|t| t.as_str()),
442450
"domain": current_domain_kind.map(|d| d.as_str()),
443451
}));
452+
} else {
453+
// v0.11.5 审查修复(A2):override 取到全空值(command 层
454+
// 应已拒绝全空,此为防御)
455+
eprintln!("[LiveSession] profile_override 取到全空值(command 层应已拒绝全空,此为防御)");
444456
}
445457
}
446458
}

‎app/src-tauri/src/video_profile_domain.rs‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ pub enum DomainKind {
4848
}
4949

5050
impl DomainKind {
51-
/// 前端展示名(检测卡 v2 下拉用;登记豁免 dead_code——M5 接线)。
51+
/// 前端展示名(检测卡 v2 下拉用;登记豁免 dead_code——M5 接线,
52+
/// 目标激活版本:v0.12.0)。
5253
#[allow(dead_code)]
5354
pub fn label(self) -> &'static str {
5455
match self {
@@ -93,7 +94,7 @@ impl DomainKind {
9394
}
9495

9596
/// 领域标识(kebab-case,与 parse/serde 同口径;落库/传输用,
96-
/// 登记豁免 dead_code——会话落库接线在 M5 检测卡 v2)。
97+
/// 登记豁免 dead_code——会话落库接线在 M5 检测卡 v2,目标激活版本:v0.12.0)。
9798
#[allow(dead_code)]
9899
pub fn as_str(self) -> &'static str {
99100
match self {
@@ -117,7 +118,8 @@ impl DomainKind {
117118

118119
/// 区域预期(REQ-190 作用链):数学→公式区、代码→code 区、设计→图片区;
119120
/// 其余无强预期(None——不改变现状区域权重)。
120-
/// 登记豁免 dead_code:区域预期接线在 M4 平台适配(OCR 标签通用化后生效)。
121+
/// 登记豁免 dead_code:区域预期接线在 M4 平台适配(OCR 标签通用化后生效),
122+
/// 目标激活版本:v0.12.0。
121123
#[allow(dead_code)]
122124
pub fn expected_region(self) -> Option<crate::layout_analyzer::RegionKind> {
123125
match self {
@@ -281,7 +283,8 @@ pub fn hotword_candidates(kind: DomainKind) -> Vec<String> {
281283
}
282284

283285
/// 领域 → 术语表筛选词(glossary 构建用:仅保留命中领域词表的候选术语)。
284-
/// 登记豁免 dead_code:术语筛选接线在产物层(M5 叙事变体后随模板消费)。
286+
/// 登记豁免 dead_code:术语筛选接线在产物层(M5 叙事变体后随模板消费),
287+
/// 目标激活版本:v0.12.0。
285288
#[allow(dead_code)]
286289
pub fn filter_glossary(kind: DomainKind, candidates: &[String]) -> Vec<String> {
287290
let seeds = crate::video_profile_domain_data::seed_words(kind);

‎app/src-tauri/src/watermark_cluster.rs‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@ use super::*;
1414

1515
/// 编辑距离(朴素 DP,O(n*m);水印文本通常 ≤30 字符,无需三数组优化)。
1616
///
17-
/// @ai-context: 长度差 >2 直接剪枝返回 3(>2 即不聚类)——避免对长文本开
18-
/// O(n*m) 矩阵。
17+
/// @ai-context: 长度差 >2 直接剪枝返回最大距离 n+m(>2 即不聚类)——避免对
18+
/// 长文本开 O(n*m) 矩阵。
1919
pub(crate) fn edit_distance(a: &str, b: &str) -> usize {
2020
let a: Vec<char> = a.chars().collect();
2121
let b: Vec<char> = b.chars().collect();
2222
let (n, m) = (a.len(), b.len());
23+
// 长度差超编辑距离阈值(2)→ 直接返回最大可能距离(n+m,超过阈值即可,避免无用计算)
24+
// v0.11.5 审查修复:原固定返回 3(脆性——阈值变后语义偏移),改回最大距离
2325
if n.abs_diff(m) > 2 {
24-
return 3;
26+
return n + m;
2527
}
2628
// 滚动两行 DP(前一行 + 当前行)
2729
let mut prev: Vec<usize> = (0..=m).collect();
@@ -99,8 +101,8 @@ pub(crate) fn cluster_texts(blocks: &[WatermarkInput]) -> BTreeMap<(String, Stri
99101
/// 误杀——沿用 detect_watermarks 的内容变化证据)。
100102
/// @ai-context: region_key=None 的块跳过(区域级判定需要区域概念;无 bbox
101103
/// 降级路径由 detect_watermarks 的全局文本不变性覆盖)。
102-
/// @ai-context: lib 内暂无调用方(C 层接线留后续任务)——测试目标已覆盖;
103-
/// 接线后移除 allow(dead_code)。
104+
/// @ai-context: lib 内暂无调用方(C 层接线留后续任务,目标接线版本:v0.12.0)
105+
/// ——测试目标已覆盖;接线后移除 allow(dead_code)。
104106
#[allow(dead_code)]
105107
pub fn detect_region_watermarks(blocks: &[WatermarkInput], cfg: &WatermarkConfig) -> WatermarkResult {
106108
// ① 帧签名(整帧内容变化证据,与 detect_watermarks 同款)

0 commit comments

Comments
 (0)