---
generated_at: 2026-02-18 10:50:00
metrics:
  claims_total: 32
  claims_with_evidence: 31
  claims_without_evidence: 1
confidence_derived: 0.97
---

# 根拠レポート：144-AG SPNテスト

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：31 / 32、根拠なし：1
- 優先レビュー（高）
  1. **$resolved変数の参照**：185行目で未定義の$resolved変数を使用している可能性

## 2) 参照した情報（Evidence一覧）

- E-01: `public/Test-DbaAgSpn.ps1` - AG SPN検証コマンド（229行）
- E-02: `docs/code-to-docs/画面機能マッピング/画面機能マッピング.csv` - 機能マッピング情報
- E-03: `docs/code-to-docs/画面一覧/画面一覧.csv` - 画面一覧情報

## 3) Claims と根拠の対応（レビューの主戦場）

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | Test-DbaAgSpnはAGリスナーのSPN登録を検証する | E-01: 3-9行目 SYNOPSIS/DESCRIPTION | ○ |
| C-02 | MSSQLSvc/listener.domain.comとMSSQLSvc/listener.domain.com:portの2形式を検証 | E-01: 7行目, 144-176行目 | ○ |
| C-03 | SqlInstanceパラメータでインスタンスを指定可能 | E-01: 94行目 | ○ |
| C-04 | InputObjectでパイプライン入力をサポート | E-01: 99-100行目 ValueFromPipeline | ○ |
| C-05 | AvailabilityGroupパラメータで特定AGを指定可能 | E-01: 97行目 | ○ |
| C-06 | Listenerパラメータで特定リスナーを指定可能 | E-01: 98行目 | ○ |
| C-07 | 出力にComputerName/SqlInstance/InstanceName/RequiredSPN/IsSetが含まれる | E-01: 59-72行目 .OUTPUTS | ○ |
| C-08 | TcpEnabledはAGリスナーで常にtrue | E-01: 68行目, 153行目 | ○ |
| C-09 | DynamicPortはAGリスナーで常にfalse | E-01: 70行目, 155行目 | ○ |
| C-10 | Error=「SPN missing」でSPN未登録を示す | E-01: 72行目, 223行目 | ○ |
| C-11 | Get-DbaAvailabilityGroupを内部で呼び出す | E-01: 115行目 | ○ |
| C-12 | Get-DbaAgListenerでリスナー情報を取得 | E-01: 121-123行目 | ○ |
| C-13 | $server.Information.FullyQualifiedNetNameでFQDNを取得 | E-01: 134行目 | ○ |
| C-14 | リスナー名とドメイン名を結合してホストエントリを生成 | E-01: 136行目 | ○ |
| C-15 | デフォルトインスタンスはMSSQLSvc/{hostEntry}形式 | E-01: 138-139行目 | ○ |
| C-16 | 名前付きインスタンスはMSSQLSvc/{hostEntry}:{InstanceName}形式 | E-01: 140-141行目 | ○ |
| C-17 | ポート番号形式はMSSQLSvc/{hostEntry}:{Port}形式 | E-01: 167行目 | ○ |
| C-18 | LocalSystem/NT SERVICE\*は仮想アカウントとして処理 | E-01: 183-186行目 | ○ |
| C-19 | 末尾$のアカウントはgMSAとして処理 | E-01: 187-190行目 | ○ |
| C-20 | 仮想アカウントはComputerとして検索 | E-01: 186行目 searchfor = 'Computer' | ○ |
| C-21 | gMSAはComputerとして検索 | E-01: 189行目 searchfor = 'Computer' | ○ |
| C-22 | 通常アカウントはUserとして検索 | E-01: 182行目 $searchfor = 'User' | ○ |
| C-23 | Get-DbaADObjectでAD検索を行う | E-01: 197行目 | ○ |
| C-24 | 検索結果をキャッシュして重複検索を回避 | E-01: 105行目, 194-206行目 | ○ |
| C-25 | GetUnderlyingObject()でDirectoryEntryを取得 | E-01: 209行目 | ○ |
| C-26 | servicePrincipalNameプロパティでSPN存在確認 | E-01: 210行目 | ○ |
| C-27 | IsSetフラグで登録状態を示す | E-01: 211行目 $spn.IsSet = $true | ○ |
| C-28 | SPN未登録かつTcpEnabled時にError=「SPN missing」を設定 | E-01: 222-224行目 | ○ |
| C-29 | CredentialとDomainNameはデフォルト表示から除外 | E-01: 74行目, 226行目 | ○ |
| C-30 | SqlInstanceもInputObjectも未指定時はエラー | E-01: 109-111行目 | ○ |
| C-31 | SQL Server 2012以上が必要 | E-01: 14行目 | ○ |
| C-32 | 仮想アカウント検出時に$resolved変数を使用 | E-01: 185行目 | △ |

## 4) 不足情報（Unknown / Missing）
- **$resolved変数の定義元**: 185行目で`$resolved.Domain`と`$resolved.ComputerName`を参照しているが、この変数の定義がコード内に見当たらない
  - 候補：内部関数や暗黙のスコープ変数の可能性を確認

## 5) リスクフラグ（レビュー観点）
- **1（中リスク）**: $resolved変数が未定義の可能性があり、仮想アカウント処理でエラーが発生する可能性
- **0（低リスク）**: 主要なSPN検証ロジックはソースコードで明確に定義されている

## 6) レビュアーチェックリスト（最小）
- [ ] 仮想アカウント（LocalSystem/NT SERVICE\*）での動作を実環境で確認
- [ ] gMSAアカウントでの動作確認
- [ ] 複数リスナーを持つAGでの動作確認
- [ ] Set-DbaSpnへのパイプライン連携の動作確認
- [ ] $resolved変数の定義元とスコープを確認
