AECP: Artifact-Exclusive Communication Protocol for Multi-Agent Code Generation
Organizations: University of Central Florida · AWS AI Labs
Abstract
As AI agents increasingly tackle complex repository-level coding tasks, distributing work across multiple agents is a natural way to scale beyond the capabilities of a single agent. To coordinate their interdependent work, these agents share findings and agree on interfaces between modules. However, exchanged information often serves only as context, leaving individual agents to interpret it and incorporate it into subsequent work. Consequently, shared findings may go unused and deviations from interface agreements may go undetected, undermining the reliability and efficiency of collaboration. This motivates moving part of the coordination responsibility from individual agents to the execution harness. To make shared information actionable during execution, we introduce the Artifact-Exclusive Communication Protocol (AECP). AECP requires agents to communicate exclusively through structured artifacts and specifies how the harness processes them. The harness supplies findings when agents access relevant code, screens implementations for mismatches with recorded interface commitments, and requires affected agents to revisit revised agreements. These coordination steps become part of harness execution rather than actions that agents must initiate from prior messages. Across Doc2Repo, NL2Repo, and CodeProjectEval, using closed- and open-source models including Opus-4.8 and DeepSeek-V4-Flash, AECP improves average test pass rate by 28.2% and reduces average wall time by 16.5% relative to an agent team using free-form inter-agent messages. Artifact-exclusive communication also blocks the relay of malicious instructions between agents, reducing how often they reach other agents from 95% to 0% and how often those agents act on them from 40% to 0%.
Figures & tables
| Model | Method | Doc2Repo | NL2Repo | CodeProjectEval | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Score | Time (s) | Token (M) | Score | Time (s) | Token (M) | Score | Time (s) | Token (M) | ||
| Opus -4.8 | Single | 0.71_{{\color[rgb]{0.5,0.5,0.5}\pm 0.02}} | 282_{{\color[rgb]{0.5,0.5,0.5}\pm 83}} | 7.06_{{\color[rgb]{0.5,0.5,0.5}\pm 1.12}} | 0.65_{{\color[rgb]{0.5,0.5,0.5}\pm 0.04}} | 868_{{\color[rgb]{0.5,0.5,0.5}\pm 97}} | 7.49_{{\color[rgb]{0.5,0.5,0.5}\pm 0.62}} | 0.41_{{\color[rgb]{0.5,0.5,0.5}\pm 0.05}} | 894_{{\color[rgb]{0.5,0.5,0.5}\pm 126}} | 4.89_{{\color[rgb]{0.5,0.5,0.5}\pm 0.29}} |
| Team-Freedom | 0.52_{{\color[rgb]{0.5,0.5,0.5}\pm 0.05}} | 505_{{\color[rgb]{0.5,0.5,0.5}\pm 146}} | 8.71_{{\color[rgb]{0.5,0.5,0.5}\pm 0.38}} | 0.51_{{\color[rgb]{0.5,0.5,0.5}\pm 0.03}} | 1{,}194_{{\color[rgb]{0.5,0.5,0.5}\pm 71}} | 6.90_{{\color[rgb]{0.5,0.5,0.5}\pm 1.31}} | 0.25_{{\color[rgb]{0.5,0.5,0.5}\pm 0.02}} | 1{,}038_{{\color[rgb]{0.5,0.5,0.5}\pm 94}} | 5.10_{{\color[rgb]{0.5,0.5,0.5}\pm 0.87}} | |
| Team-Integrator | 0.68_{{\color[rgb]{0.5,0.5,0.5}\pm 0.02}} | 607_{{\color[rgb]{0.5,0.5,0.5}\pm 88}} | 18.57_{{\color[rgb]{0.5,0.5,0.5}\pm 1.57}} | 0.66_{{\color[rgb]{0.5,0.5,0.5}\pm 0.05}} | 1{,}753_{{\color[rgb]{0.5,0.5,0.5}\pm 119}} | 10.45_{{\color[rgb]{0.5,0.5,0.5}\pm 0.44}} | 0.42_{{\color[rgb]{0.5,0.5,0.5}\pm 0.04}} | 830_{{\color[rgb]{0.5,0.5,0.5}\pm 153}} | 8.43_{{\color[rgb]{0.5,0.5,0.5}\pm 0.36}} | |
| AECP | 0.70_{{\color[rgb]{0.5,0.5,0.5}\pm 0.04}} | 330_{{\color[rgb]{0.5,0.5,0.5}\pm 76}} | 8.24_{{\color[rgb]{0.5,0.5,0.5}\pm 0.51}} | 0.68_{{\color[rgb]{0.5,0.5,0.5}\pm 0.03}} | 775_{{\color[rgb]{0.5,0.5,0.5}\pm 134}} | 10.09_{{\color[rgb]{0.5,0.5,0.5}\pm 1.09}} | 0.44_{{\color[rgb]{0.5,0.5,0.5}\pm 0.03}} | 871_{{\color[rgb]{0.5,0.5,0.5}\pm 112}} | 6.72_{{\color[rgb]{0.5,0.5,0.5}\pm 1.24}} | |
| Opus -4.6 | Single | 0.59_{{\color[rgb]{0.5,0.5,0.5}\pm 0.04}} | 329_{{\color[rgb]{0.5,0.5,0.5}\pm 61}} | 3.29_{{\color[rgb]{0.5,0.5,0.5}\pm 0.18}} | 0.62_{{\color[rgb]{0.5,0.5,0.5}\pm 0.05}} | 1{,}511_{{\color[rgb]{0.5,0.5,0.5}\pm 86}} | 6.43_{{\color[rgb]{0.5,0.5,0.5}\pm 0.28}} | 0.31_{{\color[rgb]{0.5,0.5,0.5}\pm 0.05}} | 1{,}722_{{\color[rgb]{0.5,0.5,0.5}\pm 93}} | 4.12_{{\color[rgb]{0.5,0.5,0.5}\pm 0.21}} |
| Method | AWS Strands | mini-SWE | ||||
|---|---|---|---|---|---|---|
| Score | Time | Token | Score | Time | Token | |
| Single | ||||||
| Team-Freedom | ||||||
| Team-Integrator | ||||||
| AECP | ||||||
| Adaptive subset | Selected | Forced | ||
|---|---|---|---|---|
| Time (s) | Score | Time (s) | Score | |
| (39 tasks) | ||||
| (17 tasks) | ||||
| (45 tasks) | ||||
| (3 tasks) | ||||
| All 104 tasks | ||||
| Metric | Team-Freedom | AECP |
|---|---|---|
| Reach | ( ) | ( ) |
| Adoption | ( ) | ( ) |
Appendix figures & tables4 assets
Supplementary material from the paper’s appendix.
Appendix
| Construct | Treatment |
|---|---|
| Default values | Parameter names, order, and keyword-only parameters are compared; default values are not. |
| *args / **kwargs | Abstain on the call shape. |
| Missing annotations | Abstain on the type comparison. |
| Function decorators | The signature is read from the definition as written. |
| @overload | The final, implementing definition is checked. |
| @dataclass without init | The constructor is derived from the annotated fields. |
| Method | w/o Adaptive Thinking | w/ Adaptive Thinking | |||||
|---|---|---|---|---|---|---|---|
| Score | Time (s) | Token (M) | Score | Time (s) | Token (M) | AT Rate | |
| Single | |||||||
| Team-Freedom | |||||||
| Team-Integrator | |||||||
| AECP | |||||||
| Leader | Worker | Score | Time (s) | Cost ($/repo) |
|---|---|---|---|---|
| DS-V4-Flash | DS-V4-Flash | \0.12$ | ||
| Opus-4.8 | DS-V4-Flash | \0.69$ | ||
| Opus-4.8 | Opus-4.8 | \2.03$ |