# Control / Coordination / Centralization

> Every principle in this category is listed as a record.

Page: Ontology · Principles
Canonical: https://banes-lab.com/ontology#arch-category-control-coordination-centralization

Every principle in this category is listed as a record. Each record carries its kind, its severity, the scopes it applies at and the layer it lives in, then the edge relations that join it to other records, the records that point back at it, the contracts that answer to it and the tensions it takes part in. The descriptors say how it is violated, detected, measured, repaired and enforced. Where the record carries one, an exemplar shows the shape before and after the principle is applied.

Relations diagram

The relations inside this category.

```mermaid
flowchart LR
n_control_plane["Control Plane"]
n_orchestration["Orchestration"]
n_centralized_configuration["Centralized Configuration"]
n_centralized_authentication["Centralized Authentication"]
n_centralized_logging["Centralized Logging"]
n_decentralization["Decentralization"]
n_leader_election["Leader Election"]
n_consensus["Consensus"]
n_choreography["Choreography"]
n_control_plane --> n_orchestration
n_orchestration --> n_control_plane
n_leader_election --> n_consensus
n_leader_election --> n_control_plane
n_choreography --> n_decentralization
```

### Control Plane

- Kind: [artifact](https://banes-lab.com/records/kind/artifact.md)
- Severity: contextual
- Scope: platform, infrastructure, distributed system
- Layer: [Execution Core](https://banes-lab.com/records/layer/execution-core.md)

Details

Requires
[Management API](https://banes-lab.com/records/lex/management-api.md), [Policy](https://banes-lab.com/records/lex/policy.md)

Reinforces
[Governance](https://banes-lab.com/records/arch/governance.md), [Orchestration](https://banes-lab.com/records/arch/orchestration.md)

Enables
[Centralized Control of Distributed Runtime](https://banes-lab.com/records/lex/centralized-control-of-distributed-runtime.md)

In tension with
[Availability](https://banes-lab.com/records/lex/availability.md)

Conflicts with
[Fully Decentralized Control](https://banes-lab.com/records/lex/fully-decentralized-control.md)

Referenced by
[Orchestration](https://banes-lab.com/records/arch/orchestration.md), [Leader Election](https://banes-lab.com/records/arch/leader-election.md)

Contracts
[Control Plane](https://banes-lab.com/records/algo/control-plane.md)

Tensions
[Control Plane Availability](https://banes-lab.com/records/tension/availability-control-plane.md)

Violated by
unmanaged distributed configuration/control

Detected by
manual node/service control

Measured by
control coverage, control-plane availability

Refactored by
Add Control Plane, Externalize Policy

Enforced by
platform architecture

Before

```typescript
for (const node of fooNodes) {
node.configure({ retries: 3, timeoutMs: 500 });
}
```

After

```typescript
controlPlane.apply("foo-service", {
retries: 3,
timeoutMs: 500,
rollout: "progressive",
});
```

### Orchestration

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Severity: contextual
- Scope: workflow, deployment, services
- Layer: [Execution Core](https://banes-lab.com/records/layer/execution-core.md)

Details

Requires
[Coordinator](https://banes-lab.com/records/lex/coordinator.md)

Reinforces
[Control Plane](https://banes-lab.com/records/arch/control-plane.md), [Saga](https://banes-lab.com/records/lex/saga.md)

Enables
[Ordered Multi-Step Execution](https://banes-lab.com/records/lex/ordered-multi-step-execution.md)

In tension with
[Centralized Coordinator Coupling](https://banes-lab.com/records/lex/centralized-coordinator-coupling.md)

Conflicts with
[Pure Choreography](https://banes-lab.com/records/lex/pure-choreography.md)

Referenced by
[Control Plane](https://banes-lab.com/records/arch/control-plane.md)

Tensions
[Orchestration Centralized Coordinator Coupling](https://banes-lab.com/records/tension/centralized-coordinator-coupling-orchestration.md)

Violated by
implicit fragile workflow spread across services

Detected by
unclear workflow ownership

Measured by
workflow observability/completion

Refactored by
Add Orchestrator, Define Workflow

Enforced by
workflow tests

Before

```typescript
await fooService.create(foo);
await barService.create(bar);
await bazService.create(baz);
```

After

```typescript
await orchestrator.run("CreateFooFlow", {
steps: [
step("foo", () => fooService.create(foo)),
step("bar", () => barService.create(bar)),
step("baz", () => bazService.create(baz)),
],
});
```

### Centralized Configuration

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Severity: contextual
- Scope: service, platform, runtime
- Layer: [Execution Core](https://banes-lab.com/records/layer/execution-core.md)

Details

Requires
[Config Store](https://banes-lab.com/records/lex/config-store.md), [Access Control](https://banes-lab.com/records/arch/access-control.md)

Reinforces
[Governance](https://banes-lab.com/records/arch/governance.md), [Consistency](https://banes-lab.com/records/arch/consistency.md)

Enables
[Unified Config Management](https://banes-lab.com/records/lex/unified-config-management.md)

In tension with
[Central Dependency Risk](https://banes-lab.com/records/lex/central-dependency-risk.md)

Conflicts with
[Scattered Configuration](https://banes-lab.com/records/lex/scattered-configuration.md)

Tensions
[Centralized Configuration Central Dependency Risk](https://banes-lab.com/records/tension/central-dependency-risk-centralized-configuration.md)

Violated by
duplicated divergent configs

Detected by
config drift

Measured by
config drift count

Refactored by
Move to Central Config, Add Schema

Enforced by
config policy

Before

```typescript
const fooConfig = loadLocalFooConfig();
const barConfig = loadLocalBarConfig();
const bazConfig = loadLocalBazConfig();
```

After

```typescript
const config = await configService.readVersioned("platform/v3");
fooApp.apply(config.foo);
barApp.apply(config.bar);
bazApp.apply(config.baz);
```

### Centralized Authentication

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Severity: recommended
- Scope: identity, system
- Layer: [Execution Core](https://banes-lab.com/records/layer/execution-core.md)

Details

Requires
[Identity Provider](https://banes-lab.com/records/lex/identity-provider.md)

Reinforces
[Security](https://banes-lab.com/records/lex/security.md), [Governance](https://banes-lab.com/records/arch/governance.md)

Enables
[Unified Identity](https://banes-lab.com/records/lex/unified-identity.md)

In tension with
[Identity Provider Availability](https://banes-lab.com/records/lex/identity-provider-availability.md)

Conflicts with
[Scattered Auth Implementations](https://banes-lab.com/records/lex/scattered-auth-implementations.md)

Tensions
[Centralized Authentication Identity Provider Availability](https://banes-lab.com/records/tension/centralized-authentication-identity-provider-availability.md)

Violated by
custom auth per service without federation

Detected by
duplicated credential stores

Measured by
auth centralization coverage

Refactored by
Introduce IdP, Federate Auth

Enforced by
[security policy](https://banes-lab.com/records/algo/security-policy.md)

Before

```typescript
fooService.verifyToken(token);
barService.verifyToken(token);
bazService.verifyToken(token);
```

After

```typescript
const identity = await identityProvider.authenticate(token);
await fooService.handle({ identity });
await barService.handle({ identity });
await bazService.handle({ identity });
```

### Centralized Logging

- Kind: [pattern](https://banes-lab.com/records/kind/pattern.md)
- Severity: recommended
- Scope: services, platform
- Layer: [Execution Core](https://banes-lab.com/records/layer/execution-core.md)

Details

Requires
[Log Aggregation](https://banes-lab.com/records/lex/log-aggregation.md)

Reinforces
[Observability](https://banes-lab.com/records/arch/observability.md), [Auditability](https://banes-lab.com/records/arch/auditability.md)

Enables
[Cross-Service Analysis](https://banes-lab.com/records/lex/cross-service-analysis.md)

In tension with
[Cost/Personal Data Exposure](https://banes-lab.com/records/lex/cost-personal-data-exposure.md)

Conflicts with
[Local-Only Logs](https://banes-lab.com/records/lex/local-only-logs.md)

Tensions
[Centralized Logging Cost/Personal Data Exposure](https://banes-lab.com/records/tension/centralized-logging-cost-personal-data-exposure.md)

Violated by
logs only available per instance

Detected by
missing log shipping

Measured by
log ingestion coverage

Refactored by
Add Log Forwarder, Standardize Fields

Enforced by
observability policy

Before

```typescript
fooService.writeLocalLog(event);
barService.writeLocalLog(event);
bazService.writeLocalLog(event);
```

After

```typescript
const sink = new CentralLogSink();
fooService.useLogger(structuredLogger(sink));
barService.useLogger(structuredLogger(sink));
bazService.useLogger(structuredLogger(sink));
```

### Decentralization

- Kind: [principle](https://banes-lab.com/records/kind/principle.md)
- Severity: contextual
- Scope: system, team, service
- Layer: [Execution Core](https://banes-lab.com/records/layer/execution-core.md)

Details

Requires
[Autonomy](https://banes-lab.com/records/arch/autonomy.md), [Contracts](https://banes-lab.com/records/lex/contracts.md)

Reinforces
[Microservices](https://banes-lab.com/records/arch/microservices.md), [Resilience](https://banes-lab.com/records/arch/resilience.md)

Enables
[Independent Ownership](https://banes-lab.com/records/lex/independent-ownership.md)

In tension with
[Governance](https://banes-lab.com/records/arch/governance.md), [Consistency](https://banes-lab.com/records/arch/consistency.md)

Conflicts with
[Centralized Control](https://banes-lab.com/records/lex/centralized-control.md)

Referenced by
[Choreography](https://banes-lab.com/records/arch/choreography.md), [Autonomy](https://banes-lab.com/records/arch/autonomy.md), [Single Source of Truth](https://banes-lab.com/records/arch/single-source-of-truth.md)

Tensions
[Decentralization Governance](https://banes-lab.com/records/tension/decentralization-governance.md), [Decentralization Consistency](https://banes-lab.com/records/tension/consistency-decentralization.md)

Violated by
central bottleneck for independent decisions/runtime

Detected by
centralized team/service dependency

Measured by
decision/deployment dependency count

Refactored by
Delegate Ownership, Split Service/Control

Enforced by
ownership model

Before

```typescript
const coordinator = new GlobalFooCoordinator();
await coordinator.approveEveryFoo(foo);
```

After

```typescript
await fooNode.validate(foo);
await fooNode.commit(foo);
await fooNode.publish({ type: "FooCommitted", fooId: foo.id });
```

### Leader Election

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Severity: mandatory for distributed systems
- Scope: distributed system, coordination, availability
- Layer: [Execution Core](https://banes-lab.com/records/layer/execution-core.md)

Details

Requires
[Consensus](https://banes-lab.com/records/arch/consensus.md)

Reinforces
[Control Plane](https://banes-lab.com/records/arch/control-plane.md), [Fault Tolerance](https://banes-lab.com/records/arch/fault-tolerance.md)

Enables
[Single-Writer Coordination](https://banes-lab.com/records/lex/single-writer-coordination.md), [Automatic Failover of Leadership](https://banes-lab.com/records/lex/automatic-failover-of-leadership.md)

In tension with
[Availability](https://banes-lab.com/records/lex/availability.md)

Conflicts with
[Split-Brain Coordination](https://banes-lab.com/records/lex/split-brain-coordination.md)

Tensions
[Leader Election Availability](https://banes-lab.com/records/tension/availability-leader-election.md)

Violated by
multiple nodes assuming the coordinator role at once

Detected by
concurrent leader actions / split-brain

Measured by
split-brain incident rate

Refactored by
Introduce Leader Election

Enforced by
distributed-systems review

Before

```typescript
if (process.env.IS_LEADER === "true") runFooScheduler();
```

After

```typescript
const lease = await fooCoordinator.acquireLeadership("foo-scheduler", { ttlMs: 10_000 });
lease.onAcquired(() => runFooScheduler());
lease.onLost(() => stopFooScheduler());
```

### Consensus

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Severity: mandatory for distributed systems
- Scope: distributed system, agreement, consistency
- Layer: [Execution Core](https://banes-lab.com/records/layer/execution-core.md)

Details

Requires
[Quorum](https://banes-lab.com/records/lex/quorum.md)

Reinforces
[Consistency](https://banes-lab.com/records/arch/consistency.md), [Fault Tolerance](https://banes-lab.com/records/arch/fault-tolerance.md)

Enables
[Agreed Single Value Across Nodes](https://banes-lab.com/records/lex/agreed-single-value-across-nodes.md)

In tension with
[Latency](https://banes-lab.com/records/arch/latency.md), [Availability](https://banes-lab.com/records/lex/availability.md)

Conflicts with
[Independent Node Decisions](https://banes-lab.com/records/lex/independent-node-decisions.md)

Referenced by
[Total-Order Broadcast](https://banes-lab.com/records/arch/total-order-broadcast.md), [Leader Election](https://banes-lab.com/records/arch/leader-election.md)

Tensions
[Consensus Latency](https://banes-lab.com/records/tension/consensus-latency.md), [Consensus Availability](https://banes-lab.com/records/tension/availability-consensus.md)

Violated by
nodes committing values without quorum agreement

Detected by
divergent committed state across replicas

Measured by
agreement-violation rate

Refactored by
Adopt a Consensus Protocol

Enforced by
distributed-systems review

Before

```typescript
fooNodeA.setValue(value);
```

After

```typescript
const committed = await fooCluster.propose(value, { quorum: majority(fooNodes) });
if (!committed.accepted) throw new NoQuorumError();
```

### Choreography

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Severity: contextual
- Scope: distributed system, coordination, event
- Layer: [Execution Core](https://banes-lab.com/records/layer/execution-core.md)

Details

Requires
[Event-Driven Architecture](https://banes-lab.com/records/arch/event-driven-architecture.md)

Reinforces
[Decentralization](https://banes-lab.com/records/arch/decentralization.md), [Service Autonomy](https://banes-lab.com/records/arch/service-autonomy.md)

Enables
[Central-Orchestrator-Free Coordination](https://banes-lab.com/records/lex/central-orchestrator-free-coordination.md)

In tension with
[Traceability](https://banes-lab.com/records/arch/traceability.md)

Conflicts with
[Central Orchestrator Bottleneck](https://banes-lab.com/records/lex/central-orchestrator-bottleneck.md)

Tensions
[Choreography Traceability](https://banes-lab.com/records/tension/choreography-traceability.md)

Violated by
one orchestrator commanding every step of a cross-service flow

Detected by
a central coordinator coupled to all participants

Measured by
orchestrator fan-out coupling

Refactored by
Coordinate via Choreographed Events

Enforced by
[architecture review](https://banes-lab.com/records/arch/architecture-review.md)

Before

```typescript
await orchestrator.run("CreateFoo", [
() => createFoo(foo),
() => reserveBar(foo),
() => notifyBaz(foo),
]);
```

After

```typescript
fooEvents.on("FooCreated", event => barService.reserve(event.fooId));
barEvents.on("BarReserved", event => bazService.notify(event.fooId));
```

## Links to

- [artifact](https://banes-lab.com/records/kind/artifact.md)
- [Execution Core](https://banes-lab.com/records/layer/execution-core.md)
- [Management API](https://banes-lab.com/records/lex/management-api.md)
- [Policy](https://banes-lab.com/records/lex/policy.md)
- [Governance](https://banes-lab.com/records/arch/governance.md)
- [Orchestration](https://banes-lab.com/records/arch/orchestration.md)
- [Centralized Control of Distributed Runtime](https://banes-lab.com/records/lex/centralized-control-of-distributed-runtime.md)
- [Availability](https://banes-lab.com/records/lex/availability.md)
- [Fully Decentralized Control](https://banes-lab.com/records/lex/fully-decentralized-control.md)
- [Leader Election](https://banes-lab.com/records/arch/leader-election.md)
- [Control Plane](https://banes-lab.com/records/algo/control-plane.md)
- [Control Plane / Availability](https://banes-lab.com/records/tension/availability-control-plane.md)
- [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- [Coordinator](https://banes-lab.com/records/lex/coordinator.md)
- [Control Plane](https://banes-lab.com/records/arch/control-plane.md)
- [Saga](https://banes-lab.com/records/lex/saga.md)
- [Ordered Multi-Step Execution](https://banes-lab.com/records/lex/ordered-multi-step-execution.md)
- [Centralized Coordinator Coupling](https://banes-lab.com/records/lex/centralized-coordinator-coupling.md)
- [Pure Choreography](https://banes-lab.com/records/lex/pure-choreography.md)
- [Orchestration / Centralized Coordinator Coupling](https://banes-lab.com/records/tension/centralized-coordinator-coupling-orchestration.md)
- [pattern](https://banes-lab.com/records/kind/pattern.md)
- [Config Store](https://banes-lab.com/records/lex/config-store.md)
- [Access Control](https://banes-lab.com/records/arch/access-control.md)
- [Consistency](https://banes-lab.com/records/arch/consistency.md)
- [Unified Config Management](https://banes-lab.com/records/lex/unified-config-management.md)
- [Central Dependency Risk](https://banes-lab.com/records/lex/central-dependency-risk.md)
- [Scattered Configuration](https://banes-lab.com/records/lex/scattered-configuration.md)
- [Centralized Configuration / Central Dependency Risk](https://banes-lab.com/records/tension/central-dependency-risk-centralized-configuration.md)
- [Identity Provider](https://banes-lab.com/records/lex/identity-provider.md)
- [Security](https://banes-lab.com/records/lex/security.md)
- [Unified Identity](https://banes-lab.com/records/lex/unified-identity.md)
- [Identity Provider Availability](https://banes-lab.com/records/lex/identity-provider-availability.md)
- [Scattered Auth Implementations](https://banes-lab.com/records/lex/scattered-auth-implementations.md)
- [Centralized Authentication / Identity Provider Availability](https://banes-lab.com/records/tension/centralized-authentication-identity-provider-availability.md)
- [Security Policy](https://banes-lab.com/records/algo/security-policy.md)
- [Log Aggregation](https://banes-lab.com/records/lex/log-aggregation.md)
- [Observability](https://banes-lab.com/records/arch/observability.md)
- [Auditability](https://banes-lab.com/records/arch/auditability.md)
- [Cross-Service Analysis](https://banes-lab.com/records/lex/cross-service-analysis.md)
- [Cost/Personal Data Exposure](https://banes-lab.com/records/lex/cost-personal-data-exposure.md)
- [Local-Only Logs](https://banes-lab.com/records/lex/local-only-logs.md)
- [Centralized Logging / Cost/Personal Data Exposure](https://banes-lab.com/records/tension/centralized-logging-cost-personal-data-exposure.md)
- [principle](https://banes-lab.com/records/kind/principle.md)
- [Autonomy](https://banes-lab.com/records/arch/autonomy.md)
- [Contracts](https://banes-lab.com/records/lex/contracts.md)
- [Microservices](https://banes-lab.com/records/arch/microservices.md)
- [Resilience](https://banes-lab.com/records/arch/resilience.md)
- [Independent Ownership](https://banes-lab.com/records/lex/independent-ownership.md)
- [Centralized Control](https://banes-lab.com/records/lex/centralized-control.md)
- [Choreography](https://banes-lab.com/records/arch/choreography.md)
- [Single Source of Truth](https://banes-lab.com/records/arch/single-source-of-truth.md)
- [Decentralization / Governance](https://banes-lab.com/records/tension/decentralization-governance.md)
- [Decentralization / Consistency](https://banes-lab.com/records/tension/consistency-decentralization.md)
- [Consensus](https://banes-lab.com/records/arch/consensus.md)
- [Fault Tolerance](https://banes-lab.com/records/arch/fault-tolerance.md)
- [Single-Writer Coordination](https://banes-lab.com/records/lex/single-writer-coordination.md)
- [Automatic Failover of Leadership](https://banes-lab.com/records/lex/automatic-failover-of-leadership.md)
- [Split-Brain Coordination](https://banes-lab.com/records/lex/split-brain-coordination.md)
- [Leader Election / Availability](https://banes-lab.com/records/tension/availability-leader-election.md)
- [Quorum](https://banes-lab.com/records/lex/quorum.md)
- [Agreed Single Value Across Nodes](https://banes-lab.com/records/lex/agreed-single-value-across-nodes.md)
- [Latency](https://banes-lab.com/records/arch/latency.md)
- [Independent Node Decisions](https://banes-lab.com/records/lex/independent-node-decisions.md)
- [Total-Order Broadcast](https://banes-lab.com/records/arch/total-order-broadcast.md)
- [Consensus / Latency](https://banes-lab.com/records/tension/consensus-latency.md)
- [Consensus / Availability](https://banes-lab.com/records/tension/availability-consensus.md)
- [Event-Driven Architecture](https://banes-lab.com/records/arch/event-driven-architecture.md)
- [Decentralization](https://banes-lab.com/records/arch/decentralization.md)
- [Service Autonomy](https://banes-lab.com/records/arch/service-autonomy.md)
- [Central-Orchestrator-Free Coordination](https://banes-lab.com/records/lex/central-orchestrator-free-coordination.md)
- [Traceability](https://banes-lab.com/records/arch/traceability.md)
- [Central Orchestrator Bottleneck](https://banes-lab.com/records/lex/central-orchestrator-bottleneck.md)
- [Choreography / Traceability](https://banes-lab.com/records/tension/choreography-traceability.md)
- [Architecture Review](https://banes-lab.com/records/arch/architecture-review.md)

## Linked from

- [The layer topology](https://banes-lab.com/ontology/schema/the-layer-topology.md)
- [The membership](https://banes-lab.com/ontology/schema/the-membership.md)
