| name | arch-cross-service-integration |
| description | [Architecture] Use when designing or implementing cross-service communication, data synchronization, or service boundary patterns. Use when this capability is needed. |
[IMPORTANT] Use TaskCreate to break ALL work into small tasks BEFORE starting — including tasks for each file read. This prevents context loss from long files. For simple tasks, AI MUST ATTENTION ask user whether to skip.
Evidence-Based Reasoning — Speculation is FORBIDDEN. Every claim needs proof.
- Cite
file:line, grep results, or framework docs for EVERY claim
- Declare confidence: >80% act freely, 60-80% verify first, <60% DO NOT recommend
- Cross-service validation required for architectural changes
- "I don't have enough evidence" is valid and expected output
BLOCKED until: - [ ] Evidence file path (file:line) - [ ] Grep search performed - [ ] 3+ similar patterns found - [ ] Confidence level stated
Forbidden without proof: "obviously", "I think", "should be", "probably", "this is because"
If incomplete → output: "Insufficient evidence. Verified: [...]. Not verified: [...]."
docs/project-reference/domain-entities-reference.md — Domain entity catalog, relationships, cross-service sync (read when task involves business entities/models) (content auto-injected by hook — check for [Injected: ...] header before reading)
Quick Summary
Goal: Design and implement cross-service communication, data sync, and service boundary patterns.
Workflow:
- Pre-Flight — Identify source/target services, data ownership, sync vs async
- Choose Pattern — Entity Event Bus (recommended), Direct API, never shared DB
- Implement — Producer + Consumer with dependency waiting and race condition handling
- Test — Verify create/update/delete flows, out-of-order messages, force sync
Key Rules:
- Never access another service's database directly
- Use
LastMessageSyncDate for conflict resolution (only update if newer)
- Consumers must wait for dependencies with
TryWaitUntilAsync
- Messages defined in shared project (search for: shared message definitions, bus message classes)
Be skeptical. Apply critical thinking, sequential thinking. Every claim needs traced proof, confidence percentages (Idea should be more than 80%).
MANDATORY IMPORTANT MUST ATTENTION Plan ToDo Task to READ the following project-specific reference doc:
backend-patterns-reference.md — backend CQRS, entity event bus, message bus patterns
If file not found, search for: cross-service message definitions, entity event producers, message bus consumers.
Cross-Service Integration Workflow
When to Use This Skill
- Designing service-to-service communication
- Implementing data synchronization
- Analyzing service boundaries
- Troubleshooting cross-service issues
Pre-Flight Checklist
Service Boundaries
Note: Search for project-structure-reference.md or the project's service directories to discover the platform's service map, data ownership matrix, and shared infrastructure components.
Communication Patterns
Pattern 1: Entity Event Bus (Recommended)
Use when: Source service owns data, target services need copies.
Source Service Target Service
┌────────────┐ ┌────────────┐
│ Employee │──── Create ────▶ │ Repository │
│ Repository │ └────────────┘
└────────────┘ │
│ │
│ Auto-raise │
▼ ▼
┌────────────┐ ┌────────────┐
│ Producer │── MsgBus ────▶ │ Consumer │
└────────────┘ └────────────┘
⚠️ MUST ATTENTION READ: CLAUDE.md for Entity Event Bus Producer and Message Bus Consumer implementation patterns.
Pattern 2: Direct API Call
Use when: Real-time data needed, no local copy required.
public class ServiceBApiClient
{
private readonly HttpClient _client;
public async Task<UserDto?> GetUserAsync(string userId)
{
var response = await _client.GetAsync($"/api/User/{userId}");
if (!response.IsSuccessStatusCode) return null;
return await response.Content.ReadFromJsonAsync<UserDto>();
}
}
Considerations:
- Add circuit breaker for resilience
- Cache responses when possible
- Handle service unavailability
Pattern 3: Shared Database View (Anti-Pattern!)
:x: DO NOT USE: Violates service boundaries
var accountsData = await accountsDbContext.Users.ToListAsync();
Data Ownership Matrix
Note: Search for project-structure-reference.md or the project's documentation for the entity ownership matrix. Each entity should have exactly ONE owning service; consumers receive synced copies via message bus.
Synchronization Patterns
Full Sync (Initial/Recovery)
public class FullSyncJob : BackgroundJobExecutor
{
public override async Task ProcessAsync(object? param)
{
var allEmployees = await sourceApi.GetAllAsync();
foreach (var batch in allEmployees.Batch(100))
{
await localRepo.CreateOrUpdateManyAsync(
batch.Select(MapToLocal),
dismissSendEvent: true);
}
}
}
Incremental Sync (Event-Driven)
internal sealed class EmployeeSyncConsumer : MessageBusConsumer<EmployeeEventBusMessage>
{
public override async Task HandleLogicAsync(EmployeeEventBusMessage message, string routingKey)
{
if (existing?.LastMessageSyncDate > message.CreatedUtcDate)
return;
await ApplyChange(message);
}
}
Conflict Resolution
Use LastMessageSyncDate for ordering - only update if message is newer. See CLAUDE.md Message Bus Consumer pattern for full implementation.
Integration Checklist
Before Integration
Implementation
Testing
Troubleshooting
Message Not Arriving
grep -r "HandleWhen" --include="*Producer.cs" -A 5
grep -r "AddConsumer" --include="*.cs"
Data Mismatch
SELECT COUNT(*) FROM Employees WHERE IsActive = 1;
SELECT COUNT(*) FROM SyncedEmployees;
Stuck Messages
Logger.LogWarning("Waiting for Company {CompanyId}", companyId);
await messageBus.PublishAsync(message.With(m => m.IsForceSync = true));
Anti-Patterns to AVOID
:x: Direct database access
await otherServiceDbContext.Table.ToListAsync();
:x: Synchronous cross-service calls in transaction
using var transaction = await db.BeginTransactionAsync();
await externalService.NotifyAsync();
await transaction.CommitAsync();
:x: No dependency waiting
await repo.CreateAsync(employee);
await Util.TaskRunner.TryWaitUntilAsync(() => companyRepo.AnyAsync(...));
:x: Ignoring message order
await repo.UpdateAsync(entity);
if (existing.LastMessageSyncDate <= message.CreatedUtcDate)
Verification Checklist
Related
arch-security-review
api-design
Closing Reminders
- MANDATORY IMPORTANT MUST ATTENTION break work into small todo tasks using
TaskCreate BEFORE starting
- MANDATORY IMPORTANT MUST ATTENTION search codebase for 3+ similar patterns before creating new code
- MANDATORY IMPORTANT MUST ATTENTION cite
file:line evidence for every claim (confidence >80% to act)
- MANDATORY IMPORTANT MUST ATTENTION add a final review todo task to verify work quality
MANDATORY IMPORTANT MUST ATTENTION READ the following files before starting:
- MANDATORY IMPORTANT MUST ATTENTION cite
file:line evidence for every claim. Confidence >80% to act, <60% = do NOT recommend.
Converted and distributed by TomeVault — claim your Tome and manage your conversions.