10. Quality Requirements
10.1 Quality Tree
graph LR
Q[Quality]
Q --> Correctness
Correctness --> C1["Conformance parity
(TS ≡ Py on every
shared/conformance fixture)"]
Correctness --> C2["Fail-safe gating
(semantic rules never run
on schema-invalid input)"]
Q --> Usability["Usability
(for tooling, not humans directly)"]
Usability --> U1["Actionable issues
(code + path + data,
not just a message string)"]
Usability --> U2["Stable CLI/API shape
across languages"]
Q --> Maintainability
Maintainability --> M1["Single-source error codes
(no per-language drift
in severity/message)"]
Maintainability --> M2["Deliberate, reviewed
schema evolution
(no silent upstream drift)"]
Q --> Compatibility
Compatibility --> CO1["Offline validation
(no runtime dependency
on the spec repo)"]
10.2 Quality Scenarios
| # |
Scenario |
Expected response |
| Q1 |
A new semantic rule is added to packages/ts but the equivalent is forgotten in packages/py. |
ci.yml's Python job fails on the conformance fixture that exercises the new rule — parity gap is caught before merge, not discovered later by a consumer. |
| Q2 |
A document uses the legacy geometric model (entity_states/lines). |
Validator returns a single MODEL_LEGACY error pointing at the current model, not a cascade of unrelated SCHEMA_INVALID issues. |
| Q3 |
A document is syntactically invalid JSON, passed via validate_file. |
Returns {valid: false, errors: [{code: "JSON_PARSE", ...}]} — no exception thrown, no crash of the calling tool. |
| Q4 |
opencoachingformat/spec cuts a release and dispatches spec_released with a version where the schema is unchanged. |
sync-from-spec.yml diffs, finds no change, and opens no PR — avoids PR noise for no-op releases. |
| Q5 |
opencoachingformat/spec cuts a release with a breaking schema change (e.g. a new required field). |
sync-from-spec.yml opens a PR; ci.yml runs on that PR and fails if the change breaks existing conformance fixtures, surfacing the breakage to a human reviewer before merge — never auto-merged. |
| Q6 |
The repository_dispatch payload is missing client_payload.version. |
The workflow fails immediately with an explicit ::error:: annotation ("refusing to sync") rather than attempting to fetch an ambiguous/ref= empty schema. |
| Q7 |
An action-type schema branch is given a field it doesn't own (e.g. intensity on a screen action, which only accepts physicality). |
Caught at Level 0 as SCHEMA_INVALID (via additionalProperties: false on the per-type schema branch), not silently accepted or caught later as a confusing semantic error. |
| Q8 |
A consumer needs to validate a document entirely offline (no network access). |
Succeeds — the schema is vendored in shared/schema/, not fetched at validation time. |
| Q9 |
Two different consumer tools, one built against the TS package and one against the Python package, validate the same document. |
Both report identical errors/warnings (same codes, same severities) — verified continuously by shared/conformance. |