# Primitive taxonomy — the canonical statement

Three primitive counts appear in this delivery. Two are current and describe
different scopes; one is withdrawn. Read this file before reconciling any count
you find elsewhere.

| Count | Scope | Where it is measured |
|---:|---|---|
| **168** | **The substrate matrix.** The full primitive taxonomy: the invariant 40-primitive core spine (12 Organs, 12 Layers, 8 Engines, 8 Agents) plus 128 vertical-pack primitives. | `ALL_PRIMITIVES` in `source/src/lib/discovery/expanded-primitives.ts`, which throws at module load if the length is not 168. |
| **131** | **The runtime handler registry.** Primitives with an executable body registered by `registerAllPrimitives()` — 40 core plus 91 vertical. | Unique `name` values in `PRIMITIVE_CATALOG`, `source/packages/runtime/src/primitives.ts`. |
| ~~159~~ | **Withdrawn.** An earlier revision derived a matrix size from recorded chain *labels* rather than from the primitive list. That derivation was wrong and the number is retired. | No surface should carry it. The audit pass fails the build if one does. |

## Why 168 and 131 are both correct

The matrix is a taxonomy; the registry is an implementation. 37 matrix names have no
dedicated handler body and resolve through the documented classification
fallback in `invokePrimitive()`, which routes by primitive class rather than by
name. A chain naming one of those 37 still executes; it executes generically.

Consequences for an integrating agent:

* Cite **168** when describing the taxonomy, the matrix, or coverage of the
  substrate as a design.
* Cite **131** when describing what the runtime executes with a
  purpose-built body.
* Never state or imply that all 168 matrix names have dedicated handlers. They
  do not, and the difference is 37 names.

## Matrix invariance

The matrix total is fixed at 168. New runtime authorities ship as
sub-primitives of an existing parent, never as matrix growth. A surface claiming
a matrix larger than 168 is wrong regardless of how many distinct labels appear
in recorded discovery chains — chain labels include per-vertical aliases for the
same primitive and are reported as labels, never as primitives.
