SPECIFICATION · DRAFT v0.3
Identifiers & versioning
Identifiers and versioning are the parts of the standard that are hardest to change once schemas and consumers depend on them. This page describes how a process is named, how that name maps to a registry location, and how document versions evolve.
One-way-door conventions, conservative by design
The identity conventions below are deliberately conservative because consumers hard-code them. The identifier grammar is fixed by the published v0.1 meta-schema: a lowercase, slash-delimited registry path with no scheme prefix. The whole specification is still draft, so the grammar may evolve before v1.0, but the versioning rules and the principle of a stable, version-independent process identifier are settled — treat the specific spelling as draft until v1.0.
The GovSchema identifier (GSID)
Every document has a globally unique identifier in its id member that names a process across all of its versions — the GSID does not include the version. It is a lowercase, slash-delimited path with no scheme prefix, matching ^[a-z]{2}(/[a-z0-9-]+){2,}$:
{country}/{authority}/{process} — where {country} is an ISO 3166-1 alpha-2 country code, {authority} is a stable lowercase slug for the issuing body, and {process} is a stable lowercase slug for the form or process. A subnational process inserts a subdivision segment after the country, e.g. us/ca/dmv/vehicle-registration-renewal. The id equals the document's path under registry/ excluding the version.
id us/dos/passport-renewal-ds82
path registry/us/dos/passport-renewal-ds82/1.0.0/
id gb/hmpo/passport-renewal-adult
path registry/gb/hmpo/passport-renewal-adult/1.0.0/
id us/ca/dmv/vehicle-registration-renewal
path registry/us/ca/dmv/vehicle-registration-renewal/1.0.0/
Registry path mapping
When published, a document is stored at a path derived deterministically from its id and version: registry/{country}/{subdivision?}/{authority}/{process}/{version}/schema.json. This mapping is normative — the path must be reconstructible from the document's id and version alone — so the same name locates the file, the directory, and the record.
Document versioning (SemVer)
The version member is a Semantic Versioning 2.0.0 string for this document's content. The change that an increment represents is fixed by the rules below, so a consumer knows exactly when it must re-validate.
- PATCH x.y.Z
-
Editorial fixes, clarified help text, corrected typos. No change to fields, types, validation, or flow semantics.
- MINOR x.Y.z
-
Backward-compatible additions: a new optional field, a new enum value, a new step that does not alter existing required inputs.
- MAJOR X.y.z
-
Backward-incompatible change: a field removed or made required, a type or validation tightened, a flow change that invalidates previously-valid inputs. A consumer that validated user data against an earlier version MUST re-validate when the document advances to a higher MAJOR.
Scope, at a glance
Each tier's mark nests inside the next — MAJOR carries everything MINOR and PATCH do, plus a breaking change.
- PATCH — no re-validation needed
- MINOR — safe to keep validating
- MAJOR — re-validate required
Published versions are immutable
A published (id, version) pair is immutable: its content never changes in place. Corrections ship as a new version, and superseded versions are retained for reproducibility. This is what lets a consumer pin to a version and trust that it will not shift underneath them.