Kora Framework — Meta-skill
Single entry point for all Kora development. This file is routing and rules only — the
implementation knowledge lives in the 39 sub-skills listed below.
|
|
| Framework |
Kora 1.x (ru.tinkoff.kora) — check the changelog for the current release |
| Java |
17+ supported, 25+ recommended (annotation processors) |
| Kotlin |
1.9+ on JDK 21 (KSP) |
| Build |
Gradle 7+ supported, 9+ recommended (wrapper pins 9.5.1) |
This meta-skill is the single entry point for Kora Framework development. It routes to 39 specialized domain skills, each with its own narrow area of expertise.
Read this file first when:
- Starting a new Kora microservice project from scratch (Java or Kotlin)
- Adding or refactoring
@KoraApp application graph with *Module interfaces
- Choosing which Kora modules to plug in (HTTP, Database, Kafka, gRPC, SOAP, S3, Telemetry)
- Debugging DI container issues ("dependency not found", ambiguous bindings, graph build failures)
- Configuring typed config with
@ConfigSource and environment variable substitution
- Planning a multi-module Gradle project with
@KoraSubmodule boundaries
1. Operating rules
Four rules. They apply to every Kora task, on every turn, from the first message.
Each is stated once — here.
R0 is a gate: satisfy it before doing anything else. R1–R3 govern the work itself.
R0 — Ground the workspace before starting
The upstream documentation and the runnable example apps are levels 4–5 of the R1 chain and the
final authority for every Kora question. They must be on disk before you begin, not fetched
reactively once you are already stuck.
Run this at the start of every Kora task. It is idempotent — it does nothing when the material
is already present, so there is no cost to running it every time:
if [ ! -d .kora-agent/kora-docs ] || [ ! -d .kora-agent/kora-examples ]; then
mkdir -p .kora-agent
[ -d .kora-agent/kora-docs ] \
|| git clone --depth 1 https://github.com/kora-projects/kora-docs.git .kora-agent/kora-docs
[ -d .kora-agent/kora-examples ] \
|| git clone --depth 1 https://github.com/kora-projects/kora-examples.git .kora-agent/kora-examples
rm -rf .kora-agent/kora-docs/.git .kora-agent/kora-examples/.git
grep -qxF '.kora-agent/' .gitignore 2>/dev/null || echo '.kora-agent/' >> .gitignore
fi
Gate: .kora-agent/kora-docs/ and .kora-agent/kora-examples/ both exist → proceed.
- Clone fails (no network, restricted environment) → say so explicitly and continue with sub-skills
only. Never silently substitute recollection for the docs you could not fetch.
- Material is present but predates the Kora version in the build → re-clone before trusting it.
- The user declines the clone → note that levels 4–5 are unavailable for this session, and flag any
answer that would normally have been verified against them.
Recovery: started Kora work and only then noticed .kora-agent/ is missing → run the block now,
then re-verify anything you already produced against it.
R1 — Route before you write
Resolve every Kora question through this chain, in order. Stop at the first level that answers it.
1. This file → pick the sub-skill
2. skills/<sub-skill>/SKILL.md → the actual expertise, templates, scripts
3. skills/<sub-skill>/references/ → detailed patterns for that domain
4. kora-journal (search) → known mistakes and fixes from past sessions
5. .kora-agent/ docs + examples → upstream source of truth
- Never write Kora code straight from memory. Open the sub-skill first.
- Never skip to level 5 because "it's a small change". Levels 2–3 hold the vetted patterns.
- Sub-skill and upstream docs disagree → upstream wins; fix the sub-skill and journal it (R3).
Recovery: caught writing Kora code without having opened the sub-skill → stop, discard the
draft, open the sub-skill, rewrite.
R2 — Kora only, and only what is asked
Kora is a self-contained framework with its own annotations, modules, and generated code.
- Never use Spring / Micronaut / Quarkus / Helidon annotations or idioms.
- Never invent a Kora annotation, class, or config key. If it is not in a sub-skill,
a
references/ file, or .kora-agent/, it does not exist — go verify it.
- Never add comments or Javadoc, unless the user asked for them or the logic is genuinely
opaque (bit manipulation, encodings, cryptography, non-obvious protocol handling).
- Never mix paradigms for one target: OpenAPI-generated controller → implement its delegate,
do not hand-write a parallel controller; Kora
@HttpClient → do not also call the same service
with a raw HTTP library.
- Always express behaviour through Kora's compile-time model — no reflection, no runtime proxies.
Recovery: a framework foreign to Kora slipped in → delete it, re-derive from the sub-skill,
journal it (R3).
R3 — Journal incorrect Kora usage
When you realise — or the user tells you — that you used the Kora Framework incorrectly,
record it. This is the feedback loop that improves the skills.
| Record |
Do not record |
| Wrong Kora annotation used |
Business / domain logic |
| Hallucinated Kora API or config key |
Project-specific workarounds |
| Kora pattern misapplied (DI, AOP, config, telemetry) |
Non-Kora issues |
| Kora best practice from a sub-skill violated |
UI/UX or style preferences |
| Sub-skill documentation wrong, stale, or unclear |
Anything already correct |
| Unrequested comments/Javadoc written (R2 breach) |
|
Entries are one file each, at ~/.kora-journal/<project>/<module>/<YYYY-MM-DD>_slug.md, shared
across all projects and sessions. Full CLI and workflow:
skills/kora-journal/SKILL.md.
Recovery: discovered a Kora mistake and moved on without an entry → add the entry now.
2. Per-task procedure
Follow these steps for every Kora request. Do not compress them.
- Satisfy R0 — run the grounding block, confirm
.kora-agent/ holds both repositories.
Do not begin step 1 until this gate passes or you have told the user it cannot.
- Classify the request against the routing tables in §3. More than one domain → handle them
one at a time, in dependency order (project setup → config → DI → domain modules → telemetry → tests).
- Read the sub-skill's
SKILL.md end to end, then the references/ entries it points at
for your case.
- Search the journal before implementing anything non-trivial:
# path is relative to this skill's own directory, not the project you are working in
python skills/kora-journal/scripts/kora_journal.py search "http interceptor auth" --limit 5
Hit → apply it, then mark it applied with integrate <entry-file>.
Miss → continue, and expect to add an entry afterwards under R3.
- Implement in the smallest increment that compiles — one annotation, method, or class at a time.
- Compile —
./gradlew clean classes. Mandatory after any annotation change; the annotation
processors, not the compiler, are what actually validate Kora code.
- Test — write
@KoraAppTest / Testcontainers coverage for real endpoints, queries, and
messages, then ./gradlew test.
- Verify the rules — R1 route followed, R2 no foreign framework and no stray comments,
R3 journal entry added for any Kora mistake made along the way.
Definition of done: it compiles, tests pass, no rule was violated, journal updated if applicable.
Build commands
| Purpose |
Command |
| Compile + run annotation processors / KSP |
./gradlew clean classes |
| Run tests |
./gradlew test |
Build hangs, or clean fails with "Unable to delete directory" |
./gradlew --stop, then retry |
3. Sub-skill routing
Read the matching sub-skill's SKILL.md before writing any code for that domain (R1).
Foundation — start here for new projects
| When the task is about |
Sub-skill |
| Gradle scaffolding, wrapper, build scripts, project layout (Java) |
kora-project-setup-java |
| Gradle scaffolding, KSP, Kotlin DSL (Kotlin) |
kora-project-setup-kotlin |
| Kora BOM, module artifacts, annotation processors, dependency choices |
kora-project-dependencies |
| Generating a runnable starter project (Initializr-style) |
generate_project.py |
HOCON config, typed @ConfigSource, env substitution |
kora-config-hocon |
| YAML config (alternative to HOCON) |
kora-config-yaml |
Dependency injection
| When the task is about |
Sub-skill |
@KoraApp, @Component, @Module, factory methods, @KoraSubmodule, graph build failures |
kora-di-compile |
@Root, Lifecycle, @Tag, All<T>, ValueOf<T> |
kora-di-runtime |
Database
| When the task is about |
Sub-skill |
JDBC repositories, @EntityJdbc, @Query, SQL macros, transactions, Hikari |
kora-database-jdbc |
Cassandra, @EntityCassandra, @UDT, CQL, driver profiles |
kora-database-cassandra |
| Flyway / Liquibase migrations, SQL versioning |
kora-database-migration |
Communication
| When the task is about |
Sub-skill |
HTTP server, @HttpController, @HttpRoute, @Path, @Query, interceptors |
kora-http-server |
HTTP server auth — BasicAuth, Bearer, API keys, SecurityContext, principals |
kora-http-server-auth |
HTTP client, @HttpClient, declarative interfaces, interceptors, response mappers |
kora-http-client |
| HTTP client auth — BasicAuth, Bearer, API keys, token refresh |
kora-http-client-auth |
gRPC server, GrpcServerModule, service handlers |
kora-grpc-server |
gRPC client, GrpcClientModule, @Tag stub injection |
kora-grpc-client |
SOAP / WSDL client, SoapClientModule, generated clients |
kora-soap-client |
Kafka publishing, @KafkaPublisher, transactional producers |
kora-kafka-producer |
Kafka consuming, @KafkaListener, batch mode, error handling |
kora-kafka-consumer |
| OpenAPI → server code, delegates, controllers |
kora-openapi-generator-server |
OpenAPI → client code, typed Api interfaces |
kora-openapi-generator-client |
| Serving the spec — Swagger UI, RapiDoc, publishing |
kora-openapi-management |
JSON DTOs, @Json, sealed discriminators, custom (de)serialization |
kora-json |
Telemetry
| When the task is about |
Sub-skill |
| OpenTelemetry tracing, OTLP export, spans, Jaeger/Zipkin |
kora-telemetry-tracing |
| Micrometer metrics, Prometheus scrape endpoint, custom meters |
kora-telemetry-metrics |
SLF4J / Logback, structured logs, KoraAsyncAppender |
kora-telemetry-logging |
AOP
| When the task is about |
Sub-skill |
@Retry, @CircuitBreaker, @Timeout, @Fallback |
kora-aop-resilient |
@Log, @Mdc, method logging aspects |
kora-aop-logging |
@Cacheable, @CachePut, @CacheInvalidate, Caffeine / Redis |
kora-aop-caching |
@ScheduleAtFixedRate, @ScheduleWithCron (JDK executor) |
kora-aop-scheduling-jdk |
| Quartz scheduling, clustered jobs, job stores |
kora-aop-scheduling-quartz |
@Valid, @Validate, constraint annotations, custom validators |
kora-aop-validation |
Testing
| When the task is about |
Sub-skill |
@KoraAppTest, @TestComponent, mocks, JUnit 5 (Java) |
kora-testing-junit-java |
@KoraAppTest, MockK, JUnit 5 (Kotlin) |
kora-testing-junit-kotlin |
Black-box E2E, AppContainer, Testcontainers, Docker |
kora-testing-blackbox |
Other
| When the task is about |
Sub-skill |
S3 object storage, @S3.Client, AWS S3 / MinIO, multipart uploads |
kora-s3 |
| MapStruct mappers, DTO ↔ entity mapping |
kora-mapstruct |
| Recording incorrect Kora usage (R3), searching past mistakes |
kora-journal |
| Teaching Kora, guided tutorials, explaining concepts to a newcomer |
kora-teacher |
4. Architecture facts that drive decisions
- Everything is generated at compile time. DI →
*ComponentImpl / *Graph, HTTP →
*HttpRouter, AOP → *Aspect, JSON → *JsonReader / *JsonWriter, repositories →
*RepositoryImpl, OpenAPI → *Delegate. No reflection, no dynamic proxies, no runtime scanning.
- The generated sources are the ground truth. When wiring or aspect behaviour is unclear,
read them:
- Java:
build/generated/sources/annotationProcessor/
- Kotlin:
build/generated/ksp/
- Compilation is the primary validator. If it compiles and the tests pass, the wiring is correct.
- Aspects need a non-final target. In Kotlin an AOP-annotated class and method must be
open,
otherwise the aspect is silently not generated.
Troubleshooting
| Symptom |
Action |
Required dependency was not found: Foo |
Check @Component on the class, the *Module is extended by @KoraApp, and @KoraSubmodule exists in multi-module builds |
| Ambiguous dependency / more than one candidate |
Disambiguate with @Tag, or inject All<T> |
ApplicationGraph missing after clean |
Run ./gradlew classes — processors must run before anything references the graph |
| Aspect annotation has no effect |
Annotation processor / KSP dependency missing, or the Kotlin class is not open |
| Generated classes stale or broken after a refactor |
Delete build/generated/, rebuild |
Build hangs, or clean fails to delete a directory |
./gradlew --stop, then retry |
| IDE shows errors but Gradle compiles fine |
IDE caching — invalidate caches and restart |
| Behaviour contradicts a sub-skill |
Verify against .kora-agent/ docs, fix the sub-skill, journal it (R3) |
5. Upstream sources
Availability of this material is R0, the gate in §1 — it is a precondition for starting work,
not a step you reach once you need it.
Where to look
Module-by-module map of docs, guides, and runnable example apps — plus the areas this plugin does
not cover: references/kora-docs-map.md.
1---2name: kora-v13description: Build and maintain Java/Kotlin services on the Kora Framework 1.x (ru.tinkoff.kora) — compile-time DI, zero reflection, annotation processors (Java) or KSP (Kotlin). Routes to 39 domain sub-skills. Use when the request mentions Kora, or uses Kora APIs: @KoraApp, @Component, @Module, @KoraSubmodule, @Root, @Tag, @HttpController, @HttpRoute, @HttpClient, @Repository, @Query, @EntityJdbc, @KafkaListener, @KafkaPublisher, gRPC, SOAP/WSDL, @S3.Client, MapStruct, @Json, @ConfigSource (HOCON/YAML), OpenAPI codegen, @KoraAppTest, Testcontainers, @Valid, @Validate, @Log, @Mdc, @Retry, @CircuitBreaker, @Timeout, @Fallback, @Schedule*, @Cacheable, @CachePut, @CacheInvalidate, Micrometer/Prometheus metrics, OpenTelemetry/OTLP tracing, Undertow, Hikari. Also use for Kora project setup, Gradle/BOM dependencies, DI graph errors, or explaining Kora concepts. Do not use for Spring Boot, Micronaut, or Quarkus work.4license: Apache-2.05---67# Kora Framework — Meta-skill89Single entry point for all Kora development. This file is **routing and rules only** — the10implementation knowledge lives in the 39 sub-skills listed below.1112| | |13|---|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|14| **Framework** | Kora 1.x (`ru.tinkoff.kora`) — check the [changelog](https://raw.githubusercontent.com/kora-projects/kora-docs/refs/heads/master/mkdocs/docs/en/changelog/changelog.md) for the current release |15| **Java** | 17+ supported, 25+ recommended (annotation processors) |16| **Kotlin** | 1.9+ on JDK 21 (KSP) |17| **Build** | Gradle 7+ supported, 9+ recommended (wrapper pins 9.5.1) |1819**This meta-skill is the single entry point for Kora Framework development.** It routes to 39 specialized domain skills, each with its own narrow area of expertise.2021**Read this file first when:**22- Starting a new Kora microservice project from scratch (Java or Kotlin)23- Adding or refactoring `@KoraApp` application graph with `*Module` interfaces24- Choosing which Kora modules to plug in (HTTP, Database, Kafka, gRPC, SOAP, S3, Telemetry)25- Debugging DI container issues ("dependency not found", ambiguous bindings, graph build failures)26- Configuring typed config with `@ConfigSource` and environment variable substitution27- Planning a multi-module Gradle project with `@KoraSubmodule` boundaries2829---3031## 1. Operating rules3233Four rules. They apply to **every** Kora task, on every turn, from the first message.34Each is stated once — here.3536R0 is a **gate**: satisfy it before doing anything else. R1–R3 govern the work itself.3738### R0 — Ground the workspace before starting3940The upstream documentation and the runnable example apps are levels 4–5 of the R1 chain and the41final authority for every Kora question. They must be on disk **before** you begin, not fetched42reactively once you are already stuck.4344**Run this at the start of every Kora task.** It is idempotent — it does nothing when the material45is already present, so there is no cost to running it every time:4647```bash48if [ ! -d .kora-agent/kora-docs ] || [ ! -d .kora-agent/kora-examples ]; then49 mkdir -p .kora-agent50 [ -d .kora-agent/kora-docs ] \51 || git clone --depth 1 https://github.com/kora-projects/kora-docs.git .kora-agent/kora-docs52 [ -d .kora-agent/kora-examples ] \53 || git clone --depth 1 https://github.com/kora-projects/kora-examples.git .kora-agent/kora-examples54 rm -rf .kora-agent/kora-docs/.git .kora-agent/kora-examples/.git55 grep -qxF '.kora-agent/' .gitignore 2>/dev/null || echo '.kora-agent/' >> .gitignore56fi57```5859**Gate:** `.kora-agent/kora-docs/` and `.kora-agent/kora-examples/` both exist → proceed.6061- Clone fails (no network, restricted environment) → say so explicitly and continue with sub-skills62 only. Never silently substitute recollection for the docs you could not fetch.63- Material is present but predates the Kora version in the build → re-clone before trusting it.64- The user declines the clone → note that levels 4–5 are unavailable for this session, and flag any65 answer that would normally have been verified against them.6667**Recovery:** started Kora work and only then noticed `.kora-agent/` is missing → run the block now,68then re-verify anything you already produced against it.6970### R1 — Route before you write7172Resolve every Kora question through this chain, in order. Stop at the first level that answers it.7374```751. This file → pick the sub-skill762. skills/<sub-skill>/SKILL.md → the actual expertise, templates, scripts773. skills/<sub-skill>/references/ → detailed patterns for that domain784. kora-journal (search) → known mistakes and fixes from past sessions795. .kora-agent/ docs + examples → upstream source of truth80```8182- **Never** write Kora code straight from memory. Open the sub-skill first.83- **Never** skip to level 5 because "it's a small change". Levels 2–3 hold the vetted patterns.84- Sub-skill and upstream docs disagree → upstream wins; fix the sub-skill and journal it (R3).8586**Recovery:** caught writing Kora code without having opened the sub-skill → stop, discard the87draft, open the sub-skill, rewrite.8889### R2 — Kora only, and only what is asked9091Kora is a self-contained framework with its own annotations, modules, and generated code.9293- **Never** use Spring / Micronaut / Quarkus / Helidon annotations or idioms.94- **Never** invent a Kora annotation, class, or config key. If it is not in a sub-skill,95 a `references/` file, or `.kora-agent/`, it does not exist — go verify it.96- **Never** add comments or Javadoc, unless the user asked for them or the logic is genuinely97 opaque (bit manipulation, encodings, cryptography, non-obvious protocol handling).98- **Never** mix paradigms for one target: OpenAPI-generated controller → implement its delegate,99 do not hand-write a parallel controller; Kora `@HttpClient` → do not also call the same service100 with a raw HTTP library.101- **Always** express behaviour through Kora's compile-time model — no reflection, no runtime proxies.102103**Recovery:** a framework foreign to Kora slipped in → delete it, re-derive from the sub-skill,104journal it (R3).105106### R3 — Journal incorrect Kora usage107108When you realise — or the user tells you — that you used **the Kora Framework** incorrectly,109record it. This is the feedback loop that improves the skills.110111| Record | Do not record |112|---|---|113| Wrong Kora annotation used | Business / domain logic |114| Hallucinated Kora API or config key | Project-specific workarounds |115| Kora pattern misapplied (DI, AOP, config, telemetry) | Non-Kora issues |116| Kora best practice from a sub-skill violated | UI/UX or style preferences |117| Sub-skill documentation wrong, stale, or unclear | Anything already correct |118| Unrequested comments/Javadoc written (R2 breach) | |119120Entries are one file each, at `~/.kora-journal/<project>/<module>/<YYYY-MM-DD>_slug.md`, shared121across all projects and sessions. Full CLI and workflow:122[`skills/kora-journal/SKILL.md`](skills/kora-journal/SKILL.md).123124**Recovery:** discovered a Kora mistake and moved on without an entry → add the entry now.125126---127128## 2. Per-task procedure129130Follow these steps for every Kora request. Do not compress them.1311320. **Satisfy R0** — run the grounding block, confirm `.kora-agent/` holds both repositories.133 Do not begin step 1 until this gate passes or you have told the user it cannot.1341. **Classify** the request against the routing tables in §3. More than one domain → handle them135 one at a time, in dependency order (project setup → config → DI → domain modules → telemetry → tests).1362. **Read** the sub-skill's `SKILL.md` end to end, then the `references/` entries it points at137 for your case.1383. **Search the journal** before implementing anything non-trivial:139 ```bash140 # path is relative to this skill's own directory, not the project you are working in141 python skills/kora-journal/scripts/kora_journal.py search "http interceptor auth" --limit 5142 ```143 Hit → apply it, then mark it applied with `integrate <entry-file>`.144 Miss → continue, and expect to add an entry afterwards under R3.1454. **Implement** in the smallest increment that compiles — one annotation, method, or class at a time.1465. **Compile** — `./gradlew clean classes`. Mandatory after any annotation change; the annotation147 processors, not the compiler, are what actually validate Kora code.1486. **Test** — write `@KoraAppTest` / Testcontainers coverage for real endpoints, queries, and149 messages, then `./gradlew test`.1507. **Verify the rules** — R1 route followed, R2 no foreign framework and no stray comments,151 R3 journal entry added for any Kora mistake made along the way.152153**Definition of done:** it compiles, tests pass, no rule was violated, journal updated if applicable.154155### Build commands156157| Purpose | Command |158|---|---|159| Compile + run annotation processors / KSP | `./gradlew clean classes` |160| Run tests | `./gradlew test` |161| Build hangs, or `clean` fails with "Unable to delete directory" | `./gradlew --stop`, then retry |162163---164165## 3. Sub-skill routing166167Read the matching sub-skill's `SKILL.md` **before** writing any code for that domain (R1).168169### Foundation — start here for new projects170171| When the task is about | Sub-skill |172|---|---|173| Gradle scaffolding, wrapper, build scripts, project layout (Java) | [`kora-project-setup-java`](skills/kora-project-setup-java/SKILL.md) |174| Gradle scaffolding, KSP, Kotlin DSL (Kotlin) | [`kora-project-setup-kotlin`](skills/kora-project-setup-kotlin/SKILL.md) |175| Kora BOM, module artifacts, annotation processors, dependency choices | [`kora-project-dependencies`](skills/kora-project-dependencies/SKILL.md) |176| Generating a runnable starter project (Initializr-style) | [`generate_project.py`](skills/kora-project-dependencies/scripts/generate_project.py) |177| HOCON config, typed `@ConfigSource`, env substitution | [`kora-config-hocon`](skills/kora-config-hocon/SKILL.md) |178| YAML config (alternative to HOCON) | [`kora-config-yaml`](skills/kora-config-yaml/SKILL.md) |179180### Dependency injection181182| When the task is about | Sub-skill |183|---|---|184| `@KoraApp`, `@Component`, `@Module`, factory methods, `@KoraSubmodule`, graph build failures | [`kora-di-compile`](skills/kora-di-compile/SKILL.md) |185| `@Root`, `Lifecycle`, `@Tag`, `All<T>`, `ValueOf<T>` | [`kora-di-runtime`](skills/kora-di-runtime/SKILL.md) |186187### Database188189| When the task is about | Sub-skill |190|---|---|191| JDBC repositories, `@EntityJdbc`, `@Query`, SQL macros, transactions, Hikari | [`kora-database-jdbc`](skills/kora-database-jdbc/SKILL.md) |192| Cassandra, `@EntityCassandra`, `@UDT`, CQL, driver profiles | [`kora-database-cassandra`](skills/kora-database-cassandra/SKILL.md) |193| Flyway / Liquibase migrations, SQL versioning | [`kora-database-migration`](skills/kora-database-migration/SKILL.md) |194195### Communication196197| When the task is about | Sub-skill |198|---|---|199| HTTP server, `@HttpController`, `@HttpRoute`, `@Path`, `@Query`, interceptors | [`kora-http-server`](skills/kora-http-server/SKILL.md) |200| HTTP server auth — BasicAuth, Bearer, API keys, `SecurityContext`, principals | [`kora-http-server-auth`](skills/kora-http-server-auth/SKILL.md) |201| HTTP client, `@HttpClient`, declarative interfaces, interceptors, response mappers | [`kora-http-client`](skills/kora-http-client/SKILL.md) |202| HTTP client auth — BasicAuth, Bearer, API keys, token refresh | [`kora-http-client-auth`](skills/kora-http-client-auth/SKILL.md) |203| gRPC server, `GrpcServerModule`, service handlers | [`kora-grpc-server`](skills/kora-grpc-server/SKILL.md) |204| gRPC client, `GrpcClientModule`, `@Tag` stub injection | [`kora-grpc-client`](skills/kora-grpc-client/SKILL.md) |205| SOAP / WSDL client, `SoapClientModule`, generated clients | [`kora-soap-client`](skills/kora-soap-client/SKILL.md) |206| Kafka publishing, `@KafkaPublisher`, transactional producers | [`kora-kafka-producer`](skills/kora-kafka-producer/SKILL.md) |207| Kafka consuming, `@KafkaListener`, batch mode, error handling | [`kora-kafka-consumer`](skills/kora-kafka-consumer/SKILL.md) |208| OpenAPI → server code, delegates, controllers | [`kora-openapi-generator-server`](skills/kora-openapi-generator-server/SKILL.md) |209| OpenAPI → client code, typed `Api` interfaces | [`kora-openapi-generator-client`](skills/kora-openapi-generator-client/SKILL.md) |210| Serving the spec — Swagger UI, RapiDoc, publishing | [`kora-openapi-management`](skills/kora-openapi-management/SKILL.md) |211| JSON DTOs, `@Json`, sealed discriminators, custom (de)serialization | [`kora-json`](skills/kora-json/SKILL.md) |212213### Telemetry214215| When the task is about | Sub-skill |216|---|---|217| OpenTelemetry tracing, OTLP export, spans, Jaeger/Zipkin | [`kora-telemetry-tracing`](skills/kora-telemetry-tracing/SKILL.md) |218| Micrometer metrics, Prometheus scrape endpoint, custom meters | [`kora-telemetry-metrics`](skills/kora-telemetry-metrics/SKILL.md) |219| SLF4J / Logback, structured logs, `KoraAsyncAppender` | [`kora-telemetry-logging`](skills/kora-telemetry-logging/SKILL.md) |220221### AOP222223| When the task is about | Sub-skill |224|---|---|225| `@Retry`, `@CircuitBreaker`, `@Timeout`, `@Fallback` | [`kora-aop-resilient`](skills/kora-aop-resilient/SKILL.md) |226| `@Log`, `@Mdc`, method logging aspects | [`kora-aop-logging`](skills/kora-aop-logging/SKILL.md) |227| `@Cacheable`, `@CachePut`, `@CacheInvalidate`, Caffeine / Redis | [`kora-aop-caching`](skills/kora-aop-caching/SKILL.md) |228| `@ScheduleAtFixedRate`, `@ScheduleWithCron` (JDK executor) | [`kora-aop-scheduling-jdk`](skills/kora-aop-scheduling-jdk/SKILL.md) |229| Quartz scheduling, clustered jobs, job stores | [`kora-aop-scheduling-quartz`](skills/kora-aop-scheduling-quartz/SKILL.md) |230| `@Valid`, `@Validate`, constraint annotations, custom validators | [`kora-aop-validation`](skills/kora-aop-validation/SKILL.md) |231232### Testing233234| When the task is about | Sub-skill |235|---|---|236| `@KoraAppTest`, `@TestComponent`, mocks, JUnit 5 (Java) | [`kora-testing-junit-java`](skills/kora-testing-junit-java/SKILL.md) |237| `@KoraAppTest`, MockK, JUnit 5 (Kotlin) | [`kora-testing-junit-kotlin`](skills/kora-testing-junit-kotlin/SKILL.md) |238| Black-box E2E, `AppContainer`, Testcontainers, Docker | [`kora-testing-blackbox`](skills/kora-testing-blackbox/SKILL.md) |239240### Other241242| When the task is about | Sub-skill |243|---|---|244| S3 object storage, `@S3.Client`, AWS S3 / MinIO, multipart uploads | [`kora-s3`](skills/kora-s3/SKILL.md) |245| MapStruct mappers, DTO ↔ entity mapping | [`kora-mapstruct`](skills/kora-mapstruct/SKILL.md) |246| Recording incorrect Kora usage (R3), searching past mistakes | [`kora-journal`](skills/kora-journal/SKILL.md) |247| Teaching Kora, guided tutorials, explaining concepts to a newcomer | [`kora-teacher`](skills/kora-teacher/SKILL.md) |248249---250251## 4. Architecture facts that drive decisions252253- **Everything is generated at compile time.** DI → `*ComponentImpl` / `*Graph`, HTTP →254 `*HttpRouter`, AOP → `*Aspect`, JSON → `*JsonReader` / `*JsonWriter`, repositories →255 `*RepositoryImpl`, OpenAPI → `*Delegate`. No reflection, no dynamic proxies, no runtime scanning.256- **The generated sources are the ground truth.** When wiring or aspect behaviour is unclear,257 read them:258 - Java: `build/generated/sources/annotationProcessor/`259 - Kotlin: `build/generated/ksp/`260- **Compilation is the primary validator.** If it compiles and the tests pass, the wiring is correct.261- **Aspects need a non-final target.** In Kotlin an AOP-annotated class and method must be `open`,262 otherwise the aspect is silently not generated.263264### Troubleshooting265266| Symptom | Action |267|---|---|268| `Required dependency was not found: Foo` | Check `@Component` on the class, the `*Module` is extended by `@KoraApp`, and `@KoraSubmodule` exists in multi-module builds |269| Ambiguous dependency / more than one candidate | Disambiguate with `@Tag`, or inject `All<T>` |270| `ApplicationGraph` missing after `clean` | Run `./gradlew classes` — processors must run before anything references the graph |271| Aspect annotation has no effect | Annotation processor / KSP dependency missing, or the Kotlin class is not `open` |272| Generated classes stale or broken after a refactor | Delete `build/generated/`, rebuild |273| Build hangs, or `clean` fails to delete a directory | `./gradlew --stop`, then retry |274| IDE shows errors but Gradle compiles fine | IDE caching — invalidate caches and restart |275| Behaviour contradicts a sub-skill | Verify against `.kora-agent/` docs, fix the sub-skill, journal it (R3) |276277---278279## 5. Upstream sources280281Availability of this material is **R0**, the gate in §1 — it is a precondition for starting work,282not a step you reach once you need it.283284### Where to look285286Module-by-module map of docs, guides, and runnable example apps — plus the areas this plugin does287not cover: [`references/kora-docs-map.md`](references/kora-docs-map.md).