---
generated_at: 2026-02-22 12:00:00
metrics:
  claims_total: 168
  claims_with_evidence: 164
  claims_without_evidence: 4
confidence_derived: 0.98
---

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

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.98**
  - 根拠あり：164 / 168、根拠なし：4
- 優先レビュー（高）
  1. **C-017 (Task.current タスクコンテキスト内)**：MRB2TASKマクロの動作はコードから推測可能だが、実際のタスクコンテキスト内での呼び出しテストが既存テストに不足
  2. **C-093 (mrb_create_task top_self)**：top_self設定のテストは既存テストでカバーされていない
  3. **C-119 (mrb_task_proc_set 環境拡張)**：REnvのnlocals拡張ロジックの正確な挙動は複雑な内部状態に依存
  4. **C-162 (mrb_task構造体レイアウト)**：構造体の正確なメモリレイアウトはコンパイラ依存

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `mrbgems/mruby-task/src/task.c` - タスクスケジューラのメイン実装（全1574行）
- E-02: `mrbgems/mruby-task/include/task.h` - タスク構造体・定数・API宣言（143行）
- E-03: `mrbgems/mruby-task/include/task_hal.h` - HALインターフェース定義（163行）
- E-04: `mrbgems/mruby-task/test/task.rb` - 既存テストコード（186行）
- E-05: `mrbgems/mruby-task/mrbgem.rake` - gem定義・ビルド設定（36行）

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

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | Task.new: ブロック付きでタスクが正常に生成される | E-01 (L657-728), E-04 (L33-35) | ○ |
| C-002 | Task.new: nameキーワード引数でタスク名が設定される | E-01 (L678-684), E-04 (L38-41) | ○ |
| C-003 | Task.new: priorityキーワード引数で優先度が設定される | E-01 (L685-694), E-04 (L43-46) | ○ |
| C-004 | Task.new: name・priority両方を指定して生成可能 | E-01 (L662-694) | ○ |
| C-005 | Task.new: デフォルトpriority=128 | E-01 (L661) | ○ |
| C-006 | Task.new: ブロックなしでArgumentError | E-01 (L671-673), E-04 (L48-50) | ○ |
| C-007 | Task.new: nameに文字列以外でTypeError | E-01 (L680-682) | ○ |
| C-008 | Task.new: priorityに整数以外でTypeError | E-01 (L687-689) | ○ |
| C-009 | Task.new: priority=0で生成可能 | E-01 (L691) | ○ |
| C-010 | Task.new: priority=255で生成可能 | E-01 (L691) | ○ |
| C-011 | Task.new: priority=-1でArgumentError | E-01 (L691-693) | ○ |
| C-012 | Task.new: priority=256でArgumentError | E-01 (L691-693) | ○ |
| C-013 | Task.new: 高優先度タスクでコンテキストスイッチ | E-01 (L721-725) | ○ |
| C-014 | Task.new: GC登録される | E-01 (L710) | ○ |
| C-015 | Task.current: ルートコンテキストでメインタスク返却 | E-01 (L731-756), E-04 (L98-102) | ○ |
| C-016 | Task.current: メインタスク遅延初期化 | E-01 (L736-754) | ○ |
| C-017 | Task.current: タスクコンテキスト内でMRB2TASKで取得 | E-01 (L758-760) | △ |
| C-018 | Task.current: 2回呼び出しで同一オブジェクト | E-01 (L736, L755) | ○ |
| C-019 | Task.list: 全キューのタスクが返却される | E-01 (L764-778) | ○ |
| C-020 | Task.list: タスクなしで空配列 | E-01 (L766) | ○ |
| C-021 | Task.pass: ルートコンテキストでタスク実行 | E-01 (L804-808), E-04 (L106-108) | ○ |
| C-022 | Task.pass: タスクコンテキストでコンテキストスイッチ | E-01 (L819-821) | ○ |
| C-023 | Task.pass: C関数境界でRuntimeError | E-01 (L812-816) | ○ |
| C-024 | Task.pass: readyキュー空でnil | E-01 (L788-791) | ○ |
| C-025 | Task.stat: Hash形式で統計情報返却 | E-01 (L850-869), E-04 (L112-115) | ○ |
| C-026 | Task.stat: 各キューにcount/tasksを含む | E-01 (L828-847), E-04 (L129-139) | ○ |
| C-027 | Task.stat: タスク追加でready count増加 | E-04 (L141-152) | ○ |
| C-028 | Task.get: 名前でタスク検索 | E-01 (L878-896) | ○ |
| C-029 | Task.get: 存在しない名前でnil | E-01 (L895) | ○ |
| C-030 | Task.run: 全タスク完了までスケジューラ動作 | E-01 (L452-494) | ○ |
| C-031 | Task.run: 空キューで即終了 | E-01 (L461-468) | ○ |
| C-032 | Task.run: waitingタスク存在時にidle | E-01 (L470-471) | ○ |
| C-033 | Task.run: 実行後にインクリメンタルGC | E-01 (L488-490) | ○ |
| C-034 | Task.tick: tick値をミリ秒で返却 | E-01 (L1223-1226) | ○ |
| C-035 | Task#status: READYで:READY返却 | E-01 (L903-917), E-04 (L60-63) | ○ |
| C-036 | Task#status: RUNNINGで:RUNNING返却 | E-01 (L911) | ○ |
| C-037 | Task#status: WAITINGで:WAITING返却 | E-01 (L913) | ○ |
| C-038 | Task#status: SUSPENDEDで:SUSPENDED返却 | E-01 (L914) | ○ |
| C-039 | Task#status: DORMANTで:DORMANT返却 | E-01 (L915) | ○ |
| C-040 | Task#status: 無効タスクでArgumentError | E-01 (L40-46) | ○ |
| C-041 | Task#inspect: 名前付きタスクのフォーマット | E-01 (L920-970), E-04 (L65-71) | ○ |
| C-042 | Task#inspect: 名前なしで(unnamed)表示 | E-01 (L959) | ○ |
| C-043 | Task#inspect: 各ステータスの文字列表現 | E-01 (L930-949), E-04 (L73-77) | ○ |
| C-044 | Task#name: 設定された名前を返却 | E-01 (L972-985), E-04 (L168-171) | ○ |
| C-045 | Task#name: 未設定時に(noname)返却 | E-01 (L980-981), E-04 (L173-176) | ○ |
| C-046 | Task#name=: タスク名変更 | E-01 (L988-999) | ○ |
| C-047 | Task#priority: 優先度返却 | E-01 (L1001-1009), E-04 (L156-164) | ○ |
| C-048 | Task#priority=: 優先度変更と再ソート | E-01 (L1012-1036) | ○ |
| C-049 | Task#priority=: priority=0に変更可能 | E-01 (L1021) | ○ |
| C-050 | Task#priority=: priority=255に変更可能 | E-01 (L1021) | ○ |
| C-051 | Task#priority=: priority=-1でArgumentError | E-01 (L1021-1023) | ○ |
| C-052 | Task#priority=: priority=256でArgumentError | E-01 (L1021-1023) | ○ |
| C-053 | Task#suspend: READYからSUSPENDED | E-01 (L1046-1055, L1294-1316), E-04 (L81-84) | ○ |
| C-054 | Task#suspend: RUNNINGでコンテキストスイッチ | E-01 (L1309-1314) | ○ |
| C-055 | Task#suspend: WAITINGからSUSPENDED | E-01 (L1296-1301) | ○ |
| C-056 | Task#suspend: 既にSUSPENDEDで変化なし | E-01 (L1302) | ○ |
| C-057 | Task#suspend: スケジューラロックでRuntimeError | E-01 (L1051, L55-61) | ○ |
| C-058 | Task#resume: SUSPENDEDからREADY | E-01 (L1058-1067, L1336-1360), E-04 (L86-89) | ○ |
| C-059 | Task#resume: SUSPENDED+SLEEPでWAITINGに遷移 | E-01 (L1341-1342, L1355-1358) | ○ |
| C-060 | Task#resume: SUSPENDED以外で変化なし | E-01 (L1338) | ○ |
| C-061 | Task#resume: 高優先度タスクでコンテキストスイッチ | E-01 (L1347-1352) | ○ |
| C-062 | Task#resume: スケジューラロックでRuntimeError | E-01 (L1063, L55-61) | ○ |
| C-063 | Task#terminate: DORMANTに遷移しSTOPPED | E-01 (L1070-1079, L1380-1397), E-04 (L91-94) | ○ |
| C-064 | Task#terminate: join待ちタスクを起床 | E-01 (L1391) | ○ |
| C-065 | Task#terminate: 既にDORMANTで変化なし | E-01 (L1382) | ○ |
| C-066 | Task#terminate: スケジューラロックでRuntimeError | E-01 (L1075, L55-61) | ○ |
| C-067 | Task#join: 完了後に結果返却 | E-01 (L1082-1117) | ○ |
| C-068 | Task#join: DORMANT時に即座に結果返却 | E-01 (L1100-1101) | ○ |
| C-069 | Task#join: 待ち中にWAITINGに遷移 | E-01 (L1105-1111) | ○ |
| C-070 | Task#join: 自己joinでArgumentError | E-01 (L1095-1097) | ○ |
| C-071 | Task#join: ルートコンテキストでRuntimeError | E-01 (L1089-1091) | ○ |
| C-072 | sleep: 正の秒数でスリープ実行 | E-01 (L591-618) | ○ |
| C-073 | sleep: 引数なしでSUSPENDED | E-01 (L596-608) | ○ |
| C-074 | sleep: ルートコンテキストでHALスリープ | E-01 (L538-544) | ○ |
| C-075 | sleep: 負の値でArgumentError | E-01 (L610-612), E-04 (L14-16) | ○ |
| C-076 | sleep: sec=0で即リターン | E-01 (L614-615), E-04 (L4-6) | ○ |
| C-077 | sleep_ms: ミリ秒スリープ | E-01 (L621-634) | ○ |
| C-078 | sleep_ms: 負の値でArgumentError | E-01 (L627-629) | ○ |
| C-079 | usleep: マイクロ秒スリープ | E-01 (L637-650), E-04 (L23-25) | ○ |
| C-080 | usleep: usec値が返却される | E-01 (L649) | ○ |
| C-081 | usleep: 負の値でArgumentError | E-01 (L643-645), E-04 (L27-29) | ○ |
| C-082 | mrb_tick: tick_インクリメント | E-01 (L410) | ○ |
| C-083 | mrb_tick: timesliceデクリメント | E-01 (L414-416) | ○ |
| C-084 | mrb_tick: timeslice=0でスイッチ | E-01 (L416-418) | ○ |
| C-085 | mrb_tick: wakeup_tick到達で起床 | E-01 (L430-438) | ○ |
| C-086 | mrb_tick: wakeup_tick未達で起床しない | E-01 (L431) | ○ |
| C-087 | mrb_tick: 次のwakeup_tick更新 | E-01 (L439-440, L447) | ○ |
| C-088 | mrb_task_run_once: 1タスク実行 | E-01 (L497-526) | ○ |
| C-089 | mrb_task_run_once: 空キューでnil | E-01 (L502-504) | ○ |
| C-090 | mrb_task_run_once: 停止タスクスキップ | E-01 (L507-509) | ○ |
| C-091 | mrb_create_task: C APIからタスク生成 | E-01 (L1232-1288) | ○ |
| C-092 | mrb_create_task: priority nil時にデフォルト128 | E-01 (L1238-1239) | ○ |
| C-093 | mrb_create_task: top_self設定 | E-01 (L1271-1273) | △ |
| C-094 | mrb_create_task: priority範囲外でエラー | E-01 (L1244-1246) | ○ |
| C-095 | mrb_create_task: スケジューラロックでエラー | E-01 (L1235) | ○ |
| C-096 | mrb_execute_proc_synchronously: 同期実行 | E-01 (L1129-1217) | ○ |
| C-097 | mrb_execute_proc_synchronously: ロック管理 | E-01 (L1144-1147, L1211) | ○ |
| C-098 | mrb_execute_proc_synchronously: コンテキスト復元 | E-01 (L1210) | ○ |
| C-099 | mrb_execute_proc_synchronously: リソース解放 | E-01 (L1196-1207) | ○ |
| C-100 | mrb_execute_proc_synchronously: ロックオーバーフロー | E-01 (L1144-1146) | ○ |
| C-101 | mrb_execute_proc_synchronously: 例外ハンドリング | E-01 (L1180-1188) | ○ |
| C-102 | mrb_suspend_task: C APIから一時停止 | E-01 (L1321-1330) | ○ |
| C-103 | mrb_suspend_task: 無効ポインタで安全 | E-01 (L1327) | ○ |
| C-104 | mrb_resume_task: C APIから再開 | E-01 (L1365-1374) | ○ |
| C-105 | mrb_resume_task: 無効ポインタで安全 | E-01 (L1371) | ○ |
| C-106 | mrb_terminate_task: C APIから終了 | E-01 (L1402-1411) | ○ |
| C-107 | mrb_terminate_task: 無効ポインタで安全 | E-01 (L1408) | ○ |
| C-108 | mrb_stop_task: STOPPED設定でtrue | E-01 (L1417-1429) | ○ |
| C-109 | mrb_stop_task: 既STOPPED時にfalse | E-01 (L1424-1426) | ○ |
| C-110 | mrb_stop_task: 無効ポインタでfalse | E-01 (L1422) | ○ |
| C-111 | mrb_task_value: 結果値返却 | E-01 (L1434-1441) | ○ |
| C-112 | mrb_task_value: 無効ポインタでnil | E-01 (L1438) | ○ |
| C-113 | mrb_task_init_context: 再初期化 | E-01 (L1446-1468) | ○ |
| C-114 | mrb_task_init_context: 既存メモリ解放 | E-01 (L1457-1464) | ○ |
| C-115 | mrb_task_init_context: スケジューラロック | E-01 (L1449) | ○ |
| C-116 | mrb_task_reset_context: 初期状態リセット | E-01 (L1473-1487) | ○ |
| C-117 | mrb_task_reset_context: スケジューラロック | E-01 (L1476) | ○ |
| C-118 | mrb_task_proc_set: proc更新 | E-01 (L1492-1511) | ○ |
| C-119 | mrb_task_proc_set: 環境nlocals拡張 | E-01 (L1501-1506) | △ |
| C-120 | mrb_task_proc_set: スケジューラロック | E-01 (L1495) | ○ |
| C-121 | mrb_task_free: メモリ解放 | E-01 (L67-88) | ○ |
| C-122 | mrb_task_free: メインタスク以外でGC解除 | E-01 (L72-74) | ○ |
| C-123 | mrb_task_free: NULLで安全リターン | E-01 (L70) | ○ |
| C-124 | mrb_task_mark_all: 全タスクGCマーク | E-01 (L98-149) | ○ |
| C-125 | mrb_task_mark_all: DORMANTのresultマーク | E-01 (L141-143) | ○ |
| C-126 | mrb_task_mark_all: 空キューで安全 | E-01 (L104) | ○ |
| C-127 | q_insert_task: 優先度順挿入 | E-01 (L176-196) | ○ |
| C-128 | q_insert_task: 最高優先度で先頭挿入 | E-01 (L183, L190-191) | ○ |
| C-129 | q_insert_task: 同一優先度FIFO | E-01 (L183) | ○ |
| C-130 | q_insert_task: 空キュー挿入 | E-01 (L190-191) | ○ |
| C-131 | q_delete_task: 先頭削除 | E-01 (L199-221) | ○ |
| C-132 | q_delete_task: 中間削除 | E-01 (L213) | ○ |
| C-133 | q_delete_task: 末尾削除 | E-01 (L213) | ○ |
| C-134 | q_delete_task: 存在しないタスク削除で安全 | E-01 (L207-220) | ○ |
| C-135 | q_get_queue: 各ステータス対応キュー | E-01 (L157-172) | ○ |
| C-136 | q_get_queue: RUNNING=readyキュー | E-01 (L163) | ○ |
| C-137 | task_alloc: ゼロクリア割り当て | E-01 (L247-252) | ○ |
| C-138 | task_init_context: VMスタック初期化 | E-01 (L256-282) | ○ |
| C-139 | task_init_context: callinfoスタック初期化 | E-01 (L284-296) | ○ |
| C-140 | task_init_context: nregsに応じたスタック拡張 | E-01 (L265-267) | ○ |
| C-141 | task_init_context: status=MRB_TASK_CREATED | E-01 (L298) | ○ |
| C-142 | execute_task: タスク実行とコンテキスト復元 | E-01 (L338-401) | ○ |
| C-143 | execute_task: 完了時DORMANT遷移とjoin起床 | E-01 (L386-396) | ○ |
| C-144 | execute_task: yield時READY遷移 | E-01 (L397-400) | ○ |
| C-145 | execute_task: proc=NULLでRuntimeError | E-01 (L363-365) | ○ |
| C-146 | sleep_us_impl: WAITING遷移 | E-01 (L533-582) | ○ |
| C-147 | sleep_us_impl: ルートコンテキストHAL sleep | E-01 (L538-544) | ○ |
| C-148 | sleep_us_impl: C関数境界フォールバック | E-01 (L547-555) | ○ |
| C-149 | sleep_us_impl: wakeup_tick_更新 | E-01 (L572-574) | ○ |
| C-150 | wake_up_join_waiters: join待ちREADY遷移 | E-01 (L306-323) | ○ |
| C-151 | wake_up_join_waiters: 複数join待ち起床 | E-01 (L310-322) | ○ |
| C-152 | wake_up_join_waiters: join待ちなしで安全 | E-01 (L310) | ○ |
| C-153 | task_change_state: IRQ保護下で状態変更 | E-01 (L327-334) | ○ |
| C-154 | task_cleanup_if_stopped: STOPPED→DORMANT移動 | E-01 (L224-239) | ○ |
| C-155 | task_cleanup_if_stopped: 正常タスクFALSE | E-01 (L238) | ○ |
| C-156 | gem_init: クラス・メソッド登録 | E-01 (L1517-1561) | ○ |
| C-157 | gem_init: Kernelメソッド登録 | E-01 (L1558-1560) | ○ |
| C-158 | gem_init: HAL初期化呼び出し | E-01 (L1523) | ○ |
| C-159 | gem_final: メインタスクGC解除 | E-01 (L1564-1573) | ○ |
| C-160 | gem_final: HAL終了呼び出し | E-01 (L1572) | ○ |
| C-161 | gem_final: main_task NULL時安全 | E-01 (L1567) | ○ |
| C-162 | mrb_task構造体レイアウト | E-02 (L44-67) | △ |
| C-163 | MRB_TICK_UNIT=4 | E-02 (L83-84), E-03 (L21-22) | ○ |
| C-164 | MRB_TIMESLICE_TICK_COUNT=3 | E-02 (L87-88), E-03 (L25-26) | ○ |
| C-165 | TASK_STACK_INIT_SIZE=64 | E-02 (L90) | ○ |
| C-166 | TASK_CI_INIT_SIZE=4 | E-02 (L91) | ○ |
| C-167 | ステータス値の正確性 | E-02 (L15-21) | ○ |
| C-168 | 理由値の正確性 | E-02 (L26-31) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-017**: `MRB2TASK`マクロはポインタ算術でタスクを取得するが、実行中のタスクコンテキスト内での実際の動作テストが既存テスト(E-04)に見当たらない。ソースコード(E-01 L37, L758-760)からロジックは明確だが、実行時の検証根拠が不足。
  - 候補：タスク実行中テスト / 統合テスト / 実行ログ
- **C-093**: `mrb_create_task`の`top_self`パラメータの設定動作は、コード(E-01 L1271-1273)で確認可能だが、呼び出し元(mrc_utils.c等)のテストが本モジュール範囲外。
  - 候補：mrc_utils.c のテスト / 統合テスト
- **C-119**: `mrb_task_proc_set`のREnv nlocals拡張ロジックは、REnvの内部状態に強く依存しており、単体での検証が困難。
  - 候補：REnv内部状態のモック / 統合テスト
- **C-162**: `mrb_task`構造体のメモリレイアウトはコンパイラ・プラットフォーム依存であり、`offsetof`での検証が必要。
  - 候補：コンパイル時staticアサート / プラットフォームテスト

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**: C-163〜C-168（定数値確認）- コンパイル時に決定される値であり、変更される可能性は低い
- **0（低リスク）**: C-041〜C-043（inspect表示）- デバッグ用表示であり、ビジネスロジックに影響しない
- **1（中リスク）**: C-017, C-093（タスクコンテキスト・top_self）- 実行時コンテキストに依存する動作であり、テスト環境の構築が必要
- **1（中リスク）**: C-119（環境拡張）- REnv内部状態に依存する複雑なロジック
- **1（中リスク）**: C-162（構造体レイアウト）- プラットフォーム依存の可能性
- **2（高リスク）**: 該当なし

## 6) レビュアーチェックリスト（最小）
- [ ] Task.new の引数バリデーション（C-006〜C-012）が仕様と一致するか確認
- [ ] Task#priority= の優先度変更後のキュー再ソート動作（C-048）が正しいか確認
- [ ] Task#join の待ち合わせロジック（C-067〜C-071）にデッドロックの可能性がないか確認
- [ ] sleep/usleep のC関数境界フォールバック（C-148）が正しい判定を行っているか確認
- [ ] mrb_execute_proc_synchronously のロック管理と例外ハンドリング（C-096〜C-101）でリソースリークがないか確認
- [ ] mrb_task_free のメモリ解放順序（C-121〜C-123）でダブルフリーが発生しないか確認
- [ ] GCマーキング（C-124〜C-126）で全ての参照可能なオブジェクトがマークされているか確認
- [ ] q_insert_task/q_delete_task のIRQ保護が一貫して適用されているか確認
