# I built a routing CLI so AI agents don't skip Room migrations, coroutine ownership, and lifecycle boundaries

> Source: <https://dev.to/ranaahmedhamdy/i-built-a-routing-cli-so-ai-agents-dont-skip-room-migrations-coroutine-ownership-and-lifecycle-1oh6>
> Published: 2026-08-26 06:21:17+00:00

Coding agents handle "add a field, show it on screen" fine. They

consistently miss the Android boundary around it:

Room/SQLite migrations that silently corrupt existing rows

A refresh coroutine owned by a view callback instead of the ViewModel

UI collection that keeps running after the Activity stops

Lifecycle/process-death paths nobody retested

None of it shows up as a compile error.

I built AI-Workflow to make those checks deterministic. You state

observable facts about a change and a checked-in registry maps them

to required specialist procedures:

Task classification: brownfield / android / safety

Detected concerns: concurrency, lifecycle, persistence, schema_migration

Recommended tier: COMPLEX

Required checks:

android-persistence-migration-readiness: because detected persistence, schema_migration

kotlin-coroutines-readiness: because detected concurrency

protected-lifecycle-transaction-review: because detected lifecycle

android-runtime-evidence-readiness: because detected lifecycle

No LLM judgment in that mapping — it's a registry lookup, same output

every run, every agent.

Install takes one command, no clone needed:

uvx --from git+[https://github.com/RanaAhmedHamdy/AI-Workflow.git](https://github.com/RanaAhmedHamdy/AI-Workflow.git) \

ai-workflow brownfield --platform android --profile safety \

--target /path/to/your-android-app --dry-run

There's also a lightweight Safety profile that gives you just the

routing + protected-boundary checks without requiring a full feature

lifecycle. And a full Android fixture (SQLite migration fallback,

ViewModel coroutine ownership, lifecycle-aware Flow collection) with

unit tests and debug build verified locally.

Pre-v1, Apache-2.0, honest about what's claimed vs unclaimed.
