TRACE states its rules across four surfaces and nothing says which one wins when they disagree. Four reports in three days found four separate instances, all from producers who did the reasonable thing and validated against one of them.
The four surfaces
| Surface |
Files |
| Normative spec |
spec/trace-v0.2.md |
| JSON Schema |
schema/trace-claim.json and its byte-identical copy src/agentrust_trace/schema/trace-v0.2.json |
| Reference model |
src/agentrust_trace/models.py |
| Prose docs |
docs/*.md, plus docs/rfcs/* which disclaim being normative |
The four instances
Reported by @chernistry (four of them) and independently in the same window by @mohdibrahimaiml in #241, where the published 0.9.0 schema rejects §3.1.2 references on additionalProperties. Five, if that one is counted, and it is the same shape.
Each has been answered on its own merits. This issue is about the thing underneath them.
Why answering them individually is not enough
Every instance was found by a producer validating their records against one surface and discovering that a different surface disagreed. The schema check passing is not evidence the model will accept the record. The model accepting is not evidence the record is spec-conformant. A reader of the docs gets a fourth answer.
Two consequences worth stating plainly:
- Conformance is currently unfalsifiable. "Is this record TRACE-conformant" has no single answer, so a producer cannot be told they are wrong, and a verifier cannot be told it is being too strict.
- The failure is asymmetric and silent. The schema is the surface producers vendor and check against, and in three of the four instances it was the loose one. So the checks people actually run are the ones least likely to catch the divergence.
What this issue is for
Deciding the precedence rule and writing it somewhere a producer will find it. Not deciding the four individual answers, which are already ruled.
The obvious candidate: the normative spec wins; the schema and the reference model are derived artifacts and any divergence from the spec is a bug in the derived artifact. That is what the four rulings did in practice, and it is what §3.1.1 versus the schema description implies. But it needs to be true operationally, not just declared:
Not in scope here
The individual rulings, and the release-versus-main gap that #241 sits on. That one is real and separate: a fix on main is not a fix for anyone until it is tagged, which is why #241's reporter hit a schema that is correct in this repository and wrong in the package they installed.
TRACE states its rules across four surfaces and nothing says which one wins when they disagree. Four reports in three days found four separate instances, all from producers who did the reasonable thing and validated against one of them.
The four surfaces
spec/trace-v0.2.mdschema/trace-claim.jsonand its byte-identical copysrc/agentrust_trace/schema/trace-v0.2.jsonsrc/agentrust_trace/models.pydocs/*.md, plusdocs/rfcs/*which disclaim being normativeThe four instances
runtime.platformdescription states a narrower rule than §3.1.1's MUST. Schema description under-states the spec.docs/trust-levels.mdis stale on the all-zero measurement convention. Docs under-state the spec.subjectpattern is a prefix test wheremodels.py:343requires a full shape, so a record can be schema-conformant and refused bymodel_validate. Schema is looser than the model.parent_record_hashappears zero times in the normative spec, and its preimage is stated only in a draft that says "Binds nothing". No normative surface covers it at all.Reported by @chernistry (four of them) and independently in the same window by @mohdibrahimaiml in #241, where the published 0.9.0 schema rejects §3.1.2
referencesonadditionalProperties. Five, if that one is counted, and it is the same shape.Each has been answered on its own merits. This issue is about the thing underneath them.
Why answering them individually is not enough
Every instance was found by a producer validating their records against one surface and discovering that a different surface disagreed. The schema check passing is not evidence the model will accept the record. The model accepting is not evidence the record is spec-conformant. A reader of the docs gets a fourth answer.
Two consequences worth stating plainly:
What this issue is for
Deciding the precedence rule and writing it somewhere a producer will find it. Not deciding the four individual answers, which are already ruled.
The obvious candidate: the normative spec wins; the schema and the reference model are derived artifacts and any divergence from the spec is a bug in the derived artifact. That is what the four rulings did in practice, and it is what §3.1.1 versus the schema description implies. But it needs to be true operationally, not just declared:
schema/trace-claim.jsonandmodels.py, would have caught schema: the subject pattern accepts identities the reference model refuses #244 before a producer did. trace-spec#236 addedtests/test_the_schema_and_the_models_agree.pyin that direction; whether it covers thesubjectcase is worth checking first.Not in scope here
The individual rulings, and the release-versus-main gap that #241 sits on. That one is real and separate: a fix on
mainis not a fix for anyone until it is tagged, which is why #241's reporter hit a schema that is correct in this repository and wrong in the package they installed.