fai-springboot-scaffold — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited fai-springboot-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 with REST, JPA, security, and testing.
src/main/java/com/example/
├── Application.java
├── controller/
│ └── ChatController.java
├── service/
│ └── ChatService.java
├── model/
│ ├── ChatRequest.java
│ └── ChatResponse.java
├── repository/
│ └── ConversationRepository.java
└── config/
└── SecurityConfig.java@RestController
@RequestMapping("/api")
public class ChatController {
private final ChatService chatService;
public ChatController(ChatService chatService) {
this.chatService = chatService;
}
@PostMapping("/chat")
public ResponseEntity<ChatResponse> chat(@Valid @RequestBody ChatRequest request) {
var response = chatService.chat(request);
return ResponseEntity.ok(response);
}
@GetMapping("/health")
public Map<String, String> health() {
return Map.of("status", "healthy");
}
}
public record ChatRequest(
@NotBlank @Size(max = 4000) String message,
String model
) {
public ChatRequest {
if (model == null) model = "gpt-4o-mini";
}
}
public record ChatResponse(String reply, int tokens) {}@Entity
@Table(name = "conversations")
public class Conversation {
@Id @GeneratedValue(strategy = GenerationType.UUID)
private UUID id;
private String userId;
private String title;
@Column(name = "created_at")
private Instant createdAt = Instant.now();
}
public interface ConversationRepository extends JpaRepository<Conversation, UUID> {
List<Conversation> findByUserIdOrderByCreatedAtDesc(String userId);
}@WebMvcTest(ChatController.class)
class ChatControllerTest {
@Autowired MockMvc mockMvc;
@MockBean ChatService chatService;
@Test
void chat_returnsResponse() throws Exception {
when(chatService.chat(any())).thenReturn(new ChatResponse("Hello", 100));
mockMvc.perform(post("/api/chat")
.contentType(MediaType.APPLICATION_JSON)
.content("""{"message": "Hi"}"""))
.andExpect(status().isOk())
.andExpect(jsonPath("$.reply").value("Hello"));
}
}| Issue | Cause | Fix |
|---|---|---|
| 400 on valid request | Missing @Valid or wrong content type | Add @Valid + Content-Type header |
| JPA entity not found | Missing @Entity annotation | Add annotation + table mapping |
| DI circular reference | Constructor cycle | Use @Lazy or redesign dependencies |
| Tests slow | Loading full context | Use @WebMvcTest for controller tests |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.