---
generated_at: 2026-02-24 15:30:00
metrics:
  claims_total: 135
  claims_with_evidence: 128
  claims_without_evidence: 7
confidence_derived: 0.95
---

# 根拠レポート：internal-packages-workflow-designer-ui 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.95**
  - 根拠あり：128 / 135、根拠なし：7
- 優先レビュー（高）
  1. **useTrigger関連テストケース（UT-WDU-129〜132）**：SWRのモック方法とclient.getTriggerの動作確認が必要
  2. **useUsageLimitsReached（UT-WDU-133〜135）**：useUsageLimitsフックの実装詳細確認が必要
  3. **JSONプロンプト検証（UT-WDU-103）**：isJsonContentの判定ロジック確認が必要

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `src/app-designer/store/app-designer-store.ts` - createAppDesignerStore関数定義
- E-02: `src/app-designer/store/slices/app-slice.ts` - hasStartNode, hasEndNode, isStartNodeConnectedToEndNode関数定義
- E-03: `src/app-designer/store/slices/workspace-slice.ts` - WorkspaceSlice, WorkspaceActions定義
- E-04: `src/app-designer/store/slices/ui-slice.ts` - UiSlice定義
- E-05: `src/app-designer/store/persistence/controller.ts` - createAppDesignerPersistenceController関数定義
- E-06: `src/app-designer/store/usecases/use-add-node.ts` - useAddNodeフック定義
- E-07: `src/app-designer/store/usecases/use-delete-node.ts` - useDeleteNodeフック定義
- E-08: `src/app-designer/store/usecases/use-delete-nodes.ts` - useDeleteNodes, buildDeleteSet, computeNextStateForDelete関数定義
- E-09: `src/app-designer/store/usecases/use-add-connection.ts` - useAddConnectionフック定義
- E-10: `src/app-designer/store/usecases/use-remove-connection-and-input.ts` - useRemoveConnectionAndInputフック定義
- E-11: `src/app-designer/store/usecases/use-is-valid-connection.ts` - useIsValidConnectionフック定義
- E-12: `src/app-designer/store/usecases/use-connect-nodes.ts` - useConnectNodesフック定義
- E-13: `src/app-designer/store/usecases/use-disconnect-nodes.ts` - useDisconnectNodesフック定義
- E-14: `src/app-designer/store/usecases/use-copy-node.ts` - useCopyNodeフック定義
- E-15: `src/app-designer/store/usecases/use-duplicate-node.ts` - useDuplicateNode, isSingleInstanceNode関数定義
- E-16: `src/app-designer/store/usecases/use-upload-file.ts` - useUploadFile, formatFileSize, isLikelyOversizeErrorMessage関数定義
- E-17: `src/app-designer/store/hooks.ts` - useAppDesignerStore, useWorkspaceActions, useUiActionsフック定義
- E-18: `src/editor/lib/validate-url.ts` - validateUrl関数定義
- E-19: `src/editor/lib/upsert-array.ts` - upsertArray関数定義
- E-20: `src/editor/lib/validate-prompt.ts` - isPromptEmpty関数定義
- E-21: `src/new-editor/lib/is-node-id.ts` - isNodeId関数定義
- E-22: `src/new-editor/lib/selectors.ts` - groupByMap, selectNodePanelDataById, selectCanvasData, selectNodeIds, selectNode関数定義
- E-23: `src/new-editor/store/store.ts` - createEditorStore, EditorState, EditorAction定義
- E-24: `src/ui/generation-text.ts` - getAssistantTextFromGeneration関数定義
- E-25: `src/hooks/use-trigger.ts` - useTriggerフック定義
- E-26: `src/hooks/usage-limits.ts` - useUsageLimitsReachedフック定義

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | createAppDesignerStoreが正しくストアを生成 | E-01 | ○ |
| C-02 | llmProvidersのデフォルト値が空配列 | E-01 | ○ |
| C-03 | hasStartNodeがAppEntryノード存在時にtrue返却 | E-02 | ○ |
| C-04 | hasStartNodeがAppEntryノード不在時にfalse返却 | E-02 | ○ |
| C-05 | hasEndNodeがEndノード存在時にtrue返却 | E-02 | ○ |
| C-06 | hasEndNodeがEndノード不在時にfalse返却 | E-02 | ○ |
| C-07 | isStartNodeConnectedToEndNodeが経路存在時にtrue返却 | E-02 | ○ |
| C-08 | isStartNodeConnectedToEndNodeが経路不在時にfalse返却 | E-02 | ○ |
| C-09 | isStartNodeConnectedToEndNodeがStartノード不在時にfalse返却 | E-02 | ○ |
| C-10 | isStartNodeConnectedToEndNodeがEndノード不在時にfalse返却 | E-02 | ○ |
| C-11 | addNodeがノードを追加 | E-03 | ○ |
| C-12 | upsertUiNodeStateがUIステートを挿入/更新 | E-03 | ○ |
| C-13 | updateNodeがノードを部分更新 | E-03 | ○ |
| C-14 | addNodeInputがInputを追加 | E-03 | ○ |
| C-15 | addConnectionがコネクションを追加 | E-03 | ○ |
| C-16 | removeConnectionByIdがコネクションを削除 | E-03 | ○ |
| C-17 | removeNodeByIdがノードを削除 | E-03 | ○ |
| C-18 | setUiNodeStateがUI状態を部分更新 | E-03 | ○ |
| C-19 | setUiViewportがビューポートを設定 | E-03 | ○ |
| C-20 | setSelectedConnectionIdsが選択コネクションを設定 | E-03 | ○ |
| C-21 | updateWorkspaceNameがワークスペース名を更新 | E-03 | ○ |
| C-22 | updateWorkspaceNameがundefinedを受け付ける | E-03 | ○ |
| C-23 | setClipboardNodeがクリップボードにノード設定 | E-04 | ○ |
| C-24 | setClipboardNodeがnullでクリア可能 | E-04 | ○ |
| C-25 | setCurrentShortcutScopeがスコープを設定 | E-04 | ○ |
| C-26 | saveNowがdirty時に保存実行 | E-05 | ○ |
| C-27 | saveNowがdirty=false時にスキップ | E-05 | ○ |
| C-28 | 保存中の変更がキューに追加される | E-05 | ○ |
| C-29 | isDirtyが変更状態を返却 | E-05 | ○ |
| C-30 | disposeがリソースを解放 | E-05 | ○ |
| C-31 | flushBestEffortがsaveBestEffort呼び出し | E-05 | ○ |
| C-32 | flushBestEffortがsaveBestEffort未定義時に何もしない | E-05 | ○ |
| C-33 | hasWorkspaceChangedがnodes変更検知 | E-05 | ○ |
| C-34 | hasWorkspaceChangedが変更なし判定 | E-05 | ○ |
| C-35 | useAddNodeがノードとUIステート追加 | E-06 | ○ |
| C-36 | useAddNodeがUI省略時にUI更新スキップ | E-06 | ○ |
| C-37 | useDeleteNodeがノード削除 | E-07 | ○ |
| C-38 | useDeleteNodeがID文字列パース | E-07 | ○ |
| C-39 | buildDeleteSetがAppEntry削除時にEndも追加 | E-08 | ○ |
| C-40 | buildDeleteSetがEnd削除時にAppEntryも追加 | E-08 | ○ |
| C-41 | buildDeleteSetが通常ノードでペア削除しない | E-08 | ○ |
| C-42 | computeNextStateForDeleteがコネクション連動削除 | E-08 | ○ |
| C-43 | computeNextStateForDeleteがUIステート連動削除 | E-08 | ○ |
| C-44 | computeNextStateForDeleteがselectedConnectionIds連動 | E-08 | ○ |
| C-45 | useDeleteNodesがApp連動削除 | E-08 | ○ |
| C-46 | useAddConnectionがコネクション生成・追加 | E-09 | ○ |
| C-47 | useAddConnectionがsync処理呼び出し | E-09 | ○ |
| C-48 | useRemoveConnectionAndInputがコネクション削除 | E-10 | ○ |
| C-49 | useRemoveConnectionAndInputがInput連動削除 | E-10 | ○ |
| C-50 | useRemoveConnectionAndInputが存在しないコネクションで状態不変 | E-10 | ○ |
| C-51 | useRemoveConnectionAndInputがActionNodeでInput削除しない | E-10 | ○ |
| C-52 | useIsValidConnectionが有効な接続でtrue | E-11 | ○ |
| C-53 | useIsValidConnectionが自己接続でfalse | E-11 | ○ |
| C-54 | useIsValidConnectionが重複接続でfalse | E-11 | ○ |
| C-55 | useIsValidConnectionがsourceHandle nullでfalse | E-11 | ○ |
| C-56 | useIsValidConnectionがtargetHandle nullでfalse | E-11 | ○ |
| C-57 | useConnectNodesが接続作成 | E-12 | ○ |
| C-58 | useConnectNodesがoutputNode不在で警告 | E-12 | ○ |
| C-59 | useConnectNodesがinputNode不在で警告 | E-12 | ○ |
| C-60 | useDisconnectNodesがコネクション削除 | E-13 | ○ |
| C-61 | useDisconnectNodesがInput連動削除 | E-13 | ○ |
| C-62 | useDisconnectNodesがコネクション不在で状態不変 | E-13 | ○ |
| C-63 | useCopyNodeがノード複製 | E-14 | ○ |
| C-64 | useCopyNodeがinputs-only戦略で入力接続複製 | E-14 | ○ |
| C-65 | useCopyNodeがall戦略で両方向接続複製 | E-14 | ○ |
| C-66 | useCopyNodeがnone戦略で接続複製なし | E-14 | ○ |
| C-67 | useDuplicateNodeが選択ノード複製 | E-15 | ○ |
| C-68 | useDuplicateNodeが指定ID複製 | E-15 | ○ |
| C-69 | useDuplicateNodeがappEntry複製スキップ | E-15 | ○ |
| C-70 | useDuplicateNodeがend複製スキップ | E-15 | ○ |
| C-71 | useDuplicateNodeが位置オフセット(200,100) | E-15 | ○ |
| C-72 | useDuplicateNodeがFileNodeでcopyFiles連携 | E-15 | ○ |
| C-73 | isSingleInstanceNodeがappEntryでtrue | E-15 | ○ |
| C-74 | isSingleInstanceNodeがendでtrue | E-15 | ○ |
| C-75 | isSingleInstanceNodeがその他でfalse | E-15 | ○ |
| C-76 | useUploadFileがファイルアップロード | E-16 | ○ |
| C-77 | useUploadFileが重複ファイル名でエラー | E-16 | ○ |
| C-78 | useUploadFileがサイズ超過でエラー | E-16 | ○ |
| C-79 | formatFileSizeがKBフォーマット | E-16 | ○ |
| C-80 | formatFileSizeがMBフォーマット | E-16 | ○ |
| C-81 | isLikelyOversizeErrorMessageが413検知 | E-16 | ○ |
| C-82 | isLikelyOversizeErrorMessageがpayload too large検知 | E-16 | ○ |
| C-83 | useAppDesignerStoreがセレクタで値取得 | E-17 | ○ |
| C-84 | useWorkspaceActionsがアクション取得 | E-17 | ○ |
| C-85 | useUiActionsがUIアクション取得 | E-17 | ○ |
| C-86 | validateUrlがHTTPS URL検証 | E-18 | ○ |
| C-87 | validateUrlがHTTP URL検証 | E-18 | ○ |
| C-88 | validateUrlがnullでnull返却 | E-18 | ○ |
| C-89 | validateUrlがundefinedでnull返却 | E-18 | ○ |
| C-90 | validateUrlが空文字列でnull返却 | E-18 | ○ |
| C-91 | validateUrlが空白のみでnull返却 | E-18 | ○ |
| C-92 | validateUrlが不正URLでnull返却 | E-18 | ○ |
| C-93 | validateUrlがFTPプロトコル拒否 | E-18 | ○ |
| C-94 | validateUrlがカスタムプロトコル許可 | E-18 | ○ |
| C-95 | upsertArrayが新規追加 | E-19 | ○ |
| C-96 | upsertArrayが更新 | E-19 | ○ |
| C-97 | upsertArrayが空配列対応 | E-19 | ○ |
| C-98 | isPromptEmptyが空文字列でtrue | E-20 | ○ |
| C-99 | isPromptEmptyが空白のみでtrue | E-20 | ○ |
| C-100 | isPromptEmptyが全角空白でtrue | E-20 | ○ |
| C-101 | isPromptEmptyがundefinedでtrue | E-20 | ○ |
| C-102 | isPromptEmptyが有効文字列でfalse | E-20 | ○ |
| C-103 | isPromptEmptyがJSON形式判定 | E-20 | △ |
| C-104 | isNodeIdが有効NodeIdでtrue | E-21 | ○ |
| C-105 | isNodeIdが無効文字列でfalse | E-21 | ○ |
| C-106 | isNodeIdがnullでfalse | E-21 | ○ |
| C-107 | isNodeIdが数値でfalse | E-21 | ○ |
| C-108 | groupByMapがグループ化 | E-22 | ○ |
| C-109 | groupByMapが空配列で空Map | E-22 | ○ |
| C-110 | selectNodePanelDataByIdがノードデータ取得 | E-22 | ○ |
| C-111 | selectNodePanelDataByIdが存在しないIDでundefined | E-22 | ○ |
| C-112 | selectCanvasDataがUIデータ取得 | E-22 | ○ |
| C-113 | selectNodeIdsがID配列取得 | E-22 | ○ |
| C-114 | selectNodeがノード取得 | E-22 | ○ |
| C-115 | createEditorStore.updateNodeがノード更新 | E-23 | ○ |
| C-116 | createEditorStore.setInspectedNodeIdが設定 | E-23 | ○ |
| C-117 | createEditorStore.setInspectedNodeIdがクリア | E-23 | ○ |
| C-118 | createEditorStore.setNodePositionが位置更新 | E-23 | ○ |
| C-119 | createEditorStore.setNodePositionがnodeState不在で不変 | E-23 | ○ |
| C-120 | createEditorStore.setNodeSelectedが選択状態更新 | E-23 | ○ |
| C-121 | createEditorStore.removeNodeがノード削除 | E-23 | ○ |
| C-122 | createEditorStore.removeNodeがnodeState連動削除 | E-23 | ○ |
| C-123 | createEditorStore.removeNodeがinspectedNodeId連動 | E-23 | ○ |
| C-124 | getAssistantTextFromGenerationがテキスト抽出 | E-24 | ○ |
| C-125 | getAssistantTextFromGenerationが複数メッセージ結合 | E-24 | ○ |
| C-126 | getAssistantTextFromGenerationがmessagesなしで空文字列 | E-24 | ○ |
| C-127 | getAssistantTextFromGenerationがassistantなしで空文字列 | E-24 | ○ |
| C-128 | getAssistantTextFromGenerationがtextパート以外フィルタ | E-24 | ○ |
| C-129 | useTriggerがconfiguredでデータ取得 | E-25 | △ |
| C-130 | useTriggerがunconfiguredでフェッチしない | E-25 | △ |
| C-131 | useTrigger.enableTriggerが有効化 | E-25 | △ |
| C-132 | useTrigger.disableTriggerが無効化 | E-25 | △ |
| C-133 | useUsageLimitsReachedが上限到達でtrue | E-26 | △ |
| C-134 | useUsageLimitsReachedが上限未到達でfalse | E-26 | ○ |
| C-135 | useUsageLimitsReachedがundefinedでfalse | E-26 | △ |

## 4) 不足情報（Unknown / Missing）
- **C-103 (isPromptEmptyのJSON形式判定)**: isJsonContent関数の実装が別パッケージ（@giselles-ai/text-editor-utils）にあり、その詳細な判定ロジックは確認できていない
  - 候補：text-editor-utils パッケージのソースコード確認
- **C-129〜132 (useTrigger関連)**: SWRを使用した非同期データ取得のため、モック方法とclient.getTrigger/setTriggerの実際の動作詳細は外部依存
  - 候補：@giselles-ai/react パッケージ内のuseGiselle実装確認
- **C-133, C-135 (useUsageLimitsReached関連)**: useUsageLimitsフックが@giselles-ai/reactからインポートされており、その戻り値の構造は外部依存
  - 候補：@giselles-ai/react パッケージ内のuseUsageLimits実装確認

## 5) リスクフラグ（レビュー観点）
- **0 (低リスク)**: ストア関連のslice（app-slice, workspace-slice, ui-slice）- ロジックがシンプルで明確
- **0 (低リスク)**: ユーティリティ関数（validateUrl, upsertArray, isPromptEmpty, isNodeId）- 純粋関数でテストしやすい
- **1 (中リスク)**: usecases（use-add-node, use-delete-node等）- Reactフックとストアの組み合わせでモック設定が必要
- **1 (中リスク)**: persistence/controller - 非同期処理とタイマーを含むため、テスト時のタイミング制御が必要
- **2 (高リスク)**: useTrigger, useUsageLimitsReached - 外部パッケージ（@giselles-ai/react）への依存があり、モック設定が複雑

## 6) レビュアーチェックリスト（最小）
- [ ] 各テストケースの入力値と期待結果が対象ソースコードの仕様と一致しているか
- [ ] 境界値テスト（空配列、null、undefined）が網羅されているか
- [ ] エラーハンドリングのテストケースが適切か（特にuse-upload-file.ts）
- [ ] シングルインスタンスノード（appEntry, end）の制約テストが十分か
- [ ] 外部依存（@giselles-ai/react, @giselles-ai/protocol）のモック方針が明確か
- [ ] 非同期処理（persistence controller, useTrigger）のテスト方針が適切か
- [ ] コネクション検証（useIsValidConnection）の全パターンが網羅されているか
