人間と自動配置が共存するキャンバスでは、自動配置は新規要素の座標だけを調整し、既存要素は一切動かさない
マインドマップ・ホワイトボード等、人間が自由に要素を配置できる一方でシステム(エージェント等)も自動でノードを追加するキャンバスでは、複数ブランチへの一括追加時にノード同士が重なる問題が起きやすい。単純な「親の周りに扇状配置」だけでは、他のブランチのノードと衝突することがある。
適用条件: 自動配置と人間の手動配置が同じキャンバス上で共存し、既存要素の位置を勝手に変えてはいけない制約がある場合。全体を毎回グラフレイアウトし直す(force-directed等)方式は人間の配置意図を壊すため不採用にすべきケース。
対処方法: 衝突回避のアルゴリズムを「新規追加される要素の座標だけを、既存の全要素(他ブランチ含む)の矩形と衝突しなくなるまでずらす」ことに限定する。既存要素(システム配置・人間配置いずれも)の位置は一切変更しない。矩形はテキスト長から概算できるが、本文だけを占有領域の正本にしてはいけない。アイコン、履歴・経緯footer、状態ラベル、バッジなど、ノード状態によって追加される表示要素も含めて矩形を推定する。サーバーが座標を決め、ブラウザが描画する構成では、この非本文部分が境界間契約になる。実ブラウザで状態ごとのbounding boxを測り、本文推定との差分を安全側に丸めてレイアウト定数へ反映する。人間が要素をドラッグしたら、その要素に「固定済み」フラグを立てておくと、将来もし既存要素も動かす再配置ロジックを足すことになっても、人間の配置を保護する境界がすでに用意されている。
確認方法: 複数ブランチ×複数子要素(例: 3ブランチ×各3子=計12件程度)を一括追加する再現手順を用意し、追加後の全要素ペアについて推定矩形が重ならないことを自動テストで検証する。矩形推定式はテスト側で実装から独立して書き直し、実装のリファクタでなく実際の退行を検知できるようにする。さらに、追加表示を持つ要素を「配置される候補」と「既存の障害物」の両方に置き、全体整形と個別移動の双方を検体にする。通常状態だけでなく、footerや状態行を持つ代表状態を含める。最後に実ブラウザのbounding boxとスクリーンショットで、推定値が実描画を下回らず、意図した間隔が残ることを確認する。
教訓: 「複数要素の自動配置」は「グラフ全体を最適レイアウトし直す」ことだと考えがちだが、人間の配置意図を守る必要がある共同編集キャンバスでは、スコープを「新規追加分だけ」に絞ることで、アルゴリズムが単純になり、人間の操作を壊すリスクも構造的に無くなる。