from email import policy
from email.parser import BytesParser
from pathlib import Path
import json,re
tasks={};threads=set()
for p in sorted(Path('.').glob('E*.eml')):
 m=BytesParser(policy=policy.default).parsebytes(p.read_bytes());thread=m['References'];threads.add(thread);text=m.get_body(preferencelist=('plain',)).get_content()
 if '取消'in text or '暂缓'in text:
  if thread in tasks:tasks[thread]['status']='cancelled';tasks[thread]['evidence'].append(p.name)
 elif '改由'in text:
  if thread in tasks:tasks[thread]['owner']=re.search(r'改由(.*?)负责',text)[1];tasks[thread]['evidence'].append(p.name)
 elif '请'in text:
  tasks.setdefault(thread,{'status':'open','owner':'林可' if'林可'in text else None,'deadline':None,'evidence':[]})['evidence'].append(p.name)
 elif '附件'in text and thread in tasks:tasks[thread]['evidence'].append(p.name)
assert len(threads)==5 and len(tasks)==3 and sum(x['status']=='open'for x in tasks.values())==2
assert any(x['owner']=='王禾'for x in tasks.values())
Path('tasks-reference.json').write_text(json.dumps(tasks,ensure_ascii=False,indent=2))
print('Parsed 8 EML inputs; 3 unique request threads, 1 cancelled, 2 open; changed owner from E08; missing deadlines stay null. Deterministic author reference, not AI.')
