{"run_date":"2026-10-18","interlock":"V3.0.0","agent":"Claude Code 2.1.302, headless (claude -p), Sonnet 5.5","note":"Local file paths are shortened.","experiment":"Interlock E2: two agents, one file, real git merge","sessions":64,"runs":[{"variant":"same-line","mode":"none","rep":0,"expected_conflict_if_both":true,"a_changed":true,"b_changed":true,"merge_conflict":true,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11327000000000001,"b_result":"I changed `TIMEOUT` from 30 to 45 in `src/config.py`. I didn't touch anything else or run any shell commands.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"same-line","mode":"full","rep":0,"expected_conflict_if_both":true,"a_changed":true,"b_changed":false,"merge_conflict":false,"b_refusals":1,"b_denials":["Interlock: claude-wt-a on feat/a is changing line 3 of src/config.py; this edit would make a merge conflict with it there. Leave those lines as they are and make the change around them, or wait until claude-wt-a's branch is merged."],"a_refusals":0,"turns":[3,3],"cost_usd":0.11654300000000001,"b_result":"I couldn't change `TIMEOUT` because a hook blocked the edit. The hook says another worktree, `claude-wt-a` on branch `feat/a`, is editing line 3 of `src/config.py`. My edit would conflict with that change.\n\n`TIMEOUT = 30` is on line 3, so I can't make the change around it. I haven't edited the file and haven't tried another way to get past the block.\n\nYour options:\n- **Wait:** I set `TIMEOUT = 45` once `feat/a` is merged.\n- **Coordinate:** Add the `TIMEOUT = 45` change to the `claude-wt-a` work, so only one branch touches that line.\n- **Override:** If you know the conflict is acceptable, tell me to go ahead and I'll try the edit again.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"next-line","mode":"none","rep":0,"expected_conflict_if_both":true,"a_changed":true,"b_changed":true,"merge_conflict":true,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11357270000000001,"b_result":"`src/config.py`의 `RETRIES`를 3에서 5로 바꿨고, 다른 곳은 건드리지 않았습니다. 셸 명령은 실행하지 않았고, 테스트도 돌리지 않았습니다.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"next-line","mode":"full","rep":0,"expected_conflict_if_both":true,"a_changed":true,"b_changed":false,"merge_conflict":false,"b_refusals":1,"b_denials":["Interlock: claude-wt-a on feat/a is changing line 3 of src/config.py; this edit would make a merge conflict with it there. Leave those lines as they are and make the change around them, or wait until claude-wt-a's branch is merged."],"a_refusals":0,"turns":[3,3],"cost_usd":0.1214795,"b_result":"I haven't changed `RETRIES`. A pre-edit hook blocked the edit.\n\nThe hook says the session `claude-wt-a` on branch `feat/a` is changing line 3 of `src/config.py`. It says my edit to line 4 (`RETRIES = 3` → `RETRIES = 5`) would cause a merge conflict with that change. It told me to leave those lines alone and make the change around them, or wait until that branch is merged.\n\nI could add a second `RETRIES = 5` further down the file to get around the hook. That would override the original value, but it breaks your \"change nothing else\" instruction and leaves a confusing duplicate, so I didn't do it.\n\nYou can either:\n1. Have me wait until `feat/a` is merged, then make the one-line edit.\n2. Tell me to go ahead anyway and accept a possible merge conflict on line 3 or 4.\n3. Tell me to add the override lower in the file.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"apart","mode":"none","rep":0,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11736840000000001,"b_result":"I changed `LOG_LEVEL` from `\"INFO\"` to `\"DEBUG\"` in `src/config.py`. I didn't touch anything else or run any shell commands.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"apart","mode":"full","rep":0,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11366190000000001,"b_result":"I changed `LOG_LEVEL` in `src/config.py` from `\"INFO\"` to `\"DEBUG\"`. I didn't touch anything else or run any shell commands, and I haven't committed the change.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"function","mode":"none","rep":0,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11735090000000001,"b_result":"`describe()` in `src/config.py` now includes the backoff value. It returns `timeout=30 retries=3 backoff=0.5`. I didn't change anything else, and I didn't run any commands, so the change is untested.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"function","mode":"full","rep":0,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.1169389,"b_result":"`describe()` in `src/config.py` now includes `backoff={BACKOFF}` after the retries value. I didn't run anything, so the change is untested.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"same-line","mode":"none","rep":1,"expected_conflict_if_both":true,"a_changed":true,"b_changed":true,"merge_conflict":true,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.1135305,"b_result":"`src/config.py`에서 `TIMEOUT`을 30에서 45로 바꿨습니다. 다른 줄은 건드리지 않았고, 셸 명령도 실행하지 않았습니다.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"same-line","mode":"full","rep":1,"expected_conflict_if_both":true,"a_changed":true,"b_changed":false,"merge_conflict":false,"b_refusals":1,"b_denials":["Interlock: claude-wt-a on feat/a is changing line 3 of src/config.py; this edit would make a merge conflict with it there. Leave those lines as they are and make the change around them, or wait until claude-wt-a's branch is merged."],"a_refusals":0,"turns":[3,3],"cost_usd":0.11687850000000002,"b_result":"I didn't change `TIMEOUT`. A hook blocked the edit to `src/config.py` line 3 (`TIMEOUT = 30`). It reported that another session, `claude-wt-a` on branch `feat/a`, is changing that same line, so my edit would cause a merge conflict.\n\nThe only ways to get `TIMEOUT` to 45 would be a workaround, such as reassigning it further down the file. That would break your \"change nothing else\" instruction and bypass the hook's check, so I didn't try it.\n\nWhich do you want?\n1. **Wait:** I'll make the edit after `feat/a` is merged.\n2. **Coordinate:** you check what `claude-wt-a` is doing to that line, and I retry once it's resolved.\n3. **Override:** if you want the edit made despite the conflict risk, tell me and I'll proceed. You'd resolve the conflict at merge time.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"next-line","mode":"none","rep":1,"expected_conflict_if_both":true,"a_changed":true,"b_changed":true,"merge_conflict":true,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.1133712,"b_result":"`src/config.py`에서 `RETRIES`를 3에서 5로 바꿨습니다. 다른 부분은 수정하지 않았고, 셸 명령도 실행하지 않았습니다.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"next-line","mode":"full","rep":1,"expected_conflict_if_both":true,"a_changed":true,"b_changed":false,"merge_conflict":false,"b_refusals":1,"b_denials":["Interlock: claude-wt-a on feat/a is changing line 3 of src/config.py; this edit would make a merge conflict with it there. Leave those lines as they are and make the change around them, or wait until claude-wt-a's branch is merged."],"a_refusals":0,"turns":[3,3],"cost_usd":0.11852570000000001,"b_result":"I couldn't make the change. The edit was blocked by an interlock hook, and `RETRIES` is still 3 in `src/config.py`.\n\nThe hook says the `claude-wt-a` session on `feat/a` is changing line 3 of `src/config.py`. It judged that my edit to line 4 (`RETRIES = 3` → `RETRIES = 5`) would cause a merge conflict with theirs. The two lines are adjacent, so I think git would treat them as overlapping hunks.\n\nI didn't try to get around the block, for example by rewriting the whole file with Write. That would defeat the check, and you also told me not to run shell commands.\n\nYou can either:\n- **Wait:** I redo the edit after `feat/a` is merged.\n- **Override:** you tell me to go ahead anyway. You'd then resolve the likely conflict at merge time.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"apart","mode":"none","rep":1,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11348240000000001,"b_result":"I changed `LOG_LEVEL` in `src/config.py` from `\"INFO\"` to `\"DEBUG\"`. I didn't touch anything else or run any shell commands.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"apart","mode":"full","rep":1,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,4],"cost_usd":0.12042550000000002,"b_result":"I changed `LOG_LEVEL` in `src/config.py` from `\"INFO\"` to `\"DEBUG\"`. I didn't change anything else, run any shell commands, or commit.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"function","mode":"none","rep":1,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.1135449,"b_result":"`describe()` in `src/config.py` now includes BACKOFF. It returns `timeout=30 retries=3 backoff=0.5`. I didn't change anything else or run any commands, so the change is untested.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"function","mode":"full","rep":1,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.1137349,"b_result":"`describe()` in `src/config.py` now includes BACKOFF. It returns `timeout=30 retries=3 backoff=0.5`. I didn't run it or change anything else.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"same-line","mode":"none","rep":2,"expected_conflict_if_both":true,"a_changed":true,"b_changed":true,"merge_conflict":true,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11328900000000001,"b_result":"I changed `TIMEOUT` from 30 to 45 in `src/config.py`. I didn't touch anything else or run any shell commands.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"same-line","mode":"full","rep":2,"expected_conflict_if_both":true,"a_changed":true,"b_changed":false,"merge_conflict":false,"b_refusals":1,"b_denials":["Interlock: claude-wt-a on feat/a is changing line 3 of src/config.py; this edit would make a merge conflict with it there. Leave those lines as they are and make the change around them, or wait until claude-wt-a's branch is merged."],"a_refusals":0,"turns":[3,3],"cost_usd":0.11713950000000002,"b_result":"I couldn't make the change. A pre-edit hook blocked it, and I haven't edited anything.\n\nThe hook reports that another session, `claude-wt-a` on branch `feat/a`, is already changing line 3 of `src/config.py`, which is the `TIMEOUT = 30` line. If I changed that same line, the two branches would conflict when merged.\n\nI could have worked around the hook, for example by reassigning `TIMEOUT = 45` further down the file. That would add a second assignment and break your \"change nothing else\" instruction, so I didn't.\n\nHow do you want to proceed?\n1. Wait until `feat/a` is merged, then I edit line 3 directly.\n2. Check with whoever is running `claude-wt-a`, since they may already be changing `TIMEOUT`.\n3. Go ahead with the override anyway. You'd then resolve the merge conflict later.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"next-line","mode":"none","rep":2,"expected_conflict_if_both":true,"a_changed":true,"b_changed":true,"merge_conflict":true,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.1131617,"b_result":"I changed `RETRIES` from 3 to 5 in `src/config.py`. I didn't touch anything else or run any shell commands.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"next-line","mode":"full","rep":2,"expected_conflict_if_both":true,"a_changed":true,"b_changed":false,"merge_conflict":false,"b_refusals":1,"b_denials":["Interlock: claude-wt-a on feat/a is changing line 3 of src/config.py; this edit would make a merge conflict with it there. Leave those lines as they are and make the change around them, or wait until claude-wt-a's branch is merged."],"a_refusals":0,"turns":[3,3],"cost_usd":0.1179462,"b_result":"I couldn't change `RETRIES` to 5, because a hook blocked the edit. It reported that another session, `claude-wt-a` on `feat/a`, is changing line 3 of `src/config.py`. Line 3 is `TIMEOUT`, and my edit is on line 4, so the hook treats it as a likely merge conflict with that branch. I haven't modified the file.\n\nThe only other way to get `RETRIES = 5` would be to override it elsewhere in the file, for example by reassigning it at the bottom. That would change more than you asked for, so I didn't do it.\n\nWhich would you prefer?\n- **Wait:** I make the edit after `feat/a` is merged.\n- **Edit now:** you tell me to go ahead anyway, and the two branches may conflict on merge.\n- **Override:** I reassign `RETRIES = 5` elsewhere in the file, which goes against your \"change nothing else\" instruction.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"apart","mode":"none","rep":2,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11348240000000001,"b_result":"I changed `LOG_LEVEL` in `src/config.py` from `\"INFO\"` to `\"DEBUG\"`. I didn't touch anything else or run any shell commands.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"apart","mode":"full","rep":2,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[4,3],"cost_usd":0.1202552,"b_result":"I changed `LOG_LEVEL` from `\"INFO\"` to `\"DEBUG\"` in `src/config.py`. I didn't touch anything else or run any shell commands.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"function","mode":"none","rep":2,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11342290000000001,"b_result":"`describe()` in `src/config.py` now includes the backoff value. It returns `timeout=... retries=... backoff=...`. I didn't change anything else, and I didn't run it or any tests.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"function","mode":"full","rep":2,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11373590000000001,"b_result":"`describe()` in `src/config.py` now includes the backoff value. It returns `timeout=30 retries=3 backoff=0.5`. I changed nothing else and ran no commands, so I haven't run the code.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"same-line","mode":"none","rep":3,"expected_conflict_if_both":true,"a_changed":true,"b_changed":true,"merge_conflict":true,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11323,"b_result":"I changed `TIMEOUT` from 30 to 45 in `src/config.py`. I made no other changes and ran no shell commands.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"same-line","mode":"full","rep":3,"expected_conflict_if_both":true,"a_changed":true,"b_changed":false,"merge_conflict":false,"b_refusals":1,"b_denials":["Interlock: claude-wt-a on feat/a is changing line 3 of src/config.py; this edit would make a merge conflict with it there. Leave those lines as they are and make the change around them, or wait until claude-wt-a's branch is merged."],"a_refusals":0,"turns":[3,3],"cost_usd":0.11670900000000001,"b_result":"I didn't change `TIMEOUT`. A pre-edit hook blocked the edit because another session, `claude-wt-a` on branch `feat/a`, is already changing line 3 of `src/config.py`, where `TIMEOUT = 30` is. The hook says my edit would cause a merge conflict with theirs.\n\nThe hook suggests making the change around that line, but `TIMEOUT` is that line, so that isn't possible. I also didn't try another way to write the file, since that would get around the check.\n\nWhich of these do you want?\n1. **Wait:** I leave it until `feat/a` is merged, then set `TIMEOUT = 45`.\n2. **Coordinate:** you check what `claude-wt-a` is doing to that line. If they're already changing `TIMEOUT`, you may want the value set there instead.\n3. **Override:** you tell me to make the edit anyway and accept the possible merge conflict.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"next-line","mode":"none","rep":3,"expected_conflict_if_both":true,"a_changed":true,"b_changed":true,"merge_conflict":true,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11364270000000001,"b_result":"`src/config.py`의 `RETRIES`를 3에서 5로 바꿨고, 다른 곳은 건드리지 않았습니다. 셸 명령은 쓰지 않았고 커밋도 하지 않았습니다.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"next-line","mode":"full","rep":3,"expected_conflict_if_both":true,"a_changed":true,"b_changed":false,"merge_conflict":false,"b_refusals":1,"b_denials":["Interlock: claude-wt-a on feat/a is changing line 3 of src/config.py; this edit would make a merge conflict with it there. Leave those lines as they are and make the change around them, or wait until claude-wt-a's branch is merged."],"a_refusals":0,"turns":[3,3],"cost_usd":0.11683170000000001,"b_result":"I couldn't make the edit. A pre-edit hook blocked it because another worktree, `claude-wt-a` on branch `feat/a`, is changing line 3 of `src/config.py` (`TIMEOUT`). My change to line 4 (`RETRIES = 3` → `RETRIES = 5`) sits right next to it, and the hook says the two would likely conflict when merged.\n\nI haven't tried to get around the block, for example by rewriting the whole file. That would defeat the check and could cause the merge conflict it's meant to prevent. The file is unchanged.\n\nYou can:\n1. Wait until `feat/a` is merged, then I'll make the one-line change.\n2. Tell me to go ahead anyway, if you're fine resolving a possible conflict at merge time.\n3. Check with whoever owns `claude-wt-a` about the order of the two changes.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"apart","mode":"none","rep":3,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,4],"cost_usd":0.12044600000000001,"b_result":"I changed `LOG_LEVEL` in `src/config.py` from `\"INFO\"` to `\"DEBUG\"`. I didn't touch anything else or run any shell commands.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"apart","mode":"full","rep":3,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.1139599,"b_result":"`src/config.py`의 `LOG_LEVEL`을 `\"INFO\"`에서 `\"DEBUG\"`로 바꿨습니다. 다른 부분은 수정하지 않았고, 셸 명령도 실행하지 않았습니다.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"function","mode":"none","rep":3,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11373590000000001,"b_result":"`describe()` in `src/config.py` now includes the backoff value. It returns `timeout=30 retries=3 backoff=0.5` with the current settings. I made no other changes. I didn't run anything, as you asked, so the change is untested.","model":"claude-haiku-5-5,claude-sonnet-5-5"},{"variant":"function","mode":"full","rep":3,"expected_conflict_if_both":false,"a_changed":true,"b_changed":true,"merge_conflict":false,"b_refusals":0,"b_denials":[],"a_refusals":0,"turns":[3,3],"cost_usd":0.11353440000000001,"b_result":"`describe()` in `src/config.py` now includes the backoff value. It returns `timeout=30 retries=3 backoff=0.5`. I didn't run it, since you asked for no shell commands, and I changed nothing else.","model":"claude-haiku-5-5,claude-sonnet-5-5"}]}