#!/bin/bash
# 跨行分布命题机械筛：主语行集 × 谓语行集 的 k 行窗口 AND，扣掉单行已命中
# 判据主语/谓语集逐字抄自 docs/round2-writeback-gap-plan.md §1.2 @12e67ef
# 用法: crossline.sh <tree-ish> <path> <k>
SUBJ='DS|owner|Owner|对方|R1|R2|R3'
PRED='已做|已落地|已实现|已上闸|已加|已改|已修|已提交|已执行|已完成|已覆盖|已接|已合|已裁|已裁定|裁定|已定|已拍定|已决|已采纳|已拒|已驳|rejected|已 hold|已证伪|证伪|已推翻|推翻|被推翻|已失效|不成立|别再走|已弃|作废|已 live'
T="$1"; P="$2"; K="$3"; D=$(mktemp -d)
git grep -n -E "$SUBJ" "$T" -- "$P" | sed "s|^$T:$P:||" | cut -d: -f1 | sort -n -u > $D/subj
git grep -n -E "$PRED" "$T" -- "$P" | sed "s|^$T:$P:||" | cut -d: -f1 | sort -n -u > $D/pred
awk 'NR==FNR{a[$1];next} ($1 in a)' $D/subj $D/pred | sort -n -u > $D/both   # 单行同时命中（⛔ 不用 comm：它要字典序，喂 sort -n 会恒得 0）
awk -v k="$K" '
  FILENAME==ARGV[1]{s[$1]=1;next} FILENAME==ARGV[2]{p[$1]=1;next} {b[$1]=1}
  END{for(i in s){ if(i in b)continue
        for(d=1;d<k;d++){ j=i+d; if((j in p)&&!(j in b)){print i"->"j; break} } }
      for(i in p){ if(i in b)continue
        for(d=1;d<k;d++){ j=i+d; if((j in s)&&!(j in b)){print i"=>"j; break} } }}
' $D/subj $D/pred $D/both | sort -t'>' -k2 -n
echo "### subj=$(wc -l<$D/subj) pred=$(wc -l<$D/pred) both=$(wc -l<$D/both)"
rm -rf $D
