Checklist Reference Guide #
Detailed guide for Feature Complete and PR Review checklists.
1. Feature Complete Verification Details #
1.1 Structure Verification #
Domain Layer
Item Verification Criteria Severity
Entity definition
@immutable + Equatable, copyWith, immutable fields
๐ด
Repository Interface I prefix, defined in Domain layer ๐ด
UseCase implementation Either pattern, Failure handling ๐ด
Failure class Domain-specific Failure defined ๐ก
Unit tests UseCase tests written ๐ก
// โ
Entity example (immutable + Equatable + copyWith, no codegen)
@immutable
final class User extends Equatable {
const User ( { required this . id, required this . name} ) ;
final int id;
final String name;
User copyWith ( { int ? id, String ? name} ) =>
User ( id: id ?? this . id, name: name ?? this . name) ;
@override
List < Object ?> get props => [ id , name] ;
}
// โ
Repository Interface example
abstract interface class IUserRepository {
Future < Either < Failure , User >> getUser ( int id) ;
}
// โ
UseCase example (Optional Constructor Injection)
class GetUserUseCase {
const GetUserUseCase ( [ IUserRepository ? repository] )
: _repository = repository ?? const UserRepository ( ) ;
final IUserRepository _repository;
Future < Either < Failure , User >> call ( GetUserParams params) async {
return _repository. getUser ( params. id) ;
}
}
Data Layer
Item Verification Criteria Severity
Repository implementation Interface implemented, const constructor ๐ด
Serverpod Mixin Network logic separated ๐ก
Local Database Drift DAO pattern ๐ก
DTO โ Entity mapper toEntity(), toDto() ๐ก
Caching strategy SWR or Cache-First ๐ก
Presentation Layer
Item Verification Criteria Severity
Page widget Screen-level widget ๐ด
Reusable Widget Components extracted ๐ก
BLoC/Cubit State management implemented ๐ด
Event/State
sealed class extends Equatable + copyWith
๐ด
Widget tests Key UI tested ๐ก
1.2 Code Generation #
# Full build ( build_runner across the workspace)
melos run build
Generation verification items:
File Pattern Description
*.g.dart
JSON serialization + go_router ($Route mixin) generated code
*_database.g.dartDrift generated code
No *.freezed.dart โ State/Event are hand-written sealed class extends Equatable.
No *_router.dart โ routing uses go_router @TypedGoRoute, which generates
*.g.dart.
1.3 Testing #
Unit Tests (UseCase)
test ( 'should return user when repository succeeds' , ( ) async {
// Arrange
when ( ( ) => mockRepository. getUser ( any ( ) ) )
. thenAnswer ( ( _) async => Right ( testUser) ) ;
// Act
final result = await useCase ( GetUserParams ( id: 1 ) ) ;
// Assert
expect ( result, Right ( testUser) ) ;
verify ( ( ) => mockRepository. getUser ( 1 ) ) . called ( 1 ) ;
} ) ;
BLoC Tests (Direct Mock UseCase Injection)
blocTest < HomeBloC , HomeState > (
'emits [loading, loaded] when LoadUser succeeds' ,
setUp: ( ) {
when ( ( ) => mockGetUserUseCase ( any ( ) ) )
. thenAnswer ( ( _) async => Right ( testUser) ) ;
} ,
build: ( ) => HomeBloC ( getUserUseCase: mockGetUserUseCase) , // โ
Direct mock injection
act: ( bloc) => bloc. add ( LoadUser ( id: 1 ) ) ,
expect: ( ) => [ HomeLoading ( ) , HomeLoaded ( testUser) ] ,
) ;
Test Commands
# Single feature test
flutter test feature/ { type} / { feature_name} / test/
# Coverage report
melos run test: with - html- coverage
Coverage target : 80% or above
2. PR Review Verification Details #
Item Verification Criteria
Title format type(scope): gitmoji description
Issue link Closes #123 or Fixes #123
Labels feature, bugfix, refactor, etc.
Title examples:
feat ( auth) : โจ Add social login feature
fix ( home) : ๐ Fix feed infinite scroll bug
refactor ( store) : โป๏ธ Optimize product list query
2.2 Change Scope #
Verification Item Description
Purpose clarity Change purpose identifiable from PR description
Single purpose One PR = one feature/fix
Change scope Only necessary files changed
No unnecessary changes No unrelated formatting, whitespace changes
2.3 Code Quality #
Architecture Verification
โ
Correct dependency direction:
Presentation โ Domain โ Data
โ Incorrect dependency:
Presentation โ Data ( bypassing Domain )
Feature A โ Feature B ( direct reference)
Naming Convention
Type Rule Example
Classes PascalCase UserRepository
Variables/Functions camelCase getUserData()
Constants SCREAMING_SNAKE MAX_RETRY_COUNT
Files snake_case user_repository.dart
2.4 State Management Verification #
// โ
Correct BLoC pattern (sealed class + Equatable, no codegen)
@immutable
sealed class HomeEvent extends Equatable {
const HomeEvent ( ) ;
const factory HomeEvent . loadUser ( int id) = LoadUser ;
@override
List < Object ?> get props => const [ ] ;
}
final class LoadUser extends HomeEvent {
const LoadUser ( this . id) ;
final int id;
@override
List < Object ?> get props => [ id] ;
}
@immutable
sealed class HomeStatus extends Equatable {
const HomeStatus ( ) ;
const factory HomeStatus . initial ( ) = HomeInitial ;
const factory HomeStatus . loading ( ) = HomeLoading ;
const factory HomeStatus . loaded ( User user) = HomeLoaded ;
const factory HomeStatus . error ( Failure failure) = HomeError ;
@override
List < Object ?> get props => const [ ] ;
}
Verification items:
2.5 Security Verification #
Verification Item Risk Level How to Check
Hardcoded secrets ๐ด Search for API keys, tokens
Sensitive info logging ๐ด Check print, log statements
Input validation ๐ก Check user input handling
# Secret search
grep - r " api_key \| secret \| password \| token " -- include= " *.dart "
Verification Item How to Check
N+1 queries Check DB calls inside loops
Unnecessary re-renders buildWhen, BlocSelector usage
Image optimization cacheWidth, cacheHeight applied
Caching strategy SWR, Cache-First applied
3. CI/CD Verification #
# Check PR status
gh pr checks [ PR_NUMBER ]
# View PR in browser
gh pr view [ PR_NUMBER ] -- web
Check Item Description
Build iOS/Android build successful
Test All tests passing
Lint Static analysis passing
Coverage Coverage threshold met
4. Troubleshooting #
Build Failures #
Symptom Cause Solution
Missing *.g.dart (route/JSON)
Code not generated
melos run build
Import error Circular reference Fix dependency direction
Type error DTO/Entity mismatch Check mapper
Test Failures #
Symptom Cause Solution
Mock error registerFallbackValue missing Check test setUp
State mismatch BLoC test setup error Check build() function
Widget error Required widget wrapping missing Wrap with MaterialApp
Static Analysis Errors #
# Run analysis ( dart analyze + dcm analyze)
melos run analyze
# Formatting ( kobic uses dcm format , not dart format)
melos run format
Error Type Solution
unused_import Remove import
prefer_const Add const
avoid_print Use Logger