Skip to content
← Documentation

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

  1. A connector maps every condition it reports into exactly one taxonomy entry.
  2. 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.
  3. 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: stalled requires 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 degraded and overspend is two findings. Correct, but the world must aggregate them per subject for display.