Rosentic catches compatibility conflicts between AI coding agents before they break your main branch. AST-level detection across 15+ languages, deployed as a GitHub Action.
Add one file to your repo. Rosentic runs automatically on every PR after that.
.github/workflows/ if they don't already exist. Then create a file called rosentic.yml inside. The full path from your repo root should be:
rosentic.yml. That's the entire install. The engine runs on GitHub's infrastructure. Your code is analyzed and discarded, never stored.
That's it. Commit and push. Rosentic scans automatically on every PR targeting main.
- uses: Rosentic/rosentic-action@v1 (audit, default) with: mode: enforce (blocks merge on conflicts)
Rosentic uses tree-sitter to build an AST (Abstract Syntax Tree) for every file on every active branch. From the AST, it extracts function definitions, call sites, HTTP route declarations, and HTTP client calls. Then it compares every branch pair to find incompatibilities.
The engine is deterministic. Same input, same output. No LLM inference, no hallucination, no false positives from model uncertainty. Tree-sitter parsing is production-grade from day one.
Full AST parsing and symbol extraction across 15+ languages:
| Layer | What It Detects | Status |
|---|---|---|
| L1 - Symbol Graph | Function signature mismatches across 15+ languages. Function changed parameters but callers still use old signature. | Built |
| L2 - Route Contracts | HTTP contract conflicts. Route changed required fields, client still sends old fields. Supports Go (Chi, Gin, Echo, Gorilla, Fiber, stdlib), Java/Kotlin (Spring, Micronaut, Ktor, JAX-RS), Python (Flask, FastAPI, Django), Ruby (Rails, Sinatra, Grape), TypeScript (Express, Hono, Fastify, Next.js, Koa), C# (ASP.NET), PHP (Laravel), Rust (Actix, Axum, Rocket). | Built |
| L3a - GraphQL | GraphQL schema conflicts. Schema field removed or renamed, query on another branch still references it. | Built |
| L3b - Typed Contracts | Pydantic and Zod schema conflicts. API request model changed, client still uses old shape. | Built |
| L3c - Protobuf/gRPC | Protobuf message and RPC conflicts. Field removed or field number changed, consumer still depends on old contract. | Built |
The engine deduplicates files across branches and caches scan data between runs. Most files are identical across branches and only get parsed once. Subsequent scans skip unchanged branches entirely.
| Benchmark | First Scan | Subsequent |
|---|---|---|
| Demo repo (11 branches, 69 conflicts) | 1.0s | 0.6s |
Performance on larger repos varies by file count and active branch count. The engine deduplicates files across branches and uses contract-key prefiltering to minimize comparison time.
When deployed as a GitHub Action, the workflow is:
Agent opens PR - GitHub spins up temporary runner - downloads Docker image - scans PR branch against all active branches - posts PR comment with conflict report - runner is destroyed. In audit mode (default), the check always passes. In enforce mode, the check fails when conflicts are found.
The Rosentic dashboard shows scan history, findings, trends, and the Merge Index for your repos. Sign in at api.rosentic.com/onboard.
Authentication. GitHub OAuth or magic link email. After sign-in, select your GitHub org to create a workspace.
Dashboard pages: Overview (Merge Posture), Repos, Findings, Trends, and Settings. Finding drill-down includes the Impact Layer visualization showing the blast radius of a change across branches.
To connect scans to your dashboard, add your API key to the workflow:
ROSENTIC_API_KEY. Value: your key.
PR comments continue to work the same way. The API key adds dashboard history and finding lifecycle tracking on top.
Rosentic posts inline review comments on the specific lines where conflicts are detected, in addition to the summary PR comment. Each inline comment shows the conflict type, the affected function or route, and the branch that would be impacted.
Machine-readable output for CI integration, dashboards, or custom tooling.