Partial-Level Ladders — Reconstruction From the Capability Test
Question: the corpus carries two partial-level ladder sets that use the same rung labels for different definitions. Which is right?
Answer: neither, and the question was malformed. Both are one-dimensional projections
of a multi-dimensional space — both source notes say so in their own text — and the
third artifact, data/domains/entity-system.v1.json, is a hybrid that carries one
lineage's rung labels over the other lineage's scoring, plus scoring errors of its own.
This note derives the ladders from a stated test instead of adjudicating between them.
fw | entity-system arrangement |
sc | Sc1 (topology) for the derivation; Sc3 (real systems) for the occupancy evidence |
mn | 66 scored manifestations, data/manifestations/*.v1.json |
cx | raised by the Papers 0 / 6 figure-vs-table scale defect |
ls | entity-system substrate |
question | What makes a partial-level rung a rung, and what are the six ladders when that test is applied? |
Part 1 — What the evidence says about the three existing artifacts
1.1 Both source notes already say the ladder is a projection
This is not a new claim and it is not contested between the lineages. Lineage B's own
source note, primitive-combinatorics.md:
"The partial levels defined above are one axis, but each primitive also has depth dimensions… The partial E levels (E0-E3) are really positions in this 3D space."
And the identity exploration reached the same conclusion from the other side: "A ladder that cannot hold a coherent position is a one-dimensional projection of a two-dimensional space."
So the ladders were never the object. The dimension sets are the object; a ladder is a route through them. Two teams picked different routes and then compared rung numbers. Nothing in either lineage is wrong about the space. What is missing from both is the projection rule — a stated answer to "why is this rung a rung?"
1.2 ⛔ The "source of record" carries A's labels over B's scoring
data/domains/entity-system.v1.json declares Lineage A's rung definitions. The 66
manifestations scored against it do not behave like Lineage A. Measured:
| Identity rung, as the data defines it | Systems | Who is actually there |
|---|---|---|
| I0 — no content identity, location-addressed | 19 | postgres, mysql, redis, plan-9, linux-posix … |
| I1 — simple checksums (integrity, not identity) | 20 | cassandra, etcd, kafka, kubernetes, datomic, slack, notion, wikipedia … |
| I2 — cryptographic hash, not over canonical encoding | 1 | github |
| Full I — hash(canonical(E)) | 17 | git, ipfs, bitcoin, docker, nix, at-protocol, nostr … |
Cassandra, etcd, Kafka, Kubernetes and Datomic are not checksum systems. They are
systems with assigned identifiers — partition keys, etcd keys, offsets, UIDs, entity
IDs. That is Lineage B's I1 ("assigned identity (UUID)"), scored under Lineage
A's label. And the rung that should be crowded under A's definition — cryptographic hash
over a non-canonical encoding, which is most of the content-addressed world — holds
exactly one system.
The inversion is the evidence. A 20-to-1 split in the wrong direction is not a scoring drift; it is a different definition in use.
The same pattern runs through the other primitives. gRPC, Postgres, Docker and HTTP all
score P1, which is B's client/server and not A's peer identity: public key,
content-addressed peer ID — gRPC has no peer ID. Postgres and gRPC score E3, which is
B's external schemas (DDL, protobuf) and not A's self-describing types.
1.3 And the data carries scoring errors under either reading
| System | Data | Problem |
|---|---|---|
| git | E4 (Full E) | Git has four hardcoded object types and no type entities. Wrong on both ladders — this is E1–E2 territory |
| git | P0 (no peer) | Git remotes are symmetric. Lineage B's own note scores Git P3 |
| grpc | X5 (Full X — continuation, durable, distributed compute) | gRPC is fixed-verb request/response. Off by four rungs |
| kafka | T4 (Full T — self-describing tree, extension-defined semantics) | Topics and partitions are a two-level namespace |
| linux-posix | T4 | POSIX has no self-describing tree |
| plan-9 | E0 (no entity) | Lineage B's note explicitly corrects this: "E1 not E0 — everything is a file gives implicit typing" |
1.4 ⛔ And one stated reason for declaring the JSON canonical is not true
The reconciliation proposal argued the JSON should be authoritative partly because "it
already carries per-level provenance back to the analysis, so declaring the JSON
authoritative does not orphan the prose."
Measured across 995 partial-level records in 26 domain files, the union of every key
present is {description, emergent, level, name, phase_transition}. There is no
provenance field anywhere. The JSON does not point back at the reasoning, which is
precisely why nobody could see that its labels and its scores had come apart.
1.5 What does hold
One reason for the JSON survives, and it is the strongest of the three: it is machine-readable, so conformance can be checked rather than asserted. That argues for the format, not for the current contents.
Part 2 — The projection rule
A ladder is a chain in the partial order of implementations. For rung numbers to mean anything across systems, it must satisfy:
- C1 — cumulative. A system at rung N satisfies every rung below N.
- C2 — one story per rung. Each step adds one thing. A rung that advances two independent properties at once cannot place a system that has one and not the other.
- C3 — total on real systems. Every coherent real configuration lands somewhere. A configuration that is off-ladder falsifies the projection.
- C4 — the top is what the specification says.
Full Xis the entity system's X, read from the spec, not an extrapolation. - C5 — discriminating. A rung no real system occupies is decoration.
And the rule that decides where a rung goes:
⭐ A rung exists if and only if crossing it unlocks a capability that cannot be expressed below it.
This is not invented for this note — it is what Paper 6's Phase Transitions and Thresholds section already does for the three transitions it names. Generalizing it is the whole reconstruction. It also makes the ladder derivable rather than asserted: given the dimension set, the rungs follow.
Part 3 — The six ladders, derived
Notation: A = a rung Lineage A had, B = Lineage B had it, A+B = both, new = neither, recovered by the capability test.
Entity (E) — 5 rungs
| Rung | Definition | Capability unlocked | Src |
|---|---|---|---|
| E0 | Untyped bytes | store and retrieve | A+B |
| E1 | Type tag from a closed set | dispatch on a fixed set of kinds | B |
| E2 | Type named, schema held externally | validate — given prior agreement | A+B |
| E3 | Type intrinsic to the datum | ⭐ parse without prior agreement | new |
| Full E | Types are themselves entities | ⭐ types travel, version and compose on the same machinery — the EIT self-description fixed point | A |
A's E1 ("untyped blob") duplicates E0; B's E1 ("hardcoded tags") is the real rung. A's
E3 ("self-describing types") is B's Full E. The genuinely new rung is E3: a
{type, data} envelope or a CBOR tag is intrinsic without the type being a retrievable
entity, and that is a different capability from Full E.
Identity (I) — 4 rungs ⭐ and this is the one that matters
| Rung | Definition | Capability unlocked | Src |
|---|---|---|---|
| I0 | Name assigned, not derived — a UUID, a row ID, a location | reference only | A+B |
| I1 | Derived over part of the content, or over a non-canonical encoding | byte-level dedup; corruption detection | A+B |
| I2 | Derived over a canonical encoding, non-adversary-resistant | ⭐ structural identity — same value, same name, any producer, no coordination | new |
| Full I | Canonical and adversary-resistant | ⭐ structural identity across a trust boundary | A+B |
Three corrections fall out, and each was a defect in one lineage:
- B's "assigned identity (UUID)" is not a rung above nothing — it is the same rung as
location-addressing. A UUID is not a weak derivation; it is not a derivation. Putting
it above
I0made B's ladder non-monotone, violating C1. Folding both mechanisms intoI0fixes it and keeps B's placement value, because the 20 real systems B was serving still land somewhere sensible. - A's
I2("cryptographic hash, not over canonical encoding") buys no capability itsI1does not. Strength without canonicality gives you a better corruption detector, not structural identity. It fails C5 — and the data agrees: one system out of 66. - The rung both lineages lack is the important one. A content hash over a canonical
encoding using a non-cryptographic function is derived, canonical, authority-free and
forgeable. It was off-ladder in both. It is now
I2, and it is where a single-machine entity core sits.
That last point is why this ladder is load-bearing beyond bookkeeping: the step from I2
to Full I is exactly adversary-resistance, and it is the step a local system does not
have to take. Papers 4 and 5 are about that step. The old ladders could not express it.
Tree (T) — ⛔ not a chain, and this is a real structural finding
Applying the capability test to T produces two independent upper branches:
| Capability | Who has it | |
|---|---|---|
Binding branch — path → hash over an immutable store | name and content separable: atomic rebind, snapshot, history | Git, Nix (no composition) |
| Composition branch — mounting, namespace union | assemble a tree from pieces you do not own | Plan 9, Inferno (no content-addressed bindings) |
All four corners are populated — neither, binding-only, composition-only, both (the entity system, IPFS with IPLD + MFS) — which is the independence test passing. Lineage B's own note states the same thing without drawing the conclusion: "Plan 9 achieved dimension 1 and 3 but not 2. Git achieved 1 and 2 but namespace is fixed."
So a linear T ladder is structurally wrong, and that is why A and B diverge most on T:
each called a different branch the top. A ranked composition (T3) and self-describing
semantics; B ranked hash-binding. Neither is a mistake about the world; both are
mis-projections of a branched order.
The data shows the collapse this causes: plan-9, linux-posix, nix and
entity-system all score T4. A ladder that cannot separate POSIX from the entity
system is not measuring anything.
Proposal: T is scored as a pair (T_bind, T_compose), or a linear ladder is kept with
the projection rule stated — "ranks the binding branch; composition is scored
separately". Do not pretend it is a chain.
| Rung | Binding branch | Composition branch |
|---|---|---|
| 0 | flat collection | — |
| 1 | paths (key → value) | — |
| 2 | hierarchical paths | — |
| 3 | path → hash over an immutable store ⭐ | open composition: mounting, union ⭐ |
| 4 | tree semantics are entities (extension-defined) |
Emit (M) — 6 rungs, and both lineages held a proper subset
| Rung | Definition | Capability unlocked | Src |
|---|---|---|---|
| M0 | Static | — | A+B |
| M1 | Mutation, non-atomic | change, with torn state observable | B |
| M2 | Atomic mutation | change without torn state | A+B |
| M3 | Atomic + event | ⭐ observers learn without polling | A+B |
| M4 | Event triggers handlers | ⭐ reactive cascade | A |
| Full M | Subscription, cross-peer propagation, ordering | reaction across a peer boundary | A |
A had no non-atomic rung; B had neither triggers nor cross-peer. Straight union.
Execution (X) — 7 rungs
| Rung | Definition | Capability unlocked | Src |
|---|---|---|---|
| X0 | No dispatch | — | A+B |
| X1 | Fixed operations, fixed targets | call a known thing | A+B |
| X2 | Fixed verbs, open targets | ⭐ address anything with a small verb set — this is the web | B |
| X3 | Open dispatch, handlers registerable | ⭐ programmable — the genesis transition | A+B |
| X4 | Typed dispatch | handler selection uses the type system | A |
| X5 | Computation expressed as data | evaluate without shipping native code | A |
| Full X | Continuation, durable, distributed execution | execution survives the process | A |
B's X2 is a genuinely useful rung A lacks — it is the one that separates HTTP from RPC,
and it is the most populated region of the real landscape. A's X4/X5 are real and B
lacks them. Union again.
Peer (P) — 7 rungs, and here one lineage has a rung in the wrong place
| Rung | Definition | Capability unlocked | Src |
|---|---|---|---|
| P0 | Single instance | — | A+B |
| P1 | Another party, asymmetric (client/server) | remote invocation | B |
| P2 | Parties authenticated | know who you are talking to | B |
| P3 | Parties symmetric | ⭐ no privileged party | B |
| P4 | Discovery | reach a party you were not configured with | A |
| P5 | State exchange / sync | reconcile trees | A |
| Full P | Capability-bearing peers — authority as attenuatable entities | ⭐ delegate without the issuer online | B |
⛔ A's P2 ("capability boundary: scoped access") is mislabeled and mis-ranked. Scoped
access is "authorization exists," which every multi-user OS has had since the 1960s. The
entity system's P is attenuatable capability tokens as content-addressed entities, and
that is the top of the ladder, not the second rung. This is the ordering conflict
levels.py reports, and it resolves in B's favour on this rung and A's favour on
discovery and sync.
Part 4 — Consequences
4.1 Adversary-resistance is Identity's third dimension — verdict: yes
Tested for pairwise independence by populating the off-diagonal corners with real systems, which is the test that decides it:
| D (derivation) | U (authority-freedom) | R (adversary-resistance) | Real system |
|---|---|---|---|
| high | high | low | a CRC32/xxHash content address; ZFS fletcher4; Git's SHA-1 after SHAttered |
| low | high | high | an Ed25519 public key as an identity — derived from a secret, not from content, and unforgeable. The entity system's own peer ID is this corner |
| high | low | high | an HMAC content identifier — fully derived, unforgeable, verifiable only by the key-holder |
| high | high | high | Full I |
All three vary independently with real occupants, so R is not a sub-level of U. The fold-it-in
alternative fails immediately: verification universality is maxed by a CRC32 — anyone
can verify it — while adversary-resistance is zero. Folding would make Full I incoherent.
Three further arguments, strongest last:
- R accounts for the primitive's dominant cost. SHA-256 against a fast non-cryptographic mixer is essentially the whole per-item cost, the whole audited-dependency surface, and the whole hardware-acceleration argument.
- R is the only one of the three the specification itself parameterizes.
format_codeselects the digest on the wire (0x00SHA-256,0x01SHA-384). Derivation scope and verification universality are fixed by the protocol; the digest is a registry. A property the spec makes configurable is not a papers-layer invention. - ⭐ It is the definition of the top rung. In the reconstructed ladder,
I2 → Full Iis adversary-resistance. Without the dimension the ladder cannot distinguish a single-machine core from a distributed peer — the distinction Papers 4 and 5 exist to draw.
So: I has three internal dimensions, and the corpus total moves 19 → 20.
Cost of that change, measured: zero outside the papers. Named search finds no
dimension concept in data/ or compute/ — the count is a Paper 6 construct. Paper 3
states no count and refers the analysis back to Paper 6. So the change is Paper 6 plus a
cross-reference check, not a recomputation.
4.2 Is Identity therefore a compound primitive? No.
All three dimensions at zero is simply no identity, so none is independently removable in the sense Paper 0's remove-one test requires. One primitive, richer substructure.
4.3 Are the other primitives under-decomposed?
The reconstruction says T is, and structurally rather than by a missing axis: its two upper branches are independent, so its three stated dimensions are not a ranking. That is Paper 3's subject and it is now a specific claim rather than a worry.
4.4 What this does to the figure-vs-table defect
It narrows and relocates it. The figure and the tables are not cleanly "A versus B" — the figure is generated from scores that mostly mean B, carrying A's labels, with real errors on top. The caption clauses currently in Papers 0 and 6 remain correct and remain the right interim statement; the durable fix is the rescore, below.
Part 5 — What has to happen, in order
- Land the Identity dimension (Paper 6 §Identity, 19 → 20; cross-check Papers 3, 11). Decided by §4.1, papers-only, no recomputation. Self-contained — can land alone.
- Replace the ladder definitions in
data/domains/entity-system.v1.jsonwith Part 3, and add the missingprovenancekey pointing at this note. - Rescore the 66 manifestations against the new definitions. Mechanical but not trivial, and it is where the six known errors in §1.3 get fixed. The figure regenerates from it.
- Update Paper 0 §Partial Primitives and Paper 6 §Internal Substructure to the Part 3 ladders, and drop the interim caption clauses once figure and tables agree.
- Decide T's representation — paired score, or linear with the projection rule stated. Do not ship a T ladder that puts POSIX and the entity system on the same rung.
- Re-baseline
tools/corpus/levels.pyonce 2 and 4 agree; it should then pass on agreement rather than on a pinned divergence.
Steps 2–4 must land together: a rescore against old prose, or new prose against old scores, reproduces the defect in the other direction.