crate 0.8.0 (2026-10-20)
nge/discharge/fwa/v1/segment_daily declares the columns of the daily discharge wet publishes beside segment_monthly (NewGraphEnvironment/wet#99): one row per FWA segment, source and day of a 365-day common year, keyed by doy in place of month. Its description says what the days are for each source, and how they relate to the published months (#33).
-
segment_monthly’speriodnote now says both sources are 1981-2010, as they have been since NewGraphEnvironment/wet#103.
crate 0.7.0 (2026-10-12)
nge/discharge/fwa/v1/segment_monthly and nge/discharge/fwa/v1/watershed_monthly declare the columns of the per-segment and per-watershed discharge that wet publishes (NewGraphEnvironment/wet#7). They are the first entries keyed by a dataset ID, <variable>/<network>/<version>/<unit>_<timebase>, the same string that names the data’s S3 prefix and Postgres table (#31).
- A registry row’s schema must now sit at
schemas/<source>/<file_name>.yaml; every existing row already did. See the decision entry.
crate 0.6.1 (2026-10-12)
Every PR and every push to main now runs R CMD check and the whole test suite (#11). Before this, nothing ran the suite in CI.
- The check fails on warnings. Every run prints its skipped tests, and a skip for a reason other than the six expected ones adds a warning to the run summary.
- Those six tests need the source tree, which
R CMD checkdoes not have, so a second pass runs the suite from the checkout, where any skip fails the run. -
CITATION.cffis no longer in the built package.
crate 0.6.0 (2026-10-11)
lidarbc v1.1.0 adds lidarbc:datetime_unknown, a boolean that is true when neither LidarBC’s file name nor its path carries a date, so the item’s datetime is a placeholder. stac-elevation-bc’s 2,288 albers items will carry it once their rewrite (NewGraphEnvironment/stac_dem_bc#2) publishes. The schema is at https://newgraphenvironment.github.io/crate/stac/lidarbc/v1.1.0/schema.json (#26).
- v1.0.0 is unchanged and stays published for the items that name it. This is the first version added under the never-edit rule.
crate 0.5.0 (2026-10-10)
crate now publishes JSON Schemas for the custom fields NGE’s STAC catalogues write, starting with lidarbc: (LidarBC’s objectstore paths and file names) and las: (the LAS format’s version and point format), at https://newgraphenvironment.github.io/crate/stac/<prefix>/v1.0.0/schema.json (#23).
- An item lists the URL in
stac_extensions, and pystac then checks each field’s type: a point format of 11 or an unknownlidarbc:field fails validation. - A released version is never edited. A change is a new version beside it, and the site build fails if a version already on
gh-pageswould change or disappear. See the decision entry.
crate 0.4.0 (2026-09-02)
nge/track_sessions declares the four columns a crew fills in when they stop recording — track_name, track_type, track_description, named_by — and nge/track_annotations becomes the table of overrides for them.
- The four are optional strings. An rfp-deployed tracking layer carries them (new upstream variant
mergin-tracking-rfp-2026-08); a layer the plugin created on its own, or a GPX import, does not, and still conforms. A layer carrying some but not all is drift the reader must abort on — crate sees a frame, not a variant. -
track_annotationsnow carriestrack_name,track_typeandtrack_description, same names and types as the captured columns, and dropsnotes. The rule, stated once: a non-key annotation column sharing a captured column’s name overrides it where non-NA,coalesce(annotation, captured). A reader that assigns instead of coalescing blanks every unannotated session, which is why the rule is written down rather than left to each consumer. -
track_typeis an open string; the value list is the capture tool’s convention, recorded in the variant description and not enforced. See the decision entry for why captured beats annotated and why the annotation table was reshaped rather than extended.
crate 0.3.0 (2026-09-01)
nge/form_capture gains source_version, the upstream version a record was captured at.
- Deliberately a column rather than a consumer-side manifest field, which is the opposite of the usual rule. That rule exists because stamping the upstream’s current version on every row churns a snapshot’s bytes for reasons unrelated to the data; a per-row capture version is fixed at capture and never moves. It is also what keeps
(project, form, source_version, record_id)unique once a rebuild has restartedrecord_idat 1. -
schema_versionnow documents how it is computed —<n>-<digest>over sortedname:typepairs of the capture’s own columns, hashing a joined string rather than a vector. Two producers computing it differently would give two genuinely different vintages the same version by accident, so the rule belongs with the declaration rather than with each caller.
crate 0.2.0 (2026-09-01)
New schema_only entry nge/form_capture: the envelope every captured field-form record carries — project, form, record_id, schema_version, captured_at — and nothing about what any observation means.
- Vintage is a column, not a filename. Two shapes of one form are one logical table, distinguished by
schema_version; a column absent from the older vintage is null there andschema_versionsays why, which is what separates “not asked” from “not answered”. - Per-form column meaning is still #13. The envelope leans on
crt_schema_conform()’s documented floor-not-ceiling behaviour, so a form’s own columns pass through untouched until #13 defines them. See the decision entry for why an envelope rather than waiting, and whyharvested_atis not a column.
crate 0.1.0 (2026-08-24)
crate can now declare a canonical shape for data it does not read, and can type a column as an instant.
-
crt_schema_conform()takes a data frame you already have and holds it to a registered canonical schema.crt_ingest()calls it rather than reimplementing validation and typing, so a file and a caller-supplied frame get identical treatment. - New canonical type
datetime. It never moves an instant: aPOSIXcthas its timezone attribute stamped to UTC rather than converted, because several readers return correct UTC instants carrying no timezone label and “correcting” the rendering injects a real whole-hour error into every join. - The registry gains a
kindcolumn.schema_onlyentries declare a shape crate does not read;crt_ingest()aborts on them namingcrt_schema_conform(). - First
schema_onlyentries:nge/track_sessions,nge/track_verticesandnge/track_annotations, the canonical shape of a GPS track. See the decision entry for why a track is two tables and why annotations are a third. -
test-crt_registry_integrity.Rwalks the registry and the schemas directory rather than a hand-written list, so a row without a YAML, a YAML without a row, or a declared type nothing implements fails the suite.
crate 0.0.2 (2026-04-29)
Schema-as-contract scope settled and Convention C naming locked in (see crate#4).
- Every function in the crate namespace now prefixed
crt_*, family-namespaced (crt_schema_*,crt_registry_*,crt_handler_*). - New
crt_schema_*family:crt_schema_read()(load YAML by relative path),crt_schema_apply()(canonical type enforcement),crt_schema_validate()(required-cols enforcement). -
crt_ingest()now validates required cols and enforces canonical types after handler dispatch — schema YAML is the single source of truth.
