---
generated_at: 2026-02-20 10:00:00
metrics:
  claims_total: 163
  claims_with_evidence: 155
  claims_without_evidence: 8
confidence_derived: 0.95
---

# 根拠レポート：served-core 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.95**
  - 根拠あり：155 / 163、根拠なし：8
- 優先レビュー（高）
  1. **C-041, C-042（determineOutputFolder）**：プラットフォーム依存の条件分岐で実行環境による確認が必要
  2. **C-155（registerErrorHandlers）**：BacktraceHandler条件コンパイルによりテスト可能性が制限される
  3. **C-017（makeServerInfo）**：非unittestビルド限定のためテスト構成に制約あり

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

- E-01: `source/app.d` - エントリポイント、コマンドライン引数処理、printVersion関数
- E-02: `source/served/extension.d` - LSP初期化、設定変更ハンドリング、ワークスペース管理、DCD制御
- E-03: `source/served/info.d` - バージョン定数定義（Version, VersionSuffix, BundledDependencies）
- E-04: `source/served/types.d` - Configuration構造体、Workspace構造体、ヘルパー関数群
- E-05: `source/served/backend/lazy_workspaced.d` - LazyWorkspaceD/LazyInstance遅延ローディング実装
- E-06: `source/served/lsp/protoext.d` - LSPプロトコル拡張データ構造体、SingleValueParamsミックスイン
- E-07: `source/external/ldc/config.d` - LDC設定ファイルパーサー（Setting, Parser）
- E-08: `source/crash_handler.d` - シグナルハンドラ登録（条件コンパイル）
- E-09: `docs/code-to-docs/単体テストケース一覧/plan.md` - モジュール構成と対象ファイル一覧

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

### app.d 関連（C-001 〜 C-009）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | printVersionはバージョン情報をstdoutに出力する | E-01 (L44-75) | ○ |
| C-002 | printVersionは指定されたFile出力先に書き込む | E-01 (L44: output引数) | ○ |
| C-003 | --versionフラグで0を返しバージョン表示 | E-01 (L141-145) | ○ |
| C-004 | --helpフラグでヘルプ表示して0を返す | E-01 (L134-140) | ○ |
| C-005 | --langでja-JPを指定するとcurrentLanguageが"ja"になる | E-01 (L147-148: lang[0..2]) | ○ |
| C-006 | --requireで未知featureは戻り値1 | E-01 (L152-163: IncludedFeatures.canFind) | ○ |
| C-007 | --provide httpでletEditorDownload=true | E-01 (L171-173) | ○ |
| C-008 | --provideで未知値は警告出力 | E-01 (L212) | ○ |
| C-009 | --langに2文字未満を指定するとcurrentLanguageが変わらない | E-01 (L147: if lang.length >= 2) | ○ |

### extension.d 関連（C-010 〜 C-052）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-010 | getPossibleSourceRootsはconfigのimportPathsを返す | E-02 (L213-221) | ○ |
| C-011 | sourceディレクトリが存在すればそのパスを返す | E-02 (L222-225) | ○ |
| C-012 | srcディレクトリのフォールバック | E-02 (L226-227) | ○ |
| C-013 | source/srcどちらもなければworkspaceFolderそのもの | E-02 (L228) | ○ |
| C-014 | initializeでServerCapabilitiesが正しく返される | E-02 (L231-332) | ○ |
| C-015 | ワークスペース空の場合にtmpフォルダがfallback | E-02 (L252-262) | ○ |
| C-016 | trace=verboseでglobalLogLevel=trace | E-02 (L233-234) | ○ |
| C-017 | makeServerInfoの返却フォーマット | E-02 (L334-349), E-03 | △ |
| C-018 | ensureStartedUpの初回呼出し | E-02 (L354-361) | ○ |
| C-019 | ensureStartedUpの2回目以降は何もしない | E-02 (L357: if startedUp return) | ○ |
| C-020 | dubRecipeExists: dub.json存在でtrue | E-02 (L497) | ○ |
| C-021 | dubRecipeExists: dub.sdl存在でtrue | E-02 (L497) | ○ |
| C-022 | dubRecipeExists: package.json Dub形式でtrue | E-02 (L499-506) | ○ |
| C-023 | dubRecipeExists: 不在でfalse | E-02 (L511) | ○ |
| C-024 | rootsForProject: 非再帰でルートのみ | E-02 (L514-530) | ○ |
| C-025 | rootsForProject: 再帰でサブプロジェクト含む | E-02 (L532-546) | ○ |
| C-026 | rootsForProject: blockedパターン除外 | E-02 (L541-543) | ○ |
| C-027 | rootsForProject: extra追加 | E-02 (L547-551) | ○ |
| C-028 | rootsForProject: .dub除外 | E-02 (L537: dir.canFind(".dub")) | ○ |
| C-029 | removeWorkspace: インスタンス削除とdisabled | E-02 (L933-940) | ○ |
| C-030 | removeWorkspace: 空workspaceRootで何もしない | E-02 (L936-937) | ○ |
| C-031 | MessageHandler.warnのログフォーマット | E-02 (L944-949) | ○ |
| C-032 | MessageHandler.errorのログフォーマット | E-02 (L952-958) | ○ |
| C-033 | MessageHandler.warn: instanceがnullで"global" | E-02 (L948: instance ? instance.cwd : "global") | ○ |
| C-034 | handleCrash: dcdでDCDサーバ再起動 | E-02 (L963-968) | ○ |
| C-035 | handleCrash: dcd以外で何もしない | E-02 (L963: if component == "dcd") | ○ |
| C-036 | wantsDCDServer: 全条件満たしでtrue | E-02 (L972-997) | ○ |
| C-037 | wantsDCDServer: shutdownRequestedでfalse | E-02 (L974-978) | ○ |
| C-038 | wantsDCDServer: dcdUpdatingでfalse | E-02 (L979-983) | ○ |
| C-039 | wantsDCDServer: 未知workspaceでfalse | E-02 (L984-989) | ○ |
| C-040 | wantsDCDServer: enableAutoComplete=falseでfalse | E-02 (L990-994) | ○ |
| C-041 | determineOutputFolder: Linuxでのパス | E-02 (L1061-1064) | △ |
| C-042 | determineOutputFolder: macOSでのパス | E-02 (L1073-1075) | △ |
| C-043 | shutdown: backend.shutdownが呼ばれる | E-02 (L1078-1088) | ○ |
| C-044 | shutdown: backend==nullでJsonValue(null) | E-02 (L1081-1082) | ○ |
| C-045 | setTrace: verbose→trace | E-02 (L1095-1096) | ○ |
| C-046 | setTrace: 非verbose→info | E-02 (L1097-1098) | ○ |
| C-047 | changedConfig: 未初期化でdoStartup呼出し | E-02 (L95-99) | ○ |
| C-048 | changedConfig: 空URI非unnamedでエラー | E-02 (L71-77) | ○ |
| C-049 | changedConfig: stdlibPath変更でDCD addImports | E-02 (L107-110) | ○ |
| C-050 | changedConfig: enableLinting=falseでクリア | E-02 (L170-178) | ○ |
| C-051 | didLoadDubProject: 初回でcoded/initDubTree通知 | E-02 (L923-931) | ○ |
| C-052 | didLoadDubProject: 2回目以降は通知なし | E-02 (L925-926: static loadedDub) | ○ |

### types.d 関連（C-053 〜 C-093）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-053 | parseRulers: 整数JsonValueがパースされる | E-04 (L174-175) | ○ |
| C-054 | parseRulers: オブジェクト形式パース | E-04 (L167-172) | ○ |
| C-055 | parseRulers: 空配列で空配列 | E-04 (L161: foreach, 空なら何も追加されない) | ○ |
| C-056 | parseRulers: 未知型スキップ | E-04 (L176-177: default break) | ○ |
| C-057 | stdlibPath: "auto"で自動検出 | E-04 (L202-206) | ○ |
| C-058 | stdlibPath: 具体的パスで直接返却 | E-04 (L205-206) | ○ |
| C-059 | stdlibPath: 配列でuserPath変換 | E-04 (L207) | ○ |
| C-060 | stdlibPath: nullで自動検出 | E-04 (L203) | ○ |
| C-061 | dcdClientPath: カスタムパス | E-04 (L211-213, L226-229) | ○ |
| C-062 | dcdClientPath: PATH存在でデフォルト | E-04 (L233-235) | ○ |
| C-063 | dcdServerPath: カスタムパス | E-04 (L216-218) | ○ |
| C-064 | detectDcdPath: outputFolder内検出 | E-04 (L243-258) | ○ |
| C-065 | detectDcdPath: outputFolder不在でデフォルト | E-04 (L260-264) | ○ |
| C-066 | startupError: 初回エラー保存 | E-04 (L278-293) | ○ |
| C-067 | startupError: ピリオド終端で追記 | E-04 (L284-286) | ○ |
| C-068 | startupError: 改行区切りで追記 | E-04 (L289-290) | ○ |
| C-069 | describeState: 状態記述 | E-04 (L301-317) | ○ |
| C-070 | Workspace.config: perWorkspaceから取得 | E-04 (L320-326) | ○ |
| C-071 | Workspace.config: useGlobalConfigでグローバル | E-04 (L323) | ○ |
| C-072 | workspaceIndex: URI一致のインデックス | E-04 (L356-374) | ○ |
| C-073 | workspaceIndex: 最長プレフィックス一致 | E-04 (L364-370) | ○ |
| C-074 | workspaceIndex: 一致なしでsize_t.max | E-04 (L360: best = size_t.max初期値) | ○ |
| C-075 | workspaceIndex: 非file://でException | E-04 (L358-359) | ○ |
| C-076 | workspaceIndex: disabled除外 | E-04 (L365: !workspace.disabled) | ○ |
| C-077 | workspace: URI一致でWorkspace返却 | E-04 (L415-425) | ○ |
| C-078 | workspace: 空URIでfallback | E-04 (L418-419) | ○ |
| C-079 | selectedWorkspace: selected==trueを返す | E-04 (L455-461) | ○ |
| C-080 | selectedWorkspace: selectedなしでfallback | E-04 (L460) | ○ |
| C-081 | hasWorkspace: URI存在でtrue | E-04 (L481-487) | ○ |
| C-082 | hasWorkspace: URI不在でfalse | E-04 (L486) | ○ |
| C-083 | anyConfig: workspaces非空で先頭返却 | E-04 (L497-499) | ○ |
| C-084 | anyConfig: workspaces空でfallback | E-04 (L497-498) | ○ |
| C-085 | userPath: チルダ展開 | E-04 (L502-505) | ○ |
| C-086 | userPath(Git): 非空で変換 | E-04 (L507-511) | ○ |
| C-087 | userPath(Git): 空で"git" | E-04 (L510) | ○ |
| C-088 | toInt: long→int変換 | E-04 (L513-516) | ○ |
| C-089 | seemsLikeDubJson: Dub JSONでtrue | E-04 (L522-537) | ○ |
| C-090 | seemsLikeDubJson: Node.jsでfalse | E-04 (L528-533) | ○ |
| C-091 | seemsLikeDubJson: name不在でfalse | E-04 (L534-535) | ○ |
| C-092 | seemsLikeDubJson: 非オブジェクトでfalse | E-04 (L524) | ○ |
| C-093 | seemsLikeDubJson: engines等でfalse | E-04 (L528-533) | ○ |

### backend/lazy_workspaced.d 関連（C-094 〜 C-118）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-094 | didCallAccess: 未アクセスでfalse | E-05 (L24-27) | ○ |
| C-095 | didCallAccess: アクセス済みでtrue | E-05 (L24-27) | ○ |
| C-096 | isPending: 存在でtrue | E-05 (L29-32) | ○ |
| C-097 | isPending: 不存在でfalse | E-05 (L29-32) | ○ |
| C-098 | onLazyLoad: ロード済みで即時実行 | E-05 (L34-38) | ○ |
| C-099 | onLazyLoad: 未ロードで登録 | E-05 (L40) | ○ |
| C-100 | onLazyLoadInstance: wasAccessed=trueで即時 | E-05 (L43-46) | ○ |
| C-101 | onLazyLoadInstance: wasAccessed=falseで登録 | E-05 (L47-48) | ○ |
| C-102 | onBeforeAccessComponent: 遅延ロード実行 | E-05 (L51-77) | ○ |
| C-103 | onBeforeAccessComponent: create失敗でonBindFail | E-05 (L71-73) | ○ |
| C-104 | checkHasComponent: 遅延含むtrue | E-05 (L91-93) | ○ |
| C-105 | checkHasComponent: ロード済みtrue | E-05 (L95) | ○ |
| C-106 | checkHasComponent: どちらにもなしfalse | E-05 (L80-96) | ○ |
| C-107 | attachLazy: 追加 | E-05 (L98-101) | ○ |
| C-108 | attachComponent: 移動とフック呼出し | E-05 (L117-130) | ○ |
| C-109 | accessCheck: 初回でwasAccessed=true/callbacks実行 | E-05 (L132-152) | ○ |
| C-110 | accessCheck: 2回目以降で何もしない | E-05 (L134: if !wasAccessed) | ○ |
| C-111 | accessCheck: 例外スロー | E-05 (L146-150) | ○ |
| C-112 | createInstance: LazyInstance生成 | E-05 (L166-174) | ○ |
| C-113 | autoRegisterComponents: LazyInstance向け遅延登録 | E-05 (L176-190) | ○ |
| C-114 | autoRegisterComponents: 通常Instance向けsuper呼出し | E-05 (L180-181) | ○ |
| C-115 | attach: LazyInstanceでattachLazy | E-05 (L223-239) | ○ |
| C-116 | attach: 該当なしでfalse | E-05 (L238) | ○ |
| C-117 | attachEager: super.attach呼出し | E-05 (L241-245) | ○ |
| C-118 | onRegisterComponent: グローバル登録と遅延登録 | E-05 (L192-221) | ○ |

### lsp/protoext.d 関連（C-119 〜 C-127）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-119 | toTextEdit: CodeReplacement→TextEdit変換 | E-06 (L342-351) | ○ |
| C-120 | toTextEdit: 挿入操作(range同一) | E-06 (L347-348) | ○ |
| C-121 | SymbolInformationEx.downcast | E-06 (L214-222) | ○ |
| C-122 | DocumentSymbolParamsEx(1引数) | E-06 (L161-164) | ○ |
| C-123 | DocumentSymbolParamsEx(2引数) | E-06 (L166-170) | ○ |
| C-124 | SingleValueParams: 構造体形式デシリアライズ | E-06 (L435-473, L500) | ○ |
| C-125 | SingleValueParams: 直接値形式デシリアライズ | E-06 (L483-484, L503) | ○ |
| C-126 | SingleValueParams: valueキー欠落エラー | E-06 (L475-478, L502) | ○ |
| C-127 | SingleValueParams: 型不一致エラー | E-06 (L504) | ○ |

### external/ldc/config.d 関連（C-128 〜 C-152）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-128 | Setting.name: 名前取得 | E-07 (L39-42) | ○ |
| C-129 | Setting.type: 型取得 | E-07 (L44-47) | ○ |
| C-130 | ScalarSetting.val: 値取得 | E-07 (L62-65) | ○ |
| C-131 | ArraySetting.vals: 配列値取得 | E-07 (L80-83) | ○ |
| C-132 | ArraySetting.isAppending: 追記フラグ | E-07 (L85-88) | ○ |
| C-133 | GroupSetting.children: 子要素取得 | E-07 (L102-105) | ○ |
| C-134 | Parser.parseValue: 空文字列パース | E-07 (L563) | ○ |
| C-135 | Parser.parseValue: エスケープシーケンス | E-07 (L564-565, L356-375) | ○ |
| C-136 | Parser.parseValue: 複数行連結 | E-07 (L566-567) | ○ |
| C-137 | Parser.parseValue: バックティック文字列 | E-07 (L568-569, L387-408) | ○ |
| C-138 | Parser.parseValue: Unicode | E-07 (L570) | ○ |
| C-139 | Parser.parseValue: 空配列 | E-07 (L582) | ○ |
| C-140 | Parser.parseValue: 1要素配列 | E-07 (L583) | ○ |
| C-141 | Parser.parseValue: 末尾カンマ | E-07 (L584) | ○ |
| C-142 | Parser.parseValue: 複数要素配列 | E-07 (L585) | ○ |
| C-143 | Parser.parseConfig: 複合設定パース | E-07 (L596-638) | ○ |
| C-144 | Parser.parseConfig: 追記代入 | E-07 (L609, L632-633) | ○ |
| C-145 | Parser.parseConfig: コメントスキップ | E-07 (L265-280) | ○ |
| C-146 | Parser.parseValue: 文字列内改行エラー | E-07 (L347-349) | ○ |
| C-147 | Parser.parseValue: 不正エスケープエラー | E-07 (L373) | ○ |
| C-148 | Parser.parseSetting: スカラーへの追記代入エラー | E-07 (L476-477) | ○ |
| C-149 | Parser.parseSetting: グループへの追記代入エラー | E-07 (L478-479) | ○ |
| C-150 | parseConfigFile: ファイルパース | E-07 (L111-123) | ○ |
| C-151 | parseConfigFile: BOMスキップ | E-07 (L118-119) | ○ |
| C-152 | parseConfigFile: 不存在ファイルエラー | E-07 (L115: readText) | ○ |

### info.d / crash_handler.d 関連（C-153 〜 C-163）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-153 | Version定数値 | E-03 (L3) | ○ |
| C-154 | VersionSuffix定数値 | E-03 (L4) | ○ |
| C-155 | registerErrorHandlers: シグナルハンドラ登録 | E-08 (L31-45) | △ |
| C-156 | onDidOpenDocument: always時リンティング | E-02 (L1117-1127) | ○ |
| C-157 | onDidOpenDocument: project時リンティング | E-02 (L1121-1122) | ○ |
| C-158 | onDidOpenDocument: never相当で無効 | E-02 (L1118-1122) | △ |
| C-159 | onDidCloseDocument: 外部ファイルdiagnosticsクリア | E-02 (L1133-1143) | ○ |
| C-160 | onDidCloseDocument: プロジェクトファイルdiagnostics保持 | E-02 (L1144-1145) | ○ |
| C-161 | onDidChangeDocument: D言語でdscanner/dfmt実行 | E-02 (L1149-1165) | ○ |
| C-162 | onDidChangeDocument: 非D言語でスキップ | E-02 (L1152-1153) | ○ |
| C-163 | onDidChangeDocument: 50KiB超でdelay=500 | E-02 (L1157) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-017（makeServerInfo）**: `version(unittest)` でブロックされるため、unittestビルドではテスト不可。非unittestビルドでのintegrationテストが必要。
  - 候補：統合テスト環境 / ビルド設定の分離 / モック化
- **C-041, C-042（determineOutputFolder）**: `version(linux)` / `version(OSX)` / `version(Windows)` による条件分岐のため、各プラットフォームでの実行が必要。
  - 候補：クロスプラットフォームCI / 環境変数モック / 条件付きテスト
- **C-155（registerErrorHandlers）**: `BacktraceHandler` の条件コンパイル(Linux/macOSのみ)であり、かつCランタイムの外部関数に依存。
  - 候補：プラットフォーム限定テスト / シグナルハンドラの間接テスト
- **C-158（onDidOpenDocument: never相当）**: "never"という値が明示的にコード内で処理されていない。"always"/"project"以外は全てfalseになるというロジックからの推論。
  - 候補：コード上のコメントか仕様書での確認

## 5) リスクフラグ（レビュー観点）
- **リスク2（高）**: C-017 - makeServerInfoはunittestビルドで明示的にassert(false)されるため、テスト方法に注意が必要
- **リスク1（中）**: C-041, C-042 - プラットフォーム依存コードのテストカバレッジ確保
- **リスク1（中）**: C-155 - 条件コンパイルによりMuslランタイム環境ではBacktraceHandlerが無効
- **リスク1（中）**: C-158 - "never"のリンティング無効化は暗黙的な分岐（else節なし）
- **リスク0（低）**: C-153, C-154 - 定数値の確認は低リスクだが、バージョンアップ時に追従が必要

## 6) レビュアーチェックリスト（最小）
- [ ] extension.d の changedConfig 内の設定パス分岐が全て網羅されているか（d.dubConfiguration, d.dubArchType等）
- [ ] LazyWorkspaceD のスレッドセーフティに関するテストケースが十分か（accessCheckのcast()による可変性など）
- [ ] プラットフォーム依存テスト（determineOutputFolder, registerErrorHandlers）のCI環境での実行可能性
- [ ] SingleValueParams の既存unittestとテストケースの整合性が取れているか
- [ ] external/ldc/config.d のParser既存unittestとテストケースの重複・不足がないか
- [ ] delayedProjectActivation内のManyProjectsAction分岐のテストケースが十分か（現在テストケースに含まれていない）
- [ ] forceLoadProjects関数のテストケースが欠けている点を確認（複雑なRPC依存のため）
- [ ] doGlobalStartupの各component登録のエラーハンドリングテストが不足している点を確認
