v0.15.0 — どのリポジトリでも競合が起きない
どのリポジトリでも、複数の AI エージェントが同時に書いても競合が起きない。 それを主張ではなく数字にした版です。
自分のリポジトリで確かめられます
tools/anyrepo-prove.sh --repo /path/to/your/repo --writers 16合成した実験ではなく、あなたのリポジトリの実際のファイル構成で N 体を走らせ、素の git なら何件衝突するかと、zaivern ありで何件になるかを並べます。
| リポジトリ | 書き手 | 素の git | zaivern あり |
|---|---|---|---|
| Rust・追跡 259 ファイル | 16 | 26 ファイル / 28 ハンク衝突 | 0 / 0(96/96 確保成立・断られ 0) |
| TS/HTML・追跡 1194 ファイル | 16 | 26 / 28 | 0 / 0(96/96・32 件ずらし) |
| 全員が同じ場所を要求 | 32 | 118 / 147 | 0 / 0(192/192・171 件ずらし) |
リポジトリの形は 13 通り(bare / submodule / worktree 内 / sparse-checkout / LFS / shallow / 巨大 / detached HEAD …)を実物で確かめています。動かない形は理由を明記して飛ばします。
直した中でいちばん重いもの — 2 人が同じ行を同時に書いていました
担当は行番号ではなく「そこにある内容」で覚えます。ところが自分がその行を書き換えると自分の目印が合わなくなり、取り直したときに似た行(空行・``` ・---)へ誤って合って、担当が別の場所へ「移動」していました。空いたことになった行を他の人が正当に確保するので 2 人が同じ行を書きます。
台帳の最終形には重なりが残らない(消えたのではなく移動した)ので、台帳をいくら見ても気付けませんでした。実在リポジトリで 8 回中 3 回起きていたものが、乱数種 12 通り・126 回の検証で 0 件になっています。
静かに壊れていたもの
/絶対/パス/で確保しても何も守られていませんでした。「1 件を確保しました」と返るのに、台帳には相対パスと一致しない形で載っており、他の人を 1 人も止めていませんでしたzai lease claim a.rs --typoの打ち間違いが--typoという名前のファイルとして確保されていました--dirを付けても、関数名や行番号の解決が今いるフォルダ基準でした- シンボリックリンク越しの抜け道。
lib -> srcのような別名で確保された担当が突き合わされず、リポジトリの外を指すリンク経由の書き込みも通っていました - rustc を上げると、台帳もセッションも端末ログも全部消えていました。置き場の名前が「版をまたいで同じ値になる保証のないハッシュ」から作られていたためです。古い名前の置き場は自動で引き取ります
- 同じファイルで 2 人の担当が交互に並ぶ配り方を
zai guard checkが素通りさせていました。離れていても、繰り返しの多い内容では git がハンクをまとめてしまい衝突します
数字が変わったもの
- 64 体で 10〜13 体が締め出されていました。ずらしてよい幅の上限が固定 200 行だったのに対し、混んだ配置は 204〜234 行を要求します。6 回まわして毎回 51〜55 体しか通らなかったものが、6 回とも 64 体全部通ります
- アイドル時の CPU を 1 コアの 1.95% → 0.35% に(20 秒窓)。入力 1 回あたりの再描画要求は 600 件 → 89 件。眠るまでの秒数は変えていないので見た目はそのままです
- 判定そのものを 2581 倍速く(互いに素な 800 件で 9,467ms → 3.67ms)
見た目
- gitignore されたファイルを VS Code と同じ薄い色で表示するようになりました(既定)。これまでは一覧から消えていました
正直に — できていないこと
- 繰り返しの多い内容では「綺麗にマージできる」を保証しきれません。 同じ行を 2 人に配らないこと(所有)は内容に依らず常に成り立ちますが、マージが綺麗に通ることは内容に依存します。判定できない場合は断ります
- Windows は実行時の挙動と GUI が未検証です。CI のテストは通っていますが、Windows で実際に触った数字はありません
- 削除と挿入が混ざる特殊な組で、見逃しは 0 のままですが「見逃さないことを証明した」わけではありません
詳細は CHANGELOG.md と docs/conflict-zero.md にあります。