Dec 22, 203
QuickIDE: Transactional AI Agents for Code
ACID Semantics and Concurrency Control for LLM-Driven Edits

Marco Pranjes
Founder and Software Engineer
Abstract
As AI coding agents evolve from autocomplete to autonomous refactoring, the next hard problem isn’t model quality—it’s concurrency. Multiple agents (plus humans) propose overlapping edits across a living monorepo; without principled isolation and commit protocols, the system devolves into flaky merges, hidden regressions, and brittle rollbacks. We present QuickIDE-TXN, a transactional substrate for AI IDEs that gives LLM-driven changes database-grade guarantees: atomicity, consistency, isolation, and durability (ACID). Our design introduces (1) AST-anchored read/write sets discovered via static + dynamic analysis; (2) MVCC over source code with snapshot isolation and an optional serializable certifier; (3) semantic conflict detection at the symbol and dependency-graph level; (4) a two-phase commit extended with test/contract validators; and (5) commutativity rules for safe parallelism across agents. We formalize the model, describe algorithms and data structures, and outline an evaluation protocol mapping database theory onto software engineering reality.
1. Introduction
Modern teams want multiple AI agents working at once: one migrates an API, another fixes auth, a third localizes strings, while humans keep shipping features. Git alone can’t guarantee safety when agents generate non-textual transformations that ripple through type systems, build graphs, and tests. QuickSolutions’ QuickIDE treats each agent’s plan as a transaction with explicit dependencies and verifiable effects, so you can scale AI throughput without sacrificing trust.
2. Problem Statement
Given a repository R\mathcal{R}R with a typed dependency graph G=(V,E)G=(V,E)G=(V,E), an AI agent proposes an edit plan Π\PiΠ (a set of AST-level transformations) driven by an intent I\mathcal{I}I. Multiple plans {Π1,Π2,… }\{\Pi_1,\Pi_2,\dots\}{Π1,Π2,…} execute concurrently. We require that committed states are:
Atomic: each plan commits all-or-nothing.
Consistent: repo invariants Φ\PhiΦ (parse, type, build, tests, policies) hold.
Isolated: observable effects are as if plans executed serially under a chosen isolation level.
Durable: committed changes and their provenance survive crashes and are reproducible.
We model a plan Π\PiΠ as touching a read set R(Π)R(\Pi)R(Π) and write set W(Π)W(\Pi)W(Π) over semantic items (symbols, signatures, build targets, contracts), not just bytes in files.
3. Design Overview
QuickIDE-TXN layers transactional control under the existing QuickIDE pipeline:
(a) Snapshotting. Each plan runs over a MVCC snapshot StS_tSt materialized from a commit SHA plus generated artifacts (schemas, OpenAPI, build graphs).
(b) Read/Write Discovery. As the plan analyzes and previews edits, we record touches at the symbol and rule level.
(c) Validation (Certifier). On commit, a certifier checks version conflicts, re-executes static checks, targeted tests, and policies on a merged candidate.
(d) Commit Protocol. Two-phase commit (2PC) with semantic locks for high-risk regions and lease-based ownership gates (codeowners, security).
(e) Provenance. A durable ledger stores snapshot ID, tool invocations, model hashes, context bundles, R/W sets, and validator outcomes.
4. MVCC for Source Code
We adapt multi-version concurrency control (MVCC) to code:
Versions. Each semantic item x∈Ux \in \mathcal{U}x∈U (e.g., method
AuthToken.validate
) carries versions x(0),x(1),…x^{(0)}, x^{(1)}, \dotsx(0),x(1),… aligned with repository commits and generated artifacts (types, graphs).Snapshot StS_tSt. A plan sees the most recent committed versions whose commit timestamps ≤t\le t≤t.
Writes. A plan produces tentative versions x(t,Π)x^{(t,\Pi)}x(t,Π) in a private workspace.
Read Stability. Before commit, we ensure every x∈R(Π)x \in R(\Pi)x∈R(Π) has not changed in an incompatible way since StS_tSt, preventing write-skew and phantom edits.
Unlike textual MVCC, semantic MVCC lifts items above lines/bytes to AST spans, symbols, and build targets so equivalent refactors don’t spuriously conflict.
5. Discovering Read/Write Sets
We cannot rely on naive “files touched” lists. QuickIDE-TXN constructs R/W sets with multiple signals:
Static analysis
Parse with language servers (LSP/Tree-sitter).
Build symbol tables, call graphs, import graphs.
Compute impact cones: upward callers, downward dependencies, and build rules for targets.
Dynamic evidence
Coverage maps from targeted test execution to capture runtime links missed statically (reflection, DI).
Tracepoints for framework conventions (e.g., Spring Boot autowiring, Rails ActiveRecord).
Intent binding
As an LLM proposes edits, QuickIDE binds patches to AST nodes; every bound node is added to W(Π)W(\Pi)W(Π).
Any symbol resolved for context selection is added to R(Π)R(\Pi)R(Π) with a strength (hard/soft read).
Granularity. Items in R/WR/WR/W are normalized to (file, AST-path, symbol-ID, target-ID) tuples. This lets disjoint functions in the same file commute.
6. Isolation Levels for AI Plans
We implement three isolation tiers, selectable per plan and policy:
Read Committed (RC). Plans read only committed snapshots; conflicts checked only on overlapping writes. High throughput, may allow write-skew.
Snapshot Isolation (SI). Plans read a stable snapshot; certifier rejects write/write conflicts and dangerous structure (e.g., signature changes under both plans). Prevents many anomalies with low overhead.
Serializable (SER). Adds a certifier that detects cycles in the serialization graph of plans using predicate locks on query-like reads (“all call sites of
foo
”) to prevent phantoms. Strongest, used for risky refactors.
Predicate Locks for Code
A plan that queries “all implementers of interface I
” registers a predicate over the type hierarchy. If a concurrent plan adds a new implementer, the certifier flags a phantom and retries.
7. Semantic Conflict Detection
Traditional merges can’t tell whether two changes commute. We define commutativity over edit footprints:
Two edits δ1,δ2\delta_1, \delta_2δ1,δ2 commute iff:
Their write footprints are disjoint: W(δ1)∩W(δ2)=∅W(\delta_1) \cap W(\delta_2) = \varnothingW(δ1)∩W(δ2)=∅, and
No read of one overlaps a write of the other in a way that invalidates derived constraints:
(R(δ1)∩W(δ2))∪(R(δ2)∩W(δ1))(R(\delta_1) \cap W(\delta_2)) \cup (R(\delta_2) \cap W(\delta_1))(R(δ1)∩W(δ2))∪(R(δ2)∩W(δ1)) contains no semantic blockers (e.g., type signature dependencies, visibility).
We encode blockers with capability types (signature, body, visibility, contract, build). A write to capability signature
blocks any read of body
that assumes the old signature.
8. The Certifier: From “git merge” to “prove it safe”
At commit time, QuickIDE-TXN runs a certifier:
Version check. Ensure every item in R(Π)R(\Pi)R(Π) is unchanged in capabilities that matter; rebase otherwise.
Semantic merge. AST-aware 3-way merge; escalate to semantic conflicts (signature vs. call-site edits).
Repository invariants. Parse, type, and build.
Targeted tests. Execute tests covering W(Π)W(\Pi)W(Π) and its impact cone; escalate to full suite if risk score >θ> \theta>θ.
Contract/Policy checks. Security rules, API compatibility, license/dep allowlists.
Serialization graph test (SER only). Detect cycles via read/write/predicate dependency edges.
If any stage fails, the plan enters repair (see §10) or abort.
9. Two-Phase Commit with Semantic Locks
We extend 2PC to source:
Prepare. The coordinator freezes the candidate merge, acquires semantic locks on high-risk items (e.g., public API symbols, security modules), and snapshots validator artifacts (type graph, build cache).
Vote. Validators and ownership gates vote commit/abort with reasons.
Commit. If all votes are commit, write the merged tree, update the provenance ledger, and stamp MVCC versions. Otherwise, rollback is automatic via the staged workspace.
Leases & Ownership. Certain paths require reviewer leases (from CODEOWNERS
policy). The coordinator treats missing leases as not prepared.
10. Automatic Repair & Reconciliation
Instead of failing at the first conflict, QuickIDE-TXN can repair:
Adapter synthesis. If
foo(a)
becamefoo(a,b=default)
, synthesize shims or default arguments for legacy callers.Constraint-guided re-planning. Feed counterexamples (type errors, failing tests) back to the edit planner; regenerate minimal fixes.
Commutativity rewrites. Transform edits to commute (e.g., split a large refactor into signature-only + body moves across separate transactions).
Repairs produce a delta plan Π′\Pi'Π′ with a fresh R/W set and re-certification.
11. Multi-Agent Scheduling
When N agents run, we need throughput without livelock.
Priority queues by risk and blast radius.
Batching of compatible plans detected by commutativity prechecks.
Backoff & jitter for congested symbols (e.g., hot APIs).
Fairness across owners: per-owner quota windows so one team’s broad refactor doesn’t starve others.
Speculative reads: agents can precompute suggestions on RC snapshots, but promotion to SI/SER is required to merge.
12. Formalization
Let plans Πi\Pi_iΠi produce dependency edges:
RW edges Πi→Πj\Pi_i \rightarrow \Pi_jΠi→Πj if W(Πi)∩R(Πj)≠∅W(\Pi_i) \cap R(\Pi_j) \ne \varnothingW(Πi)∩R(Πj)=∅ (i writes what j reads).
WW edges if W(Πi)∩W(Πj)≠∅W(\Pi_i) \cap W(\Pi_j) \ne \varnothingW(Πi)∩W(Πj)=∅.
Pred edges if Πi\Pi_iΠi changes membership of a predicate read by Πj\Pi_jΠj.
Under Serializable, we require a DAG over {RW, WW, Pred}. The certifier builds this serialization graph incrementally; any cycle forces abort/retry of a lower-priority plan.
13. Implementation Notes in QuickIDE
Semantic catalog. We maintain a keyed store over
(lang, file, symbol-id, capability)
→ versioned payload and hashes.Delta-aware indexing. Retrieval and context selection see both committed and tentative versions, so LLMs reason with the current snapshot of a plan.
Lightweight guards. LLMs can request tool actions; the orchestrator mediates, attaches read/write intents, and denies actions that escape the snapshot (no raw shell).
Build graph MVCC. Build rules (
BUILD
,pom.xml
,Cargo.toml
) are first-class items; toolchain digests pinned in the snapshot ensure hermetic validation.Provenance ledger. Content-addressed records:
{intent, snapshot, R/W sets, tool runs, model IDs, prompts, merges, validator results}
enabling replay and audit.
14. Example Walkthrough
Scenario. Three concurrent plans:
ΠA\Pi_AΠA: Rename
UserId
→AccountId
in auth service (public API).ΠB\Pi_BΠB: Introduce rate-limiting middleware, touching request context + config.
ΠC\Pi_CΠC: Internationalize user-facing strings in
web/
.
Execution.
All take the same snapshot StS_tSt.
ΠA\Pi_AΠA (SER) registers predicate reads: all call sites of
UserId
in public modules.ΠB\Pi_BΠB (SI) reads request context traits and writes middleware registry.
ΠC\Pi_CΠC (RC) writes string tables; reads only UI components.
Certifier.
ΠA\Pi_AΠA conflicts with a late change adding a new
UserId
consumer → phantom detected → ΠA\Pi_AΠA retries on newer snapshot, synthesizes an adapter for the new call site.ΠB\Pi_BΠB passes SI checks; targeted tests run on
gateway/
andauth/
impact cone.ΠC\Pi_CΠC commits early; its writes commute with both A and B (no shared capabilities).
Net: high throughput, no hidden breakage, and a clear provenance trail.
15. Evaluation Protocol
We extend the earlier EditBench-R with TXNBench:
Workloads: (1) API rename + parallel feature work; (2) cross-repo build rule update + docsite regen; (3) framework upgrade with adapters; (4) security patch with backports.
Metrics:
Abort rate by isolation level (RC/SI/SER).
False conflict rate (textual vs. semantic).
Throughput under N agents.
Invariant violations caught pre- vs post-commit.
Mean time to repair after conflicts.
Developer accept rate of PRs.
We also measure serialization graph cycles, predicate lock contention, and test amplification cost to tune policies.
16. Security & Governance
Policy-scoped isolation: security-sensitive domains force SER + reviewer leases.
Secret hygiene: secrets never enter prompts; validators scan diffs for egress vectors.
Supply chain: dependency updates require signed provenance and license checks.
Model governance: model versions and decoding params are stamped in the ledger for reproducibility.
17. Limitations & Future Work
Language heterogeneity: sound R/W discovery is harder in dynamic languages; we compensate with runtime traces and conservative predicates.
Flaky tests: SI can spuriously abort if validators hit flakiness; we incorporate flake-aware reruns and quarantine lists.
Global renames: even with predicates, SER may thrash under massive, fast-moving repos; we plan sharded predicates and epoch-style change windows.
Human factors: exposing isolation levels to developers needs a simple UX; QuickIDE will surface why a transaction waits, with suggested commutativity rewrites.
18. Conclusion
If AI is going to edit real code at scale, it needs more than clever prompts—it needs transactions. QuickIDE-TXN brings ACID semantics, MVCC, and a certifier to the coding world, translating decades of database wisdom into practical guardrails for LLM-driven development. The result is parallelism without chaos: multiple agents and humans can move fast, commit safely, and trust that every change is provably good—or cleanly rolled back.
-Marco and spelling checked by AI