docs/proposed-condition-taxonomy.md
PROPOSAL — Constitutional Taxonomy of Operational Conditions
Status: PROPOSED. Not in force. Not implemented. This document has no constitutional authority. It is submitted for approval under the gate placed on F6. Nothing in the codebase references it.
1. What a condition is
A condition is a state of the operational world that warrants attention, expressed in terms that remain true regardless of which system observed it.
"Repository has uncommitted changes" is not a condition — it is GitHub's vocabulary. "A unit of work exists outside protection" is a condition, and Git, Perforce and a document store can all report it.
The taxonomy is closed. Connectors map into it and may not extend it. Adding a condition kind is a constitutional act; adding a connector is not.
2. Correction to the Platform Readiness Review
The review proposed <connector>:<condition>:<subject> as the key format.
That was wrong and would have reintroduced the F6-class bug it was meant to
fix.
Putting the connector in the identity means GitHub and GitLab observing the same
stalled repository produce two findings for one condition — a direct violation
of Article I.4, and structurally identical to the title-keying defect fixed in
ead05b3. The observer is provenance, never identity.
Corrected format:
findingKey = <condition>:<subject-urn>
The connector is recorded in evidence and the fact's source, never in the key.
Two connectors reporting the same condition about the same subject collapse to
one finding, and the evidence names both.
3. Subject URNs
A subject is identified canonically, independent of the system that reported it:
<subject-kind>:<authority>/<path>
repo:github/JLV-000X/Xcortex
service:k8s/prod/checkout-api
workitem:jira/ENG-1234
datastore:aws/rds/orders-primary
credential:env/STRIPE_SECRET_KEY
budget:aws/account/1234
agent:cognithamus/z
Subject kinds (closed): repo · service · deployment · environment ·
datastore · credential · workitem · incident · budget · agent ·
document · channel.
Two connectors describing the same subject must resolve to the same URN. Where
they cannot (Jira ENG-1234 and a Linear issue mirroring it), that is an
explicit aliasing problem to be solved by a declared alias table — never by
minting two subjects and hoping.
4. The condition taxonomy
Six families. Each condition names a state, not a remedy.
4.1 Availability — a thing that should be reachable is not
| Condition | Meaning |
|---|---|
unreachable |
The subject cannot be observed at all |
degraded |
Observable but impaired against a declared expectation |
unavailable |
Confirmed non-functional |
4.2 Progress — work is or is not advancing
| Condition | Meaning |
|---|---|
stalled |
No progress for longer than a declared threshold |
blocked |
Progress prevented by a named dependency |
queued |
Accepted, not started |
abandoned |
No progress and no owner |
4.3 Capacity — a bounded resource against its limit
| Condition | Meaning |
|---|---|
saturated |
At an enforced limit |
overcommitted |
Demand exceeds capacity |
idle |
Capacity provisioned and unused |
saturated requires an enforced limit, mirroring the existing rule that a
capacity meter may only be drawn where a real constraint exists.
4.4 Integrity — the estate's consistency with its own declarations
| Condition | Meaning |
|---|---|
unprotected |
No redundancy, replica or backup |
misconfigured |
A declared requirement is unmet |
drifted |
Actual state differs from declared state |
unverified |
A claim exists with no evidence behind it |
4.5 Exposure — security and risk
| Condition | Meaning |
|---|---|
exposed |
A secret or surface is reachable by those who should not reach it |
vulnerable |
A known weakness is present |
unauthorised |
A change occurred outside the sanctioned path |
4.6 Economics — value and cost
| Condition | Meaning |
|---|---|
overspend |
Cost exceeds a declared budget |
waste |
Paid capacity produces no output |
unmonetised |
Output exists with no revenue path |
5. Severity is platform-owned
Connectors report conditions and magnitudes. They do not choose severity.
If Datadog calls something "critical" and Jira calls the same thing "P3", the
world inherits two vocabularies and drifts. Severity is derived by the platform
from (condition kind, measured magnitude, subject importance) — one rule,
applied identically to every source.
A connector that emits severity is rejected at registration.
6. Mapping obligations
- A connector maps every condition it reports into exactly one taxonomy entry.
- A condition it cannot map must be dropped and reported as a gap — never coerced into an approximate neighbour, never emitted under a new key. A visible gap is a measurement; a coerced mapping is a fabrication.
- Every mapping is declared in the connector manifest and validated at registration, so drift is impossible at runtime rather than merely discouraged.
7. Migration of existing keys
| Today | Proposed |
|---|---|
repo-unreachable-<name> |
unreachable:repo:github/<owner>/<name> |
repo-stale-<name> |
stalled:repo:github/<owner>/<name> |
repo-dirty-<name> |
unprotected:repo:github/<owner>/<name> |
repo-todos-<name> |
queued:repo:github/<owner>/<name> |
repo-issues-<name> |
queued:repo:github/<owner>/<name> ⚠ |
sec-<id> |
misconfigured | exposed | unprotected : subject |
fin-no-feed |
unverified:budget:cognithamus/estate |
plan-norev-<id> |
unmonetised:service:<urn> |
⚠ repo-todos and repo-issues both map to queued on the same subject and
would collide into one finding. That is the taxonomy working correctly — they
are the same condition (accepted work not started) differing only in where it
was recorded — but it is a behaviour change, and the migration must either
accept the merge or distinguish the subject (workitem:github/... vs
repo:github/...). This needs your decision before F6 is implemented.
8. What this does not solve
- Subject aliasing across systems (§3) needs a declared alias table.
- Threshold ownership:
stalledrequires a declared threshold. Platform default or per-connector? Per-connector reintroduces drift; platform default may not suit every subject kind. Recommend platform default, overridable per subject kind only, declared. - Condition composition: a service both
degradedandoverspendis two findings. Correct, but the world must aggregate them per subject for display.