← All field notes
OPEN-SOURCE ENGINEERING NOTEKMP workflow

Turning our KMP workflow into reusable agent skills

Coding agents made implementation faster. The harder problem was preserving product intent, architecture boundaries, human decisions, and honest evidence across Android and iOS.

KMP Spec-Driven Skills, presenting the kmp-spec-driven-design and kmp-proof-of-parity workflows

While building Ready Together, I kept seeing the same risk: an agent could make a plausible Kotlin Multiplatform change quickly, but another session could not always explain why the code belonged in that source set, which decision had been approved, or what had actually been verified on Android and iOS.

The problem was not code generation. It was continuity. KMP features cross several boundaries at once: shared rules, platform integrations, serialized contracts, persistence, backend authority, degraded connectivity, and two different release pipelines. A short prompt can produce code. It cannot be durable project memory.

I needed a workflow that kept my engineering judgment in the loop while giving agents enough structure to work independently. The result is now a public repository: SOSMex/kmp-spec-driven-skills.

The failure mode: fast code, weak boundaries

In a multiplatform codebase, a locally reasonable shortcut can create a long-term inconsistency. A domain rule can drift into an Android host. A transport DTO can become the business model. An unknown contract value can become an optimistic default. One convenient Gradle task can pass and quietly become a claim of cross-platform parity.

The same confusion happens in the planning artifacts. A feature specification, an RFC, and an ADR answer different questions. If every change gets all three, the process turns into ceremony. If risky synchronization, privacy, billing, or compatibility choices get none of them, the decision lives only in a conversation that the next contributor cannot audit.

Skill one: design before tasks

kmp-spec-driven-design begins after a product outcome is understood and before implementation tasks are written. It first discovers the repository’s actual modules, targets, source sets, contracts, tests, and instructions. It does not assume that every KMP project looks like Ready Together.

The skill then makes four decisions explicit: the smallest vertical slice, the correct source-set or module owner, the degraded and compatibility states, and the evidence that will be required later. It also includes a decision router for choosing the lightest responsible artifact.

Outcome→Clarify→KMP design→RFC when risky→ADR after a decision→Tasks
DIRECT TASK

Clear, local, and reversible

Use a bounded task, implementation, focused verification, and a reviewable handoff.

SPEC + PLAN

Normal product behavior

Define user behavior, degraded states, boundaries, tasks, and target-aware evidence.

RFC

A risky proposal needs agreement

Use it for realtime, auth, privacy, billing, persistence, compatibility, or costly dependencies.

ADR

A durable choice was accepted

Record the decision and trade-offs after agreement; do not use an ADR as a task list.

Skill two: prove parity without inflating it

kmp-proof-of-parity starts from the claims a change is making. It traces the affected shared logic, platform adapters, backend behavior, and UI surfaces, then discovers the real Gradle tasks, Xcode schemes, CI jobs, emulators, simulators, and devices available in that repository.

Its most important output is not a green check. It is an evidence matrix. Each behavior and target receives the strongest status that the evidence supports: Compiled, Automated-tested, Emulator-tested, Physically-tested, Store-submitted, or Released.

Those labels are deliberately separate. Shared JVM tests do not prove iOS runtime behavior. An Android emulator does not close a physical Android–iPhone flow. Uploading a build does not mean it is released. The skill is designed to make the remaining gate visible instead of smoothing it over with an adjective.

Where I remain in the loop

The skills do not hand product ownership to an agent. I still define the outcome, challenge scope, approve risky proposals, accept durable decisions, and decide whether the evidence is sufficient for a public claim. Agents can inspect, draft, implement, test, and report. The repository preserves the handoff between those responsibilities.

This is especially important for KMP because “shared” is not the same as “identical.” I want deterministic product meaning to live in the broadest valid shared source set, while native lifecycle, accessibility, notifications, deep links, secure storage, and store work remain honest platform boundaries.

What the repository includes

The first tagged release contains the two skills, concise architecture and RFC/ADR references, templates for specs through handoffs, three worked examples, eight evaluation scenarios, and a deterministic validator for metadata, local links, structure, release assets, placeholders, and common secret patterns.

npx skills add SOSMex/kmp-spec-driven-skills \
+  --skill kmp-spec-driven-design \
+  --skill kmp-proof-of-parity

It is intentionally not a Gradle plugin or a full application generator. I want the workflow to become useful and testable before turning it into more tooling. Contributions can add a reproducible failure mode, a clearer decision boundary, or a stronger parity check without adopting Ready Together’s private code or product constraints.

Explore the workflow