fai-springboot-kotlin-scaffold — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited fai-springboot-kotlin-scaffold (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Build Spring Boot services in Kotlin with coroutines and WebFlux.
plugins {
kotlin("jvm") version "2.0.0"
kotlin("plugin.spring") version "2.0.0"
id("org.springframework.boot") version "3.3.0"
id("io.spring.dependency-management") version "1.1.5"
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-webflux")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}@RestController
@RequestMapping("/api")
class ChatController(private val chatService: ChatService) {
@PostMapping("/chat")
suspend fun chat(@RequestBody request: ChatRequest): ChatResponse {
return chatService.chat(request)
}
@GetMapping("/health")
suspend fun health(): Map<String, String> {
return mapOf("status" to "healthy")
}
}
data class ChatRequest(val message: String, val model: String = "gpt-4o-mini")
data class ChatResponse(val reply: String, val tokens: Int)@Service
class ChatService(private val openAIClient: OpenAIClient) {
suspend fun chat(request: ChatRequest): ChatResponse {
val response = openAIClient.complete(request.message, request.model)
return ChatResponse(
reply = response.content,
tokens = response.totalTokens
)
}
}@Configuration
class OpenAIConfig {
@Bean
fun openAIClient(
@Value("\${azure.openai.endpoint}") endpoint: String
): OpenAIClient {
return OpenAIClient(endpoint, DefaultAzureCredential())
}
}| Issue | Cause | Fix |
|---|---|---|
| Null safety issues | Java interop | Use !! carefully, prefer Kotlin types |
| Coroutine scope leak | Missing structured concurrency | Use coroutineScope in service |
| Jackson serialize error | No Kotlin module | Add jackson-module-kotlin dependency |
| Spring DI fails | Missing open modifier | Apply kotlin-spring plugin (opens classes) |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.