v0.87.0
Arrays become first-class typed fields via a required items element
schema, datetime is unified under a single type: datetime accepting the
full YAML-1.1-style timestamp range (FieldType::Date is gone), and object
zero values are now shape-valid. This release tightens schema-load
validation in several places — empty properties maps and deeper array
nesting are now rejected — and consolidates the example/default conformance
checks behind one shared primitive. Documentation now ships from GitHub
Pages instead of Read the Docs.
Breaking changes
These are schema-load cutovers for Quill.yaml authors; full before/after
steps are in docs/migrations/0.86-to-0.87.md.
-
Array fields now require an
itemselement schema (#672). Arrays
previously carried a single untypedArraytype; scalar arrays were
never coerced or validated element-wise and were always annotated
array<string>. Every array field must now declareitems, and schema
load rejects arrays without it. The bare-properties-on-an-array form
(the old "typed table") is removed in favor of
items: { type: object, properties: … }. Migration for a typed table:# before rows: type: array properties: { name: { type: string }, qty: { type: integer } } # after rows: type: array items: type: object properties: { name: { type: string }, qty: { type: integer } }
A scalar array adds
itemsdirectly, e.g.
counts: { type: array, items: { type: integer } }. Elements now coerce
and validate againstitems(failing at the indexed path, e.g.
counts[1]), and blueprint annotations reflect the element type
(array<integer>,array<markdown>, …). Bundled quills and the
usaf_memogolden schema are migrated. -
FieldType::Dateremoved; usetype: datetime(#679).type: date
no longer exists.type: datetimenow accepts the full range from a bare
YYYY-MM-DDdate through RFC 3339 with offset (seconds optional,Tor
space separator). Datetime values gain calendar validation (e.g. Feb 30
is now rejected), and JSON Schema output emitsformat: date-timefor
all datetime fields. The WASMFieldTypeunion drops"date". The
blueprint hint is nowdatetime<YYYY-MM-DD[Thh:mm:ss]>. -
Empty
properties: {}on an object field is rejected (#678). An
empty properties map carries no information (the only conforming value is
{}) and is almost always a mistake. It is now treated like a missing
propertieskey and surfacesquill::object_empty_properties. -
Deeper array nesting is rejected (#673). The documented "one level of
nesting" contract is now enforced in a single recursive pass, closing a
gap wherearray<object<array>>andobject<array>were silently
accepted. A typed table row and a typed dictionary may carry scalar
columns/properties only; deeper shapes fail with
quill::nested_array_not_supported.
Behavioral changes
- Object zero values are now shape-valid (#677).
zero_valuereturned
a bare{}for every object field, which failed validation on any object
withproperties(each absent property reported asMustFillUnset), so
the zero-filled render path broke for object fields. An object with
propertiesnow recurses, zero-filling each property to its own
type-empty leaf.{}remains the zero only for the property-less edge
case. example:values are now validated (#680). The conformance check for
example/defaultliterals recurses into array items and object
properties and validates datetime format — capabilities the old
load-time path lacked, so previously-unvalidatedexample:values are
now caught.
Documentation & infrastructure
- Docs hosting moved from Read the Docs to GitHub Pages (#671). A new
docs.ymlworkflow builds MkDocs (strict build as a PR check) and
deploys to Pages on a published release; RCs are skipped..readthedocs.yaml
is removed and homepage/User Guide links point at the Pages URL. - Canon + docs: partial documents are first-class citizens (#670). The
docs and binding READMEs no longer claim Must Fill fields must be supplied
before shipping. The only hard render gate is well-formedness (values
coerce, no surviving<must-fill>sentinel); completeness is a hint
surfaced by the form view. Theformat-designer/docs tree is renamed to
quills/. - A Migration section overview page was added and wired into the nav (#674).
Internal
- Example/default validation is consolidated behind a single
validate_schema_literalconformance core shared byquillmark-core
config loading and the CLIvalidatecommand, with author-friendly
diagnostics preserved (#680). - Array and markdown handling collapse into recursive passes over the
schema in both schema-shape validation and the Typst markdown transform
(#673). - Doc/comment fixes from the array-items review (#675).