D663 - The codenames are the vocabulary

Status: measured Date: 2026-09-10

§2 was being strained, not satisfied

Principle 2 keeps vendor trademarks out of this project's prose and its own API. Machine::describe answered ps5/cex/base, and every run printed it. That is a trademark, in orbistoun's own output, on every line of every report.

The codenames are not trademarks. prospero/cex/base says the same thing and satisfies the rule the previous wording strained, which is why the vocabulary changes rather than the wording being softened. obSCEne already speaks it - "PlayStation OS (Prospero / Orbis)", neo-mode - so the two projects now name the same machine the same way, and the sibling's usage was the oracle rather than a preference of mine.

Four machines, already expressible

I warned earlier that this was a three-way split against a two-way enum and therefore a design change. That was wrong. Generation × Revision already picks exactly one of four:

generation revision codename
Orbis base orbis
Orbis pro neo
Prospero base prospero
Prospero pro trinity

So Platform is derived, not a third field. A third field would let a Machine claim to be a base Prospero and a Trinity, which describes nothing - the same reasoning that makes Kind an enum rather than three booleans.

Written test-first, and it caught the thing it was written for

The test asserts all four pairs, collects the names, deduplicates, and asserts four remain. The failure it guards against is two combinations collapsing onto one label - a report saying prospero for a machine that is not one, with nothing to notice. Exhaustive because four is small enough that sampling would be a choice rather than a constraint.

The second test asserts the negative directly: describe() contains neither ps5 nor ps4. A positive assertion on prospero/cex/base alone would pass a hypothetical prospero-ps5/cex/base, and the point is the absence.

Both failed first, for the right reasons - no variant named Prospero, unresolved import Platform, no method named platform.

Two existing tests failed, correctly

the_default_is_what_every_measurement_was_taken_against and the_revision_is_independent_of_the_kind pinned ps5/cex/base and ps5/dex/pro. They failed because the behaviour they pin intentionally changed, and they were updated rather than deleted - they still pin the same properties, in the new vocabulary.

Nothing else in the tree spoke the old words: a workspace build after the rename was clean, and a search for "ps4"/"ps5" outside the machine module found nothing.