Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add infraspecdev/tesseract --skill spring-datagit clone --depth 1 https://github.com/infraspecdev/tesseractWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/infraspecdev/tesseract/spring-data)<a href="https://agentmods.dev/skills/infraspecdev/tesseract/spring-data"><img src="https://agentmods.dev/badge/skills/infraspecdev/tesseract/spring-data/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/infraspecdev/tesseract/spring-data"><img src="https://agentmods.dev/badge/skills/infraspecdev/tesseract/spring-data.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00070 | $0.01361 |
| Opus 5.5 | $0.00028 | $0.00544 |
| Sonnet 5.5 | $0.00014 | $0.00272 |
| Haiku 4.5 | $0.00007 | $0.00136 |
Grade A, and why
backend-spring-data scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 90 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Spring Data Review
Overview
Review Spring Data JPA code for transactional correctness, query patterns, and entity design. Catches Spring-specific issues that the agnostic database-review skill doesn't flag (which is schema/index/N+1-focused).
Triggers when spring-boot-starter-data-* is detected and JPA repositories or @Transactional methods are in scope.
Version Compatibility
Supported: Spring Boot 3.x (declared via spring_boot_versions: ["3.x"] in frontmatter).
Spring Boot 2.x — degraded coverage:
- All checks (P1–P10) apply identically; package names differ (
jakarta.persistence.*in SB3 vsjavax.persistence.*in SB2) @Transactionalannotations live inorg.springframework.transaction.annotationin both versions — no change
To add full SB2 coverage, follow Pattern A (broaden the rubric) per shield/skills/backend/EXTENDING-VERSIONS.md.
When to Use
- Reviewing
@Repositoryinterfaces (Spring Data, custom) - Reviewing
@Transactionalplacement and propagation - Reviewing JPA entities for equals/hashCode and lifecycle annotations
- Reviewing JPQL/native queries with
@Query/@Modifying
When NOT to Use
- Pure schema design (FKs, indexes, normalization) — use
database-review - N+1 query detection at the schema level — use
database-review(D6) - Non-JPA persistence (Spring Data MongoDB, JDBC, R2DBC) — patterns differ; this skill is JPA-focused
Review Process
- Inventory:
@Transactionalannotations,@Repositoryinterfaces, JPA entity classes,@Querymethods - For each, apply Evaluation Points P1–P10
- Cross-cut: trace a write path; flag every transactional boundary that is silently missing or misplaced
Evaluation Points
| # | Check | What to Look For | Severity |
|---|---|---|---|
| P1 | @Transactional on private method |
Spring AOP proxies don't intercept private methods. @Transactional on private is a no-op |
High |
| P2 | Self-invocation problem | Calling a @Transactional method from within the same bean bypasses the proxy. Refactor to separate bean OR use AopContext.currentProxy() (rarely the right answer) |
High |
| P3 | readOnly = true on read methods |
Read methods marked @Transactional(readOnly = true) — enables JPA flush optimization, signals intent |
Medium |
| P4 | Propagation correctness | REQUIRES_NEW requires explicit justification (e.g., audit log that commits independently). Default REQUIRED is correct most of the time |
Medium |
| P5 | @Modifying for mutating @Query |
UPDATE/DELETE in @Query requires @Modifying. Without it, Spring treats it as SELECT and silently ignores the change |
High |
| P6 | Mutating queries also need @Transactional |
@Modifying queries fail without an active transaction. Annotate the caller (or use @Transactional on the repo method) |
High |
| P7 | equals/hashCode on entities |
Auto-generated ID-based equals breaks before persistence (HashSet bugs). Use natural keys or business identifier; document the choice | Medium |
| P8 | Fetch strategy via @EntityGraph |
When findAll/custom queries need to load children, use @EntityGraph(attributePaths=...) rather than EAGER on the entity |
Medium |
| P9 | @Repository annotation |
Optional on Spring Data interfaces extending JpaRepository (auto-detected), but harmless. Required for plain JPA repos with @PersistenceContext |
Low |
| P10 | Cascade types | CascadeType.ALL on @OneToMany cascades deletes — usually wrong. Be explicit about which operations cascade |
Medium |
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 90 lines · 70 tokens per session scan A 181e674777d6
backend-spring-data is a skill published in the GitHub repository infraspecdev/tesseract (5 stars, last pushed 3mo ago), licensed MIT. It adds 70 tokens to every session and 1,361 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-03.
Other skills, from other repositories
azure-postgres-ts
Connect to Azure Database for PostgreSQL Flexible Server from Node.js/TypeScript using the pg (node-postgres) package. Use for PostgreSQL queries, connection pooling, transactions, and Microsoft Entra ID (passwordless) authentication. Triggers: "PostgreSQL", "postgres", "pg client", "node-postgres", "Azure PostgreSQL…
supabase
Use when doing ANY task involving Supabase. Triggers: Supabase products (Database, Auth, Edge Functions, Realtime, Storage, Vectors, Cron, Queues); client libraries and SSR integrations (supabase-js, @supabase/ssr) in Next.js, React, SvelteKit, Astro, Remix; auth issues (login, logout, sessions, JWT, cookies…
butterbase
AI-native, open-source backend-as-a-service with a built-in Model Context Protocol server. Postgres, auth, storage, functions, AI gateway.
supabase-cli
This skill should be used when user asks to "use supabase CLI", "supabase init", "supabase start", "run migrations", "deploy edge functions", "manage Supabase project", or works with the supabase command-line tool for local development and project management.
supabase-js
This skill should be used when user asks to "use supabase-js", "query Supabase database", "supabase auth", "supabase storage", "supabase realtime", "supabase edge functions", or works with the @supabase/supabase-js JavaScript/TypeScript SDK.
supabase-node
Express/Hono with Supabase and Drizzle ORM.