@raishin/vanguard-frontier-agentic 3.3.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +32 -1
- package/.cursor-plugin/plugin.json +32 -1
- package/.github/plugin/marketplace.json +1 -1
- package/README.md +39 -15
- package/agents/java/README.md +73 -0
- package/agents/java/java-application-server-exit-agent/AGENT.md +59 -0
- package/agents/java/java-application-server-exit-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-application-server-exit-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-application-server-exit-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-application-server-exit-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-application-server-exit-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-application-server-exit-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-application-server-exit-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-application-server-exit-agent/metadata.json +41 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/AGENT.md +59 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-concurrency-and-virtual-thread-agent/metadata.json +41 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/AGENT.md +59 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-container-and-kubernetes-readiness-agent/metadata.json +41 -0
- package/agents/java/java-database-migration-safety-agent/AGENT.md +59 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-database-migration-safety-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-database-migration-safety-agent/metadata.json +41 -0
- package/agents/java/java-deserialization-and-parser-security-agent/AGENT.md +57 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/codex.toml +37 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/copilot.agent.md +40 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/cursor.agent.md +40 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/gemini.agent.md +40 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-deserialization-and-parser-security-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/java/java-deserialization-and-parser-security-agent/metadata.json +41 -0
- package/agents/java/java-framework-production-readiness-agent/AGENT.md +57 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/codex.toml +39 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/copilot.agent.md +40 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/cursor.agent.md +40 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/gemini.agent.md +40 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-framework-production-readiness-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/java/java-framework-production-readiness-agent/metadata.json +41 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/AGENT.md +55 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/claude-code.agent.md +38 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/codex.toml +37 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/copilot.agent.md +38 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/cursor.agent.md +38 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/gemini.agent.md +38 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/harnesses/kiro-ide.agent.md +38 -0
- package/agents/java/java-jdk-lifecycle-and-upgrade-agent/metadata.json +41 -0
- package/agents/java/java-jpa-hibernate-performance-agent/AGENT.md +57 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/claude-code.agent.md +40 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/codex.toml +38 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/copilot.agent.md +40 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/cursor.agent.md +40 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/gemini.agent.md +40 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-jpa-hibernate-performance-agent/harnesses/kiro-ide.agent.md +40 -0
- package/agents/java/java-jpa-hibernate-performance-agent/metadata.json +41 -0
- package/agents/java/java-jvm-performance-and-gc-agent/AGENT.md +60 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/claude-code.agent.md +43 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/copilot.agent.md +43 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/cursor.agent.md +43 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/gemini.agent.md +43 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-jvm-performance-and-gc-agent/harnesses/kiro-ide.agent.md +43 -0
- package/agents/java/java-jvm-performance-and-gc-agent/metadata.json +41 -0
- package/agents/java/java-kafka-reliability-agent/AGENT.md +60 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/claude-code.agent.md +43 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/copilot.agent.md +43 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/cursor.agent.md +43 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/gemini.agent.md +43 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-kafka-reliability-agent/harnesses/kiro-ide.agent.md +43 -0
- package/agents/java/java-kafka-reliability-agent/metadata.json +40 -0
- package/agents/java/java-maestro-agent/AGENT.md +51 -0
- package/agents/java/java-maestro-agent/harnesses/claude-code.agent.md +34 -0
- package/agents/java/java-maestro-agent/harnesses/codex.toml +37 -0
- package/agents/java/java-maestro-agent/harnesses/copilot.agent.md +34 -0
- package/agents/java/java-maestro-agent/harnesses/cursor.agent.md +34 -0
- package/agents/java/java-maestro-agent/harnesses/gemini.agent.md +34 -0
- package/agents/java/java-maestro-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-maestro-agent/harnesses/kiro-ide.agent.md +34 -0
- package/agents/java/java-maestro-agent/metadata.json +40 -0
- package/agents/java/java-resilience-pattern-agent/AGENT.md +59 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/codex.toml +39 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-resilience-pattern-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-resilience-pattern-agent/metadata.json +42 -0
- package/agents/java/java-spring-security-agent/AGENT.md +59 -0
- package/agents/java/java-spring-security-agent/harnesses/claude-code.agent.md +42 -0
- package/agents/java/java-spring-security-agent/harnesses/codex.toml +39 -0
- package/agents/java/java-spring-security-agent/harnesses/copilot.agent.md +42 -0
- package/agents/java/java-spring-security-agent/harnesses/cursor.agent.md +42 -0
- package/agents/java/java-spring-security-agent/harnesses/gemini.agent.md +42 -0
- package/agents/java/java-spring-security-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-spring-security-agent/harnesses/kiro-ide.agent.md +42 -0
- package/agents/java/java-spring-security-agent/metadata.json +40 -0
- package/agents/java/java-test-architecture-agent/AGENT.md +60 -0
- package/agents/java/java-test-architecture-agent/harnesses/claude-code.agent.md +43 -0
- package/agents/java/java-test-architecture-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-test-architecture-agent/harnesses/copilot.agent.md +43 -0
- package/agents/java/java-test-architecture-agent/harnesses/cursor.agent.md +43 -0
- package/agents/java/java-test-architecture-agent/harnesses/gemini.agent.md +43 -0
- package/agents/java/java-test-architecture-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-test-architecture-agent/harnesses/kiro-ide.agent.md +43 -0
- package/agents/java/java-test-architecture-agent/metadata.json +42 -0
- package/agents/java/java-transaction-and-consistency-agent/AGENT.md +58 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/claude-code.agent.md +41 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/codex.toml +40 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/copilot.agent.md +41 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/cursor.agent.md +41 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/gemini.agent.md +41 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/java/java-transaction-and-consistency-agent/harnesses/kiro-ide.agent.md +41 -0
- package/agents/java/java-transaction-and-consistency-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-android-architecture-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-android-architecture-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-android-architecture-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-android-architecture-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-android-architecture-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-android-architecture-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-android-architecture-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-android-architecture-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-android-architecture-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-android-performance-reliability-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-android-performance-reliability-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-android-performance-reliability-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-android-performance-reliability-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-android-performance-reliability-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-android-performance-reliability-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-android-performance-reliability-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-android-performance-reliability-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-android-performance-reliability-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-android-security-privacy-agent/AGENT.md +83 -0
- package/agents/kotlin/kotlin-android-security-privacy-agent/harnesses/claude-code.agent.md +66 -0
- package/agents/kotlin/kotlin-android-security-privacy-agent/harnesses/codex.toml +40 -0
- package/agents/kotlin/kotlin-android-security-privacy-agent/harnesses/copilot.agent.md +73 -0
- package/agents/kotlin/kotlin-android-security-privacy-agent/harnesses/cursor.agent.md +66 -0
- package/agents/kotlin/kotlin-android-security-privacy-agent/harnesses/gemini.agent.md +66 -0
- package/agents/kotlin/kotlin-android-security-privacy-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-android-security-privacy-agent/harnesses/kiro-ide.agent.md +66 -0
- package/agents/kotlin/kotlin-android-security-privacy-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-backend-production-readiness-agent/AGENT.md +81 -0
- package/agents/kotlin/kotlin-backend-production-readiness-agent/harnesses/claude-code.agent.md +64 -0
- package/agents/kotlin/kotlin-backend-production-readiness-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-backend-production-readiness-agent/harnesses/copilot.agent.md +71 -0
- package/agents/kotlin/kotlin-backend-production-readiness-agent/harnesses/cursor.agent.md +64 -0
- package/agents/kotlin/kotlin-backend-production-readiness-agent/harnesses/gemini.agent.md +64 -0
- package/agents/kotlin/kotlin-backend-production-readiness-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-backend-production-readiness-agent/harnesses/kiro-ide.agent.md +64 -0
- package/agents/kotlin/kotlin-backend-production-readiness-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-compose-ui-quality-accessibility-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-compose-ui-quality-accessibility-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-compose-ui-quality-accessibility-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-compose-ui-quality-accessibility-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-compose-ui-quality-accessibility-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-compose-ui-quality-accessibility-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-compose-ui-quality-accessibility-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-compose-ui-quality-accessibility-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-compose-ui-quality-accessibility-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-coroutines-flow-reliability-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-coroutines-flow-reliability-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-coroutines-flow-reliability-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-coroutines-flow-reliability-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-coroutines-flow-reliability-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-coroutines-flow-reliability-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-coroutines-flow-reliability-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-coroutines-flow-reliability-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-coroutines-flow-reliability-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-estate-modernization-governor-agent/AGENT.md +81 -0
- package/agents/kotlin/kotlin-estate-modernization-governor-agent/harnesses/claude-code.agent.md +64 -0
- package/agents/kotlin/kotlin-estate-modernization-governor-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-estate-modernization-governor-agent/harnesses/copilot.agent.md +71 -0
- package/agents/kotlin/kotlin-estate-modernization-governor-agent/harnesses/cursor.agent.md +64 -0
- package/agents/kotlin/kotlin-estate-modernization-governor-agent/harnesses/gemini.agent.md +64 -0
- package/agents/kotlin/kotlin-estate-modernization-governor-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-estate-modernization-governor-agent/harnesses/kiro-ide.agent.md +64 -0
- package/agents/kotlin/kotlin-estate-modernization-governor-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-gradle-build-engineering-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-gradle-build-engineering-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-gradle-build-engineering-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-gradle-build-engineering-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-gradle-build-engineering-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-gradle-build-engineering-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-gradle-build-engineering-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-gradle-build-engineering-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-gradle-build-engineering-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-kmp-boundary-interop-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-kmp-boundary-interop-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-kmp-boundary-interop-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-kmp-boundary-interop-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-kmp-boundary-interop-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-kmp-boundary-interop-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-kmp-boundary-interop-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-kmp-boundary-interop-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-kmp-boundary-interop-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-kmp-portfolio-decision-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-kmp-portfolio-decision-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-kmp-portfolio-decision-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-kmp-portfolio-decision-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-kmp-portfolio-decision-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-kmp-portfolio-decision-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-kmp-portfolio-decision-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-kmp-portfolio-decision-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-kmp-portfolio-decision-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-language-api-correctness-agent/AGENT.md +81 -0
- package/agents/kotlin/kotlin-language-api-correctness-agent/harnesses/claude-code.agent.md +64 -0
- package/agents/kotlin/kotlin-language-api-correctness-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-language-api-correctness-agent/harnesses/copilot.agent.md +71 -0
- package/agents/kotlin/kotlin-language-api-correctness-agent/harnesses/cursor.agent.md +64 -0
- package/agents/kotlin/kotlin-language-api-correctness-agent/harnesses/gemini.agent.md +64 -0
- package/agents/kotlin/kotlin-language-api-correctness-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-language-api-correctness-agent/harnesses/kiro-ide.agent.md +64 -0
- package/agents/kotlin/kotlin-language-api-correctness-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-library-api-abi-governance-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-library-api-abi-governance-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-library-api-abi-governance-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-library-api-abi-governance-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-library-api-abi-governance-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-library-api-abi-governance-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-library-api-abi-governance-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-library-api-abi-governance-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-library-api-abi-governance-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-maestro-agent/AGENT.md +55 -0
- package/agents/kotlin/kotlin-maestro-agent/README.md +65 -0
- package/agents/kotlin/kotlin-maestro-agent/harnesses/claude-code.agent.md +38 -0
- package/agents/kotlin/kotlin-maestro-agent/harnesses/codex.toml +37 -0
- package/agents/kotlin/kotlin-maestro-agent/harnesses/copilot.agent.md +45 -0
- package/agents/kotlin/kotlin-maestro-agent/harnesses/cursor.agent.md +38 -0
- package/agents/kotlin/kotlin-maestro-agent/harnesses/gemini.agent.md +38 -0
- package/agents/kotlin/kotlin-maestro-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-maestro-agent/harnesses/kiro-ide.agent.md +38 -0
- package/agents/kotlin/kotlin-maestro-agent/metadata.json +40 -0
- package/agents/kotlin/kotlin-serialization-wire-contract-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-serialization-wire-contract-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-serialization-wire-contract-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-serialization-wire-contract-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-serialization-wire-contract-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-serialization-wire-contract-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-serialization-wire-contract-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-serialization-wire-contract-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-serialization-wire-contract-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-supply-chain-release-integrity-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-supply-chain-release-integrity-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-supply-chain-release-integrity-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-supply-chain-release-integrity-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-supply-chain-release-integrity-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-supply-chain-release-integrity-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-supply-chain-release-integrity-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-supply-chain-release-integrity-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-supply-chain-release-integrity-agent/metadata.json +41 -0
- package/agents/kotlin/kotlin-test-architecture-agent/AGENT.md +80 -0
- package/agents/kotlin/kotlin-test-architecture-agent/harnesses/claude-code.agent.md +63 -0
- package/agents/kotlin/kotlin-test-architecture-agent/harnesses/codex.toml +39 -0
- package/agents/kotlin/kotlin-test-architecture-agent/harnesses/copilot.agent.md +70 -0
- package/agents/kotlin/kotlin-test-architecture-agent/harnesses/cursor.agent.md +63 -0
- package/agents/kotlin/kotlin-test-architecture-agent/harnesses/gemini.agent.md +63 -0
- package/agents/kotlin/kotlin-test-architecture-agent/harnesses/kiro-cli.agent.json +5 -0
- package/agents/kotlin/kotlin-test-architecture-agent/harnesses/kiro-ide.agent.md +63 -0
- package/agents/kotlin/kotlin-test-architecture-agent/metadata.json +41 -0
- package/catalog/agents.json +897 -0
- package/catalog/asset-integrity.json +1948 -48
- package/catalog/install-roles.json +180 -0
- package/catalog/model-assignments.json +1028 -5
- package/catalog/model-policy.json +5 -0
- package/catalog/skill-manifest.json +1087 -0
- package/catalog/skills.json +835 -0
- package/package.json +2 -2
- package/plugins/vanguard-frontier-agentic/.codex-plugin/plugin.json +1 -1
- package/powers/README.md +4 -2
- package/powers/vanguard-java/POWER.md +40 -0
- package/powers/vanguard-kotlin/POWER.md +40 -0
- package/schemas/agent.schema.json +18 -1
- package/schemas/skill.schema.json +27 -1
- package/scripts/gen_kotlin_agents.py +537 -0
- package/scripts/generate-docs-data.mjs +1 -1
- package/scripts/kotlin_data/agents/00-kotlin-maestro-agent.json +90 -0
- package/scripts/kotlin_data/agents/01-kotlin-estate-modernization-governor-agent.json +132 -0
- package/scripts/kotlin_data/agents/02-kotlin-language-api-correctness-agent.json +145 -0
- package/scripts/kotlin_data/agents/03-kotlin-coroutines-flow-reliability-agent.json +145 -0
- package/scripts/kotlin_data/agents/04-kotlin-library-api-abi-governance-agent.json +144 -0
- package/scripts/kotlin_data/agents/05-kotlin-backend-production-readiness-agent.json +144 -0
- package/scripts/kotlin_data/agents/06-kotlin-serialization-wire-contract-agent.json +144 -0
- package/scripts/kotlin_data/agents/07-kotlin-android-architecture-agent.json +130 -0
- package/scripts/kotlin_data/agents/08-kotlin-compose-ui-quality-accessibility-agent.json +132 -0
- package/scripts/kotlin_data/agents/09-kotlin-android-security-privacy-agent.json +147 -0
- package/scripts/kotlin_data/agents/10-kotlin-android-performance-reliability-agent.json +129 -0
- package/scripts/kotlin_data/agents/11-kotlin-kmp-portfolio-decision-agent.json +131 -0
- package/scripts/kotlin_data/agents/12-kotlin-kmp-boundary-interop-agent.json +132 -0
- package/scripts/kotlin_data/agents/13-kotlin-gradle-build-engineering-agent.json +141 -0
- package/scripts/kotlin_data/agents/14-kotlin-supply-chain-release-integrity-agent.json +139 -0
- package/scripts/kotlin_data/agents/15-kotlin-test-architecture-agent.json +140 -0
- package/scripts/update-catalog-new-agents.py +71 -42
- package/skills/java/java-application-server-exit/SKILL.md +59 -0
- package/skills/java/java-application-server-exit/metadata.json +27 -0
- package/skills/java/java-application-server-exit/references/decision-model-and-cost-inputs.md +60 -0
- package/skills/java/java-application-server-exit/references/vendor-lifecycle-sources.md +52 -0
- package/skills/java/java-application-server-exit/references/workflow-and-output.md +102 -0
- package/skills/java/java-concurrency-and-virtual-thread/SKILL.md +60 -0
- package/skills/java/java-concurrency-and-virtual-thread/metadata.json +27 -0
- package/skills/java/java-concurrency-and-virtual-thread/references/carrier-pinning-and-jdk-version-gating.md +42 -0
- package/skills/java/java-concurrency-and-virtual-thread/references/virtual-thread-lifecycle-and-resource-bounds.md +71 -0
- package/skills/java/java-concurrency-and-virtual-thread/references/workflow-and-output.md +102 -0
- package/skills/java/java-container-and-kubernetes-readiness/SKILL.md +58 -0
- package/skills/java/java-container-and-kubernetes-readiness/metadata.json +27 -0
- package/skills/java/java-container-and-kubernetes-readiness/references/cpu-and-gc-probe-interaction.md +46 -0
- package/skills/java/java-container-and-kubernetes-readiness/references/memory-headroom-and-heap-sizing.md +37 -0
- package/skills/java/java-container-and-kubernetes-readiness/references/workflow-and-output.md +103 -0
- package/skills/java/java-database-migration-safety/SKILL.md +58 -0
- package/skills/java/java-database-migration-safety/metadata.json +27 -0
- package/skills/java/java-database-migration-safety/references/expand-contract-and-destructive-ddl.md +57 -0
- package/skills/java/java-database-migration-safety/references/migration-integrity-and-ordering.md +51 -0
- package/skills/java/java-database-migration-safety/references/workflow-and-output.md +95 -0
- package/skills/java/java-deserialization-and-parser-security/SKILL.md +53 -0
- package/skills/java/java-deserialization-and-parser-security/metadata.json +27 -0
- package/skills/java/java-deserialization-and-parser-security/references/sink-hardening-catalog.md +56 -0
- package/skills/java/java-deserialization-and-parser-security/references/workflow-and-output.md +78 -0
- package/skills/java/java-framework-production-readiness/SKILL.md +59 -0
- package/skills/java/java-framework-production-readiness/metadata.json +27 -0
- package/skills/java/java-framework-production-readiness/references/framework-readiness-checklist.md +78 -0
- package/skills/java/java-framework-production-readiness/references/framework-support-and-eol-boundaries.md +47 -0
- package/skills/java/java-framework-production-readiness/references/workflow-and-output.md +108 -0
- package/skills/java/java-jdk-lifecycle-and-upgrade/SKILL.md +54 -0
- package/skills/java/java-jdk-lifecycle-and-upgrade/metadata.json +27 -0
- package/skills/java/java-jdk-lifecycle-and-upgrade/references/jdk-support-and-license-boundaries.md +61 -0
- package/skills/java/java-jdk-lifecycle-and-upgrade/references/lts-migration-and-language-features.md +159 -0
- package/skills/java/java-jdk-lifecycle-and-upgrade/references/workflow-and-output.md +101 -0
- package/skills/java/java-jpa-hibernate-performance/SKILL.md +53 -0
- package/skills/java/java-jpa-hibernate-performance/metadata.json +27 -0
- package/skills/java/java-jpa-hibernate-performance/references/fetch-strategy-and-pool-evidence.md +45 -0
- package/skills/java/java-jpa-hibernate-performance/references/workflow-and-output.md +94 -0
- package/skills/java/java-jvm-performance-and-gc/SKILL.md +59 -0
- package/skills/java/java-jvm-performance-and-gc/metadata.json +27 -0
- package/skills/java/java-jvm-performance-and-gc/references/allocation-pressure-and-oom-triage.md +58 -0
- package/skills/java/java-jvm-performance-and-gc/references/collector-selection-and-refusal-contract.md +44 -0
- package/skills/java/java-jvm-performance-and-gc/references/workflow-and-output.md +101 -0
- package/skills/java/java-kafka-reliability/SKILL.md +58 -0
- package/skills/java/java-kafka-reliability/metadata.json +26 -0
- package/skills/java/java-kafka-reliability/references/exactly-once-and-delivery-semantics.md +64 -0
- package/skills/java/java-kafka-reliability/references/ordering-lag-rebalance-and-durability.md +50 -0
- package/skills/java/java-kafka-reliability/references/workflow-and-output.md +107 -0
- package/skills/java/java-maestro/SKILL.md +111 -0
- package/skills/java/java-maestro/metadata.json +26 -0
- package/skills/java/java-resilience-pattern/SKILL.md +60 -0
- package/skills/java/java-resilience-pattern/metadata.json +28 -0
- package/skills/java/java-resilience-pattern/references/aspect-order-and-composition.md +59 -0
- package/skills/java/java-resilience-pattern/references/isolation-and-timeout-budgets.md +57 -0
- package/skills/java/java-resilience-pattern/references/workflow-and-output.md +103 -0
- package/skills/java/java-spring-security/SKILL.md +60 -0
- package/skills/java/java-spring-security/metadata.json +26 -0
- package/skills/java/java-spring-security/references/actuator-endpoint-exposure-catalog.md +45 -0
- package/skills/java/java-spring-security/references/filter-chain-and-authorization-catalog.md +69 -0
- package/skills/java/java-spring-security/references/workflow-and-output.md +79 -0
- package/skills/java/java-test-architecture/SKILL.md +64 -0
- package/skills/java/java-test-architecture/metadata.json +28 -0
- package/skills/java/java-test-architecture/references/junit5-isolation-and-parallelism.md +59 -0
- package/skills/java/java-test-architecture/references/testcontainers-and-archunit-discipline.md +71 -0
- package/skills/java/java-test-architecture/references/workflow-and-output.md +101 -0
- package/skills/java/java-transaction-and-consistency/SKILL.md +60 -0
- package/skills/java/java-transaction-and-consistency/metadata.json +27 -0
- package/skills/java/java-transaction-and-consistency/references/dual-write-outbox-and-saga-patterns.md +125 -0
- package/skills/java/java-transaction-and-consistency/references/propagation-isolation-and-proxy-pitfalls.md +112 -0
- package/skills/java/java-transaction-and-consistency/references/workflow-and-output.md +94 -0
- package/skills/kotlin/kotlin-android-architecture/SKILL.md +62 -0
- package/skills/kotlin/kotlin-android-architecture/metadata.json +27 -0
- package/skills/kotlin/kotlin-android-architecture/references/lifecycle-aware-collection-and-udf.md +12 -0
- package/skills/kotlin/kotlin-android-architecture/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-android-architecture/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-android-architecture/references/viewmodel-lifecycle-and-state-persistence.md +12 -0
- package/skills/kotlin/kotlin-android-performance-reliability/SKILL.md +62 -0
- package/skills/kotlin/kotlin-android-performance-reliability/metadata.json +27 -0
- package/skills/kotlin/kotlin-android-performance-reliability/references/jank-anr-and-regression-gating.md +12 -0
- package/skills/kotlin/kotlin-android-performance-reliability/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-android-performance-reliability/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-android-performance-reliability/references/startup-and-baseline-profiles.md +11 -0
- package/skills/kotlin/kotlin-android-security-privacy/SKILL.md +64 -0
- package/skills/kotlin/kotlin-android-security-privacy/metadata.json +27 -0
- package/skills/kotlin/kotlin-android-security-privacy/references/component-exposure-and-intents.md +12 -0
- package/skills/kotlin/kotlin-android-security-privacy/references/masvs-mapping.md +12 -0
- package/skills/kotlin/kotlin-android-security-privacy/references/network-webview-and-storage.md +12 -0
- package/skills/kotlin/kotlin-android-security-privacy/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-android-security-privacy/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-backend-production-readiness/SKILL.md +63 -0
- package/skills/kotlin/kotlin-backend-production-readiness/metadata.json +27 -0
- package/skills/kotlin/kotlin-backend-production-readiness/references/ktor-lifecycle-and-graceful-shutdown.md +12 -0
- package/skills/kotlin/kotlin-backend-production-readiness/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-backend-production-readiness/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-backend-production-readiness/references/spring-webflux-coroutine-handlers.md +11 -0
- package/skills/kotlin/kotlin-backend-production-readiness/references/status-pages-and-error-mapping.md +12 -0
- package/skills/kotlin/kotlin-compose-ui-quality-accessibility/SKILL.md +62 -0
- package/skills/kotlin/kotlin-compose-ui-quality-accessibility/metadata.json +27 -0
- package/skills/kotlin/kotlin-compose-ui-quality-accessibility/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-compose-ui-quality-accessibility/references/recomposition-stability-and-side-effects.md +13 -0
- package/skills/kotlin/kotlin-compose-ui-quality-accessibility/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-compose-ui-quality-accessibility/references/state-hoisting-and-accessibility.md +13 -0
- package/skills/kotlin/kotlin-coroutines-flow-reliability/SKILL.md +62 -0
- package/skills/kotlin/kotlin-coroutines-flow-reliability/metadata.json +27 -0
- package/skills/kotlin/kotlin-coroutines-flow-reliability/references/dispatchers-blocking-and-context.md +13 -0
- package/skills/kotlin/kotlin-coroutines-flow-reliability/references/flow-state-sharing-and-backpressure.md +12 -0
- package/skills/kotlin/kotlin-coroutines-flow-reliability/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-coroutines-flow-reliability/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-coroutines-flow-reliability/references/structured-concurrency-and-cancellation.md +13 -0
- package/skills/kotlin/kotlin-estate-modernization-governor/SKILL.md +62 -0
- package/skills/kotlin/kotlin-estate-modernization-governor/metadata.json +27 -0
- package/skills/kotlin/kotlin-estate-modernization-governor/references/interop-boundary-and-converter-governance.md +12 -0
- package/skills/kotlin/kotlin-estate-modernization-governor/references/migration-sequencing-and-reversibility.md +13 -0
- package/skills/kotlin/kotlin-estate-modernization-governor/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-estate-modernization-governor/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-gradle-build-engineering/SKILL.md +62 -0
- package/skills/kotlin/kotlin-gradle-build-engineering/metadata.json +27 -0
- package/skills/kotlin/kotlin-gradle-build-engineering/references/annotation-processing-kapt-vs-ksp.md +11 -0
- package/skills/kotlin/kotlin-gradle-build-engineering/references/configuration-cache-and-build-cache.md +13 -0
- package/skills/kotlin/kotlin-gradle-build-engineering/references/convention-plugins-and-build-logic.md +10 -0
- package/skills/kotlin/kotlin-gradle-build-engineering/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-gradle-build-engineering/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-kmp-boundary-interop/SKILL.md +62 -0
- package/skills/kotlin/kotlin-kmp-boundary-interop/metadata.json +27 -0
- package/skills/kotlin/kotlin-kmp-boundary-interop/references/native-runtime-and-swift-interop.md +13 -0
- package/skills/kotlin/kotlin-kmp-boundary-interop/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-kmp-boundary-interop/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-kmp-boundary-interop/references/source-sets-expect-actual-and-leakage.md +13 -0
- package/skills/kotlin/kotlin-kmp-portfolio-decision/SKILL.md +62 -0
- package/skills/kotlin/kotlin-kmp-portfolio-decision/metadata.json +27 -0
- package/skills/kotlin/kotlin-kmp-portfolio-decision/references/adoption-factors-and-team-topology.md +12 -0
- package/skills/kotlin/kotlin-kmp-portfolio-decision/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-kmp-portfolio-decision/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-kmp-portfolio-decision/references/scope-boundaries-and-reversibility.md +13 -0
- package/skills/kotlin/kotlin-language-api-correctness/SKILL.md +63 -0
- package/skills/kotlin/kotlin-language-api-correctness/metadata.json +27 -0
- package/skills/kotlin/kotlin-language-api-correctness/references/extension-dispatch-and-lateinit.md +12 -0
- package/skills/kotlin/kotlin-language-api-correctness/references/inline-reified-and-value-classes.md +12 -0
- package/skills/kotlin/kotlin-language-api-correctness/references/nullability-and-java-interop.md +12 -0
- package/skills/kotlin/kotlin-language-api-correctness/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-language-api-correctness/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-library-api-abi-governance/SKILL.md +63 -0
- package/skills/kotlin/kotlin-library-api-abi-governance/metadata.json +27 -0
- package/skills/kotlin/kotlin-library-api-abi-governance/references/binary-compatibility-validator-and-explicit-api.md +12 -0
- package/skills/kotlin/kotlin-library-api-abi-governance/references/data-class-and-inline-abi-surface.md +12 -0
- package/skills/kotlin/kotlin-library-api-abi-governance/references/jvm-facing-surface-annotations.md +12 -0
- package/skills/kotlin/kotlin-library-api-abi-governance/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-library-api-abi-governance/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-maestro/SKILL.md +58 -0
- package/skills/kotlin/kotlin-maestro/metadata.json +26 -0
- package/skills/kotlin/kotlin-maestro/references/official-sources.md +13 -0
- package/skills/kotlin/kotlin-maestro/references/routing-taxonomy.md +7 -0
- package/skills/kotlin/kotlin-maestro/references/safety-checklist.md +20 -0
- package/skills/kotlin/kotlin-serialization-wire-contract/SKILL.md +63 -0
- package/skills/kotlin/kotlin-serialization-wire-contract/metadata.json +27 -0
- package/skills/kotlin/kotlin-serialization-wire-contract/references/decode-strictness-and-schema-evolution.md +12 -0
- package/skills/kotlin/kotlin-serialization-wire-contract/references/encode-defaults-and-null-handling.md +12 -0
- package/skills/kotlin/kotlin-serialization-wire-contract/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-serialization-wire-contract/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-serialization-wire-contract/references/sealed-polymorphism-and-discriminators.md +12 -0
- package/skills/kotlin/kotlin-supply-chain-release-integrity/SKILL.md +62 -0
- package/skills/kotlin/kotlin-supply-chain-release-integrity/metadata.json +27 -0
- package/skills/kotlin/kotlin-supply-chain-release-integrity/references/dependency-verification-and-locking.md +12 -0
- package/skills/kotlin/kotlin-supply-chain-release-integrity/references/kmp-publication-controls.md +10 -0
- package/skills/kotlin/kotlin-supply-chain-release-integrity/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-supply-chain-release-integrity/references/plugin-trust-and-repository-scope.md +10 -0
- package/skills/kotlin/kotlin-supply-chain-release-integrity/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-test-architecture/SKILL.md +62 -0
- package/skills/kotlin/kotlin-test-architecture/metadata.json +27 -0
- package/skills/kotlin/kotlin-test-architecture/references/compose-and-android-test-boundary.md +11 -0
- package/skills/kotlin/kotlin-test-architecture/references/official-sources.md +14 -0
- package/skills/kotlin/kotlin-test-architecture/references/runtest-and-dispatcher-control.md +12 -0
- package/skills/kotlin/kotlin-test-architecture/references/safety-checklist.md +22 -0
- package/skills/kotlin/kotlin-test-architecture/references/turbine-flow-testing.md +10 -0
- package/tests/fixtures/java-maestro-routing/expected/001-happy-application-server-exit.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/002-happy-concurrency-and-virtual-thread.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/003-happy-container-and-kubernetes-readiness.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/004-happy-database-migration-safety.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/005-happy-deserialization-and-parser-security.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/006-happy-framework-production-readiness.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/007-happy-jdk-lifecycle-and-upgrade.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/008-happy-jpa-hibernate-performance.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/009-happy-jvm-performance-and-gc.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/010-happy-kafka-reliability.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/011-happy-resilience-pattern.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/012-happy-spring-security.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/013-happy-test-architecture.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/014-happy-transaction-and-consistency.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/java-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/java-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/java-maestro-routing/inputs/001-happy-application-server-exit.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/002-happy-concurrency-and-virtual-thread.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/003-happy-container-and-kubernetes-readiness.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/004-happy-database-migration-safety.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/005-happy-deserialization-and-parser-security.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/006-happy-framework-production-readiness.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/007-happy-jdk-lifecycle-and-upgrade.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/008-happy-jpa-hibernate-performance.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/009-happy-jvm-performance-and-gc.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/010-happy-kafka-reliability.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/011-happy-resilience-pattern.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/012-happy-spring-security.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/013-happy-test-architecture.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/014-happy-transaction-and-consistency.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/java-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/java-maestro-routing/taxonomy.json +177 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/001-happy-android-architecture.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/002-happy-android-performance-reliability.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/003-happy-android-security-privacy.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/004-happy-backend-production-readiness.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/005-happy-compose-ui-quality-accessibility.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/006-happy-coroutines-flow-reliability.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/007-happy-estate-modernization-governor.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/008-happy-gradle-build-engineering.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/009-happy-kmp-boundary-interop.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/010-happy-kmp-portfolio-decision.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/011-happy-language-api-correctness.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/012-happy-library-api-abi-governance.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/013-happy-serialization-wire-contract.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/014-happy-supply-chain-release-integrity.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/015-happy-test-architecture.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/adv-ambiguous.json +4 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/adv-instruction-injection.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/adv-mutation-deploy.json +4 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/adv-mutation-publish.json +4 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/adv-persona-replacement.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/expected/adv-secrets-bait.json +6 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/001-happy-android-architecture.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/002-happy-android-performance-reliability.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/003-happy-android-security-privacy.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/004-happy-backend-production-readiness.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/005-happy-compose-ui-quality-accessibility.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/006-happy-coroutines-flow-reliability.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/007-happy-estate-modernization-governor.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/008-happy-gradle-build-engineering.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/009-happy-kmp-boundary-interop.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/010-happy-kmp-portfolio-decision.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/011-happy-language-api-correctness.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/012-happy-library-api-abi-governance.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/013-happy-serialization-wire-contract.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/014-happy-supply-chain-release-integrity.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/015-happy-test-architecture.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/adv-ambiguous.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/adv-instruction-injection.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/adv-mutation-deploy.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/adv-mutation-publish.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/adv-persona-replacement.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/inputs/adv-secrets-bait.json +7 -0
- package/tests/fixtures/kotlin-maestro-routing/taxonomy.json +182 -0
- package/tests/validate-catalog.py +2 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "kotlin-backend-production-readiness-agent",
|
|
3
|
+
"name": "Kotlin Backend Production Readiness Agent",
|
|
4
|
+
"domain_key": "backend-production-readiness",
|
|
5
|
+
"routing_keywords": ["Ktor", "graceful shutdown", "StatusPages", "server lifecycle", "health check", "Spring WebFlux", "suspend controller", "Netty", "CIO engine", "readiness"],
|
|
6
|
+
"summary": "Static review of production readiness for Ktor servers and the Kotlin-on-Spring coroutine surface: server lifecycle/monitoring events, Netty/CIO graceful-shutdown configuration, StatusPages typed error mapping, resource cleanup on shutdown, and correctly routing the coroutine-context-loss hazard behind suspend WebFlux handlers. Reads source and sanitized config only.",
|
|
7
|
+
"official_docs": [
|
|
8
|
+
"https://ktor.io/docs/server-events.html",
|
|
9
|
+
"https://ktor.io/docs/server-lifecycle.html",
|
|
10
|
+
"https://docs.spring.io/spring-framework/reference/languages/kotlin/coroutines.html",
|
|
11
|
+
"https://ktor.io/docs/server-status-pages.html"
|
|
12
|
+
],
|
|
13
|
+
"security_notes": "Static review only — reads Ktor/Spring Kotlin source, routing/plugin configuration, and sanitized YAML/config; never builds, runs, deploys, or opens a live connection to a server, and never observes actual shutdown/startup timing. A readiness claim that depends on runtime behavior (actual drain time, real health-check response) is flagged as needing verification against a running instance rather than asserted. Never requests secrets, credentials, or customer data.",
|
|
14
|
+
"focus_intro": "Statically review whether a Ktor server, or a Kotlin-on-Spring service exposing `suspend` handlers, is ready for production: whether lifecycle/monitoring events are observed for startup and shutdown, whether the engine (Netty/CIO) is configured to drain in-flight connections gracefully, whether StatusPages maps exceptions to typed responses instead of leaking stack traces, whether DI-managed and AutoCloseable resources are closed on shutdown, and whether the transaction-context-loss hazard behind suspend WebFlux handlers is correctly routed to its root-cause owner rather than mis-diagnosed here.",
|
|
15
|
+
"focus_owns": [
|
|
16
|
+
"Ktor lifecycle and monitoring events: `ApplicationStarting`/`ApplicationStarted`, `ServerReady`, and `ApplicationStopPreparing`/`ApplicationStopping`/`ApplicationStopped` are the documented hooks for readiness and graceful-shutdown logic — flag a server with no `ServerReady`-gated health signal or no stop-preparing hook to drain work.",
|
|
17
|
+
"Graceful shutdown configuration: the Netty and CIO engines expose a configurable grace period/timeout to bound how long in-flight connections are drained before a forced stop — flag a production engine configuration with no explicit grace period/timeout set, or one so short it cannot plausibly drain real request latencies.",
|
|
18
|
+
"StatusPages typed exception handling: the `StatusPages` plugin maps exception types and status codes to a defined response, preventing an unhandled exception from leaking a raw stack trace or an ambiguous error to the client — flag routes with no `StatusPages` (or equivalent) installed, or an overly broad catch-all that masks distinct failure classes needed for triage.",
|
|
19
|
+
"Shutdown resource cleanup: DI-managed and `AutoCloseable`/`Closeable` resources (connection pools, schedulers, file handles) must be registered to close during the stop-preparing/stopping lifecycle rather than left to process-exit finalization — flag a resource acquired at startup with no observed shutdown-hook closure.",
|
|
20
|
+
"Readiness verdict for the application coroutine scope: the top-level server coroutine scope must be cancelled and awaited as part of graceful shutdown so in-flight coroutine work is given the same drain window as in-flight connections — flag a shutdown path that stops accepting connections but never cancels/joins the application-level coroutine scope.",
|
|
21
|
+
"Spring WebFlux `suspend` handler readiness (surface only, not coroutine correctness): Spring WebFlux has supported `suspend` `@RestController` handler functions since Spring 5.2 — confirm the readiness-relevant surface (health/actuator reachability through the coroutine handler, centralized exception-mapping coverage for suspend handlers) without claiming or re-diagnosing coroutine-context correctness, which is out of scope here."
|
|
22
|
+
],
|
|
23
|
+
"focus_not_owns": [
|
|
24
|
+
"Coroutine correctness and context propagation — including the imperative `@Transactional` ThreadLocal-bound context that can be lost across a suspend/dispatcher switch → `kotlin-coroutines-flow-reliability-agent`.",
|
|
25
|
+
"Generic Spring Boot readiness (actuator endpoints, generic configuration) and generic Spring Security → `java-framework-production-readiness-agent`, `java-spring-security-agent`.",
|
|
26
|
+
"Wire/serialization contract safety (kotlinx.serialization schema evolution, polymorphism) → `kotlin-serialization-wire-contract-agent`.",
|
|
27
|
+
"Kotlin language-level correctness (nullability platform types, value-class boxing, extension dispatch) unrelated to server readiness → `kotlin-language-api-correctness-agent`."
|
|
28
|
+
],
|
|
29
|
+
"operating_rules": [
|
|
30
|
+
"CRITICAL — a production Ktor deployment with no explicit graceful-shutdown grace period/timeout configured on its engine (Netty/CIO) risks in-flight requests being dropped mid-response on deploy or restart; require an explicit, latency-informed grace period and confirm it is wired to the actual engine in use, since Netty and CIO differ in configuration surface and must be verified against the source, not assumed.",
|
|
31
|
+
"CRITICAL — imperative Spring `@Transactional` is ThreadLocal-bound; a `suspend` handler that spans a dispatcher switch can silently split its unit of work, but this is a coroutine-context defect, not a readiness defect — never diagnose or fix this finding directly; route the root cause to `kotlin-coroutines-flow-reliability-agent` while this agent's own verdict is limited to whether the readiness surface (health, shutdown, error mapping) around the handler is sound.",
|
|
32
|
+
"CRITICAL — do not claim Spring WebFlux lacks support for `suspend` `@RestController` handler functions; WebFlux has supported coroutine handler functions since Spring Framework 5.2 — treat any code comment or documentation asserting otherwise as stale and flag it as a documentation defect, not a readiness gap in the code itself.",
|
|
33
|
+
"HIGH — a server exposing routes with no `StatusPages` plugin (or equivalent centralized exception mapping) installed leaks unhandled exceptions as raw stack traces or ambiguous error responses to clients; require typed exception-to-response mapping for every distinct failure class the service can produce.",
|
|
34
|
+
"HIGH — a shutdown path that stops accepting new connections but never cancels and joins the application-level coroutine scope leaves in-flight coroutine work racing process exit; require the top-level scope be cancelled and awaited as part of shutdown, with the same drain budget as connection draining.",
|
|
35
|
+
"HIGH — a DI-managed or `AutoCloseable` resource acquired at startup with no registered shutdown-time close leaks the resource on every restart and can exhaust a downstream connection limit under repeated deploys; require every such resource be closed during the stop-preparing/stopping lifecycle, not left to JVM shutdown-hook ordering.",
|
|
36
|
+
"MEDIUM — a single overly broad exception catch-all in `StatusPages` masks the distinction between a client error, a downstream dependency failure, and a genuine bug, degrading triage and alerting; require distinct handlers for the failure classes the service actually distinguishes operationally.",
|
|
37
|
+
"MEDIUM — readiness (can serve traffic) and liveness (is the process healthy) are distinct signals; a `ServerReady` event alone does not prove downstream dependencies are reachable — flag a readiness check that reports ready before confirming its own hard dependencies, or that conflates the two signals into one endpoint.",
|
|
38
|
+
"LOW — a startup-time failure that is logged but does not prevent `ApplicationStarted`/`ServerReady` from firing lets the process report healthy while actually degraded; require startup validation to fail fast rather than degrade silently into a ready state."
|
|
39
|
+
],
|
|
40
|
+
"response_shape": [
|
|
41
|
+
"Verdict (pass / pass-with-conditions / block)",
|
|
42
|
+
"Evidence level and which engine (Netty/CIO) and framework (Ktor / Spring WebFlux) is assumed",
|
|
43
|
+
"Lifecycle and shutdown findings (event coverage, grace-period/timeout configuration, coroutine-scope cancellation)",
|
|
44
|
+
"Error-handling findings (StatusPages / exception-mapping coverage and granularity)",
|
|
45
|
+
"Resource-cleanup findings (DI/AutoCloseable resources closed on shutdown)",
|
|
46
|
+
"Readiness-vs-liveness findings (health-check accuracy, startup fail-fast behavior)",
|
|
47
|
+
"Findings (severity: critical / high / medium / low; each with an evidence-basis label)",
|
|
48
|
+
"Any coroutine-context-loss root cause routed to its owner rather than diagnosed here",
|
|
49
|
+
"Safe next actions and open questions (including any runtime drain/startup behavior needing verification)"
|
|
50
|
+
],
|
|
51
|
+
"refusal_triggers": [
|
|
52
|
+
"A request to run, deploy, or restart the server, or to observe actual shutdown/startup timing on a live instance — this agent is static review only.",
|
|
53
|
+
"A request to diagnose or fix a coroutine-context/transaction-loss defect directly instead of routing its root cause to the coroutine-reliability agent.",
|
|
54
|
+
"A request for secrets, credentials, or a live connection."
|
|
55
|
+
],
|
|
56
|
+
"escalation_triggers": [
|
|
57
|
+
"The root cause is coroutine context/transaction propagation across a suspend boundary → `kotlin-coroutines-flow-reliability-agent`.",
|
|
58
|
+
"The concern is generic Spring Boot readiness or Spring Security rather than the Kotlin/Ktor-specific surface → `java-framework-production-readiness-agent`, `java-spring-security-agent`.",
|
|
59
|
+
"The concern is wire/serialization contract safety → `kotlin-serialization-wire-contract-agent`."
|
|
60
|
+
],
|
|
61
|
+
"companion_skill": {
|
|
62
|
+
"id": "kotlin-backend-production-readiness",
|
|
63
|
+
"category": "delivery",
|
|
64
|
+
"description": "Use this skill to statically review production readiness for Ktor servers and the Kotlin-on-Spring coroutine surface: server lifecycle/monitoring events, Netty/CIO graceful-shutdown configuration, StatusPages typed exception mapping, DI/AutoCloseable resource cleanup on shutdown, and correctly routing the coroutine-context-loss hazard behind suspend WebFlux handlers to its root-cause owner. Reads source and sanitized configuration only; it never runs or deploys a server.",
|
|
65
|
+
"purpose": "This skill decides whether a Ktor server or a Kotlin-on-Spring coroutine-handler service is ready for production. A service is ready only when startup/shutdown lifecycle events are observed, the engine drains in-flight work within an explicit, latency-informed grace period, exceptions are mapped to typed responses, shutdown-time resources are closed deterministically, and readiness/liveness signals are not conflated — while any coroutine-context-loss root cause is routed to the agent that owns coroutine correctness rather than diagnosed here.",
|
|
66
|
+
"when": [
|
|
67
|
+
"A user provides Ktor server/engine configuration, StatusPages setup, or shutdown-hook code and asks whether the service is production-ready.",
|
|
68
|
+
"A user is diagnosing dropped requests on deploy, an unhandled-exception leak, a resource leak across restarts, or a health check that reports ready prematurely.",
|
|
69
|
+
"A user asks whether a Spring WebFlux service using suspend handlers is safely configured for production, and needs the transaction-context-loss root cause correctly routed rather than answered here."
|
|
70
|
+
],
|
|
71
|
+
"when_not": [
|
|
72
|
+
"The concern is coroutine correctness or `@Transactional` context propagation across a suspend boundary — route to `kotlin-coroutines-flow-reliability-agent`.",
|
|
73
|
+
"The concern is generic Spring Boot readiness (actuator, generic config) or generic Spring Security — route to `java-framework-production-readiness-agent` / `java-spring-security-agent`.",
|
|
74
|
+
"The concern is wire/serialization contract safety (kotlinx.serialization) — route to `kotlin-serialization-wire-contract-agent`.",
|
|
75
|
+
"The concern is Kotlin language-level correctness unrelated to server readiness — route to `kotlin-language-api-correctness-agent`.",
|
|
76
|
+
"The task requires actually running, deploying, or load-testing the server — this skill is static-review only."
|
|
77
|
+
],
|
|
78
|
+
"response_minimum": [
|
|
79
|
+
"A verdict (pass / pass-with-conditions / block) and the engine/framework assumed.",
|
|
80
|
+
"Lifecycle/shutdown, error-handling, resource-cleanup, and readiness-vs-liveness findings, with any coroutine-context root cause explicitly routed rather than diagnosed here.",
|
|
81
|
+
"A severity-labelled finding list, each with an evidence-basis label, and safe next actions plus any runtime drain/startup behavior the user must confirm."
|
|
82
|
+
],
|
|
83
|
+
"workflow_steps": [
|
|
84
|
+
"Identify the engine (Netty/CIO) and confirm an explicit, latency-informed graceful-shutdown grace period/timeout is configured.",
|
|
85
|
+
"Confirm lifecycle events (ApplicationStarting/Started, ServerReady, ApplicationStopPreparing/Stopping/Stopped) gate readiness and drain logic.",
|
|
86
|
+
"Review StatusPages (or equivalent) for typed, non-overbroad exception-to-response mapping.",
|
|
87
|
+
"Confirm DI-managed/AutoCloseable resources are closed during the stop-preparing/stopping lifecycle.",
|
|
88
|
+
"If a transaction/context-loss symptom appears in a suspend handler, route its root cause to kotlin-coroutines-flow-reliability-agent rather than diagnosing it here."
|
|
89
|
+
],
|
|
90
|
+
"references": [
|
|
91
|
+
{
|
|
92
|
+
"file": "ktor-lifecycle-and-graceful-shutdown.md",
|
|
93
|
+
"title": "Ktor Lifecycle And Graceful Shutdown",
|
|
94
|
+
"purpose": "Which lifecycle events gate readiness and how the engine drains in-flight work.",
|
|
95
|
+
"claims": [
|
|
96
|
+
"Ktor's application lifecycle publishes `ApplicationStarting`, `ApplicationStarted`, `ServerReady`, `ApplicationStopPreparing`, `ApplicationStopping`, and `ApplicationStopped` events; readiness signals and shutdown-time cleanup should hook these events rather than infer server state indirectly.",
|
|
97
|
+
"The Netty and CIO engines each expose a configurable grace period/timeout that bounds how long in-flight connections are given to complete before the engine forces a stop; leaving this unconfigured defers to a framework default that has not been reviewed against real request latencies.",
|
|
98
|
+
"Graceful shutdown should cancel and join the application-level coroutine scope alongside connection draining, so in-flight coroutine work is not abandoned mid-execution when the process exits."
|
|
99
|
+
],
|
|
100
|
+
"sources": [
|
|
101
|
+
"https://ktor.io/docs/server-lifecycle.html",
|
|
102
|
+
"https://ktor.io/docs/server-events.html"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"file": "status-pages-and-error-mapping.md",
|
|
107
|
+
"title": "StatusPages And Typed Error Mapping",
|
|
108
|
+
"purpose": "How centralized exception handling shapes client-visible errors and shutdown-time resource discipline.",
|
|
109
|
+
"claims": [
|
|
110
|
+
"The `StatusPages` plugin installs a centralized handler that maps exception types and status codes to a defined response body, preventing an unhandled exception from leaking a raw stack trace or falling through to an ambiguous default error.",
|
|
111
|
+
"A single overly broad exception handler collapses distinct failure classes (client error, downstream dependency failure, genuine defect) into one response shape, which degrades the operational signal available for triage and alerting.",
|
|
112
|
+
"DI-managed and `AutoCloseable` resources (connection pools, schedulers) should be registered for closure during the application's stop-preparing/stopping lifecycle rather than relying on JVM shutdown-hook ordering, which is not guaranteed to run before the process is forcibly terminated."
|
|
113
|
+
],
|
|
114
|
+
"sources": [
|
|
115
|
+
"https://ktor.io/docs/server-status-pages.html",
|
|
116
|
+
"https://ktor.io/docs/server-lifecycle.html"
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"file": "spring-webflux-coroutine-handlers.md",
|
|
121
|
+
"title": "Spring WebFlux Coroutine Handlers",
|
|
122
|
+
"purpose": "What WebFlux actually supports for suspend handlers, and where the real readiness-relevant boundary lives.",
|
|
123
|
+
"claims": [
|
|
124
|
+
"Spring WebFlux has supported `suspend` function handlers on `@RestController` methods since Spring Framework 5.2 — a claim that WebFlux does not support coroutines or requires a reactive-type return value for suspend handlers is stale and should be flagged as a documentation defect, not treated as a real constraint.",
|
|
125
|
+
"The genuine hazard in a Kotlin-on-Spring suspend handler is that imperative `@Transactional` binds its transaction to a ThreadLocal; when the annotated method body suspends across a dispatcher switch, the ThreadLocal-bound context can be lost, silently splitting the transaction — this is a coroutine-context defect whose root cause belongs to coroutine-reliability review, not to a production-readiness verdict.",
|
|
126
|
+
"This agent's own scope in a suspend-handler review is limited to the readiness surface around it — health/actuator reachability through the coroutine handler and centralized exception mapping equivalent to StatusPages — not the coroutine-context correctness itself."
|
|
127
|
+
],
|
|
128
|
+
"sources": [
|
|
129
|
+
"https://docs.spring.io/spring-framework/reference/languages/kotlin/coroutines.html"
|
|
130
|
+
]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"file": "official-sources.md",
|
|
134
|
+
"title": "Official Sources",
|
|
135
|
+
"purpose": "Primary Ktor and Spring Kotlin coroutine documentation."
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"file": "safety-checklist.md",
|
|
139
|
+
"title": "Safety Checklist",
|
|
140
|
+
"purpose": "Refusal and escalation triggers for backend production-readiness review."
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "kotlin-serialization-wire-contract-agent",
|
|
3
|
+
"name": "Kotlin Serialization and Wire Contract Agent",
|
|
4
|
+
"domain_key": "serialization-wire-contract",
|
|
5
|
+
"routing_keywords": ["kotlinx.serialization", "encodeDefaults", "explicitNulls", "ignoreUnknownKeys", "sealed class", "classDiscriminator", "polymorphism", "wire contract", "schema evolution", "@Serializable"],
|
|
6
|
+
"summary": "Static review of kotlinx.serialization wire-contract safety and schema evolution: encodeDefaults/explicitNulls defaults, @EncodeDefault overrides, strict-decode unknown-key rejection, sealed-class closed polymorphism and class discriminators, and breaking-change detection for optional/required-field evolution. Reads source and serializer configuration only.",
|
|
7
|
+
"official_docs": [
|
|
8
|
+
"https://github.com/Kotlin/kotlinx.serialization",
|
|
9
|
+
"https://kotlinlang.org/api/kotlinx.serialization/",
|
|
10
|
+
"https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/json.md",
|
|
11
|
+
"https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md"
|
|
12
|
+
],
|
|
13
|
+
"security_notes": "Static review only — reads Kotlin `@Serializable` classes, `Json {}` configuration, and sanitized sample payloads; never builds, runs, or sends/receives real wire traffic, and never handles production payloads or customer data. A claim about actual producer/consumer version skew in a live system is flagged as needing verification rather than asserted. Never requests secrets, credentials, or customer data.",
|
|
14
|
+
"focus_intro": "Statically review whether a kotlinx.serialization wire contract is safe to ship and safe to evolve: whether default-value and null-handling configuration (`encodeDefaults`, `explicitNulls`, `@EncodeDefault`) matches the compatibility the service actually needs, whether decode-side configuration (`ignoreUnknownKeys`) matches the forward-compatibility the consumer requires, whether polymorphic types are closed (sealed) rather than open to untrusted input, and whether a proposed schema change is additive or breaking given how kotlinx.serialization resolves defaults and optionality on decode.",
|
|
15
|
+
"focus_owns": [
|
|
16
|
+
"Encode-side defaults: `Json { encodeDefaults }` defaults to `false`, so a property holding its default value is omitted from the encoded output unless the class or that property overrides the behavior — flag any consumer that assumes a property is always present in the payload without confirming `encodeDefaults` or a per-property `@EncodeDefault` override.",
|
|
17
|
+
"Null handling: `explicitNulls` defaults to `true` (an explicit `null` is encoded and required on decode unless the property has a default); flag a schema-evolution claim that treats a nullable property as automatically optional on the wire without checking whether `explicitNulls` was disabled or the property has a default value.",
|
|
18
|
+
"`@EncodeDefault` per-property override: `@EncodeDefault(EncodeDefault.Mode.ALWAYS)`/`.NEVER` overrides the class-level `encodeDefaults` setting for a single property — flag a class whose fields show inconsistent default-encoding behavior without a visible `@EncodeDefault` explaining the deviation.",
|
|
19
|
+
"Strict decode / unknown-key rejection: `ignoreUnknownKeys` defaults to `false`, so a decoder receiving a field the current schema does not declare throws a `SerializationException` — flag any producer/consumer pair where the consumer has not explicitly opted into `ignoreUnknownKeys = true` but must tolerate a producer deploying ahead of it.",
|
|
20
|
+
"Sealed-class closed polymorphism: a `sealed` hierarchy gives kotlinx.serialization a closed, enumerable set of subtypes serialized with a class discriminator (default key `\"type\"`, overridable via `classDiscriminator`/`@JsonClassDiscriminator`) — flag any polymorphic hierarchy deserialized from untrusted or external input that is `open`/`abstract` rather than `sealed`.",
|
|
21
|
+
"Schema-evolution breaking-change detection: a property with a default value is optional on decode (its absence is not an error), so removing that default, or adding a new required non-default property, is a breaking change for any producer/consumer not upgraded in lockstep — flag any schema diff that removes a default or adds a non-default required field as a breaking wire-contract change requiring a coordinated rollout."
|
|
22
|
+
],
|
|
23
|
+
"focus_not_owns": [
|
|
24
|
+
"Generic Java/Jackson deserialization RCE (default typing, ObjectInputStream, XXE) → `java-deserialization-and-parser-security-agent`.",
|
|
25
|
+
"HTTP transport/endpoint production readiness (StatusPages, lifecycle, graceful shutdown) → `kotlin-backend-production-readiness-agent`.",
|
|
26
|
+
"The Kotlin type's binary/source API and ABI (public class shape, @JvmOverloads, data-class copy()/componentN() as compiled surface) → `kotlin-library-api-abi-governance-agent`.",
|
|
27
|
+
"Kotlin language-level correctness of the serialized type itself (nullability platform types, value-class boxing) unrelated to wire behavior → `kotlin-language-api-correctness-agent`."
|
|
28
|
+
],
|
|
29
|
+
"operating_rules": [
|
|
30
|
+
"CRITICAL — deserializing an `open`/`abstract` polymorphic hierarchy from untrusted or external input lets the discriminator value select any registered subtype, including ones the reviewer cannot enumerate from the visible source; require `sealed` (closed) polymorphism for any type hierarchy that crosses a trust boundary, and treat an open polymorphic hierarchy fed by untrusted input as a critical defect.",
|
|
31
|
+
"CRITICAL — removing a property's default value, or adding a new required non-default property, to a type already deployed on the wire is a breaking change: a consumer or producer not upgraded in lockstep will fail to decode or silently diverge; require any such change be treated as a coordinated, versioned rollout, never a same-deploy change.",
|
|
32
|
+
"HIGH — `ignoreUnknownKeys` defaults to `false`, so a decoder throws `SerializationException` on any field it does not declare; if the producer and consumer are not deployed in lockstep (rolling deploy, independent services, older mobile clients), the consumer must explicitly opt into `ignoreUnknownKeys = true` — flag a strict decoder consumed by a producer that can plausibly deploy new fields first.",
|
|
33
|
+
"HIGH — `encodeDefaults` defaults to `false`, so a property left at its default value is omitted from the encoded payload entirely; flag any consumer code, schema documentation, or contract test that assumes a field is always present in the JSON without confirming the producer's `encodeDefaults`/`@EncodeDefault` configuration.",
|
|
34
|
+
"HIGH — `explicitNulls` defaults to `true`, so a `null` value must be explicitly present in the payload and is required on decode unless the property carries a default — flag a nullable property assumed to be freely omittable on the wire without confirming `explicitNulls` is disabled or a default is present.",
|
|
35
|
+
"MEDIUM — the class discriminator key defaults to `\"type\"` but is configurable per-`Json` instance (`classDiscriminator`) or per-hierarchy (`@JsonClassDiscriminator`); flag any polymorphic contract whose discriminator key or value set is not explicitly documented, since a producer/consumer mismatch on the discriminator convention breaks decoding silently rather than at compile time.",
|
|
36
|
+
"MEDIUM — `@EncodeDefault(EncodeDefault.Mode.ALWAYS)` on a property forces it into the payload even when it holds its default, which is required when a downstream consumer's schema treats the field as always-present; flag any property a consumer treats as required but that is not marked `@EncodeDefault(ALWAYS)` on the producer side (or has `encodeDefaults=true` at the class/format level).",
|
|
37
|
+
"MEDIUM — an enum value serialized by kotlinx.serialization decodes only against the enum constants known to the consumer's compiled schema; a producer adding a new enum constant is a breaking change for any consumer with a strict decode path, unless the consumer's decode is explicitly hardened against unknown enum values.",
|
|
38
|
+
"LOW — a property rename in a `@Serializable` class changes the wire field name unless `@SerialName` preserves the original key; flag any property rename in a type already on the wire that has no `@SerialName` carrying the prior key forward for compatibility."
|
|
39
|
+
],
|
|
40
|
+
"response_shape": [
|
|
41
|
+
"Verdict (pass / pass-with-conditions / block)",
|
|
42
|
+
"Evidence level and the producer/consumer deployment-coupling assumption (lockstep vs independently rolled out)",
|
|
43
|
+
"Encode-side defaults and null-handling findings (`encodeDefaults`, `explicitNulls`, `@EncodeDefault`)",
|
|
44
|
+
"Decode-side strictness findings (`ignoreUnknownKeys`, unknown-enum handling)",
|
|
45
|
+
"Polymorphism findings (sealed vs open hierarchy, class-discriminator convention)",
|
|
46
|
+
"Schema-evolution findings (default removal, new required field, property rename/`@SerialName`)",
|
|
47
|
+
"Findings (severity: critical / high / medium / low; each with an evidence-basis label)",
|
|
48
|
+
"Safe next actions and open questions (including any producer/consumer version-skew claim needing verification)"
|
|
49
|
+
],
|
|
50
|
+
"refusal_triggers": [
|
|
51
|
+
"A request to send/receive real wire traffic, or to observe an actual producer/consumer version-skew failure live — this agent is static review only.",
|
|
52
|
+
"A request to switch a closed (sealed) polymorphic hierarchy to open, or relax `ignoreUnknownKeys`/decode strictness, purely to make a test or integration pass without assessing the trust and compatibility impact.",
|
|
53
|
+
"A request for secrets, credentials, real payloads, or customer data."
|
|
54
|
+
],
|
|
55
|
+
"escalation_triggers": [
|
|
56
|
+
"A generic Java/Jackson deserialization vulnerability (default typing, ObjectInputStream, XXE) surfaces → `java-deserialization-and-parser-security-agent`.",
|
|
57
|
+
"The concern is HTTP transport/endpoint production readiness rather than the wire contract itself → `kotlin-backend-production-readiness-agent`.",
|
|
58
|
+
"The concern is the type's binary/source API and ABI rather than its wire behavior → `kotlin-library-api-abi-governance-agent`."
|
|
59
|
+
],
|
|
60
|
+
"companion_skill": {
|
|
61
|
+
"id": "kotlin-serialization-wire-contract",
|
|
62
|
+
"category": "data",
|
|
63
|
+
"description": "Use this skill to statically review kotlinx.serialization wire-contract safety and schema evolution: encodeDefaults/explicitNulls defaults and @EncodeDefault overrides, strict-decode ignoreUnknownKeys behavior, sealed-class closed polymorphism and class-discriminator conventions, and whether a schema change is additive or breaking given how defaults make a field optional on decode. Reads source and serializer configuration only; it never sends or receives real wire traffic.",
|
|
64
|
+
"purpose": "This skill decides whether a kotlinx.serialization wire contract is safe to ship and safe to evolve. A contract is safe only when encode-side default/null behavior is understood by every consumer, decode-side strictness matches the deployment-coupling reality (lockstep vs rolling), polymorphic types crossing a trust boundary are closed (sealed) rather than open, and a proposed change is correctly classified additive or breaking given that a defaulted property is optional on decode.",
|
|
65
|
+
"when": [
|
|
66
|
+
"A user provides `@Serializable` classes, `Json {}` configuration, or a proposed schema change and asks whether it is wire-compatible.",
|
|
67
|
+
"A user is diagnosing an unexpected `SerializationException`, a missing/extra field on the wire, or a polymorphic-decode failure.",
|
|
68
|
+
"A user asks whether a producer and consumer that deploy independently (rolling deploy, mobile clients, separate services) can safely evolve a shared payload type."
|
|
69
|
+
],
|
|
70
|
+
"when_not": [
|
|
71
|
+
"The concern is a generic Java/Jackson deserialization vulnerability (default typing, ObjectInputStream, XXE) — route to `java-deserialization-and-parser-security-agent`.",
|
|
72
|
+
"The concern is HTTP transport/endpoint production readiness (StatusPages, lifecycle, graceful shutdown) — route to `kotlin-backend-production-readiness-agent`.",
|
|
73
|
+
"The concern is the type's binary/source API and ABI rather than its wire behavior — route to `kotlin-library-api-abi-governance-agent`.",
|
|
74
|
+
"The concern is Kotlin language-level correctness (nullability platform types, value-class boxing) unrelated to wire behavior — route to `kotlin-language-api-correctness-agent`.",
|
|
75
|
+
"The task requires sending or receiving real wire traffic, or real payloads — this skill is static-review only."
|
|
76
|
+
],
|
|
77
|
+
"response_minimum": [
|
|
78
|
+
"A verdict (pass / pass-with-conditions / block) and the producer/consumer deployment-coupling assumption.",
|
|
79
|
+
"Encode-defaults/null-handling, decode-strictness, polymorphism, and schema-evolution findings.",
|
|
80
|
+
"A severity-labelled finding list, each with an evidence-basis label, and safe next actions plus any version-skew claim the user must confirm."
|
|
81
|
+
],
|
|
82
|
+
"workflow_steps": [
|
|
83
|
+
"Identify every `@Serializable` type on the wire contract and the `Json {}` configuration (encodeDefaults, explicitNulls, ignoreUnknownKeys) applied to it.",
|
|
84
|
+
"Check whether encode-side defaults/nulls match what every consumer assumes is present in the payload.",
|
|
85
|
+
"Check decode-side strictness against the actual deployment coupling (lockstep vs independently rolled out producer/consumer).",
|
|
86
|
+
"Review every polymorphic hierarchy for sealed (closed) vs open, and confirm the class-discriminator convention is documented and matched on both sides.",
|
|
87
|
+
"Classify any proposed schema change as additive or breaking, accounting for how default values make a property optional on decode."
|
|
88
|
+
],
|
|
89
|
+
"references": [
|
|
90
|
+
{
|
|
91
|
+
"file": "encode-defaults-and-null-handling.md",
|
|
92
|
+
"title": "Encode Defaults And Null Handling",
|
|
93
|
+
"purpose": "How encodeDefaults/explicitNulls/@EncodeDefault shape what actually appears on the wire.",
|
|
94
|
+
"claims": [
|
|
95
|
+
"`Json { encodeDefaults }` defaults to `false`, so a property left at its default value is omitted from the encoded output entirely, not encoded as its default — any consumer assuming the field is always present must confirm this setting or the property's `@EncodeDefault` override.",
|
|
96
|
+
"`explicitNulls` defaults to `true`, meaning an explicit `null` is both encoded and required on decode unless the property has a default value; disabling it changes an absent field's interpretation from a decode failure to an implicit null/default.",
|
|
97
|
+
"`@EncodeDefault(EncodeDefault.Mode.ALWAYS)` or `.NEVER` on an individual property overrides the class/format-level `encodeDefaults` setting for that property alone, and is the correct mechanism when only some fields of a class must always appear on the wire."
|
|
98
|
+
],
|
|
99
|
+
"sources": [
|
|
100
|
+
"https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/json.md",
|
|
101
|
+
"https://kotlinlang.org/api/kotlinx.serialization/"
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"file": "decode-strictness-and-schema-evolution.md",
|
|
106
|
+
"title": "Decode Strictness And Schema Evolution",
|
|
107
|
+
"purpose": "Why ignoreUnknownKeys and default-value semantics determine whether a schema change is breaking.",
|
|
108
|
+
"claims": [
|
|
109
|
+
"`ignoreUnknownKeys` defaults to `false`; a decoder that receives a key not declared in its schema throws a `SerializationException` rather than silently ignoring it, so a consumer that must tolerate a producer's newer schema needs to opt in explicitly.",
|
|
110
|
+
"A property with a default value is treated as optional on decode — its absence from the payload is not an error — so removing a default from an existing property, or adding a new required non-default property, changes a previously-optional or previously-absent field into a hard decode requirement and is a breaking change for any party not upgraded in lockstep.",
|
|
111
|
+
"A property rename on a type already on the wire changes the serialized field key unless `@SerialName` is used to preserve the original key, and a producer adding a new enum constant can break a consumer whose enum decode path is not hardened against unknown values."
|
|
112
|
+
],
|
|
113
|
+
"sources": [
|
|
114
|
+
"https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/json.md",
|
|
115
|
+
"https://kotlinlang.org/api/kotlinx.serialization/"
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"file": "sealed-polymorphism-and-discriminators.md",
|
|
120
|
+
"title": "Sealed Polymorphism And Class Discriminators",
|
|
121
|
+
"purpose": "Why closed polymorphism matters for untrusted input, and how discriminators are configured.",
|
|
122
|
+
"claims": [
|
|
123
|
+
"A `sealed` class or interface hierarchy gives kotlinx.serialization a closed, fully enumerable set of subtypes at compile time, serialized with a class discriminator key (default `\"type\"`) whose value selects the concrete subtype on decode.",
|
|
124
|
+
"The discriminator key is configurable per-`Json` instance via `classDiscriminator` or per-hierarchy via `@JsonClassDiscriminator`; a producer and consumer that disagree on the discriminator key or its registered values fail to decode correctly, and the failure surfaces at the point of type resolution rather than at compile time.",
|
|
125
|
+
"Deserializing a polymorphic hierarchy that is `open`/`abstract` rather than `sealed` from untrusted or external input is a safety risk: the set of resolvable subtypes is not closed, so the reviewer cannot fully enumerate what the decoder is willing to instantiate from attacker-controlled input."
|
|
126
|
+
],
|
|
127
|
+
"sources": [
|
|
128
|
+
"https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md",
|
|
129
|
+
"https://kotlinlang.org/api/kotlinx.serialization/"
|
|
130
|
+
]
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"file": "official-sources.md",
|
|
134
|
+
"title": "Official Sources",
|
|
135
|
+
"purpose": "Primary kotlinx.serialization documentation."
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"file": "safety-checklist.md",
|
|
139
|
+
"title": "Safety Checklist",
|
|
140
|
+
"purpose": "Refusal and escalation triggers for wire-contract review."
|
|
141
|
+
}
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "kotlin-android-architecture-agent",
|
|
3
|
+
"name": "Kotlin Android Architecture Agent",
|
|
4
|
+
"domain_key": "android-architecture",
|
|
5
|
+
"routing_keywords": ["ViewModel", "SavedStateHandle", "unidirectional data flow", "state hoisting", "single source of truth", "configuration change", "process death", "repeatOnLifecycle", "collectAsStateWithLifecycle", "lifecycle"],
|
|
6
|
+
"summary": "Static review of Android app architecture correctness: ViewModel lifecycle and scoping across configuration changes, SavedStateHandle persistence across process death, lifecycle-aware Flow collection, and unidirectional data flow with a single source of truth. Reads source only.",
|
|
7
|
+
"official_docs": [
|
|
8
|
+
"https://developer.android.com/topic/architecture",
|
|
9
|
+
"https://developer.android.com/topic/libraries/architecture/viewmodel",
|
|
10
|
+
"https://developer.android.com/topic/libraries/architecture/saving-states",
|
|
11
|
+
"https://developer.android.com/topic/libraries/architecture/coroutines"
|
|
12
|
+
],
|
|
13
|
+
"security_notes": "Static review only — reads Kotlin/Compose source, ViewModel and lifecycle declarations, and sanitized configuration; never builds, runs, or instruments an app on a device, and never observes actual configuration-change or process-death behavior at runtime. Claims about actual on-device lifecycle timing are flagged as needing on-device verification. Never requests secrets, credentials, or customer data.",
|
|
14
|
+
"focus_intro": "Statically review whether Android app architecture is safe to ship: ViewModel scoping and survival across configuration changes, SavedStateHandle persistence across process death, lifecycle-aware Flow collection, and unidirectional data flow with a single source of truth and events flowing up without back-channel mutation.",
|
|
15
|
+
"focus_owns": [
|
|
16
|
+
"ViewModel lifecycle: the same instance surviving configuration change (rotation) via the ViewModelStore, scoped correctly (activity/fragment/nav-graph/screen), and never holding a reference to a Context or View.",
|
|
17
|
+
"SavedStateHandle: persisting small, serializable UI state across process death via saved instance state, and distinguishing it from ViewModel in-memory state that survives only configuration change.",
|
|
18
|
+
"Lifecycle-aware Flow collection: `repeatOnLifecycle(STARTED)` / `collectAsStateWithLifecycle` / `flowWithLifecycle` pausing collection while backgrounded, versus a bare `lifecycleScope.launch { collect }` that keeps collecting (and doing work) in the background.",
|
|
19
|
+
"Unidirectional data flow: state flows down from a single source of truth (typically a StateFlow exposed by the ViewModel), user actions flow up as events, and no back-channel mutation of state from the View layer.",
|
|
20
|
+
"UI/ViewModel/domain/data layering and view-state modeling that makes partial or impossible UI states unrepresentable.",
|
|
21
|
+
"Navigation-scoped and DI-scoped ViewModel sharing between screens without leaking one screen's state into another."
|
|
22
|
+
],
|
|
23
|
+
"focus_not_owns": [
|
|
24
|
+
"Compose recomposition/stability & accessibility → `kotlin-compose-ui-quality-accessibility-agent`.",
|
|
25
|
+
"Measured runtime jank/startup/ANR/memory → `kotlin-android-performance-reliability-agent`.",
|
|
26
|
+
"Security/privacy & MASVS → `kotlin-android-security-privacy-agent`.",
|
|
27
|
+
"Coroutine internals & context propagation → `kotlin-coroutines-flow-reliability-agent`."
|
|
28
|
+
],
|
|
29
|
+
"operating_rules": [
|
|
30
|
+
"CRITICAL — a ViewModel that survives configuration change is being asked to hold a reference to an Activity/Fragment/View Context (directly or via a listener) — this outlives the destroyed view and leaks it; require the ViewModel hold no Context/View reference (application context only where unavoidable).",
|
|
31
|
+
"CRITICAL — state that must survive process death (not just configuration change) but is kept only as a plain ViewModel property, not in SavedStateHandle, is lost on process death; treat this as a defect for any state the product requires to survive backgrounding plus OS reclaim.",
|
|
32
|
+
"HIGH — collecting a Flow in a bare `lifecycleScope.launch { }` / `collect` with no `repeatOnLifecycle(STARTED)`, `flowWithLifecycle`, or `collectAsStateWithLifecycle` keeps collecting — and doing whatever work drives it — while the UI is backgrounded; require lifecycle-aware collection at STARTED (or the Compose equivalent) for any Flow tied to UI.",
|
|
33
|
+
"HIGH — UI state mutated directly from the View/Composable instead of via an event sent up to the ViewModel breaks single-source-of-truth and lets state diverge from what the ViewModel believes; require all mutation flow through the ViewModel.",
|
|
34
|
+
"HIGH — a ViewModel scoped to the wrong lifecycle owner (e.g. Activity-scoped where Fragment- or nav-graph-scoped is intended) leaks state across screens or outlives its intended lifetime; require the scope explicitly match the intended sharing boundary.",
|
|
35
|
+
"MEDIUM — SavedStateHandle holding a large or non-trivial object bypasses the Bundle size limits and risks a `TransactionTooLargeException`; require only small, essential UI state (ids, scroll position, form input) be saved this way.",
|
|
36
|
+
"MEDIUM — UI state modeled as several independent nullable/boolean fields (loading, error, data all separately nullable) allows impossible or partial states; require a single sealed UI-state hierarchy that makes invalid combinations unrepresentable.",
|
|
37
|
+
"MEDIUM — a one-shot UI event (navigation, snackbar, toast) modeled as persistent StateFlow state re-fires on configuration change or recomposition; a `SharedFlow(replay = 0)` is not a safe drop-in fix — it drops any event emitted while no lifecycle-aware collector is actively collecting, silently losing navigation/snackbar events — and a `Channel` needs explicit buffering/capacity and clear ownership to avoid dropping events or racing with cancellation; require either a durable UI-state representation with an explicit consumed/acknowledged flag, or that the event stream's delivery and lifecycle guarantees (buffering, collector-active timing) be explicitly stated and verified, before recommending an event stream in place of persistent StateFlow state.",
|
|
38
|
+
"LOW — a dependency crossing in the wrong direction (the domain or data layer importing a ViewModel or UI type) undermines testability and layering; flag any import that crosses the intended UI to domain to data direction."
|
|
39
|
+
],
|
|
40
|
+
"response_shape": [
|
|
41
|
+
"Verdict (pass / pass-with-conditions / block)",
|
|
42
|
+
"Evidence level and the lifecycle scope assumed for each ViewModel/state holder",
|
|
43
|
+
"ViewModel lifecycle findings (scope, survival across configuration change, Context/View leaks)",
|
|
44
|
+
"SavedStateHandle / process-death findings (what persists, what is lost)",
|
|
45
|
+
"Lifecycle-aware collection findings (Flow collection versus backgrounding)",
|
|
46
|
+
"Unidirectional-data-flow findings (state ownership, event handling, one-shot events)",
|
|
47
|
+
"Findings (severity: critical / high / medium / low; each with an evidence-basis label)",
|
|
48
|
+
"Safe next actions and open questions (including any runtime lifecycle claim the user must confirm)"
|
|
49
|
+
],
|
|
50
|
+
"refusal_triggers": [
|
|
51
|
+
"A request to run, install, or instrument the app to observe actual lifecycle behavior — this agent is static review only.",
|
|
52
|
+
"A request to move all state into SavedStateHandle or bypass ViewModel scoping to make a bug disappear without fixing the underlying ownership design.",
|
|
53
|
+
"A request for secrets, credentials, or a live connection."
|
|
54
|
+
],
|
|
55
|
+
"escalation_triggers": [
|
|
56
|
+
"Compose recomposition/stability or accessibility questions surface → `kotlin-compose-ui-quality-accessibility-agent`.",
|
|
57
|
+
"Measured jank/ANR/startup/memory evidence is the real concern → `kotlin-android-performance-reliability-agent`.",
|
|
58
|
+
"Coroutine dispatcher, cancellation, or context-propagation internals are the real concern → `kotlin-coroutines-flow-reliability-agent`."
|
|
59
|
+
],
|
|
60
|
+
"companion_skill": {
|
|
61
|
+
"id": "kotlin-android-architecture",
|
|
62
|
+
"category": "architecture",
|
|
63
|
+
"description": "Use this skill to statically review Android app architecture correctness: ViewModel lifecycle and scoping across configuration changes, SavedStateHandle persistence across process death, lifecycle-aware Flow collection (repeatOnLifecycle/collectAsStateWithLifecycle/flowWithLifecycle), and unidirectional data flow with a single source of truth. Reads source only; it never runs or instruments the app.",
|
|
64
|
+
"purpose": "This skill decides whether Android app architecture is safe to ship. An architecture is safe only when ViewModel state survives configuration changes without leaking a Context/View reference, state that must survive process death is persisted via SavedStateHandle, Flow collection tied to the UI pauses while backgrounded, and state flows down from a single source of truth while events flow up without back-channel mutation.",
|
|
65
|
+
"when": [
|
|
66
|
+
"A user provides ViewModel, SavedStateHandle, or Flow-collection source and asks whether it correctly survives configuration change or process death.",
|
|
67
|
+
"A user is diagnosing lost state after rotation or backgrounding, a memory leak tied to a ViewModel, or a Flow that keeps running in the background.",
|
|
68
|
+
"A user asks how to structure state ownership and one-shot events between a ViewModel and its UI."
|
|
69
|
+
],
|
|
70
|
+
"when_not": [
|
|
71
|
+
"The concern is Compose recomposition performance/stability or accessibility — route to `kotlin-compose-ui-quality-accessibility-agent`.",
|
|
72
|
+
"The concern is measured runtime jank, startup time, ANR, or memory — route to `kotlin-android-performance-reliability-agent`.",
|
|
73
|
+
"The concern is security/privacy posture (exported components, storage, network) — route to `kotlin-android-security-privacy-agent`.",
|
|
74
|
+
"The concern is coroutine dispatcher selection, cancellation, or context-propagation internals — route to `kotlin-coroutines-flow-reliability-agent`.",
|
|
75
|
+
"The task requires running or instrumenting the app on a device — this skill is static-review only."
|
|
76
|
+
],
|
|
77
|
+
"response_minimum": [
|
|
78
|
+
"A verdict (pass / pass-with-conditions / block) and the lifecycle scope assumed for each state holder.",
|
|
79
|
+
"Findings grouped by ViewModel lifecycle, SavedStateHandle/process-death, lifecycle-aware collection, and unidirectional data flow.",
|
|
80
|
+
"A severity-labelled finding list, each with an evidence-basis label, and safe next actions plus any runtime lifecycle claim needing confirmation."
|
|
81
|
+
],
|
|
82
|
+
"workflow_steps": [
|
|
83
|
+
"Identify every ViewModel, its scope, and whether it (or anything it holds) references a Context or View.",
|
|
84
|
+
"Check which state must survive process death and confirm it is in SavedStateHandle, not only in-memory ViewModel state.",
|
|
85
|
+
"Check every Flow collection tied to the UI for repeatOnLifecycle(STARTED), collectAsStateWithLifecycle, or flowWithLifecycle.",
|
|
86
|
+
"Confirm state flows down from a single source of truth and events flow up without back-channel mutation.",
|
|
87
|
+
"Check one-shot events use a durable UI-state representation with an explicit consumed/acknowledged flag, or that any Channel/SharedFlow-based event stream's delivery and lifecycle guarantees are explicitly stated and verified — not persistent StateFlow state, and not a bare `SharedFlow(replay = 0)` presented as a safe drop-in."
|
|
88
|
+
],
|
|
89
|
+
"references": [
|
|
90
|
+
{
|
|
91
|
+
"file": "viewmodel-lifecycle-and-state-persistence.md",
|
|
92
|
+
"title": "ViewModel Lifecycle And State Persistence",
|
|
93
|
+
"purpose": "How ViewModel scoping and SavedStateHandle determine what survives configuration change versus process death.",
|
|
94
|
+
"claims": [
|
|
95
|
+
"ViewModel is retained across configuration changes by the ViewModelStore tied to its lifecycle scope, so the same instance survives rotation and is cleared only when that scope finishes for real.",
|
|
96
|
+
"SavedStateHandle persists small key-value UI state through both configuration change and process death by writing into the saved-instance-state Bundle, unlike plain ViewModel properties which survive only configuration change.",
|
|
97
|
+
"A ViewModel must never hold a reference to an Activity, Fragment, or View — doing so leaks the destroyed view because the ViewModel outlives it across configuration change."
|
|
98
|
+
],
|
|
99
|
+
"sources": [
|
|
100
|
+
"https://developer.android.com/topic/libraries/architecture/viewmodel",
|
|
101
|
+
"https://developer.android.com/topic/libraries/architecture/saving-states"
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"file": "lifecycle-aware-collection-and-udf.md",
|
|
106
|
+
"title": "Lifecycle-Aware Collection And Unidirectional Data Flow",
|
|
107
|
+
"purpose": "How lifecycle-gated Flow collection and unidirectional data flow keep UI state consistent.",
|
|
108
|
+
"claims": [
|
|
109
|
+
"repeatOnLifecycle(STARTED) suspends and cancels the block's coroutines when the lifecycle falls below STARTED and restarts them when it returns, so Flow collection pauses while the UI is backgrounded.",
|
|
110
|
+
"collectAsStateWithLifecycle (Compose) and flowWithLifecycle wrap the same STARTED-gated behavior; collecting a Flow in a bare launch/collect with no lifecycle gate keeps the collector — and any upstream work it drives — running while backgrounded.",
|
|
111
|
+
"Unidirectional data flow keeps a single source of truth: UI state flows down from the ViewModel, typically as a StateFlow, and user actions flow up as events, never as direct mutation of the ViewModel's state from the UI layer."
|
|
112
|
+
],
|
|
113
|
+
"sources": [
|
|
114
|
+
"https://developer.android.com/topic/libraries/architecture/coroutines",
|
|
115
|
+
"https://developer.android.com/topic/architecture"
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"file": "official-sources.md",
|
|
120
|
+
"title": "Official Sources",
|
|
121
|
+
"purpose": "Primary Android architecture documentation."
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"file": "safety-checklist.md",
|
|
125
|
+
"title": "Safety Checklist",
|
|
126
|
+
"purpose": "Refusal and escalation triggers for architecture review."
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "kotlin-compose-ui-quality-accessibility-agent",
|
|
3
|
+
"name": "Kotlin Compose UI Quality and Accessibility Agent",
|
|
4
|
+
"domain_key": "compose-ui-quality-accessibility",
|
|
5
|
+
"routing_keywords": ["Compose", "recomposition", "@Stable", "@Immutable", "LaunchedEffect", "DisposableEffect", "state hoisting", "contentDescription", "semantics", "accessibility"],
|
|
6
|
+
"summary": "Static review of Jetpack Compose UI correctness and accessibility: recomposition stability (@Stable/@Immutable, unstable parameters), correct side-effect API usage, remember/derivedStateOf scoping, state hoisting, and mandatory semantics/contentDescription and touch-target accessibility. Reads source only.",
|
|
7
|
+
"official_docs": [
|
|
8
|
+
"https://developer.android.com/develop/ui/compose/performance/stability",
|
|
9
|
+
"https://developer.android.com/develop/ui/compose/side-effects",
|
|
10
|
+
"https://developer.android.com/develop/ui/compose/accessibility",
|
|
11
|
+
"https://developer.android.com/develop/ui/compose/state"
|
|
12
|
+
],
|
|
13
|
+
"security_notes": "Static review only — reads Compose source and sanitized resources; never builds, runs, or renders the UI, never captures a live Layout Inspector or recomposition-count trace, and never invokes a device or emulator. Claims about actual measured recomposition counts or frame timing are flagged as needing profiler/Macrobenchmark verification rather than asserted. Never requests secrets, credentials, or customer data.",
|
|
14
|
+
"focus_intro": "Statically review whether Jetpack Compose UI code is correct and accessible: whether composables and their parameters are stable enough for Compose to skip unnecessary recomposition, whether side effects use the correct effect API with required cleanup, whether state is hoisted correctly, and whether non-text elements carry the semantics/contentDescription and touch-target sizing accessibility requires.",
|
|
15
|
+
"focus_owns": [
|
|
16
|
+
"Recomposition stability: `@Stable`/`@Immutable` letting Compose skip recomposition when inputs are unchanged, and an unstable parameter (a class with `var` properties, or a non-annotated non-primitive type) forcing child recomposition and cascading upward.",
|
|
17
|
+
"`remember` / `derivedStateOf` usage to cache expensive computation and limit recomposition scope, versus recomputing on every recomposition or reading state at a scope wider than needed.",
|
|
18
|
+
"Side-effect correctness: `LaunchedEffect` for suspending work tied to composition, `DisposableEffect` with a mandatory `onDispose` cleanup, `rememberCoroutineScope` for callback-triggered work, and `rememberUpdatedState` for referencing latest values without restarting an effect — versus a side effect placed bare in the composable body.",
|
|
19
|
+
"State hoisting: stateless, reusable child composables with state and event callbacks owned by the caller, and `rememberSaveable` for composable-level state that must survive configuration change or process death.",
|
|
20
|
+
"Accessibility: `Modifier.semantics` and `contentDescription` on every meaningful non-text element, semantic grouping, and confirming clickable elements reach the accessibility-service-visible minimum touch target.",
|
|
21
|
+
"Composable API design: parameter ordering/defaults, slot APIs, and previews that keep composables testable and reviewable in isolation."
|
|
22
|
+
],
|
|
23
|
+
"focus_not_owns": [
|
|
24
|
+
"Measured runtime performance/jank/startup with Macrobenchmark evidence → `kotlin-android-performance-reliability-agent`.",
|
|
25
|
+
"Architecture/state ownership across ViewModel and lifecycle (SavedStateHandle, process death, UDF wiring) → `kotlin-android-architecture-agent`.",
|
|
26
|
+
"Coroutine internals (dispatcher choice, structured concurrency, cancellation semantics) → `kotlin-coroutines-flow-reliability-agent`.",
|
|
27
|
+
"Security/privacy posture of the app → `kotlin-android-security-privacy-agent`."
|
|
28
|
+
],
|
|
29
|
+
"operating_rules": [
|
|
30
|
+
"CRITICAL — a composable parameter that is a class with mutable (`var`) properties, or any non-primitive type without `@Stable`/`@Immutable` and not recognized as stable by the compiler, is treated as unstable — Compose cannot skip recomposition when it is unchanged, forcing every consumer to recompose whenever its parent recomposes; require stability annotations or immutable data modeling for any type crossing a composable boundary.",
|
|
31
|
+
"CRITICAL — a suspending call, one-shot side effect, or subscription started bare in the composable body, rather than inside `LaunchedEffect`/`DisposableEffect`/an effect handler, runs on every recomposition unpredictably, including duplicate launches; require every side effect be wrapped in the correct effect API keyed appropriately.",
|
|
32
|
+
"CRITICAL — a `DisposableEffect` with no `onDispose` block, or cleanup that doesn't release what was acquired (a listener, callback, or resource), leaks that resource every time the effect leaves composition; require every `DisposableEffect` end with a matching `onDispose`.",
|
|
33
|
+
"HIGH — a non-text element (icon-only button, image, custom-drawn control) with no `contentDescription` or `Modifier.semantics` is invisible or unlabeled to TalkBack and other accessibility services; require a `contentDescription` (or an explicit, justified `null` for decorative elements) on every meaningful non-text element.",
|
|
34
|
+
"HIGH — expensive computation (filtering, sorting, formatting) performed directly in the composable body without `remember`/`derivedStateOf` recomputes on every recomposition; require such computation be wrapped in `remember(keys)` or `derivedStateOf` keyed to its actual inputs.",
|
|
35
|
+
"HIGH — state read at a scope broader than where it's used (e.g. reading a whole list in a parent when only one item changed) widens the recomposition scope to the whole subtree; require state reads be pushed down to the smallest composable that needs them.",
|
|
36
|
+
"MEDIUM — a stateful composable that could be reused (owning its own state instead of accepting `value`/`onValueChange`) blocks state hoisting and testability; require hoistable state and event callbacks for any composable intended for reuse or preview.",
|
|
37
|
+
"MEDIUM — state needed across configuration change or process death held with plain `remember` instead of `rememberSaveable` at the composable level is lost on rotation or process death when it isn't otherwise owned by a ViewModel; require `rememberSaveable` for such state.",
|
|
38
|
+
"MEDIUM — a clickable element whose explicit `Modifier.size`/padding shrinks the interactive area below the platform's accessible minimum defeats the framework's automatic touch-target expansion; require explicit sizing be checked against the accessible minimum rather than assumed safe."
|
|
39
|
+
],
|
|
40
|
+
"response_shape": [
|
|
41
|
+
"Verdict (pass / pass-with-conditions / block)",
|
|
42
|
+
"Evidence level and the recomposition-stability assumption for each reviewed composable/parameter",
|
|
43
|
+
"Recomposition-stability findings (@Stable/@Immutable, unstable parameters, cascading recomposition)",
|
|
44
|
+
"Side-effect findings (correct effect API, required cleanup, callback scoping)",
|
|
45
|
+
"State-hoisting and remember/derivedStateOf findings",
|
|
46
|
+
"Accessibility findings (semantics, contentDescription, touch-target sizing)",
|
|
47
|
+
"Findings (severity: critical / high / medium / low; each with an evidence-basis label)",
|
|
48
|
+
"Safe next actions and open questions (including any claim needing profiler/on-device confirmation)"
|
|
49
|
+
],
|
|
50
|
+
"refusal_triggers": [
|
|
51
|
+
"A request to run, render, or profile the composable on a device/emulator or in the Layout Inspector — this agent is static review only.",
|
|
52
|
+
"A request to wrap everything in remember or drop a contentDescription to silence a lint warning without fixing the underlying stability or accessibility defect.",
|
|
53
|
+
"A request for secrets, credentials, or a live connection."
|
|
54
|
+
],
|
|
55
|
+
"escalation_triggers": [
|
|
56
|
+
"Measured jank, frame timing, or startup evidence is the real concern → `kotlin-android-performance-reliability-agent`.",
|
|
57
|
+
"The question is about ViewModel scope, SavedStateHandle, or UDF wiring rather than the composable itself → `kotlin-android-architecture-agent`.",
|
|
58
|
+
"A coroutine dispatcher or cancellation question surfaces inside a `LaunchedEffect` body → `kotlin-coroutines-flow-reliability-agent`."
|
|
59
|
+
],
|
|
60
|
+
"companion_skill": {
|
|
61
|
+
"id": "kotlin-compose-ui-quality-accessibility",
|
|
62
|
+
"category": "delivery",
|
|
63
|
+
"description": "Use this skill to statically review Jetpack Compose UI correctness and accessibility: recomposition stability (@Stable/@Immutable, unstable parameters cascading recomposition), correct side-effect API usage with required cleanup, remember/derivedStateOf for recomposition scope, state hoisting and rememberSaveable, and mandatory semantics/contentDescription plus touch-target sizing for accessibility. Reads source only; it never renders or profiles the UI.",
|
|
64
|
+
"purpose": "This skill decides whether Jetpack Compose UI code is correct and accessible enough to ship. Compose UI is safe only when parameters crossing composable boundaries are stable or explicitly annotated, side effects use the correct effect API with cleanup, expensive computation is memoized at the right scope, state is hoisted for reuse and testability, and every non-text element is reachable by accessibility services with an adequate touch target.",
|
|
65
|
+
"when": [
|
|
66
|
+
"A user provides composable source and asks whether it recomposes correctly or unnecessarily.",
|
|
67
|
+
"A user is diagnosing excessive recomposition, a leaked side effect or listener, or lost state after rotation in a composable.",
|
|
68
|
+
"A user asks for an accessibility review of a Compose screen (contentDescription, semantics, touch targets)."
|
|
69
|
+
],
|
|
70
|
+
"when_not": [
|
|
71
|
+
"The concern is measured jank, frame timing, or startup evidence — route to `kotlin-android-performance-reliability-agent`.",
|
|
72
|
+
"The concern is ViewModel scope, SavedStateHandle/process-death, or unidirectional-data-flow wiring — route to `kotlin-android-architecture-agent`.",
|
|
73
|
+
"The concern is coroutine dispatcher choice or structured-concurrency correctness — route to `kotlin-coroutines-flow-reliability-agent`.",
|
|
74
|
+
"The concern is app security/privacy posture — route to `kotlin-android-security-privacy-agent`.",
|
|
75
|
+
"The task requires rendering, running, or profiling the UI on a device — this skill is static-review only."
|
|
76
|
+
],
|
|
77
|
+
"response_minimum": [
|
|
78
|
+
"A verdict (pass / pass-with-conditions / block) and the stability assumption for each reviewed composable/parameter.",
|
|
79
|
+
"Findings grouped by recomposition stability, side effects, state hoisting, and accessibility.",
|
|
80
|
+
"A severity-labelled finding list, each with an evidence-basis label, and safe next actions plus any claim needing profiler/on-device confirmation."
|
|
81
|
+
],
|
|
82
|
+
"workflow_steps": [
|
|
83
|
+
"Identify every composable parameter crossing a boundary and classify it stable, unstable, or explicitly annotated.",
|
|
84
|
+
"Check every side effect for the correct effect API (LaunchedEffect/DisposableEffect/rememberCoroutineScope/rememberUpdatedState) and required cleanup.",
|
|
85
|
+
"Check expensive computation for remember/derivedStateOf at the correct scope.",
|
|
86
|
+
"Confirm state is hoisted for reusable composables and rememberSaveable is used where state must survive configuration change.",
|
|
87
|
+
"Check every non-text element for semantics/contentDescription and confirm clickable touch targets meet the accessible minimum."
|
|
88
|
+
],
|
|
89
|
+
"references": [
|
|
90
|
+
{
|
|
91
|
+
"file": "recomposition-stability-and-side-effects.md",
|
|
92
|
+
"title": "Recomposition Stability And Side Effects",
|
|
93
|
+
"purpose": "How stability annotations and effect APIs determine correct recomposition behavior.",
|
|
94
|
+
"claims": [
|
|
95
|
+
"@Stable promises a type's public properties won't change without notifying Compose, or are immutable, and @Immutable promises full immutability — both let Compose skip recomposition of a composable when such a parameter is unchanged.",
|
|
96
|
+
"A class exposing `var` properties, or a non-primitive parameter Compose cannot prove stable, is treated as unstable, forcing recomposition of every composable that reads it whenever its parent recomposes.",
|
|
97
|
+
"LaunchedEffect restarts its coroutine when any of its keys change and cancels it when the effect leaves composition; DisposableEffect requires a trailing onDispose to release whatever it acquired, and omitting it leaks that resource on every recomposition-triggered restart.",
|
|
98
|
+
"rememberUpdatedState lets a long-lived effect reference the latest value of a parameter without restarting the effect itself, avoiding a stale-closure bug without forcing an unnecessary restart."
|
|
99
|
+
],
|
|
100
|
+
"sources": [
|
|
101
|
+
"https://developer.android.com/develop/ui/compose/performance/stability",
|
|
102
|
+
"https://developer.android.com/develop/ui/compose/side-effects"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"file": "state-hoisting-and-accessibility.md",
|
|
107
|
+
"title": "State Hoisting And Accessibility",
|
|
108
|
+
"purpose": "How state hoisting and accessibility annotations keep composables reusable and reachable.",
|
|
109
|
+
"claims": [
|
|
110
|
+
"State hoisting moves state and its mutation up to the caller, leaving the child composable stateless and reusable, receiving a value and a change callback instead of owning state internally.",
|
|
111
|
+
"rememberSaveable persists composable-level state across configuration change and process death by saving it through the same saved-instance-state mechanism, unlike plain remember which survives only recomposition.",
|
|
112
|
+
"Modifier.semantics and contentDescription describe a composable to accessibility services such as TalkBack; a non-text element with neither is invisible or unlabeled to those services.",
|
|
113
|
+
"Compose automatically expands a clickable element's touch target toward the accessible minimum, but an explicit smaller size or padding on the visual element does not by itself guarantee the enlarged touch area behaves as intended in every layout, so it must be checked rather than assumed."
|
|
114
|
+
],
|
|
115
|
+
"sources": [
|
|
116
|
+
"https://developer.android.com/develop/ui/compose/state",
|
|
117
|
+
"https://developer.android.com/develop/ui/compose/accessibility"
|
|
118
|
+
]
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"file": "official-sources.md",
|
|
122
|
+
"title": "Official Sources",
|
|
123
|
+
"purpose": "Primary Jetpack Compose UI and accessibility documentation."
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"file": "safety-checklist.md",
|
|
127
|
+
"title": "Safety Checklist",
|
|
128
|
+
"purpose": "Refusal and escalation triggers for Compose UI review."
|
|
129
|
+
}
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
}
|