Azure DevOps 親子リンクが保存時にしかエラーにならない理由と対処法(タスク・プロダクトバックログアイテム)

Azure DevOpsでタスクに親子リンク(Parent/Child)を追加すると、追加した瞬間は何も起きないのに、保存ボタンを押したタイミングでだけエラーが出ることがあります。これは操作ミスというより、Web画面の検証タイミングと親子リンクの仕様が噛み合った結果です。ここでは原因の切り分け方と、すぐに直す手順、再発防止の運用までまとめます。

目次

起きている現象を整理する(リンク追加は通るのに保存で弾かれる)

Azure DevOps(Scrumプロセス)でよく使われる「プロダクトバックログアイテム(PBI)」と「タスク(Task)」の組み合わせでは、通常は PBI →(子)Task という階層が基本です。一方でチーム運用として「PBIがTaskの子になる(逆転する)」のを禁止している場合、誤って不正な親子関係を作ろうとしたときにエラーが発生します。

問題は、リンクを追加した時点ではエラーが表示されず、保存した瞬間にだけエラーが出ることです。体感としては「その場で止めてほしい」のですが、Azure DevOpsのWeb UIはこの動きになりやすい設計です。

操作画面上の見え方実際に起きていること
親子リンクを追加リンクが一覧に追加され、エラーは出ないフォーム上に「変更案」が乗るだけで、サーバー側の整合性検証は未確定
保存ボタンを押すここで初めてエラーが表示されるサーバーに変更が送られ、親子関係・循環・親の数などがまとめて検証される

結論:エラーが「保存時」にしか出ない最大の理由

Azure DevOpsのWeb画面で作業項目(Work Item)を編集している間、画面上の変更は一時的に保持されます。リンク追加も同様で、リンク追加=即サーバー確定ではありません。保存のタイミングで、フィールド変更・リンク追加/削除・状態遷移などがまとめてサーバーへ送られ、そこで初めて整合性チェックが実行されます。

リンク追加時点でリアルタイム検証をしない(できない)理由は主に次のとおりです。

  • 検証にサーバー問い合わせが必要なケースが多い(リンク先の種類、既存の親の有無、循環参照の有無、権限など)
  • 編集途中は「まだ確定していない変更」が複数あり、途中段階だけ見ても最終形が確定しない
  • 毎回厳密チェックをすると、リンク検索や入力のたびに通信が増え、体感速度が落ちる
  • 複数タブ/複数人編集などで、保存時点で状況が変わることがある(=最終判断は保存時が一番正確)

その結果、リンク追加時は「いったん置ける」ように見えても、保存時のサーバー検証で「その親子関係は許可されない」「親は1つだけ」などのエラーになり得ます。これは不具合というより、検証を保存時に寄せている仕様として捉えるのが現実的です。

Azure DevOpsの親子リンクで押さえるべき基本仕様

「親子リンク(Hierarchy)」は、ただの関連付けではなく階層構造(ツリー)を作るためのリンクです。そのため、関連リンクよりも制約が強く、保存時に厳しく検証されます。

親子リンクの代表的なルール

  • 1つの作業項目が持てる「親(Parent)」は原則1つ(階層ツリーとして整合させるため)
  • 「子(Child)」は複数持てる
  • 循環参照(AがBの親で、BがAの親…など)は不可
  • 親子関係として想定されない作業項目タイプの組み合わせは、プロセス設定やバックログ構造によって拒否されることがある

リンク種類による性質の違い

同じ「リンク」でも種類によって意味が違います。親子リンクで詰まる場合、そもそも親子リンクを使うべきか、関連リンクで十分かを見直すと解決が早いことがあります。

リンクの種類目的制約よく使う場面
親子(Hierarchy:Parent/Child)階層(上位→下位)を作る親は原則1つ、循環不可、組み合わせ制限が出やすいEpic→Feature→PBI(User Story)→Task など
関連(Related)作業同士の関係性を示す比較的自由(複数可)、階層にはならない依存関係、参考情報、横断的な関連
重複(Duplicate)同じ内容の重複を示す運用ルール次第同一課題の統合、誤登録の整理

保存時エラーで特に多い原因パターン

「保存したらエラー」の裏側には、だいたい典型パターンがあります。まずはどれに当てはまるかを切り分けると、対処が速いです。

よくある原因起こりがちな状況確認ポイント対処の方向性
親がすでに存在する(親が2つになる)既存の親がある作業項目に、さらに「親」を追加リンク一覧に既存の「親」リンクが残っていないか既存の親を外してから新しい親を設定
許可されない作業項目タイプの親子Taskの下にPBIを入れるなど、バックログ階層を逆転「親」「子」の向きと、親/子それぞれのWork Item Type正しい階層(PBI→Task)に戻す。必要ならRelatedで代替
循環参照(ループ)親の親を辿ると自分に戻るようなリンクを作ったリンクを上位へ辿って同じIDが出てこないかどこかの親子リンクを外してツリーを崩す
権限・アクセスの問題リンク先のプロジェクト/エリアに編集権限がないリンク先が見える/編集できるか、権限設定権限付与 or リンク先を変更
同時編集で状態が変わった開いている間に別ユーザーが親子関係を変更履歴(History)や更新時刻再読み込みして最新状態で再度リンク設定

すぐ直す:親子リンクの付け替え手順(標準UIだけ)

保存時エラーの解消は、原因が「親が2つになる」か「親子の向き/タイプが不正」かで手順が変わります。ここでは標準UIだけでできる、最も確実な手順をまとめます。

手順A:既存の親を外してから、新しい親を設定する

  1. 対象の作業項目(例:タスク)を開きます。
  2. 上部の「リンク」または「関連作業(Links)」のセクションを開き、現在のリンク一覧を確認します。
  3. 「親(Parent)」がすでに設定されている場合は、不要な親リンクを削除します(ゴミ箱アイコンなど)。
  4. あらためて「リンクの追加」から「親(Parent)」を選び、正しい親(通常はPBI)を指定します。
  5. 保存し、エラーが消えるか確認します。

ポイント:「親を変えたい」のに、先に新しい親を追加してしまうと「親が複数」扱いになって保存で弾かれます。親の付け替えは、削除→追加の順番が安全です。

手順B:そもそも親子リンクにすべきでない場合、Relatedに切り替える

「上位下位ではなく、関連があるだけ」「参照したいだけ」「依存関係を残したいだけ」なら、親子リンクにこだわらずRelatedを使う方が運用が安定します。

  1. リンク追加で「関連(Related)」を選択
  2. リンク先ID/検索で対象作業項目を指定
  3. 保存

親子リンクはバックログ階層・スプリント計画・進捗集計に影響するため、階層にしたい意図が明確なときだけ使うのがおすすめです。

再発防止:タスク作成の入口を変えるとミスが減る

「リンク追加で親を探して付ける」運用は、どうしても付け間違いが起きます。標準機能だけでも、作成の入口を変えるだけで誤リンクが激減します。

PBI側からタスクを作成する(親が自動で正しく付く)

  • スプリントバックログやバックログ画面で、PBIの配下に「タスクを追加」する
  • またはPBIを開いて、関連作業から子としてタスクを追加する

この方法だと、最初から「PBI→Task」の形で作られるため、逆転(Task→PBI)や付け替えミスが起きにくくなります。

「親を探して紐づける」前に確認したいチェックリスト

  • リンクを追加する向きは本当に「親(Parent)」か(「子(Child)」を追加していないか)
  • リンク先のWork Item Typeは何か(Task / Product Backlog Item / Bug など)
  • すでに親が設定されていないか(特に既存アイテムの付け替え時)
  • 親にしたいのは「階層」か「関連」か(Relatedで十分ではないか)

チーム独自ルールを守るための現実的な運用(標準機能のみ)

「PBIがTaskの子になるのは禁止」のようなチームルールは、標準UIだけだと入力中の即時警告が難しい場面があります。そこでおすすめなのが、違反を“作らせない”工夫と、作られてしまった違反を“早く見つける”仕組みの両輪です。

違反を早く見つける:リンククエリで「逆転階層」を検出する

Azure DevOpsのクエリには、親子リンクを辿れる「Work items and direct links(作業項目と直接リンク)」の種類があります。これを使うと、例えば次のような違反を一覧化できます。

  • 「子」がPBIで、「親」がTaskになっているもの(階層逆転)
  • Taskの親がPBI以外になっているもの(運用上の例外を潰す)

作り方の例(概念):

  1. Boards > Queries(クエリ)で新規クエリを作成
  2. クエリタイプを「作業項目と直接リンク」に変更
  3. 上側(親)に「Work Item Type = Task」
  4. リンク種類を「親子(Hierarchy)」に指定
  5. 下側(子)に「Work Item Type = Product Backlog Item」
  6. 必要に応じて Area Path / Iteration Path / State などで絞り込み
  7. 保存して、結果をチームで共有

このクエリをダッシュボードにピン留めしておくと、ルール違反が発生した瞬間に目につきやすくなります。特に、複数チームで同じプロジェクトを触っている場合は効果が大きいです。

違反を作らせない:ルールの「見える化」を先に行う

標準UIが即時警告してくれないなら、チーム側で誤操作を起こしにくい導線を作るのが有効です。

  • 運用ガイドに「PBI→Taskが基本。Task→PBIは作らない」を図で掲載する
  • スプリント計画の手順を「PBI配下にタスク追加」に統一する
  • 親子リンクの用途(階層)とRelatedの用途(関連)を使い分けルールとして定義する
  • 違反検出クエリを週次で確認し、違反があればその場で修正する

それでも「入力時に止めたい」場合の選択肢(必要なときだけ)

「保存時に弾かれるのは分かったが、運用としては入力時に止めたい」という場合、標準機能だけでの限界はあります。強く抑止したいときは、次の方向性が現実的です。

方向性期待できること注意点
プロセス設計の見直しバックログ階層とWork Item Typeを整理し、誤運用の余地を減らすリンクの入力中チェックそのものが増えるわけではない
Marketplace拡張ルール違反の検知・警告を強化できる可能性導入審査・運用コストが増える
Service Hooks / 外部自動化違反が作られた瞬間に通知、差し戻しフローなどが作れる実装・保守が必要(チーム規模次第)

ただし、いきなり拡張や自動化に寄せるより、まずは「PBI側からタスクを作る」「違反クエリで見える化する」だけでも、現場のストレスと修正コストは大きく下がります。

よくある質問(保存時エラーのモヤモヤを解消)

リンク追加時にエラーが出ないのは不具合では?

多くのケースでは不具合というより、保存時にサーバー側で整合性を確定する設計によるものです。リンク追加の瞬間に完全な検証を行うにはサーバー問い合わせが必要になり、操作感が悪化しやすいため、最終確定の保存時に寄せています。

「親は1つだけ」のエラーが出たら、どこを見ればいい?

まずはリンク一覧に既存の「親(Parent)」が残っていないか確認してください。付け替えのつもりで新しい親を追加すると、保存で弾かれます。削除→追加の順番で行うと安定します。

PBIがTaskの子になってしまうと何が困る?

バックログの階層(上位→下位)が崩れると、スプリント計画、進捗の集計、ボード表示、チームの作業分解の粒度が乱れやすくなります。特に「Taskの下にPBIがある」状態は、作業分解の意図が読み取りにくく、レビュー時の認識齟齬につながりがちです。

親子リンクを外すと履歴やトレーサビリティは消える?

親子関係そのものは外れますが、作業項目の履歴(History)には変更として残ります。階層として追いたい意図があるなら親子リンク、単なる関係性や参照ならRelatedに寄せるなど、目的に合わせると整理しやすくなります。

まとめ(原因・対処・運用を一本化)

Azure DevOpsで親子リンクを追加した際、リンク追加時には何も起きず、保存時にだけエラーが出るのは、Web UIが編集途中の段階で厳密な階層検証をせず、保存時にサーバーでまとめて整合性を確認するためです。対処としては、既存の親リンクがある場合は外してから付け替える、親子の向きやWork Item Typeの組み合わせを正しい階層(通常はPBI→Task)に戻す、必要ならRelatedで代替するのが確実です。再発防止には、PBI側からタスクを作成する導線の統一と、違反検出クエリのダッシュボード化が特に効果的です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次