docs: record the reference-implementation comparison

All eight avatar golden vectors pass. The Python reference CLI is a week
stale on the avatar kind (33331, where the spec and the two current
implementations say 11333) and we follow the spec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwXApJjoZYtkD3sPRWbPNa
This commit is contained in:
Vitor Pamplona
2026-09-22 02:11:32 +00:00
co-authored by Claude Opus 5
parent 0cc0e8c8b8
commit fdb6630ea2
@@ -239,6 +239,49 @@ mode), `orient` (winding faces outward so a lit bench can paint backfaces dark),
exists nowhere in the DECK), `pose`, `scale`, `hsv`. None of it is needed to *read* an
object. All of it would be needed to build a workshop, which is D3's argument.
### 2.5a Checked against the reference implementations, not only the spec
§8.10 says its two reference implementations are "pinned to one set of golden
vectors", and the first pass built the avatar ladder from the section's
pseudocode instead — which is the same text both implementations read, so
agreement with it proved nothing about agreement with them. Closed since:
`tests/fixtures/avatar_work.json` from cyberspace-cli is now a test, and **all
eight vectors pass**. The two fixture sets (cyberspace-cli and cyberspace-core)
carry the same eight names with identical `reach` and `required` throughout, so
the "one set" claim holds and checking either checks both.
The vector that earns its keep is **"half gibson, ticks"**: a vertex of
`[-1, -1, -1]` with ticks `[60, 60, 60]` is **-0.5** of a unit, not -1.5,
because the whole part is the floor and the ticks count up from it. An
implementation that takes the magnitude before adding the ticks prices that
avatar at three times its reach and passes every other vector in the set.
`verify_avatar_work` in the Python reference also confirms the shape of the
payment check independently: committed ≥ required **and** zeros ≥ committed, as
two separate conditions with distinct failure reasons — which is what §5 of this
plan's own note about `Event.pow()` is about.
**The Python reference is stale on the avatar kind, and we do not follow it.**
| Implementation | Avatar kind |
| ---- | ---- |
| `CYBERSPACE_V2.md` §8.10 | **11333** |
| cyberspace-core (TS, 2026-09-14) | 11333 |
| ONOSENDAI (the client) | 11333 |
| cyberspace-cli (Python, 2026-09-07) | **33331** |
The Python CLI predates the kind move by a week and still calls 33331 the avatar
kind, which DECK-0003 has since given to standalone objects. Run against the
current network it would refuse a conformant avatar as `not-an-avatar`, and
would treat one of the seven published `kind 33331` objects as an avatar and
demand proof of work of it. We follow the spec and the two current
implementations.
Nothing else in the Python CLI overlaps this work: it implements no §1.9, no
palette and no mode — its only SNO surface is the avatar ladder. It does
implement the `kind 33330` bag (encrypt/decrypt), which is the part we
deliberately do not.
### 2.6 The two reference implementations disagree, and I checked which way
The DECK's conformance note says `sno-reference.py` and ONOSENDAI's TypeScript reader