481 lines
14 KiB
Markdown
481 lines
14 KiB
Markdown
|
|
# 残課題の詳細説明と推奨対応
|
|||
|
|
|
|||
|
|
## 📅 作成日時
|
|||
|
|
2026年2月4日
|
|||
|
|
|
|||
|
|
## 🎯 対象バージョン
|
|||
|
|
v1.0.11+22
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 残課題一覧
|
|||
|
|
|
|||
|
|
### 🟡 優先度: 中(次期バージョン推奨)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. Matrix4 deprecated API の移行
|
|||
|
|
|
|||
|
|
### 📍 場所
|
|||
|
|
- [lib/screens/placeholders/brewery_map_screen.dart:122-123](lib/screens/placeholders/brewery_map_screen.dart#L122-L123)
|
|||
|
|
- [lib/screens/placeholders/brewery_map_screen.dart:159-160](lib/screens/placeholders/brewery_map_screen.dart#L159-L160)
|
|||
|
|
|
|||
|
|
### 🔍 問題の内容
|
|||
|
|
|
|||
|
|
**現在のコード**:
|
|||
|
|
```dart
|
|||
|
|
// Line 121-123: 初期表示時のマップ配置
|
|||
|
|
final matrix = Matrix4.identity()
|
|||
|
|
..translate(xOffset, 10.0) // ❌ deprecated
|
|||
|
|
..scale(fitScale); // ❌ deprecated
|
|||
|
|
|
|||
|
|
// Line 158-160: リセットボタン押下時のマップ配置
|
|||
|
|
final matrix = Matrix4.identity()
|
|||
|
|
..translate(xOffset, 10.0) // ❌ deprecated
|
|||
|
|
..scale(fitScale); // ❌ deprecated
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**何が問題か**:
|
|||
|
|
- `Matrix4.translate()` と `Matrix4.scale()` が Flutter 3.38.3 で deprecated(非推奨)になった
|
|||
|
|
- 将来のFlutterバージョンでは削除される可能性がある
|
|||
|
|
- 現在は動作するが、flutter analyze で警告が出る
|
|||
|
|
|
|||
|
|
**影響範囲**:
|
|||
|
|
- 酒蔵マップ画面(日本地図)の拡大縮小・移動機能
|
|||
|
|
- リセットボタン(左下の回転アイコン)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### ✅ 推奨する修正方法
|
|||
|
|
|
|||
|
|
#### Step 1: vector_math パッケージのインポート確認
|
|||
|
|
|
|||
|
|
**pubspec.yaml を確認**:
|
|||
|
|
```yaml
|
|||
|
|
dependencies:
|
|||
|
|
vector_math: ^2.1.4 # 既に含まれている可能性が高い
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
もし含まれていなければ:
|
|||
|
|
```bash
|
|||
|
|
flutter pub add vector_math
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Step 2: brewery_map_screen.dart の冒頭に import 追加
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
import 'package:vector_math/vector_math_64.dart'; // Vector3 のため
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Step 3: 2箇所のコードを修正
|
|||
|
|
|
|||
|
|
**修正箇所1: Line 121-123**
|
|||
|
|
```dart
|
|||
|
|
// Before (DEPRECATED):
|
|||
|
|
final matrix = Matrix4.identity()
|
|||
|
|
..translate(xOffset, 10.0)
|
|||
|
|
..scale(fitScale);
|
|||
|
|
|
|||
|
|
// After (FIXED):
|
|||
|
|
final matrix = Matrix4.identity()
|
|||
|
|
..translateByVector3(Vector3(xOffset, 10.0, 0.0))
|
|||
|
|
..scaleByDouble(fitScale);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**修正箇所2: Line 158-160**
|
|||
|
|
```dart
|
|||
|
|
// Before (DEPRECATED):
|
|||
|
|
final matrix = Matrix4.identity()
|
|||
|
|
..translate(xOffset, 10.0)
|
|||
|
|
..scale(fitScale);
|
|||
|
|
|
|||
|
|
// After (FIXED):
|
|||
|
|
final matrix = Matrix4.identity()
|
|||
|
|
..translateByVector3(Vector3(xOffset, 10.0, 0.0))
|
|||
|
|
..scaleByDouble(fitScale);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 🧪 実機テスト項目(必須)
|
|||
|
|
|
|||
|
|
修正後、以下を必ず実機で確認してください:
|
|||
|
|
|
|||
|
|
1. **マップ画面を開く**
|
|||
|
|
- [ ] 日本地図が正しく表示される
|
|||
|
|
- [ ] 初期表示時の位置・サイズが正常
|
|||
|
|
|
|||
|
|
2. **ピンチイン/ピンチアウト(拡大縮小)**
|
|||
|
|
- [ ] 2本指でピンチイン(縮小)が滑らかに動作
|
|||
|
|
- [ ] 2本指でピンチアウト(拡大)が滑らかに動作
|
|||
|
|
- [ ] 最小サイズ・最大サイズの制限が機能している
|
|||
|
|
|
|||
|
|
3. **ドラッグ移動**
|
|||
|
|
- [ ] 1本指でマップをドラッグできる
|
|||
|
|
- [ ] 移動範囲が適切(マップが画面外に消えない)
|
|||
|
|
|
|||
|
|
4. **リセットボタン**
|
|||
|
|
- [ ] 左下の回転アイコンをタップ
|
|||
|
|
- [ ] マップが初期位置・サイズに戻る
|
|||
|
|
- [ ] アニメーションが滑らかに表示される
|
|||
|
|
|
|||
|
|
5. **都道府県タップ**
|
|||
|
|
- [ ] 都道府県をタップするとモーダルが表示される
|
|||
|
|
- [ ] タップ判定が正常
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### ⚠️ リスク評価
|
|||
|
|
|
|||
|
|
- **リスクレベル**: 🔴 高
|
|||
|
|
- **理由**: 3D変換行列の操作のため、視覚的なバグが発生しやすい
|
|||
|
|
- **対策**: 実機テスト必須(エミュレータだけでは不十分)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 📝 完全な修正コード例
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
import 'package:flutter/material.dart';
|
|||
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
|
|
import 'package:lucide_icons/lucide_icons.dart';
|
|||
|
|
import 'package:vector_math/vector_math_64.dart'; // 追加
|
|||
|
|
import 'dart:io'; // File
|
|||
|
|
import '../../providers/sake_list_provider.dart';
|
|||
|
|
import '../../screens/sake_detail_screen.dart'; // Detail Screen
|
|||
|
|
import '../../widgets/map/prefecture_tile_map.dart';
|
|||
|
|
import '../../theme/app_colors.dart';
|
|||
|
|
import '../../models/maps/japan_map_data.dart';
|
|||
|
|
import '../../providers/ui_experiment_provider.dart';
|
|||
|
|
import '../../models/schema/item_type.dart'; // Phase D4: For ItemType.sake filtering
|
|||
|
|
|
|||
|
|
// ... (他のコードは省略) ...
|
|||
|
|
|
|||
|
|
// Line 117-127 を修正:
|
|||
|
|
if (!_isMapInitialized) {
|
|||
|
|
// Center horizontally
|
|||
|
|
final xOffset = (availableWidth - (mapWidth * fitScale)) / 2;
|
|||
|
|
|
|||
|
|
final matrix = Matrix4.identity()
|
|||
|
|
..translateByVector3(Vector3(xOffset, 10.0, 0.0)) // ✅ FIXED
|
|||
|
|
..scaleByDouble(fitScale); // ✅ FIXED
|
|||
|
|
|
|||
|
|
_transformationController.value = matrix;
|
|||
|
|
_isMapInitialized = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ... (中略) ...
|
|||
|
|
|
|||
|
|
// Line 155-162 を修正:
|
|||
|
|
FloatingActionButton.small(
|
|||
|
|
heroTag: 'map_reset',
|
|||
|
|
backgroundColor: appColors.surfaceElevated,
|
|||
|
|
foregroundColor: appColors.brandPrimary,
|
|||
|
|
elevation: 2,
|
|||
|
|
onPressed: () {
|
|||
|
|
// Reset to initial state (Fit Width)
|
|||
|
|
final xOffset = (availableWidth - (mapWidth * fitScale)) / 2;
|
|||
|
|
final matrix = Matrix4.identity()
|
|||
|
|
..translateByVector3(Vector3(xOffset, 10.0, 0.0)) // ✅ FIXED
|
|||
|
|
..scaleByDouble(fitScale); // ✅ FIXED
|
|||
|
|
_transformationController.value = matrix;
|
|||
|
|
},
|
|||
|
|
child: const Icon(LucideIcons.rotateCcw, size: 20),
|
|||
|
|
),
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. ExpansionTileController deprecated の移行
|
|||
|
|
|
|||
|
|
### 📍 場所
|
|||
|
|
- [lib/widgets/sake_detail/sake_detail_specs.dart:24](lib/widgets/sake_detail/sake_detail_specs.dart#L24)
|
|||
|
|
- [lib/widgets/sake_detail/sake_detail_specs.dart:166](lib/widgets/sake_detail/sake_detail_specs.dart#L166)
|
|||
|
|
- [lib/widgets/sake_detail/sake_detail_specs.dart:199](lib/widgets/sake_detail/sake_detail_specs.dart#L199)
|
|||
|
|
|
|||
|
|
### 🔍 問題の内容
|
|||
|
|
|
|||
|
|
**現在のコード**:
|
|||
|
|
```dart
|
|||
|
|
// Line 24: コントローラーの宣言
|
|||
|
|
final ExpansionTileController _expansionController = ExpansionTileController(); // ❌ deprecated
|
|||
|
|
|
|||
|
|
// Line 166: ExpansionTile での使用
|
|||
|
|
ExpansionTile(
|
|||
|
|
controller: _expansionController, // ❌ deprecated
|
|||
|
|
// ...
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// Line 199: 編集モード時の展開
|
|||
|
|
_expansionController.expand(); // ❌ deprecated
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**何が問題か**:
|
|||
|
|
- `ExpansionTileController` が Flutter 3.31.0 で deprecated になった
|
|||
|
|
- 新しいAPIは `ExpansibleController`
|
|||
|
|
- 現在は動作するが、flutter analyze で警告が出る
|
|||
|
|
|
|||
|
|
**影響範囲**:
|
|||
|
|
- 酒詳細画面の「詳細」セクション(AI解析情報)
|
|||
|
|
- 展開/折りたたみ動作
|
|||
|
|
- 編集ボタン押下時の自動展開
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### ✅ 推奨する修正方法
|
|||
|
|
|
|||
|
|
#### Step 1: コントローラーの型を変更
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
// Before (Line 24):
|
|||
|
|
final ExpansionTileController _expansionController = ExpansionTileController();
|
|||
|
|
|
|||
|
|
// After:
|
|||
|
|
final ExpansibleController _expansionController = ExpansibleController();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Step 2: 使用箇所は変更不要
|
|||
|
|
|
|||
|
|
`ExpansionTile` の `controller` パラメータと `.expand()` メソッドは、
|
|||
|
|
`ExpansibleController` でも同じ名前で使えるため、**他の箇所は変更不要**です。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 🧪 実機テスト項目(必須)
|
|||
|
|
|
|||
|
|
修正後、以下を必ず実機で確認してください:
|
|||
|
|
|
|||
|
|
1. **酒詳細画面を開く**
|
|||
|
|
- [ ] 「詳細」セクションが表示される
|
|||
|
|
- [ ] 初期状態では折りたたまれている
|
|||
|
|
|
|||
|
|
2. **手動での展開/折りたたみ**
|
|||
|
|
- [ ] 「詳細」行をタップして展開
|
|||
|
|
- [ ] もう一度タップして折りたたみ
|
|||
|
|
- [ ] アニメーションが滑らかに表示される
|
|||
|
|
|
|||
|
|
3. **編集ボタンでの自動展開**
|
|||
|
|
- [ ] 右側の編集アイコン(鉛筆マーク)をタップ
|
|||
|
|
- [ ] 「詳細」セクションが自動的に展開される
|
|||
|
|
- [ ] 編集モードに切り替わる(テキストフィールドが表示される)
|
|||
|
|
|
|||
|
|
4. **編集モードでの動作**
|
|||
|
|
- [ ] 特定名称、精米歩合などを編集できる
|
|||
|
|
- [ ] 「保存」ボタンで保存できる
|
|||
|
|
- [ ] 「キャンセル」ボタンで元に戻る
|
|||
|
|
|
|||
|
|
5. **セット商品での非表示**
|
|||
|
|
- [ ] セット商品の詳細画面では「詳細」セクションが表示されない
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### ⚠️ リスク評価
|
|||
|
|
|
|||
|
|
- **リスクレベル**: 🟡 中
|
|||
|
|
- **理由**: UIの展開/折りたたみ動作のみ、データ変更なし
|
|||
|
|
- **対策**: 実機テストで動作確認
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 📝 完全な修正コード
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
import 'package:flutter/material.dart';
|
|||
|
|
import 'package:flutter/cupertino.dart';
|
|||
|
|
import 'package:lucide_icons/lucide_icons.dart';
|
|||
|
|
import '../../models/sake_item.dart';
|
|||
|
|
import '../../theme/app_colors.dart';
|
|||
|
|
import 'package:hive_flutter/hive_flutter.dart';
|
|||
|
|
|
|||
|
|
class SakeDetailSpecs extends StatefulWidget {
|
|||
|
|
final SakeItem sake;
|
|||
|
|
final ValueChanged<SakeItem> onUpdate;
|
|||
|
|
|
|||
|
|
const SakeDetailSpecs({
|
|||
|
|
super.key,
|
|||
|
|
required this.sake,
|
|||
|
|
required this.onUpdate,
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
@override
|
|||
|
|
State<SakeDetailSpecs> createState() => _SakeDetailSpecsState();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
class _SakeDetailSpecsState extends State<SakeDetailSpecs> {
|
|||
|
|
bool _isEditing = false;
|
|||
|
|
final ExpansibleController _expansionController = ExpansibleController(); // ✅ FIXED
|
|||
|
|
|
|||
|
|
// ... (他のコードは変更なし) ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. rawSakeListItemsProvider にコメント追加
|
|||
|
|
|
|||
|
|
### 📍 場所
|
|||
|
|
- [lib/screens/dev_menu_screen.dart:189](lib/screens/dev_menu_screen.dart#L189)
|
|||
|
|
|
|||
|
|
### 🔍 問題の内容
|
|||
|
|
|
|||
|
|
**現在のコード**:
|
|||
|
|
```dart
|
|||
|
|
// Line 189:
|
|||
|
|
final allItems = ref.read(rawSakeListItemsProvider).asData?.value ?? [];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**何が問題か**:
|
|||
|
|
- `rawSakeListItemsProvider` は Phase D6 で「空状態判定専用」として設計された
|
|||
|
|
- しかし、Dev Menu(開発者メニュー)では「全データ解析」に使用されている
|
|||
|
|
- コメントがないため、なぜ `rawSakeListItemsProvider` を使っているのか不明確
|
|||
|
|
- 将来的に誤って `allSakeItemsProvider` に変更されるリスクがある
|
|||
|
|
|
|||
|
|
**影響範囲**:
|
|||
|
|
- Dev Menu の「データ修復(再解析)」機能
|
|||
|
|
- セット商品・Draft を含む全データの統計情報
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### ✅ 推奨する修正方法
|
|||
|
|
|
|||
|
|
#### 判断基準
|
|||
|
|
|
|||
|
|
**Option A: コメント追加(推奨)**
|
|||
|
|
|
|||
|
|
Dev Menu で**セット商品・Draft を含む全データ**の統計が必要な場合:
|
|||
|
|
```dart
|
|||
|
|
// Dev Menu: セット商品・Draft含む全データを解析するため rawSakeListItemsProvider を使用
|
|||
|
|
// Phase D6設計: rawSakeListItemsProvider はフィルタリング前の生データを提供
|
|||
|
|
final allItems = ref.read(rawSakeListItemsProvider).asData?.value ?? [];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Option B: allSakeItemsProvider に変更**
|
|||
|
|
|
|||
|
|
ユーザーが見える範囲のデータのみ統計が必要な場合:
|
|||
|
|
```dart
|
|||
|
|
// Dev Menu: ユーザーに表示されるデータのみを解析
|
|||
|
|
// セット商品・Draftは除外される
|
|||
|
|
final allItems = ref.read(allSakeItemsProvider).asData?.value ?? [];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 🧪 実機テスト項目
|
|||
|
|
|
|||
|
|
修正後、以下を確認してください:
|
|||
|
|
|
|||
|
|
1. **Dev Menu を開く**
|
|||
|
|
- [ ] 設定画面 → その他 → 開発者メニュー
|
|||
|
|
|
|||
|
|
2. **データ修復を実行**
|
|||
|
|
- [ ] 「データ修復(再解析)」をタップ
|
|||
|
|
- [ ] 修復対象件数が表示される
|
|||
|
|
- [ ] セット商品も対象に含まれるか確認(Option A の場合)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### ⚠️ リスク評価
|
|||
|
|
|
|||
|
|
- **リスクレベル**: 🟢 低
|
|||
|
|
- **理由**: コメント追加のみ、または明確な意図での Provider 変更
|
|||
|
|
- **対策**: Dev Menu の動作確認のみ
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 📝 推奨する修正コード(Option A)
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
Future<void> _runBatchAnalysis(BuildContext context, WidgetRef ref) async {
|
|||
|
|
// Dev Menu: セット商品・Draft含む全データを解析するため rawSakeListItemsProvider を使用
|
|||
|
|
// Phase D6設計: rawSakeListItemsProvider はフィルタリング前の生データを提供
|
|||
|
|
// allSakeItemsProvider を使うと、セット商品・Draftが除外されてしまう
|
|||
|
|
final allItems = ref.read(rawSakeListItemsProvider).asData?.value ?? [];
|
|||
|
|
if (allItems.isEmpty) return;
|
|||
|
|
|
|||
|
|
// Filter items that need repair (e.g., empty stats)
|
|||
|
|
final targets = allItems.where((item) {
|
|||
|
|
final stats = item.hiddenSpecs.sakeTasteStats;
|
|||
|
|
final isStatsEmpty = stats.aroma == 0 && stats.bitterness == 0 && stats.sweetness == 0 &&
|
|||
|
|
stats.acidity == 0 && stats.body == 0;
|
|||
|
|
return isStatsEmpty || item.metadata.aiConfidence == null;
|
|||
|
|
}).toList();
|
|||
|
|
|
|||
|
|
// ... (残りのコードは変更なし) ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 残課題の優先順位と推奨スケジュール
|
|||
|
|
|
|||
|
|
### 次期バージョン v1.0.12 での対応推奨
|
|||
|
|
|
|||
|
|
| 課題 | 優先度 | 作業時間 | リスク | 推奨タイミング |
|
|||
|
|
|------|--------|----------|--------|----------------|
|
|||
|
|
| 1. Matrix4 deprecated | 🟡 中 | 1.5時間 | 🔴 高 | 次期バージョン必須 |
|
|||
|
|
| 2. ExpansionTileController | 🟡 中 | 1時間 | 🟡 中 | 次期バージョン必須 |
|
|||
|
|
| 3. rawSakeListItemsProvider コメント | 🟢 低 | 10分 | 🟢 低 | 任意 |
|
|||
|
|
|
|||
|
|
### 推奨作業順序
|
|||
|
|
|
|||
|
|
#### Day 1(2時間)
|
|||
|
|
1. ✅ Matrix4 deprecated 移行(30分)
|
|||
|
|
2. ✅ 実機テスト: 酒蔵マップ(30分)
|
|||
|
|
3. ✅ ExpansionTileController 移行(20分)
|
|||
|
|
4. ✅ 実機テスト: 酒詳細画面(20分)
|
|||
|
|
5. ✅ rawSakeListItemsProvider コメント追加(10分)
|
|||
|
|
6. ✅ flutter analyze 確認(10分)
|
|||
|
|
|
|||
|
|
#### Day 2(1時間)
|
|||
|
|
1. ✅ 最終ビルド(Lite版 + Pro版)(30分)
|
|||
|
|
2. ✅ 受け入れテスト(ACCEPTANCE_TEST_CHECKLIST.md)(30分)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ❓ ユーザーが決める必要があること
|
|||
|
|
|
|||
|
|
### 3. rawSakeListItemsProvider の使用目的
|
|||
|
|
|
|||
|
|
**質問**:
|
|||
|
|
> Dev Menu の「データ修復(再解析)」で、セット商品も含めて修復しますか?
|
|||
|
|
|
|||
|
|
**Option A: 含める(推奨)**
|
|||
|
|
- セット商品のAI解析情報も修復される
|
|||
|
|
- `rawSakeListItemsProvider` を使用(現状維持)
|
|||
|
|
- コメント追加のみ
|
|||
|
|
|
|||
|
|
**Option B: 含めない**
|
|||
|
|
- セット商品は修復対象外
|
|||
|
|
- `allSakeItemsProvider` に変更
|
|||
|
|
- 通常の酒データのみ修復
|
|||
|
|
|
|||
|
|
**どちらを選ぶべきか**:
|
|||
|
|
- **推奨: Option A(含める)**
|
|||
|
|
- セット商品も解析情報が必要なため
|
|||
|
|
- 包括的なデータメンテナンスが可能
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 まとめ
|
|||
|
|
|
|||
|
|
### すぐにやるべきこと(必須)
|
|||
|
|
1. **Matrix4 deprecated 移行** - 視覚的バグのリスクが高い
|
|||
|
|
2. **ExpansionTileController 移行** - UI動作に影響
|
|||
|
|
|
|||
|
|
### 任意でやること(推奨)
|
|||
|
|
3. **rawSakeListItemsProvider コメント追加** - 将来の誤変更防止
|
|||
|
|
|
|||
|
|
### 実機テストは必須
|
|||
|
|
- エミュレータだけでは不十分
|
|||
|
|
- 実機でタッチ操作・アニメーションを確認
|
|||
|
|
|
|||
|
|
### 推定時間
|
|||
|
|
- **最小**: 2時間(修正 + 実機テスト)
|
|||
|
|
- **最大**: 3時間(完全な受け入れテスト含む)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**作成者**: Claude (Sonnet 4.5)
|
|||
|
|
**作成日時**: 2026年2月4日
|
|||
|
|
**対象バージョン**: v1.0.11+22 → v1.0.12
|