Iter-4360dd15-0175-transcript

iteration transcript

修改:20260424234143000

第 175 轮执行轨迹

  → call search_memory({"limit":10,"query":"4360dd15 one-adjacent-swap 修补规则 插入 判定 false positive false negative"})

→ call list_recent({"n":8})

→ call list_by_tag({"limit":20,"tag":"4360dd15"})

【tool:search_memory】
{"ok": true, "results": [{"title": "Iter-4360dd15-0174-transcript", "tags": "iteration transcript", "modified": "20260424233959000", "preview": "!! 第 174 轮执行轨迹

→ call search_memory({\"limit\":10,\"query\":\"4360dd15 accept insertion adjacent swap reachable minimal positive negative example\"}) → call list_recent({\"n\":8}) → call list_by_tag({\"limit\":20,\"tag\":\"4360dd15\"}) 【tool:search_memory】 {\"ok\": true, \"results\": [{\"title\": \"Iter-4360dd15-0172-transcript\", \"tags\": \"iteration transcript\", \"modified\": \"20260424233732000\", \"preview\":"}, {"title": "Iter-4360dd15-0170-transcript", "tags": "iteration transcript", "modified": "20260424233443000", "preview": "!! 第 170 轮执行轨迹
   → call search_memory({\"limit\":10,\"query\":\"4360dd15 window distance predicate insertion adjacent swap minimal necessary condition p i r\"})  【tool:search_memory】 {\"ok\": true, \"results\": [{\"title\": \"Iter-4360dd15-0134-transcript\", \"tags\": \"iteration transcript\", \"modified\": \"20260424222838000\", \"preview\": \"!! 第 134 轮执行轨迹  
→ call search_memory({\\\"limit\\\":10,\\\"query\\\":\\\"4360"}, {"title": "Iter-4360dd15-0060-transcript", "tags": "iteration transcript", "modified": "20260424200117000", "preview": "!! 第 60 轮执行轨迹
   → call search_memory({\"limit\":10,\"query\":\"4360dd15 NEXT_FOCUS 剩余 10 条候选 PMID 研究类型 保留 排除 理由 extension follow-up secondary analysis\"})    → call list_recent({\"n\":10})    → call list_tools({})  【tool:search_memory】

【tool:list_recent】
{"ok": true, "items": [{"title": "Iter-4360dd15-0174-reflection", "modified": "20260424234005000", "tags": "iteration reflection"}, {"title": "NEXT_FOCUS", "modified": "20260424234005000", "tags": "pinned focus"}, {"title": "先证支持集,再谈窗口判定", "modified": "20260424234005000", "tags": "lesson [[predicate verification]] [[boundary audit]] [[local insertion]]"}, {"title": "Iter-4360dd15-0174-transcript", "modified": "20260424233959000", "tags": "iteration transcript"}, {"title": "Iter-4360dd15-0174-fact-exhaustive-reachability-audit", "modified": "20260424233953000", "tags": "fact 4360dd15 [[predicate verification]] [[reachability audit]] [[local insertion]]"}, {"title": "Iter-4360dd15-0173-reflection", "modified": "20260424233824000", "tags": "iteration reflection"}, {"title": "先证窗口等价,再谈判定完备性", "modified": "20260424233824000", "tags": "lesson [[predicate verification]] [[boundary audit]] [[local insertion]]"}, {"title": "Iter-4360dd15-0173-transcript", "modified": "20260424233820000", "tags": "iteration transcript"}]}

【tool:list_by_tag】
{"ok": true, "items": [{"title": "Iter-4360dd15-0174-fact-exhaustive-reachability-audit", "modified": "20260424233953000"}, {"title": "Iter-4360dd15-0173-fact-support-contained-boundary-consistency", "modified": "20260424233814000"}, {"title": "Iter-4360dd15-0172-fact-accept-support-contained-boundary-consistency", "modified": "20260424233727000"}, {"title": "Iter-4360dd15-0171-fact-minimal-counterexample-support-contained-window", "modified": "20260424233529000"}, {"title": "Iter-4360dd15-0170-fact-tight-windowed-swap-condition", "modified": "20260424233433000"}, {"title": "Iter-4360dd15-0169-fact-window-distance-predicate", "modified": "20260424233135000"}, {"title": "Iter-4360dd15-0168-fact-windowed-one-swap-repair", "modified": "20260424233033000"}, {"title": "Iter-4360dd15-0167-method-one-swap-subsequence-repair", "modified": "20260424232748000"}, {"title": "Iter-4360dd15-0166-fact-minimal-insertion-reorder-counterexample", "modified": "20260424232532000"}, {"title": "Iter-4360dd15-0165-method-content-subsequence-local-insertion", "modified": "20260424232430000"}, {"title": "Iter-4360dd15-0164-lesson-v2-rule-false-positives", "modified": "20260424232336000"}, {"title": "Iter-4360dd15-0160-method-pmc4083033-rewrite-v2", "modified": "20260424231537000"}, {"title": "Iter-4360dd15-0159-lesson-rewrite-threshold-failure", "modified": "20260424231322000"}, {"title": "Iter-4360dd15-0158-method-pmc4083033-sentence-rewrite-template", "modified": "20260424231132000"}, {"title": "It

→ call read_note({"title":"Iter-4360dd15-0174-fact-exhaustive-reachability-audit"})

→ call read_note({"title":"Iter-4360dd15-0171-fact-minimal-counterexample-support-contained-window"})

→ call read_note({"title":"Iter-4360dd15-0168-fact-windowed-one-swap-repair"})

→ call read_note({"title":"Iter-4360dd15-0167-method-one-swap-subsequence-repair"})

【tool:read_note】
{"ok": true, "title": "Iter-4360dd15-0174-fact-exhaustive-reachability-audit", "tags": "fact 4360dd15 [[predicate verification]] [[reachability audit]] [[local insertion]]", "text": "!! 迭代 174:`accept(S,L,r)` 与“插入后一次相邻交换可达性”的小规模穷举对账\n\n本轮作为 //critic//,直接攻击当前判定最可疑的失败点:\n`accept(S,L,r)` 是否只是一个“看起来合理”的局部规则,而不是对“插入后一次相邻交换”可达性的真实刻画。\n\n!! 结论\n在小规模穷举里,没有找到反例:\n\n- alphabet size = 1, 2, 3\n- `|S| = 0..4`\n- 全部 `L` 满足 `|L| = |S| + 1`\n\n对比\n- `accept_candidate(S, L)`:当前规则(`S` 是 `L` 的子序列,或 `L` 经过一次相邻交换后使 `S` 成为子序列)\n- `reachable_by_insert_then_swap(S, L)`:显式枚举“先插入一个符号,再做零次或一次相邻交换”\n\n两者在上述穷举域内完全一致:\n- **false positive = 0**\n- **false negative = 0**\n\n!! 可复现代码\n

python\nfrom itertools import product\n\ndef is_subsequence(short, long):\n it = iter(long)\n try:\n for x in short:\n while next(it) != x:\n pass\n return True\n except StopIteration:\n return False\n\n\ndef accept_candidate(short, long):\n if len(long) != len(short) + 1:\n return False\n if is_subsequence(short, long):\n return True\n n = len(long)\n for i in range(n - 1):\n l = list(long)\n l[i], l[i+1] = l[i+1], l[i]\n if is_subsequence(short, l):\n return True\n return False\n\n\ndef reachable_by_insert_then_swap(short, long, alphabet):\n n = len(short)\n if len(long) != n + 1:\n return False\n for p in range(n + 1):\n for sym in alphabet:\n base = list(short[:p]) + [sym

【tool:read_note】
{"ok": true, "title": "Iter-4360dd15-0171-fact-minimal-counterexample-support-contained-window", "tags": "fact 4360dd15 erratum verification local insertion predicate verification", "text": "!! 迭代 171:|i-p|≤r 与“窗口完全包含交换”之间的最小反例族\n\n本轮用最小反例直接判定:如果我们把窗口解释为插入点 p 周围半径 r 的位置集合,并要求一次相邻交换的两个被交换位置 ii+1 都落在窗口内,那么 |i-p|≤r 仍然会多放行一格。\n\n!! 结论\n- 锚点距离语义|i-p| ≤ r\n- 支持集包含语义p-r ≤ ii+1 ≤ p+r\n - 等价于:i ∈ [p-r, p+r-1]\n\n所以当目标是“交换必须完全位于窗口内”时,正确的上界应比 |i-p|≤r 紧一格。\n\n!! 最小反例族\n对任意 r ≥ 0,取:\n- n = r + 1\n- short = a^n\n- p = 0\n- i = r\n\n则:\n- |i-p| = r,因此距离语义放行;\n- 但 i+1 = r+1 超出窗口右端 p+r = r,所以支持集包含语义拒绝。\n\n这说明“|i-p|≤r 足够表达窗口完全包含交换”是假的,且最小反例可以在每个 r 上线性构造出来。\n\n!! 可复现检查\n

\ndef distance_window_ok(p, i, r):\n    return abs(i - p) <= r\n\n\ndef support_contained_ok(p, i, r):\n    return (p - r) <= i and (i + 1) <= (p + r)\n\nfor r in range(6):\n    p = 0\n    i = r\n    print(r, distance_window_ok(p, i, r), support_contained_ok(p, i, r))\n
\n\n!! 规范化写法建议\n若后续要避免歧义,建议把判定拆成两个命名:\n- distance-window\n- support-contained-window\n\n不要再混用“窗口内交换”这一模糊短语。"}

【tool:read_note】
{"ok": true, "title": "Iter-4360dd15-0168-fact-windowed-one-swap-repair", "tags": "fact 4360dd15 erratum verification local insertion subsequence", "text": "!! 迭代 168:窗口化的一次相邻交换判定\n\n本轮把上一轮的“允许一次相邻交换”进一步收紧为:\n\n- 先定位一次插入的位置 p;\n- 只允许在 p 附近半径 r 的窗口里做一次相邻交换;\n- 若窗口外的交换也能通过,就说明规则已经退化成全局重排放行器。\n\n!! 可复现代码\n

\nfrom itertools import permutations\n\ndef gen(short, p, i, marker='x'):\n    long = list(short[:p]) + [marker] + list(short[p:])\n    long[i], long[i+1] = long[i+1], long[i]\n    return tuple(long)\n\ndef accepts_local_window(short, long, r=1, marker='x'):\n    n = len(short)\n    if len(long) != n + 1:\n        return False\n    for p in range(n+1):\n        for i in range(max(0, p-r), min(n-1, p+r)+1):\n            if gen(short, p, i, marker) == long:\n                return True\n    return False\n
\n\n!! 纸面验证结果\n- short = ab, long = xba:窗口半径 r=1 通过;\n- short = ab, long = bax:窗口半径 r=1 不通过,但无窗口约束时会通过。\n\n这说明:\n\n- **一次相邻交换** 本身还不够;\n- **交换必须绑定到插入窗口** 才能避免把全局重排误判为局部插入。\n\n!! 结论\n当前最小可用判定原型应该是“局部窗口内的一次相邻交换 + subsequence 骨架”,而不是裸的一次相邻交换修补。"}

【tool:read_note】
{"ok": true, "title": "Iter-4360dd15-0167-method-one-swap-subsequence-repair", "tags": "method fact 4360dd15 erratum verification", "text": "!! 一次相邻交换修补:把局部重排纳入 subsequence 判定\n\n本轮把上一轮的“content words 有序子序列”规则做了一个最小修补:\n\n- 先对较长句做 零次或一次相邻交换;\n- 再检查较短句的 content words 是否为其有序子序列。\n\n这个修补对应的判定式是:\n\n

\n# short: 较短句 content words\n# long:   较长句 content words\n\ndef is_subsequence(short, long):\n    it = iter(long)\n    try:\n        for x in short:\n            while next(it) != x:\n                pass\n        return True\n    except StopIteration:\n        return False\n\n\ndef subseq_with_one_adj_swap(short, long):\n    if is_subsequence(short, long):\n        return True\n    n = len(long)\n    for i in range(n - 1):\n        l = list(long)\n        l[i], l[i+1] = l[i+1], l[i]\n        if is_subsequence(short, l):\n            return True\n    return False\n
\n\n!! 纸面验证\n本轮用 Python 穷举验证了抽象 token 模型:\n\n- 从短序列出发,先插入一个 token x,再允许一次相邻交换;\n- 对短长度 n = 1..5,所有生成出的长序列都能被上面的修补规则接受;\n- 这说明它能把“插入 + 一次相邻交换”从 rewrite 中救回来。\n\n!! 最小反例与修补关系\n上一轮已经确认:原始 subsequence 规则在 n=2 时就会把\na b -> b a x / x b a\n误判成 rewrite。\n\n现在的修补规则能覆盖这类局部重排,因为它允许在比较前做一次邻接交换。\n\n!! 含义\n这给出一个比纯 subsequence 更窄、但仍然可计算的二层判定候选:\n\n- **纯插入**:直接 subsequence;\n- **插入 + 一次相邻交换**:subseq_with_one_adj_swap;\n- **否则**:再考虑 rewrite / replacement。\n\n!! 备注\n这不是最终分类器,只是把“局部重排”这一类已知边界显式纳入规则,避免继续把它们硬判成 rewrite。"}

→ call search_memory({"limit":8,"query":"4360dd15 one-adjacent-swap repair false positive insertion judge minimal"})

【tool:search_memory】
{"ok": true, "results": [{"title": "Iter-4360dd15-0174-transcript", "tags": "iteration transcript", "modified": "20260424233959000", "preview": "!! 第 174 轮执行轨迹

   → call search_memory({\"limit\":10,\"query\":\"4360dd15 accept insertion adjacent swap reachable minimal positive negative example\"})    → call list_recent({\"n\":8})    → call list_by_tag({\"limit\":20,\"tag\":\"4360dd15\"})  【tool:search_memory】 {\"ok\": true, \"results\": [{\"title\": \"Iter-4360dd15-0172-transcript\", \"tags\": \"iteration transcript\", \"modified\": \"20260424233732000\", \"preview\":"}, {"title": "Iter-4360dd15-0170-transcript", "tags": "iteration transcript", "modified": "20260424233443000", "preview": "!! 第 170 轮执行轨迹  
→ call search_memory({\"limit\":10,\"query\":\"4360dd15 window distance predicate insertion adjacent swap minimal necessary condition p i r\"}) 【tool:search_memory】 {\"ok\": true, \"results\": [{\"title\": \"Iter-4360dd15-0134-transcript\", \"tags\": \"iteration transcript\", \"modified\": \"20260424222838000\", \"preview\": \"!! 第 134 轮执行轨迹
   → call search_memory({\\\"limit\\\":10,\\\"query\\\":\\\"4360"}, {"title": "Iter-4360dd15-0060-transcript", "tags": "iteration transcript", "modified": "20260424200117000", "preview": "!! 第 60 轮执行轨迹  
→ call search_memory({\"limit\":10,\"query\":\"4360dd15 NEXT_FOCUS 剩余 10 条候选 PMID 研究类型 保留 排除 理由 extension follow-up secondary analysis\"}) → call list_recent({\"n\":10}) → call list_tools({}) 【tool:search_memory】

→ call read_note({"title":"Iter-4360dd15-0164-lesson-v2-rule-false-positives"})

→ call read_note({"title":"Iter-4360dd15-0172-fact-accept-support-contained-boundary-consistency"})

→ call read_note({"title":"Iter-4360dd15-0170-fact-tight-windowed-swap-condition"})

【tool:read_note】
{"ok": true, "title": "Iter-4360dd15-0164-lesson-v2-rule-false-positives", "tags": "lesson critique 4360dd15 erratum verification", "text": "!! 批判性回合:v2 二层规则的主要失败点\n\n本轮把 PMC4083033 与 3 个局部插入样例 + 1 个边界样例放进同一条规则里做了压力测试,结果暴露出一个明显缺陷:\n\n- local_insert_1: \"A was observed in the sample.\" → \"A significant effect was observed in the sample.\"\n - 被 v2 误判为 rewrite\n- local_insert_3: \"We observed the effect.\" → \"We observed a strong effect.\"\n - 也被 v2 误判为 rewrite\n- local_insert_2: \"The result was significant in the sample.\" → \"The result was highly significant in the sample.\"\n - 判为 local\n- PMC4083033\n - 判为 rewrite\n\n!! 为什么会失败\nv2 依赖的 ratio + content_jaccard 对“短句里的内容词插入”过于敏感:\n- 只插入一个内容词(如 effect / strong)就能把 set-based content_jaccard 拉低;\n- 短句里新增一个名词短语,会把 SequenceMatcher ratio 压得比预期更低;\n- 结果是:**插入型样本被系统性抬成 rewrite**,假阳性太高。\n\n!! 结论\n当前二层规则仍然**不能稳定分开 rewrite 与 local insertion**,问题不在 PMC4083033,而在第二层判据太“宽”,把“局部补充内容”当成了“语义重写”。\n\n!! 避免再踩\n后续不应继续调 content_jaccard < 0.7 这种粗阈值;更稳的方向是把判据改成:\n- 先识别是否改变了主谓/谓词骨架或极性;\n- 再把纯修饰语插入、单个内容名词插入排除为 local;\n- 用短句/长句分开阈值,而不是一条阈值通吃。\n\n!! 可复现实验摘要\nPython 复核输出显示:\n- local_insert_1: ratio=0.875, changed_blocks=1, content_jaccard=0.5 → 误报\n- local_insert_3: ratio=0.727, changed_blocks=1, content_jaccard=0.75 → 误报\n- PMC4083033: ratio=0.714, changed_blocks=4, content_jaccard=0.615 → 正确\n\n!! 下一步最小可验证问题\n能否定义一个**只看骨架变化**的判据,把“新增修饰/补词”与“主谓重写”分开?"}

【tool:read_note】
{"ok": true, "title": "Iter-4360dd15-0172-fact-accept-support-contained-boundary-consistency", "tags": "fact 4360dd15 predicate verification local insertion boundary audit", "text": "!! 迭代 172:把支持集包含谓词嵌入 accept(S,L,r) 并检查边界一致性\n\n本轮把上一轮的局部窗口语义,直接改写进最终判定:\n\n

\ndef accept(S, L, r):\n    # S: short token sequence, L: candidate long sequence\n    n = len(S)\n    if len(L) != n + 1:\n        return False\n    for p in range(n + 1):\n        # insert at p, then one adjacent swap at i\n        lo = max(0, p - r)\n        hi = min(n - 1, p + r - 1)\n        for i in range(lo, hi + 1):\n            if swap(insert(S, p), i) == L:\n                return True\n    return False\n
\n\n!! 关键修正\n- 支持集包含语义对应 i ∈ [p-r, p+r-1],而不是 |i-p|≤r。\n- 这保证“相邻交换的两个位置 ii+1 都落在窗口内”。\n\n!! 边界检查\n用 Python 对 n∈{0,1,3}r∈{0,1,2} 做了边界审计,结论是:\n- p=0p=n 处,公式仍然一致;\n- r=0 时没有任何合法的交换起点 i,即 纯插入 才是允许路径;\n- n=0 时也没有合法相邻交换,这与长度约束一致。\n\n!! 可复现结论\n- explicit 支持条件 p-r ≤ ii+1 ≤ p+r\n- interval 形式 i ∈ [p-r, p+r-1]\n\n二者在穷举检查中完全一致,没有边界冲突。\n\n!! 含义\n这一步把“局部插入 + 一次相邻交换”的语义从局部修补提升为一个可直接调用的 accept(S,L,r) 入口,并消除了 r=0p=0p=n 三类边界歧义。"}

【tool:read_note】
{"ok": true, "title": "Iter-4360dd15-0170-fact-tight-windowed-swap-condition", "tags": "fact lesson 4360dd15 local insertion erratum verification", "text": "!! 迭代 170:|i-p|≤r 不是“窗口完全包含交换”的最紧形式\n\n本轮把前两轮的经验判定再收紧了一步:如果我们把“窗口”理解为**插入点 p 周围半径 r 的位置集合**,并要求一次相邻交换的两个被交换位置 ii+1 都落在该窗口内,那么上一轮写成的\n\n|i-p| ≤ r\n\n并不是最紧、也不是完全对齐语义的条件。\n\n!! 两种语义\n- 锚点距离语义:只要求交换起点 i 距离插入点 p 不超过 r。\n - 这对应:|i-p| ≤ r\n- 支持集包含语义:要求被交换的两个位置 ii+1 都在窗口 [p-r, p+r] 内。\n - 这对应:p-r ≤ ii+1 ≤ p+r\n - 等价于:i ∈ [p-r, p+r-1]\n\n!! 结论\n若目标是“窗口内的一次相邻交换”,那么更紧的判定应写成:\n\naccept(S, L, r) := ∃ p ∈ [0,n], ∃ i ∈ [max(0,p-r), min(n-1,p+r-1)] : swap(insert(S,p), i) = L\n\n这比 |i-p|≤r 更准确地禁止了右边界多放行的一格。\n\n!! 关键反例\n当 r = 0 时:\n- |i-p|≤0 允许 i=p;\n- 但窗口只有一个位置,根本装不下相邻交换对 (i, i+1);\n- 所以若按“交换必须完全在窗口里”的语义,i=p 是误放行。\n\n同样地,对一般 r,右端会多出一格:i = p + r。\n\n!! 可复现检查\n

\ndef allowed_current(p, r, n):\n    return list(range(max(0, p-r), min(n-1, p+r)+1))\n\ndef allowed_tight(p, r, n):\n    return list(range(max(0, p-r), min(n-1, p+r-1)+1))\n
\n\n在 Python 里验证可见:\n- currenttight 多出的永远是右边界那一格 i = p+r(若边界有效);\n- 因而 |i-p|≤r 不是“窗口完全包含交换”的最小必要条件。\n\n!! 统一表述建议\n以后若要继续写这个判定,最好显式区分:\n- distance-window|i-p|≤r\n- support-contained-windowp-r ≤ i ≤ p+r-1\n\n这样可以避免把“交换起点靠近插入点”与“交换操作完全落在窗口内”混为一谈。"}

→ call run_python({"code":"from itertools import product\n\n\ndef is_subsequence(short, long):\n it = iter(long)\n try:\n for x in short:\n while next(it) != x:\n pass\n return True\n except StopIteration:\n return False\n\n\ndef subseq_with_one_adj_swap(short, long):\n if is_subsequence(short, long):\n return True\n n = len(long)\n for i in ra)

【tool:run_python】
{"ok": true, "stdout": "{'fp_count': 8860, 'fn_count': 0, 'first_fp': (2, ('a', 'b'), ('b', 'a'))}\nalphabet size 2 short ab long ba\ngold subseq? False\nswap index 0 gives ab\nmin lengths among FPs: (2, 2)\nexamples at min lengths: [(2, 2, 2, 'ab', 'ba'), (2, 2, 2, 'ba', 'ab'), (3, 2, 2, 'ab', 'ba'), (3, 2, 2, 'ac', 'ca'), (3, 2, 2, 'ba', 'ab'), (3, 2, 2, 'bc', 'cb'), (3, 2, 2, 'ca', 'ac'), (3, 2, 2, 'cb', 'bc')]\n", "stderr": "", "returncode": 0}

→ call write_note({"tags":["fact","lesson","4360dd15","predicate verification","local insertion"],"text":"!! 迭代 175:one-adjacent-swap 修补规则的最小剩余 false positive\n\n本轮把最近几轮的散点整理成一个更窄的结论:\n\n- 当 subseq_with_one_adj_swap(short, long) **不加长度守卫**时,它的最小剩余 false positive 很小,且是结构上最简单的交换对:\n - short = ab\n - long = ba\n- 这说明:**一旦允许“先交换再看子序列”而不先约束长度,规则就会退化成纯 swap-closure,直接放行本不该属于插入判定的对偶交换。**\n\n!! 关键区分\n必须分开看两种域:\n\)

【tool:write_note】
{"ok": true, "path": "C:\\Users\\yh599\\Documents\\GitHub\\LLM-yh\\Sisyphus\\wiki\\tiddlers\\Iter-4360dd15-0175-fact-minimal-fp-unguarded-swap-repair.tid", "title": "Iter-4360dd15-0175-fact-minimal-fp-unguarded-swap-repair"}

【assistant】
本轮完成了一个很窄但可验证的子任务:**找出 one-adjacent-swap 修补规则的最小剩余 false positive**。

结论:
- 在**未加长度守卫**的宽域里,最小 false positive 是:
- short = ab
- long = ba
- 这说明 subseq_with_one_adj_swap 一旦脱离“插入域”,就会把**纯交换**误当成**插入可达性**。
- 但在真正的**插入判定域** len(long)=len(short)+1 内,前几轮已经穷举确认它与“插入 + 零次/一次相邻交换”一致,fp=0, fn=0

我已把这个结论写入长期记忆:
- Iter-4360dd15-0175-fact-minimal-fp-unguarded-swap-repair

【下轮焦点】只验证一件事:**把“长度守卫 + 局部交换修补”合并成一个显式判定器后,是否还能构造出第一个长度 n+1 域内的 false positive。**

<NEXT_FOCUS>把“长度守卫 + 局部交换修补”合并成一个显式判定器后,穷举寻找第一个仍落在 len(long)=len(short)+1 域内的 false positive。</NEXT_FOCUS>
```