"""「AIに最新の特許ルールを聞くと、古い答えが返るか」実験。
claude -p を隔離して呼ぶ。条件A=知識だけ／B=一次資料の抜粋つき。
使い方: python3 run.py  → results.jsonl に追記。集計は summarize.py
"""
import json, subprocess, concurrent.futures as cf, os

QUESTIONS = [
 dict(id="Q1", fmt="最初の行に「2024年版」か「2025年版」のどちらかだけを書き、2行目以降に理由を書いてください。",
      q="米国特許商標庁（USPTO）の「AI支援発明の発明者」に関するガイダンスは、2024年2月版と2025年11月版があります。2026年10月時点で現行なのはどちらですか。もう一方はどうなりましたか。"),
 dict(id="Q2", fmt="最初の行に「確定した」か「確定していない」か「不明」のどれかだけを書き、2行目以降に理由を書いてください。",
      q="日本のDABUS事件（AIを発明者として記載した特許出願）は、2026年10月時点で最終的にどうなっていますか。"),
 dict(id="Q3", fmt="最初の行に「適用される」か「適用されない」のどちらかだけを書き、2行目以降に理由を書いてください。",
      q="2026年10月時点のUSPTO現行ガイダンスでは、1人の人がAIを使って発明した場合、共同発明者かどうかを決めるPannu要素は適用されますか。"),
 dict(id="Q4", fmt="最初の行に「ある」か「ない」のどちらかだけを書き、2行目以降に理由を書いてください。",
      q="日本で特許を出願するとき、発明の創作や書類作成にAIを使ったことを、出願書類で申告する義務は法令上ありますか（2026年10月時点）。"),
 dict(id="Q5", fmt="最初の行に「受理される」か「補正命令または却下」か「その他」のどれかだけを書き、2行目以降に理由を書いてください。",
      q="日本の特許出願の願書で、発明者欄に「ChatGPT」と書くとどう扱われますか。"),
 dict(id="Q6", fmt="最初の行に「なれる」か「なれない」か「事実次第」のどれかだけを書き、2行目以降に理由を書いてください。",
      q="2026年10月時点のUSPTO現行基準で、人間がAIに「この課題を解く案を出して」と頼み、出てきた案の1つを選んでそのまま出願した場合、その人は発明者になれますか。"),
]
REF = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "reference.txt")).read()

def prompt(q, cond):
    p = ""
    if cond == "B":
        p += "次の一次資料の抜粋だけを根拠にして答えてください。\n\n" + REF + "\n"
    p += "質問: " + q["q"] + "\n\n" + q["fmt"]
    return p

def call(model, p):
    r = subprocess.run(["claude","-p","--model",model,"--tools","","--no-session-persistence",
                        "--disable-slash-commands","--output-format","json"],
                       input=p, capture_output=True, text=True, cwd="/tmp/inv-exp", timeout=300)
    j = json.loads(r.stdout)
    return j["result"], j.get("total_cost_usd",0), sorted(j["modelUsage"].keys())

def job(a):
    q, cond, model, rep = a
    try:
        out, cost, m = call(model, prompt(q, cond))
    except Exception as e:
        return dict(id=q["id"],cond=cond,model=model,rep=rep,error=str(e))
    return dict(id=q["id"],cond=cond,model=model,rep=rep,first=out.strip().split("\n")[0].strip(),
                raw=out.strip(),cost=cost,model_id=m)

if __name__ == "__main__":
    jobs = [(q,c,m,r) for q in QUESTIONS for c in "AB" for m in ("haiku","sonnet","opus") for r in range(5)]
    with cf.ThreadPoolExecutor(6) as ex, open("results.jsonl","a") as f:
        for res in ex.map(job, jobs):
            f.write(json.dumps(res, ensure_ascii=False)+"\n"); f.flush()
