Design philosophy
The Organismic Software Architecture
A manifesto for building systems that live.
Motebo Technologies · 1 August 2026 · ~55 min read

0. Preamble
Every architecture we have inherited is a metaphor that stopped being noticed.
Layers come from geology and masonry — sediment, one thing resting on another. Pipelines come from petroleum engineering. Microservices come from the factory floor: small, interchangeable stations on a line. Clean Architecture draws concentric rings like a fortress. Each metaphor was useful. Each also smuggled in assumptions we never audited.
Masonry assumes gravity flows one way. Factories assume a supervisor sets the schedule. Fortresses assume the threat is outside.
None of these describe what we actually build now: systems that run continuously for years, absorb traffic they were never sized for, integrate models that change behaviour without a deploy, are attacked from inside as often as outside, and are expected to keep working while being modified. We do not build buildings. We do not build factories. We build things that must stay alive.
There is one class of system in the known universe that has solved that problem at scale, for four billion years, without downtime windows: the organism.
This manifesto takes that seriously. Not as decoration — architects have used biological words for decades while designing nothing biological — but as a generative constraint. If a design decision would kill an organism, it should be suspect in your architecture. If a mechanism keeps an organism alive, it probably has a software analogue you are missing.
We call the result Organismic Software Architecture (OSA).
1. The thesis
A software platform should be designed as a set of specialised systems maintaining a shared internal equilibrium, not as a set of components executing a plan.
Three claims follow, and they are the whole argument:
1. Health is the primary objective function, not performance. A body does not maximise anything. Your heart could beat faster. Your metabolism could run hotter. It does not, because the organism optimises for remaining within survivable bounds across an unpredictable environment. Peak throughput is a property of benchmarks. Survivable bounds are a property of production.
2. Coordination is a communication topology problem, not a control problem. There is no scheduler in your body. There is no orchestrator that knows the state of every cell. There are three communication channels with radically different latency and reach, and every behaviour is an emergent consequence of which channel carries which signal. Architecture is the choice of channels.
3. Structure exists to make change survivable. Bones are not there to hold the shape. They are there so that muscle can pull against something without the animal collapsing. Structure is what makes force useful instead of destructive. In software, structure — contracts, boundaries, ownership — is what makes change useful instead of destructive.
Everything below is derived from these three claims.
2. The organism at a glance
The diagram is not a deployment topology. It is a responsibility topology. Two systems may live in the same process; that is an implementation detail. What matters is that no system does another system's job.
3. The fourteen systems
The classic taxonomy names eleven, though many curricula teach a twelfth — the sensory system, covering the special senses: vision, hearing, balance, taste, and smell. Strict anatomy folds these into the nervous system, and for good reason: sensation is a nervous function throughout. The retina is literally an outgrowth of the brain. Cutaneous touch is performed by the endings of sensory neurons whose cell bodies sit in the dorsal root ganglia — the skin houses them, but the skin is not the sensor. We keep the sensory grouping separate anyway, because in software the distinction is architecturally load-bearing.
Software needs fourteen. We split the nervous system into coordination and cognition — biology fuses them, but an inference layer is independently deployable, independently expensive, and independently wrong, so it gets its own boundary. We separate the lymphatic system as observability from the immune system as security. And we keep the sensory system distinct, because perceiving the outside world is a different discipline from perceiving yourself.
Touch is worth pausing on, because it demonstrates the opposite of what you might expect. It is tempting to say that skin senses touch and therefore belongs to two systems at once. It does not. The transduction is done by neurons — free nerve endings and the afferent terminals inside Meissner, Pacinian, and Ruffini corpuscles, whose capsules are merely connective tissue housing. The skin provides the surface, the structure, and the protection; the nervous system provides the perception. That is a clean division of labour, not an overlap.
It maps directly onto the architecture. Your Integumentary system (§3.1) is where signals arrive — it terminates connections, validates shape, absorbs load. Your Sensory system is what interprets them. Conflating the two is the mistake that produces edge layers full of business judgement.
The honest exception is the Merkel cell, which is an epidermal cell of keratinocyte lineage that performs mechanotransduction directly and synapses onto an afferent fibre — a genuine epidermal contribution to sensation. It is one cell type, and it proves the rule by how narrow it is.
Each system below is specified the same way: what it owns, what it must never do, its interface, its characteristic failure, and the signal that tells you it is sick.
3.1 Integumentary — Edge & Interface
| Owns | Every surface where the outside world touches the system: web, mobile, public API, CLI, partner endpoints, CDN, TLS termination, WAF, rate limiting, request shaping. |
| Never does | Business decisions. Skin does not decide whether you are hungry. The edge does not decide whether a loan is approved. |
| Interface | HTTP/gRPC/GraphQL inbound; a single normalised internal request envelope outbound. |
| Characteristic failure | Breach — unvalidated input reaching internal systems; or keratinisation — the edge accreting business logic until it becomes an unmaintainable second backend. |
| Sickness signal | Rising 4xx diversity, edge deploys coupled to domain releases, "just add it to the BFF" appearing in more than one sprint. |
Skin is the largest organ and the most underrated. It is barrier, sensor, thermoregulator, and immune outpost simultaneously. Your edge layer is the same: it is where you enforce identity, absorb burst load, shed traffic under stress, and detect that something is wrong before the wrongness gets metabolised.
Design consequence: the edge should be the only part of your system that knows what a user-agent is. Everything downstream should receive a canonical, authenticated, rate-checked, schema-valid instruction — never a raw request.
3.2 Skeletal — Domain Models & Contracts
| Owns | Entities, value objects, invariants, event schemas, API contracts, versioning policy, the ubiquitous language. |
| Never does | I/O. Bones do not talk to the outside world. Domain models do not call databases, queues, or HTTP clients. |
| Interface | Types. That is the whole interface. |
| Characteristic failure | Osteoporosis — contracts weakened by optional fields and Map<String, Object> escape hatches until nothing constrains anything; or ossification — structure so rigid that every feature requires a breaking change. |
| Sickness signal | More than ~15% of fields on core events are optional. Schema changes require a coordinated multi-team release. |
Bone is not inert. It is remodelled continuously — osteoclasts dissolve it, osteoblasts rebuild it, and the resulting shape follows the loads actually applied (Wolff's law). Your contracts should follow the same rule: structure should thicken where load is applied and thin where it is not. A field nobody reads should be deprecated, not preserved out of politeness.
3.3 Muscular — Workers & Compute
| Owns | Doing the work. Job runners, batch processors, stream consumers, request handlers, inference workers, schedulers. |
| Never does | Decide whether the work should happen. Muscles contract when signalled; they do not deliberate. |
| Interface | Consume a command or event; emit a result event. |
| Characteristic failure | Rhabdomyolysis — a runaway worker consuming resources until it poisons the shared substrate; or atrophy — a worker pool sized for peak that never scales down and quietly costs more than the feature earns. |
| Sickness signal | Queue depth and worker count uncorrelated. Cost per unit of work trending up while volume is flat. |
Muscle has two fibre types and this matters. Slow-twitch fibres are efficient, fatigue-resistant, and handle sustained load — your steady-state consumers. Fast-twitch fibres are explosive, expensive, and fatigue rapidly — your burst capacity, spot instances, scale-to-zero functions. Sizing a system entirely from one fibre type is a design error in both domains.
3.4 Nervous — Coordination & Events
| Owns | The event backbone, sagas, workflow orchestration, correlation identity, causality tracking, reflex arcs. |
| Never does | Business computation. The nervous system carries signals; it does not digest food. |
| Interface | Publish/subscribe on versioned event contracts; workflow definitions. |
| Characteristic failure | Neuropathy — silent message loss so distant systems stop responding without anyone noticing; or seizure — an event storm where systems trigger each other in an amplifying loop. |
| Sickness signal | Events with no consumers. Consumers with no dead-letter policy. Any cycle in your event graph that has no damping. |
3.5 Sensory — Environmental Perception
| Owns | Perception of the world outside the organism: market and pricing signals, competitor behaviour, regulatory and legislative change, weather and climate feeds, upstream provider health, macroeconomic indicators, demand signals, social and reputational sentiment, and the fusion of all of these into a coherent picture of current conditions. |
| Never does | Act. The eye does not move the hand. Sensory systems perceive and report; they never take an action, and they never modify domain state. |
| Interface | A continuously updated, versioned environmental state document — observations with source, timestamp, confidence, and staleness — consumed primarily by the endocrine system. |
| Characteristic failure | Sensory deprivation — the system optimising confidently against conditions that stopped existing months ago; or hallucination — treating noise as signal and adjusting behaviour in response to nothing. |
| Sickness signal | Any policy threshold justified by an assumption nobody has re-measured this year. Hard-coded calendars, seasons, or regional constants. Environmental observations with no staleness bound. |
This is the system almost every platform is missing, and its absence is invisible precisely because nothing breaks. A blind organism does not fail; it simply keeps behaving as though the environment were what it last knew it to be, and gradually its responses stop fitting the world.
The distinction from Respiratory (§3.9) is intent, and it is worth being precise about. Respiratory transacts with named counterparties: call the bureau, charge the card, submit the return. There is a contract, a request, and a response you are waiting for. Sensory observes an environment that is not a counterparty and does not know you exist. Nobody signed an agreement with the rainfall.
The distinction from Lymphatic (§3.12) is direction. Both are perception, but they face opposite ways:
Physiology calls these exteroception and interoception, and healthy regulation requires both. A system with only interoception knows it is running hot but not that the room is on fire. A system with only exteroception knows the market moved but not whether it can afford to respond.
Four rules govern this system.
1. Perception is separated from action by the endocrine system. Sensory feeds set points; it does not pull levers. This is not bureaucracy — it is what stops a bad sensor reading from becoming an immediate global behaviour change. Perception is unreliable by nature, so the path from perception to action must be gradual, ramped, and reversible.
2. Every observation carries staleness. An environmental fact without a timestamp and a maximum useful age is a liability. A three-week-old exchange rate presented as current is worse than no exchange rate, because it will be trusted.
3. Fuse before you act. Single sensors lie. Biology cross-references constantly — vision against proprioception, balance against sight — and the discrepancies are themselves informative. Conflicting sensors are a signal, not an error to be silenced by picking a favourite.
4. Drift detection is the primary product. The most valuable output is not the current reading but the observation that conditions have moved outside the range your policies were designed for. That is the signal that a set point needs human review.
@dataclass(frozen=True)
class Observation:
"""
An exteroceptive fact. Never a bare value — a bare value has no
expiry, and a fact with no expiry will eventually be believed
long after it stopped being true.
"""
signal: str # "rainfall_mm_30d", "repo_rate", "bureau_p99_ms"
value: float
unit: str
observed_at: datetime
max_useful_age: timedelta
source: str
confidence: float
region: str | None = None
@property
def is_stale(self) -> bool:
return datetime.now(UTC) - self.observed_at > self.max_useful_age
class SensorFusion:
"""
Reconciles observations into an environmental state. Reports.
Does not act — the return value is a document, never a command.
"""
def perceive(self, signal: str, region: str | None = None) -> EnvironmentalState:
obs = [o for o in self.collect(signal, region) if not o.is_stale]
if not obs:
# Blindness is a state to be reported, never silently
# substituted with a default. A default is a guess wearing
# the costume of an observation.
return EnvironmentalState.blind(
signal=signal,
reason="all sources stale or unavailable",
fallback_policy="hold_last_known_set_point",
escalate=True,
)
weighted = sum(o.value * o.confidence for o in obs) / sum(o.confidence for o in obs)
spread = max(o.value for o in obs) - min(o.value for o in obs)
return EnvironmentalState(
signal=signal,
value=weighted,
agreement=self.agreement_score(obs),
sources=[o.source for o in obs],
# Disagreement is information, not an error to be averaged away.
disputed=spread > self.tolerance(signal),
drift=self.drift_from_baseline(signal, weighted),
)
3.6 Cerebral — Intelligence & Reasoning
| Owns | Model inference, planning, ranking, recommendation, extraction, agentic loops, retrieval, prompt and context assembly, evaluation harnesses. |
| Never does | Hold authority it cannot justify. The brain proposes; policy and immune systems can veto. |
| Interface | A request containing context, and a response containing a decision, a confidence, and a rationale. All three. Never just the decision. |
| Characteristic failure | Confabulation — confident output uncoupled from ground truth; or cognitive overload — routing every trivial decision through an expensive model because it is available. |
| Sickness signal | No offline eval suite. Decisions with no recorded rationale. Model version not captured in the audit trail. |
This is the system biology does not cleanly give us, and where most modern platforms are weakest. Treat inference as an organ with a metabolism: it consumes tokens, produces heat (cost), fatigues (rate limits), and degrades under poor nutrition (bad context). It must be observable, replaceable, and vetoable.
3.7 Endocrine — Policy & Configuration
| Owns | Feature flags, rollout percentages, quotas, thresholds, timeouts, retry budgets, model routing tables, pricing rules, tenant policy. |
| Never does | Deliver urgent signals. Hormones are slow by design. If you need something to happen in 40ms, that is a nerve, not a hormone. |
| Interface | A versioned policy document, propagated by pull with bounded staleness. |
| Characteristic failure | Endocrine storm — a config change applying instantly and globally, taking the whole organism down; or flag debt — hundreds of stale flags creating a combinatorial state space nobody can reason about. |
| Sickness signal | Any flag older than two quarters. Any config path that can change global behaviour in under one second with no ramp. |
The single most under-used idea in this manifesto. Hormones work because they are gradual, systemic, and reversible. Adrenaline reaches every cell but takes seconds, and clears in minutes. Design your configuration the same way: changes ramp, they reach everything, and they decay back unless renewed.
3.8 Cardiovascular — Transport
| Owns | API gateway, service mesh, queues, streams, connection pools, load balancing, retries, circuit breakers, backpressure. |
| Never does | Transform payloads. Blood does not cook your food. |
| Interface | Move bytes with delivery guarantees. Nothing else. |
| Characteristic failure | Thrombosis — a blocked partition or saturated pool starving everything downstream; or atherosclerosis — transformation logic slowly deposited in the gateway until the transport layer is the most fragile part of the system. |
| Sickness signal | Business rules in gateway configuration. A queue consumer that needs a schema migration when a domain rule changes. |
3.9 Respiratory — External Exchange
| Owns | Third-party APIs, payment providers, identity providers, credit bureaus, government registries, partner webhooks, inbound and outbound file exchange. |
| Never does | Assume the outside world is available or honest. |
| Interface | An anti-corruption layer: external representations never enter the domain untranslated. |
| Characteristic failure | Asphyxiation — a third-party outage propagating inward with no fallback; or aspiration — foreign data structures inhaled directly into the domain, coupling your model to someone else's release schedule. |
| Sickness signal | A vendor's field name appearing in your database. No circuit breaker on any external call. No cached last-known-good response. |
Breathing is rhythmic and involuntary but overridable. Your integrations should be the same: polling and reconciliation run on a schedule regardless of whether anything happened, and can be manually driven when something goes wrong.
3.10 Digestive — Data Ingestion
| Owns | Extraction, parsing, OCR, validation, normalisation, deduplication, enrichment, embedding, indexing. Turning raw external matter into usable internal nutrients. |
| Never does | Act on the data. Digestion prepares; it does not decide. |
| Interface | Raw artefact in; validated, typed, provenance-tagged domain fact out. |
| Characteristic failure | Malabsorption — data ingested but unusable because provenance and confidence were discarded; or food poisoning — bad input accepted and distributed to every downstream system before anyone noticed. |
| Sickness signal | No quarantine stage. No confidence score on extracted fields. Reprocessing requires re-fetching from the source. |
The digestive tract is sequential, staged, and has a quarantine mechanism at every boundary — the stomach's acid, the intestinal barrier, the liver's first-pass metabolism. Ingestion pipelines that do not stage and quarantine are the single most common source of silent data corruption in production systems.
3.11 Immune — Security & Trust
| Owns | Authentication, authorisation, secrets, fraud detection, anomaly detection, abuse prevention, audit, incident response. |
| Never does | Trust position. Being inside the network is not identity. |
| Interface | A verdict — allow, deny, challenge, quarantine — plus evidence. |
| Characteristic failure | Autoimmunity — controls attacking legitimate traffic, which is far more common and far more damaging than under-blocking; or immunodeficiency — internal calls that skip authorisation because "it's internal". |
| Sickness signal | False positive rate not measured. Any service-to-service call without a verifiable caller identity. |
The immune system has two arms and you need both. Innate immunity is fast, generic, and always on — rate limits, WAF rules, schema validation, allow-lists. Adaptive immunity is slow, specific, and learns — behavioural models, fraud scoring, anomaly detection that improves from labelled incidents. Innate immunity buys time for adaptive immunity to respond. A system with only innate immunity is blunt; a system with only adaptive immunity is defenceless on day one.
3.12 Lymphatic — Observability
| Owns | Logs, metrics, traces, health endpoints, SLOs, error budgets, dashboards, alerting, incident timelines. |
| Never does | Affect the outcome of the request it is observing. |
| Interface | Emit structured signal with correlation identity. |
| Characteristic failure | Lymphoedema — telemetry volume so high the signal is unfindable and the cost rivals the workload; or silent drainage — health checks that return 200 while the system is failing. |
| Sickness signal | Mean time to detection exceeding mean time to repair. Any health check that does not exercise a real dependency. |
Lymph drains what circulation leaves behind. Observability's real job is not dashboards — it is collecting the residue that normal operation leaves behind and presenting it where an immune response can act on it.
3.13 Urinary — Lifecycle & Reclamation
| Owns | Retention policy, archival, tiering, purge, right-to-erasure, TTLs, orphan cleanup, cost reclamation, backup expiry. |
| Never does | Delete without a policy, a record, and a recovery window. |
| Interface | A lifecycle policy per data class, executed on a schedule, with an audit trail. |
| Characteristic failure | Renal failure — accumulated data nobody owns, driving cost and legal exposure; or incontinence — deletion without audit, destroying evidence you were required to keep. |
| Sickness signal | Storage growth uncorrelated with user growth. Any table with no retention class assigned. |
Under POPIA, GDPR, and equivalent regimes, this system is not hygiene — it is a legal organ. Retention is a first-class architectural concern, not a cron job someone added.
3.14 Reproductive — Generation & Scaffolding
| Owns | Service templates, infrastructure-as-code modules, tenant provisioning, environment creation, golden paths, code generators. |
| Never does | Produce something that immediately diverges from its lineage with no way to propagate improvements. |
| Interface | A template plus parameters yields a running, observable, secured, deployable unit. |
| Characteristic failure | Sterility — creating a new service is so expensive that everything is bolted onto existing ones; or mutation load — every generated service diverges instantly, so a fix to the template never reaches its offspring. |
| Sickness signal | Time-to-first-deploy for a new service exceeding one day. No mechanism to re-apply template updates to existing services. |
New capability should inherit health: a newly scaffolded service arrives with tracing, health endpoints, auth, CI, IaC, and dashboards already working. If health has to be added by hand, it will be added inconsistently, and the population's average fitness declines with every birth.
4. The three channels
This is the heart of OSA. Almost every architectural mistake is a channel mistake: using a slow channel for an urgent signal, or a fast channel for a systemic one.
| Property | Neural | Circulatory | Endocrine |
|---|---|---|---|
| Latency | 1–50 ms | 50 ms – 10 s | 1 min – 24 h |
| Reach | One known target | All subscribers | Every cell |
| Delivery | At-most-once, retried | At-least-once, durable | Eventually consistent, pulled |
| Reversibility | Compensating action | Compensating event | Ramp down |
| Failure blast radius | Single interaction | One domain | The entire organism |
| Software form | gRPC, HTTP, in-process call | Kafka, SNS/SQS, EventBridge | Config store, flag service, policy engine |
The channel selection rule:
Choose the slowest channel that meets the requirement. Urgency is a cost, not a virtue. Every millisecond of guaranteed latency you promise is a constraint you must defend forever.
Worked channel decisions:
- A user clicks "pay". → Neural. Synchronous, addressed, must answer now.
- A payment succeeded. → Circulatory. Six systems care; none of them should be in the payment's critical path.
- Fraud thresholds are being tightened after an incident. → Endocrine. Systemic, gradual, reversible.
- A card is being used in a pattern matching an active attack. → Neural reflex. Do not wait for orchestration. Block, then emit an event so the rest of the organism learns.
- A new pricing model rolls out to 5% of tenants. → Endocrine with a ramp.
- A background job finished. → Circulatory. Nobody is waiting synchronously; if they are, the design is wrong.
5. The thirteen principles
I. One organ, one function
Every module has exactly one primary responsibility, expressed as a verb the business would recognise. The heart pumps. It does not also filter.
❌ UserService
├── authenticates
├── charges cards
├── sends email
└── computes churn risk
✅ Identity System → establishes and verifies who
Financial System → moves and records money
Communication System→ delivers messages to humans
Intelligence System → produces predictions and rationales
The test: can you name the module's responsibility without using the word "and", and without naming a technology? If not, it is two organs sharing a membrane.
II. Organs never share tissue
A system owns its data exclusively. No shared tables, no cross-service joins, no reaching into another system's store because it is faster.
The cost of this principle is duplication. Pay it. Biology pays it constantly — every cell carries a full copy of the genome it mostly does not use, because local autonomy is worth more than storage efficiency.
III. Blood carries no business logic
Transport moves data. It does not transform, enrich, decide, or validate business rules. The moment your gateway knows what a "delinquent account" is, your transport layer has become a domain service with no tests and no owner.
IV. Hormones change behaviour slowly
Systemic changes ramp. A flag that flips from 0% to 100% instantly is not a flag; it is a deployment with worse observability.
V. Reflexes bypass the brain
Actions with unambiguous triggers and severe consequences execute locally, immediately, without consulting orchestration or intelligence. Then they report what they did.
Your hand leaves the stove before your brain knows it is hot. The signal reaches the spinal cord, the response returns, and only then does the brain receive a report and decide about follow-up. If the reflex had required cognition, you would be burnt.
VI. Cells are disposable, organs are not
Any single instance — container, pod, function, worker — must be terminable at any moment with no data loss and no operator involvement. State belongs to the organ, never to the cell.
VII. Homeostasis over optimisation
Every system defines the range it must stay within, and the compensating action when it drifts. Not a target — a range, with hysteresis, so the system does not oscillate.
VIII. Every organ monitors and heals itself
Self-diagnosis is intrinsic, not bolted on. Your liver does not wait for your brain's permission to begin repair. A system that can only be diagnosed from outside cannot be diagnosed at 3am.
IX. Decisions occur at the lowest competent level
Cognitive tier → novel, ambiguous, high-stakes, needs reasoning
Service tier → domain rules, deterministic policy
Component tier → local validation, defaults, retries
Reflex tier → immediate, unambiguous, protective
Escalate upward only when the lower tier cannot decide. Routing every decision to the most capable system is not intelligence; it is a bottleneck with a large invoice.
X. Intelligence must be vetoable
Any model-derived decision passes through policy and immune review before it takes effect on money, identity, safety, or legal outcomes. The brain proposes; the organism disposes. This is not distrust of models — it is the same reason your prefrontal cortex can be overridden by a reflex.
XI. Growth is developmental, not additive
New capability appears as a new system with real boundaries, or as extension of an existing one along its existing grain. It does not appear as another if branch in a service that was already doing too much.
XII. Perception precedes adaptation
A system cannot adapt to an environment it does not measure. Every constant in your configuration is a claim about the world, made on a particular day, by someone who is probably no longer looking. Adaptation without perception is not adaptation — it is a fixed response that happened to fit once.
And perception never acts directly. It adjusts set points, which ramp. The path from seeing to doing runs through the endocrine system precisely because sensors are unreliable and a bad reading should change behaviour slowly enough to be caught.
XIII. What is not renewed decays
Every artefact — feature flag, endpoint, dataset, model, dependency, dashboard — has an expiry. Continued existence requires evidence of use. Apoptosis is not failure; it is the mechanism by which a body avoids being made entirely of things it once needed.
6. Homeostasis in practice
Homeostasis is not autoscaling. Autoscaling is one loop. Homeostasis is the discipline of writing down, for every system, the variables that must stay in range and the compensations available when they drift.
The outer dotted loop matters more than the inner one. The inner loop is control. The outer loop — where observed behaviour feeds back into the set point itself — is adaptation. Most systems have the first and not the second.
A homeostasis specification
Every system publishes one of these. It is a contract, versioned alongside the code.
system: credit-decision
version: 4
variables:
- name: p99_decision_latency
unit: ms
normal_band: [400, 1800]
critical_above: 4000
sensors: [otel.histogram.decision.duration]
compensations:
- trigger: p99 > 1800 for 2m
action: route_to_smaller_model
reversible: true
ramp: immediate
- trigger: p99 > 1800 for 10m
action: scale_out_inference_pool
max: 24
- trigger: p99 > 4000 for 1m
action: degrade_to_deterministic_scorecard
note: "Graceful degradation. Reduced accuracy, guaranteed latency."
- trigger: p99 < 700 for 30m
action: scale_in_inference_pool
min: 3
cooldown: 15m
- name: decision_confidence_mean
unit: ratio
normal_band: [0.72, 1.0]
compensations:
- trigger: mean < 0.72 for 15m
action: raise_human_review_threshold
note: "Model degradation or input drift. Send more to humans, alert."
escalate: [risk-team, on-call]
- name: cost_per_decision
unit: ZAR
normal_band: [0.00, 0.85]
compensations:
- trigger: mean > 0.85 for 1h
action: enable_response_cache
- trigger: mean > 1.40 for 15m
action: downgrade_model_tier
escalate: [platform-lead]
- name: reject_rate
unit: ratio
normal_band: [0.18, 0.42]
note: >
Neither too high nor too low. A sudden drop is as alarming as a spike —
it usually means a scoring input silently returned nulls.
compensations:
- trigger: outside band for 30m
action: freeze_auto_approval
escalate: [risk-team]
Note the fourth variable. A band, not a ceiling. The most valuable homeostatic alarms fire when a metric gets unexpectedly good, because in production, "unexpectedly good" is almost always a broken measurement.
Graceful degradation is a nested ladder
Organisms do not fail; they shed function in order of expendability. Under hypothermia the body sacrifices peripheral circulation to protect the core. Design the same ladder explicitly:
| Tier | Function | Sacrificed at |
|---|---|---|
| 0 | Accept money, don't lose data, honour auth | Never — this is the core |
| 1 | Show accurate balances and history | Total datastore loss |
| 2 | Real-time decisioning | Inference unavailable → deterministic scorecard |
| 3 | Personalisation and recommendations | Any sustained latency breach |
| 4 | Analytics, reporting, non-critical enrichment | First sign of stress |
Write this table before you write the code. In an incident, nobody invents a good degradation order under pressure.
7. Reflex arcs
A reflex is a complete sensory-motor loop that terminates below the level of cognition. Four properties define one, and all four are required:
- The trigger is unambiguous.
- The correct response is known in advance.
- Delay causes irreversible harm.
- A false positive is cheaper than a false negative.
The critical detail is the ordering: block at 12ms, then publish. Not "publish, wait for a verdict, then block". The reflex is authoritative in the moment and correctable afterwards.
/**
* Reflex arc. Runs in the request path. No network I/O, no database calls,
* no model inference. Everything it needs is in local memory, refreshed
* out-of-band by the endocrine system.
*
* Hard budget: 20ms p99. If this cannot be met, it is not a reflex.
*/
@Component
public final class PaymentReflexArc {
private final ThresholdSnapshot thresholds; // endocrine, refreshed every 60s
private final VelocityWindow velocity; // local ring buffer
private final EventPublisher events; // fire-and-forget
public ReflexVerdict evaluate(PaymentAttempt attempt) {
var evidence = Evidence.builder();
if (velocity.countFor(attempt.instrumentId(), Duration.ofMinutes(5))
> thresholds.maxAttemptsPer5Min()) {
evidence.add("velocity_exceeded", velocity.snapshot(attempt.instrumentId()));
return block(attempt, evidence.build());
}
if (attempt.amount().compareTo(thresholds.hardCeiling()) > 0) {
evidence.add("amount_above_hard_ceiling", attempt.amount());
return block(attempt, evidence.build());
}
if (GeoDistance.impliesImpossibleTravel(
attempt.geo(), velocity.lastGeoFor(attempt.instrumentId()),
thresholds.maxPlausibleKmh())) {
evidence.add("impossible_travel", attempt.geo());
return block(attempt, evidence.build());
}
return ReflexVerdict.pass();
}
private ReflexVerdict block(PaymentAttempt attempt, Evidence evidence) {
// Act first.
var verdict = ReflexVerdict.block(evidence);
// Report second, asynchronously. Never block the block on the report.
events.publishAsync(new PaymentBlocked(
attempt.id(), attempt.tenantId(), evidence,
thresholds.version(), Instant.now()));
return verdict;
}
}
Anti-reflex smell: a "reflex" that calls a model, queries a database, or awaits orchestration. That is not a reflex; it is a synchronous dependency wearing a reflex costume, and it will be the thing that takes you down.
8. The immune system, in depth
Security modelled as immunity produces a materially different design from security modelled as a perimeter.
Three mechanisms deserve special attention.
Promotion from adaptive to innate. When adaptive immunity confirms a pattern with high confidence and stable behaviour, that pattern is compiled down into a cheap innate rule. This is how immunological memory works, and it is how your security posture gets faster and cheaper over time instead of slower and more expensive. Most platforms never do this — every check stays at its original tier forever, and inference cost grows without bound.
The tolerance registry. Autoimmunity is the dominant failure mode of production security. A body maintains active tolerance for self — an explicit, maintained list of things that look suspicious but are legitimate. Your system needs the same artefact: every confirmed false positive produces a tolerance entry with an owner and an expiry. Without this, every incident ratchets controls tighter and nothing ever loosens, until your fraud team is your largest cost centre and your legitimate customers are the ones being blocked.
Fever. A global, temporary, costly, system-wide response to a threat that local defences cannot contain: raise verification requirements everywhere, drop all sessions, force re-auth, disable non-essential functions. It hurts. It should hurt — fever is expensive to the organism, which is why it is reserved for genuine systemic threat. Define your fever protocol in advance, name who can trigger it, and rehearse it.
protocol: systemic_immune_response
codename: fever
triggers:
- confirmed_credential_stuffing_across_tenants
- confirmed_data_exfiltration_attempt
- upstream_identity_provider_compromise
authority: [head_of_security, cto] # two-person rule
actions:
immediate:
- invalidate_all_refresh_tokens
- require_step_up_auth_all_sessions
- freeze_all_outbound_payments
- disable_tiers: [3, 4] # personalisation, analytics
sustained:
- reflex_thresholds: strict
- human_review_threshold: 0.0 # everything reviewed
maximum_duration: 6h
auto_resolve: true
note: >
Fever is metabolically expensive and must resolve. A permanent fever is
an autoimmune disorder, not a defence. Extension requires re-authorisation.
9. Digestion: the ingestion tract
Data ingestion is where most systems quietly rot. The organism's answer is staging with quarantine at every boundary, and it maps almost perfectly.
Three rules make this work.
Never discard the raw artefact. The mouth stores the original, immutably, addressed by content hash. Every downstream fact carries a pointer back to it. Reprocessing must never require re-fetching from a source that may have changed, expired, or vanished.
Carry provenance and confidence on every field. Not on the record — on the field. A field extracted by OCR at 0.62 confidence and a field typed by a human are not the same kind of fact, and downstream systems must be able to tell them apart.
@dataclass(frozen=True)
class ExtractedField:
"""A single field with full provenance. Never a bare value."""
name: str
value: Any
confidence: float # 0.0 - 1.0
method: Literal["ocr", "llm", "regex", "human", "api"]
source_artifact: str # content hash — always resolvable
source_locator: str # page 3, bbox, JSON pointer, cell ref
model_version: str | None
extracted_at: datetime
def trust(self, minimum: float) -> Any:
if self.confidence < minimum:
raise InsufficientConfidence(
f"{self.name}: {self.confidence:.2f} < {minimum:.2f} "
f"(via {self.method}, from {self.source_artifact})"
)
return self.value
class IntestinalBarrier:
"""
Nothing crosses into the domain without passing here.
The barrier is the single point where external matter becomes internal fact.
"""
THRESHOLDS = {
"identity_number": 0.97, # legal identity — near certainty required
"account_number": 0.97,
"amount": 0.95, # money
"date": 0.90,
"counterparty": 0.80,
"description": 0.60, # descriptive, low consequence
}
def absorb(self, fields: list[ExtractedField]) -> DomainFact | Quarantined:
failures = []
absorbed = {}
for f in fields:
threshold = self.THRESHOLDS.get(f.name, 0.85)
if f.confidence < threshold:
failures.append((f, threshold))
else:
absorbed[f.name] = f
if failures:
# Quarantine is not an error. It is a normal, expected state
# with an owner, a queue, and a replay path.
return Quarantined(
fields=fields,
reasons=[
f"{f.name} {f.confidence:.2f} < {t:.2f}" for f, t in failures
],
route_to="human_review",
replayable=True,
)
return DomainFact.from_absorbed(absorbed)
Quarantine is a first-class state, not an exception. It has a queue, an owner, an SLA, a dashboard, and a replay path. Systems that treat bad input as an exception log it and move on; systems that treat it as a state fix it.
10. Reference implementation: a credit platform
Abstract principles are cheap. Here is the full anatomy of one real system shape — a lending platform serving smallholder-farmer credit, the kind of system where a wrong decision has a human cost and an audit trail is a legal requirement.
10.1 Anatomy
Note where the weather feed sits. It is Sensory, not Respiratory, and the difference is not pedantry — the bureau is a counterparty you call and wait for, while the rain is an environment that does not know you exist. They fail differently, they are trusted differently, and putting the second one behind an anti-corruption layer designed for the first is how a single weather API's outage silently freezes a seasonal policy. §10.7 works this through.
10.2 The decision flow
The final step is the one that matters and the one most systems omit. The decision record must make the decision reproducible. Inputs, model version, policy version, rationale, confidence, timestamp — all of it, immutable. When a regulator asks in 2029 why this applicant was declined in 2026, "the model said so" is not an answer that survives contact with a hearing.
10.3 Skeletal: the contract
/**
* Skeletal system. Pure structure. No I/O, no framework annotations that
* imply persistence, no service dependencies. It only knows what is true.
*/
public record CreditDecision(
DecisionId id,
ApplicationId applicationId,
TenantId tenantId,
Outcome outcome,
Money approvedAmount,
Rate rate,
Term term,
Confidence confidence,
Rationale rationale,
ProvenanceSet provenance, // every input, with its source
PolicyVersion policyVersion, // which endocrine state applied
ModelVersion modelVersion, // which brain produced it
List<ImmuneCheck> immuneChecks,
Instant decidedAt
) {
public CreditDecision {
// Invariants live with the structure, not in a service.
requireNonNull(rationale, "A decision without a rationale is not a decision");
requireNonNull(provenance, "A decision without provenance is not auditable");
if (outcome == Outcome.APPROVED && approvedAmount.isNotPositive()) {
throw new InvariantViolation("Approved facilities must have a positive amount");
}
if (confidence.value() < 0.60 && !hasHumanReview(immuneChecks)) {
throw new InvariantViolation(
"Low-confidence decisions require human review. " +
"The brain may propose; it may not act alone here.");
}
}
/** The regulator's question, answerable from the object itself. */
public AuditNarrative explain() {
return AuditNarrative.of(rationale, provenance, policyVersion, modelVersion);
}
}
Invariants belong on the structure. If CreditDecision can be constructed in an invalid state, then every service that touches it must remember the rule — and one of them will not.
10.4 Endocrine: risk appetite as a hormone
policy: risk_appetite
version: 47
scope:
tenant: finx-lesotho
product: seasonal_input_credit
region: maseru
# Hormones are gradual. This policy is pulled every 60s with bounded staleness
# and every change ramps. There is no instant global write path.
propagation:
mode: pull
interval: 60s
max_staleness: 180s
ramp:
strategy: linear
duration: 4h
canary_cohort: 5%
auto_rollback_on:
- reject_rate_delta > 0.12
- default_rate_7d_delta > 0.03
- decision_latency_p99 > 3000ms
thresholds:
auto_approve_above_score: 0.78
auto_decline_below_score: 0.31
human_review_band: [0.31, 0.78]
max_exposure_per_applicant: 45000
max_exposure_per_cooperative: 900000
max_tenor_months: 9
# Seasonality: the organism adjusts to the environment it is actually in.
seasonal_modulation:
planting_season:
months: [9, 10, 11]
auto_approve_above_score: 0.71 # loosen — capital is needed now
max_exposure_per_applicant: 60000
post_harvest:
months: [4, 5, 6]
auto_approve_above_score: 0.83 # tighten — repayment window
model_routing:
primary: risk-scorecard-v9
fallback: deterministic-scorecard-v3
fallback_when:
- primary_p99_latency > 2500ms
- primary_error_rate > 0.02
- primary_confidence_mean < 0.70
decay:
expires_at: 2026-12-31
on_expiry: revert_to_baseline
note: >
Policies decay unless renewed. An unreviewed risk appetite is a liability,
not an asset. Someone must look at this before December.
The decay block is Principle XIII made operational. The seasonal_modulation block looks like the organism adapting to a cyclical environment — and §10.7 explains why, as written, it is doing the opposite.
10.5 Lymphatic: what actually gets emitted
@Observed(system = "cerebral", organ = "risk-scoring")
public CreditDecision decide(Application application) {
var span = tracer.span("credit.decision")
.attr("tenant", application.tenantId())
.attr("product", application.product())
.attr("policy.version", policy.version())
.attr("model.version", model.version());
try (span) {
var decision = scorer.score(application, policy);
// Metrics feed homeostasis. These are not dashboard decoration —
// they are the sensor half of the control loop in §6.
metrics.histogram("decision.confidence").record(decision.confidence().value());
metrics.histogram("decision.duration_ms").record(span.elapsedMillis());
metrics.counter("decision.outcome", "outcome", decision.outcome().name()).inc();
metrics.histogram("decision.cost_zar").record(decision.inferenceCost().amount());
// The decision record is not a log line. It is a durable, immutable
// domain artefact with its own retention class and legal significance.
decisionRecords.append(decision);
return decision;
}
}
10.6 Urinary: retention as an organ, not a cron job
The lending platform holds identity numbers, bank statements, geolocation, yield records, and repayment behaviour for people who have very little leverage over the institutions holding their data. Under POPIA this is not a hygiene concern to be handled by an S3 lifecycle rule someone added in 2024 and nobody has opened since. It is a function of the organism with a legal obligation attached.
The kidney's actual cleverness is not filtration — it is selective reabsorption. It filters roughly 180 litres of plasma a day and returns almost all of it, keeping what is valuable and excreting the remainder. Most retention policies implement the filtration half and never the reabsorption half: they delete on a schedule with no notion of what should have been kept.
The organ's interface is a retention class attached to every data type at the moment the type is defined — not at the moment someone notices the storage bill.
retention_classes:
decision_record:
lifespan: 7y # regulatory floor, not a preference
basis: legal_obligation # POPIA §14 lawful retention
on_expiry: archive_then_tombstone
reabsorb: # what survives the purge
- decision_id
- outcome
- policy_version
- model_version
erasure_request: refuse_with_reason
note: >
A subject cannot erase a lending decision inside the regulatory window.
The refusal is lawful, but it must be *explained*, logged, and reviewable.
raw_artifact: # the mouth's immutable store
lifespan: 3y
basis: legal_obligation
on_expiry: purge
erasure_request: honour_after_decision_final
note: >
Bank statements and ID scans are the highest-sensitivity material we
hold and the least useful after the facility closes. Short leash.
applicant_pii:
lifespan: 5y_from_last_activity
basis: contract
on_expiry: pseudonymise # not delete — the ledger must still balance
erasure_request: honour
cascade:
- embeddings # vectors derived from PII are PII
- search_index
- analytics_extracts
inference_trace:
lifespan: 90d
basis: legitimate_interest
on_expiry: purge
reabsorb: [aggregate_quality_metrics]
note: >
Prompts and completions contain applicant data. They are debugging
material with a short useful life and a long liability tail.
environmental_observation:
lifespan: 5y
basis: legitimate_interest
on_expiry: downsample_to_monthly
note: >
Sensory history is not operational data — it is the evidence for why a
set point was where it was. Discarding it makes past policy
unexplainable. Keep it, thinned.
telemetry:
lifespan: 30d_hot / 13m_cold
basis: legitimate_interest
on_expiry: purge
Three obligations make this an organ rather than a script.
Erasure must cascade to derivatives. An embedding computed from an applicant's bank statement is still that applicant's data. So is the row in the analytics warehouse, the entry in the search index, and the cached feature vector. A system that deletes the source row and leaves seven derivatives is not compliant; it is merely tidy. Every derived store registers itself as a downstream of the class it derives from, and the purge is a fan-out with acknowledgements — not fire-and-forget.
Pseudonymisation is the usual answer, not deletion. The ledger must still balance in 2031. The regulator must still be able to audit the 2026 approval rate by cohort. What must disappear is the link to the person, not the fact that a facility existed. Designing for pseudonymisation from the start is cheap; retrofitting it onto a schema where applicant_id is a foreign key in forty tables is a multi-quarter project.
Refusals are as auditable as erasures. When the organism lawfully declines an erasure request because a regulatory hold applies, that refusal is a decision with a rationale, a policy version, and an expiry date — the same shape as a credit decision. "We can't delete that" with no artefact behind it is indistinguishable, from the outside, from "we didn't get around to it."
Storage growth that outpaces user growth is the earliest reliable sign this organ has stopped working. It is silent for a long time, and then it is simultaneously a cost problem, a legal problem, and a breach-blast-radius problem.
10.7 Sensory: the assumption hiding inside the policy
Look again at the seasonal_modulation block in §10.4. It loosens the approval threshold during months 9, 10 and 11, because that is when smallholders in the Maseru district plant and therefore when they need input credit.
That block is a claim about the world, hard-coded, made on a particular day, by someone who is no longer looking. It is Principle XII's exact failure mode, sitting in the middle of an otherwise well-designed policy, and it is the kind of thing that reads as obviously correct in review.
Here is how it kills people's harvests. Lesotho's planting window is governed by the onset of the summer rains, not by the calendar. In a year when the first meaningful rains arrive six weeks late — increasingly common, and the direction of travel is one way — the policy loosens in September for farmers who cannot get seed into the ground until early November. Capital is disbursed against a season that has not started. The repayment schedule is anchored to a harvest that will now be late. The nine-month tenor that was generous in a normal year is tight in this one. Nothing in the system is broken. Every metric is green. The organism is confidently optimising against an environment that no longer exists.
The Sensory system's job is to notice.
The revised policy stops asserting when the season is and starts asking:
seasonal_modulation:
# Was: months: [9, 10, 11]
# A calendar is a memory of an average year. Observe the actual one.
planting_season:
determined_by: sensory.lesotho.planting_window
requires:
- signal: rainfall_mm_30d
threshold: "> 60"
region: maseru
- signal: observed_planting_activity
threshold: "> 0.30" # share of agent visits reporting planting
confidence: "> 0.70"
min_agreement: 2_of_2 # both must hold; one sensor is an anecdote
on_blindness: hold_last_known # never guess, never default to the calendar
max_staleness: 7d
effect:
auto_approve_above_score: 0.71
max_exposure_per_applicant: 60000
Four properties make this safe rather than merely clever.
Perception proposes; the endocrine system disposes. The sensory system never writes auto_approve_above_score. It publishes an observation, and the endocrine system decides whether that observation justifies a ramped set-point change. This is the whole reason Principle XII insists on the separation: a rain gauge that fails wet must not be able to loosen a lending threshold in one hop. It gets to make an argument, over four hours, with a canary cohort and automatic rollback.
Blindness is a declared state, never a default. When every sensor for a signal is stale or unreachable, the system does not quietly fall back to the calendar. It holds the last known set point, marks itself blind, and escalates. The calendar was the original mistake; reverting to it under uncertainty reintroduces the failure at exactly the moment perception mattered most.
Disagreement is preserved, not averaged. If the rainfall data says the season has started and field agents report no planting, that discrepancy is the most valuable signal in the system — it usually means something the model has no representation for, like input suppliers being out of stock. Averaging two sensors that disagree produces a number describing nothing.
Drift detection is the point. The output that matters most is not "rainfall is 64mm." It is "the planting window has moved eighteen days later than the ten-year mean, three years running, and every set point in this policy was calibrated against that mean." No automated system should act on that. A human should read it and rethink the product.
This is also where the Sensory/Respiratory distinction earns itself in practice. The credit bureau is Respiratory: a counterparty, under contract, that you call and wait for. The rain is Sensory: an environment that does not know you exist, cannot be called, and will not tell you when it changes. Building the second one as though it were the first — request/response, treated as authoritative, no staleness, no fusion — is how you end up with a single weather API's outage silently freezing your seasonal policy.
10.8 What this design costs
Every honest architecture document owes a section like this one, and almost none of them have it.
The organismic decomposition of the credit platform is more expensive than the obvious alternative — one service, one database, a scheduled job, and a model call in the request path. Specifically:
- More moving parts. Fourteen responsibility areas mean more contracts, more deployment surface, and more places a message can be dropped. A team of four should not attempt fourteen deployables. They should attempt fourteen modules and perhaps three deployables, and they will get most of the benefit.
- Duplication is deliberate and it is real. Principle II costs you storage and reconciliation work. The applicant's name exists in more than one place. That is the price of organ autonomy, and it is only worth paying where autonomy actually buys something.
- Eventual consistency where a transaction would have been simpler. If the disbursement and the ledger entry must be atomic, make them atomic — inside one organ. Do not distribute a decision that wants to be a transaction just because the diagram has boxes.
- Latency from staging. The digestive tract's quarantine gates add hops. For a document-heavy lending flow that is correct. For a real-time quote it would be absurd.
- The Sensory system is the easiest to over-build. It is genuinely interesting work, and it is possible to spend a quarter constructing a fusion pipeline for signals that would have been adequately served by one number a domain expert updates every March. Start with the smallest thing that removes a hard-coded assumption, and only add sensors that have already changed a set point at least once.
The honest test is per-organ, not global: does this boundary let something fail without taking the rest down, or does it only let something be drawn separately? Boundaries that exist only on the diagram are pure cost.
11. Metabolism: cost as a vital sign
Biology has a concept software has been slow to internalise: every function has a metabolic cost, and the organism budgets against it continuously. The brain is roughly 2% of body mass and consumes about 20% of resting energy. That ratio is not an inefficiency waiting to be optimised away; it is a deliberate allocation, and the body defends it — under starvation, peripheral tissue is catabolised before neural tissue.
Most platforms treat cost as a monthly surprise delivered by finance. In OSA it is a vital sign with a control loop, on equal footing with latency and error rate, because in an AI-native system cost is the variable most likely to move by an order of magnitude with no code changing at all.
Cost is measured per unit of business value, never per month. "R240,000 of inference last month" is not actionable. "R1.12 per credit decision against a band of R0.00–R0.85, driven by a 40% rise in retrieved context length" is a diagnosis. If you cannot divide your spend by something the business counts, you are not measuring metabolism — you are reading a bank statement.
Attribution is a design requirement, not a reporting feature. Every unit of work carries the tenant, organ, and feature that caused it, all the way down to the inference call. Retrofitting attribution onto an AI platform afterwards is one of the reliably miserable projects in this field, because the causal chain from "a user clicked" to "we spent R4 on tokens" runs through four asynchronous hops nobody instrumented.
The effector ladder is ordered by damage. Cache first — free, no behaviour change. Then batch — latency cost, no quality cost. Then downshift the model tier — quality cost, bounded and measurable. Then shed expendable work — visible, and the reason you wrote the degradation ladder in §6 before the incident. A team improvising this order at 2am starts at the bottom, because shedding is the most obvious lever and the most expensive one.
The starvation rule. When the budget is genuinely exceeded and every effector is exhausted, the organism protects the core and catabolises the periphery. It does not scale everything down evenly. Uniform degradation under resource pressure is how a body dies of nothing in particular.
12. Pathology: diagnosing systems instead of patching defects
The most immediate practical effect OSA has on a team is linguistic, and it arrives long before any architectural change. Engineers stop reporting symptoms as though they were causes and start reporting syndromes.
"Checkout is slow" is a symptom and it points nowhere. "We have circulatory congestion secondary to a hypoxic supplier — the payment adapter's timeout budget is exhausting the shared pool, and queue age is a consequence, not the fault" names an organ, a mechanism, and a treatment. The second sentence takes longer to say and saves an hour.
Clinical reference
| Pathology | Presents as | Mechanism | Treatment | Prophylaxis |
|---|---|---|---|---|
| Hypertension | Queue age climbing, p99 following it | Producers outpacing consumers, no backpressure | Add slow-twitch capacity; shed tier 3–4 producers | Backpressure at the producer, never only at the broker |
| Thrombosis | One partition stalled, the rest healthy | Poison message on infinite retry | Dead-letter with a machine-readable reason; cap retries | Retry budget per message, not per consumer |
| Atherosclerosis | Gateway config changes need domain review | Transformation logic deposited in transport | Extract into an organ with tests and an owner | Transport routes on the envelope only |
| Autoimmunity | Support tickets about wrongful denials | Controls ratcheted after each incident, never loosened | Triage at breach severity; add tolerance entries | False-positive rate as a first-class SLI |
| Immunodeficiency | Service calls with no caller identity | "It's internal" treated as authorisation | mTLS or signed identity on every hop | Position is never identity |
| Cachexia | Cost per unit rising, volume flat | Context bloat, retry amplification, cache decay | Attribute, then apply the effector ladder in order | Cost per unit of value as a vital sign |
| Sensory deprivation | Nothing. Metrics green, outcomes drifting | Environmental assumptions frozen as constants | Instrument the assumption; re-derive the set point | Every constant carries a re-measurement date |
| Sensory hallucination | Set points moving with no real-world cause | One unvalidated feed treated as authoritative | Require multi-sensor agreement; ramp all changes | Fusion with agreement thresholds, never a single source |
| Phantom signal | Confident readings from a dead feed | Staleness not bounded; last value cached forever | Expire observations; declare blindness explicitly | max_useful_age mandatory on every observation |
| Seizure | Metrics oscillating on a fixed period | Control loop with no hysteresis or refractory period | Add a band and a cooldown | Never ship a single-threshold autoscaler |
| Neuropathy | Events produced, zero consumers | Consumer removed, producer left running | Delete the producer or register the subscriber | Contract registry with consumer registration |
| Osteoporosis | Every change needs a coordinated release | Contracts weakened by optional fields | Re-establish explicit schemas; version and deprecate | Consumer-driven contract tests in CI |
| Endocrine storm | Global behaviour change, instant, no ramp | A config path with no gradient and no halt condition | Roll back; add ramp and auto-halt to propagation | No instant global write path exists at all |
| Malignancy | One service touched by every change | Responsibility accretion over years | Extract organs along invariant boundaries | Change-coupling per service, reviewed monthly |
| Renal failure | Cost curve detached from the usage curve | No retention class assigned at creation | Lifecycle rules, tiering, cascade erasure | Lifespan declared when the type is declared |
Sensory deprivation deserves its own note, because it is the only pathology in the table with no symptom. Every other row presents as something — an alert, a ticket, a graph bending the wrong way. Deprivation presents as success: healthy dashboards, stable latency, and decisions that are quietly worse than they were, against a world that moved. It is found only by audit, never by alerting, which is why Principle XII exists as a principle rather than a runbook entry.
The triage order
When something is wrong, work outward in this sequence. It is the clinician's order, and it is deliberately not the order engineers instinctively use.
- External exchange. Is a third party failing? Most common root cause, fastest to rule out. Check integration health before reading a single application log.
- Transport. Is circulation congested? Queue age, broker saturation, connection pools, mesh error rates.
- Compute. Is there enough muscle? Saturation, scaling events, throttling, restarts.
- Coordination. Is signalling broken? Stuck sagas, unconsumed events, orchestrator health, correlation gaps.
- Everything else. Structural, metabolic, immune, sensory. Slower to develop, slower to fix, and rarely the cause of an outage that started twenty minutes ago.
Most teams start at step 5, in the application logs, because that is where the code they wrote lives. Starting at step 1 typically halves time-to-diagnosis, for a simple reason: steps 1 through 4 are checked by looking at four dashboards, and step 5 is checked by reading.
Sensory pathologies are the exception that proves the ordering. They never cause the incident you are currently in, and they are never found by this protocol. They are found by a scheduled review that asks, of every constant in every policy: when was this last true, and who checked?
13. Growth, and the thing nobody does: apoptosis
Organisms do not acquire capabilities by accumulation. They acquire them through variation under selection, and — critically — they remove as aggressively as they add. Roughly fifty billion cells in your body are deliberately destroyed every day. Programmed cell death is not damage; it is maintenance. A body that only added tissue would be a tumour.
Software teams are excellent at the first half and almost universally terrible at the second.
Mutation is scoped to one organ. If a change requires simultaneous modification of three organs, it is not a mutation — it is a structural revision needing explicit design rather than a feature branch. This is the most useful early-warning signal in the model: the number of organs a change touches is the honest measure of whether your boundaries are real.
Selection pressure is the health index, not throughput and not preference. A change that improves p99 latency while degrading cost efficiency and recoverability has not been selected. It has been argued for. Those are different, and publishing a composite health number is what makes the difference visible in the pull request rather than in the postmortem.
Retirement must be complete. A variant turned off but left in place — flag still evaluated, branch still compiled, dashboard still rendering, config key still read — is a benign tumour. It costs nothing today and it is the reason the next engineer cannot tell which of four code paths is live. Retiring halfway is worse than never experimenting, because it converts a clean question into permanent ambiguity.
Everything decays unless renewed. Principle XIII, made operational. Every flag, endpoint, dataset, model version, dependency, dashboard, runbook — and, per Principle XII, every environmental constant — carries an expiry. On expiry the default is removal, and continued existence requires someone to present evidence of use. Not an opinion that it might be needed. Evidence.
The objection is always that this is a lot of ceremony. The answer is that the alternative is not less ceremony but deferred ceremony, paid at compound interest by whoever inherits the system. A codebase is made of everything that was once needed, and a default of removal is the only mechanism that has ever prevented that.
Speciation. When one organ's requirements diverge irreconcilably from its neighbours' — different consistency model, different regulatory regime, different latency class, different tenancy model — split it. Divergent requirements forced into one implementation satisfy neither, and the compromise stays invisible until both sides are equally unhappy.
14. The organism and its keepers
Conway's law is not a warning. It is an anatomical observation: the communication structure of the organisation becomes the communication structure of the system. OSA is only achievable if the team topology can support it, and pretending otherwise produces beautiful diagrams that describe nobody's actual code.
| Organ property | Organisational requirement |
|---|---|
| An organ owns its data exclusively | One team owns that organ's store. Not "primarily owns" — owns. |
| Organs communicate through contracts | Contract changes are reviewed by consumers, not only producers |
| Reflexes act without consulting the brain | On-call has standing authority to trip a breaker without approval |
| Hormones ramp and decay | Every policy has an owner and a review date, like a code owner |
| Perception precedes adaptation | Someone is accountable for each environmental assumption, by name |
| Every organ is self-diagnosing | The team owning the organ owns its health definition |
| Cells are disposable | Nobody's laptop, and nobody's memory, is part of the system |
Three failure modes are worth naming.
An organ with no owner is not an organ. It is an area of the codebase everyone edits and nobody maintains, and it will accumulate exactly the pathologies in §12 with nobody positioned to notice. If you cannot name the team for every box on your diagram, the unnamed boxes are the ones that will fail.
One team owning fourteen organs is fine; fourteen teams owning one organ is not. OSA is about responsibility boundaries, not headcount. A four-person team can run all fourteen systems as fourteen modules with clear internal contracts. What does not work is the inverse — several teams sharing ownership of one organ's store — because Principle II then has no enforcement mechanism except goodwill, and goodwill loses to deadlines.
The Sensory system needs a domain owner, not an engineering owner. This is the one organ where the person who should be accountable is usually not on the engineering team. The agronomist knows the planting window is drifting. The risk officer knows the bureau's coverage changed. Engineering can build the fusion pipeline, but it cannot tell you which signals matter or when a reading stops making sense. An unowned sensory system produces exactly the confident, well-instrumented blindness it was built to prevent.
15. The maturity ladder
Two diagnostic questions, and each admits only one honest answer.
Stage 3: when a vital sign leaves its band at 02:00, does anything other than a human respond? If not, you are at stage 1 regardless of how many dashboards exist. Dashboards are sensors, and a sensor with no effector attached is stage 1 with better visualisation — which is where most systems that describe themselves as self-healing actually sit.
Stage 4: name the last set point that changed because the world changed, rather than because the system was struggling. If no example comes to mind, you have interoception without exteroception. The organism regulates itself beautifully against conditions it stopped checking.
Note that stages 1–3 are all interoceptive — they perceive the system's own state. Stage 4 is the first that looks outward, which is why it is so commonly skipped: everything up to it can be built by an engineering team alone, and stage 4 cannot.
Stage 3 with a disciplined stage 4 review cycle is the right destination for almost everyone. Regulation is automated; adaptation is human-governed. The organism handles the night; people decide what "normal" means, on a Tuesday, with coffee. Stage 5 is not the target for most platforms, and pursuing it early is an efficient way to build a system nobody can predict.
16. Adoption: ninety days
You do not rewrite into OSA. There is no migration — there is a diagnosis, followed by treatment of the most critical organ. The sequence below is ordered by return on effort, and every step is completable by a small team without a restructuring programme.
Days 1–15 — Anatomical survey. Map every existing component to exactly one of the fourteen systems. This produces two artefacts and nothing else: one diagram, and one list. The list is the valuable one — it contains every component that mapped to two systems (your boundary violations) and every component that mapped to none (your tumours). Fix nothing yet. The survey loses its diagnostic value the moment it becomes a workstream.
Days 16–30 — Define vital signs. Pick the three most critical user journeys. For each, define sensor, band, and effector for latency, error rate, saturation, queue age, freshness, cost per unit, and recovery time. Publish the health index even though the first number will be embarrassing — especially because it will be embarrassing. A baseline that flatters you is not a baseline.
Days 31–50 — Separate one tissue. Take the single worst violation of Principle II — the most-shared table — and give it one owner and a published contract. One. The urge to fix all of them at once is strong and it is wrong: a half-completed organ separation is materially worse than none, because you maintain both paths while trusting neither.
Days 51–70 — Install reflexes. Add timeouts, bulkheads, circuit breakers, and load shedding at every external boundary. This is the highest-return work in the entire programme, it requires no restructuring, and if you are short on time it should come before the previous step.
Days 71–90 — Close one loop, and open one eye. Choose one vital sign and build a complete homeostatic controller: sensor, comparator with a band, effector, hysteresis, refractory period, escalation on decompensation. Prove it with a game day — a control loop never observed compensating is a hypothesis.
Then, in the same fortnight, do the smallest possible sensory exercise: list every hard-coded constant in your configuration that is really a claim about the outside world. Seasons, regional assumptions, price bands, expected volumes, tolerance thresholds someone chose in a meeting. For each one, write down when it was last verified and who owns it. Most teams find between fifteen and forty. You will not instrument them this quarter, and you should not try. The list itself is the deliverable, because until it exists nobody can tell the difference between a decision and an inheritance.
Then repeat, one organ per quarter, indefinitely. There is no completion state. Organisms are never finished; they are only alive or not.
17. Where the metaphor breaks
An architecture philosophy that cannot state its own limits is not a philosophy, it is a brand. Five places where reasoning biologically will actively mislead you.
Organisms have no requirements. Evolution optimises for reproduction; it has no customer, no roadmap, no regulator. "The organism wouldn't do that" is never an argument against an explicit business requirement. The analogy structures how you deliver. It has nothing to say about what, and the moment it starts arguing about what, it has become a way of avoiding a conversation with the business.
Evolution has unlimited time and unlimited failed attempts. Biology discards billions of organisms to find one improvement. You have four engineers and a release date. Mutation-and-selection in software must be budget-constrained, and every experiment needs a predetermined kill date — otherwise "we're evolving toward it" becomes the most expensive way ever devised to avoid a decision.
Biological language flatters bad decisions. "It's self-healing" has covered for an enormous quantity of unexamined retry logic. "We're growing organically" has covered for the complete absence of design. "That's just apoptosis" has justified deleting something someone needed. The rule that keeps this honest: a metaphor may name a phenomenon; only a metric may justify a decision. If the concern cannot be stated as a number with a band, the biology is decoration and should be struck from the argument.
Some software properties have no biological analogue, and they are among software's best. Transactional consistency. Cryptographic proof. Exact reproducibility. Formal verification. Perfect copies. Biology does none of these and is measurably worse for it. Where software can be exact, be exact — do not build an eventually-consistent ledger because organisms are eventually consistent. Organisms also get cancer, misfold proteins, and cannot roll back.
Organisms cannot be redesigned; they can only be modified in place. Evolution has no refactor. It cannot revisit a decision made 500 million years ago, which is why the vertebrate retina is wired backwards and the recurrent laryngeal nerve detours around the aorta. You can redesign. The ability to stop, reconsider, and replace a subsystem wholesale is a capability biology would use constantly if it had it. Never talk yourself out of a warranted rewrite on the grounds that organisms don't do rewrites — that is the metaphor making an argument it has no standing to make.
Use OSA where it earns its place: boundary definition, channel selection, resilience design, observability, perception, lifecycle discipline, and the shared vocabulary a team uses to reason about health. Drop it the instant it starts arguing with arithmetic.
18. The review scorecard
Thirteen questions. Score each 0–2. Below 18, the system is not organismic — it is a monolith with a service mesh and good intentions.
| # | Question | 0 | 1 | 2 |
|---|---|---|---|---|
| 1 | Does every component map to exactly one system? | Many map to several | Most map cleanly | All map cleanly; exceptions documented |
| 2 | Does any organ read another's store directly? | Routinely | One legacy exception with a dated plan | Never |
| 3 | Does transport ever inspect the business payload? | Yes, for routing | Only for logging | Never — routing is envelope-only |
| 4 | Do systemic config changes ramp? | Global and instant | Staged by hand | Automatic gradient, halt conditions, rollback |
| 5 | Do urgent decisions bypass orchestration? | No reflex tier exists | Some reflexes, undocumented | Documented arcs with latency budgets, tested |
| 6 | Can any instance be killed at any moment safely? | No | Mostly, untested | Proven by regular chaos testing |
| 7 | Does each organ publish a real health assessment? | Static 200 OK | Dependency pings | Invariants, dependencies, and a health index |
| 8 | Does every data class have a declared lifespan? | No retention policy | Some buckets | Declared at type definition, enforced, cascading |
| 9 | Does every integration have a documented degradation plan? | Undefined | Timeouts only | Documented and rehearsed per supplier |
| 10 | Does every incident produce a permanent detection? | No post-incident process | Written up, not automated | Added, verified, promoted to the fast path |
| 11 | Is cost measured per unit of business value? | Monthly total only | Per service | Per unit, attributed to tenant and feature, with a band |
| 12 | Can model-derived decisions be vetoed and reproduced? | No record of inputs | Decision logged | Inputs, versions, rationale, confidence — reproducible years later |
| 13 | Are environmental assumptions measured or asserted? | Hard-coded constants, unowned | Documented, reviewed annually | Sensed, fused, staleness-bounded, feeding set points through a ramp |
Questions 11, 12 and 13 are what separate an AI-native platform from a conventional one that happens to call a model. They are also the three most commonly scored zero by teams who score well on everything else — and question 13 is the one most likely to be scored zero by a team that did not know it was a question.
19. Closing
The question this manifesto exists to answer is not "is this architecture correct?" Architectures are not correct; they are correct for now, under a load profile and a set of constraints that will both change. Asking for correctness is asking for a guarantee no design has ever been able to give.
The better question — the one an organism answers continuously, without being asked — is:
Can this system tell us when it is becoming unhealthy, and act before we notice?
And its harder companion, which is the one the Sensory system exists for:
Can it tell us when the world has changed underneath it, while every one of its own metrics is still green?
A platform that ships fast and dies quietly in year three is a failure no launch metric will ever catch. The team will have moved on, the dashboards will be green, and the decline will show only as a slow rise in the number of changes requiring a coordinated release, a slow drift in cost per transaction, a slow accumulation of things nobody is willing to delete, and a slow divergence between the assumptions in the config and the conditions outside the window.
A platform that regulates itself, perceives its environment, sheds what it no longer needs, and grows under measurement will outlive the team that built it. That is not a poetic claim. It is the only durable definition of good architecture anyone has produced, because it is the only one that can still be evaluated after everyone who made the original decisions has gone.
Build organisms, not machines.
This is the working philosophy behind the platforms we build at Motebo Technologies. If you are designing a system that has to survive contact with real users, real regulation, and real time, let's talk.

