jpicklyk

backend-implementation

@jpicklyk/backend-implementation
jpicklyk
144
16 forks
Updated 1/18/2026
View on GitHub

Backend Implementation: Backend development with Kotlin, Spring Boot, REST APIs. Use for backend, api, service, kotlin, rest tags. Provides validation commands, testing patterns, and blocker scenarios.

Installation

$skills install @jpicklyk/backend-implementation
Claude Code
Cursor
Copilot
Codex
Antigravity

Details

Pathclaude-plugins/task-orchestrator/skills/backend-implementation/SKILL.md
Branchmain
Scoped Name@jpicklyk/backend-implementation

Usage

After installing, this skill will be available to your AI coding assistant.

Verify installation:

skills list

Skill Instructions


name: Backend Implementation description: Backend development with Kotlin, Spring Boot, REST APIs. Use for backend, api, service, kotlin, rest tags. Provides validation commands, testing patterns, and blocker scenarios. allowed-tools: Read, Write, Edit, Bash, Grep, Glob

Backend Implementation Skill

Domain-specific guidance for backend API development, service implementation, and business logic.

When To Use This Skill

Load this Skill when task has tags:

  • backend, api, service, kotlin, rest
  • spring, spring-boot, controller, repository

Validation Commands

Run Tests

# Full test suite
./gradlew test

# Specific test class
./gradlew test --tests "UserServiceTest"

# Single test method
./gradlew test --tests "UserServiceTest.shouldCreateUser"

# With build
./gradlew clean test

Build Project

# Build JAR
./gradlew build

# Build without tests (for quick syntax check)
./gradlew build -x test

Run Application

# Local development
./gradlew bootRun

# With specific profile
./gradlew bootRun --args='--spring.profiles.active=dev'

Success Criteria (Before Completing Task)

ALL tests MUST pass (0 failures, 0 errors) ✅ Build MUST succeed without compilation errors ✅ Code follows project conventions (existing patterns) ✅ API endpoints tested (integration tests) ✅ Error handling implemented (try-catch, validation)

Common Backend Tasks

REST API Endpoints

  • Controller with request mapping
  • Request/response DTOs
  • Service layer business logic
  • Repository integration
  • Error handling (400, 401, 404, 500)
  • Validation (@Valid annotations)

Service Implementation

  • Business logic in service classes
  • Transaction management (@Transactional)
  • Error handling and exceptions
  • Dependency injection (@Autowired, constructor injection)

Database Integration

  • Repository interfaces (JPA, Exposed ORM)
  • Entity mapping
  • Query methods
  • Transaction boundaries

Testing Principles for Backend

Use Real Infrastructure for Integration Tests

AVOID mocking repositories in integration tests:

// BAD - Mocking repositories misses SQL errors, constraints
@Mock private lateinit var userRepository: UserRepository
when(userRepository.findById(any())).thenReturn(mockUser)

USE real in-memory database:

// GOOD - Tests actual integration
@SpringBootTest
@Transactional  // Auto-rollback after each test
class UserApiTest {
    @Autowired private lateinit var userRepository: UserRepository
    @Autowired private lateinit var userService: UserService
    // Tests real database, serialization, constraints
}

Test Incrementally, Not in Batches

Avoid: Write 200 lines code + 15 tests → run all → 12 failures → no idea which code caused which failure

Do:

  1. Write basic implementation
  2. Write ONE happy path test
  3. Run ONLY that test: ./gradlew test --tests "ToolTest.shouldHandleBasicCase"
  4. Fix until passes
  5. Add ONE edge case test
  6. Run ONLY that test
  7. Repeat

Benefits: Feedback in seconds, isolates root cause immediately.

Debug with Actual Output

When test fails:

  1. Read error message carefully - tells you what's wrong
  2. Print actual output:
    println("Full response: $result")
    println("Response keys: ${result.jsonObject.keys}")
    
  3. Verify assumptions about test data - count manually
  4. Fix root cause, not symptoms

Create Complete Test Entities

BAD - Missing required fields:

val task = Task(
    id = UUID.randomUUID(),
    title = "Test Task",
    status = TaskStatus.PENDING
    // Missing: summary, priority, complexity, timestamps
)
taskRepository.create(task)  // FAILS: NOT NULL constraint

GOOD - Complete entity:

val task = Task(
    id = UUID.randomUUID(),
    title = "Test Task",
    summary = "Test summary",               // Required
    status = TaskStatus.PENDING,            // Required
    priority = Priority.HIGH,               // Required
    complexity = 5,                         // Required
    tags = listOf("test"),
    projectId = testProjectId,
    createdAt = Instant.now(),              // Required
    modifiedAt = Instant.now()              // Required
)

How to find required fields: Check migration SQL or ORM model definition.

Common Blocker Scenarios

Blocker 1: Missing Database Schema

Issue: Tests expect column that doesn't exist

SQLSyntaxErrorException: Unknown column 'users.password_hash'

What to try:

  • Check migration files - is column defined?
  • Review prerequisite database tasks - marked complete but incomplete?
  • Check if column was renamed

If blocked: Report to orchestrator - database task may need reopening

Blocker 2: NullPointerException in Service

Issue: NPE at runtime in service class

NullPointerException: Cannot invoke method on null object

What to try:

  • Check dependency injection - is @Autowired present?
  • Check constructor injection - all parameters provided?
  • Check @Configuration on config class
  • Check @Service or @Component on service class
  • Add null safety (Kotlin: use ? operator, nullable types)

Common causes:

  • Missing @Configuration annotation
  • Spring not scanning package
  • Circular dependency

Blocker 3: Integration Test Failures

Issue: Integration tests pass locally but fail in CI or for others

What to try:

  • Check test isolation - are tests cleaning up state?
  • Check @Transactional with rollback
  • Check test order dependencies (tests should be independent)
  • Check H2/in-memory DB configuration matches production DB type
  • Check test data initialization

Blocker 4: Architectural Conflict

Issue: Task requirements conflict with existing architecture

Task requires middleware auth but project uses annotation-based security

What to try:

  • Review existing patterns in codebase
  • Check architecture documentation
  • Look for similar implementations

If blocked: Report to orchestrator - may need architectural decision or task revision

Blocker 5: External Dependency Bug

Issue: Third-party library has known bug

JWT library v3.2.1 has refresh token bug - expires immediately

What to try:

  • Check library changelog - is fix available in newer version?
  • Search for known issues in library's issue tracker
  • Try workaround if documented

If blocked: Report to orchestrator - may need to wait for library update or use alternative

Blocker Report Format

⚠️ BLOCKED - Requires Senior Engineer

Issue: [Specific problem - NPE at UserService.kt:42, missing column, etc.]

Attempted Fixes:
- [What you tried #1]
- [What you tried #2]
- [Why attempts didn't work]

Root Cause (if known): [Your analysis]

Partial Progress: [What work you DID complete]

Context for Senior Engineer:
- Error output: [Paste error]
- Test results: [Test failures]
- Related files: [Files involved]

Requires: [What needs to happen - Senior Engineer investigation, etc.]

Quick Reference

Spring Boot Patterns

Controller:

@RestController
@RequestMapping("/api/users")
class UserController(private val userService: UserService) {

    @PostMapping
    fun createUser(@Valid @RequestBody request: CreateUserRequest): User {
        return userService.createUser(request)
    }

    @GetMapping("/{id}")
    fun getUser(@PathVariable id: UUID): User {
        return userService.findById(id)
            ?: throw NotFoundException("User not found")
    }
}

Service:

@Service
@Transactional
class UserService(
    private val userRepository: UserRepository,
    private val passwordEncoder: PasswordEncoder
) {
    fun createUser(request: CreateUserRequest): User {
        val user = User(
            email = request.email,
            passwordHash = passwordEncoder.encode(request.password)
        )
        return userRepository.save(user)
    }
}

Repository:

@Repository
interface UserRepository : JpaRepository<User, UUID> {
    fun findByEmail(email: String): User?
}

Error Handling

@RestControllerAdvice
class GlobalExceptionHandler {

    @ExceptionHandler(NotFoundException::class)
    fun handleNotFound(ex: NotFoundException): ResponseEntity<ErrorResponse> {
        return ResponseEntity
            .status(HttpStatus.NOT_FOUND)
            .body(ErrorResponse(ex.message))
    }

    @ExceptionHandler(ValidationException::class)
    fun handleValidation(ex: ValidationException): ResponseEntity<ErrorResponse> {
        return ResponseEntity
            .status(HttpStatus.BAD_REQUEST)
            .body(ErrorResponse(ex.message))
    }
}

Common Patterns to Follow

  1. Controller → Service → Repository layering
  2. Constructor injection over field injection
  3. @Transactional on service layer for database operations
  4. DTO pattern for request/response (don't expose entities)
  5. Exception handling with @RestControllerAdvice
  6. Validation with @Valid and constraint annotations
  7. Testing with real database for integration tests

What NOT to Do

❌ Don't mock repositories in integration tests ❌ Don't skip tests and mark task complete ❌ Don't expose entities directly in API responses ❌ Don't put business logic in controllers ❌ Don't forget @Transactional for database operations ❌ Don't hardcode configuration (use application.yml)

Focus Areas

When reading task sections, prioritize:

  • requirements - What API endpoints need to be built
  • technical-approach - How to implement (patterns, libraries)
  • implementation - Specific implementation details
  • testing-strategy - How to test the implementation

Remember

  • Run tests incrementally - one test at a time for fast feedback
  • Use real infrastructure - in-memory database for integration tests
  • Debug with actual output - print what you got, don't assume
  • Report blockers promptly - don't wait, communicate to orchestrator
  • Follow existing patterns - check codebase for similar implementations
  • Complete test entities - all required fields must be populated
  • Validation is mandatory - ALL tests must pass before completion

Additional Resources

For deeper patterns and examples, see:

  • PATTERNS.md - Spring Security, REST API design patterns (load if needed)
  • BLOCKERS.md - Detailed blocker scenarios with solutions (load if stuck)
  • examples.md - Complete working examples (load if uncertain)