Skip to content

v0.15.0 — どのリポジトリでも競合が起きない

Choose a tag to compare

@tacyan tacyan released this 11 Aug 03:32
· 105 commits to main since this release
4f2dba2

どのリポジトリでも、複数の 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.mddocs/conflict-zero.md にあります。