# Runtime Discovery / Dynamic Binding

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

Page: Ontology · Principles
Canonical: https://banes-lab.com/ontology#architecture-category-runtime-discovery-dynamic-binding

Listed in [Ontology · Principles](https://banes-lab.com/api/pages/ontology/principles.md), after [Domain Architecture](https://banes-lab.com/ontology/principles/architecture-category-domain-architecture.md) and before [Causality / Ordering / Distributed Time](https://banes-lab.com/ontology/principles/architecture-category-causality-ordering-distributed-time.md).

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_runtime_discovery["Runtime Discovery"]
n_service_discovery["Service Discovery"]
n_dynamic_binding["Dynamic Binding"]
n_dynamic_dispatch["Dynamic Dispatch"]
n_runtime_extensibility["Runtime Extensibility"]
n_runtime_discovery --> n_runtime_extensibility
n_runtime_discovery --> n_service_discovery
n_dynamic_binding --> n_runtime_extensibility
```

### Runtime Discovery

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Category: [Runtime Discovery / Dynamic Binding](https://banes-lab.com/ontology/principles/architecture-category-runtime-discovery-dynamic-binding.md)
- Severity: [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)
- Scope: runtime, plugin, module, service
- Aliases: Auto-Discovery, Registry/Discovery Mechanism
- Layer: [Extensibility Core](https://banes-lab.com/records/layer/extensibility-core.md)

Details

Definition
A mechanism that finds the available handlers, plugins or services at startup by matching a naming convention, a file pattern or metadata, and registers each one it finds in place of a hand-written list.

Requires
[Metadata](https://banes-lab.com/records/lexicon/metadata.md), [Conventions](https://banes-lab.com/records/lexicon/conventions.md)

Reinforces
[Runtime Extensibility](https://banes-lab.com/records/architecture/runtime-extensibility.md)

Enables
[Plugin Architecture](https://banes-lab.com/records/architecture/plugin-architecture.md), [Service Discovery](https://banes-lab.com/records/architecture/service-discovery.md), [Self-Registration](https://banes-lab.com/records/lexicon/self-registration.md)

In tension with
[Predictability](https://banes-lab.com/records/architecture/predictability.md), [Static Analysis](https://banes-lab.com/records/architecture/static-analysis.md), [Startup Cost](https://banes-lab.com/records/lexicon/startup-cost.md)

Conflicts with
[Compile-Time Binding](https://banes-lab.com/records/lexicon/compile-time-binding.md), [Manual Registration](https://banes-lab.com/records/lexicon/manual-registration.md)

Referenced by
[Self-Describing Architecture](https://banes-lab.com/records/architecture/self-describing-architecture.md), [Metadata-Driven Design](https://banes-lab.com/records/architecture/metadata-driven-design.md), [Capability Declaration](https://banes-lab.com/records/architecture/capability-declaration.md), [Manifest-Based Design](https://banes-lab.com/records/architecture/manifest-based-design.md), [Reflection](https://banes-lab.com/records/architecture/reflection.md)

Contracts
[Runtime Discovery](https://banes-lab.com/records/algorithms/runtime-discovery.md)

Tensions
[Runtime Discovery / Predictability](https://banes-lab.com/records/tension/predictability-runtime-discovery.md), [Runtime Discovery / Static Analysis](https://banes-lab.com/records/tension/runtime-discovery-static-analysis.md), [Runtime Discovery / Startup Cost](https://banes-lab.com/records/tension/runtime-discovery-startup-cost.md)

Distinct from
[Capability Declaration](https://banes-lab.com/records/architecture/capability-declaration.md): Runtime discovery finds which components exist, while a capability declaration states what each one supports.

Distinct from
[Introspection](https://banes-lab.com/records/architecture/introspection.md): Runtime discovery finds components by convention or pattern, while introspection reads one object's type and members.

Distinct from
[Reflection](https://banes-lab.com/records/architecture/reflection.md): Runtime discovery finds and registers components, while reflection reads and acts on type metadata, which discovery may use.

Distinct from
[Service Discovery](https://banes-lab.com/records/architecture/service-discovery.md): Runtime discovery finds in-process components at startup, while service discovery resolves a service name to a network endpoint at call time.

Distinct from
[Static Analysis](https://banes-lab.com/records/architecture/static-analysis.md): Runtime discovery decides the component set as the program starts, while static analysis reasons about source that has not run.

Violated by
hardcoded dependency discovery

Detected by
manual class/service lists

Measured by
discovery coverage

Refactored by
Add Registry, Add Scanner, Add Manifest

Enforced by
startup validation

Before

```typescript
import { FooHandler } from "./foo-handler";
import { BarHandler } from "./bar-handler";
const handlers = [new FooHandler(), new BarHandler()];
```

After

```typescript
const modules = await discover<HandlerModule>("./handlers/*.handler.js");
const handlers = modules.map(module => module.create());
```

How it is checked

Checked by
startup validation

Population
Every binding the runtime resolves: handlers, plugins, services, formatters and policies

Freshness
A verdict stands until a registered module, a discovery pattern or the configuration changes

Refusal
Startup validation or the composition-root test fails when a declared binding resolves to nothing

Observation
The resolved bindings reported at startup, compared with the modules on disk and the configuration

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The modules on disk and the configuration, which the bindings reported at startup are compared against

Depends on
[Metadata](https://banes-lab.com/records/lexicon/metadata.md), [Conventions](https://banes-lab.com/records/lexicon/conventions.md), [Runtime Extensibility](https://banes-lab.com/records/architecture/runtime-extensibility.md), [Plugin Architecture](https://banes-lab.com/records/architecture/plugin-architecture.md), [Service Discovery](https://banes-lab.com/records/architecture/service-discovery.md), [Self-Registration](https://banes-lab.com/records/lexicon/self-registration.md)

Shape it refuses
[Compile-Time Binding](https://banes-lab.com/records/lexicon/compile-time-binding.md), [Manual Registration](https://banes-lab.com/records/lexicon/manual-registration.md)

### Service Discovery

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Category: [Runtime Discovery / Dynamic Binding](https://banes-lab.com/ontology/principles/architecture-category-runtime-discovery-dynamic-binding.md)
- Severity: [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)
- Scope: service, network, runtime
- Layer: [Extensibility Core](https://banes-lab.com/records/layer/extensibility-core.md)

Details

Definition
A mechanism that resolves a service name to a healthy network endpoint at call time through a registry.

Requires
[Service Registry](https://banes-lab.com/records/architecture/service-registry.md), [Health Checks](https://banes-lab.com/records/architecture/health-checks.md)

Reinforces
[Scalability](https://banes-lab.com/records/architecture/scalability.md), [Resilience](https://banes-lab.com/records/architecture/resilience.md)

Enables
[Dynamic Routing](https://banes-lab.com/records/lexicon/dynamic-routing.md), [Failover](https://banes-lab.com/records/architecture/failover.md)

In tension with
[Operational Complexity](https://banes-lab.com/records/lexicon/operational-complexity.md)

Conflicts with
[Hardcoded Endpoints](https://banes-lab.com/records/lexicon/hardcoded-endpoints.md)

Referenced by
[Runtime Discovery](https://banes-lab.com/records/architecture/runtime-discovery.md)

Tensions
[Service Discovery / Operational Complexity](https://banes-lab.com/records/tension/operational-complexity-service-discovery.md)

Distinct from
[Failover](https://banes-lab.com/records/architecture/failover.md): Service discovery resolves a name to a healthy endpoint, while failover switches traffic to a standby when the active one fails.

Distinct from
[Health Checks](https://banes-lab.com/records/architecture/health-checks.md): Service discovery resolves endpoints, while health checks report whether each endpoint is ready.

Distinct from
[Service Registry](https://banes-lab.com/records/architecture/service-registry.md): Service discovery is the lookup at call time, while the service registry is the table the lookup reads.

Violated by
fixed service addresses in code

Detected by
hardcoded URLs, missing registry lookup

Measured by
dynamic resolution coverage

Refactored by
Introduce Discovery Client, Externalize Endpoint

Enforced by
config scans, deployment policy

Before

```typescript
const fooUrl = "http://10.0.0.14:8080";
await http.get(`${fooUrl}/foo/${id}`);
```

After

```typescript
const endpoint = await serviceDiscovery.resolve("foo-service");
await http.get(new URL(`/foo/${id}`, endpoint));
```

How it is checked

Checked by
config scans, deployment policy

Population
Every binding the runtime resolves: handlers, plugins, services, formatters and policies

Freshness
A verdict stands until a registered module, a discovery pattern or the configuration changes

Refusal
Startup validation or the composition-root test fails when a declared binding resolves to nothing

Observation
The resolved bindings reported at startup, compared with the modules on disk and the configuration

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The modules on disk and the configuration, which the bindings reported at startup are compared against

Depends on
[Service Registry](https://banes-lab.com/records/architecture/service-registry.md), [Health Checks](https://banes-lab.com/records/architecture/health-checks.md), [Scalability](https://banes-lab.com/records/architecture/scalability.md), [Resilience](https://banes-lab.com/records/architecture/resilience.md), [Dynamic Routing](https://banes-lab.com/records/lexicon/dynamic-routing.md), [Failover](https://banes-lab.com/records/architecture/failover.md)

Shape it refuses
[Hardcoded Endpoints](https://banes-lab.com/records/lexicon/hardcoded-endpoints.md)

### Dynamic Binding

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Category: [Runtime Discovery / Dynamic Binding](https://banes-lab.com/ontology/principles/architecture-category-runtime-discovery-dynamic-binding.md)
- Severity: [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)
- Scope: runtime, interface, plugin, module, service
- Aliases: Late Binding, Runtime Binding
- Layer: [Extensibility Core](https://banes-lab.com/records/layer/extensibility-core.md)

Details

Definition
A mechanism that selects the implementation behind an interface at runtime, from configuration or a registry, so the choice is made at bootstrap or first use rather than fixed in code.

Requires
[Abstraction](https://banes-lab.com/records/architecture/abstraction.md), [Runtime Resolution](https://banes-lab.com/records/lexicon/runtime-resolution.md)

Reinforces
[Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md), [Extensibility](https://banes-lab.com/records/lexicon/extensibility.md), [Runtime Extensibility](https://banes-lab.com/records/architecture/runtime-extensibility.md)

Enables
[Strategy Swap](https://banes-lab.com/records/lexicon/strategy-swap.md), [Deferred Implementation Choice](https://banes-lab.com/records/lexicon/deferred-implementation-choice.md)

In tension with
[Static Safety](https://banes-lab.com/records/lexicon/static-safety.md), [Predictability](https://banes-lab.com/records/architecture/predictability.md), [Debugging](https://banes-lab.com/records/lexicon/debugging.md)

Conflicts with
[Compile-Time Binding](https://banes-lab.com/records/lexicon/compile-time-binding.md)

Referenced by
[Capability Declaration](https://banes-lab.com/records/architecture/capability-declaration.md), [Reflection](https://banes-lab.com/records/architecture/reflection.md), [Service Registry](https://banes-lab.com/records/architecture/service-registry.md)

Tensions
[Dynamic Binding / Static Safety](https://banes-lab.com/records/tension/dynamic-binding-static-safety.md), [Dynamic Binding / Predictability](https://banes-lab.com/records/tension/dynamic-binding-predictability.md), [Dynamic Binding / Debugging](https://banes-lab.com/records/tension/debugging-dynamic-binding.md)

Distinct from
[Capability Declaration](https://banes-lab.com/records/architecture/capability-declaration.md): Dynamic binding picks an implementation at runtime, while a capability declaration lists what an implementation supports so the pick can be checked.

Distinct from
[Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md): Polymorphism lets the receiver choose the implementation per call, while dynamic binding chooses it from configuration or a registry.

Distinct from
[Service Registry](https://banes-lab.com/records/architecture/service-registry.md): Dynamic binding is the choice made at runtime, while a service registry is the keyed table it can choose from.

Violated by
fixed concrete binding where runtime selection required

Detected by
hardcoded implementation selection

Measured by
runtime binding coverage

Refactored by
Introduce Factory, [Registry](https://banes-lab.com/records/lexicon/registry.md), Strategy

Enforced by
integration tests

Before

```typescript
const formatter = new JsonFooFormatter();
formatter.format(foo);
```

After

```typescript
const formatter = formatterRegistry.get(config.format);
if (!formatter) throw new Error(`unknown formatter: ${config.format}`);
formatter.format(foo);
```

How it is checked

Checked by
integration tests

Population
Every binding the runtime resolves: handlers, plugins, services, formatters and policies

Freshness
A verdict stands until a registered module, a discovery pattern or the configuration changes

Refusal
Startup validation or the composition-root test fails when a declared binding resolves to nothing

Observation
The resolved bindings reported at startup, compared with the modules on disk and the configuration

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The modules on disk and the configuration, which the bindings reported at startup are compared against

Depends on
[Abstraction](https://banes-lab.com/records/architecture/abstraction.md), [Runtime Resolution](https://banes-lab.com/records/lexicon/runtime-resolution.md), [Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md), [Extensibility](https://banes-lab.com/records/lexicon/extensibility.md), [Runtime Extensibility](https://banes-lab.com/records/architecture/runtime-extensibility.md), [Strategy Swap](https://banes-lab.com/records/lexicon/strategy-swap.md), [Deferred Implementation Choice](https://banes-lab.com/records/lexicon/deferred-implementation-choice.md)

Shape it refuses
[Compile-Time Binding](https://banes-lab.com/records/lexicon/compile-time-binding.md)

### Dynamic Dispatch

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Category: [Runtime Discovery / Dynamic Binding](https://banes-lab.com/ontology/principles/architecture-category-runtime-discovery-dynamic-binding.md)
- Severity: [recommended](https://banes-lab.com/records/vocabulary/severity-recommended.md)
- Scope: method, interface, runtime
- Layer: [Extensibility Core](https://banes-lab.com/records/layer/extensibility-core.md)

Details

Definition
A mechanism that chooses which operation runs from the receiver or a keyed table at runtime, replacing a conditional over kinds.

Requires
[Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md)

Reinforces
[Open/Closed Principle (OCP)](https://banes-lab.com/records/architecture/open-closed.md)

Enables
[Replace Conditional with Polymorphism](https://banes-lab.com/records/lexicon/replace-conditional-with-polymorphism.md)

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

Conflicts with
[Type-Switch Dispatch](https://banes-lab.com/records/lexicon/type-switch-dispatch.md)

Referenced by
[Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md)

Tensions
[Dynamic Dispatch / Traceability](https://banes-lab.com/records/tension/dynamic-dispatch-traceability.md)

Violated by
manual dispatch over concrete type

Detected by
switch/if chains on type

Measured by
conditional dispatch count

Refactored by
Introduce Polymorphic Method, Strategy

Enforced by
lint rules, [review](https://banes-lab.com/records/lexicon/review.md)

Before

```typescript
function execute(kind: string, foo: Foo) {
if (kind === "save") return saveFoo(foo);
if (kind === "publish") return publishFoo(foo);
}
```

After

```typescript
const commands: Record<string, (foo: Foo) => unknown> = {
save: saveFoo,
publish: publishFoo,
};
function execute(kind: string, foo: Foo) {
const command = commands[kind];
if (!command) throw new Error(`unknown command ${kind}`);
return command(foo);
}
```

How it is checked

Checked by
lint rules, review

Population
Every binding the runtime resolves: handlers, plugins, services, formatters and policies

Freshness
A verdict stands until a registered module, a discovery pattern or the configuration changes

Refusal
Startup validation or the composition-root test fails when a declared binding resolves to nothing

Observation
The resolved bindings reported at startup, compared with the modules on disk and the configuration

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The modules on disk and the configuration, which the bindings reported at startup are compared against

Depends on
[Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md), [Open/Closed Principle (OCP)](https://banes-lab.com/records/architecture/open-closed.md), [Replace Conditional with Polymorphism](https://banes-lab.com/records/lexicon/replace-conditional-with-polymorphism.md)

Shape it refuses
[Type-Switch Dispatch](https://banes-lab.com/records/lexicon/type-switch-dispatch.md)

### Runtime Extensibility

- Kind: [quality-attribute](https://banes-lab.com/records/kind/quality-attribute.md)
- Category: [Runtime Discovery / Dynamic Binding](https://banes-lab.com/ontology/principles/architecture-category-runtime-discovery-dynamic-binding.md)
- Severity: [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)
- Scope: runtime, plugin, system
- Layer: [Extensibility Core](https://banes-lab.com/records/layer/extensibility-core.md)

Details

Definition
The degree to which new capability can be added to a running system through extension points, without modifying its core.

Requires
[Extension Points](https://banes-lab.com/records/architecture/extension-points.md), [Stable Interfaces](https://banes-lab.com/records/architecture/stable-interfaces.md)

Reinforces
[Plugin Architecture](https://banes-lab.com/records/architecture/plugin-architecture.md), [Open/Closed Principle (OCP)](https://banes-lab.com/records/architecture/open-closed.md)

Enables
[Capability Addition without Core Modification](https://banes-lab.com/records/lexicon/capability-addition-without-core-modification.md)

In tension with
[Predictability](https://banes-lab.com/records/architecture/predictability.md), [Security](https://banes-lab.com/records/lexicon/security.md)

Conflicts with
[Closed Static Core](https://banes-lab.com/records/lexicon/closed-static-core.md)

Referenced by
[Runtime Discovery](https://banes-lab.com/records/architecture/runtime-discovery.md), [Dynamic Binding](https://banes-lab.com/records/architecture/dynamic-binding.md), [Runtime Code Generation](https://banes-lab.com/records/architecture/runtime-code-generation.md), [Prototype Pattern](https://banes-lab.com/records/architecture/prototype-pattern.md), [Plugin Architecture](https://banes-lab.com/records/architecture/plugin-architecture.md), [Feature Toggle](https://banes-lab.com/records/architecture/feature-toggle.md)

Contracts
[Runtime Extensibility](https://banes-lab.com/records/algorithms/runtime-extensibility.md)

Tensions
[Runtime Extensibility / Predictability](https://banes-lab.com/records/tension/predictability-runtime-extensibility.md), [Runtime Extensibility / Security](https://banes-lab.com/records/tension/runtime-extensibility-security.md)

Distinct from
[Stable Interfaces](https://banes-lab.com/records/architecture/stable-interfaces.md): Runtime extensibility adds capability through extension points, while stable interfaces keep those points unchanged across releases.

Distinct from
[Extensibility](https://banes-lab.com/records/lexicon/extensibility.md): Extensibility is adding behavior with little change to existing code, while runtime extensibility adds it to a system that is already running.

Violated by
modifying core for every extension

Detected by
repeated core changes for variants

Measured by
extension/core-change ratio

Refactored by
Add Extension Point, Add Plugin Interface

Enforced by
extension conformance tests

Before

```typescript
switch (pluginName) {
case "foo": return new FooPlugin();
case "bar": return new BarPlugin();
}
```

After

```typescript
export function registerPlugin(name: string, create: () => Plugin) {
pluginRegistry.set(name, create);
}
const plugin = pluginRegistry.get(pluginName)?.();
```

How it is checked

Checked by
extension conformance tests

Population
Every binding the runtime resolves: handlers, plugins, services, formatters and policies

Freshness
A verdict stands until a registered module, a discovery pattern or the configuration changes

Refusal
Startup validation or the composition-root test fails when a declared binding resolves to nothing

Observation
The resolved bindings reported at startup, compared with the modules on disk and the configuration

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The modules on disk and the configuration, which the bindings reported at startup are compared against

Depends on
[Extension Points](https://banes-lab.com/records/architecture/extension-points.md), [Stable Interfaces](https://banes-lab.com/records/architecture/stable-interfaces.md), [Plugin Architecture](https://banes-lab.com/records/architecture/plugin-architecture.md), [Open/Closed Principle (OCP)](https://banes-lab.com/records/architecture/open-closed.md), [Capability Addition without Core Modification](https://banes-lab.com/records/lexicon/capability-addition-without-core-modification.md)

Shape it refuses
[Closed Static Core](https://banes-lab.com/records/lexicon/closed-static-core.md)

## Links to

- [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- [contextual](https://banes-lab.com/records/vocabulary/severity-contextual.md)
- [Extensibility Core](https://banes-lab.com/records/layer/extensibility-core.md)
- [Metadata](https://banes-lab.com/records/lexicon/metadata.md)
- [Conventions](https://banes-lab.com/records/lexicon/conventions.md)
- [Runtime Extensibility](https://banes-lab.com/records/architecture/runtime-extensibility.md)
- [Plugin Architecture](https://banes-lab.com/records/architecture/plugin-architecture.md)
- [Service Discovery](https://banes-lab.com/records/architecture/service-discovery.md)
- [Self-Registration](https://banes-lab.com/records/lexicon/self-registration.md)
- [Predictability](https://banes-lab.com/records/architecture/predictability.md)
- [Static Analysis](https://banes-lab.com/records/architecture/static-analysis.md)
- [Startup Cost](https://banes-lab.com/records/lexicon/startup-cost.md)
- [Compile-Time Binding](https://banes-lab.com/records/lexicon/compile-time-binding.md)
- [Manual Registration](https://banes-lab.com/records/lexicon/manual-registration.md)
- [Self-Describing Architecture](https://banes-lab.com/records/architecture/self-describing-architecture.md)
- [Metadata-Driven Design](https://banes-lab.com/records/architecture/metadata-driven-design.md)
- [Capability Declaration](https://banes-lab.com/records/architecture/capability-declaration.md)
- [Manifest-Based Design](https://banes-lab.com/records/architecture/manifest-based-design.md)
- [Reflection](https://banes-lab.com/records/architecture/reflection.md)
- [Runtime Discovery](https://banes-lab.com/records/algorithms/runtime-discovery.md)
- [Runtime Discovery / Predictability](https://banes-lab.com/records/tension/predictability-runtime-discovery.md)
- [Runtime Discovery / Static Analysis](https://banes-lab.com/records/tension/runtime-discovery-static-analysis.md)
- [Runtime Discovery / Startup Cost](https://banes-lab.com/records/tension/runtime-discovery-startup-cost.md)
- [Introspection](https://banes-lab.com/records/architecture/introspection.md)
- [Service Registry](https://banes-lab.com/records/architecture/service-registry.md)
- [Health Checks](https://banes-lab.com/records/architecture/health-checks.md)
- [Scalability](https://banes-lab.com/records/architecture/scalability.md)
- [Resilience](https://banes-lab.com/records/architecture/resilience.md)
- [Dynamic Routing](https://banes-lab.com/records/lexicon/dynamic-routing.md)
- [Failover](https://banes-lab.com/records/architecture/failover.md)
- [Operational Complexity](https://banes-lab.com/records/lexicon/operational-complexity.md)
- [Hardcoded Endpoints](https://banes-lab.com/records/lexicon/hardcoded-endpoints.md)
- [Runtime Discovery](https://banes-lab.com/records/architecture/runtime-discovery.md)
- [Service Discovery / Operational Complexity](https://banes-lab.com/records/tension/operational-complexity-service-discovery.md)
- [Abstraction](https://banes-lab.com/records/architecture/abstraction.md)
- [Runtime Resolution](https://banes-lab.com/records/lexicon/runtime-resolution.md)
- [Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md)
- [Extensibility](https://banes-lab.com/records/lexicon/extensibility.md)
- [Strategy Swap](https://banes-lab.com/records/lexicon/strategy-swap.md)
- [Deferred Implementation Choice](https://banes-lab.com/records/lexicon/deferred-implementation-choice.md)
- [Static Safety](https://banes-lab.com/records/lexicon/static-safety.md)
- [Debugging](https://banes-lab.com/records/lexicon/debugging.md)
- [Dynamic Binding / Static Safety](https://banes-lab.com/records/tension/dynamic-binding-static-safety.md)
- [Dynamic Binding / Predictability](https://banes-lab.com/records/tension/dynamic-binding-predictability.md)
- [Dynamic Binding / Debugging](https://banes-lab.com/records/tension/debugging-dynamic-binding.md)
- [Registry](https://banes-lab.com/records/lexicon/registry.md)
- [recommended](https://banes-lab.com/records/vocabulary/severity-recommended.md)
- [Open/Closed Principle](https://banes-lab.com/records/architecture/open-closed.md)
- [Replace Conditional with Polymorphism](https://banes-lab.com/records/lexicon/replace-conditional-with-polymorphism.md)
- [Traceability](https://banes-lab.com/records/architecture/traceability.md)
- [Type-Switch Dispatch](https://banes-lab.com/records/lexicon/type-switch-dispatch.md)
- [Dynamic Dispatch / Traceability](https://banes-lab.com/records/tension/dynamic-dispatch-traceability.md)
- [Review](https://banes-lab.com/records/lexicon/review.md)
- [quality-attribute](https://banes-lab.com/records/kind/quality-attribute.md)
- [Extension Points](https://banes-lab.com/records/architecture/extension-points.md)
- [Stable Interfaces](https://banes-lab.com/records/architecture/stable-interfaces.md)
- [Capability Addition without Core Modification](https://banes-lab.com/records/lexicon/capability-addition-without-core-modification.md)
- [Security](https://banes-lab.com/records/lexicon/security.md)
- [Closed Static Core](https://banes-lab.com/records/lexicon/closed-static-core.md)
- [Dynamic Binding](https://banes-lab.com/records/architecture/dynamic-binding.md)
- [Runtime Code Generation](https://banes-lab.com/records/architecture/runtime-code-generation.md)
- [Prototype Pattern](https://banes-lab.com/records/architecture/prototype-pattern.md)
- [Feature Toggle](https://banes-lab.com/records/architecture/feature-toggle.md)
- [Runtime Extensibility](https://banes-lab.com/records/algorithms/runtime-extensibility.md)
- [Runtime Extensibility / Predictability](https://banes-lab.com/records/tension/predictability-runtime-extensibility.md)
- [Runtime Extensibility / Security](https://banes-lab.com/records/tension/runtime-extensibility-security.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)
