LogoSkills

checklist Reference

Detailed guide for Feature Complete and PR Review checklists.

Checklist Reference Guide#

Detailed guide for Feature Complete and PR Review checklists.


1. Feature Complete Verification Details#

1.1 Structure Verification#

Domain Layer

ItemVerification CriteriaSeverity
Entity definition @immutable + Equatable, copyWith, immutable fields ๐Ÿ”ด
Repository InterfaceI prefix, defined in Domain layer๐Ÿ”ด
UseCase implementationEither pattern, Failure handling๐Ÿ”ด
Failure classDomain-specific Failure defined๐ŸŸก
Unit testsUseCase 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

ItemVerification CriteriaSeverity
Repository implementationInterface implemented, const constructor๐Ÿ”ด
Serverpod MixinNetwork logic separated๐ŸŸก
Local DatabaseDrift DAO pattern๐ŸŸก
DTO โ†” Entity mappertoEntity(), toDto()๐ŸŸก
Caching strategySWR or Cache-First๐ŸŸก

Presentation Layer

ItemVerification CriteriaSeverity
Page widgetScreen-level widget๐Ÿ”ด
Reusable WidgetComponents extracted๐ŸŸก
BLoC/CubitState management implemented๐Ÿ”ด
Event/State sealed class extends Equatable + copyWith ๐Ÿ”ด
Widget testsKey UI tested๐ŸŸก

1.2 Code Generation#

# Full build (build_runner across the workspace)
melos run build

Generation verification items:

File PatternDescription
*.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#

2.1 PR Meta Information#

ItemVerification Criteria
Title formattype(scope): gitmoji description
Issue linkCloses #123 or Fixes #123
Labelsfeature, 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 ItemDescription
Purpose clarityChange purpose identifiable from PR description
Single purposeOne PR = one feature/fix
Change scopeOnly necessary files changed
No unnecessary changesNo 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

TypeRuleExample
ClassesPascalCaseUserRepository
Variables/FunctionscamelCasegetUserData()
ConstantsSCREAMING_SNAKEMAX_RETRY_COUNT
Filessnake_caseuser_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:

  • Event/State are sealed class extends Equatable (no @freezed)
  • Loading state handled
  • Error state handled
  • Resources released in dispose

2.5 Security Verification#

Verification ItemRisk LevelHow 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 "

2.6 Performance Verification#

Verification ItemHow to Check
N+1 queriesCheck DB calls inside loops
Unnecessary re-rendersbuildWhen, BlocSelector usage
Image optimizationcacheWidth, cacheHeight applied
Caching strategySWR, 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 ItemDescription
BuildiOS/Android build successful
TestAll tests passing
LintStatic analysis passing
CoverageCoverage threshold met

4. Troubleshooting#

Build Failures#

SymptomCauseSolution
Missing *.g.dart (route/JSON) Code not generated melos run build
Import errorCircular referenceFix dependency direction
Type errorDTO/Entity mismatchCheck mapper

Test Failures#

SymptomCauseSolution
Mock errorregisterFallbackValue missingCheck test setUp
State mismatchBLoC test setup errorCheck build() function
Widget errorRequired widget wrapping missingWrap 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 TypeSolution
unused_importRemove import
prefer_constAdd const
avoid_printUse Logger