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 definitionFreezed used, immutable objects🔴
Repository InterfaceI prefix, defined in Domain layer🔴
UseCase implementationEither pattern, Failure handling🔴
Failure classDomain-specific Failure defined🟡
Unit testsUseCase tests written🟡
// ✅ Entity example
@freezed
class User with _$User {
  const factory User({
    required int id,
    required String name,
  }) = _User;
}

// ✅ 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/StateFreezed Union Type🔴
Widget testsKey UI tested🟡

1.2 Code Generation#

# Code generation commands
melos run generate:{feature_name}

# Or full build
melos run build

Generation verification items:

File PatternDescription
*.freezed.dartFreezed generated code
*.g.dartJSON serialization generated code
*_router.dartAuto_route generated code
*_database.g.dartDrift generated code

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
@freezed
class HomeEvent with _$HomeEvent {
  const factory HomeEvent.loadUser(int id) = LoadUser;
}

@freezed
class HomeState with _$HomeState {
  const factory HomeState.initial() = _Initial;
  const factory HomeState.loading() = _Loading;
  const factory HomeState.loaded(User user) = _Loaded;
  const factory HomeState.error(Failure failure) = _Error;
}

Verification items:

  • Freezed used for Event/State
  • 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
Freezed errorCode not generatedmelos 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
melos run analyze

# Formatting
melos run format
Error TypeSolution
unused_importRemove import
prefer_constAdd const
avoid_printUse Logger