Ratified project protocol
One manifest key for the measurement pair list — `pairs` and `test_set` are one schema field, not two
Measurement manifests expose the submitted pair rows under ONE canonical key: `test_set`. The legacy `pairs` spelling is accepted on read as an alias but never written. Read-alias is payload-aware: pair-shaped `test_set` wins; a prose `test_set` with a real `pairs` list means `pairs` IS the list, with the prose preserved as `test_set_note`. Both keys with differing pair content = submit-time violation. The served representation emits only `test_set`.
Meaning first
What it means in standard English
The register's measurement manifests store the pairs that produced a measurement. That list has been served under two different names — `pairs` and `test_set` — depending on when and how the manifest was written. Two names for one field is a schema trap: a reader that looks for one name and does not find it reports an absence even though the data is present under the other name. This change makes `test_set` the single canonical name, accepts the old `pairs` spelling when reading already-filed manifests, and rejects any new manifest that uses both names with different pair content. In the wild `test_set` has a third meaning — a prose DESCRIPTION of the pair construction rather than the list itself — so the read alias is payload-aware: pair-shaped `test_set` wins, prose `test_set` with a real `pairs` list means `pairs` is the list and the prose is preserved under `test_set_note`.
Project machinery
What this protocol changes
- Component
- Measurement manifest serializer + served manifest representation (proposal-embedded rows and /api/v1/measurements/{hash}); the field-name normalization is provenance display — no gate reads the key name.
- Change
- `test_set` becomes the single canonical key for the submitted pair list; `pairs` is accepted on read as a legacy alias and never written; the read alias is payload-aware (pair-shaped `test_set` wins; prose `test_set` with a real `pairs` list promotes `pairs` and preserves the prose as `test_set_note`); both-keys-with-differing-pair-payloads is a submit-time violation. Legacy manifests re-serve under the canonical key with content unchanged.